/ Hex Artifact Content
Login

Artifact 9ac9177466b17b57e814f0beabc9e7bba88f8e38:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 72 6f 75  ile contains rou
0190: 74 69 6e 65 73 20 75 73 65 64 20 66 6f 72 20 61  tines used for a
01a0: 6e 61 6c 79 7a 69 6e 67 20 65 78 70 72 65 73 73  nalyzing express
01b0: 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f 72 20  ions and.** for 
01c0: 67 65 6e 65 72 61 74 69 6e 67 20 56 44 42 45 20  generating VDBE 
01d0: 63 6f 64 65 20 74 68 61 74 20 65 76 61 6c 75 61  code that evalua
01e0: 74 65 73 20 65 78 70 72 65 73 73 69 6f 6e 73 20  tes expressions 
01f0: 69 6e 20 53 51 4c 69 74 65 2e 0a 2a 2a 0a 2a 2a  in SQLite..**.**
0200: 20 24 49 64 3a 20 65 78 70 72 2e 63 2c 76 20 31   $Id: expr.c,v 1
0210: 2e 33 35 30 20 32 30 30 38 2f 30 31 2f 31 38 20  .350 2008/01/18 
0220: 31 34 3a 30 38 3a 32 34 20 64 72 68 20 45 78 70  14:08:24 drh Exp
0230: 20 24 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22   $.*/.#include "
0240: 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 6e  sqliteInt.h".#in
0250: 63 6c 75 64 65 20 3c 63 74 79 70 65 2e 68 3e 0a  clude <ctype.h>.
0260: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
0270: 65 20 27 61 66 66 69 6e 69 74 79 27 20 6f 66 20  e 'affinity' of 
0280: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70  the expression p
0290: 45 78 70 72 20 69 66 20 61 6e 79 2e 0a 2a 2a 0a  Expr if any..**.
02a0: 2a 2a 20 49 66 20 70 45 78 70 72 20 69 73 20 61  ** If pExpr is a
02b0: 20 63 6f 6c 75 6d 6e 2c 20 61 20 72 65 66 65 72   column, a refer
02c0: 65 6e 63 65 20 74 6f 20 61 20 63 6f 6c 75 6d 6e  ence to a column
02d0: 20 76 69 61 20 61 6e 20 27 41 53 27 20 61 6c 69   via an 'AS' ali
02e0: 61 73 2c 0a 2a 2a 20 6f 72 20 61 20 73 75 62 2d  as,.** or a sub-
02f0: 73 65 6c 65 63 74 20 77 69 74 68 20 61 20 63 6f  select with a co
0300: 6c 75 6d 6e 20 61 73 20 74 68 65 20 72 65 74 75  lumn as the retu
0310: 72 6e 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 74  rn value, then t
0320: 68 65 20 0a 2a 2a 20 61 66 66 69 6e 69 74 79 20  he .** affinity 
0330: 6f 66 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20 69  of that column i
0340: 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
0350: 72 77 69 73 65 2c 20 30 78 30 30 20 69 73 20 72  rwise, 0x00 is r
0360: 65 74 75 72 6e 65 64 2c 0a 2a 2a 20 69 6e 64 69  eturned,.** indi
0370: 63 61 74 69 6e 67 20 6e 6f 20 61 66 66 69 6e 69  cating no affini
0380: 74 79 20 66 6f 72 20 74 68 65 20 65 78 70 72 65  ty for the expre
0390: 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65  ssion..**.** i.e
03a0: 2e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  . the WHERE clau
03b0: 73 65 20 65 78 70 72 65 73 73 73 69 6f 6e 73 20  se expresssions 
03c0: 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  in the following
03d0: 20 73 74 61 74 65 6d 65 6e 74 73 20 61 6c 6c 0a   statements all.
03e0: 2a 2a 20 68 61 76 65 20 61 6e 20 61 66 66 69 6e  ** have an affin
03f0: 69 74 79 3a 0a 2a 2a 0a 2a 2a 20 43 52 45 41 54  ity:.**.** CREAT
0400: 45 20 54 41 42 4c 45 20 74 31 28 61 29 3b 0a 2a  E TABLE t1(a);.*
0410: 2a 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  * SELECT * FROM 
0420: 74 31 20 57 48 45 52 45 20 61 3b 0a 2a 2a 20 53  t1 WHERE a;.** S
0430: 45 4c 45 43 54 20 61 20 41 53 20 62 20 46 52 4f  ELECT a AS b FRO
0440: 4d 20 74 31 20 57 48 45 52 45 20 62 3b 0a 2a 2a  M t1 WHERE b;.**
0450: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
0460: 31 20 57 48 45 52 45 20 28 73 65 6c 65 63 74 20  1 WHERE (select 
0470: 61 20 66 72 6f 6d 20 74 31 29 3b 0a 2a 2f 0a 63  a from t1);.*/.c
0480: 68 61 72 20 73 71 6c 69 74 65 33 45 78 70 72 41  har sqlite3ExprA
0490: 66 66 69 6e 69 74 79 28 45 78 70 72 20 2a 70 45  ffinity(Expr *pE
04a0: 78 70 72 29 7b 0a 20 20 69 6e 74 20 6f 70 20 3d  xpr){.  int op =
04b0: 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 69 66   pExpr->op;.  if
04c0: 28 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ( op==TK_SELECT 
04d0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71  ){.    return sq
04e0: 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74  lite3ExprAffinit
04f0: 79 28 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74  y(pExpr->pSelect
0500: 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  ->pEList->a[0].p
0510: 45 78 70 72 29 3b 0a 20 20 7d 0a 23 69 66 6e 64  Expr);.  }.#ifnd
0520: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
0530: 41 53 54 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b  AST.  if( op==TK
0540: 5f 43 41 53 54 20 29 7b 0a 20 20 20 20 72 65 74  _CAST ){.    ret
0550: 75 72 6e 20 73 71 6c 69 74 65 33 41 66 66 69 6e  urn sqlite3Affin
0560: 69 74 79 54 79 70 65 28 26 70 45 78 70 72 2d 3e  ityType(&pExpr->
0570: 74 6f 6b 65 6e 29 3b 0a 20 20 7d 0a 23 65 6e 64  token);.  }.#end
0580: 69 66 0a 20 20 72 65 74 75 72 6e 20 70 45 78 70  if.  return pExp
0590: 72 2d 3e 61 66 66 69 6e 69 74 79 3b 0a 7d 0a 0a  r->affinity;.}..
05a0: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 63 6f  /*.** Set the co
05b0: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
05c0: 20 66 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 20   for expression 
05d0: 70 45 78 70 72 20 74 6f 20 62 65 20 74 68 65 20  pExpr to be the 
05e0: 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 65 71  collating.** seq
05f0: 75 65 6e 63 65 20 6e 61 6d 65 64 20 62 79 20 70  uence named by p
0600: 54 6f 6b 65 6e 2e 20 20 20 52 65 74 75 72 6e 20  Token.   Return 
0610: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
0620: 20 72 65 76 69 73 65 64 20 65 78 70 72 65 73 73   revised express
0630: 69 6f 6e 2e 0a 2a 2a 20 54 68 65 20 63 6f 6c 6c  ion..** The coll
0640: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69  ating sequence i
0650: 73 20 6d 61 72 6b 65 64 20 61 73 20 22 65 78 70  s marked as "exp
0660: 6c 69 63 69 74 22 20 75 73 69 6e 67 20 74 68 65  licit" using the
0670: 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 0a 2a   EP_ExpCollate.*
0680: 2a 20 66 6c 61 67 2e 20 20 41 6e 20 65 78 70 6c  * flag.  An expl
0690: 69 63 69 74 20 63 6f 6c 6c 61 74 69 6e 67 20 73  icit collating s
06a0: 65 71 75 65 6e 63 65 20 77 69 6c 6c 20 6f 76 65  equence will ove
06b0: 72 72 69 64 65 20 69 6d 70 6c 69 63 69 74 0a 2a  rride implicit.*
06c0: 2a 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  * collating sequ
06d0: 65 6e 63 65 73 2e 0a 2a 2f 0a 45 78 70 72 20 2a  ences..*/.Expr *
06e0: 73 71 6c 69 74 65 33 45 78 70 72 53 65 74 43 6f  sqlite3ExprSetCo
06f0: 6c 6c 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ll(Parse *pParse
0700: 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 54  , Expr *pExpr, T
0710: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20  oken *pName){.  
0720: 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 30 3b  char *zColl = 0;
0730: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
0740: 65 71 75 6f 74 65 64 20 6e 61 6d 65 20 6f 66 20  equoted name of 
0750: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
0760: 63 65 20 2a 2f 0a 20 20 43 6f 6c 6c 53 65 71 20  ce */.  CollSeq 
0770: 2a 70 43 6f 6c 6c 3b 0a 20 20 7a 43 6f 6c 6c 20  *pColl;.  zColl 
0780: 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
0790: 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e 64  mToken(pParse->d
07a0: 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28  b, pName);.  if(
07b0: 20 70 45 78 70 72 20 26 26 20 7a 43 6f 6c 6c 20   pExpr && zColl 
07c0: 29 7b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73  ){.    pColl = s
07d0: 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c  qlite3LocateColl
07e0: 53 65 71 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c  Seq(pParse, zCol
07f0: 6c 2c 20 2d 31 29 3b 0a 20 20 20 20 69 66 28 20  l, -1);.    if( 
0800: 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 70  pColl ){.      p
0810: 45 78 70 72 2d 3e 70 43 6f 6c 6c 20 3d 20 70 43  Expr->pColl = pC
0820: 6f 6c 6c 3b 0a 20 20 20 20 20 20 70 45 78 70 72  oll;.      pExpr
0830: 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 45 78  ->flags |= EP_Ex
0840: 70 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 7d 0a  pCollate;.    }.
0850: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72    }.  sqlite3_fr
0860: 65 65 28 7a 43 6f 6c 6c 29 3b 0a 20 20 72 65 74  ee(zColl);.  ret
0870: 75 72 6e 20 70 45 78 70 72 3b 0a 7d 0a 0a 2f 2a  urn pExpr;.}../*
0880: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64  .** Return the d
0890: 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6f 6e  efault collation
08a0: 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68   sequence for th
08b0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78  e expression pEx
08c0: 70 72 2e 20 49 66 0a 2a 2a 20 74 68 65 72 65 20  pr. If.** there 
08d0: 69 73 20 6e 6f 20 64 65 66 61 75 6c 74 20 63 6f  is no default co
08e0: 6c 6c 61 74 69 6f 6e 20 74 79 70 65 2c 20 72 65  llation type, re
08f0: 74 75 72 6e 20 30 2e 0a 2a 2f 0a 43 6f 6c 6c 53  turn 0..*/.CollS
0900: 65 71 20 2a 73 71 6c 69 74 65 33 45 78 70 72 43  eq *sqlite3ExprC
0910: 6f 6c 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50  ollSeq(Parse *pP
0920: 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
0930: 72 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70  r){.  CollSeq *p
0940: 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 69 66 28 20  Coll = 0;.  if( 
0950: 70 45 78 70 72 20 29 7b 0a 20 20 20 20 69 6e 74  pExpr ){.    int
0960: 20 6f 70 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d   op;.    pColl =
0970: 20 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 3b 0a 20   pExpr->pColl;. 
0980: 20 20 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f     op = pExpr->o
0990: 70 3b 0a 20 20 20 20 69 66 28 20 28 6f 70 3d 3d  p;.    if( (op==
09a0: 54 4b 5f 43 41 53 54 20 7c 7c 20 6f 70 3d 3d 54  TK_CAST || op==T
09b0: 4b 5f 55 50 4c 55 53 29 20 26 26 20 21 70 43 6f  K_UPLUS) && !pCo
09c0: 6c 6c 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  ll ){.      retu
09d0: 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  rn sqlite3ExprCo
09e0: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 45  llSeq(pParse, pE
09f0: 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  xpr->pLeft);.   
0a00: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c   }.  }.  if( sql
0a10: 69 74 65 33 43 68 65 63 6b 43 6f 6c 6c 53 65 71  ite3CheckCollSeq
0a20: 28 70 50 61 72 73 65 2c 20 70 43 6f 6c 6c 29 20  (pParse, pColl) 
0a30: 29 7b 20 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20  ){ .    pColl = 
0a40: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
0a50: 70 43 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  pColl;.}../*.** 
0a60: 70 45 78 70 72 20 69 73 20 61 6e 20 6f 70 65 72  pExpr is an oper
0a70: 61 6e 64 20 6f 66 20 61 20 63 6f 6d 70 61 72 69  and of a compari
0a80: 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 20 20 61  son operator.  a
0a90: 66 66 32 20 69 73 20 74 68 65 0a 2a 2a 20 74 79  ff2 is the.** ty
0aa0: 70 65 20 61 66 66 69 6e 69 74 79 20 6f 66 20 74  pe affinity of t
0ab0: 68 65 20 6f 74 68 65 72 20 6f 70 65 72 61 6e 64  he other operand
0ac0: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
0ad0: 72 65 74 75 72 6e 73 20 74 68 65 0a 2a 2a 20 74  returns the.** t
0ae0: 79 70 65 20 61 66 66 69 6e 69 74 79 20 74 68 61  ype affinity tha
0af0: 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64  t should be used
0b00: 20 66 6f 72 20 74 68 65 20 63 6f 6d 70 61 72 69   for the compari
0b10: 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2f  son operator..*/
0b20: 0a 63 68 61 72 20 73 71 6c 69 74 65 33 43 6f 6d  .char sqlite3Com
0b30: 70 61 72 65 41 66 66 69 6e 69 74 79 28 45 78 70  pareAffinity(Exp
0b40: 72 20 2a 70 45 78 70 72 2c 20 63 68 61 72 20 61  r *pExpr, char a
0b50: 66 66 32 29 7b 0a 20 20 63 68 61 72 20 61 66 66  ff2){.  char aff
0b60: 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  1 = sqlite3ExprA
0b70: 66 66 69 6e 69 74 79 28 70 45 78 70 72 29 3b 0a  ffinity(pExpr);.
0b80: 20 20 69 66 28 20 61 66 66 31 20 26 26 20 61 66    if( aff1 && af
0b90: 66 32 20 29 7b 0a 20 20 20 20 2f 2a 20 42 6f 74  f2 ){.    /* Bot
0ba0: 68 20 73 69 64 65 73 20 6f 66 20 74 68 65 20 63  h sides of the c
0bb0: 6f 6d 70 61 72 69 73 6f 6e 20 61 72 65 20 63 6f  omparison are co
0bc0: 6c 75 6d 6e 73 2e 20 49 66 20 6f 6e 65 20 68 61  lumns. If one ha
0bd0: 73 20 6e 75 6d 65 72 69 63 0a 20 20 20 20 2a 2a  s numeric.    **
0be0: 20 61 66 66 69 6e 69 74 79 2c 20 75 73 65 20 74   affinity, use t
0bf0: 68 61 74 2e 20 4f 74 68 65 72 77 69 73 65 20 75  hat. Otherwise u
0c00: 73 65 20 6e 6f 20 61 66 66 69 6e 69 74 79 2e 0a  se no affinity..
0c10: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73      */.    if( s
0c20: 71 6c 69 74 65 33 49 73 4e 75 6d 65 72 69 63 41  qlite3IsNumericA
0c30: 66 66 69 6e 69 74 79 28 61 66 66 31 29 20 7c 7c  ffinity(aff1) ||
0c40: 20 73 71 6c 69 74 65 33 49 73 4e 75 6d 65 72 69   sqlite3IsNumeri
0c50: 63 41 66 66 69 6e 69 74 79 28 61 66 66 32 29 20  cAffinity(aff2) 
0c60: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
0c70: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
0c80: 49 43 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  IC;.    }else{. 
0c90: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
0ca0: 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20  TE_AFF_NONE;.   
0cb0: 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21   }.  }else if( !
0cc0: 61 66 66 31 20 26 26 20 21 61 66 66 32 20 29 7b  aff1 && !aff2 ){
0cd0: 0a 20 20 20 20 2f 2a 20 4e 65 69 74 68 65 72 20  .    /* Neither 
0ce0: 73 69 64 65 20 6f 66 20 74 68 65 20 63 6f 6d 70  side of the comp
0cf0: 61 72 69 73 6f 6e 20 69 73 20 61 20 63 6f 6c 75  arison is a colu
0d00: 6d 6e 2e 20 20 43 6f 6d 70 61 72 65 20 74 68 65  mn.  Compare the
0d10: 0a 20 20 20 20 2a 2a 20 72 65 73 75 6c 74 73 20  .    ** results 
0d20: 64 69 72 65 63 74 6c 79 2e 0a 20 20 20 20 2a 2f  directly..    */
0d30: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
0d40: 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 7d  TE_AFF_NONE;.  }
0d50: 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4f 6e 65  else{.    /* One
0d60: 20 73 69 64 65 20 69 73 20 61 20 63 6f 6c 75 6d   side is a colum
0d70: 6e 2c 20 74 68 65 20 6f 74 68 65 72 20 69 73 20  n, the other is 
0d80: 6e 6f 74 2e 20 55 73 65 20 74 68 65 20 63 6f 6c  not. Use the col
0d90: 75 6d 6e 73 20 61 66 66 69 6e 69 74 79 2e 20 2a  umns affinity. *
0da0: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 61 66  /.    assert( af
0db0: 66 31 3d 3d 30 20 7c 7c 20 61 66 66 32 3d 3d 30  f1==0 || aff2==0
0dc0: 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 28   );.    return (
0dd0: 61 66 66 31 20 2b 20 61 66 66 32 29 3b 0a 20 20  aff1 + aff2);.  
0de0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72  }.}../*.** pExpr
0df0: 20 69 73 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e   is a comparison
0e00: 20 6f 70 65 72 61 74 6f 72 2e 20 20 52 65 74 75   operator.  Retu
0e10: 72 6e 20 74 68 65 20 74 79 70 65 20 61 66 66 69  rn the type affi
0e20: 6e 69 74 79 20 74 68 61 74 20 73 68 6f 75 6c 64  nity that should
0e30: 0a 2a 2a 20 62 65 20 61 70 70 6c 69 65 64 20 74  .** be applied t
0e40: 6f 20 62 6f 74 68 20 6f 70 65 72 61 6e 64 73 20  o both operands 
0e50: 70 72 69 6f 72 20 74 6f 20 64 6f 69 6e 67 20 74  prior to doing t
0e60: 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 0a 2a  he comparison..*
0e70: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 63 6f  /.static char co
0e80: 6d 70 61 72 69 73 6f 6e 41 66 66 69 6e 69 74 79  mparisonAffinity
0e90: 28 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20  (Expr *pExpr){. 
0ea0: 20 63 68 61 72 20 61 66 66 3b 0a 20 20 61 73 73   char aff;.  ass
0eb0: 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ert( pExpr->op==
0ec0: 54 4b 5f 45 51 20 7c 7c 20 70 45 78 70 72 2d 3e  TK_EQ || pExpr->
0ed0: 6f 70 3d 3d 54 4b 5f 49 4e 20 7c 7c 20 70 45 78  op==TK_IN || pEx
0ee0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54 20 7c 7c  pr->op==TK_LT ||
0ef0: 0a 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72  .          pExpr
0f00: 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 20 7c 7c 20 70  ->op==TK_GT || p
0f10: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 47 45 20  Expr->op==TK_GE 
0f20: 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  || pExpr->op==TK
0f30: 5f 4c 45 20 7c 7c 0a 20 20 20 20 20 20 20 20 20  _LE ||.         
0f40: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4e   pExpr->op==TK_N
0f50: 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  E );.  assert( p
0f60: 45 78 70 72 2d 3e 70 4c 65 66 74 20 29 3b 0a 20  Expr->pLeft );. 
0f70: 20 61 66 66 20 3d 20 73 71 6c 69 74 65 33 45 78   aff = sqlite3Ex
0f80: 70 72 41 66 66 69 6e 69 74 79 28 70 45 78 70 72  prAffinity(pExpr
0f90: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66 28 20  ->pLeft);.  if( 
0fa0: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20 29 7b  pExpr->pRight ){
0fb0: 0a 20 20 20 20 61 66 66 20 3d 20 73 71 6c 69 74  .    aff = sqlit
0fc0: 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74  e3CompareAffinit
0fd0: 79 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  y(pExpr->pRight,
0fe0: 20 61 66 66 29 3b 0a 20 20 7d 0a 20 20 65 6c 73   aff);.  }.  els
0ff0: 65 20 69 66 28 20 70 45 78 70 72 2d 3e 70 53 65  e if( pExpr->pSe
1000: 6c 65 63 74 20 29 7b 0a 20 20 20 20 61 66 66 20  lect ){.    aff 
1010: 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65  = sqlite3Compare
1020: 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 2d 3e  Affinity(pExpr->
1030: 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d  pSelect->pEList-
1040: 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20 61 66 66  >a[0].pExpr, aff
1050: 29 3b 0a 20 20 7d 0a 20 20 65 6c 73 65 20 69 66  );.  }.  else if
1060: 28 20 21 61 66 66 20 29 7b 0a 20 20 20 20 61 66  ( !aff ){.    af
1070: 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  f = SQLITE_AFF_N
1080: 4f 4e 45 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ONE;.  }.  retur
1090: 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n aff;.}../*.** 
10a0: 70 45 78 70 72 20 69 73 20 61 20 63 6f 6d 70 61  pExpr is a compa
10b0: 72 69 73 6f 6e 20 65 78 70 72 65 73 73 69 6f 6e  rison expression
10c0: 2c 20 65 67 2e 20 27 3d 27 2c 20 27 3c 27 2c 20  , eg. '=', '<', 
10d0: 49 4e 28 2e 2e 2e 29 20 65 74 63 2e 0a 2a 2a 20  IN(...) etc..** 
10e0: 69 64 78 5f 61 66 66 69 6e 69 74 79 20 69 73 20  idx_affinity is 
10f0: 74 68 65 20 61 66 66 69 6e 69 74 79 20 6f 66 20  the affinity of 
1100: 61 6e 20 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d  an indexed colum
1110: 6e 2e 20 52 65 74 75 72 6e 20 74 72 75 65 0a 2a  n. Return true.*
1120: 2a 20 69 66 20 74 68 65 20 69 6e 64 65 78 20 77  * if the index w
1130: 69 74 68 20 61 66 66 69 6e 69 74 79 20 69 64 78  ith affinity idx
1140: 5f 61 66 66 69 6e 69 74 79 20 6d 61 79 20 62 65  _affinity may be
1150: 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65   used to impleme
1160: 6e 74 0a 2a 2a 20 74 68 65 20 63 6f 6d 70 61 72  nt.** the compar
1170: 69 73 6f 6e 20 69 6e 20 70 45 78 70 72 2e 0a 2a  ison in pExpr..*
1180: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 6e 64  /.int sqlite3Ind
1190: 65 78 41 66 66 69 6e 69 74 79 4f 6b 28 45 78 70  exAffinityOk(Exp
11a0: 72 20 2a 70 45 78 70 72 2c 20 63 68 61 72 20 69  r *pExpr, char i
11b0: 64 78 5f 61 66 66 69 6e 69 74 79 29 7b 0a 20 20  dx_affinity){.  
11c0: 63 68 61 72 20 61 66 66 20 3d 20 63 6f 6d 70 61  char aff = compa
11d0: 72 69 73 6f 6e 41 66 66 69 6e 69 74 79 28 70 45  risonAffinity(pE
11e0: 78 70 72 29 3b 0a 20 20 73 77 69 74 63 68 28 20  xpr);.  switch( 
11f0: 61 66 66 20 29 7b 0a 20 20 20 20 63 61 73 65 20  aff ){.    case 
1200: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3a  SQLITE_AFF_NONE:
1210: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
1220: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1230: 5f 41 46 46 5f 54 45 58 54 3a 0a 20 20 20 20 20  _AFF_TEXT:.     
1240: 20 72 65 74 75 72 6e 20 69 64 78 5f 61 66 66 69   return idx_affi
1250: 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46  nity==SQLITE_AFF
1260: 5f 54 45 58 54 3b 0a 20 20 20 20 64 65 66 61 75  _TEXT;.    defau
1270: 6c 74 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e  lt:.      return
1280: 20 73 71 6c 69 74 65 33 49 73 4e 75 6d 65 72 69   sqlite3IsNumeri
1290: 63 41 66 66 69 6e 69 74 79 28 69 64 78 5f 61 66  cAffinity(idx_af
12a0: 66 69 6e 69 74 79 29 3b 0a 20 20 7d 0a 7d 0a 0a  finity);.  }.}..
12b0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
12c0: 20 50 35 20 76 61 6c 75 65 20 74 68 61 74 20 73   P5 value that s
12d0: 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20 66 6f  hould be used fo
12e0: 72 20 61 20 62 69 6e 61 72 79 20 63 6f 6d 70 61  r a binary compa
12f0: 72 69 73 6f 6e 0a 2a 2a 20 6f 70 63 6f 64 65 20  rison.** opcode 
1300: 28 4f 50 5f 45 71 2c 20 4f 50 5f 47 65 20 65 74  (OP_Eq, OP_Ge et
1310: 63 2e 29 20 75 73 65 64 20 74 6f 20 63 6f 6d 70  c.) used to comp
1320: 61 72 65 20 70 45 78 70 72 31 20 61 6e 64 20 70  are pExpr1 and p
1330: 45 78 70 72 32 2e 0a 2a 2f 0a 73 74 61 74 69 63  Expr2..*/.static
1340: 20 75 38 20 62 69 6e 61 72 79 43 6f 6d 70 61 72   u8 binaryCompar
1350: 65 50 35 28 45 78 70 72 20 2a 70 45 78 70 72 31  eP5(Expr *pExpr1
1360: 2c 20 45 78 70 72 20 2a 70 45 78 70 72 32 2c 20  , Expr *pExpr2, 
1370: 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b  int jumpIfNull){
1380: 0a 20 20 75 38 20 61 66 66 20 3d 20 28 63 68 61  .  u8 aff = (cha
1390: 72 29 73 71 6c 69 74 65 33 45 78 70 72 41 66 66  r)sqlite3ExprAff
13a0: 69 6e 69 74 79 28 70 45 78 70 72 32 29 3b 0a 20  inity(pExpr2);. 
13b0: 20 61 66 66 20 3d 20 73 71 6c 69 74 65 33 43 6f   aff = sqlite3Co
13c0: 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 70 45  mpareAffinity(pE
13d0: 78 70 72 31 2c 20 61 66 66 29 20 7c 20 6a 75 6d  xpr1, aff) | jum
13e0: 70 49 66 4e 75 6c 6c 3b 0a 20 20 72 65 74 75 72  pIfNull;.  retur
13f0: 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n aff;.}../*.** 
1400: 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
1410: 20 74 6f 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f   to the collatio
1420: 6e 20 73 65 71 75 65 6e 63 65 20 74 68 61 74 20  n sequence that 
1430: 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20 62  should be used b
1440: 79 0a 2a 2a 20 61 20 62 69 6e 61 72 79 20 63 6f  y.** a binary co
1450: 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f  mparison operato
1460: 72 20 63 6f 6d 70 61 72 69 6e 67 20 70 4c 65 66  r comparing pLef
1470: 74 20 61 6e 64 20 70 52 69 67 68 74 2e 0a 2a 2a  t and pRight..**
1480: 0a 2a 2a 20 49 66 20 74 68 65 20 6c 65 66 74 20  .** If the left 
1490: 68 61 6e 64 20 65 78 70 72 65 73 73 69 6f 6e 20  hand expression 
14a0: 68 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20  has a collating 
14b0: 73 65 71 75 65 6e 63 65 20 74 79 70 65 2c 20 74  sequence type, t
14c0: 68 65 6e 20 69 74 20 69 73 0a 2a 2a 20 75 73 65  hen it is.** use
14d0: 64 2e 20 4f 74 68 65 72 77 69 73 65 20 74 68 65  d. Otherwise the
14e0: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
14f0: 6e 63 65 20 66 6f 72 20 74 68 65 20 72 69 67 68  nce for the righ
1500: 74 20 68 61 6e 64 20 65 78 70 72 65 73 73 69 6f  t hand expressio
1510: 6e 0a 2a 2a 20 69 73 20 75 73 65 64 2c 20 6f 72  n.** is used, or
1520: 20 74 68 65 20 64 65 66 61 75 6c 74 20 28 42 49   the default (BI
1530: 4e 41 52 59 29 20 69 66 20 6e 65 69 74 68 65 72  NARY) if neither
1540: 20 65 78 70 72 65 73 73 69 6f 6e 20 68 61 73 20   expression has 
1550: 61 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 74  a collating.** t
1560: 79 70 65 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d  ype..**.** Argum
1570: 65 6e 74 20 70 52 69 67 68 74 20 28 62 75 74 20  ent pRight (but 
1580: 6e 6f 74 20 70 4c 65 66 74 29 20 6d 61 79 20 62  not pLeft) may b
1590: 65 20 61 20 6e 75 6c 6c 20 70 6f 69 6e 74 65 72  e a null pointer
15a0: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 0a  . In this case,.
15b0: 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20 63 6f 6e  ** it is not con
15c0: 73 69 64 65 72 65 64 2e 0a 2a 2f 0a 43 6f 6c 6c  sidered..*/.Coll
15d0: 53 65 71 20 2a 73 71 6c 69 74 65 33 42 69 6e 61  Seq *sqlite3Bina
15e0: 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71  ryCompareCollSeq
15f0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
1600: 65 2c 20 0a 20 20 45 78 70 72 20 2a 70 4c 65 66  e, .  Expr *pLef
1610: 74 2c 20 0a 20 20 45 78 70 72 20 2a 70 52 69 67  t, .  Expr *pRig
1620: 68 74 0a 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20  ht.){.  CollSeq 
1630: 2a 70 43 6f 6c 6c 3b 0a 20 20 61 73 73 65 72 74  *pColl;.  assert
1640: 28 20 70 4c 65 66 74 20 29 3b 0a 20 20 69 66 28  ( pLeft );.  if(
1650: 20 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20 26 20   pLeft->flags & 
1660: 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 20 29 7b  EP_ExpCollate ){
1670: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 65  .    assert( pLe
1680: 66 74 2d 3e 70 43 6f 6c 6c 20 29 3b 0a 20 20 20  ft->pColl );.   
1690: 20 70 43 6f 6c 6c 20 3d 20 70 4c 65 66 74 2d 3e   pColl = pLeft->
16a0: 70 43 6f 6c 6c 3b 0a 20 20 7d 65 6c 73 65 20 69  pColl;.  }else i
16b0: 66 28 20 70 52 69 67 68 74 20 26 26 20 70 52 69  f( pRight && pRi
16c0: 67 68 74 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  ght->flags & EP_
16d0: 45 78 70 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20  ExpCollate ){.  
16e0: 20 20 61 73 73 65 72 74 28 20 70 52 69 67 68 74    assert( pRight
16f0: 2d 3e 70 43 6f 6c 6c 20 29 3b 0a 20 20 20 20 70  ->pColl );.    p
1700: 43 6f 6c 6c 20 3d 20 70 52 69 67 68 74 2d 3e 70  Coll = pRight->p
1710: 43 6f 6c 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Coll;.  }else{. 
1720: 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
1730: 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
1740: 61 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a 20 20  arse, pLeft);.  
1750: 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a    if( !pColl ){.
1760: 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71        pColl = sq
1770: 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
1780: 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 29  (pParse, pRight)
1790: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
17a0: 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 2f  turn pColl;.}../
17b0: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
17c0: 64 65 20 66 6f 72 20 61 20 63 6f 6d 70 61 72 69  de for a compari
17d0: 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2f  son operator..*/
17e0: 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 64 65  .static int code
17f0: 43 6f 6d 70 61 72 65 28 0a 20 20 50 61 72 73 65  Compare(.  Parse
1800: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20   *pParse,    /* 
1810: 54 68 65 20 70 61 72 73 69 6e 67 20 28 61 6e 64  The parsing (and
1820: 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67   code generating
1830: 29 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  ) context */.  E
1840: 78 70 72 20 2a 70 4c 65 66 74 2c 20 20 20 20 20  xpr *pLeft,     
1850: 20 2f 2a 20 54 68 65 20 6c 65 66 74 20 6f 70 65   /* The left ope
1860: 72 61 6e 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a  rand */.  Expr *
1870: 70 52 69 67 68 74 2c 20 20 20 20 20 2f 2a 20 54  pRight,     /* T
1880: 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64  he right operand
1890: 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 63 6f 64 65   */.  int opcode
18a0: 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63  ,       /* The c
18b0: 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 63 6f 64 65  omparison opcode
18c0: 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 31 2c 20 69   */.  int in1, i
18d0: 6e 74 20 69 6e 32 2c 20 2f 2a 20 52 65 67 69 73  nt in2, /* Regis
18e0: 74 65 72 20 68 6f 6c 64 69 6e 67 20 6f 70 65 72  ter holding oper
18f0: 61 6e 64 73 20 2a 2f 0a 20 20 69 6e 74 20 64 65  ands */.  int de
1900: 73 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4a  st,         /* J
1910: 75 6d 70 20 68 65 72 65 20 69 66 20 74 72 75 65  ump here if true
1920: 2e 20 20 2a 2f 0a 20 20 69 6e 74 20 6a 75 6d 70  .  */.  int jump
1930: 49 66 4e 75 6c 6c 20 20 20 20 2f 2a 20 49 66 20  IfNull    /* If 
1940: 74 72 75 65 2c 20 6a 75 6d 70 20 69 66 20 65 69  true, jump if ei
1950: 74 68 65 72 20 6f 70 65 72 61 6e 64 20 69 73 20  ther operand is 
1960: 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  NULL */.){.  int
1970: 20 70 35 3b 0a 20 20 69 6e 74 20 61 64 64 72 3b   p5;.  int addr;
1980: 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 34 3b 0a  .  CollSeq *p4;.
1990: 0a 20 20 70 34 20 3d 20 73 71 6c 69 74 65 33 42  .  p4 = sqlite3B
19a0: 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c  inaryCompareColl
19b0: 53 65 71 28 70 50 61 72 73 65 2c 20 70 4c 65 66  Seq(pParse, pLef
19c0: 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 70 35  t, pRight);.  p5
19d0: 20 3d 20 62 69 6e 61 72 79 43 6f 6d 70 61 72 65   = binaryCompare
19e0: 50 35 28 70 4c 65 66 74 2c 20 70 52 69 67 68 74  P5(pLeft, pRight
19f0: 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
1a00: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
1a10: 64 62 65 41 64 64 4f 70 34 28 70 50 61 72 73 65  dbeAddOp4(pParse
1a20: 2d 3e 70 56 64 62 65 2c 20 6f 70 63 6f 64 65 2c  ->pVdbe, opcode,
1a30: 20 69 6e 32 2c 20 64 65 73 74 2c 20 69 6e 31 2c   in2, dest, in1,
1a40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1a50: 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69              (voi
1a60: 64 2a 29 70 34 2c 20 50 34 5f 43 4f 4c 4c 53 45  d*)p4, P4_COLLSE
1a70: 51 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  Q);.  sqlite3Vdb
1a80: 65 43 68 61 6e 67 65 50 35 28 70 50 61 72 73 65  eChangeP5(pParse
1a90: 2d 3e 70 56 64 62 65 2c 20 70 35 29 3b 0a 20 20  ->pVdbe, p5);.  
1aa0: 72 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a  return addr;.}..
1ab0: 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20  /*.** Construct 
1ac0: 61 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e  a new expression
1ad0: 20 6e 6f 64 65 20 61 6e 64 20 72 65 74 75 72 6e   node and return
1ae0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69 74   a pointer to it
1af0: 2e 20 20 4d 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72  .  Memory.** for
1b00: 20 74 68 69 73 20 6e 6f 64 65 20 69 73 20 6f 62   this node is ob
1b10: 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  tained from sqli
1b20: 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 20 20 54  te3_malloc().  T
1b30: 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  he calling funct
1b40: 69 6f 6e 0a 2a 2a 20 69 73 20 72 65 73 70 6f 6e  ion.** is respon
1b50: 73 69 62 6c 65 20 66 6f 72 20 6d 61 6b 69 6e 67  sible for making
1b60: 20 73 75 72 65 20 74 68 65 20 6e 6f 64 65 20 65   sure the node e
1b70: 76 65 6e 74 75 61 6c 6c 79 20 67 65 74 73 20 66  ventually gets f
1b80: 72 65 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73  reed..*/.Expr *s
1b90: 71 6c 69 74 65 33 45 78 70 72 28 0a 20 20 73 71  qlite3Expr(.  sq
1ba0: 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
1bb0: 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20        /* Handle 
1bc0: 66 6f 72 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  for sqlite3DbMal
1bd0: 6c 6f 63 5a 65 72 6f 28 29 20 28 6d 61 79 20 62  locZero() (may b
1be0: 65 20 6e 75 6c 6c 29 20 2a 2f 0a 20 20 69 6e 74  e null) */.  int
1bf0: 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   op,            
1c00: 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69       /* Expressi
1c10: 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 45  on opcode */.  E
1c20: 78 70 72 20 2a 70 4c 65 66 74 2c 20 20 20 20 20  xpr *pLeft,     
1c30: 20 20 20 20 20 20 20 2f 2a 20 4c 65 66 74 20 6f         /* Left o
1c40: 70 65 72 61 6e 64 20 2a 2f 0a 20 20 45 78 70 72  perand */.  Expr
1c50: 20 2a 70 52 69 67 68 74 2c 20 20 20 20 20 20 20   *pRight,       
1c60: 20 20 20 20 2f 2a 20 52 69 67 68 74 20 6f 70 65      /* Right ope
1c70: 72 61 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  rand */.  const 
1c80: 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 20 20 20  Token *pToken   
1c90: 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f    /* Argument to
1ca0: 6b 65 6e 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72  ken */.){.  Expr
1cb0: 20 2a 70 4e 65 77 3b 0a 20 20 70 4e 65 77 20 3d   *pNew;.  pNew =
1cc0: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
1cd0: 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28  Zero(db, sizeof(
1ce0: 45 78 70 72 29 29 3b 0a 20 20 69 66 28 20 70 4e  Expr));.  if( pN
1cf0: 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  ew==0 ){.    /* 
1d00: 57 68 65 6e 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  When malloc fail
1d10: 73 2c 20 64 65 6c 65 74 65 20 70 4c 65 66 74 20  s, delete pLeft 
1d20: 61 6e 64 20 70 52 69 67 68 74 2e 20 45 78 70 72  and pRight. Expr
1d30: 65 73 73 69 6f 6e 73 20 70 61 73 73 65 64 20 74  essions passed t
1d40: 6f 20 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 66  o .    ** this f
1d50: 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 61 6c 77  unction must alw
1d60: 61 79 73 20 62 65 20 61 6c 6c 6f 63 61 74 65 64  ays be allocated
1d70: 20 77 69 74 68 20 73 71 6c 69 74 65 33 45 78 70   with sqlite3Exp
1d80: 72 28 29 20 66 6f 72 20 74 68 69 73 20 0a 20 20  r() for this .  
1d90: 20 20 2a 2a 20 72 65 61 73 6f 6e 2e 20 0a 20 20    ** reason. .  
1da0: 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33    */.    sqlite3
1db0: 45 78 70 72 44 65 6c 65 74 65 28 70 4c 65 66 74  ExprDelete(pLeft
1dc0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
1dd0: 70 72 44 65 6c 65 74 65 28 70 52 69 67 68 74 29  prDelete(pRight)
1de0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
1df0: 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 6f 70 20 3d    }.  pNew->op =
1e00: 20 6f 70 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 65   op;.  pNew->pLe
1e10: 66 74 20 3d 20 70 4c 65 66 74 3b 0a 20 20 70 4e  ft = pLeft;.  pN
1e20: 65 77 2d 3e 70 52 69 67 68 74 20 3d 20 70 52 69  ew->pRight = pRi
1e30: 67 68 74 3b 0a 20 20 70 4e 65 77 2d 3e 69 41 67  ght;.  pNew->iAg
1e40: 67 20 3d 20 2d 31 3b 0a 20 20 69 66 28 20 70 54  g = -1;.  if( pT
1e50: 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 61 73 73 65  oken ){.    asse
1e60: 72 74 28 20 70 54 6f 6b 65 6e 2d 3e 64 79 6e 3d  rt( pToken->dyn=
1e70: 3d 30 20 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  =0 );.    pNew->
1e80: 73 70 61 6e 20 3d 20 70 4e 65 77 2d 3e 74 6f 6b  span = pNew->tok
1e90: 65 6e 20 3d 20 2a 70 54 6f 6b 65 6e 3b 0a 20 20  en = *pToken;.  
1ea0: 7d 65 6c 73 65 20 69 66 28 20 70 4c 65 66 74 20  }else if( pLeft 
1eb0: 29 7b 0a 20 20 20 20 69 66 28 20 70 52 69 67 68  ){.    if( pRigh
1ec0: 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  t ){.      sqlit
1ed0: 65 33 45 78 70 72 53 70 61 6e 28 70 4e 65 77 2c  e3ExprSpan(pNew,
1ee0: 20 26 70 4c 65 66 74 2d 3e 73 70 61 6e 2c 20 26   &pLeft->span, &
1ef0: 70 52 69 67 68 74 2d 3e 73 70 61 6e 29 3b 0a 20  pRight->span);. 
1f00: 20 20 20 20 20 69 66 28 20 70 52 69 67 68 74 2d       if( pRight-
1f10: 3e 66 6c 61 67 73 20 26 20 45 50 5f 45 78 70 43  >flags & EP_ExpC
1f20: 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 20 20  ollate ){.      
1f30: 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d    pNew->flags |=
1f40: 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 3b 0a   EP_ExpCollate;.
1f50: 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 43          pNew->pC
1f60: 6f 6c 6c 20 3d 20 70 52 69 67 68 74 2d 3e 70 43  oll = pRight->pC
1f70: 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  oll;.      }.   
1f80: 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 65 66 74   }.    if( pLeft
1f90: 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 45 78 70  ->flags & EP_Exp
1fa0: 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 20  Collate ){.     
1fb0: 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20   pNew->flags |= 
1fc0: 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 3b 0a 20  EP_ExpCollate;. 
1fd0: 20 20 20 20 20 70 4e 65 77 2d 3e 70 43 6f 6c 6c       pNew->pColl
1fe0: 20 3d 20 70 4c 65 66 74 2d 3e 70 43 6f 6c 6c 3b   = pLeft->pColl;
1ff0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 71  .    }.  }..  sq
2000: 6c 69 74 65 33 45 78 70 72 53 65 74 48 65 69 67  lite3ExprSetHeig
2010: 68 74 28 70 4e 65 77 29 3b 0a 20 20 72 65 74 75  ht(pNew);.  retu
2020: 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pNew;.}../*.*
2030: 2a 20 57 6f 72 6b 73 20 6c 69 6b 65 20 73 71 6c  * Works like sql
2040: 69 74 65 33 45 78 70 72 28 29 20 65 78 63 65 70  ite3Expr() excep
2050: 74 20 74 68 61 74 20 69 74 20 74 61 6b 65 73 20  t that it takes 
2060: 61 6e 20 65 78 74 72 61 20 50 61 72 73 65 2a 0a  an extra Parse*.
2070: 2a 2a 20 61 72 67 75 6d 65 6e 74 20 61 6e 64 20  ** argument and 
2080: 6e 6f 74 69 66 69 65 73 20 74 68 65 20 61 73 73  notifies the ass
2090: 6f 63 69 61 74 65 64 20 63 6f 6e 6e 65 63 74 69  ociated connecti
20a0: 6f 6e 20 6f 62 6a 65 63 74 20 69 66 20 6d 61 6c  on object if mal
20b0: 6c 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a 45 78  loc fails..*/.Ex
20c0: 70 72 20 2a 73 71 6c 69 74 65 33 50 45 78 70 72  pr *sqlite3PExpr
20d0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
20e0: 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  e,          /* P
20f0: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
2100: 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20  /.  int op,     
2110: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
2120: 78 70 72 65 73 73 69 6f 6e 20 6f 70 63 6f 64 65  xpression opcode
2130: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c 65 66   */.  Expr *pLef
2140: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t,            /*
2150: 20 4c 65 66 74 20 6f 70 65 72 61 6e 64 20 2a 2f   Left operand */
2160: 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 2c  .  Expr *pRight,
2170: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 69             /* Ri
2180: 67 68 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20  ght operand */. 
2190: 20 63 6f 6e 73 74 20 54 6f 6b 65 6e 20 2a 70 54   const Token *pT
21a0: 6f 6b 65 6e 20 20 20 20 20 2f 2a 20 41 72 67 75  oken     /* Argu
21b0: 6d 65 6e 74 20 74 6f 6b 65 6e 20 2a 2f 0a 29 7b  ment token */.){
21c0: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
21d0: 33 45 78 70 72 28 70 50 61 72 73 65 2d 3e 64 62  3Expr(pParse->db
21e0: 2c 20 6f 70 2c 20 70 4c 65 66 74 2c 20 70 52 69  , op, pLeft, pRi
21f0: 67 68 74 2c 20 70 54 6f 6b 65 6e 29 3b 0a 7d 0a  ght, pToken);.}.
2200: 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 64 6f 69 6e  ./*.** When doin
2210: 67 20 61 20 6e 65 73 74 65 64 20 70 61 72 73 65  g a nested parse
2220: 2c 20 79 6f 75 20 63 61 6e 20 69 6e 63 6c 75 64  , you can includ
2230: 65 20 74 65 72 6d 73 20 69 6e 20 61 6e 20 65 78  e terms in an ex
2240: 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 74 68 61 74  pression.** that
2250: 20 6c 6f 6f 6b 20 6c 69 6b 65 20 74 68 69 73 3a   look like this:
2260: 20 20 20 23 31 20 23 32 20 2e 2e 2e 20 20 54 68     #1 #2 ...  Th
2270: 65 73 65 20 74 65 72 6d 73 20 72 65 66 65 72 20  ese terms refer 
2280: 74 6f 20 72 65 67 69 73 74 65 72 73 0a 2a 2a 20  to registers.** 
2290: 69 6e 20 74 68 65 20 76 69 72 74 75 61 6c 20 6d  in the virtual m
22a0: 61 63 68 69 6e 65 2e 20 20 23 4e 20 69 73 20 74  achine.  #N is t
22b0: 68 65 20 4e 2d 74 68 20 72 65 67 69 73 74 65 72  he N-th register
22c0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
22d0: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62  tine is called b
22e0: 79 20 74 68 65 20 70 61 72 73 65 72 20 74 6f 20  y the parser to 
22f0: 64 65 61 6c 20 77 69 74 68 20 6f 6e 20 6f 66 20  deal with on of 
2300: 74 68 6f 73 65 20 74 65 72 6d 73 2e 0a 2a 2a 20  those terms..** 
2310: 49 74 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 67  It immediately g
2320: 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20 74 6f  enerates code to
2330: 20 73 74 6f 72 65 20 74 68 65 20 76 61 6c 75 65   store the value
2340: 20 69 6e 20 61 20 6d 65 6d 6f 72 79 20 6c 6f 63   in a memory loc
2350: 61 74 69 6f 6e 2e 0a 2a 2a 20 54 68 65 20 72 65  ation..** The re
2360: 74 75 72 6e 73 20 61 6e 20 65 78 70 72 65 73 73  turns an express
2370: 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20 63 6f  ion that will co
2380: 64 65 20 74 6f 20 65 78 74 72 61 63 74 20 74 68  de to extract th
2390: 65 20 76 61 6c 75 65 20 66 72 6f 6d 0a 2a 2a 20  e value from.** 
23a0: 74 68 61 74 20 6d 65 6d 6f 72 79 20 6c 6f 63 61  that memory loca
23b0: 74 69 6f 6e 20 61 73 20 6e 65 65 64 65 64 2e 0a  tion as needed..
23c0: 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33  */.Expr *sqlite3
23d0: 52 65 67 69 73 74 65 72 45 78 70 72 28 50 61 72  RegisterExpr(Par
23e0: 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65  se *pParse, Toke
23f0: 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 56 64  n *pToken){.  Vd
2400: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
2410: 70 56 64 62 65 3b 0a 20 20 45 78 70 72 20 2a 70  pVdbe;.  Expr *p
2420: 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
2430: 6e 65 73 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20  nested==0 ){.   
2440: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
2450: 28 70 50 61 72 73 65 2c 20 22 6e 65 61 72 20 5c  (pParse, "near \
2460: 22 25 54 5c 22 3a 20 73 79 6e 74 61 78 20 65 72  "%T\": syntax er
2470: 72 6f 72 22 2c 20 70 54 6f 6b 65 6e 29 3b 0a 20  ror", pToken);. 
2480: 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
2490: 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
24a0: 4b 5f 4e 55 4c 4c 2c 20 30 2c 20 30 2c 20 30 29  K_NULL, 0, 0, 0)
24b0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 76 3d 3d 30  ;.  }.  if( v==0
24c0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
24d0: 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28   = sqlite3PExpr(
24e0: 70 50 61 72 73 65 2c 20 54 4b 5f 52 45 47 49 53  pParse, TK_REGIS
24f0: 54 45 52 2c 20 30 2c 20 30 2c 20 70 54 6f 6b 65  TER, 0, 0, pToke
2500: 6e 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29  n);.  if( p==0 )
2510: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20  {.    return 0; 
2520: 20 2f 2a 20 4d 61 6c 6c 6f 63 20 66 61 69 6c 65   /* Malloc faile
2530: 64 20 2a 2f 0a 20 20 7d 0a 20 20 70 2d 3e 69 54  d */.  }.  p->iT
2540: 61 62 6c 65 20 3d 20 61 74 6f 69 28 28 63 68 61  able = atoi((cha
2550: 72 2a 29 26 70 54 6f 6b 65 6e 2d 3e 7a 5b 31 5d  r*)&pToken->z[1]
2560: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d  );.  return p;.}
2570: 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 69 6e 20 74 77 6f  ../*.** Join two
2580: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 75 73 69   expressions usi
2590: 6e 67 20 61 6e 20 41 4e 44 20 6f 70 65 72 61 74  ng an AND operat
25a0: 6f 72 2e 20 20 49 66 20 65 69 74 68 65 72 20 65  or.  If either e
25b0: 78 70 72 65 73 73 69 6f 6e 20 69 73 0a 2a 2a 20  xpression is.** 
25c0: 4e 55 4c 4c 2c 20 74 68 65 6e 20 6a 75 73 74 20  NULL, then just 
25d0: 72 65 74 75 72 6e 20 74 68 65 20 6f 74 68 65 72  return the other
25e0: 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2f 0a   expression..*/.
25f0: 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70  Expr *sqlite3Exp
2600: 72 41 6e 64 28 73 71 6c 69 74 65 33 20 2a 64 62  rAnd(sqlite3 *db
2610: 2c 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 45  , Expr *pLeft, E
2620: 78 70 72 20 2a 70 52 69 67 68 74 29 7b 0a 20 20  xpr *pRight){.  
2630: 69 66 28 20 70 4c 65 66 74 3d 3d 30 20 29 7b 0a  if( pLeft==0 ){.
2640: 20 20 20 20 72 65 74 75 72 6e 20 70 52 69 67 68      return pRigh
2650: 74 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  t;.  }else if( p
2660: 52 69 67 68 74 3d 3d 30 20 29 7b 0a 20 20 20 20  Right==0 ){.    
2670: 72 65 74 75 72 6e 20 70 4c 65 66 74 3b 0a 20 20  return pLeft;.  
2680: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
2690: 6e 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62  n sqlite3Expr(db
26a0: 2c 20 54 4b 5f 41 4e 44 2c 20 70 4c 65 66 74 2c  , TK_AND, pLeft,
26b0: 20 70 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 7d   pRight, 0);.  }
26c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
26d0: 65 20 45 78 70 72 2e 73 70 61 6e 20 66 69 65 6c  e Expr.span fiel
26e0: 64 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 65  d of the given e
26f0: 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 73 70 61  xpression to spa
2700: 6e 20 61 6c 6c 0a 2a 2a 20 74 65 78 74 20 62 65  n all.** text be
2710: 74 77 65 65 6e 20 74 68 65 20 74 77 6f 20 67 69  tween the two gi
2720: 76 65 6e 20 74 6f 6b 65 6e 73 2e 0a 2a 2f 0a 76  ven tokens..*/.v
2730: 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 53  oid sqlite3ExprS
2740: 70 61 6e 28 45 78 70 72 20 2a 70 45 78 70 72 2c  pan(Expr *pExpr,
2750: 20 54 6f 6b 65 6e 20 2a 70 4c 65 66 74 2c 20 54   Token *pLeft, T
2760: 6f 6b 65 6e 20 2a 70 52 69 67 68 74 29 7b 0a 20  oken *pRight){. 
2770: 20 61 73 73 65 72 74 28 20 70 52 69 67 68 74 21   assert( pRight!
2780: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
2790: 70 4c 65 66 74 21 3d 30 20 29 3b 0a 20 20 69 66  pLeft!=0 );.  if
27a0: 28 20 70 45 78 70 72 20 26 26 20 70 52 69 67 68  ( pExpr && pRigh
27b0: 74 2d 3e 7a 20 26 26 20 70 4c 65 66 74 2d 3e 7a  t->z && pLeft->z
27c0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
27d0: 70 4c 65 66 74 2d 3e 64 79 6e 3d 3d 30 20 7c 7c  pLeft->dyn==0 ||
27e0: 20 70 4c 65 66 74 2d 3e 7a 5b 70 4c 65 66 74 2d   pLeft->z[pLeft-
27f0: 3e 6e 5d 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66  >n]==0 );.    if
2800: 28 20 70 4c 65 66 74 2d 3e 64 79 6e 3d 3d 30 20  ( pLeft->dyn==0 
2810: 26 26 20 70 52 69 67 68 74 2d 3e 64 79 6e 3d 3d  && pRight->dyn==
2820: 30 20 29 7b 0a 20 20 20 20 20 20 70 45 78 70 72  0 ){.      pExpr
2830: 2d 3e 73 70 61 6e 2e 7a 20 3d 20 70 4c 65 66 74  ->span.z = pLeft
2840: 2d 3e 7a 3b 0a 20 20 20 20 20 20 70 45 78 70 72  ->z;.      pExpr
2850: 2d 3e 73 70 61 6e 2e 6e 20 3d 20 70 52 69 67 68  ->span.n = pRigh
2860: 74 2d 3e 6e 20 2b 20 28 70 52 69 67 68 74 2d 3e  t->n + (pRight->
2870: 7a 20 2d 20 70 4c 65 66 74 2d 3e 7a 29 3b 0a 20  z - pLeft->z);. 
2880: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2890: 70 45 78 70 72 2d 3e 73 70 61 6e 2e 7a 20 3d 20  pExpr->span.z = 
28a0: 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  0;.    }.  }.}..
28b0: 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20  /*.** Construct 
28c0: 61 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e  a new expression
28d0: 20 6e 6f 64 65 20 66 6f 72 20 61 20 66 75 6e 63   node for a func
28e0: 74 69 6f 6e 20 77 69 74 68 20 6d 75 6c 74 69 70  tion with multip
28f0: 6c 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 73 2e  le.** arguments.
2900: 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65  .*/.Expr *sqlite
2910: 33 45 78 70 72 46 75 6e 63 74 69 6f 6e 28 50 61  3ExprFunction(Pa
2920: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
2930: 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f  rList *pList, To
2940: 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20  ken *pToken){.  
2950: 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 61 73  Expr *pNew;.  as
2960: 73 65 72 74 28 20 70 54 6f 6b 65 6e 20 29 3b 0a  sert( pToken );.
2970: 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
2980: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 50 61  DbMallocZero(pPa
2990: 72 73 65 2d 3e 64 62 2c 20 73 69 7a 65 6f 66 28  rse->db, sizeof(
29a0: 45 78 70 72 29 20 29 3b 0a 20 20 69 66 28 20 70  Expr) );.  if( p
29b0: 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  New==0 ){.    sq
29c0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
29d0: 65 74 65 28 70 4c 69 73 74 29 3b 20 2f 2a 20 41  ete(pList); /* A
29e0: 76 6f 69 64 20 6c 65 61 6b 69 6e 67 20 6d 65 6d  void leaking mem
29f0: 6f 72 79 20 77 68 65 6e 20 6d 61 6c 6c 6f 63 20  ory when malloc 
2a00: 66 61 69 6c 73 20 2a 2f 0a 20 20 20 20 72 65 74  fails */.    ret
2a10: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4e 65  urn 0;.  }.  pNe
2a20: 77 2d 3e 6f 70 20 3d 20 54 4b 5f 46 55 4e 43 54  w->op = TK_FUNCT
2a30: 49 4f 4e 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69  ION;.  pNew->pLi
2a40: 73 74 20 3d 20 70 4c 69 73 74 3b 0a 20 20 61 73  st = pList;.  as
2a50: 73 65 72 74 28 20 70 54 6f 6b 65 6e 2d 3e 64 79  sert( pToken->dy
2a60: 6e 3d 3d 30 20 29 3b 0a 20 20 70 4e 65 77 2d 3e  n==0 );.  pNew->
2a70: 74 6f 6b 65 6e 20 3d 20 2a 70 54 6f 6b 65 6e 3b  token = *pToken;
2a80: 0a 20 20 70 4e 65 77 2d 3e 73 70 61 6e 20 3d 20  .  pNew->span = 
2a90: 70 4e 65 77 2d 3e 74 6f 6b 65 6e 3b 0a 0a 20 20  pNew->token;..  
2aa0: 73 71 6c 69 74 65 33 45 78 70 72 53 65 74 48 65  sqlite3ExprSetHe
2ab0: 69 67 68 74 28 70 4e 65 77 29 3b 0a 20 20 72 65  ight(pNew);.  re
2ac0: 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a  turn pNew;.}../*
2ad0: 0a 2a 2a 20 41 73 73 69 67 6e 20 61 20 76 61 72  .** Assign a var
2ae0: 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 74 6f 20  iable number to 
2af0: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68  an expression th
2b00: 61 74 20 65 6e 63 6f 64 65 73 20 61 20 77 69 6c  at encodes a wil
2b10: 64 63 61 72 64 0a 2a 2a 20 69 6e 20 74 68 65 20  dcard.** in the 
2b20: 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20 73 74 61  original SQL sta
2b30: 74 65 6d 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20  tement.  .**.** 
2b40: 57 69 6c 64 63 61 72 64 73 20 63 6f 6e 73 69 73  Wildcards consis
2b50: 74 69 6e 67 20 6f 66 20 61 20 73 69 6e 67 6c 65  ting of a single
2b60: 20 22 3f 22 20 61 72 65 20 61 73 73 69 67 6e 65   "?" are assigne
2b70: 64 20 74 68 65 20 6e 65 78 74 20 73 65 71 75 65  d the next seque
2b80: 6e 74 69 61 6c 0a 2a 2a 20 76 61 72 69 61 62 6c  ntial.** variabl
2b90: 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20  e number..**.** 
2ba0: 57 69 6c 64 63 61 72 64 73 20 6f 66 20 74 68 65  Wildcards of the
2bb0: 20 66 6f 72 6d 20 22 3f 6e 6e 6e 22 20 61 72 65   form "?nnn" are
2bc0: 20 61 73 73 69 67 6e 65 64 20 74 68 65 20 6e 75   assigned the nu
2bd0: 6d 62 65 72 20 22 6e 6e 6e 22 2e 20 20 57 65 20  mber "nnn".  We 
2be0: 6d 61 6b 65 0a 2a 2a 20 73 75 72 65 20 22 6e 6e  make.** sure "nn
2bf0: 6e 22 20 69 73 20 6e 6f 74 20 74 6f 6f 20 62 65  n" is not too be
2c00: 20 74 6f 20 61 76 6f 69 64 20 61 20 64 65 6e 69   to avoid a deni
2c10: 61 6c 20 6f 66 20 73 65 72 76 69 63 65 20 61 74  al of service at
2c20: 74 61 63 6b 20 77 68 65 6e 0a 2a 2a 20 74 68 65  tack when.** the
2c30: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 63   SQL statement c
2c40: 6f 6d 65 73 20 66 72 6f 6d 20 61 6e 20 65 78 74  omes from an ext
2c50: 65 72 6e 61 6c 20 73 6f 75 72 63 65 2e 0a 2a 2a  ernal source..**
2c60: 0a 2a 2a 20 57 69 6c 64 63 61 72 64 73 20 6f 66  .** Wildcards of
2c70: 20 74 68 65 20 66 6f 72 6d 20 22 3a 61 61 61 22   the form ":aaa"
2c80: 20 6f 72 20 22 24 61 61 61 22 20 61 72 65 20 61   or "$aaa" are a
2c90: 73 73 69 67 6e 65 64 20 74 68 65 20 73 61 6d 65  ssigned the same
2ca0: 20 6e 75 6d 62 65 72 0a 2a 2a 20 61 73 20 74 68   number.** as th
2cb0: 65 20 70 72 65 76 69 6f 75 73 20 69 6e 73 74 61  e previous insta
2cc0: 6e 63 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20  nce of the same 
2cd0: 77 69 6c 64 63 61 72 64 2e 20 20 4f 72 20 69 66  wildcard.  Or if
2ce0: 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72   this is the fir
2cf0: 73 74 0a 2a 2a 20 69 6e 73 74 61 6e 63 65 20 6f  st.** instance o
2d00: 66 20 74 68 65 20 77 69 6c 64 63 61 72 64 2c 20  f the wildcard, 
2d10: 74 68 65 20 6e 65 78 74 20 73 65 71 75 65 6e 69  the next sequeni
2d20: 61 6c 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62  al variable numb
2d30: 65 72 20 69 73 0a 2a 2a 20 61 73 73 69 67 6e 65  er is.** assigne
2d40: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
2d50: 65 33 45 78 70 72 41 73 73 69 67 6e 56 61 72 4e  e3ExprAssignVarN
2d60: 75 6d 62 65 72 28 50 61 72 73 65 20 2a 70 50 61  umber(Parse *pPa
2d70: 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
2d80: 29 7b 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b  ){.  Token *pTok
2d90: 65 6e 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  en;.  sqlite3 *d
2da0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
2db0: 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20  .  if( pExpr==0 
2dc0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 54 6f 6b  ) return;.  pTok
2dd0: 65 6e 20 3d 20 26 70 45 78 70 72 2d 3e 74 6f 6b  en = &pExpr->tok
2de0: 65 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54  en;.  assert( pT
2df0: 6f 6b 65 6e 2d 3e 6e 3e 3d 31 20 29 3b 0a 20 20  oken->n>=1 );.  
2e00: 61 73 73 65 72 74 28 20 70 54 6f 6b 65 6e 2d 3e  assert( pToken->
2e10: 7a 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  z!=0 );.  assert
2e20: 28 20 70 54 6f 6b 65 6e 2d 3e 7a 5b 30 5d 21 3d  ( pToken->z[0]!=
2e30: 30 20 29 3b 0a 20 20 69 66 28 20 70 54 6f 6b 65  0 );.  if( pToke
2e40: 6e 2d 3e 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 2f  n->n==1 ){.    /
2e50: 2a 20 57 69 6c 64 63 61 72 64 20 6f 66 20 74 68  * Wildcard of th
2e60: 65 20 66 6f 72 6d 20 22 3f 22 2e 20 20 41 73 73  e form "?".  Ass
2e70: 69 67 6e 20 74 68 65 20 6e 65 78 74 20 76 61 72  ign the next var
2e80: 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 2a 2f 0a  iable number */.
2e90: 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c      pExpr->iTabl
2ea0: 65 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 56  e = ++pParse->nV
2eb0: 61 72 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ar;.  }else if( 
2ec0: 70 54 6f 6b 65 6e 2d 3e 7a 5b 30 5d 3d 3d 27 3f  pToken->z[0]=='?
2ed0: 27 20 29 7b 0a 20 20 20 20 2f 2a 20 57 69 6c 64  ' ){.    /* Wild
2ee0: 63 61 72 64 20 6f 66 20 74 68 65 20 66 6f 72 6d  card of the form
2ef0: 20 22 3f 6e 6e 6e 22 2e 20 20 43 6f 6e 76 65 72   "?nnn".  Conver
2f00: 74 20 22 6e 6e 6e 22 20 74 6f 20 61 6e 20 69 6e  t "nnn" to an in
2f10: 74 65 67 65 72 20 61 6e 64 0a 20 20 20 20 2a 2a  teger and.    **
2f20: 20 75 73 65 20 69 74 20 61 73 20 74 68 65 20 76   use it as the v
2f30: 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 2a  ariable number *
2f40: 2f 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  /.    int i;.   
2f50: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d   pExpr->iTable =
2f60: 20 69 20 3d 20 61 74 6f 69 28 28 63 68 61 72 2a   i = atoi((char*
2f70: 29 26 70 54 6f 6b 65 6e 2d 3e 7a 5b 31 5d 29 3b  )&pToken->z[1]);
2f80: 0a 20 20 20 20 69 66 28 20 69 3c 31 20 7c 7c 20  .    if( i<1 || 
2f90: 69 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 56 41 52  i>SQLITE_MAX_VAR
2fa0: 49 41 42 4c 45 5f 4e 55 4d 42 45 52 20 29 7b 0a  IABLE_NUMBER ){.
2fb0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
2fc0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 76  orMsg(pParse, "v
2fd0: 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 6d  ariable number m
2fe0: 75 73 74 20 62 65 20 62 65 74 77 65 65 6e 20 3f  ust be between ?
2ff0: 31 20 61 6e 64 20 3f 25 64 22 2c 0a 20 20 20 20  1 and ?%d",.    
3000: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4d 41 58        SQLITE_MAX
3010: 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52  _VARIABLE_NUMBER
3020: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
3030: 20 69 3e 70 50 61 72 73 65 2d 3e 6e 56 61 72 20   i>pParse->nVar 
3040: 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  ){.      pParse-
3050: 3e 6e 56 61 72 20 3d 20 69 3b 0a 20 20 20 20 7d  >nVar = i;.    }
3060: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
3070: 20 57 69 6c 64 63 61 72 64 73 20 6f 66 20 74 68   Wildcards of th
3080: 65 20 66 6f 72 6d 20 22 3a 61 61 61 22 20 6f 72  e form ":aaa" or
3090: 20 22 24 61 61 61 22 2e 20 20 52 65 75 73 65 20   "$aaa".  Reuse 
30a0: 74 68 65 20 73 61 6d 65 20 76 61 72 69 61 62 6c  the same variabl
30b0: 65 0a 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20  e.    ** number 
30c0: 61 73 20 74 68 65 20 70 72 69 6f 72 20 61 70 70  as the prior app
30d0: 65 61 72 61 6e 63 65 20 6f 66 20 74 68 65 20 73  earance of the s
30e0: 61 6d 65 20 6e 61 6d 65 2c 20 6f 72 20 69 66 20  ame name, or if 
30f0: 74 68 65 20 6e 61 6d 65 0a 20 20 20 20 2a 2a 20  the name.    ** 
3100: 68 61 73 20 6e 65 76 65 72 20 61 70 70 65 61 72  has never appear
3110: 65 64 20 62 65 66 6f 72 65 2c 20 72 65 75 73 65  ed before, reuse
3120: 20 74 68 65 20 73 61 6d 65 20 76 61 72 69 61 62   the same variab
3130: 6c 65 20 6e 75 6d 62 65 72 0a 20 20 20 20 2a 2f  le number.    */
3140: 0a 20 20 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20  .    int i, n;. 
3150: 20 20 20 6e 20 3d 20 70 54 6f 6b 65 6e 2d 3e 6e     n = pToken->n
3160: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
3170: 3c 70 50 61 72 73 65 2d 3e 6e 56 61 72 45 78 70  <pParse->nVarExp
3180: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45  r; i++){.      E
3190: 78 70 72 20 2a 70 45 3b 0a 20 20 20 20 20 20 69  xpr *pE;.      i
31a0: 66 28 20 28 70 45 20 3d 20 70 50 61 72 73 65 2d  f( (pE = pParse-
31b0: 3e 61 70 56 61 72 45 78 70 72 5b 69 5d 29 21 3d  >apVarExpr[i])!=
31c0: 30 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 70  0.          && p
31d0: 45 2d 3e 74 6f 6b 65 6e 2e 6e 3d 3d 6e 0a 20 20  E->token.n==n.  
31e0: 20 20 20 20 20 20 20 20 26 26 20 6d 65 6d 63 6d          && memcm
31f0: 70 28 70 45 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70  p(pE->token.z, p
3200: 54 6f 6b 65 6e 2d 3e 7a 2c 20 6e 29 3d 3d 30 20  Token->z, n)==0 
3210: 29 7b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72  ){.        pExpr
3220: 2d 3e 69 54 61 62 6c 65 20 3d 20 70 45 2d 3e 69  ->iTable = pE->i
3230: 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 62  Table;.        b
3240: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
3250: 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3e 3d 70    }.    if( i>=p
3260: 50 61 72 73 65 2d 3e 6e 56 61 72 45 78 70 72 20  Parse->nVarExpr 
3270: 29 7b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  ){.      pExpr->
3280: 69 54 61 62 6c 65 20 3d 20 2b 2b 70 50 61 72 73  iTable = ++pPars
3290: 65 2d 3e 6e 56 61 72 3b 0a 20 20 20 20 20 20 69  e->nVar;.      i
32a0: 66 28 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 45  f( pParse->nVarE
32b0: 78 70 72 3e 3d 70 50 61 72 73 65 2d 3e 6e 56 61  xpr>=pParse->nVa
32c0: 72 45 78 70 72 41 6c 6c 6f 63 2d 31 20 29 7b 0a  rExprAlloc-1 ){.
32d0: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
32e0: 6e 56 61 72 45 78 70 72 41 6c 6c 6f 63 20 2b 3d  nVarExprAlloc +=
32f0: 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 45 78 70   pParse->nVarExp
3300: 72 41 6c 6c 6f 63 20 2b 20 31 30 3b 0a 20 20 20  rAlloc + 10;.   
3310: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61 70 56       pParse->apV
3320: 61 72 45 78 70 72 20 3d 0a 20 20 20 20 20 20 20  arExpr =.       
3330: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 52 65       sqlite3DbRe
3340: 61 6c 6c 6f 63 4f 72 46 72 65 65 28 0a 20 20 20  allocOrFree(.   
3350: 20 20 20 20 20 20 20 20 20 20 20 64 62 2c 0a 20             db,. 
3360: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61               pPa
3370: 72 73 65 2d 3e 61 70 56 61 72 45 78 70 72 2c 0a  rse->apVarExpr,.
3380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50                pP
3390: 61 72 73 65 2d 3e 6e 56 61 72 45 78 70 72 41 6c  arse->nVarExprAl
33a0: 6c 6f 63 2a 73 69 7a 65 6f 66 28 70 50 61 72 73  loc*sizeof(pPars
33b0: 65 2d 3e 61 70 56 61 72 45 78 70 72 5b 30 5d 29  e->apVarExpr[0])
33c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 29 3b 0a  .            );.
33d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
33e0: 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  ( !db->mallocFai
33f0: 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 61  led ){.        a
3400: 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 61  ssert( pParse->a
3410: 70 56 61 72 45 78 70 72 21 3d 30 20 29 3b 0a 20  pVarExpr!=0 );. 
3420: 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61         pParse->a
3430: 70 56 61 72 45 78 70 72 5b 70 50 61 72 73 65 2d  pVarExpr[pParse-
3440: 3e 6e 56 61 72 45 78 70 72 2b 2b 5d 20 3d 20 70  >nVarExpr++] = p
3450: 45 78 70 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Expr;.      }.  
3460: 20 20 7d 0a 20 20 7d 20 0a 20 20 69 66 28 20 21    }.  } .  if( !
3470: 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 26 26 20  pParse->nErr && 
3480: 70 50 61 72 73 65 2d 3e 6e 56 61 72 3e 53 51 4c  pParse->nVar>SQL
3490: 49 54 45 5f 4d 41 58 5f 56 41 52 49 41 42 4c 45  ITE_MAX_VARIABLE
34a0: 5f 4e 55 4d 42 45 52 20 29 7b 0a 20 20 20 20 73  _NUMBER ){.    s
34b0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
34c0: 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79  Parse, "too many
34d0: 20 53 51 4c 20 76 61 72 69 61 62 6c 65 73 22 29   SQL variables")
34e0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
34f0: 65 63 75 72 73 69 76 65 6c 79 20 64 65 6c 65 74  ecursively delet
3500: 65 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  e an expression 
3510: 74 72 65 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tree..*/.void sq
3520: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
3530: 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20  Expr *p){.  if( 
3540: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  p==0 ) return;. 
3550: 20 69 66 28 20 70 2d 3e 73 70 61 6e 2e 64 79 6e   if( p->span.dyn
3560: 20 29 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28   ) sqlite3_free(
3570: 28 63 68 61 72 2a 29 70 2d 3e 73 70 61 6e 2e 7a  (char*)p->span.z
3580: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 74 6f 6b 65  );.  if( p->toke
3590: 6e 2e 64 79 6e 20 29 20 73 71 6c 69 74 65 33 5f  n.dyn ) sqlite3_
35a0: 66 72 65 65 28 28 63 68 61 72 2a 29 70 2d 3e 74  free((char*)p->t
35b0: 6f 6b 65 6e 2e 7a 29 3b 0a 20 20 73 71 6c 69 74  oken.z);.  sqlit
35c0: 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 2d 3e  e3ExprDelete(p->
35d0: 70 4c 65 66 74 29 3b 0a 20 20 73 71 6c 69 74 65  pLeft);.  sqlite
35e0: 33 45 78 70 72 44 65 6c 65 74 65 28 70 2d 3e 70  3ExprDelete(p->p
35f0: 52 69 67 68 74 29 3b 0a 20 20 73 71 6c 69 74 65  Right);.  sqlite
3600: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
3610: 70 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 73 71 6c  p->pList);.  sql
3620: 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
3630: 28 70 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20  (p->pSelect);.  
3640: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
3650: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 45 78  .}../*.** The Ex
3660: 70 72 2e 74 6f 6b 65 6e 20 66 69 65 6c 64 20 6d  pr.token field m
3670: 69 67 68 74 20 62 65 20 61 20 73 74 72 69 6e 67  ight be a string
3680: 20 6c 69 74 65 72 61 6c 20 74 68 61 74 20 69 73   literal that is
3690: 20 71 75 6f 74 65 64 2e 0a 2a 2a 20 49 66 20 73   quoted..** If s
36a0: 6f 2c 20 72 65 6d 6f 76 65 20 74 68 65 20 71 75  o, remove the qu
36b0: 6f 74 61 74 69 6f 6e 20 6d 61 72 6b 73 2e 0a 2a  otation marks..*
36c0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65  /.void sqlite3De
36d0: 71 75 6f 74 65 45 78 70 72 28 73 71 6c 69 74 65  quoteExpr(sqlite
36e0: 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 29 7b  3 *db, Expr *p){
36f0: 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 41 6e  .  if( ExprHasAn
3700: 79 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  yProperty(p, EP_
3710: 44 65 71 75 6f 74 65 64 29 20 29 7b 0a 20 20 20  Dequoted) ){.   
3720: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 45   return;.  }.  E
3730: 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70  xprSetProperty(p
3740: 2c 20 45 50 5f 44 65 71 75 6f 74 65 64 29 3b 0a  , EP_Dequoted);.
3750: 20 20 69 66 28 20 70 2d 3e 74 6f 6b 65 6e 2e 64    if( p->token.d
3760: 79 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  yn==0 ){.    sql
3770: 69 74 65 33 54 6f 6b 65 6e 43 6f 70 79 28 64 62  ite3TokenCopy(db
3780: 2c 20 26 70 2d 3e 74 6f 6b 65 6e 2c 20 26 70 2d  , &p->token, &p-
3790: 3e 74 6f 6b 65 6e 29 3b 0a 20 20 7d 0a 20 20 73  >token);.  }.  s
37a0: 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28 28 63  qlite3Dequote((c
37b0: 68 61 72 2a 29 70 2d 3e 74 6f 6b 65 6e 2e 7a 29  har*)p->token.z)
37c0: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ;.}.../*.** The 
37d0: 66 6f 6c 6c 6f 77 69 6e 67 20 67 72 6f 75 70 20  following group 
37e0: 6f 66 20 72 6f 75 74 69 6e 65 73 20 6d 61 6b 65  of routines make
37f0: 20 64 65 65 70 20 63 6f 70 69 65 73 20 6f 66 20   deep copies of 
3800: 65 78 70 72 65 73 73 69 6f 6e 73 2c 0a 2a 2a 20  expressions,.** 
3810: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 73  expression lists
3820: 2c 20 49 44 20 6c 69 73 74 73 2c 20 61 6e 64 20  , ID lists, and 
3830: 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74  select statement
3840: 73 2e 20 20 54 68 65 20 63 6f 70 69 65 73 20 63  s.  The copies c
3850: 61 6e 0a 2a 2a 20 62 65 20 64 65 6c 65 74 65 64  an.** be deleted
3860: 20 28 62 79 20 62 65 69 6e 67 20 70 61 73 73 65   (by being passe
3870: 64 20 74 6f 20 74 68 65 69 72 20 72 65 73 70 65  d to their respe
3880: 63 74 69 76 65 20 2e 2e 2e 44 65 6c 65 74 65 28  ctive ...Delete(
3890: 29 20 72 6f 75 74 69 6e 65 73 29 0a 2a 2a 20 77  ) routines).** w
38a0: 69 74 68 6f 75 74 20 65 66 66 65 63 74 69 6e 67  ithout effecting
38b0: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 73 2e 0a   the originals..
38c0: 2a 2a 0a 2a 2a 20 54 68 65 20 65 78 70 72 65 73  **.** The expres
38d0: 73 69 6f 6e 20 6c 69 73 74 2c 20 49 44 2c 20 61  sion list, ID, a
38e0: 6e 64 20 73 6f 75 72 63 65 20 6c 69 73 74 73 20  nd source lists 
38f0: 72 65 74 75 72 6e 20 62 79 20 73 71 6c 69 74 65  return by sqlite
3900: 33 45 78 70 72 4c 69 73 74 44 75 70 28 29 2c 0a  3ExprListDup(),.
3910: 2a 2a 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74  ** sqlite3IdList
3920: 44 75 70 28 29 2c 20 61 6e 64 20 73 71 6c 69 74  Dup(), and sqlit
3930: 65 33 53 72 63 4c 69 73 74 44 75 70 28 29 20 63  e3SrcListDup() c
3940: 61 6e 20 6e 6f 74 20 62 65 20 66 75 72 74 68 65  an not be furthe
3950: 72 20 65 78 70 61 6e 64 65 64 20 0a 2a 2a 20 62  r expanded .** b
3960: 79 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c  y subsequent cal
3970: 6c 73 20 74 6f 20 73 71 6c 69 74 65 2a 4c 69 73  ls to sqlite*Lis
3980: 74 41 70 70 65 6e 64 28 29 20 72 6f 75 74 69 6e  tAppend() routin
3990: 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 74 61  es..**.** Any ta
39a0: 62 6c 65 73 20 74 68 61 74 20 74 68 65 20 53 72  bles that the Sr
39b0: 63 4c 69 73 74 20 6d 69 67 68 74 20 70 6f 69 6e  cList might poin
39c0: 74 20 74 6f 20 61 72 65 20 6e 6f 74 20 64 75 70  t to are not dup
39d0: 6c 69 63 61 74 65 64 2e 0a 2a 2f 0a 45 78 70 72  licated..*/.Expr
39e0: 20 2a 73 71 6c 69 74 65 33 45 78 70 72 44 75 70   *sqlite3ExprDup
39f0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78  (sqlite3 *db, Ex
3a00: 70 72 20 2a 70 29 7b 0a 20 20 45 78 70 72 20 2a  pr *p){.  Expr *
3a10: 70 4e 65 77 3b 0a 20 20 69 66 28 20 70 3d 3d 30  pNew;.  if( p==0
3a20: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
3a30: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  New = sqlite3DbM
3a40: 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a  allocRaw(db, siz
3a50: 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69 66 28  eof(*p) );.  if(
3a60: 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72   pNew==0 ) retur
3a70: 6e 20 30 3b 0a 20 20 6d 65 6d 63 70 79 28 70 4e  n 0;.  memcpy(pN
3a80: 65 77 2c 20 70 2c 20 73 69 7a 65 6f 66 28 2a 70  ew, p, sizeof(*p
3a90: 4e 65 77 29 29 3b 0a 20 20 69 66 28 20 70 2d 3e  New));.  if( p->
3aa0: 74 6f 6b 65 6e 2e 7a 21 3d 30 20 29 7b 0a 20 20  token.z!=0 ){.  
3ab0: 20 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e 2e 7a 20    pNew->token.z 
3ac0: 3d 20 28 75 38 2a 29 73 71 6c 69 74 65 33 44 62  = (u8*)sqlite3Db
3ad0: 53 74 72 4e 44 75 70 28 64 62 2c 20 28 63 68 61  StrNDup(db, (cha
3ae0: 72 2a 29 70 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70  r*)p->token.z, p
3af0: 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a 20 20 20 20  ->token.n);.    
3b00: 70 4e 65 77 2d 3e 74 6f 6b 65 6e 2e 64 79 6e 20  pNew->token.dyn 
3b10: 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 1;.  }else{.  
3b20: 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e    assert( pNew->
3b30: 74 6f 6b 65 6e 2e 7a 3d 3d 30 20 29 3b 0a 20 20  token.z==0 );.  
3b40: 7d 0a 20 20 70 4e 65 77 2d 3e 73 70 61 6e 2e 7a  }.  pNew->span.z
3b50: 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c   = 0;.  pNew->pL
3b60: 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  eft = sqlite3Exp
3b70: 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 4c 65 66  rDup(db, p->pLef
3b80: 74 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 52 69 67  t);.  pNew->pRig
3b90: 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ht = sqlite3Expr
3ba0: 44 75 70 28 64 62 2c 20 70 2d 3e 70 52 69 67 68  Dup(db, p->pRigh
3bb0: 74 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69 73  t);.  pNew->pLis
3bc0: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  t = sqlite3ExprL
3bd0: 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 4c  istDup(db, p->pL
3be0: 69 73 74 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 53  ist);.  pNew->pS
3bf0: 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53  elect = sqlite3S
3c00: 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 2d 3e  electDup(db, p->
3c10: 70 53 65 6c 65 63 74 29 3b 0a 20 20 72 65 74 75  pSelect);.  retu
3c20: 72 6e 20 70 4e 65 77 3b 0a 7d 0a 76 6f 69 64 20  rn pNew;.}.void 
3c30: 73 71 6c 69 74 65 33 54 6f 6b 65 6e 43 6f 70 79  sqlite3TokenCopy
3c40: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 6f  (sqlite3 *db, To
3c50: 6b 65 6e 20 2a 70 54 6f 2c 20 54 6f 6b 65 6e 20  ken *pTo, Token 
3c60: 2a 70 46 72 6f 6d 29 7b 0a 20 20 69 66 28 20 70  *pFrom){.  if( p
3c70: 54 6f 2d 3e 64 79 6e 20 29 20 73 71 6c 69 74 65  To->dyn ) sqlite
3c80: 33 5f 66 72 65 65 28 28 63 68 61 72 2a 29 70 54  3_free((char*)pT
3c90: 6f 2d 3e 7a 29 3b 0a 20 20 69 66 28 20 70 46 72  o->z);.  if( pFr
3ca0: 6f 6d 2d 3e 7a 20 29 7b 0a 20 20 20 20 70 54 6f  om->z ){.    pTo
3cb0: 2d 3e 6e 20 3d 20 70 46 72 6f 6d 2d 3e 6e 3b 0a  ->n = pFrom->n;.
3cc0: 20 20 20 20 70 54 6f 2d 3e 7a 20 3d 20 28 75 38      pTo->z = (u8
3cd0: 2a 29 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44  *)sqlite3DbStrND
3ce0: 75 70 28 64 62 2c 20 28 63 68 61 72 2a 29 70 46  up(db, (char*)pF
3cf0: 72 6f 6d 2d 3e 7a 2c 20 70 46 72 6f 6d 2d 3e 6e  rom->z, pFrom->n
3d00: 29 3b 0a 20 20 20 20 70 54 6f 2d 3e 64 79 6e 20  );.    pTo->dyn 
3d10: 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 1;.  }else{.  
3d20: 20 20 70 54 6f 2d 3e 7a 20 3d 20 30 3b 0a 20 20    pTo->z = 0;.  
3d30: 7d 0a 7d 0a 45 78 70 72 4c 69 73 74 20 2a 73 71  }.}.ExprList *sq
3d40: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
3d50: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78  (sqlite3 *db, Ex
3d60: 70 72 4c 69 73 74 20 2a 70 29 7b 0a 20 20 45 78  prList *p){.  Ex
3d70: 70 72 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20  prList *pNew;.  
3d80: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
3d90: 69 74 65 6d 20 2a 70 49 74 65 6d 2c 20 2a 70 4f  item *pItem, *pO
3da0: 6c 64 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b  ldItem;.  int i;
3db0: 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
3dc0: 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d  turn 0;.  pNew =
3dd0: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
3de0: 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a  Raw(db, sizeof(*
3df0: 70 4e 65 77 29 20 29 3b 0a 20 20 69 66 28 20 70  pNew) );.  if( p
3e00: 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  New==0 ) return 
3e10: 30 3b 0a 20 20 70 4e 65 77 2d 3e 69 45 43 75 72  0;.  pNew->iECur
3e20: 73 6f 72 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d  sor = 0;.  pNew-
3e30: 3e 6e 45 78 70 72 20 3d 20 70 4e 65 77 2d 3e 6e  >nExpr = pNew->n
3e40: 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 45 78 70 72  Alloc = p->nExpr
3e50: 3b 0a 20 20 70 4e 65 77 2d 3e 61 20 3d 20 70 49  ;.  pNew->a = pI
3e60: 74 65 6d 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  tem = sqlite3DbM
3e70: 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 20 70 2d  allocRaw(db,  p-
3e80: 3e 6e 45 78 70 72 2a 73 69 7a 65 6f 66 28 70 2d  >nExpr*sizeof(p-
3e90: 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20  >a[0]) );.  if( 
3ea0: 70 49 74 65 6d 3d 3d 30 20 29 7b 0a 20 20 20 20  pItem==0 ){.    
3eb0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65  sqlite3_free(pNe
3ec0: 77 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  w);.    return 0
3ed0: 3b 0a 20 20 7d 20 0a 20 20 70 4f 6c 64 49 74 65  ;.  } .  pOldIte
3ee0: 6d 20 3d 20 70 2d 3e 61 3b 0a 20 20 66 6f 72 28  m = p->a;.  for(
3ef0: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 45 78 70 72 3b  i=0; i<p->nExpr;
3f00: 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 2c 20 70   i++, pItem++, p
3f10: 4f 6c 64 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  OldItem++){.    
3f20: 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72 2c 20  Expr *pNewExpr, 
3f30: 2a 70 4f 6c 64 45 78 70 72 3b 0a 20 20 20 20 70  *pOldExpr;.    p
3f40: 49 74 65 6d 2d 3e 70 45 78 70 72 20 3d 20 70 4e  Item->pExpr = pN
3f50: 65 77 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  ewExpr = sqlite3
3f60: 45 78 70 72 44 75 70 28 64 62 2c 20 70 4f 6c 64  ExprDup(db, pOld
3f70: 45 78 70 72 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  Expr = pOldItem-
3f80: 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28  >pExpr);.    if(
3f90: 20 70 4f 6c 64 45 78 70 72 2d 3e 73 70 61 6e 2e   pOldExpr->span.
3fa0: 7a 21 3d 30 20 26 26 20 70 4e 65 77 45 78 70 72  z!=0 && pNewExpr
3fb0: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6c 77   ){.      /* Alw
3fc0: 61 79 73 20 6d 61 6b 65 20 61 20 63 6f 70 79 20  ays make a copy 
3fd0: 6f 66 20 74 68 65 20 73 70 61 6e 20 66 6f 72 20  of the span for 
3fe0: 74 6f 70 2d 6c 65 76 65 6c 20 65 78 70 72 65 73  top-level expres
3ff0: 73 69 6f 6e 73 20 69 6e 20 74 68 65 0a 20 20 20  sions in the.   
4000: 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e     ** expression
4010: 20 6c 69 73 74 2e 20 20 54 68 65 20 6c 6f 67 69   list.  The logi
4020: 63 20 69 6e 20 53 45 4c 45 43 54 20 70 72 6f 63  c in SELECT proc
4030: 65 73 73 69 6e 67 20 74 68 61 74 20 64 65 74 65  essing that dete
4040: 72 6d 69 6e 65 73 0a 20 20 20 20 20 20 2a 2a 20  rmines.      ** 
4050: 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 63 6f 6c  the names of col
4060: 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75  umns in the resu
4070: 6c 74 20 73 65 74 20 6e 65 65 64 73 20 74 68 69  lt set needs thi
4080: 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f  s information */
4090: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 6f  .      sqlite3To
40a0: 6b 65 6e 43 6f 70 79 28 64 62 2c 20 26 70 4e 65  kenCopy(db, &pNe
40b0: 77 45 78 70 72 2d 3e 73 70 61 6e 2c 20 26 70 4f  wExpr->span, &pO
40c0: 6c 64 45 78 70 72 2d 3e 73 70 61 6e 29 3b 0a 20  ldExpr->span);. 
40d0: 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
40e0: 20 70 4e 65 77 45 78 70 72 3d 3d 30 20 7c 7c 20   pNewExpr==0 || 
40f0: 70 4e 65 77 45 78 70 72 2d 3e 73 70 61 6e 2e 7a  pNewExpr->span.z
4100: 21 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20 20  !=0 .           
4110: 20 7c 7c 20 70 4f 6c 64 45 78 70 72 2d 3e 73 70   || pOldExpr->sp
4120: 61 6e 2e 7a 3d 3d 30 0a 20 20 20 20 20 20 20 20  an.z==0.        
4130: 20 20 20 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f      || db->mallo
4140: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 70  cFailed );.    p
4150: 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71  Item->zName = sq
4160: 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
4170: 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d  , pOldItem->zNam
4180: 65 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 73  e);.    pItem->s
4190: 6f 72 74 4f 72 64 65 72 20 3d 20 70 4f 6c 64 49  ortOrder = pOldI
41a0: 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3b 0a  tem->sortOrder;.
41b0: 20 20 20 20 70 49 74 65 6d 2d 3e 69 73 41 67 67      pItem->isAgg
41c0: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 73 41   = pOldItem->isA
41d0: 67 67 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 64  gg;.    pItem->d
41e0: 6f 6e 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  one = 0;.  }.  r
41f0: 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f  eturn pNew;.}../
4200: 2a 0a 2a 2a 20 49 66 20 63 75 72 73 6f 72 73 2c  *.** If cursors,
4210: 20 74 72 69 67 67 65 72 73 2c 20 76 69 65 77 73   triggers, views
4220: 20 61 6e 64 20 73 75 62 71 75 65 72 69 65 73 20   and subqueries 
4230: 61 72 65 20 61 6c 6c 20 6f 6d 69 74 74 65 64 20  are all omitted 
4240: 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 62 75 69 6c  from.** the buil
4250: 64 2c 20 74 68 65 6e 20 6e 6f 6e 65 20 6f 66 20  d, then none of 
4260: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f  the following ro
4270: 75 74 69 6e 65 73 2c 20 65 78 63 65 70 74 20 66  utines, except f
4280: 6f 72 20 0a 2a 2a 20 73 71 6c 69 74 65 33 53 65  or .** sqlite3Se
4290: 6c 65 63 74 44 75 70 28 29 2c 20 63 61 6e 20 62  lectDup(), can b
42a0: 65 20 63 61 6c 6c 65 64 2e 20 73 71 6c 69 74 65  e called. sqlite
42b0: 33 53 65 6c 65 63 74 44 75 70 28 29 20 69 73 20  3SelectDup() is 
42c0: 73 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20 63 61 6c  sometimes.** cal
42d0: 6c 65 64 20 77 69 74 68 20 61 20 4e 55 4c 4c 20  led with a NULL 
42e0: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 23 69 66  argument..*/.#if
42f0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
4300: 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21  _OMIT_VIEW) || !
4310: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
4320: 4d 49 54 5f 54 52 49 47 47 45 52 29 20 5c 0a 20  MIT_TRIGGER) \. 
4330: 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
4340: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
4350: 29 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c 69 74  ).SrcList *sqlit
4360: 65 33 53 72 63 4c 69 73 74 44 75 70 28 73 71 6c  e3SrcListDup(sql
4370: 69 74 65 33 20 2a 64 62 2c 20 53 72 63 4c 69 73  ite3 *db, SrcLis
4380: 74 20 2a 70 29 7b 0a 20 20 53 72 63 4c 69 73 74  t *p){.  SrcList
4390: 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 69 3b   *pNew;.  int i;
43a0: 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20  .  int nByte;.  
43b0: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
43c0: 6e 20 30 3b 0a 20 20 6e 42 79 74 65 20 3d 20 73  n 0;.  nByte = s
43d0: 69 7a 65 6f 66 28 2a 70 29 20 2b 20 28 70 2d 3e  izeof(*p) + (p->
43e0: 6e 53 72 63 3e 30 20 3f 20 73 69 7a 65 6f 66 28  nSrc>0 ? sizeof(
43f0: 70 2d 3e 61 5b 30 5d 29 20 2a 20 28 70 2d 3e 6e  p->a[0]) * (p->n
4400: 53 72 63 2d 31 29 20 3a 20 30 29 3b 0a 20 20 70  Src-1) : 0);.  p
4410: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  New = sqlite3DbM
4420: 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 6e 42 79  allocRaw(db, nBy
4430: 74 65 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  te );.  if( pNew
4440: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
4450: 20 20 70 4e 65 77 2d 3e 6e 53 72 63 20 3d 20 70    pNew->nSrc = p
4460: 4e 65 77 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70 2d  New->nAlloc = p-
4470: 3e 6e 53 72 63 3b 0a 20 20 66 6f 72 28 69 3d 30  >nSrc;.  for(i=0
4480: 3b 20 69 3c 70 2d 3e 6e 53 72 63 3b 20 69 2b 2b  ; i<p->nSrc; i++
4490: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72  ){.    struct Sr
44a0: 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4e 65 77  cList_item *pNew
44b0: 49 74 65 6d 20 3d 20 26 70 4e 65 77 2d 3e 61 5b  Item = &pNew->a[
44c0: 69 5d 3b 0a 20 20 20 20 73 74 72 75 63 74 20 53  i];.    struct S
44d0: 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4f 6c  rcList_item *pOl
44e0: 64 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d  dItem = &p->a[i]
44f0: 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  ;.    Table *pTa
4500: 62 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  b;.    pNewItem-
4510: 3e 7a 44 61 74 61 62 61 73 65 20 3d 20 73 71 6c  >zDatabase = sql
4520: 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
4530: 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 44 61 74 61   pOldItem->zData
4540: 62 61 73 65 29 3b 0a 20 20 20 20 70 4e 65 77 49  base);.    pNewI
4550: 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c  tem->zName = sql
4560: 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
4570: 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65   pOldItem->zName
4580: 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  );.    pNewItem-
4590: 3e 7a 41 6c 69 61 73 20 3d 20 73 71 6c 69 74 65  >zAlias = sqlite
45a0: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f  3DbStrDup(db, pO
45b0: 6c 64 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b  ldItem->zAlias);
45c0: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 6a  .    pNewItem->j
45d0: 6f 69 6e 74 79 70 65 20 3d 20 70 4f 6c 64 49 74  ointype = pOldIt
45e0: 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20  em->jointype;.  
45f0: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 69 43 75 72    pNewItem->iCur
4600: 73 6f 72 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e  sor = pOldItem->
4610: 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 70 4e 65  iCursor;.    pNe
4620: 77 49 74 65 6d 2d 3e 69 73 50 6f 70 75 6c 61 74  wItem->isPopulat
4630: 65 64 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69  ed = pOldItem->i
4640: 73 50 6f 70 75 6c 61 74 65 64 3b 0a 20 20 20 20  sPopulated;.    
4650: 70 54 61 62 20 3d 20 70 4e 65 77 49 74 65 6d 2d  pTab = pNewItem-
4660: 3e 70 54 61 62 20 3d 20 70 4f 6c 64 49 74 65 6d  >pTab = pOldItem
4670: 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69 66 28 20  ->pTab;.    if( 
4680: 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20 70 54  pTab ){.      pT
4690: 61 62 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20  ab->nRef++;.    
46a0: 7d 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  }.    pNewItem->
46b0: 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65  pSelect = sqlite
46c0: 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70  3SelectDup(db, p
46d0: 4f 6c 64 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74  OldItem->pSelect
46e0: 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  );.    pNewItem-
46f0: 3e 70 4f 6e 20 3d 20 73 71 6c 69 74 65 33 45 78  >pOn = sqlite3Ex
4700: 70 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74  prDup(db, pOldIt
4710: 65 6d 2d 3e 70 4f 6e 29 3b 0a 20 20 20 20 70 4e  em->pOn);.    pN
4720: 65 77 49 74 65 6d 2d 3e 70 55 73 69 6e 67 20 3d  ewItem->pUsing =
4730: 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 75   sqlite3IdListDu
4740: 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e  p(db, pOldItem->
4750: 70 55 73 69 6e 67 29 3b 0a 20 20 20 20 70 4e 65  pUsing);.    pNe
4760: 77 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 20 3d  wItem->colUsed =
4770: 20 70 4f 6c 64 49 74 65 6d 2d 3e 63 6f 6c 55 73   pOldItem->colUs
4780: 65 64 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ed;.  }.  return
4790: 20 70 4e 65 77 3b 0a 7d 0a 49 64 4c 69 73 74 20   pNew;.}.IdList 
47a0: 2a 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 75  *sqlite3IdListDu
47b0: 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 49  p(sqlite3 *db, I
47c0: 64 4c 69 73 74 20 2a 70 29 7b 0a 20 20 49 64 4c  dList *p){.  IdL
47d0: 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74  ist *pNew;.  int
47e0: 20 69 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29   i;.  if( p==0 )
47f0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65   return 0;.  pNe
4800: 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  w = sqlite3DbMal
4810: 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f  locRaw(db, sizeo
4820: 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20 69 66  f(*pNew) );.  if
4830: 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75  ( pNew==0 ) retu
4840: 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e 49  rn 0;.  pNew->nI
4850: 64 20 3d 20 70 4e 65 77 2d 3e 6e 41 6c 6c 6f 63  d = pNew->nAlloc
4860: 20 3d 20 70 2d 3e 6e 49 64 3b 0a 20 20 70 4e 65   = p->nId;.  pNe
4870: 77 2d 3e 61 20 3d 20 73 71 6c 69 74 65 33 44 62  w->a = sqlite3Db
4880: 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 70 2d  MallocRaw(db, p-
4890: 3e 6e 49 64 2a 73 69 7a 65 6f 66 28 70 2d 3e 61  >nId*sizeof(p->a
48a0: 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 70 4e  [0]) );.  if( pN
48b0: 65 77 2d 3e 61 3d 3d 30 20 29 7b 0a 20 20 20 20  ew->a==0 ){.    
48c0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65  sqlite3_free(pNe
48d0: 77 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  w);.    return 0
48e0: 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b  ;.  }.  for(i=0;
48f0: 20 69 3c 70 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b   i<p->nId; i++){
4900: 0a 20 20 20 20 73 74 72 75 63 74 20 49 64 4c 69  .    struct IdLi
4910: 73 74 5f 69 74 65 6d 20 2a 70 4e 65 77 49 74 65  st_item *pNewIte
4920: 6d 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b  m = &pNew->a[i];
4930: 0a 20 20 20 20 73 74 72 75 63 74 20 49 64 4c 69  .    struct IdLi
4940: 73 74 5f 69 74 65 6d 20 2a 70 4f 6c 64 49 74 65  st_item *pOldIte
4950: 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20  m = &p->a[i];.  
4960: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61 6d    pNewItem->zNam
4970: 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  e = sqlite3DbStr
4980: 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d  Dup(db, pOldItem
4990: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4e  ->zName);.    pN
49a0: 65 77 49 74 65 6d 2d 3e 69 64 78 20 3d 20 70 4f  ewItem->idx = pO
49b0: 6c 64 49 74 65 6d 2d 3e 69 64 78 3b 0a 20 20 7d  ldItem->idx;.  }
49c0: 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a  .  return pNew;.
49d0: 7d 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69 74 65  }.Select *sqlite
49e0: 33 53 65 6c 65 63 74 44 75 70 28 73 71 6c 69 74  3SelectDup(sqlit
49f0: 65 33 20 2a 64 62 2c 20 53 65 6c 65 63 74 20 2a  e3 *db, Select *
4a00: 70 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 4e  p){.  Select *pN
4a10: 65 77 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29  ew;.  if( p==0 )
4a20: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65   return 0;.  pNe
4a30: 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  w = sqlite3DbMal
4a40: 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f  locRaw(db, sizeo
4a50: 66 28 2a 70 29 20 29 3b 0a 20 20 69 66 28 20 70  f(*p) );.  if( p
4a60: 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  New==0 ) return 
4a70: 30 3b 0a 20 20 70 4e 65 77 2d 3e 69 73 44 69 73  0;.  pNew->isDis
4a80: 74 69 6e 63 74 20 3d 20 70 2d 3e 69 73 44 69 73  tinct = p->isDis
4a90: 74 69 6e 63 74 3b 0a 20 20 70 4e 65 77 2d 3e 70  tinct;.  pNew->p
4aa0: 45 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45  EList = sqlite3E
4ab0: 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70  xprListDup(db, p
4ac0: 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 70 4e 65  ->pEList);.  pNe
4ad0: 77 2d 3e 70 53 72 63 20 3d 20 73 71 6c 69 74 65  w->pSrc = sqlite
4ae0: 33 53 72 63 4c 69 73 74 44 75 70 28 64 62 2c 20  3SrcListDup(db, 
4af0: 70 2d 3e 70 53 72 63 29 3b 0a 20 20 70 4e 65 77  p->pSrc);.  pNew
4b00: 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74  ->pWhere = sqlit
4b10: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d  e3ExprDup(db, p-
4b20: 3e 70 57 68 65 72 65 29 3b 0a 20 20 70 4e 65 77  >pWhere);.  pNew
4b30: 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71 6c  ->pGroupBy = sql
4b40: 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
4b50: 64 62 2c 20 70 2d 3e 70 47 72 6f 75 70 42 79 29  db, p->pGroupBy)
4b60: 3b 0a 20 20 70 4e 65 77 2d 3e 70 48 61 76 69 6e  ;.  pNew->pHavin
4b70: 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  g = sqlite3ExprD
4b80: 75 70 28 64 62 2c 20 70 2d 3e 70 48 61 76 69 6e  up(db, p->pHavin
4b90: 67 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 72 64  g);.  pNew->pOrd
4ba0: 65 72 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78  erBy = sqlite3Ex
4bb0: 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d  prListDup(db, p-
4bc0: 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 70 4e  >pOrderBy);.  pN
4bd0: 65 77 2d 3e 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a  ew->op = p->op;.
4be0: 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72 20 3d    pNew->pPrior =
4bf0: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75   sqlite3SelectDu
4c00: 70 28 64 62 2c 20 70 2d 3e 70 50 72 69 6f 72 29  p(db, p->pPrior)
4c10: 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69 6d 69 74  ;.  pNew->pLimit
4c20: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
4c30: 70 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29  p(db, p->pLimit)
4c40: 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 66 66 73 65  ;.  pNew->pOffse
4c50: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  t = sqlite3ExprD
4c60: 75 70 28 64 62 2c 20 70 2d 3e 70 4f 66 66 73 65  up(db, p->pOffse
4c70: 74 29 3b 0a 20 20 70 4e 65 77 2d 3e 69 4c 69 6d  t);.  pNew->iLim
4c80: 69 74 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d  it = -1;.  pNew-
4c90: 3e 69 4f 66 66 73 65 74 20 3d 20 2d 31 3b 0a 20  >iOffset = -1;. 
4ca0: 20 70 4e 65 77 2d 3e 69 73 52 65 73 6f 6c 76 65   pNew->isResolve
4cb0: 64 20 3d 20 70 2d 3e 69 73 52 65 73 6f 6c 76 65  d = p->isResolve
4cc0: 64 3b 0a 20 20 70 4e 65 77 2d 3e 69 73 41 67 67  d;.  pNew->isAgg
4cd0: 20 3d 20 70 2d 3e 69 73 41 67 67 3b 0a 20 20 70   = p->isAgg;.  p
4ce0: 4e 65 77 2d 3e 75 73 65 73 45 70 68 6d 20 3d 20  New->usesEphm = 
4cf0: 30 3b 0a 20 20 70 4e 65 77 2d 3e 64 69 73 61 6c  0;.  pNew->disal
4d00: 6c 6f 77 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  lowOrderBy = 0;.
4d10: 20 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 6d 6f    pNew->pRightmo
4d20: 73 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  st = 0;.  pNew->
4d30: 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20  addrOpenEphm[0] 
4d40: 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 61 64  = -1;.  pNew->ad
4d50: 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 20  drOpenEphm[1] = 
4d60: 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 61 64 64 72  -1;.  pNew->addr
4d70: 4f 70 65 6e 45 70 68 6d 5b 32 5d 20 3d 20 2d 31  OpenEphm[2] = -1
4d80: 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b  ;.  return pNew;
4d90: 0a 7d 0a 23 65 6c 73 65 0a 53 65 6c 65 63 74 20  .}.#else.Select 
4da0: 2a 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75  *sqlite3SelectDu
4db0: 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53  p(sqlite3 *db, S
4dc0: 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 61 73 73  elect *p){.  ass
4dd0: 65 72 74 28 20 70 3d 3d 30 20 29 3b 0a 20 20 72  ert( p==0 );.  r
4de0: 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69  eturn 0;.}.#endi
4df0: 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20  f.../*.** Add a 
4e00: 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74  new element to t
4e10: 68 65 20 65 6e 64 20 6f 66 20 61 6e 20 65 78 70  he end of an exp
4e20: 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20 20 49  ression list.  I
4e30: 66 20 70 4c 69 73 74 20 69 73 0a 2a 2a 20 69 6e  f pList is.** in
4e40: 69 74 69 61 6c 6c 79 20 4e 55 4c 4c 2c 20 74 68  itially NULL, th
4e50: 65 6e 20 63 72 65 61 74 65 20 61 20 6e 65 77 20  en create a new 
4e60: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e  expression list.
4e70: 0a 2a 2f 0a 45 78 70 72 4c 69 73 74 20 2a 73 71  .*/.ExprList *sq
4e80: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
4e90: 65 6e 64 28 0a 20 20 50 61 72 73 65 20 2a 70 50  end(.  Parse *pP
4ea0: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f  arse,          /
4eb0: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
4ec0: 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  t */.  ExprList 
4ed0: 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20 2f  *pList,        /
4ee0: 2a 20 4c 69 73 74 20 74 6f 20 77 68 69 63 68 20  * List to which 
4ef0: 74 6f 20 61 70 70 65 6e 64 2e 20 4d 69 67 68 74  to append. Might
4f00: 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78   be NULL */.  Ex
4f10: 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20  pr *pExpr,      
4f20: 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73        /* Express
4f30: 69 6f 6e 20 74 6f 20 62 65 20 61 70 70 65 6e 64  ion to be append
4f40: 65 64 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  ed */.  Token *p
4f50: 4e 61 6d 65 20 20 20 20 20 20 20 20 20 20 20 20  Name            
4f60: 2f 2a 20 41 53 20 6b 65 79 77 6f 72 64 20 66 6f  /* AS keyword fo
4f70: 72 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  r the expression
4f80: 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
4f90: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
4fa0: 62 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  b;.  if( pList==
4fb0: 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d  0 ){.    pList =
4fc0: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
4fd0: 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28  Zero(db, sizeof(
4fe0: 45 78 70 72 4c 69 73 74 29 20 29 3b 0a 20 20 20  ExprList) );.   
4ff0: 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b   if( pList==0 ){
5000: 0a 20 20 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d  .      goto no_m
5010: 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  em;.    }.    as
5020: 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 41 6c  sert( pList->nAl
5030: 6c 6f 63 3d 3d 30 20 29 3b 0a 20 20 7d 0a 20 20  loc==0 );.  }.  
5040: 69 66 28 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f  if( pList->nAllo
5050: 63 3c 3d 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20  c<=pList->nExpr 
5060: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45 78  ){.    struct Ex
5070: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 3b 0a  prList_item *a;.
5080: 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 4c 69 73      int n = pLis
5090: 74 2d 3e 6e 41 6c 6c 6f 63 2a 32 20 2b 20 34 3b  t->nAlloc*2 + 4;
50a0: 0a 20 20 20 20 61 20 3d 20 73 71 6c 69 74 65 33  .    a = sqlite3
50b0: 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70 4c  DbRealloc(db, pL
50c0: 69 73 74 2d 3e 61 2c 20 6e 2a 73 69 7a 65 6f 66  ist->a, n*sizeof
50d0: 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a  (pList->a[0]));.
50e0: 20 20 20 20 69 66 28 20 61 3d 3d 30 20 29 7b 0a      if( a==0 ){.
50f0: 20 20 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65        goto no_me
5100: 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 69  m;.    }.    pLi
5110: 73 74 2d 3e 61 20 3d 20 61 3b 0a 20 20 20 20 70  st->a = a;.    p
5120: 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 6e  List->nAlloc = n
5130: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
5140: 70 4c 69 73 74 2d 3e 61 21 3d 30 20 29 3b 0a 20  pList->a!=0 );. 
5150: 20 69 66 28 20 70 45 78 70 72 20 7c 7c 20 70 4e   if( pExpr || pN
5160: 61 6d 65 20 29 7b 0a 20 20 20 20 73 74 72 75 63  ame ){.    struc
5170: 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
5180: 2a 70 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d  *pItem = &pList-
5190: 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2b  >a[pList->nExpr+
51a0: 2b 5d 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70  +];.    memset(p
51b0: 49 74 65 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Item, 0, sizeof(
51c0: 2a 70 49 74 65 6d 29 29 3b 0a 20 20 20 20 70 49  *pItem));.    pI
51d0: 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c  tem->zName = sql
51e0: 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
51f0: 6e 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20  n(db, pName);.  
5200: 20 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 20 3d    pItem->pExpr =
5210: 20 70 45 78 70 72 3b 0a 20 20 7d 0a 20 20 72 65   pExpr;.  }.  re
5220: 74 75 72 6e 20 70 4c 69 73 74 3b 0a 0a 6e 6f 5f  turn pList;..no_
5230: 6d 65 6d 3a 20 20 20 20 20 0a 20 20 2f 2a 20 41  mem:     .  /* A
5240: 76 6f 69 64 20 6c 65 61 6b 69 6e 67 20 6d 65 6d  void leaking mem
5250: 6f 72 79 20 69 66 20 6d 61 6c 6c 6f 63 20 68 61  ory if malloc ha
5260: 73 20 66 61 69 6c 65 64 2e 20 2a 2f 0a 20 20 73  s failed. */.  s
5270: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
5280: 28 70 45 78 70 72 29 3b 0a 20 20 73 71 6c 69 74  (pExpr);.  sqlit
5290: 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
52a0: 28 70 4c 69 73 74 29 3b 0a 20 20 72 65 74 75 72  (pList);.  retur
52b0: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  n 0;.}../*.** If
52c0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
52d0: 6c 69 73 74 20 70 45 4c 69 73 74 20 63 6f 6e 74  list pEList cont
52e0: 61 69 6e 73 20 6d 6f 72 65 20 74 68 61 6e 20 69  ains more than i
52f0: 4c 69 6d 69 74 20 65 6c 65 6d 65 6e 74 73 2c 0a  Limit elements,.
5300: 2a 2a 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f  ** leave an erro
5310: 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61  r message in pPa
5320: 72 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  rse..*/.void sql
5330: 69 74 65 33 45 78 70 72 4c 69 73 74 43 68 65 63  ite3ExprListChec
5340: 6b 4c 65 6e 67 74 68 28 0a 20 20 50 61 72 73 65  kLength(.  Parse
5350: 20 2a 70 50 61 72 73 65 2c 0a 20 20 45 78 70 72   *pParse,.  Expr
5360: 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 0a 20 20  List *pEList,.  
5370: 69 6e 74 20 69 4c 69 6d 69 74 2c 0a 20 20 63 6f  int iLimit,.  co
5380: 6e 73 74 20 63 68 61 72 20 2a 7a 4f 62 6a 65 63  nst char *zObjec
5390: 74 0a 29 7b 0a 20 20 69 66 28 20 70 45 4c 69 73  t.){.  if( pELis
53a0: 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78  t && pEList->nEx
53b0: 70 72 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20  pr>iLimit ){.   
53c0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
53d0: 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61  (pParse, "too ma
53e0: 6e 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 25 73  ny columns in %s
53f0: 22 2c 20 7a 4f 62 6a 65 63 74 29 3b 0a 20 20 7d  ", zObject);.  }
5400: 0a 7d 0a 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  .}...#if defined
5410: 28 53 51 4c 49 54 45 5f 54 45 53 54 29 20 7c 7c  (SQLITE_TEST) ||
5420: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52   SQLITE_MAX_EXPR
5430: 5f 44 45 50 54 48 3e 30 0a 2f 2a 20 54 68 65 20  _DEPTH>0./* The 
5440: 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 72 65 65 20  following three 
5450: 66 75 6e 63 74 69 6f 6e 73 2c 20 68 65 69 67 68  functions, heigh
5460: 74 4f 66 45 78 70 72 28 29 2c 20 68 65 69 67 68  tOfExpr(), heigh
5470: 74 4f 66 45 78 70 72 4c 69 73 74 28 29 0a 2a 2a  tOfExprList().**
5480: 20 61 6e 64 20 68 65 69 67 68 74 4f 66 53 65 6c   and heightOfSel
5490: 65 63 74 28 29 2c 20 61 72 65 20 75 73 65 64 20  ect(), are used 
54a0: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  to determine the
54b0: 20 6d 61 78 69 6d 75 6d 20 68 65 69 67 68 74 0a   maximum height.
54c0: 2a 2a 20 6f 66 20 61 6e 79 20 65 78 70 72 65 73  ** of any expres
54d0: 73 69 6f 6e 20 74 72 65 65 20 72 65 66 65 72 65  sion tree refere
54e0: 6e 63 65 64 20 62 79 20 74 68 65 20 73 74 72 75  nced by the stru
54f0: 63 74 75 72 65 20 70 61 73 73 65 64 20 61 73 20  cture passed as 
5500: 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 61 72 67  the.** first arg
5510: 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ument..**.** If 
5520: 74 68 69 73 20 6d 61 78 69 6d 75 6d 20 68 65 69  this maximum hei
5530: 67 68 74 20 69 73 20 67 72 65 61 74 65 72 20 74  ght is greater t
5540: 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20  han the current 
5550: 76 61 6c 75 65 20 70 6f 69 6e 74 65 64 0a 2a 2a  value pointed.**
5560: 20 74 6f 20 62 79 20 70 6e 48 65 69 67 68 74 2c   to by pnHeight,
5570: 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61   the second para
5580: 6d 65 74 65 72 2c 20 74 68 65 6e 20 73 65 74 20  meter, then set 
5590: 2a 70 6e 48 65 69 67 68 74 20 74 6f 20 74 68 61  *pnHeight to tha
55a0: 74 0a 2a 2a 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73  t.** value..*/.s
55b0: 74 61 74 69 63 20 76 6f 69 64 20 68 65 69 67 68  tatic void heigh
55c0: 74 4f 66 45 78 70 72 28 45 78 70 72 20 2a 70 2c  tOfExpr(Expr *p,
55d0: 20 69 6e 74 20 2a 70 6e 48 65 69 67 68 74 29 7b   int *pnHeight){
55e0: 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
55f0: 69 66 28 20 70 2d 3e 6e 48 65 69 67 68 74 3e 2a  if( p->nHeight>*
5600: 70 6e 48 65 69 67 68 74 20 29 7b 0a 20 20 20 20  pnHeight ){.    
5610: 20 20 2a 70 6e 48 65 69 67 68 74 20 3d 20 70 2d    *pnHeight = p-
5620: 3e 6e 48 65 69 67 68 74 3b 0a 20 20 20 20 7d 0a  >nHeight;.    }.
5630: 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69    }.}.static voi
5640: 64 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69  d heightOfExprLi
5650: 73 74 28 45 78 70 72 4c 69 73 74 20 2a 70 2c 20  st(ExprList *p, 
5660: 69 6e 74 20 2a 70 6e 48 65 69 67 68 74 29 7b 0a  int *pnHeight){.
5670: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69    if( p ){.    i
5680: 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
5690: 30 3b 20 69 3c 70 2d 3e 6e 45 78 70 72 3b 20 69  0; i<p->nExpr; i
56a0: 2b 2b 29 7b 0a 20 20 20 20 20 20 68 65 69 67 68  ++){.      heigh
56b0: 74 4f 66 45 78 70 72 28 70 2d 3e 61 5b 69 5d 2e  tOfExpr(p->a[i].
56c0: 70 45 78 70 72 2c 20 70 6e 48 65 69 67 68 74 29  pExpr, pnHeight)
56d0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74  ;.    }.  }.}.st
56e0: 61 74 69 63 20 76 6f 69 64 20 68 65 69 67 68 74  atic void height
56f0: 4f 66 53 65 6c 65 63 74 28 53 65 6c 65 63 74 20  OfSelect(Select 
5700: 2a 70 2c 20 69 6e 74 20 2a 70 6e 48 65 69 67 68  *p, int *pnHeigh
5710: 74 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  t){.  if( p ){. 
5720: 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 28     heightOfExpr(
5730: 70 2d 3e 70 57 68 65 72 65 2c 20 70 6e 48 65 69  p->pWhere, pnHei
5740: 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74  ght);.    height
5750: 4f 66 45 78 70 72 28 70 2d 3e 70 48 61 76 69 6e  OfExpr(p->pHavin
5760: 67 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20  g, pnHeight);.  
5770: 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 28 70    heightOfExpr(p
5780: 2d 3e 70 4c 69 6d 69 74 2c 20 70 6e 48 65 69 67  ->pLimit, pnHeig
5790: 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f  ht);.    heightO
57a0: 66 45 78 70 72 28 70 2d 3e 70 4f 66 66 73 65 74  fExpr(p->pOffset
57b0: 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20  , pnHeight);.   
57c0: 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73   heightOfExprLis
57d0: 74 28 70 2d 3e 70 45 4c 69 73 74 2c 20 70 6e 48  t(p->pEList, pnH
57e0: 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67  eight);.    heig
57f0: 68 74 4f 66 45 78 70 72 4c 69 73 74 28 70 2d 3e  htOfExprList(p->
5800: 70 47 72 6f 75 70 42 79 2c 20 70 6e 48 65 69 67  pGroupBy, pnHeig
5810: 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f  ht);.    heightO
5820: 66 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 4f 72  fExprList(p->pOr
5830: 64 65 72 42 79 2c 20 70 6e 48 65 69 67 68 74 29  derBy, pnHeight)
5840: 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 53 65  ;.    heightOfSe
5850: 6c 65 63 74 28 70 2d 3e 70 50 72 69 6f 72 2c 20  lect(p->pPrior, 
5860: 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 7d 0a 7d  pnHeight);.  }.}
5870: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
5880: 45 78 70 72 2e 6e 48 65 69 67 68 74 20 76 61 72  Expr.nHeight var
5890: 69 61 62 6c 65 20 69 6e 20 74 68 65 20 73 74 72  iable in the str
58a0: 75 63 74 75 72 65 20 70 61 73 73 65 64 20 61 73  ucture passed as
58b0: 20 61 6e 20 0a 2a 2a 20 61 72 67 75 6d 65 6e 74   an .** argument
58c0: 2e 20 41 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  . An expression 
58d0: 77 69 74 68 20 6e 6f 20 63 68 69 6c 64 72 65 6e  with no children
58e0: 2c 20 45 78 70 72 2e 70 4c 69 73 74 20 6f 72 20  , Expr.pList or 
58f0: 0a 2a 2a 20 45 78 70 72 2e 70 53 65 6c 65 63 74  .** Expr.pSelect
5900: 20 6d 65 6d 62 65 72 20 68 61 73 20 61 20 68 65   member has a he
5910: 69 67 68 74 20 6f 66 20 31 2e 20 41 6e 79 20 6f  ight of 1. Any o
5920: 74 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e 0a  ther expression.
5930: 2a 2a 20 68 61 73 20 61 20 68 65 69 67 68 74 20  ** has a height 
5940: 65 71 75 61 6c 20 74 6f 20 74 68 65 20 6d 61 78  equal to the max
5950: 69 6d 75 6d 20 68 65 69 67 68 74 20 6f 66 20 61  imum height of a
5960: 6e 79 20 6f 74 68 65 72 20 0a 2a 2a 20 72 65 66  ny other .** ref
5970: 65 72 65 6e 63 65 64 20 45 78 70 72 20 70 6c 75  erenced Expr plu
5980: 73 20 6f 6e 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73  s one..*/.void s
5990: 71 6c 69 74 65 33 45 78 70 72 53 65 74 48 65 69  qlite3ExprSetHei
59a0: 67 68 74 28 45 78 70 72 20 2a 70 29 7b 0a 20 20  ght(Expr *p){.  
59b0: 69 6e 74 20 6e 48 65 69 67 68 74 20 3d 20 30 3b  int nHeight = 0;
59c0: 0a 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 28  .  heightOfExpr(
59d0: 70 2d 3e 70 4c 65 66 74 2c 20 26 6e 48 65 69 67  p->pLeft, &nHeig
59e0: 68 74 29 3b 0a 20 20 68 65 69 67 68 74 4f 66 45  ht);.  heightOfE
59f0: 78 70 72 28 70 2d 3e 70 52 69 67 68 74 2c 20 26  xpr(p->pRight, &
5a00: 6e 48 65 69 67 68 74 29 3b 0a 20 20 68 65 69 67  nHeight);.  heig
5a10: 68 74 4f 66 45 78 70 72 4c 69 73 74 28 70 2d 3e  htOfExprList(p->
5a20: 70 4c 69 73 74 2c 20 26 6e 48 65 69 67 68 74 29  pList, &nHeight)
5a30: 3b 0a 20 20 68 65 69 67 68 74 4f 66 53 65 6c 65  ;.  heightOfSele
5a40: 63 74 28 70 2d 3e 70 53 65 6c 65 63 74 2c 20 26  ct(p->pSelect, &
5a50: 6e 48 65 69 67 68 74 29 3b 0a 20 20 70 2d 3e 6e  nHeight);.  p->n
5a60: 48 65 69 67 68 74 20 3d 20 6e 48 65 69 67 68 74  Height = nHeight
5a70: 20 2b 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52   + 1;.}../*.** R
5a80: 65 74 75 72 6e 20 74 68 65 20 6d 61 78 69 6d 75  eturn the maximu
5a90: 6d 20 68 65 69 67 68 74 20 6f 66 20 61 6e 79 20  m height of any 
5aa0: 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20  expression tree 
5ab0: 72 65 66 65 72 65 6e 63 65 64 0a 2a 2a 20 62 79  referenced.** by
5ac0: 20 74 68 65 20 73 65 6c 65 63 74 20 73 74 61 74   the select stat
5ad0: 65 6d 65 6e 74 20 70 61 73 73 65 64 20 61 73 20  ement passed as 
5ae0: 61 6e 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  an argument..*/.
5af0: 69 6e 74 20 73 71 6c 69 74 65 33 53 65 6c 65 63  int sqlite3Selec
5b00: 74 45 78 70 72 48 65 69 67 68 74 28 53 65 6c 65  tExprHeight(Sele
5b10: 63 74 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 48  ct *p){.  int nH
5b20: 65 69 67 68 74 20 3d 20 30 3b 0a 20 20 68 65 69  eight = 0;.  hei
5b30: 67 68 74 4f 66 53 65 6c 65 63 74 28 70 2c 20 26  ghtOfSelect(p, &
5b40: 6e 48 65 69 67 68 74 29 3b 0a 20 20 72 65 74 75  nHeight);.  retu
5b50: 72 6e 20 6e 48 65 69 67 68 74 3b 0a 7d 0a 23 65  rn nHeight;.}.#e
5b60: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65  ndif../*.** Dele
5b70: 74 65 20 61 6e 20 65 6e 74 69 72 65 20 65 78 70  te an entire exp
5b80: 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2f  ression list..*/
5b90: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
5ba0: 72 4c 69 73 74 44 65 6c 65 74 65 28 45 78 70 72  rListDelete(Expr
5bb0: 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20  List *pList){.  
5bc0: 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
5bd0: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
5be0: 49 74 65 6d 3b 0a 20 20 69 66 28 20 70 4c 69 73  Item;.  if( pLis
5bf0: 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  t==0 ) return;. 
5c00: 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e   assert( pList->
5c10: 61 21 3d 30 20 7c 7c 20 28 70 4c 69 73 74 2d 3e  a!=0 || (pList->
5c20: 6e 45 78 70 72 3d 3d 30 20 26 26 20 70 4c 69 73  nExpr==0 && pLis
5c30: 74 2d 3e 6e 41 6c 6c 6f 63 3d 3d 30 29 20 29 3b  t->nAlloc==0) );
5c40: 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74  .  assert( pList
5c50: 2d 3e 6e 45 78 70 72 3c 3d 70 4c 69 73 74 2d 3e  ->nExpr<=pList->
5c60: 6e 41 6c 6c 6f 63 20 29 3b 0a 20 20 66 6f 72 28  nAlloc );.  for(
5c70: 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20  pItem=pList->a, 
5c80: 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45  i=0; i<pList->nE
5c90: 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b  xpr; i++, pItem+
5ca0: 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  +){.    sqlite3E
5cb0: 78 70 72 44 65 6c 65 74 65 28 70 49 74 65 6d 2d  xprDelete(pItem-
5cc0: 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 73 71 6c  >pExpr);.    sql
5cd0: 69 74 65 33 5f 66 72 65 65 28 70 49 74 65 6d 2d  ite3_free(pItem-
5ce0: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 73  >zName);.  }.  s
5cf0: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4c 69 73  qlite3_free(pLis
5d00: 74 2d 3e 61 29 3b 0a 20 20 73 71 6c 69 74 65 33  t->a);.  sqlite3
5d10: 5f 66 72 65 65 28 70 4c 69 73 74 29 3b 0a 7d 0a  _free(pList);.}.
5d20: 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65  ./*.** Walk an e
5d30: 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20  xpression tree. 
5d40: 20 43 61 6c 6c 20 78 46 75 6e 63 20 66 6f 72 20   Call xFunc for 
5d50: 65 61 63 68 20 6e 6f 64 65 20 76 69 73 69 74 65  each node visite
5d60: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74  d..**.** The ret
5d70: 75 72 6e 20 76 61 6c 75 65 20 66 72 6f 6d 20 78  urn value from x
5d80: 46 75 6e 63 20 64 65 74 65 72 6d 69 6e 65 73 20  Func determines 
5d90: 77 68 65 74 68 65 72 20 74 68 65 20 74 72 65 65  whether the tree
5da0: 20 77 61 6c 6b 20 63 6f 6e 74 69 6e 75 65 73 2e   walk continues.
5db0: 0a 2a 2a 20 30 20 6d 65 61 6e 73 20 63 6f 6e 74  .** 0 means cont
5dc0: 69 6e 75 65 20 77 61 6c 6b 69 6e 67 20 74 68 65  inue walking the
5dd0: 20 74 72 65 65 2e 20 20 31 20 6d 65 61 6e 73 20   tree.  1 means 
5de0: 64 6f 20 6e 6f 74 20 77 61 6c 6b 20 63 68 69 6c  do not walk chil
5df0: 64 72 65 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 63  dren.** of the c
5e00: 75 72 72 65 6e 74 20 6e 6f 64 65 20 62 75 74 20  urrent node but 
5e10: 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 73 69  continue with si
5e20: 62 6c 69 6e 67 73 2e 20 20 32 20 6d 65 61 6e 73  blings.  2 means
5e30: 20 61 62 61 6e 64 6f 6e 0a 2a 2a 20 74 68 65 20   abandon.** the 
5e40: 74 72 65 65 20 77 61 6c 6b 20 63 6f 6d 70 6c 65  tree walk comple
5e50: 74 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tely..**.** The 
5e60: 72 65 74 75 72 6e 20 76 61 6c 75 65 20 66 72 6f  return value fro
5e70: 6d 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  m this routine i
5e80: 73 20 31 20 74 6f 20 61 62 61 6e 64 6f 6e 20 74  s 1 to abandon t
5e90: 68 65 20 74 72 65 65 20 77 61 6c 6b 0a 2a 2a 20  he tree walk.** 
5ea0: 61 6e 64 20 30 20 74 6f 20 63 6f 6e 74 69 6e 75  and 0 to continu
5eb0: 65 2e 0a 2a 2a 0a 2a 2a 20 4e 4f 54 49 43 45 3a  e..**.** NOTICE:
5ec0: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64    This routine d
5ed0: 6f 65 73 20 2a 6e 6f 74 2a 20 64 65 73 63 65 6e  oes *not* descen
5ee0: 64 20 69 6e 74 6f 20 73 75 62 71 75 65 72 69 65  d into subquerie
5ef0: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
5f00: 20 77 61 6c 6b 45 78 70 72 4c 69 73 74 28 45 78   walkExprList(Ex
5f10: 70 72 4c 69 73 74 20 2a 2c 20 69 6e 74 20 28 2a  prList *, int (*
5f20: 29 28 76 6f 69 64 20 2a 2c 20 45 78 70 72 2a 29  )(void *, Expr*)
5f30: 2c 20 76 6f 69 64 20 2a 29 3b 0a 73 74 61 74 69  , void *);.stati
5f40: 63 20 69 6e 74 20 77 61 6c 6b 45 78 70 72 54 72  c int walkExprTr
5f50: 65 65 28 45 78 70 72 20 2a 70 45 78 70 72 2c 20  ee(Expr *pExpr, 
5f60: 69 6e 74 20 28 2a 78 46 75 6e 63 29 28 76 6f 69  int (*xFunc)(voi
5f70: 64 2a 2c 45 78 70 72 2a 29 2c 20 76 6f 69 64 20  d*,Expr*), void 
5f80: 2a 70 41 72 67 29 7b 0a 20 20 69 6e 74 20 72 63  *pArg){.  int rc
5f90: 3b 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30  ;.  if( pExpr==0
5fa0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72   ) return 0;.  r
5fb0: 63 20 3d 20 28 2a 78 46 75 6e 63 29 28 70 41 72  c = (*xFunc)(pAr
5fc0: 67 2c 20 70 45 78 70 72 29 3b 0a 20 20 69 66 28  g, pExpr);.  if(
5fd0: 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66   rc==0 ){.    if
5fe0: 28 20 77 61 6c 6b 45 78 70 72 54 72 65 65 28 70  ( walkExprTree(p
5ff0: 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 78 46 75  Expr->pLeft, xFu
6000: 6e 63 2c 20 70 41 72 67 29 20 29 20 72 65 74 75  nc, pArg) ) retu
6010: 72 6e 20 31 3b 0a 20 20 20 20 69 66 28 20 77 61  rn 1;.    if( wa
6020: 6c 6b 45 78 70 72 54 72 65 65 28 70 45 78 70 72  lkExprTree(pExpr
6030: 2d 3e 70 52 69 67 68 74 2c 20 78 46 75 6e 63 2c  ->pRight, xFunc,
6040: 20 70 41 72 67 29 20 29 20 72 65 74 75 72 6e 20   pArg) ) return 
6050: 31 3b 0a 20 20 20 20 69 66 28 20 77 61 6c 6b 45  1;.    if( walkE
6060: 78 70 72 4c 69 73 74 28 70 45 78 70 72 2d 3e 70  xprList(pExpr->p
6070: 4c 69 73 74 2c 20 78 46 75 6e 63 2c 20 70 41 72  List, xFunc, pAr
6080: 67 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  g) ) return 1;. 
6090: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3e 31   }.  return rc>1
60a0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20  ;.}../*.** Call 
60b0: 77 61 6c 6b 45 78 70 72 54 72 65 65 28 29 20 66  walkExprTree() f
60c0: 6f 72 20 65 76 65 72 79 20 65 78 70 72 65 73 73  or every express
60d0: 69 6f 6e 20 69 6e 20 6c 69 73 74 20 70 2e 0a 2a  ion in list p..*
60e0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 61 6c  /.static int wal
60f0: 6b 45 78 70 72 4c 69 73 74 28 45 78 70 72 4c 69  kExprList(ExprLi
6100: 73 74 20 2a 70 2c 20 69 6e 74 20 28 2a 78 46 75  st *p, int (*xFu
6110: 6e 63 29 28 76 6f 69 64 20 2a 2c 20 45 78 70 72  nc)(void *, Expr
6120: 2a 29 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 7b  *), void *pArg){
6130: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75  .  int i;.  stru
6140: 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
6150: 20 2a 70 49 74 65 6d 3b 0a 20 20 69 66 28 20 21   *pItem;.  if( !
6160: 70 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  p ) return 0;.  
6170: 66 6f 72 28 69 3d 70 2d 3e 6e 45 78 70 72 2c 20  for(i=p->nExpr, 
6180: 70 49 74 65 6d 3d 70 2d 3e 61 3b 20 69 3e 30 3b  pItem=p->a; i>0;
6190: 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i--, pItem++){.
61a0: 20 20 20 20 69 66 28 20 77 61 6c 6b 45 78 70 72      if( walkExpr
61b0: 54 72 65 65 28 70 49 74 65 6d 2d 3e 70 45 78 70  Tree(pItem->pExp
61c0: 72 2c 20 78 46 75 6e 63 2c 20 70 41 72 67 29 20  r, xFunc, pArg) 
61d0: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a  ) return 1;.  }.
61e0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
61f0: 2a 0a 2a 2a 20 43 61 6c 6c 20 77 61 6c 6b 45 78  *.** Call walkEx
6200: 70 72 54 72 65 65 28 29 20 66 6f 72 20 65 76 65  prTree() for eve
6210: 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e  ry expression in
6220: 20 53 65 6c 65 63 74 20 70 2c 20 6e 6f 74 20 69   Select p, not i
6230: 6e 63 6c 75 64 69 6e 67 0a 2a 2a 20 65 78 70 72  ncluding.** expr
6240: 65 73 73 69 6f 6e 73 20 74 68 61 74 20 61 72 65  essions that are
6250: 20 70 61 72 74 20 6f 66 20 73 75 62 2d 73 65 6c   part of sub-sel
6260: 65 63 74 73 20 69 6e 20 61 6e 79 20 46 52 4f 4d  ects in any FROM
6270: 20 63 6c 61 75 73 65 20 6f 72 20 74 68 65 20 4c   clause or the L
6280: 49 4d 49 54 0a 2a 2a 20 6f 72 20 4f 46 46 53 45  IMIT.** or OFFSE
6290: 54 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 2e 0a  T expressions...
62a0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 61  */.static int wa
62b0: 6c 6b 53 65 6c 65 63 74 45 78 70 72 28 53 65 6c  lkSelectExpr(Sel
62c0: 65 63 74 20 2a 70 2c 20 69 6e 74 20 28 2a 78 46  ect *p, int (*xF
62d0: 75 6e 63 29 28 76 6f 69 64 20 2a 2c 20 45 78 70  unc)(void *, Exp
62e0: 72 2a 29 2c 20 76 6f 69 64 20 2a 70 41 72 67 29  r*), void *pArg)
62f0: 7b 0a 20 20 77 61 6c 6b 45 78 70 72 4c 69 73 74  {.  walkExprList
6300: 28 70 2d 3e 70 45 4c 69 73 74 2c 20 78 46 75 6e  (p->pEList, xFun
6310: 63 2c 20 70 41 72 67 29 3b 0a 20 20 77 61 6c 6b  c, pArg);.  walk
6320: 45 78 70 72 54 72 65 65 28 70 2d 3e 70 57 68 65  ExprTree(p->pWhe
6330: 72 65 2c 20 78 46 75 6e 63 2c 20 70 41 72 67 29  re, xFunc, pArg)
6340: 3b 0a 20 20 77 61 6c 6b 45 78 70 72 4c 69 73 74  ;.  walkExprList
6350: 28 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 78 46  (p->pGroupBy, xF
6360: 75 6e 63 2c 20 70 41 72 67 29 3b 0a 20 20 77 61  unc, pArg);.  wa
6370: 6c 6b 45 78 70 72 54 72 65 65 28 70 2d 3e 70 48  lkExprTree(p->pH
6380: 61 76 69 6e 67 2c 20 78 46 75 6e 63 2c 20 70 41  aving, xFunc, pA
6390: 72 67 29 3b 0a 20 20 77 61 6c 6b 45 78 70 72 4c  rg);.  walkExprL
63a0: 69 73 74 28 70 2d 3e 70 4f 72 64 65 72 42 79 2c  ist(p->pOrderBy,
63b0: 20 78 46 75 6e 63 2c 20 70 41 72 67 29 3b 0a 20   xFunc, pArg);. 
63c0: 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29   if( p->pPrior )
63d0: 7b 0a 20 20 20 20 77 61 6c 6b 53 65 6c 65 63 74  {.    walkSelect
63e0: 45 78 70 72 28 70 2d 3e 70 50 72 69 6f 72 2c 20  Expr(p->pPrior, 
63f0: 78 46 75 6e 63 2c 20 70 41 72 67 29 3b 0a 20 20  xFunc, pArg);.  
6400: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
6410: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
6420: 74 69 6e 65 20 69 73 20 64 65 73 69 67 6e 65 64  tine is designed
6430: 20 61 73 20 61 6e 20 78 46 75 6e 63 20 66 6f 72   as an xFunc for
6440: 20 77 61 6c 6b 45 78 70 72 54 72 65 65 28 29 2e   walkExprTree().
6450: 0a 2a 2a 0a 2a 2a 20 70 41 72 67 20 69 73 20 72  .**.** pArg is r
6460: 65 61 6c 6c 79 20 61 20 70 6f 69 6e 74 65 72 20  eally a pointer 
6470: 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 2e 20 20  to an integer.  
6480: 49 66 20 77 65 20 63 61 6e 20 74 65 6c 6c 20 62  If we can tell b
6490: 79 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20 61 74 20  y looking.** at 
64a0: 70 45 78 70 72 20 74 68 61 74 20 74 68 65 20 65  pExpr that the e
64b0: 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 63  xpression that c
64c0: 6f 6e 74 61 69 6e 73 20 70 45 78 70 72 20 69 73  ontains pExpr is
64d0: 20 6e 6f 74 20 61 20 63 6f 6e 73 74 61 6e 74 0a   not a constant.
64e0: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74  ** expression, t
64f0: 68 65 6e 20 73 65 74 20 2a 70 41 72 67 20 74 6f  hen set *pArg to
6500: 20 30 20 61 6e 64 20 72 65 74 75 72 6e 20 32 20   0 and return 2 
6510: 74 6f 20 61 62 61 6e 64 6f 6e 20 74 68 65 20 74  to abandon the t
6520: 72 65 65 20 77 61 6c 6b 2e 0a 2a 2a 20 49 66 20  ree walk..** If 
6530: 70 45 78 70 72 20 64 6f 65 73 20 64 6f 65 73 20  pExpr does does 
6540: 6e 6f 74 20 64 69 73 71 75 61 6c 69 66 79 20 74  not disqualify t
6550: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 66 72  he expression fr
6560: 6f 6d 20 62 65 69 6e 67 20 61 20 63 6f 6e 73 74  om being a const
6570: 61 6e 74 0a 2a 2a 20 74 68 65 6e 20 64 6f 20 6e  ant.** then do n
6580: 6f 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41 66  othing..**.** Af
6590: 74 65 72 20 77 61 6c 6b 69 6e 67 20 74 68 65 20  ter walking the 
65a0: 77 68 6f 6c 65 20 74 72 65 65 2c 20 69 66 20 6e  whole tree, if n
65b0: 6f 20 6e 6f 64 65 73 20 61 72 65 20 66 6f 75 6e  o nodes are foun
65c0: 64 20 74 68 61 74 20 64 69 73 71 75 61 6c 69 66  d that disqualif
65d0: 79 0a 2a 2a 20 74 68 65 20 65 78 70 72 65 73 73  y.** the express
65e0: 69 6f 6e 20 61 73 20 63 6f 6e 73 74 61 6e 74 2c  ion as constant,
65f0: 20 74 68 65 6e 20 77 65 20 61 73 73 75 6d 65 20   then we assume 
6600: 74 68 65 20 77 68 6f 6c 65 20 65 78 70 72 65 73  the whole expres
6610: 73 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6e 73 74  sion.** is const
6620: 61 6e 74 2e 20 20 53 65 65 20 73 71 6c 69 74 65  ant.  See sqlite
6630: 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28  3ExprIsConstant(
6640: 29 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c  ) for additional
6650: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f   information..*/
6660: 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72  .static int expr
6670: 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 28 76  NodeIsConstant(v
6680: 6f 69 64 20 2a 70 41 72 67 2c 20 45 78 70 72 20  oid *pArg, Expr 
6690: 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74 20 2a  *pExpr){.  int *
66a0: 70 4e 20 3d 20 28 69 6e 74 2a 29 70 41 72 67 3b  pN = (int*)pArg;
66b0: 0a 0a 20 20 2f 2a 20 49 66 20 2a 70 41 72 67 20  ..  /* If *pArg 
66c0: 69 73 20 33 20 74 68 65 6e 20 61 6e 79 20 74 65  is 3 then any te
66d0: 72 6d 20 6f 66 20 74 68 65 20 65 78 70 72 65 73  rm of the expres
66e0: 73 69 6f 6e 20 74 68 61 74 20 63 6f 6d 65 73 20  sion that comes 
66f0: 66 72 6f 6d 0a 20 20 2a 2a 20 74 68 65 20 4f 4e  from.  ** the ON
6700: 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65   or USING clause
6710: 73 20 6f 66 20 61 20 6a 6f 69 6e 20 64 69 73 71  s of a join disq
6720: 75 61 6c 69 66 69 65 73 20 74 68 65 20 65 78 70  ualifies the exp
6730: 72 65 73 73 69 6f 6e 0a 20 20 2a 2a 20 66 72 6f  ression.  ** fro
6740: 6d 20 62 65 69 6e 67 20 63 6f 6e 73 69 64 65 72  m being consider
6750: 65 64 20 63 6f 6e 73 74 61 6e 74 2e 20 2a 2f 0a  ed constant. */.
6760: 20 20 69 66 28 20 28 2a 70 4e 29 3d 3d 33 20 26    if( (*pN)==3 &
6770: 26 20 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70  & ExprHasAnyProp
6780: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46  erty(pExpr, EP_F
6790: 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20  romJoin) ){.    
67a0: 2a 70 4e 20 3d 20 30 3b 0a 20 20 20 20 72 65 74  *pN = 0;.    ret
67b0: 75 72 6e 20 32 3b 0a 20 20 7d 0a 0a 20 20 73 77  urn 2;.  }..  sw
67c0: 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20  itch( pExpr->op 
67d0: 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 6e 73 69 64  ){.    /* Consid
67e0: 65 72 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20  er functions to 
67f0: 62 65 20 63 6f 6e 73 74 61 6e 74 20 69 66 20 61  be constant if a
6800: 6c 6c 20 74 68 65 69 72 20 61 72 67 75 6d 65 6e  ll their argumen
6810: 74 73 20 61 72 65 20 63 6f 6e 73 74 61 6e 74 0a  ts are constant.
6820: 20 20 20 20 2a 2a 20 61 6e 64 20 2a 70 41 72 67      ** and *pArg
6830: 3d 3d 32 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  ==2 */.    case 
6840: 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20  TK_FUNCTION:.   
6850: 20 20 20 69 66 28 20 28 2a 70 4e 29 3d 3d 32 20     if( (*pN)==2 
6860: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
6870: 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67    /* Fall throug
6880: 68 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b  h */.    case TK
6890: 5f 49 44 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _ID:.    case TK
68a0: 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73  _COLUMN:.    cas
68b0: 65 20 54 4b 5f 44 4f 54 3a 0a 20 20 20 20 63 61  e TK_DOT:.    ca
68c0: 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49  se TK_AGG_FUNCTI
68d0: 4f 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ON:.    case TK_
68e0: 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 23 69 66 6e  AGG_COLUMN:.#ifn
68f0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
6900: 53 55 42 51 55 45 52 59 0a 20 20 20 20 63 61 73  SUBQUERY.    cas
6910: 65 20 54 4b 5f 53 45 4c 45 43 54 3a 0a 20 20 20  e TK_SELECT:.   
6920: 20 63 61 73 65 20 54 4b 5f 45 58 49 53 54 53 3a   case TK_EXISTS:
6930: 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 2a 70  .#endif.      *p
6940: 4e 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74  N = 0;.      ret
6950: 75 72 6e 20 32 3b 0a 20 20 20 20 63 61 73 65 20  urn 2;.    case 
6960: 54 4b 5f 49 4e 3a 0a 20 20 20 20 20 20 69 66 28  TK_IN:.      if(
6970: 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 20   pExpr->pSelect 
6980: 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 4e 20 3d  ){.        *pN =
6990: 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75   0;.        retu
69a0: 72 6e 20 32 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 2;.      }.  
69b0: 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20    default:.     
69c0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 7d   return 0;.  }.}
69d0: 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20  ../*.** Walk an 
69e0: 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e  expression tree.
69f0: 20 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68    Return 1 if th
6a00: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
6a10: 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 61 6e 64 20  constant.** and 
6a20: 30 20 69 66 20 69 74 20 69 6e 76 6f 6c 76 65 73  0 if it involves
6a30: 20 76 61 72 69 61 62 6c 65 73 20 6f 72 20 66 75   variables or fu
6a40: 6e 63 74 69 6f 6e 20 63 61 6c 6c 73 2e 0a 2a 2a  nction calls..**
6a50: 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70  .** For the purp
6a60: 6f 73 65 73 20 6f 66 20 74 68 69 73 20 66 75 6e  oses of this fun
6a70: 63 74 69 6f 6e 2c 20 61 20 64 6f 75 62 6c 65 2d  ction, a double-
6a80: 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65  quoted string (e
6a90: 78 3a 20 22 61 62 63 22 29 0a 2a 2a 20 69 73 20  x: "abc").** is 
6aa0: 63 6f 6e 73 69 64 65 72 65 64 20 61 20 76 61 72  considered a var
6ab0: 69 61 62 6c 65 20 62 75 74 20 61 20 73 69 6e 67  iable but a sing
6ac0: 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67  le-quoted string
6ad0: 20 28 65 78 3a 20 27 61 62 63 27 29 20 69 73 0a   (ex: 'abc') is.
6ae0: 2a 2a 20 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a  ** a constant..*
6af0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
6b00: 72 49 73 43 6f 6e 73 74 61 6e 74 28 45 78 70 72  rIsConstant(Expr
6b10: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 73 43 6f   *p){.  int isCo
6b20: 6e 73 74 20 3d 20 31 3b 0a 20 20 77 61 6c 6b 45  nst = 1;.  walkE
6b30: 78 70 72 54 72 65 65 28 70 2c 20 65 78 70 72 4e  xprTree(p, exprN
6b40: 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 2c 20 26  odeIsConstant, &
6b50: 69 73 43 6f 6e 73 74 29 3b 0a 20 20 72 65 74 75  isConst);.  retu
6b60: 72 6e 20 69 73 43 6f 6e 73 74 3b 0a 7d 0a 0a 2f  rn isConst;.}../
6b70: 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70  *.** Walk an exp
6b80: 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52  ression tree.  R
6b90: 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 65  eturn 1 if the e
6ba0: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e  xpression is con
6bb0: 73 74 61 6e 74 0a 2a 2a 20 74 68 61 74 20 64 6f  stant.** that do
6bc0: 65 73 20 6e 6f 20 6f 72 69 67 69 6e 61 74 65 20  es no originate 
6bd0: 66 72 6f 6d 20 74 68 65 20 4f 4e 20 6f 72 20 55  from the ON or U
6be0: 53 49 4e 47 20 63 6c 61 75 73 65 73 20 6f 66 20  SING clauses of 
6bf0: 61 20 6a 6f 69 6e 2e 0a 2a 2a 20 52 65 74 75 72  a join..** Retur
6c00: 6e 20 30 20 69 66 20 69 74 20 69 6e 76 6f 6c 76  n 0 if it involv
6c10: 65 73 20 76 61 72 69 61 62 6c 65 73 20 6f 72 20  es variables or 
6c20: 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 73 20 6f  function calls o
6c30: 72 20 74 65 72 6d 73 20 66 72 6f 6d 0a 2a 2a 20  r terms from.** 
6c40: 61 6e 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63  an ON or USING c
6c50: 6c 61 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  lause..*/.int sq
6c60: 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
6c70: 61 6e 74 4e 6f 74 4a 6f 69 6e 28 45 78 70 72 20  antNotJoin(Expr 
6c80: 2a 70 29 7b 0a 20 20 69 6e 74 20 69 73 43 6f 6e  *p){.  int isCon
6c90: 73 74 20 3d 20 33 3b 0a 20 20 77 61 6c 6b 45 78  st = 3;.  walkEx
6ca0: 70 72 54 72 65 65 28 70 2c 20 65 78 70 72 4e 6f  prTree(p, exprNo
6cb0: 64 65 49 73 43 6f 6e 73 74 61 6e 74 2c 20 26 69  deIsConstant, &i
6cc0: 73 43 6f 6e 73 74 29 3b 0a 20 20 72 65 74 75 72  sConst);.  retur
6cd0: 6e 20 69 73 43 6f 6e 73 74 21 3d 30 3b 0a 7d 0a  n isConst!=0;.}.
6ce0: 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65  ./*.** Walk an e
6cf0: 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20  xpression tree. 
6d00: 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65   Return 1 if the
6d10: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63   expression is c
6d20: 6f 6e 73 74 61 6e 74 0a 2a 2a 20 6f 72 20 61 20  onstant.** or a 
6d30: 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 77 69  function call wi
6d40: 74 68 20 63 6f 6e 73 74 61 6e 74 20 61 72 67 75  th constant argu
6d50: 6d 65 6e 74 73 2e 20 20 52 65 74 75 72 6e 20 61  ments.  Return a
6d60: 6e 64 20 30 20 69 66 20 74 68 65 72 65 0a 2a 2a  nd 0 if there.**
6d70: 20 61 72 65 20 61 6e 79 20 76 61 72 69 61 62 6c   are any variabl
6d80: 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68  es..**.** For th
6d90: 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68  e purposes of th
6da0: 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20 64  is function, a d
6db0: 6f 75 62 6c 65 2d 71 75 6f 74 65 64 20 73 74 72  ouble-quoted str
6dc0: 69 6e 67 20 28 65 78 3a 20 22 61 62 63 22 29 0a  ing (ex: "abc").
6dd0: 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64  ** is considered
6de0: 20 61 20 76 61 72 69 61 62 6c 65 20 62 75 74 20   a variable but 
6df0: 61 20 73 69 6e 67 6c 65 2d 71 75 6f 74 65 64 20  a single-quoted 
6e00: 73 74 72 69 6e 67 20 28 65 78 3a 20 27 61 62 63  string (ex: 'abc
6e10: 27 29 20 69 73 0a 2a 2a 20 61 20 63 6f 6e 73 74  ') is.** a const
6e20: 61 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ant..*/.int sqli
6e30: 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
6e40: 74 4f 72 46 75 6e 63 74 69 6f 6e 28 45 78 70 72  tOrFunction(Expr
6e50: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 73 43 6f   *p){.  int isCo
6e60: 6e 73 74 20 3d 20 32 3b 0a 20 20 77 61 6c 6b 45  nst = 2;.  walkE
6e70: 78 70 72 54 72 65 65 28 70 2c 20 65 78 70 72 4e  xprTree(p, exprN
6e80: 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 2c 20 26  odeIsConstant, &
6e90: 69 73 43 6f 6e 73 74 29 3b 0a 20 20 72 65 74 75  isConst);.  retu
6ea0: 72 6e 20 69 73 43 6f 6e 73 74 21 3d 30 3b 0a 7d  rn isConst!=0;.}
6eb0: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65  ../*.** If the e
6ec0: 78 70 72 65 73 73 69 6f 6e 20 70 20 63 6f 64 65  xpression p code
6ed0: 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 69 6e 74  s a constant int
6ee0: 65 67 65 72 20 74 68 61 74 20 69 73 20 73 6d 61  eger that is sma
6ef0: 6c 6c 20 65 6e 6f 75 67 68 0a 2a 2a 20 74 6f 20  ll enough.** to 
6f00: 66 69 74 20 69 6e 20 61 20 33 32 2d 62 69 74 20  fit in a 32-bit 
6f10: 69 6e 74 65 67 65 72 2c 20 72 65 74 75 72 6e 20  integer, return 
6f20: 31 20 61 6e 64 20 70 75 74 20 74 68 65 20 76 61  1 and put the va
6f30: 6c 75 65 20 6f 66 20 74 68 65 20 69 6e 74 65 67  lue of the integ
6f40: 65 72 0a 2a 2a 20 69 6e 20 2a 70 56 61 6c 75 65  er.** in *pValue
6f50: 2e 20 20 49 66 20 74 68 65 20 65 78 70 72 65 73  .  If the expres
6f60: 73 69 6f 6e 20 69 73 20 6e 6f 74 20 61 6e 20 69  sion is not an i
6f70: 6e 74 65 67 65 72 20 6f 72 20 69 66 20 69 74 20  nteger or if it 
6f80: 69 73 20 74 6f 6f 20 62 69 67 0a 2a 2a 20 74 6f  is too big.** to
6f90: 20 66 69 74 20 69 6e 20 61 20 73 69 67 6e 65 64   fit in a signed
6fa0: 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 2c   32-bit integer,
6fb0: 20 72 65 74 75 72 6e 20 30 20 61 6e 64 20 6c 65   return 0 and le
6fc0: 61 76 65 20 2a 70 56 61 6c 75 65 20 75 6e 63 68  ave *pValue unch
6fd0: 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  anged..*/.int sq
6fe0: 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67  lite3ExprIsInteg
6ff0: 65 72 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20  er(Expr *p, int 
7000: 2a 70 56 61 6c 75 65 29 7b 0a 20 20 73 77 69 74  *pValue){.  swit
7010: 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20  ch( p->op ){.   
7020: 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52   case TK_INTEGER
7030: 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71  : {.      if( sq
7040: 6c 69 74 65 33 47 65 74 49 6e 74 33 32 28 28 63  lite3GetInt32((c
7050: 68 61 72 2a 29 70 2d 3e 74 6f 6b 65 6e 2e 7a 2c  har*)p->token.z,
7060: 20 70 56 61 6c 75 65 29 20 29 7b 0a 20 20 20 20   pValue) ){.    
7070: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
7080: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
7090: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
70a0: 65 20 54 4b 5f 55 50 4c 55 53 3a 20 7b 0a 20 20  e TK_UPLUS: {.  
70b0: 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
70c0: 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28  e3ExprIsInteger(
70d0: 70 2d 3e 70 4c 65 66 74 2c 20 70 56 61 6c 75 65  p->pLeft, pValue
70e0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  );.    }.    cas
70f0: 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20  e TK_UMINUS: {. 
7100: 20 20 20 20 20 69 6e 74 20 76 3b 0a 20 20 20 20       int v;.    
7110: 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
7120: 72 49 73 49 6e 74 65 67 65 72 28 70 2d 3e 70 4c  rIsInteger(p->pL
7130: 65 66 74 2c 20 26 76 29 20 29 7b 0a 20 20 20 20  eft, &v) ){.    
7140: 20 20 20 20 2a 70 56 61 6c 75 65 20 3d 20 2d 76      *pValue = -v
7150: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
7160: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
7170: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
7180: 20 20 20 64 65 66 61 75 6c 74 3a 20 62 72 65 61     default: brea
7190: 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  k;.  }.  return 
71a0: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  0;.}../*.** Retu
71b0: 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 67  rn TRUE if the g
71c0: 69 76 65 6e 20 73 74 72 69 6e 67 20 69 73 20 61  iven string is a
71d0: 20 72 6f 77 2d 69 64 20 63 6f 6c 75 6d 6e 20 6e   row-id column n
71e0: 61 6d 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ame..*/.int sqli
71f0: 74 65 33 49 73 52 6f 77 69 64 28 63 6f 6e 73 74  te3IsRowid(const
7200: 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 66 28   char *z){.  if(
7210: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
7220: 7a 2c 20 22 5f 52 4f 57 49 44 5f 22 29 3d 3d 30  z, "_ROWID_")==0
7230: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69   ) return 1;.  i
7240: 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
7250: 70 28 7a 2c 20 22 52 4f 57 49 44 22 29 3d 3d 30  p(z, "ROWID")==0
7260: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69   ) return 1;.  i
7270: 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
7280: 70 28 7a 2c 20 22 4f 49 44 22 29 3d 3d 30 20 29  p(z, "OID")==0 )
7290: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 72 65 74   return 1;.  ret
72a0: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
72b0: 47 69 76 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f  Given the name o
72c0: 66 20 61 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  f a column of th
72d0: 65 20 66 6f 72 6d 20 58 2e 59 2e 5a 20 6f 72 20  e form X.Y.Z or 
72e0: 59 2e 5a 20 6f 72 20 6a 75 73 74 20 5a 2c 20 6c  Y.Z or just Z, l
72f0: 6f 6f 6b 20 75 70 0a 2a 2a 20 74 68 61 74 20 6e  ook up.** that n
7300: 61 6d 65 20 69 6e 20 74 68 65 20 73 65 74 20 6f  ame in the set o
7310: 66 20 73 6f 75 72 63 65 20 74 61 62 6c 65 73 20  f source tables 
7320: 69 6e 20 70 53 72 63 4c 69 73 74 20 61 6e 64 20  in pSrcList and 
7330: 6d 61 6b 65 20 74 68 65 20 70 45 78 70 72 20 0a  make the pExpr .
7340: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f  ** expression no
7350: 64 65 20 72 65 66 65 72 20 62 61 63 6b 20 74 6f  de refer back to
7360: 20 74 68 61 74 20 73 6f 75 72 63 65 20 63 6f 6c   that source col
7370: 75 6d 6e 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77  umn.  The follow
7380: 69 6e 67 20 63 68 61 6e 67 65 73 0a 2a 2a 20 61  ing changes.** a
7390: 72 65 20 6d 61 64 65 20 74 6f 20 70 45 78 70 72  re made to pExpr
73a0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 70 45 78 70 72  :.**.**    pExpr
73b0: 2d 3e 69 44 62 20 20 20 20 20 20 20 20 20 20 20  ->iDb           
73c0: 53 65 74 20 74 68 65 20 69 6e 64 65 78 20 69 6e  Set the index in
73d0: 20 64 62 2d 3e 61 44 62 5b 5d 20 6f 66 20 74 68   db->aDb[] of th
73e0: 65 20 64 61 74 61 62 61 73 65 20 68 6f 6c 64 69  e database holdi
73f0: 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ng.**           
7400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68                th
7410: 65 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 70  e table..**    p
7420: 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 20 20 20  Expr->iTable    
7430: 20 20 20 20 53 65 74 20 74 6f 20 74 68 65 20 63      Set to the c
7440: 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72  ursor number for
7450: 20 74 68 65 20 74 61 62 6c 65 20 6f 62 74 61 69   the table obtai
7460: 6e 65 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ned.**          
7470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66                 f
7480: 72 6f 6d 20 70 53 72 63 4c 69 73 74 2e 0a 2a 2a  rom pSrcList..**
7490: 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75      pExpr->iColu
74a0: 6d 6e 20 20 20 20 20 20 20 53 65 74 20 74 6f 20  mn       Set to 
74b0: 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65  the column numbe
74c0: 72 20 77 69 74 68 69 6e 20 74 68 65 20 74 61 62  r within the tab
74d0: 6c 65 2e 0a 2a 2a 20 20 20 20 70 45 78 70 72 2d  le..**    pExpr-
74e0: 3e 6f 70 20 20 20 20 20 20 20 20 20 20 20 20 53  >op            S
74f0: 65 74 20 74 6f 20 54 4b 5f 43 4f 4c 55 4d 4e 2e  et to TK_COLUMN.
7500: 0a 2a 2a 20 20 20 20 70 45 78 70 72 2d 3e 70 4c  .**    pExpr->pL
7510: 65 66 74 20 20 20 20 20 20 20 20 20 41 6e 79 20  eft         Any 
7520: 65 78 70 72 65 73 73 69 6f 6e 20 74 68 69 73 20  expression this 
7530: 70 6f 69 6e 74 73 20 74 6f 20 69 73 20 64 65 6c  points to is del
7540: 65 74 65 64 0a 2a 2a 20 20 20 20 70 45 78 70 72  eted.**    pExpr
7550: 2d 3e 70 52 69 67 68 74 20 20 20 20 20 20 20 20  ->pRight        
7560: 41 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20 74  Any expression t
7570: 68 69 73 20 70 6f 69 6e 74 73 20 74 6f 20 69 73  his points to is
7580: 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20   deleted..**.** 
7590: 54 68 65 20 70 44 62 54 6f 6b 65 6e 20 69 73 20  The pDbToken is 
75a0: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
75b0: 64 61 74 61 62 61 73 65 20 28 74 68 65 20 22 58  database (the "X
75c0: 22 29 2e 20 20 54 68 69 73 20 76 61 6c 75 65 20  ").  This value 
75d0: 6d 61 79 20 62 65 0a 2a 2a 20 4e 55 4c 4c 20 6d  may be.** NULL m
75e0: 65 61 6e 69 6e 67 20 74 68 61 74 20 6e 61 6d 65  eaning that name
75f0: 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20   is of the form 
7600: 59 2e 5a 20 6f 72 20 5a 2e 20 20 41 6e 79 20 61  Y.Z or Z.  Any a
7610: 76 61 69 6c 61 62 6c 65 20 64 61 74 61 62 61 73  vailable databas
7620: 65 0a 2a 2a 20 63 61 6e 20 62 65 20 75 73 65 64  e.** can be used
7630: 2e 20 20 54 68 65 20 70 54 61 62 6c 65 54 6f 6b  .  The pTableTok
7640: 65 6e 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  en is the name o
7650: 66 20 74 68 65 20 74 61 62 6c 65 20 28 74 68 65  f the table (the
7660: 20 22 59 22 29 2e 20 20 54 68 69 73 0a 2a 2a 20   "Y").  This.** 
7670: 76 61 6c 75 65 20 63 61 6e 20 62 65 20 4e 55 4c  value can be NUL
7680: 4c 20 69 66 20 70 44 62 54 6f 6b 65 6e 20 69 73  L if pDbToken is
7690: 20 61 6c 73 6f 20 4e 55 4c 4c 2e 20 20 49 66 20   also NULL.  If 
76a0: 70 54 61 62 6c 65 54 6f 6b 65 6e 20 69 73 20 4e  pTableToken is N
76b0: 55 4c 4c 20 69 74 0a 2a 2a 20 6d 65 61 6e 73 20  ULL it.** means 
76c0: 74 68 61 74 20 74 68 65 20 66 6f 72 6d 20 6f 66  that the form of
76d0: 20 74 68 65 20 6e 61 6d 65 20 69 73 20 5a 20 61   the name is Z a
76e0: 6e 64 20 74 68 61 74 20 63 6f 6c 75 6d 6e 73 20  nd that columns 
76f0: 66 72 6f 6d 20 61 6e 79 20 74 61 62 6c 65 0a 2a  from any table.*
7700: 2a 20 63 61 6e 20 62 65 20 75 73 65 64 2e 0a 2a  * can be used..*
7710: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 61 6d 65  *.** If the name
7720: 20 63 61 6e 6e 6f 74 20 62 65 20 72 65 73 6f 6c   cannot be resol
7730: 76 65 64 20 75 6e 61 6d 62 69 67 75 6f 75 73 6c  ved unambiguousl
7740: 79 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f  y, leave an erro
7750: 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20 69 6e 20  r message.** in 
7760: 70 50 61 72 73 65 20 61 6e 64 20 72 65 74 75 72  pParse and retur
7770: 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 20 52 65 74  n non-zero.  Ret
7780: 75 72 6e 20 7a 65 72 6f 20 6f 6e 20 73 75 63 63  urn zero on succ
7790: 65 73 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ess..*/.static i
77a0: 6e 74 20 6c 6f 6f 6b 75 70 4e 61 6d 65 28 0a 20  nt lookupName(. 
77b0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
77c0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
77d0: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
77e0: 20 20 54 6f 6b 65 6e 20 2a 70 44 62 54 6f 6b 65    Token *pDbToke
77f0: 6e 2c 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f  n,     /* Name o
7800: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  f the database c
7810: 6f 6e 74 61 69 6e 69 6e 67 20 74 61 62 6c 65 2c  ontaining table,
7820: 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f   or NULL */.  To
7830: 6b 65 6e 20 2a 70 54 61 62 6c 65 54 6f 6b 65 6e  ken *pTableToken
7840: 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 61  ,  /* Name of ta
7850: 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 63  ble containing c
7860: 6f 6c 75 6d 6e 2c 20 6f 72 20 4e 55 4c 4c 20 2a  olumn, or NULL *
7870: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 43 6f 6c 75  /.  Token *pColu
7880: 6d 6e 54 6f 6b 65 6e 2c 20 2f 2a 20 4e 61 6d 65  mnToken, /* Name
7890: 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2e 20   of the column. 
78a0: 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74  */.  NameContext
78b0: 20 2a 70 4e 43 2c 20 20 20 20 2f 2a 20 54 68 65   *pNC,    /* The
78c0: 20 6e 61 6d 65 20 63 6f 6e 74 65 78 74 20 75 73   name context us
78d0: 65 64 20 74 6f 20 72 65 73 6f 6c 76 65 20 74 68  ed to resolve th
78e0: 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 45 78 70 72  e name */.  Expr
78f0: 20 2a 70 45 78 70 72 20 20 20 20 20 20 20 20 20   *pExpr         
7900: 20 2f 2a 20 4d 61 6b 65 20 74 68 69 73 20 45 58   /* Make this EX
7910: 50 52 20 6e 6f 64 65 20 70 6f 69 6e 74 20 74 6f  PR node point to
7920: 20 74 68 65 20 73 65 6c 65 63 74 65 64 20 63 6f   the selected co
7930: 6c 75 6d 6e 20 2a 2f 0a 29 7b 0a 20 20 63 68 61  lumn */.){.  cha
7940: 72 20 2a 7a 44 62 20 3d 20 30 3b 20 20 20 20 20  r *zDb = 0;     
7950: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
7960: 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 65 20   database.  The 
7970: 22 58 22 20 69 6e 20 58 2e 59 2e 5a 20 2a 2f 0a  "X" in X.Y.Z */.
7980: 20 20 63 68 61 72 20 2a 7a 54 61 62 20 3d 20 30    char *zTab = 0
7990: 3b 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f  ;      /* Name o
79a0: 66 20 74 68 65 20 74 61 62 6c 65 2e 20 20 54 68  f the table.  Th
79b0: 65 20 22 59 22 20 69 6e 20 58 2e 59 2e 5a 20 6f  e "Y" in X.Y.Z o
79c0: 72 20 59 2e 5a 20 2a 2f 0a 20 20 63 68 61 72 20  r Y.Z */.  char 
79d0: 2a 7a 43 6f 6c 20 3d 20 30 3b 20 20 20 20 20 20  *zCol = 0;      
79e0: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63  /* Name of the c
79f0: 6f 6c 75 6d 6e 2e 20 20 54 68 65 20 22 5a 22 20  olumn.  The "Z" 
7a00: 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20  */.  int i, j;  
7a10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
7a20: 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20  p counters */.  
7a30: 69 6e 74 20 63 6e 74 20 3d 20 30 3b 20 20 20 20  int cnt = 0;    
7a40: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
7a50: 66 20 6d 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d  f matching colum
7a60: 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 69 6e 74  n names */.  int
7a70: 20 63 6e 74 54 61 62 20 3d 20 30 3b 20 20 20 20   cntTab = 0;    
7a80: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6d    /* Number of m
7a90: 61 74 63 68 69 6e 67 20 74 61 62 6c 65 20 6e 61  atching table na
7aa0: 6d 65 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  mes */.  sqlite3
7ab0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
7ac0: 62 3b 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62  b;  /* The datab
7ad0: 61 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ase */.  struct 
7ae0: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
7af0: 74 65 6d 3b 20 20 20 20 20 20 20 2f 2a 20 55 73  tem;       /* Us
7b00: 65 20 66 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76  e for looping ov
7b10: 65 72 20 70 53 72 63 4c 69 73 74 20 69 74 65 6d  er pSrcList item
7b20: 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72  s */.  struct Sr
7b30: 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4d 61 74  cList_item *pMat
7b40: 63 68 20 3d 20 30 3b 20 20 2f 2a 20 54 68 65 20  ch = 0;  /* The 
7b50: 6d 61 74 63 68 69 6e 67 20 70 53 72 63 4c 69 73  matching pSrcLis
7b60: 74 20 69 74 65 6d 20 2a 2f 0a 20 20 4e 61 6d 65  t item */.  Name
7b70: 43 6f 6e 74 65 78 74 20 2a 70 54 6f 70 4e 43 20  Context *pTopNC 
7b80: 3d 20 70 4e 43 3b 20 20 20 20 20 20 20 20 2f 2a  = pNC;        /*
7b90: 20 46 69 72 73 74 20 6e 61 6d 65 63 6f 6e 74 65   First nameconte
7ba0: 78 74 20 69 6e 20 74 68 65 20 6c 69 73 74 20 2a  xt in the list *
7bb0: 2f 0a 20 20 53 63 68 65 6d 61 20 2a 70 53 63 68  /.  Schema *pSch
7bc0: 65 6d 61 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ema = 0;        
7bd0: 20 20 20 20 20 20 2f 2a 20 53 63 68 65 6d 61 20        /* Schema 
7be0: 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  of the expressio
7bf0: 6e 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  n */..  assert( 
7c00: 70 43 6f 6c 75 6d 6e 54 6f 6b 65 6e 20 26 26 20  pColumnToken && 
7c10: 70 43 6f 6c 75 6d 6e 54 6f 6b 65 6e 2d 3e 7a 20  pColumnToken->z 
7c20: 29 3b 20 2f 2a 20 54 68 65 20 5a 20 69 6e 20 58  ); /* The Z in X
7c30: 2e 59 2e 5a 20 63 61 6e 6e 6f 74 20 62 65 20 4e  .Y.Z cannot be N
7c40: 55 4c 4c 20 2a 2f 0a 20 20 7a 44 62 20 3d 20 73  ULL */.  zDb = s
7c50: 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
7c60: 6b 65 6e 28 64 62 2c 20 70 44 62 54 6f 6b 65 6e  ken(db, pDbToken
7c70: 29 3b 0a 20 20 7a 54 61 62 20 3d 20 73 71 6c 69  );.  zTab = sqli
7c80: 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
7c90: 28 64 62 2c 20 70 54 61 62 6c 65 54 6f 6b 65 6e  (db, pTableToken
7ca0: 29 3b 0a 20 20 7a 43 6f 6c 20 3d 20 73 71 6c 69  );.  zCol = sqli
7cb0: 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
7cc0: 28 64 62 2c 20 70 43 6f 6c 75 6d 6e 54 6f 6b 65  (db, pColumnToke
7cd0: 6e 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  n);.  if( db->ma
7ce0: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
7cf0: 20 20 67 6f 74 6f 20 6c 6f 6f 6b 75 70 6e 61 6d    goto lookupnam
7d00: 65 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 70 45  e_end;.  }..  pE
7d10: 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 2d 31  xpr->iTable = -1
7d20: 3b 0a 20 20 77 68 69 6c 65 28 20 70 4e 43 20 26  ;.  while( pNC &
7d30: 26 20 63 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20  & cnt==0 ){.    
7d40: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
7d50: 3b 0a 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70  ;.    SrcList *p
7d60: 53 72 63 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70  SrcList = pNC->p
7d70: 53 72 63 4c 69 73 74 3b 0a 0a 20 20 20 20 69 66  SrcList;..    if
7d80: 28 20 70 53 72 63 4c 69 73 74 20 29 7b 0a 20 20  ( pSrcList ){.  
7d90: 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 49 74      for(i=0, pIt
7da0: 65 6d 3d 70 53 72 63 4c 69 73 74 2d 3e 61 3b 20  em=pSrcList->a; 
7db0: 69 3c 70 53 72 63 4c 69 73 74 2d 3e 6e 53 72 63  i<pSrcList->nSrc
7dc0: 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i++, pItem++){
7dd0: 0a 20 20 20 20 20 20 20 20 54 61 62 6c 65 20 2a  .        Table *
7de0: 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 69 6e  pTab;.        in
7df0: 74 20 69 44 62 3b 0a 20 20 20 20 20 20 20 20 43  t iDb;.        C
7e00: 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 0a  olumn *pCol;.  .
7e10: 20 20 20 20 20 20 20 20 70 54 61 62 20 3d 20 70          pTab = p
7e20: 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20  Item->pTab;.    
7e30: 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62      assert( pTab
7e40: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69  !=0 );.        i
7e50: 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
7e60: 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54  maToIndex(db, pT
7e70: 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  ab->pSchema);.  
7e80: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
7e90: 61 62 2d 3e 6e 43 6f 6c 3e 30 20 29 3b 0a 20 20  ab->nCol>0 );.  
7ea0: 20 20 20 20 20 20 69 66 28 20 7a 54 61 62 20 29        if( zTab )
7eb0: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
7ec0: 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 29 7b  pItem->zAlias ){
7ed0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61  .            cha
7ee0: 72 20 2a 7a 54 61 62 4e 61 6d 65 20 3d 20 70 49  r *zTabName = pI
7ef0: 74 65 6d 2d 3e 7a 41 6c 69 61 73 3b 0a 20 20 20  tem->zAlias;.   
7f00: 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c           if( sql
7f10: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 54 61 62  ite3StrICmp(zTab
7f20: 4e 61 6d 65 2c 20 7a 54 61 62 29 21 3d 30 20 29  Name, zTab)!=0 )
7f30: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
7f40: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
7f50: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54          char *zT
7f60: 61 62 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e 7a  abName = pTab->z
7f70: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Name;.          
7f80: 20 20 69 66 28 20 7a 54 61 62 4e 61 6d 65 3d 3d    if( zTabName==
7f90: 30 20 7c 7c 20 73 71 6c 69 74 65 33 53 74 72 49  0 || sqlite3StrI
7fa0: 43 6d 70 28 7a 54 61 62 4e 61 6d 65 2c 20 7a 54  Cmp(zTabName, zT
7fb0: 61 62 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75  ab)!=0 ) continu
7fc0: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  e;.            i
7fd0: 66 28 20 7a 44 62 21 3d 30 20 26 26 20 73 71 6c  f( zDb!=0 && sql
7fe0: 69 74 65 33 53 74 72 49 43 6d 70 28 64 62 2d 3e  ite3StrICmp(db->
7ff0: 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20  aDb[iDb].zName, 
8000: 7a 44 62 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  zDb)!=0 ){.     
8010: 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
8020: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  e;.            }
8030: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
8040: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
8050: 66 28 20 30 3d 3d 28 63 6e 74 54 61 62 2b 2b 29  f( 0==(cntTab++)
8060: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 45   ){.          pE
8070: 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 49  xpr->iTable = pI
8080: 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20  tem->iCursor;.  
8090: 20 20 20 20 20 20 20 20 70 53 63 68 65 6d 61 20          pSchema 
80a0: 3d 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 3b  = pTab->pSchema;
80b0: 0a 20 20 20 20 20 20 20 20 20 20 70 4d 61 74 63  .          pMatc
80c0: 68 20 3d 20 70 49 74 65 6d 3b 0a 20 20 20 20 20  h = pItem;.     
80d0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 66 6f 72     }.        for
80e0: 28 6a 3d 30 2c 20 70 43 6f 6c 3d 70 54 61 62 2d  (j=0, pCol=pTab-
80f0: 3e 61 43 6f 6c 3b 20 6a 3c 70 54 61 62 2d 3e 6e  >aCol; j<pTab->n
8100: 43 6f 6c 3b 20 6a 2b 2b 2c 20 70 43 6f 6c 2b 2b  Col; j++, pCol++
8110: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
8120: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
8130: 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f  pCol->zName, zCo
8140: 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  l)==0 ){.       
8150: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
8160: 2a 7a 43 6f 6c 6c 20 3d 20 70 54 61 62 2d 3e 61  *zColl = pTab->a
8170: 43 6f 6c 5b 6a 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20  Col[j].zColl;.  
8180: 20 20 20 20 20 20 20 20 20 20 49 64 4c 69 73 74            IdList
8190: 20 2a 70 55 73 69 6e 67 3b 0a 20 20 20 20 20 20   *pUsing;.      
81a0: 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20        cnt++;.   
81b0: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
81c0: 69 54 61 62 6c 65 20 3d 20 70 49 74 65 6d 2d 3e  iTable = pItem->
81d0: 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 20  iCursor;.       
81e0: 20 20 20 20 20 70 4d 61 74 63 68 20 3d 20 70 49       pMatch = pI
81f0: 74 65 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  tem;.           
8200: 20 70 53 63 68 65 6d 61 20 3d 20 70 54 61 62 2d   pSchema = pTab-
8210: 3e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 20 20  >pSchema;.      
8220: 20 20 20 20 20 20 2f 2a 20 53 75 62 73 74 69 74        /* Substit
8230: 75 74 65 20 74 68 65 20 72 6f 77 69 64 20 28 63  ute the rowid (c
8240: 6f 6c 75 6d 6e 20 2d 31 29 20 66 6f 72 20 74 68  olumn -1) for th
8250: 65 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  e INTEGER PRIMAR
8260: 59 20 4b 45 59 20 2a 2f 0a 20 20 20 20 20 20 20  Y KEY */.       
8270: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c       pExpr->iCol
8280: 75 6d 6e 20 3d 20 6a 3d 3d 70 54 61 62 2d 3e 69  umn = j==pTab->i
8290: 50 4b 65 79 20 3f 20 2d 31 20 3a 20 6a 3b 0a 20  PKey ? -1 : j;. 
82a0: 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
82b0: 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 70 54 61  ->affinity = pTa
82c0: 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 61 66 66 69 6e  b->aCol[j].affin
82d0: 69 74 79 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ity;.           
82e0: 20 69 66 28 20 28 70 45 78 70 72 2d 3e 66 6c 61   if( (pExpr->fla
82f0: 67 73 20 26 20 45 50 5f 45 78 70 43 6f 6c 6c 61  gs & EP_ExpColla
8300: 74 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  te)==0 ){.      
8310: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70          pExpr->p
8320: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69  Coll = sqlite3Fi
8330: 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 45 4e  ndCollSeq(db, EN
8340: 43 28 64 62 29 2c 20 7a 43 6f 6c 6c 2c 2d 31 2c  C(db), zColl,-1,
8350: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
8360: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69   }.            i
8370: 66 28 20 69 3c 70 53 72 63 4c 69 73 74 2d 3e 6e  f( i<pSrcList->n
8380: 53 72 63 2d 31 20 29 7b 0a 20 20 20 20 20 20 20  Src-1 ){.       
8390: 20 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d         if( pItem
83a0: 5b 31 5d 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a  [1].jointype & J
83b0: 54 5f 4e 41 54 55 52 41 4c 20 29 7b 0a 20 20 20  T_NATURAL ){.   
83c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
83d0: 49 66 20 74 68 69 73 20 6d 61 74 63 68 20 6f 63  If this match oc
83e0: 63 75 72 72 65 64 20 69 6e 20 74 68 65 20 6c 65  curred in the le
83f0: 66 74 20 74 61 62 6c 65 20 6f 66 20 61 20 6e 61  ft table of a na
8400: 74 75 72 61 6c 20 6a 6f 69 6e 2c 0a 20 20 20 20  tural join,.    
8410: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74              ** t
8420: 68 65 6e 20 73 6b 69 70 20 74 68 65 20 72 69 67  hen skip the rig
8430: 68 74 20 74 61 62 6c 65 20 74 6f 20 61 76 6f 69  ht table to avoi
8440: 64 20 61 20 64 75 70 6c 69 63 61 74 65 20 6d 61  d a duplicate ma
8450: 74 63 68 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  tch */.         
8460: 20 20 20 20 20 20 20 70 49 74 65 6d 2b 2b 3b 0a         pItem++;.
8470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8480: 69 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  i++;.           
8490: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 55     }else if( (pU
84a0: 73 69 6e 67 20 3d 20 70 49 74 65 6d 5b 31 5d 2e  sing = pItem[1].
84b0: 70 55 73 69 6e 67 29 21 3d 30 20 29 7b 0a 20 20  pUsing)!=0 ){.  
84c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
84d0: 20 49 66 20 74 68 69 73 20 6d 61 74 63 68 20 6f   If this match o
84e0: 63 63 75 72 73 20 6f 6e 20 61 20 63 6f 6c 75 6d  ccurs on a colum
84f0: 6e 20 74 68 61 74 20 69 73 20 69 6e 20 74 68 65  n that is in the
8500: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 0a 20 20   USING clause.  
8510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
8520: 20 6f 66 20 61 20 6a 6f 69 6e 2c 20 73 6b 69 70   of a join, skip
8530: 20 74 68 65 20 73 65 61 72 63 68 20 6f 66 20 74   the search of t
8540: 68 65 20 72 69 67 68 74 20 74 61 62 6c 65 20 6f  he right table o
8550: 66 20 74 68 65 20 6a 6f 69 6e 0a 20 20 20 20 20  f the join.     
8560: 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 6f             ** to
8570: 20 61 76 6f 69 64 20 61 20 64 75 70 6c 69 63 61   avoid a duplica
8580: 74 65 20 6d 61 74 63 68 20 74 68 65 72 65 2e 20  te match there. 
8590: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
85a0: 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20     int k;.      
85b0: 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6b 3d            for(k=
85c0: 30 3b 20 6b 3c 70 55 73 69 6e 67 2d 3e 6e 49 64  0; k<pUsing->nId
85d0: 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; k++){.        
85e0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71            if( sq
85f0: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 55 73  lite3StrICmp(pUs
8600: 69 6e 67 2d 3e 61 5b 6b 5d 2e 7a 4e 61 6d 65 2c  ing->a[k].zName,
8610: 20 7a 43 6f 6c 29 3d 3d 30 20 29 7b 0a 20 20 20   zCol)==0 ){.   
8620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8630: 20 70 49 74 65 6d 2b 2b 3b 0a 20 20 20 20 20 20   pItem++;.      
8640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 2b                i+
8650: 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  +;.             
8660: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
8670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8680: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
8690: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
86a0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
86b0: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  }.            br
86c0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  eak;.          }
86d0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
86e0: 20 7d 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65   }.    }..#ifnde
86f0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  f SQLITE_OMIT_TR
8700: 49 47 47 45 52 0a 20 20 20 20 2f 2a 20 49 66 20  IGGER.    /* If 
8710: 77 65 20 68 61 76 65 20 6e 6f 74 20 61 6c 72 65  we have not alre
8720: 61 64 79 20 72 65 73 6f 6c 76 65 64 20 74 68 65  ady resolved the
8730: 20 6e 61 6d 65 2c 20 74 68 65 6e 20 6d 61 79 62   name, then mayb
8740: 65 20 0a 20 20 20 20 2a 2a 20 69 74 20 69 73 20  e .    ** it is 
8750: 61 20 6e 65 77 2e 2a 20 6f 72 20 6f 6c 64 2e 2a  a new.* or old.*
8760: 20 74 72 69 67 67 65 72 20 61 72 67 75 6d 65 6e   trigger argumen
8770: 74 20 72 65 66 65 72 65 6e 63 65 0a 20 20 20 20  t reference.    
8780: 2a 2f 0a 20 20 20 20 69 66 28 20 7a 44 62 3d 3d  */.    if( zDb==
8790: 30 20 26 26 20 7a 54 61 62 21 3d 30 20 26 26 20  0 && zTab!=0 && 
87a0: 63 6e 74 3d 3d 30 20 26 26 20 70 50 61 72 73 65  cnt==0 && pParse
87b0: 2d 3e 74 72 69 67 53 74 61 63 6b 21 3d 30 20 29  ->trigStack!=0 )
87c0: 7b 0a 20 20 20 20 20 20 54 72 69 67 67 65 72 53  {.      TriggerS
87d0: 74 61 63 6b 20 2a 70 54 72 69 67 67 65 72 53 74  tack *pTriggerSt
87e0: 61 63 6b 20 3d 20 70 50 61 72 73 65 2d 3e 74 72  ack = pParse->tr
87f0: 69 67 53 74 61 63 6b 3b 0a 20 20 20 20 20 20 54  igStack;.      T
8800: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b 0a  able *pTab = 0;.
8810: 20 20 20 20 20 20 75 33 32 20 2a 70 69 43 6f 6c        u32 *piCol
8820: 4d 61 73 6b 3b 0a 20 20 20 20 20 20 69 66 28 20  Mask;.      if( 
8830: 70 54 72 69 67 67 65 72 53 74 61 63 6b 2d 3e 6e  pTriggerStack->n
8840: 65 77 49 64 78 20 21 3d 20 2d 31 20 26 26 20 73  ewIdx != -1 && s
8850: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 22 6e  qlite3StrICmp("n
8860: 65 77 22 2c 20 7a 54 61 62 29 20 3d 3d 20 30 20  ew", zTab) == 0 
8870: 29 7b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72  ){.        pExpr
8880: 2d 3e 69 54 61 62 6c 65 20 3d 20 70 54 72 69 67  ->iTable = pTrig
8890: 67 65 72 53 74 61 63 6b 2d 3e 6e 65 77 49 64 78  gerStack->newIdx
88a0: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
88b0: 28 20 70 54 72 69 67 67 65 72 53 74 61 63 6b 2d  ( pTriggerStack-
88c0: 3e 70 54 61 62 20 29 3b 0a 20 20 20 20 20 20 20  >pTab );.       
88d0: 20 70 54 61 62 20 3d 20 70 54 72 69 67 67 65 72   pTab = pTrigger
88e0: 53 74 61 63 6b 2d 3e 70 54 61 62 3b 0a 20 20 20  Stack->pTab;.   
88f0: 20 20 20 20 20 70 69 43 6f 6c 4d 61 73 6b 20 3d       piColMask =
8900: 20 26 28 70 54 72 69 67 67 65 72 53 74 61 63 6b   &(pTriggerStack
8910: 2d 3e 6e 65 77 43 6f 6c 4d 61 73 6b 29 3b 0a 20  ->newColMask);. 
8920: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
8930: 54 72 69 67 67 65 72 53 74 61 63 6b 2d 3e 6f 6c  TriggerStack->ol
8940: 64 49 64 78 20 21 3d 20 2d 31 20 26 26 20 73 71  dIdx != -1 && sq
8950: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 22 6f 6c  lite3StrICmp("ol
8960: 64 22 2c 20 7a 54 61 62 29 3d 3d 30 20 29 7b 0a  d", zTab)==0 ){.
8970: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69          pExpr->i
8980: 54 61 62 6c 65 20 3d 20 70 54 72 69 67 67 65 72  Table = pTrigger
8990: 53 74 61 63 6b 2d 3e 6f 6c 64 49 64 78 3b 0a 20  Stack->oldIdx;. 
89a0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
89b0: 54 72 69 67 67 65 72 53 74 61 63 6b 2d 3e 70 54  TriggerStack->pT
89c0: 61 62 20 29 3b 0a 20 20 20 20 20 20 20 20 70 54  ab );.        pT
89d0: 61 62 20 3d 20 70 54 72 69 67 67 65 72 53 74 61  ab = pTriggerSta
89e0: 63 6b 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20  ck->pTab;.      
89f0: 20 20 70 69 43 6f 6c 4d 61 73 6b 20 3d 20 26 28    piColMask = &(
8a00: 70 54 72 69 67 67 65 72 53 74 61 63 6b 2d 3e 6f  pTriggerStack->o
8a10: 6c 64 43 6f 6c 4d 61 73 6b 29 3b 0a 20 20 20 20  ldColMask);.    
8a20: 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 70    }..      if( p
8a30: 54 61 62 20 29 7b 20 0a 20 20 20 20 20 20 20 20  Tab ){ .        
8a40: 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20  int iCol;.      
8a50: 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 20 3d    Column *pCol =
8a60: 20 70 54 61 62 2d 3e 61 43 6f 6c 3b 0a 0a 20 20   pTab->aCol;..  
8a70: 20 20 20 20 20 20 70 53 63 68 65 6d 61 20 3d 20        pSchema = 
8a80: 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 3b 0a 20  pTab->pSchema;. 
8a90: 20 20 20 20 20 20 20 63 6e 74 54 61 62 2b 2b 3b         cntTab++;
8aa0: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 43 6f  .        for(iCo
8ab0: 6c 3d 30 3b 20 69 43 6f 6c 20 3c 20 70 54 61 62  l=0; iCol < pTab
8ac0: 2d 3e 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 2c 20  ->nCol; iCol++, 
8ad0: 70 43 6f 6c 2b 2b 29 20 7b 0a 20 20 20 20 20 20  pCol++) {.      
8ae0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
8af0: 74 72 49 43 6d 70 28 70 43 6f 6c 2d 3e 7a 4e 61  trICmp(pCol->zNa
8b00: 6d 65 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 7b 0a  me, zCol)==0 ){.
8b10: 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73              cons
8b20: 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20  t char *zColl = 
8b30: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
8b40: 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20  .zColl;.        
8b50: 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20      cnt++;.     
8b60: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43         pExpr->iC
8b70: 6f 6c 75 6d 6e 20 3d 20 69 43 6f 6c 3d 3d 70 54  olumn = iCol==pT
8b80: 61 62 2d 3e 69 50 4b 65 79 20 3f 20 2d 31 20 3a  ab->iPKey ? -1 :
8b90: 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20   iCol;.         
8ba0: 20 20 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69     pExpr->affini
8bb0: 74 79 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  ty = pTab->aCol[
8bc0: 69 43 6f 6c 5d 2e 61 66 66 69 6e 69 74 79 3b 0a  iCol].affinity;.
8bd0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
8be0: 28 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20  (pExpr->flags & 
8bf0: 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 29 3d 3d  EP_ExpCollate)==
8c00: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
8c10: 20 20 20 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 20     pExpr->pColl 
8c20: 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c  = sqlite3FindCol
8c30: 6c 53 65 71 28 64 62 2c 20 45 4e 43 28 64 62 29  lSeq(db, ENC(db)
8c40: 2c 20 7a 43 6f 6c 6c 2c 2d 31 2c 20 30 29 3b 0a  , zColl,-1, 0);.
8c50: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
8c60: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
8c70: 3e 70 54 61 62 20 3d 20 70 54 61 62 3b 0a 20 20  >pTab = pTab;.  
8c80: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 43            if( iC
8c90: 6f 6c 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ol>=0 ){.       
8ca0: 20 20 20 20 20 20 20 2a 70 69 43 6f 6c 4d 61 73         *piColMas
8cb0: 6b 20 7c 3d 20 28 28 75 33 32 29 31 3c 3c 69 43  k |= ((u32)1<<iC
8cc0: 6f 6c 29 20 7c 20 28 69 43 6f 6c 3e 3d 33 32 3f  ol) | (iCol>=32?
8cd0: 30 78 66 66 66 66 66 66 66 66 3a 30 29 3b 0a 20  0xffffffff:0);. 
8ce0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
8cf0: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
8d00: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
8d10: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
8d20: 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64    }.#endif /* !d
8d30: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
8d40: 49 54 5f 54 52 49 47 47 45 52 29 20 2a 2f 0a 0a  IT_TRIGGER) */..
8d50: 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 50 65      /*.    ** Pe
8d60: 72 68 61 70 73 20 74 68 65 20 6e 61 6d 65 20 69  rhaps the name i
8d70: 73 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  s a reference to
8d80: 20 74 68 65 20 52 4f 57 49 44 0a 20 20 20 20 2a   the ROWID.    *
8d90: 2f 0a 20 20 20 20 69 66 28 20 63 6e 74 3d 3d 30  /.    if( cnt==0
8da0: 20 26 26 20 63 6e 74 54 61 62 3d 3d 31 20 26 26   && cntTab==1 &&
8db0: 20 73 71 6c 69 74 65 33 49 73 52 6f 77 69 64 28   sqlite3IsRowid(
8dc0: 7a 43 6f 6c 29 20 29 7b 0a 20 20 20 20 20 20 63  zCol) ){.      c
8dd0: 6e 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 45  nt = 1;.      pE
8de0: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 2d  xpr->iColumn = -
8df0: 31 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  1;.      pExpr->
8e00: 61 66 66 69 6e 69 74 79 20 3d 20 53 51 4c 49 54  affinity = SQLIT
8e10: 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 3b 0a 20  E_AFF_INTEGER;. 
8e20: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20     }..    /*.   
8e30: 20 2a 2a 20 49 66 20 74 68 65 20 69 6e 70 75 74   ** If the input
8e40: 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20   is of the form 
8e50: 5a 20 28 6e 6f 74 20 59 2e 5a 20 6f 72 20 58 2e  Z (not Y.Z or X.
8e60: 59 2e 5a 29 20 74 68 65 6e 20 74 68 65 20 6e 61  Y.Z) then the na
8e70: 6d 65 20 5a 0a 20 20 20 20 2a 2a 20 6d 69 67 68  me Z.    ** migh
8e80: 74 20 72 65 66 65 72 20 74 6f 20 61 6e 20 72 65  t refer to an re
8e90: 73 75 6c 74 2d 73 65 74 20 61 6c 69 61 73 2e 20  sult-set alias. 
8ea0: 20 54 68 69 73 20 68 61 70 70 65 6e 73 2c 20 66   This happens, f
8eb0: 6f 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e  or example, when
8ec0: 0a 20 20 20 20 2a 2a 20 77 65 20 61 72 65 20 72  .    ** we are r
8ed0: 65 73 6f 6c 76 69 6e 67 20 6e 61 6d 65 73 20 69  esolving names i
8ee0: 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  n the WHERE clau
8ef0: 73 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  se of the follow
8f00: 69 6e 67 20 63 6f 6d 6d 61 6e 64 3a 0a 20 20 20  ing command:.   
8f10: 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 53   **.    **     S
8f20: 45 4c 45 43 54 20 61 2b 62 20 41 53 20 78 20 46  ELECT a+b AS x F
8f30: 52 4f 4d 20 74 61 62 6c 65 20 57 48 45 52 45 20  ROM table WHERE 
8f40: 78 3c 31 30 3b 0a 20 20 20 20 2a 2a 0a 20 20 20  x<10;.    **.   
8f50: 20 2a 2a 20 49 6e 20 63 61 73 65 73 20 6c 69 6b   ** In cases lik
8f60: 65 20 74 68 69 73 2c 20 72 65 70 6c 61 63 65 20  e this, replace 
8f70: 70 45 78 70 72 20 77 69 74 68 20 61 20 63 6f 70  pExpr with a cop
8f80: 79 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73  y of the express
8f90: 69 6f 6e 20 74 68 61 74 0a 20 20 20 20 2a 2a 20  ion that.    ** 
8fa0: 66 6f 72 6d 73 20 74 68 65 20 72 65 73 75 6c 74  forms the result
8fb0: 20 73 65 74 20 65 6e 74 72 79 20 28 22 61 2b 62   set entry ("a+b
8fc0: 22 20 69 6e 20 74 68 65 20 65 78 61 6d 70 6c 65  " in the example
8fd0: 29 20 61 6e 64 20 72 65 74 75 72 6e 20 69 6d 6d  ) and return imm
8fe0: 65 64 69 61 74 65 6c 79 2e 0a 20 20 20 20 2a 2a  ediately..    **
8ff0: 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 65   Note that the e
9000: 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 74 68 65  xpression in the
9010: 20 72 65 73 75 6c 74 20 73 65 74 20 73 68 6f 75   result set shou
9020: 6c 64 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  ld have already 
9030: 62 65 65 6e 0a 20 20 20 20 2a 2a 20 72 65 73 6f  been.    ** reso
9040: 6c 76 65 64 20 62 79 20 74 68 65 20 74 69 6d 65  lved by the time
9050: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
9060: 65 20 69 73 20 72 65 73 6f 6c 76 65 64 2e 0a 20  e is resolved.. 
9070: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 63 6e     */.    if( cn
9080: 74 3d 3d 30 20 26 26 20 28 70 45 4c 69 73 74 20  t==0 && (pEList 
9090: 3d 20 70 4e 43 2d 3e 70 45 4c 69 73 74 29 21 3d  = pNC->pEList)!=
90a0: 30 20 26 26 20 7a 54 61 62 3d 3d 30 20 29 7b 0a  0 && zTab==0 ){.
90b0: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
90c0: 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  <pEList->nExpr; 
90d0: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 68  j++){.        ch
90e0: 61 72 20 2a 7a 41 73 20 3d 20 70 45 4c 69 73 74  ar *zAs = pEList
90f0: 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  ->a[j].zName;.  
9100: 20 20 20 20 20 20 69 66 28 20 7a 41 73 21 3d 30        if( zAs!=0
9110: 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43   && sqlite3StrIC
9120: 6d 70 28 7a 41 73 2c 20 7a 43 6f 6c 29 3d 3d 30  mp(zAs, zCol)==0
9130: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45 78   ){.          Ex
9140: 70 72 20 2a 70 44 75 70 2c 20 2a 70 4f 72 69 67  pr *pDup, *pOrig
9150: 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
9160: 72 74 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  rt( pExpr->pLeft
9170: 3d 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 70 52  ==0 && pExpr->pR
9180: 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ight==0 );.     
9190: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
91a0: 70 72 2d 3e 70 4c 69 73 74 3d 3d 30 20 29 3b 0a  pr->pList==0 );.
91b0: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
91c0: 28 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74  ( pExpr->pSelect
91d0: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ==0 );.         
91e0: 20 70 4f 72 69 67 20 3d 20 70 45 4c 69 73 74 2d   pOrig = pEList-
91f0: 3e 61 5b 6a 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[j].pExpr;.   
9200: 20 20 20 20 20 20 20 69 66 28 20 21 70 4e 43 2d         if( !pNC-
9210: 3e 61 6c 6c 6f 77 41 67 67 20 26 26 20 45 78 70  >allowAgg && Exp
9220: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 4f 72  rHasProperty(pOr
9230: 69 67 2c 20 45 50 5f 41 67 67 29 20 29 7b 0a 20  ig, EP_Agg) ){. 
9240: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
9250: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
9260: 65 2c 20 22 6d 69 73 75 73 65 20 6f 66 20 61 6c  e, "misuse of al
9270: 69 61 73 65 64 20 61 67 67 72 65 67 61 74 65 20  iased aggregate 
9280: 25 73 22 2c 20 7a 41 73 29 3b 0a 20 20 20 20 20  %s", zAs);.     
9290: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
92a0: 72 65 65 28 7a 43 6f 6c 29 3b 0a 20 20 20 20 20  ree(zCol);.     
92b0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 32 3b         return 2;
92c0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
92d0: 20 20 20 20 20 20 20 70 44 75 70 20 3d 20 73 71         pDup = sq
92e0: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
92f0: 20 70 4f 72 69 67 29 3b 0a 20 20 20 20 20 20 20   pOrig);.       
9300: 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 66 6c     if( pExpr->fl
9310: 61 67 73 20 26 20 45 50 5f 45 78 70 43 6f 6c 6c  ags & EP_ExpColl
9320: 61 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ate ){.         
9330: 20 20 20 70 44 75 70 2d 3e 70 43 6f 6c 6c 20 3d     pDup->pColl =
9340: 20 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 3b 0a 20   pExpr->pColl;. 
9350: 20 20 20 20 20 20 20 20 20 20 20 70 44 75 70 2d             pDup-
9360: 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 45 78 70  >flags |= EP_Exp
9370: 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 20 20 20  Collate;.       
9380: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
9390: 66 28 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e 64  f( pExpr->span.d
93a0: 79 6e 20 29 20 73 71 6c 69 74 65 33 5f 66 72 65  yn ) sqlite3_fre
93b0: 65 28 28 63 68 61 72 2a 29 70 45 78 70 72 2d 3e  e((char*)pExpr->
93c0: 73 70 61 6e 2e 7a 29 3b 0a 20 20 20 20 20 20 20  span.z);.       
93d0: 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 74 6f     if( pExpr->to
93e0: 6b 65 6e 2e 64 79 6e 20 29 20 73 71 6c 69 74 65  ken.dyn ) sqlite
93f0: 33 5f 66 72 65 65 28 28 63 68 61 72 2a 29 70 45  3_free((char*)pE
9400: 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 29 3b 0a 20  xpr->token.z);. 
9410: 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
9420: 70 45 78 70 72 2c 20 70 44 75 70 2c 20 73 69 7a  pExpr, pDup, siz
9430: 65 6f 66 28 2a 70 45 78 70 72 29 29 3b 0a 20 20  eof(*pExpr));.  
9440: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
9450: 66 72 65 65 28 70 44 75 70 29 3b 0a 20 20 20 20  free(pDup);.    
9460: 20 20 20 20 20 20 63 6e 74 20 3d 20 31 3b 0a 20        cnt = 1;. 
9470: 20 20 20 20 20 20 20 20 20 70 4d 61 74 63 68 20           pMatch 
9480: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 61  = 0;.          a
9490: 73 73 65 72 74 28 20 7a 54 61 62 3d 3d 30 20 26  ssert( zTab==0 &
94a0: 26 20 7a 44 62 3d 3d 30 20 29 3b 0a 20 20 20 20  & zDb==0 );.    
94b0: 20 20 20 20 20 20 67 6f 74 6f 20 6c 6f 6f 6b 75        goto looku
94c0: 70 6e 61 6d 65 5f 65 6e 64 5f 32 3b 0a 20 20 20  pname_end_2;.   
94d0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 20 0a       }.      } .
94e0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64      }..    /* Ad
94f0: 76 61 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 78  vance to the nex
9500: 74 20 6e 61 6d 65 20 63 6f 6e 74 65 78 74 2e 20  t name context. 
9510: 20 54 68 65 20 6c 6f 6f 70 20 77 69 6c 6c 20 65   The loop will e
9520: 78 69 74 20 77 68 65 6e 20 65 69 74 68 65 72 0a  xit when either.
9530: 20 20 20 20 2a 2a 20 77 65 20 68 61 76 65 20 61      ** we have a
9540: 20 6d 61 74 63 68 20 28 63 6e 74 3e 30 29 20 6f   match (cnt>0) o
9550: 72 20 77 68 65 6e 20 77 65 20 72 75 6e 20 6f 75  r when we run ou
9560: 74 20 6f 66 20 6e 61 6d 65 20 63 6f 6e 74 65 78  t of name contex
9570: 74 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ts..    */.    i
9580: 66 28 20 63 6e 74 3d 3d 30 20 29 7b 0a 20 20 20  f( cnt==0 ){.   
9590: 20 20 20 70 4e 43 20 3d 20 70 4e 43 2d 3e 70 4e     pNC = pNC->pN
95a0: 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ext;.    }.  }..
95b0: 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 58 20 61    /*.  ** If X a
95c0: 6e 64 20 59 20 61 72 65 20 4e 55 4c 4c 20 28 69  nd Y are NULL (i
95d0: 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 20 69 66  n other words if
95e0: 20 6f 6e 6c 79 20 74 68 65 20 63 6f 6c 75 6d 6e   only the column
95f0: 20 6e 61 6d 65 20 5a 20 69 73 0a 20 20 2a 2a 20   name Z is.  ** 
9600: 73 75 70 70 6c 69 65 64 29 20 61 6e 64 20 74 68  supplied) and th
9610: 65 20 76 61 6c 75 65 20 6f 66 20 5a 20 69 73 20  e value of Z is 
9620: 65 6e 63 6c 6f 73 65 64 20 69 6e 20 64 6f 75 62  enclosed in doub
9630: 6c 65 2d 71 75 6f 74 65 73 2c 20 74 68 65 6e 0a  le-quotes, then.
9640: 20 20 2a 2a 20 5a 20 69 73 20 61 20 73 74 72 69    ** Z is a stri
9650: 6e 67 20 6c 69 74 65 72 61 6c 20 69 66 20 69 74  ng literal if it
9660: 20 64 6f 65 73 6e 27 74 20 6d 61 74 63 68 20 61   doesn't match a
9670: 6e 79 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 2e  ny column names.
9680: 20 20 49 6e 20 74 68 61 74 0a 20 20 2a 2a 20 63    In that.  ** c
9690: 61 73 65 2c 20 77 65 20 6e 65 65 64 20 74 6f 20  ase, we need to 
96a0: 72 65 74 75 72 6e 20 72 69 67 68 74 20 61 77 61  return right awa
96b0: 79 20 61 6e 64 20 6e 6f 74 20 6d 61 6b 65 20 61  y and not make a
96c0: 6e 79 20 63 68 61 6e 67 65 73 20 74 6f 0a 20 20  ny changes to.  
96d0: 2a 2a 20 70 45 78 70 72 2e 0a 20 20 2a 2a 0a 20  ** pExpr..  **. 
96e0: 20 2a 2a 20 42 65 63 61 75 73 65 20 6e 6f 20 72   ** Because no r
96f0: 65 66 65 72 65 6e 63 65 20 77 61 73 20 6d 61 64  eference was mad
9700: 65 20 74 6f 20 6f 75 74 65 72 20 63 6f 6e 74 65  e to outer conte
9710: 78 74 73 2c 20 74 68 65 20 70 4e 43 2d 3e 6e 52  xts, the pNC->nR
9720: 65 66 0a 20 20 2a 2a 20 66 69 65 6c 64 73 20 61  ef.  ** fields a
9730: 72 65 20 6e 6f 74 20 63 68 61 6e 67 65 64 20 69  re not changed i
9740: 6e 20 61 6e 79 20 63 6f 6e 74 65 78 74 2e 0a 20  n any context.. 
9750: 20 2a 2f 0a 20 20 69 66 28 20 63 6e 74 3d 3d 30   */.  if( cnt==0
9760: 20 26 26 20 7a 54 61 62 3d 3d 30 20 26 26 20 70   && zTab==0 && p
9770: 43 6f 6c 75 6d 6e 54 6f 6b 65 6e 2d 3e 7a 5b 30  ColumnToken->z[0
9780: 5d 3d 3d 27 22 27 20 29 7b 0a 20 20 20 20 73 71  ]=='"' ){.    sq
9790: 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6c 29  lite3_free(zCol)
97a0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
97b0: 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 63    }..  /*.  ** c
97c0: 6e 74 3d 3d 30 20 6d 65 61 6e 73 20 74 68 65 72  nt==0 means ther
97d0: 65 20 77 61 73 20 6e 6f 74 20 6d 61 74 63 68 2e  e was not match.
97e0: 20 20 63 6e 74 3e 31 20 6d 65 61 6e 73 20 74 68    cnt>1 means th
97f0: 65 72 65 20 77 65 72 65 20 74 77 6f 20 6f 72 0a  ere were two or.
9800: 20 20 2a 2a 20 6d 6f 72 65 20 6d 61 74 63 68 65    ** more matche
9810: 73 2e 20 20 45 69 74 68 65 72 20 77 61 79 2c 20  s.  Either way, 
9820: 77 65 20 68 61 76 65 20 61 6e 20 65 72 72 6f 72  we have an error
9830: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 6e 74  ..  */.  if( cnt
9840: 21 3d 31 20 29 7b 0a 20 20 20 20 63 68 61 72 20  !=1 ){.    char 
9850: 2a 7a 20 3d 20 30 3b 0a 20 20 20 20 63 68 61 72  *z = 0;.    char
9860: 20 2a 7a 45 72 72 3b 0a 20 20 20 20 7a 45 72 72   *zErr;.    zErr
9870: 20 3d 20 63 6e 74 3d 3d 30 20 3f 20 22 6e 6f 20   = cnt==0 ? "no 
9880: 73 75 63 68 20 63 6f 6c 75 6d 6e 3a 20 25 73 22  such column: %s"
9890: 20 3a 20 22 61 6d 62 69 67 75 6f 75 73 20 63 6f   : "ambiguous co
98a0: 6c 75 6d 6e 20 6e 61 6d 65 3a 20 25 73 22 3b 0a  lumn name: %s";.
98b0: 20 20 20 20 69 66 28 20 7a 44 62 20 29 7b 0a 20      if( zDb ){. 
98c0: 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 53       sqlite3SetS
98d0: 74 72 69 6e 67 28 26 7a 2c 20 7a 44 62 2c 20 22  tring(&z, zDb, "
98e0: 2e 22 2c 20 7a 54 61 62 2c 20 22 2e 22 2c 20 7a  .", zTab, ".", z
98f0: 43 6f 6c 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  Col, (char*)0);.
9900: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 54      }else if( zT
9910: 61 62 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ab ){.      sqli
9920: 74 65 33 53 65 74 53 74 72 69 6e 67 28 26 7a 2c  te3SetString(&z,
9930: 20 7a 54 61 62 2c 20 22 2e 22 2c 20 7a 43 6f 6c   zTab, ".", zCol
9940: 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20  , (char*)0);.   
9950: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 20   }else{.      z 
9960: 3d 20 73 71 6c 69 74 65 33 53 74 72 44 75 70 28  = sqlite3StrDup(
9970: 7a 43 6f 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20  zCol);.    }.   
9980: 20 69 66 28 20 7a 20 29 7b 0a 20 20 20 20 20 20   if( z ){.      
9990: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
99a0: 70 50 61 72 73 65 2c 20 7a 45 72 72 2c 20 7a 29  pParse, zErr, z)
99b0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
99c0: 66 72 65 65 28 7a 29 3b 0a 20 20 20 20 20 20 70  free(z);.      p
99d0: 54 6f 70 4e 43 2d 3e 6e 45 72 72 2b 2b 3b 0a 20  TopNC->nErr++;. 
99e0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
99f0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
9a00: 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 1;.    }.  }.
9a10: 0a 20 20 2f 2a 20 49 66 20 61 20 63 6f 6c 75 6d  .  /* If a colum
9a20: 6e 20 66 72 6f 6d 20 61 20 74 61 62 6c 65 20 69  n from a table i
9a30: 6e 20 70 53 72 63 4c 69 73 74 20 69 73 20 72 65  n pSrcList is re
9a40: 66 65 72 65 6e 63 65 64 2c 20 74 68 65 6e 20 72  ferenced, then r
9a50: 65 63 6f 72 64 0a 20 20 2a 2a 20 74 68 69 73 20  ecord.  ** this 
9a60: 66 61 63 74 20 69 6e 20 74 68 65 20 70 53 72 63  fact in the pSrc
9a70: 4c 69 73 74 2e 61 5b 5d 2e 63 6f 6c 55 73 65 64  List.a[].colUsed
9a80: 20 62 69 74 6d 61 73 6b 2e 20 20 43 6f 6c 75 6d   bitmask.  Colum
9a90: 6e 20 30 20 63 61 75 73 65 73 0a 20 20 2a 2a 20  n 0 causes.  ** 
9aa0: 62 69 74 20 30 20 74 6f 20 62 65 20 73 65 74 2e  bit 0 to be set.
9ab0: 20 20 43 6f 6c 75 6d 6e 20 31 20 73 65 74 73 20    Column 1 sets 
9ac0: 62 69 74 20 31 2e 20 20 41 6e 64 20 73 6f 20 66  bit 1.  And so f
9ad0: 6f 72 74 68 2e 20 20 49 66 20 74 68 65 0a 20 20  orth.  If the.  
9ae0: 2a 2a 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72  ** column number
9af0: 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
9b00: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
9b10: 69 74 73 20 69 6e 20 74 68 65 20 62 69 74 6d 61  its in the bitma
9b20: 73 6b 0a 20 20 2a 2a 20 74 68 65 6e 20 73 65 74  sk.  ** then set
9b30: 20 74 68 65 20 68 69 67 68 2d 6f 72 64 65 72 20   the high-order 
9b40: 62 69 74 20 6f 66 20 74 68 65 20 62 69 74 6d 61  bit of the bitma
9b50: 73 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  sk..  */.  if( p
9b60: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30  Expr->iColumn>=0
9b70: 20 26 26 20 70 4d 61 74 63 68 21 3d 30 20 29 7b   && pMatch!=0 ){
9b80: 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 45 78  .    int n = pEx
9b90: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20  pr->iColumn;.   
9ba0: 20 69 66 28 20 6e 3e 3d 73 69 7a 65 6f 66 28 42   if( n>=sizeof(B
9bb0: 69 74 6d 61 73 6b 29 2a 38 20 29 7b 0a 20 20 20  itmask)*8 ){.   
9bc0: 20 20 20 6e 20 3d 20 73 69 7a 65 6f 66 28 42 69     n = sizeof(Bi
9bd0: 74 6d 61 73 6b 29 2a 38 2d 31 3b 0a 20 20 20 20  tmask)*8-1;.    
9be0: 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4d  }.    assert( pM
9bf0: 61 74 63 68 2d 3e 69 43 75 72 73 6f 72 3d 3d 70  atch->iCursor==p
9c00: 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 29 3b 0a  Expr->iTable );.
9c10: 20 20 20 20 70 4d 61 74 63 68 2d 3e 63 6f 6c 55      pMatch->colU
9c20: 73 65 64 20 7c 3d 20 28 28 42 69 74 6d 61 73 6b  sed |= ((Bitmask
9c30: 29 31 29 3c 3c 6e 3b 0a 20 20 7d 0a 0a 6c 6f 6f  )1)<<n;.  }..loo
9c40: 6b 75 70 6e 61 6d 65 5f 65 6e 64 3a 0a 20 20 2f  kupname_end:.  /
9c50: 2a 20 43 6c 65 61 6e 20 75 70 20 61 6e 64 20 72  * Clean up and r
9c60: 65 74 75 72 6e 0a 20 20 2a 2f 0a 20 20 73 71 6c  eturn.  */.  sql
9c70: 69 74 65 33 5f 66 72 65 65 28 7a 44 62 29 3b 0a  ite3_free(zDb);.
9c80: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
9c90: 54 61 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  Tab);.  sqlite3E
9ca0: 78 70 72 44 65 6c 65 74 65 28 70 45 78 70 72 2d  xprDelete(pExpr-
9cb0: 3e 70 4c 65 66 74 29 3b 0a 20 20 70 45 78 70 72  >pLeft);.  pExpr
9cc0: 2d 3e 70 4c 65 66 74 20 3d 20 30 3b 0a 20 20 73  ->pLeft = 0;.  s
9cd0: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
9ce0: 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b  (pExpr->pRight);
9cf0: 0a 20 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  .  pExpr->pRight
9d00: 20 3d 20 30 3b 0a 20 20 70 45 78 70 72 2d 3e 6f   = 0;.  pExpr->o
9d10: 70 20 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 6c  p = TK_COLUMN;.l
9d20: 6f 6f 6b 75 70 6e 61 6d 65 5f 65 6e 64 5f 32 3a  ookupname_end_2:
9d30: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
9d40: 7a 43 6f 6c 29 3b 0a 20 20 69 66 28 20 63 6e 74  zCol);.  if( cnt
9d50: 3d 3d 31 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ==1 ){.    asser
9d60: 74 28 20 70 4e 43 21 3d 30 20 29 3b 0a 20 20 20  t( pNC!=0 );.   
9d70: 20 73 71 6c 69 74 65 33 41 75 74 68 52 65 61 64   sqlite3AuthRead
9d80: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
9d90: 70 53 63 68 65 6d 61 2c 20 70 4e 43 2d 3e 70 53  pSchema, pNC->pS
9da0: 72 63 4c 69 73 74 29 3b 0a 20 20 20 20 69 66 28  rcList);.    if(
9db0: 20 70 4d 61 74 63 68 20 26 26 20 21 70 4d 61 74   pMatch && !pMat
9dc0: 63 68 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20  ch->pSelect ){. 
9dd0: 20 20 20 20 20 70 45 78 70 72 2d 3e 70 54 61 62       pExpr->pTab
9de0: 20 3d 20 70 4d 61 74 63 68 2d 3e 70 54 61 62 3b   = pMatch->pTab;
9df0: 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 49 6e  .    }.    /* In
9e00: 63 72 65 6d 65 6e 74 20 74 68 65 20 6e 52 65 66  crement the nRef
9e10: 20 76 61 6c 75 65 20 6f 6e 20 61 6c 6c 20 6e 61   value on all na
9e20: 6d 65 20 63 6f 6e 74 65 78 74 73 20 66 72 6f 6d  me contexts from
9e30: 20 54 6f 70 4e 43 20 75 70 20 74 6f 0a 20 20 20   TopNC up to.   
9e40: 20 2a 2a 20 74 68 65 20 70 6f 69 6e 74 20 77 68   ** the point wh
9e50: 65 72 65 20 74 68 65 20 6e 61 6d 65 20 6d 61 74  ere the name mat
9e60: 63 68 65 64 2e 20 2a 2f 0a 20 20 20 20 66 6f 72  ched. */.    for
9e70: 28 3b 3b 29 7b 0a 20 20 20 20 20 20 61 73 73 65  (;;){.      asse
9e80: 72 74 28 20 70 54 6f 70 4e 43 21 3d 30 20 29 3b  rt( pTopNC!=0 );
9e90: 0a 20 20 20 20 20 20 70 54 6f 70 4e 43 2d 3e 6e  .      pTopNC->n
9ea0: 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  Ref++;.      if(
9eb0: 20 70 54 6f 70 4e 43 3d 3d 70 4e 43 20 29 20 62   pTopNC==pNC ) b
9ec0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 70 54 6f 70  reak;.      pTop
9ed0: 4e 43 20 3d 20 70 54 6f 70 4e 43 2d 3e 70 4e 65  NC = pTopNC->pNe
9ee0: 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  xt;.    }.    re
9ef0: 74 75 72 6e 20 30 3b 0a 20 20 7d 20 65 6c 73 65  turn 0;.  } else
9f00: 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b   {.    return 1;
9f10: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
9f20: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 64 65  is routine is de
9f30: 73 69 67 6e 65 64 20 61 73 20 61 6e 20 78 46 75  signed as an xFu
9f40: 6e 63 20 66 6f 72 20 77 61 6c 6b 45 78 70 72 54  nc for walkExprT
9f50: 72 65 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 52 65 73  ree()..**.** Res
9f60: 6f 6c 76 65 20 73 79 6d 62 6f 6c 69 63 20 6e 61  olve symbolic na
9f70: 6d 65 73 20 69 6e 74 6f 20 54 4b 5f 43 4f 4c 55  mes into TK_COLU
9f80: 4d 4e 20 6f 70 65 72 61 74 6f 72 73 20 66 6f 72  MN operators for
9f90: 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20   the current.** 
9fa0: 6e 6f 64 65 20 69 6e 20 74 68 65 20 65 78 70 72  node in the expr
9fb0: 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65  ession tree.  Re
9fc0: 74 75 72 6e 20 30 20 74 6f 20 63 6f 6e 74 69 6e  turn 0 to contin
9fd0: 75 65 20 74 68 65 20 73 65 61 72 63 68 20 64 6f  ue the search do
9fe0: 77 6e 0a 2a 2a 20 74 68 65 20 74 72 65 65 20 6f  wn.** the tree o
9ff0: 72 20 32 20 74 6f 20 61 62 6f 72 74 20 74 68 65  r 2 to abort the
a000: 20 74 72 65 65 20 77 61 6c 6b 2e 0a 2a 2a 0a 2a   tree walk..**.*
a010: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61  * This routine a
a020: 6c 73 6f 20 64 6f 65 73 20 65 72 72 6f 72 20 63  lso does error c
a030: 68 65 63 6b 69 6e 67 20 61 6e 64 20 6e 61 6d 65  hecking and name
a040: 20 72 65 73 6f 6c 75 74 69 6f 6e 20 66 6f 72 0a   resolution for.
a050: 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  ** function name
a060: 73 2e 20 20 54 68 65 20 6f 70 65 72 61 74 6f 72  s.  The operator
a070: 20 66 6f 72 20 61 67 67 72 65 67 61 74 65 20 66   for aggregate f
a080: 75 6e 63 74 69 6f 6e 73 20 69 73 20 63 68 61 6e  unctions is chan
a090: 67 65 64 0a 2a 2a 20 74 6f 20 54 4b 5f 41 47 47  ged.** to TK_AGG
a0a0: 5f 46 55 4e 43 54 49 4f 4e 2e 0a 2a 2f 0a 73 74  _FUNCTION..*/.st
a0b0: 61 74 69 63 20 69 6e 74 20 6e 61 6d 65 52 65 73  atic int nameRes
a0c0: 6f 6c 76 65 72 53 74 65 70 28 76 6f 69 64 20 2a  olverStep(void *
a0d0: 70 41 72 67 2c 20 45 78 70 72 20 2a 70 45 78 70  pArg, Expr *pExp
a0e0: 72 29 7b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78  r){.  NameContex
a0f0: 74 20 2a 70 4e 43 20 3d 20 28 4e 61 6d 65 43 6f  t *pNC = (NameCo
a100: 6e 74 65 78 74 2a 29 70 41 72 67 3b 0a 20 20 50  ntext*)pArg;.  P
a110: 61 72 73 65 20 2a 70 50 61 72 73 65 3b 0a 0a 20  arse *pParse;.. 
a120: 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20   if( pExpr==0 ) 
a130: 72 65 74 75 72 6e 20 31 3b 0a 20 20 61 73 73 65  return 1;.  asse
a140: 72 74 28 20 70 4e 43 21 3d 30 20 29 3b 0a 20 20  rt( pNC!=0 );.  
a150: 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50  pParse = pNC->pP
a160: 61 72 73 65 3b 0a 0a 20 20 69 66 28 20 45 78 70  arse;..  if( Exp
a170: 72 48 61 73 41 6e 79 50 72 6f 70 65 72 74 79 28  rHasAnyProperty(
a180: 70 45 78 70 72 2c 20 45 50 5f 52 65 73 6f 6c 76  pExpr, EP_Resolv
a190: 65 64 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ed) ) return 1;.
a1a0: 20 20 45 78 70 72 53 65 74 50 72 6f 70 65 72 74    ExprSetPropert
a1b0: 79 28 70 45 78 70 72 2c 20 45 50 5f 52 65 73 6f  y(pExpr, EP_Reso
a1c0: 6c 76 65 64 29 3b 0a 23 69 66 6e 64 65 66 20 4e  lved);.#ifndef N
a1d0: 44 45 42 55 47 0a 20 20 69 66 28 20 70 4e 43 2d  DEBUG.  if( pNC-
a1e0: 3e 70 53 72 63 4c 69 73 74 20 26 26 20 70 4e 43  >pSrcList && pNC
a1f0: 2d 3e 70 53 72 63 4c 69 73 74 2d 3e 6e 41 6c 6c  ->pSrcList->nAll
a200: 6f 63 3e 30 20 29 7b 0a 20 20 20 20 53 72 63 4c  oc>0 ){.    SrcL
a210: 69 73 74 20 2a 70 53 72 63 4c 69 73 74 20 3d 20  ist *pSrcList = 
a220: 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3b 0a 20  pNC->pSrcList;. 
a230: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
a240: 72 28 69 3d 30 3b 20 69 3c 70 4e 43 2d 3e 70 53  r(i=0; i<pNC->pS
a250: 72 63 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  rcList->nSrc; i+
a260: 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  +){.      assert
a270: 28 20 70 53 72 63 4c 69 73 74 2d 3e 61 5b 69 5d  ( pSrcList->a[i]
a280: 2e 69 43 75 72 73 6f 72 3e 3d 30 20 26 26 20 70  .iCursor>=0 && p
a290: 53 72 63 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43  SrcList->a[i].iC
a2a0: 75 72 73 6f 72 3c 70 50 61 72 73 65 2d 3e 6e 54  ursor<pParse->nT
a2b0: 61 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  ab);.    }.  }.#
a2c0: 65 6e 64 69 66 0a 20 20 73 77 69 74 63 68 28 20  endif.  switch( 
a2d0: 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20  pExpr->op ){.   
a2e0: 20 2f 2a 20 44 6f 75 62 6c 65 2d 71 75 6f 74 65   /* Double-quote
a2f0: 64 20 73 74 72 69 6e 67 73 20 28 65 78 3a 20 22  d strings (ex: "
a300: 61 62 63 22 29 20 61 72 65 20 75 73 65 64 20 61  abc") are used a
a310: 73 20 69 64 65 6e 74 69 66 69 65 72 73 20 69 66  s identifiers if
a320: 0a 20 20 20 20 2a 2a 20 70 6f 73 73 69 62 6c 65  .    ** possible
a330: 2e 20 20 4f 74 68 65 72 77 69 73 65 20 74 68 65  .  Otherwise the
a340: 79 20 72 65 6d 61 69 6e 20 61 73 20 73 74 72 69  y remain as stri
a350: 6e 67 73 2e 20 20 53 69 6e 67 6c 65 2d 71 75 6f  ngs.  Single-quo
a360: 74 65 64 0a 20 20 20 20 2a 2a 20 73 74 72 69 6e  ted.    ** strin
a370: 67 73 20 28 65 78 3a 20 27 61 62 63 27 29 20 61  gs (ex: 'abc') a
a380: 72 65 20 61 6c 77 61 79 73 20 73 74 72 69 6e 67  re always string
a390: 20 6c 69 74 65 72 61 6c 73 2e 0a 20 20 20 20 2a   literals..    *
a3a0: 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54  /.    case TK_ST
a3b0: 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20 69 66  RING: {.      if
a3c0: 28 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a  ( pExpr->token.z
a3d0: 5b 30 5d 3d 3d 27 5c 27 27 20 29 20 62 72 65 61  [0]=='\'' ) brea
a3e0: 6b 3b 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c  k;.      /* Fall
a3f0: 20 74 68 72 75 20 69 6e 74 6f 20 74 68 65 20 54   thru into the T
a400: 4b 5f 49 44 20 63 61 73 65 20 69 66 20 74 68 69  K_ID case if thi
a410: 73 20 69 73 20 61 20 64 6f 75 62 6c 65 2d 71 75  s is a double-qu
a420: 6f 74 65 64 20 73 74 72 69 6e 67 20 2a 2f 0a 20  oted string */. 
a430: 20 20 20 7d 0a 20 20 20 20 2f 2a 20 41 20 6c 6f     }.    /* A lo
a440: 6e 65 20 69 64 65 6e 74 69 66 69 65 72 20 69 73  ne identifier is
a450: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 63   the name of a c
a460: 6f 6c 75 6d 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  olumn..    */.  
a470: 20 20 63 61 73 65 20 54 4b 5f 49 44 3a 20 7b 0a    case TK_ID: {.
a480: 20 20 20 20 20 20 6c 6f 6f 6b 75 70 4e 61 6d 65        lookupName
a490: 28 70 50 61 72 73 65 2c 20 30 2c 20 30 2c 20 26  (pParse, 0, 0, &
a4a0: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2c 20 70 4e  pExpr->token, pN
a4b0: 43 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20  C, pExpr);.     
a4c0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
a4d0: 0a 20 20 0a 20 20 20 20 2f 2a 20 41 20 74 61 62  .  .    /* A tab
a4e0: 6c 65 20 6e 61 6d 65 20 61 6e 64 20 63 6f 6c 75  le name and colu
a4f0: 6d 6e 20 6e 61 6d 65 3a 20 20 20 20 20 49 44 2e  mn name:     ID.
a500: 49 44 0a 20 20 20 20 2a 2a 20 4f 72 20 61 20 64  ID.    ** Or a d
a510: 61 74 61 62 61 73 65 2c 20 74 61 62 6c 65 20 61  atabase, table a
a520: 6e 64 20 63 6f 6c 75 6d 6e 3a 20 20 49 44 2e 49  nd column:  ID.I
a530: 44 2e 49 44 0a 20 20 20 20 2a 2f 0a 20 20 20 20  D.ID.    */.    
a540: 63 61 73 65 20 54 4b 5f 44 4f 54 3a 20 7b 0a 20  case TK_DOT: {. 
a550: 20 20 20 20 20 54 6f 6b 65 6e 20 2a 70 43 6f 6c       Token *pCol
a560: 75 6d 6e 3b 0a 20 20 20 20 20 20 54 6f 6b 65 6e  umn;.      Token
a570: 20 2a 70 54 61 62 6c 65 3b 0a 20 20 20 20 20 20   *pTable;.      
a580: 54 6f 6b 65 6e 20 2a 70 44 62 3b 0a 20 20 20 20  Token *pDb;.    
a590: 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 3b 0a    Expr *pRight;.
a5a0: 0a 20 20 20 20 20 20 2f 2a 20 69 66 28 20 70 53  .      /* if( pS
a5b0: 72 63 4c 69 73 74 3d 3d 30 20 29 20 62 72 65 61  rcList==0 ) brea
a5c0: 6b 3b 20 2a 2f 0a 20 20 20 20 20 20 70 52 69 67  k; */.      pRig
a5d0: 68 74 20 3d 20 70 45 78 70 72 2d 3e 70 52 69 67  ht = pExpr->pRig
a5e0: 68 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 52  ht;.      if( pR
a5f0: 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20  ight->op==TK_ID 
a600: 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 20 3d  ){.        pDb =
a610: 20 30 3b 0a 20 20 20 20 20 20 20 20 70 54 61 62   0;.        pTab
a620: 6c 65 20 3d 20 26 70 45 78 70 72 2d 3e 70 4c 65  le = &pExpr->pLe
a630: 66 74 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20  ft->token;.     
a640: 20 20 20 70 43 6f 6c 75 6d 6e 20 3d 20 26 70 52     pColumn = &pR
a650: 69 67 68 74 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20  ight->token;.   
a660: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
a670: 20 20 61 73 73 65 72 74 28 20 70 52 69 67 68 74    assert( pRight
a680: 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29 3b 0a  ->op==TK_DOT );.
a690: 20 20 20 20 20 20 20 20 70 44 62 20 3d 20 26 70          pDb = &p
a6a0: 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 74 6f 6b  Expr->pLeft->tok
a6b0: 65 6e 3b 0a 20 20 20 20 20 20 20 20 70 54 61 62  en;.        pTab
a6c0: 6c 65 20 3d 20 26 70 52 69 67 68 74 2d 3e 70 4c  le = &pRight->pL
a6d0: 65 66 74 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20  eft->token;.    
a6e0: 20 20 20 20 70 43 6f 6c 75 6d 6e 20 3d 20 26 70      pColumn = &p
a6f0: 52 69 67 68 74 2d 3e 70 52 69 67 68 74 2d 3e 74  Right->pRight->t
a700: 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20  oken;.      }.  
a710: 20 20 20 20 6c 6f 6f 6b 75 70 4e 61 6d 65 28 70      lookupName(p
a720: 50 61 72 73 65 2c 20 70 44 62 2c 20 70 54 61 62  Parse, pDb, pTab
a730: 6c 65 2c 20 70 43 6f 6c 75 6d 6e 2c 20 70 4e 43  le, pColumn, pNC
a740: 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  , pExpr);.      
a750: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
a760: 0a 20 20 20 20 2f 2a 20 52 65 73 6f 6c 76 65 20  .    /* Resolve 
a770: 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 73 0a 20  function names. 
a780: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54     */.    case T
a790: 4b 5f 43 4f 4e 53 54 5f 46 55 4e 43 3a 0a 20 20  K_CONST_FUNC:.  
a7a0: 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54 49    case TK_FUNCTI
a7b0: 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72  ON: {.      Expr
a7c0: 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 45  List *pList = pE
a7d0: 78 70 72 2d 3e 70 4c 69 73 74 3b 20 20 20 20 2f  xpr->pList;    /
a7e0: 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20 6c  * The argument l
a7f0: 69 73 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  ist */.      int
a800: 20 6e 20 3d 20 70 4c 69 73 74 20 3f 20 70 4c 69   n = pList ? pLi
a810: 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 20 20  st->nExpr : 0;  
a820: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
a830: 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20  uments */.      
a840: 69 6e 74 20 6e 6f 5f 73 75 63 68 5f 66 75 6e 63  int no_such_func
a850: 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 54   = 0;       /* T
a860: 72 75 65 20 69 66 20 6e 6f 20 73 75 63 68 20 66  rue if no such f
a870: 75 6e 63 74 69 6f 6e 20 65 78 69 73 74 73 20 2a  unction exists *
a880: 2f 0a 20 20 20 20 20 20 69 6e 74 20 77 72 6f 6e  /.      int wron
a890: 67 5f 6e 75 6d 5f 61 72 67 73 20 3d 20 30 3b 20  g_num_args = 0; 
a8a0: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 77      /* True if w
a8b0: 72 6f 6e 67 20 6e 75 6d 62 65 72 20 6f 66 20 61  rong number of a
a8c0: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20  rguments */.    
a8d0: 20 20 69 6e 74 20 69 73 5f 61 67 67 20 3d 20 30    int is_agg = 0
a8e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
a8f0: 20 54 72 75 65 20 69 66 20 69 73 20 61 6e 20 61   True if is an a
a900: 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
a910: 6e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69  n */.      int i
a920: 3b 0a 20 20 20 20 20 20 69 6e 74 20 61 75 74 68  ;.      int auth
a930: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
a940: 20 20 20 20 2f 2a 20 41 75 74 68 6f 72 69 7a 61      /* Authoriza
a950: 74 69 6f 6e 20 74 6f 20 75 73 65 20 74 68 65 20  tion to use the 
a960: 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  function */.    
a970: 20 20 69 6e 74 20 6e 49 64 3b 20 20 20 20 20 20    int nId;      
a980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a990: 20 4e 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61   Number of chara
a9a0: 63 74 65 72 73 20 69 6e 20 66 75 6e 63 74 69 6f  cters in functio
a9b0: 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20  n name */.      
a9c0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64 3b  const char *zId;
a9d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
a9e0: 68 65 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  he function name
a9f0: 2e 20 2a 2f 0a 20 20 20 20 20 20 46 75 6e 63 44  . */.      FuncD
aa00: 65 66 20 2a 70 44 65 66 3b 20 20 20 20 20 20 20  ef *pDef;       
aa10: 20 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d         /* Inform
aa20: 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20  ation about the 
aa30: 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  function */.    
aa40: 20 20 69 6e 74 20 65 6e 63 20 3d 20 45 4e 43 28    int enc = ENC(
aa50: 70 50 61 72 73 65 2d 3e 64 62 29 3b 20 20 2f 2a  pParse->db);  /*
aa60: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 65 6e   The database en
aa70: 63 6f 64 69 6e 67 20 2a 2f 0a 0a 20 20 20 20 20  coding */..     
aa80: 20 7a 49 64 20 3d 20 28 63 68 61 72 2a 29 70 45   zId = (char*)pE
aa90: 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 3b 0a 20 20  xpr->token.z;.  
aaa0: 20 20 20 20 6e 49 64 20 3d 20 70 45 78 70 72 2d      nId = pExpr-
aab0: 3e 74 6f 6b 65 6e 2e 6e 3b 0a 20 20 20 20 20 20  >token.n;.      
aac0: 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33 46 69  pDef = sqlite3Fi
aad0: 6e 64 46 75 6e 63 74 69 6f 6e 28 70 50 61 72 73  ndFunction(pPars
aae0: 65 2d 3e 64 62 2c 20 7a 49 64 2c 20 6e 49 64 2c  e->db, zId, nId,
aaf0: 20 6e 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20 20   n, enc, 0);.   
ab00: 20 20 20 69 66 28 20 70 44 65 66 3d 3d 30 20 29     if( pDef==0 )
ab10: 7b 0a 20 20 20 20 20 20 20 20 70 44 65 66 20 3d  {.        pDef =
ab20: 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63   sqlite3FindFunc
ab30: 74 69 6f 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c  tion(pParse->db,
ab40: 20 7a 49 64 2c 20 6e 49 64 2c 20 2d 31 2c 20 65   zId, nId, -1, e
ab50: 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  nc, 0);.        
ab60: 69 66 28 20 70 44 65 66 3d 3d 30 20 29 7b 0a 20  if( pDef==0 ){. 
ab70: 20 20 20 20 20 20 20 20 20 6e 6f 5f 73 75 63 68           no_such
ab80: 5f 66 75 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20  _func = 1;.     
ab90: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
aba0: 20 20 20 20 77 72 6f 6e 67 5f 6e 75 6d 5f 61 72      wrong_num_ar
abb0: 67 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  gs = 1;.        
abc0: 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
abd0: 20 20 20 20 20 20 20 69 73 5f 61 67 67 20 3d 20         is_agg = 
abe0: 70 44 65 66 2d 3e 78 46 75 6e 63 3d 3d 30 3b 0a  pDef->xFunc==0;.
abf0: 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20        }.#ifndef 
ac00: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48  SQLITE_OMIT_AUTH
ac10: 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 20 20 20 20  ORIZATION.      
ac20: 69 66 28 20 70 44 65 66 20 29 7b 0a 20 20 20 20  if( pDef ){.    
ac30: 20 20 20 20 61 75 74 68 20 3d 20 73 71 6c 69 74      auth = sqlit
ac40: 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
ac50: 73 65 2c 20 53 51 4c 49 54 45 5f 46 55 4e 43 54  se, SQLITE_FUNCT
ac60: 49 4f 4e 2c 20 30 2c 20 70 44 65 66 2d 3e 7a 4e  ION, 0, pDef->zN
ac70: 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ame, 0);.       
ac80: 20 69 66 28 20 61 75 74 68 21 3d 53 51 4c 49 54   if( auth!=SQLIT
ac90: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
aca0: 20 20 69 66 28 20 61 75 74 68 3d 3d 53 51 4c 49    if( auth==SQLI
acb0: 54 45 5f 44 45 4e 59 20 29 7b 0a 20 20 20 20 20  TE_DENY ){.     
acc0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
acd0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
ace0: 6e 6f 74 20 61 75 74 68 6f 72 69 7a 65 64 20 74  not authorized t
acf0: 6f 20 75 73 65 20 66 75 6e 63 74 69 6f 6e 3a 20  o use function: 
ad00: 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %s",.           
ad10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ad20: 20 20 20 20 20 20 20 20 20 70 44 65 66 2d 3e 7a           pDef->z
ad30: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Name);.         
ad40: 20 20 20 70 4e 43 2d 3e 6e 45 72 72 2b 2b 3b 0a     pNC->nErr++;.
ad50: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
ad60: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20        pExpr->op 
ad70: 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20 20  = TK_NULL;.     
ad80: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
ad90: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
ada0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66  .#endif.      if
adb0: 28 20 69 73 5f 61 67 67 20 26 26 20 21 70 4e 43  ( is_agg && !pNC
adc0: 2d 3e 61 6c 6c 6f 77 41 67 67 20 29 7b 0a 20 20  ->allowAgg ){.  
add0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
ade0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6d  orMsg(pParse, "m
adf0: 69 73 75 73 65 20 6f 66 20 61 67 67 72 65 67 61  isuse of aggrega
ae00: 74 65 20 66 75 6e 63 74 69 6f 6e 20 25 2e 2a 73  te function %.*s
ae10: 28 29 22 2c 20 6e 49 64 2c 7a 49 64 29 3b 0a 20  ()", nId,zId);. 
ae20: 20 20 20 20 20 20 20 70 4e 43 2d 3e 6e 45 72 72         pNC->nErr
ae30: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69 73 5f 61  ++;.        is_a
ae40: 67 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65  gg = 0;.      }e
ae50: 6c 73 65 20 69 66 28 20 6e 6f 5f 73 75 63 68 5f  lse if( no_such_
ae60: 66 75 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20  func ){.        
ae70: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
ae80: 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68  pParse, "no such
ae90: 20 66 75 6e 63 74 69 6f 6e 3a 20 25 2e 2a 73 22   function: %.*s"
aea0: 2c 20 6e 49 64 2c 20 7a 49 64 29 3b 0a 20 20 20  , nId, zId);.   
aeb0: 20 20 20 20 20 70 4e 43 2d 3e 6e 45 72 72 2b 2b       pNC->nErr++
aec0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
aed0: 28 20 77 72 6f 6e 67 5f 6e 75 6d 5f 61 72 67 73  ( wrong_num_args
aee0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
aef0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
af00: 73 65 2c 22 77 72 6f 6e 67 20 6e 75 6d 62 65 72  se,"wrong number
af10: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 74 6f   of arguments to
af20: 20 66 75 6e 63 74 69 6f 6e 20 25 2e 2a 73 28 29   function %.*s()
af30: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
af40: 6e 49 64 2c 20 7a 49 64 29 3b 0a 20 20 20 20 20  nId, zId);.     
af50: 20 20 20 70 4e 43 2d 3e 6e 45 72 72 2b 2b 3b 0a     pNC->nErr++;.
af60: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
af70: 28 20 69 73 5f 61 67 67 20 29 7b 0a 20 20 20 20  ( is_agg ){.    
af80: 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20      pExpr->op = 
af90: 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3b  TK_AGG_FUNCTION;
afa0: 0a 20 20 20 20 20 20 20 20 70 4e 43 2d 3e 68 61  .        pNC->ha
afb0: 73 41 67 67 20 3d 20 31 3b 0a 20 20 20 20 20 20  sAgg = 1;.      
afc0: 7d 0a 20 20 20 20 20 20 69 66 28 20 69 73 5f 61  }.      if( is_a
afd0: 67 67 20 29 20 70 4e 43 2d 3e 61 6c 6c 6f 77 41  gg ) pNC->allowA
afe0: 67 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 66 6f  gg = 0;.      fo
aff0: 72 28 69 3d 30 3b 20 70 4e 43 2d 3e 6e 45 72 72  r(i=0; pNC->nErr
b000: 3d 3d 30 20 26 26 20 69 3c 6e 3b 20 69 2b 2b 29  ==0 && i<n; i++)
b010: 7b 0a 20 20 20 20 20 20 20 20 77 61 6c 6b 45 78  {.        walkEx
b020: 70 72 54 72 65 65 28 70 4c 69 73 74 2d 3e 61 5b  prTree(pList->a[
b030: 69 5d 2e 70 45 78 70 72 2c 20 6e 61 6d 65 52 65  i].pExpr, nameRe
b040: 73 6f 6c 76 65 72 53 74 65 70 2c 20 70 4e 43 29  solverStep, pNC)
b050: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
b060: 69 66 28 20 69 73 5f 61 67 67 20 29 20 70 4e 43  if( is_agg ) pNC
b070: 2d 3e 61 6c 6c 6f 77 41 67 67 20 3d 20 31 3b 0a  ->allowAgg = 1;.
b080: 20 20 20 20 20 20 2f 2a 20 46 49 58 20 4d 45 3a        /* FIX ME:
b090: 20 20 43 6f 6d 70 75 74 65 20 70 45 78 70 72 2d    Compute pExpr-
b0a0: 3e 61 66 66 69 6e 69 74 79 20 62 61 73 65 64 20  >affinity based 
b0b0: 6f 6e 20 74 68 65 20 65 78 70 65 63 74 65 64 20  on the expected 
b0c0: 72 65 74 75 72 6e 0a 20 20 20 20 20 20 2a 2a 20  return.      ** 
b0d0: 74 79 70 65 20 6f 66 20 74 68 65 20 66 75 6e 63  type of the func
b0e0: 74 69 6f 6e 20 0a 20 20 20 20 20 20 2a 2f 0a 20  tion .      */. 
b0f0: 20 20 20 20 20 72 65 74 75 72 6e 20 69 73 5f 61       return is_a
b100: 67 67 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  gg;.    }.#ifnde
b110: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
b120: 42 51 55 45 52 59 0a 20 20 20 20 63 61 73 65 20  BQUERY.    case 
b130: 54 4b 5f 53 45 4c 45 43 54 3a 0a 20 20 20 20 63  TK_SELECT:.    c
b140: 61 73 65 20 54 4b 5f 45 58 49 53 54 53 3a 0a 23  ase TK_EXISTS:.#
b150: 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 54  endif.    case T
b160: 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69 66  K_IN: {.      if
b170: 28 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74  ( pExpr->pSelect
b180: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
b190: 6e 52 65 66 20 3d 20 70 4e 43 2d 3e 6e 52 65 66  nRef = pNC->nRef
b1a0: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
b1b0: 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a 20 20 20 20  _OMIT_CHECK.    
b1c0: 20 20 20 20 69 66 28 20 70 4e 43 2d 3e 69 73 43      if( pNC->isC
b1d0: 68 65 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20  heck ){.        
b1e0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
b1f0: 67 28 70 50 61 72 73 65 2c 22 73 75 62 71 75 65  g(pParse,"subque
b200: 72 69 65 73 20 70 72 6f 68 69 62 69 74 65 64 20  ries prohibited 
b210: 69 6e 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61  in CHECK constra
b220: 69 6e 74 73 22 29 3b 0a 20 20 20 20 20 20 20 20  ints");.        
b230: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20  }.#endif.       
b240: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 52 65   sqlite3SelectRe
b250: 73 6f 6c 76 65 28 70 50 61 72 73 65 2c 20 70 45  solve(pParse, pE
b260: 78 70 72 2d 3e 70 53 65 6c 65 63 74 2c 20 70 4e  xpr->pSelect, pN
b270: 43 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  C);.        asse
b280: 72 74 28 20 70 4e 43 2d 3e 6e 52 65 66 3e 3d 6e  rt( pNC->nRef>=n
b290: 52 65 66 20 29 3b 0a 20 20 20 20 20 20 20 20 69  Ref );.        i
b2a0: 66 28 20 6e 52 65 66 21 3d 70 4e 43 2d 3e 6e 52  f( nRef!=pNC->nR
b2b0: 65 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ef ){.          
b2c0: 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28  ExprSetProperty(
b2d0: 70 45 78 70 72 2c 20 45 50 5f 56 61 72 53 65 6c  pExpr, EP_VarSel
b2e0: 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ect);.        }.
b2f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
b300: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  eak;.    }.#ifnd
b310: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
b320: 48 45 43 4b 0a 20 20 20 20 63 61 73 65 20 54 4b  HECK.    case TK
b330: 5f 56 41 52 49 41 42 4c 45 3a 20 7b 0a 20 20 20  _VARIABLE: {.   
b340: 20 20 20 69 66 28 20 70 4e 43 2d 3e 69 73 43 68     if( pNC->isCh
b350: 65 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 73  eck ){.        s
b360: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
b370: 50 61 72 73 65 2c 22 70 61 72 61 6d 65 74 65 72  Parse,"parameter
b380: 73 20 70 72 6f 68 69 62 69 74 65 64 20 69 6e 20  s prohibited in 
b390: 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74  CHECK constraint
b3a0: 73 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  s");.      }.   
b3b0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
b3c0: 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 72 65 74  #endif.  }.  ret
b3d0: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
b3e0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 6c  This routine wal
b3f0: 6b 73 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  ks an expression
b400: 20 74 72 65 65 20 61 6e 64 20 72 65 73 6f 6c 76   tree and resolv
b410: 65 73 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  es references to
b420: 0a 2a 2a 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e  .** table column
b430: 73 2e 20 20 4e 6f 64 65 73 20 6f 66 20 74 68 65  s.  Nodes of the
b440: 20 66 6f 72 6d 20 49 44 2e 49 44 20 6f 72 20 49   form ID.ID or I
b450: 44 20 72 65 73 6f 6c 76 65 20 69 6e 74 6f 20 61  D resolve into a
b460: 6e 0a 2a 2a 20 69 6e 64 65 78 20 74 6f 20 74 68  n.** index to th
b470: 65 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 74  e table in the t
b480: 61 62 6c 65 20 6c 69 73 74 20 61 6e 64 20 61 20  able list and a 
b490: 63 6f 6c 75 6d 6e 20 6f 66 66 73 65 74 2e 20 20  column offset.  
b4a0: 54 68 65 20 0a 2a 2a 20 45 78 70 72 2e 6f 70 63  The .** Expr.opc
b4b0: 6f 64 65 20 66 6f 72 20 73 75 63 68 20 6e 6f 64  ode for such nod
b4c0: 65 73 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f  es is changed to
b4d0: 20 54 4b 5f 43 4f 4c 55 4d 4e 2e 20 20 54 68 65   TK_COLUMN.  The
b4e0: 20 45 78 70 72 2e 69 54 61 62 6c 65 0a 2a 2a 20   Expr.iTable.** 
b4f0: 76 61 6c 75 65 20 69 73 20 63 68 61 6e 67 65 64  value is changed
b500: 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66   to the index of
b510: 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 64 20   the referenced 
b520: 74 61 62 6c 65 20 69 6e 20 70 54 61 62 4c 69 73  table in pTabLis
b530: 74 0a 2a 2a 20 70 6c 75 73 20 74 68 65 20 22 62  t.** plus the "b
b540: 61 73 65 22 20 76 61 6c 75 65 2e 20 20 54 68 65  ase" value.  The
b550: 20 62 61 73 65 20 76 61 6c 75 65 20 77 69 6c 6c   base value will
b560: 20 75 6c 74 69 6d 61 74 65 6c 79 20 62 65 63 6f   ultimately beco
b570: 6d 65 20 74 68 65 0a 2a 2a 20 56 44 42 45 20 63  me the.** VDBE c
b580: 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72  ursor number for
b590: 20 61 20 63 75 72 73 6f 72 20 74 68 61 74 20 69   a cursor that i
b5a0: 73 20 70 6f 69 6e 74 69 6e 67 20 69 6e 74 6f 20  s pointing into 
b5b0: 74 68 65 20 72 65 66 65 72 65 6e 63 65 64 0a 2a  the referenced.*
b5c0: 2a 20 74 61 62 6c 65 2e 20 20 54 68 65 20 45 78  * table.  The Ex
b5d0: 70 72 2e 69 43 6f 6c 75 6d 6e 20 76 61 6c 75 65  pr.iColumn value
b5e0: 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f 20 74   is changed to t
b5f0: 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20  he index of the 
b600: 63 6f 6c 75 6d 6e 20 0a 2a 2a 20 6f 66 20 74 68  column .** of th
b610: 65 20 72 65 66 65 72 65 6e 63 65 64 20 74 61 62  e referenced tab
b620: 6c 65 2e 20 20 54 68 65 20 45 78 70 72 2e 69 43  le.  The Expr.iC
b630: 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 66 6f 72 20  olumn value for 
b640: 74 68 65 20 73 70 65 63 69 61 6c 0a 2a 2a 20 52  the special.** R
b650: 4f 57 49 44 20 63 6f 6c 75 6d 6e 20 69 73 20 2d  OWID column is -
b660: 31 2e 20 20 41 6e 79 20 49 4e 54 45 47 45 52 20  1.  Any INTEGER 
b670: 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75  PRIMARY KEY colu
b680: 6d 6e 20 69 73 20 74 72 69 65 64 20 61 73 20 61  mn is tried as a
b690: 6e 0a 2a 2a 20 61 6c 69 61 73 20 66 6f 72 20 52  n.** alias for R
b6a0: 4f 57 49 44 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f  OWID..**.** Also
b6b0: 20 72 65 73 6f 6c 76 65 20 66 75 6e 63 74 69 6f   resolve functio
b6c0: 6e 20 6e 61 6d 65 73 20 61 6e 64 20 63 68 65 63  n names and chec
b6d0: 6b 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 73 20  k the functions 
b6e0: 66 6f 72 20 70 72 6f 70 65 72 0a 2a 2a 20 75 73  for proper.** us
b6f0: 61 67 65 2e 20 20 4d 61 6b 65 20 73 75 72 65 20  age.  Make sure 
b700: 61 6c 6c 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d  all function nam
b710: 65 73 20 61 72 65 20 72 65 63 6f 67 6e 69 7a 65  es are recognize
b720: 64 20 61 6e 64 20 61 6c 6c 20 66 75 6e 63 74 69  d and all functi
b730: 6f 6e 73 0a 2a 2a 20 68 61 76 65 20 74 68 65 20  ons.** have the 
b740: 63 6f 72 72 65 63 74 20 6e 75 6d 62 65 72 20 6f  correct number o
b750: 66 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 4c 65  f arguments.  Le
b760: 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ave an error mes
b770: 73 61 67 65 0a 2a 2a 20 69 6e 20 70 50 61 72 73  sage.** in pPars
b780: 65 2d 3e 7a 45 72 72 4d 73 67 20 69 66 20 61 6e  e->zErrMsg if an
b790: 79 74 68 69 6e 67 20 69 73 20 61 6d 69 73 73 2e  ything is amiss.
b7a0: 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d    Return the num
b7b0: 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 0a 2a  ber of errors..*
b7c0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72  *.** If the expr
b7d0: 65 73 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20  ession contains 
b7e0: 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
b7f0: 6f 6e 73 20 74 68 65 6e 20 73 65 74 20 74 68 65  ons then set the
b800: 20 45 50 5f 41 67 67 0a 2a 2a 20 70 72 6f 70 65   EP_Agg.** prope
b810: 72 74 79 20 6f 6e 20 74 68 65 20 65 78 70 72 65  rty on the expre
b820: 73 73 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ssion..*/.int sq
b830: 6c 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76 65  lite3ExprResolve
b840: 4e 61 6d 65 73 28 20 0a 20 20 4e 61 6d 65 43 6f  Names( .  NameCo
b850: 6e 74 65 78 74 20 2a 70 4e 43 2c 20 20 20 20 20  ntext *pNC,     
b860: 20 20 2f 2a 20 4e 61 6d 65 73 70 61 63 65 20 74    /* Namespace t
b870: 6f 20 72 65 73 6f 6c 76 65 20 65 78 70 72 65 73  o resolve expres
b880: 73 69 6f 6e 73 20 69 6e 2e 20 2a 2f 0a 20 20 45  sions in. */.  E
b890: 78 70 72 20 2a 70 45 78 70 72 20 20 20 20 20 20  xpr *pExpr      
b8a0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78         /* The ex
b8b0: 70 72 65 73 73 69 6f 6e 20 74 6f 20 62 65 20 61  pression to be a
b8c0: 6e 61 6c 79 7a 65 64 2e 20 2a 2f 0a 29 7b 0a 20  nalyzed. */.){. 
b8d0: 20 69 6e 74 20 73 61 76 65 64 48 61 73 41 67 67   int savedHasAgg
b8e0: 3b 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30  ;.  if( pExpr==0
b8f0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 23 69 66   ) return 0;.#if
b900: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
b910: 54 45 53 54 29 20 7c 7c 20 53 51 4c 49 54 45 5f  TEST) || SQLITE_
b920: 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48 3e 30  MAX_EXPR_DEPTH>0
b930: 0a 20 20 69 66 28 20 28 70 45 78 70 72 2d 3e 6e  .  if( (pExpr->n
b940: 48 65 69 67 68 74 2b 70 4e 43 2d 3e 70 50 61 72  Height+pNC->pPar
b950: 73 65 2d 3e 6e 48 65 69 67 68 74 29 3e 53 51 4c  se->nHeight)>SQL
b960: 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50  ITE_MAX_EXPR_DEP
b970: 54 48 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  TH ){.    sqlite
b980: 33 45 72 72 6f 72 4d 73 67 28 70 4e 43 2d 3e 70  3ErrorMsg(pNC->p
b990: 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 22  Parse, .       "
b9a0: 45 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20  Expression tree 
b9b0: 69 73 20 74 6f 6f 20 6c 61 72 67 65 20 28 6d 61  is too large (ma
b9c0: 78 69 6d 75 6d 20 64 65 70 74 68 20 25 64 29 22  ximum depth %d)"
b9d0: 2c 0a 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f  ,.       SQLITE_
b9e0: 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48 0a 20  MAX_EXPR_DEPTH. 
b9f0: 20 20 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e     );.    return
ba00: 20 31 3b 0a 20 20 7d 0a 20 20 70 4e 43 2d 3e 70   1;.  }.  pNC->p
ba10: 50 61 72 73 65 2d 3e 6e 48 65 69 67 68 74 20 2b  Parse->nHeight +
ba20: 3d 20 70 45 78 70 72 2d 3e 6e 48 65 69 67 68 74  = pExpr->nHeight
ba30: 3b 0a 23 65 6e 64 69 66 0a 20 20 73 61 76 65 64  ;.#endif.  saved
ba40: 48 61 73 41 67 67 20 3d 20 70 4e 43 2d 3e 68 61  HasAgg = pNC->ha
ba50: 73 41 67 67 3b 0a 20 20 70 4e 43 2d 3e 68 61 73  sAgg;.  pNC->has
ba60: 41 67 67 20 3d 20 30 3b 0a 20 20 77 61 6c 6b 45  Agg = 0;.  walkE
ba70: 78 70 72 54 72 65 65 28 70 45 78 70 72 2c 20 6e  xprTree(pExpr, n
ba80: 61 6d 65 52 65 73 6f 6c 76 65 72 53 74 65 70 2c  ameResolverStep,
ba90: 20 70 4e 43 29 3b 0a 23 69 66 20 64 65 66 69 6e   pNC);.#if defin
baa0: 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 20  ed(SQLITE_TEST) 
bab0: 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58  || SQLITE_MAX_EX
bac0: 50 52 5f 44 45 50 54 48 3e 30 0a 20 20 70 4e 43  PR_DEPTH>0.  pNC
bad0: 2d 3e 70 50 61 72 73 65 2d 3e 6e 48 65 69 67 68  ->pParse->nHeigh
bae0: 74 20 2d 3d 20 70 45 78 70 72 2d 3e 6e 48 65 69  t -= pExpr->nHei
baf0: 67 68 74 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66  ght;.#endif.  if
bb00: 28 20 70 4e 43 2d 3e 6e 45 72 72 3e 30 20 29 7b  ( pNC->nErr>0 ){
bb10: 0a 20 20 20 20 45 78 70 72 53 65 74 50 72 6f 70  .    ExprSetProp
bb20: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 45  erty(pExpr, EP_E
bb30: 72 72 6f 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28  rror);.  }.  if(
bb40: 20 70 4e 43 2d 3e 68 61 73 41 67 67 20 29 7b 0a   pNC->hasAgg ){.
bb50: 20 20 20 20 45 78 70 72 53 65 74 50 72 6f 70 65      ExprSetPrope
bb60: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 41 67  rty(pExpr, EP_Ag
bb70: 67 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  g);.  }else if( 
bb80: 73 61 76 65 64 48 61 73 41 67 67 20 29 7b 0a 20  savedHasAgg ){. 
bb90: 20 20 20 70 4e 43 2d 3e 68 61 73 41 67 67 20 3d     pNC->hasAgg =
bba0: 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   1;.  }.  return
bbb0: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
bbc0: 28 70 45 78 70 72 2c 20 45 50 5f 45 72 72 6f 72  (pExpr, EP_Error
bbd0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 70 6f  );.}../*.** A po
bbe0: 69 6e 74 65 72 20 69 6e 73 74 61 6e 63 65 20 6f  inter instance o
bbf0: 66 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  f this structure
bc00: 20 69 73 20 75 73 65 64 20 74 6f 20 70 61 73 73   is used to pass
bc10: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20   information.** 
bc20: 74 68 72 6f 75 67 68 20 77 61 6c 6b 45 78 70 72  through walkExpr
bc30: 54 72 65 65 20 69 6e 74 6f 20 63 6f 64 65 53 75  Tree into codeSu
bc40: 62 71 75 65 72 79 53 74 65 70 28 29 2e 0a 2a 2f  bqueryStep()..*/
bc50: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
bc60: 51 75 65 72 79 43 6f 64 65 72 20 51 75 65 72 79  QueryCoder Query
bc70: 43 6f 64 65 72 3b 0a 73 74 72 75 63 74 20 51 75  Coder;.struct Qu
bc80: 65 72 79 43 6f 64 65 72 20 7b 0a 20 20 50 61 72  eryCoder {.  Par
bc90: 73 65 20 2a 70 50 61 72 73 65 3b 20 20 20 20 20  se *pParse;     
bca0: 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67    /* The parsing
bcb0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 4e 61   context */.  Na
bcc0: 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 3b 20  meContext *pNC; 
bcd0: 20 20 20 2f 2a 20 4e 61 6d 65 73 70 61 63 65 20     /* Namespace 
bce0: 6f 66 20 66 69 72 73 74 20 65 6e 63 6c 6f 73 69  of first enclosi
bcf0: 6e 67 20 71 75 65 72 79 20 2a 2f 0a 7d 3b 0a 0a  ng query */.};..
bd00: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
bd10: 53 54 0a 20 20 69 6e 74 20 73 71 6c 69 74 65 33  ST.  int sqlite3
bd20: 5f 65 6e 61 62 6c 65 5f 69 6e 5f 6f 70 74 20 3d  _enable_in_opt =
bd30: 20 31 3b 0a 23 65 6c 73 65 0a 20 20 23 64 65 66   1;.#else.  #def
bd40: 69 6e 65 20 73 71 6c 69 74 65 33 5f 65 6e 61 62  ine sqlite3_enab
bd50: 6c 65 5f 69 6e 5f 6f 70 74 20 31 0a 23 65 6e 64  le_in_opt 1.#end
bd60: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  if../*.** This f
bd70: 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
bd80: 62 79 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74  by the implement
bd90: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 49 4e 20  ation of the IN 
bda0: 28 2e 2e 2e 29 20 6f 70 65 72 61 74 6f 72 2e 0a  (...) operator..
bdb0: 2a 2a 20 49 74 27 73 20 6a 6f 62 20 69 73 20 74  ** It's job is t
bdc0: 6f 20 66 69 6e 64 20 6f 72 20 63 72 65 61 74 65  o find or create
bdd0: 20 61 20 62 2d 74 72 65 65 20 73 74 72 75 63 74   a b-tree struct
bde0: 75 72 65 20 74 68 61 74 20 6d 61 79 20 62 65 20  ure that may be 
bdf0: 75 73 65 64 0a 2a 2a 20 65 69 74 68 65 72 20 74  used.** either t
be00: 6f 20 74 65 73 74 20 66 6f 72 20 6d 65 6d 62 65  o test for membe
be10: 72 73 68 69 70 20 6f 66 20 74 68 65 20 28 2e 2e  rship of the (..
be20: 2e 29 20 73 65 74 20 6f 72 20 74 6f 20 69 74 65  .) set or to ite
be30: 72 61 74 65 20 74 68 72 6f 75 67 68 0a 2a 2a 20  rate through.** 
be40: 69 74 73 20 6d 65 6d 62 65 72 73 2c 20 73 6b 69  its members, ski
be50: 70 70 69 6e 67 20 64 75 70 6c 69 63 61 74 65 73  pping duplicates
be60: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 75 72 73  ..**.** The curs
be70: 6f 72 20 6f 70 65 6e 65 64 20 6f 6e 20 74 68 65  or opened on the
be80: 20 73 74 72 75 63 74 75 72 65 20 28 64 61 74 61   structure (data
be90: 62 61 73 65 20 74 61 62 6c 65 2c 20 64 61 74 61  base table, data
bea0: 62 61 73 65 20 69 6e 64 65 78 20 0a 2a 2a 20 6f  base index .** o
beb0: 72 20 65 70 68 65 72 6d 61 6c 20 74 61 62 6c 65  r ephermal table
bec0: 29 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70  ) is stored in p
bed0: 58 2d 3e 69 54 61 62 6c 65 20 62 65 66 6f 72 65  X->iTable before
bee0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
bef0: 65 74 75 72 6e 73 2e 0a 2a 2a 20 54 68 65 20 72  eturns..** The r
bf00: 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20 69 6e  eturned value in
bf10: 64 69 63 61 74 65 73 20 74 68 65 20 73 74 72 75  dicates the stru
bf20: 63 74 75 72 65 20 74 79 70 65 2c 20 61 73 20 66  cture type, as f
bf30: 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ollows:.**.**   
bf40: 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 20 2d  IN_INDEX_ROWID -
bf50: 20 54 68 65 20 63 75 72 73 6f 72 20 77 61 73 20   The cursor was 
bf60: 6f 70 65 6e 65 64 20 6f 6e 20 61 20 64 61 74 61  opened on a data
bf70: 62 61 73 65 20 74 61 62 6c 65 2e 0a 2a 2a 20 20  base table..**  
bf80: 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 20   IN_INDEX_INDEX 
bf90: 2d 20 54 68 65 20 63 75 72 73 6f 72 20 77 61 73  - The cursor was
bfa0: 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 64 61 74   opened on a dat
bfb0: 61 62 61 73 65 20 69 6e 64 65 78 2e 0a 2a 2a 20  abase index..** 
bfc0: 20 20 49 4e 5f 49 4e 44 45 58 5f 45 50 48 20 2d    IN_INDEX_EPH -
bfd0: 20 20 20 54 68 65 20 63 75 72 73 6f 72 20 77 61     The cursor wa
bfe0: 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 73 70  s opened on a sp
bff0: 65 63 69 61 6c 6c 79 20 63 72 65 61 74 65 64 20  ecially created 
c000: 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  and.**          
c010: 20 20 20 20 20 20 20 20 20 20 70 6f 70 75 6c 61            popula
c020: 74 65 64 20 65 70 68 65 72 65 6d 61 6c 20 74 61  ted epheremal ta
c030: 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78  ble..**.** An ex
c040: 69 73 74 69 6e 67 20 73 74 72 75 63 74 75 72 65  isting structure
c050: 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 75 73 65   may only be use
c060: 64 20 69 66 20 74 68 65 20 53 45 4c 45 43 54 20  d if the SELECT 
c070: 69 73 20 6f 66 20 74 68 65 20 73 69 6d 70 6c 65  is of the simple
c080: 0a 2a 2a 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20  .** form:.**.** 
c090: 20 20 20 20 53 45 4c 45 43 54 20 3c 63 6f 6c 75      SELECT <colu
c0a0: 6d 6e 3e 20 46 52 4f 4d 20 3c 74 61 62 6c 65 3e  mn> FROM <table>
c0b0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6d 75  .**.** If the mu
c0c0: 73 74 42 65 55 6e 69 71 75 65 20 70 61 72 61 6d  stBeUnique param
c0d0: 65 74 65 72 20 69 73 20 66 61 6c 73 65 2c 20 74  eter is false, t
c0e0: 68 65 20 73 74 72 75 63 74 75 72 65 20 77 69 6c  he structure wil
c0f0: 6c 20 62 65 20 75 73 65 64 20 0a 2a 2a 20 66 6f  l be used .** fo
c100: 72 20 66 61 73 74 20 73 65 74 20 6d 65 6d 62 65  r fast set membe
c110: 72 73 68 69 70 20 74 65 73 74 73 2e 20 49 6e 20  rship tests. In 
c120: 74 68 69 73 20 63 61 73 65 20 61 6e 20 65 70 68  this case an eph
c130: 65 72 65 6d 61 6c 20 74 61 62 6c 65 20 6d 75 73  eremal table mus
c140: 74 20 0a 2a 2a 20 62 65 20 75 73 65 64 20 75 6e  t .** be used un
c150: 6c 65 73 73 20 3c 63 6f 6c 75 6d 6e 3e 20 69 73  less <column> is
c160: 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d   an INTEGER PRIM
c170: 41 52 59 20 4b 45 59 20 6f 72 20 61 6e 20 69 6e  ARY KEY or an in
c180: 64 65 78 20 63 61 6e 20 0a 2a 2a 20 62 65 20 66  dex can .** be f
c190: 6f 75 6e 64 20 77 69 74 68 20 3c 63 6f 6c 75 6d  ound with <colum
c1a0: 6e 3e 20 61 73 20 69 74 73 20 6c 65 66 74 2d 6d  n> as its left-m
c1b0: 6f 73 74 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a 0a 2a  ost column..**.*
c1c0: 2a 20 49 66 20 6d 75 73 74 42 65 55 6e 69 71 75  * If mustBeUniqu
c1d0: 65 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  e is true, then 
c1e0: 74 68 65 20 73 74 72 75 63 74 75 72 65 20 77 69  the structure wi
c1f0: 6c 6c 20 62 65 20 75 73 65 64 20 74 6f 20 69 74  ll be used to it
c200: 65 72 61 74 65 0a 2a 2a 20 74 68 72 6f 75 67 68  erate.** through
c210: 20 74 68 65 20 73 65 74 20 6d 65 6d 62 65 72 73   the set members
c220: 2c 20 73 6b 69 70 70 69 6e 67 20 61 6e 79 20 64  , skipping any d
c230: 75 70 6c 69 63 61 74 65 73 2e 20 49 6e 20 74 68  uplicates. In th
c240: 69 73 20 63 61 73 65 20 61 6e 0a 2a 2a 20 65 70  is case an.** ep
c250: 68 65 72 65 6d 61 6c 20 74 61 62 6c 65 20 6d 75  heremal table mu
c260: 73 74 20 62 65 20 75 73 65 64 20 75 6e 6c 65 73  st be used unles
c270: 73 20 74 68 65 20 73 65 6c 65 63 74 65 64 20 3c  s the selected <
c280: 63 6f 6c 75 6d 6e 3e 20 69 73 20 67 75 61 72 61  column> is guara
c290: 6e 74 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20 75  nteed.** to be u
c2a0: 6e 69 71 75 65 20 2d 20 65 69 74 68 65 72 20 62  nique - either b
c2b0: 65 63 61 75 73 65 20 69 74 20 69 73 20 61 6e 20  ecause it is an 
c2c0: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
c2d0: 4b 45 59 20 6f 72 20 69 74 0a 2a 2a 20 69 73 20  KEY or it.** is 
c2e0: 75 6e 69 71 75 65 20 62 79 20 76 69 72 74 75 65  unique by virtue
c2f0: 20 6f 66 20 61 20 63 6f 6e 73 74 72 61 69 6e 74   of a constraint
c300: 20 6f 72 20 69 6d 70 6c 69 63 69 74 20 69 6e 64   or implicit ind
c310: 65 78 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ex..*/.#ifndef S
c320: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
c330: 45 52 59 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  ERY.int sqlite3F
c340: 69 6e 64 49 6e 49 6e 64 65 78 28 50 61 72 73 65  indInIndex(Parse
c350: 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
c360: 70 58 2c 20 69 6e 74 20 6d 75 73 74 42 65 55 6e  pX, int mustBeUn
c370: 69 71 75 65 29 7b 0a 20 20 53 65 6c 65 63 74 20  ique){.  Select 
c380: 2a 70 3b 0a 20 20 69 6e 74 20 65 54 79 70 65 20  *p;.  int eType 
c390: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 54 61 62 20  = 0;.  int iTab 
c3a0: 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
c3b0: 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c  ;..  /* The foll
c3c0: 77 69 6e 67 20 69 66 28 2e 2e 2e 29 20 65 78 70  wing if(...) exp
c3d0: 72 65 73 73 69 6f 6e 20 69 73 20 74 72 75 65 20  ression is true 
c3e0: 69 66 20 74 68 65 20 53 45 4c 45 43 54 20 69 73  if the SELECT is
c3f0: 20 6f 66 20 74 68 65 20 0a 20 20 2a 2a 20 73 69   of the .  ** si
c400: 6d 70 6c 65 20 66 6f 72 6d 3a 0a 20 20 2a 2a 0a  mple form:.  **.
c410: 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20    **     SELECT 
c420: 3c 63 6f 6c 75 6d 6e 3e 20 46 52 4f 4d 20 3c 74  <column> FROM <t
c430: 61 62 6c 65 3e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  able>.  **.  ** 
c440: 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 63  If this is the c
c450: 61 73 65 2c 20 69 74 20 6d 61 79 20 62 65 20 70  ase, it may be p
c460: 6f 73 73 69 62 6c 65 20 74 6f 20 75 73 65 20 61  ossible to use a
c470: 6e 20 65 78 69 73 74 69 6e 67 20 74 61 62 6c 65  n existing table
c480: 0a 20 20 2a 2a 20 6f 72 20 69 6e 64 65 78 20 69  .  ** or index i
c490: 6e 73 74 65 61 64 20 6f 66 20 67 65 6e 65 72 61  nstead of genera
c4a0: 74 69 6e 67 20 61 6e 20 65 70 68 65 72 65 6d 61  ting an epherema
c4b0: 6c 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20  l table..  */.  
c4c0: 69 66 28 20 73 71 6c 69 74 65 33 5f 65 6e 61 62  if( sqlite3_enab
c4d0: 6c 65 5f 69 6e 5f 6f 70 74 0a 20 20 20 26 26 20  le_in_opt.   && 
c4e0: 28 70 3d 70 58 2d 3e 70 53 65 6c 65 63 74 29 20  (p=pX->pSelect) 
c4f0: 26 26 20 21 70 2d 3e 70 50 72 69 6f 72 0a 20 20  && !p->pPrior.  
c500: 20 26 26 20 21 70 2d 3e 69 73 44 69 73 74 69 6e   && !p->isDistin
c510: 63 74 20 26 26 20 21 70 2d 3e 69 73 41 67 67 20  ct && !p->isAgg 
c520: 26 26 20 21 70 2d 3e 70 47 72 6f 75 70 42 79 0a  && !p->pGroupBy.
c530: 20 20 20 26 26 20 70 2d 3e 70 53 72 63 20 26 26     && p->pSrc &&
c540: 20 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3d 3d   p->pSrc->nSrc==
c550: 31 20 26 26 20 21 70 2d 3e 70 53 72 63 2d 3e 61  1 && !p->pSrc->a
c560: 5b 30 5d 2e 70 53 65 6c 65 63 74 0a 20 20 20 26  [0].pSelect.   &
c570: 26 20 21 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d  & !p->pSrc->a[0]
c580: 2e 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 20  .pTab->pSelect  
c590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c5a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c5b0: 0a 20 20 20 26 26 20 70 2d 3e 70 45 4c 69 73 74  .   && p->pEList
c5c0: 2d 3e 6e 45 78 70 72 3d 3d 31 20 26 26 20 70 2d  ->nExpr==1 && p-
c5d0: 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45  >pEList->a[0].pE
c5e0: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  xpr->op==TK_COLU
c5f0: 4d 4e 0a 20 20 20 26 26 20 21 70 2d 3e 70 4c 69  MN.   && !p->pLi
c600: 6d 69 74 20 26 26 20 21 70 2d 3e 70 4f 66 66 73  mit && !p->pOffs
c610: 65 74 20 26 26 20 21 70 2d 3e 70 57 68 65 72 65  et && !p->pWhere
c620: 0a 20 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  .  ){.    sqlite
c630: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
c640: 64 62 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70  db;.    Index *p
c650: 49 64 78 3b 0a 20 20 20 20 45 78 70 72 20 2a 70  Idx;.    Expr *p
c660: 45 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69 73 74  Expr = p->pEList
c670: 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[0].pExpr;.  
c680: 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 45 78    int iCol = pEx
c690: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20  pr->iColumn;.   
c6a0: 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74   Vdbe *v = sqlit
c6b0: 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
c6c0: 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73 20  );..    /* This 
c6d0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79  function is only
c6e0: 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 74 77 6f   called from two
c6f0: 20 70 6c 61 63 65 73 2e 20 49 6e 20 62 6f 74 68   places. In both
c700: 20 63 61 73 65 73 20 74 68 65 20 76 64 62 65 0a   cases the vdbe.
c710: 20 20 20 20 2a 2a 20 68 61 73 20 61 6c 72 65 61      ** has alrea
c720: 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  dy been allocate
c730: 64 2e 20 53 6f 20 61 73 73 75 6d 65 20 73 71 6c  d. So assume sql
c740: 69 74 65 33 47 65 74 56 64 62 65 28 29 20 69 73  ite3GetVdbe() is
c750: 20 61 6c 77 61 79 73 0a 20 20 20 20 2a 2a 20 73   always.    ** s
c760: 75 63 63 65 73 73 66 75 6c 20 68 65 72 65 2e 0a  uccessful here..
c770: 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
c780: 74 28 76 29 3b 0a 20 20 20 20 69 66 28 20 69 43  t(v);.    if( iC
c790: 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  ol<0 ){.      in
c7a0: 74 20 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73  t iMem = ++pPars
c7b0: 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 69  e->nMem;.      i
c7c0: 6e 74 20 69 41 64 64 72 3b 0a 20 20 20 20 20 20  nt iAddr;.      
c7d0: 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 2d  Table *pTab = p-
c7e0: 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62  >pSrc->a[0].pTab
c7f0: 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 44 62 20  ;.      int iDb 
c800: 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
c810: 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d  oIndex(db, pTab-
c820: 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20  >pSchema);.     
c830: 20 73 71 6c 69 74 65 33 56 64 62 65 55 73 65 73   sqlite3VdbeUses
c840: 42 74 72 65 65 28 76 2c 20 69 44 62 29 3b 0a 0a  Btree(v, iDb);..
c850: 20 20 20 20 20 20 69 41 64 64 72 20 3d 20 73 71        iAddr = sq
c860: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
c870: 76 2c 20 4f 50 5f 49 66 2c 20 69 4d 65 6d 29 3b  v, OP_If, iMem);
c880: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
c890: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
c8a0: 6e 74 65 67 65 72 2c 20 31 2c 20 69 4d 65 6d 29  nteger, 1, iMem)
c8b0: 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ;..      sqlite3
c8c0: 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65  OpenTable(pParse
c8d0: 2c 20 69 54 61 62 2c 20 69 44 62 2c 20 70 54 61  , iTab, iDb, pTa
c8e0: 62 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 29 3b  b, OP_OpenRead);
c8f0: 0a 20 20 20 20 20 20 65 54 79 70 65 20 3d 20 49  .      eType = I
c900: 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 3b 0a 0a  N_INDEX_ROWID;..
c910: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
c920: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 69 41 64  eJumpHere(v, iAd
c930: 64 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  dr);.    }else{.
c940: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6c        /* The col
c950: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
c960: 75 73 65 64 20 62 79 20 74 68 65 20 63 6f 6d 70  used by the comp
c970: 61 72 69 73 6f 6e 2e 20 49 66 20 61 6e 20 69 6e  arison. If an in
c980: 64 65 78 20 69 73 20 74 6f 20 0a 20 20 20 20 20  dex is to .     
c990: 20 2a 2a 20 62 65 20 75 73 65 64 20 69 6e 20 70   ** be used in p
c9a0: 6c 61 63 65 20 6f 66 20 61 20 74 65 6d 70 2d 74  lace of a temp-t
c9b0: 61 62 6c 65 2c 20 69 74 20 6d 75 73 74 20 62 65  able, it must be
c9c0: 20 6f 72 64 65 72 65 64 20 61 63 63 6f 72 64 69   ordered accordi
c9d0: 6e 67 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 74  ng.      ** to t
c9e0: 68 69 73 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  his collation se
c9f0: 71 75 65 6e 63 65 2e 0a 20 20 20 20 20 20 2a 2f  quence..      */
ca00: 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  .      CollSeq *
ca10: 70 52 65 71 20 3d 20 73 71 6c 69 74 65 33 42 69  pReq = sqlite3Bi
ca20: 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53  naryCompareCollS
ca30: 65 71 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70  eq(pParse, pX->p
ca40: 4c 65 66 74 2c 20 70 45 78 70 72 29 3b 0a 0a 20  Left, pExpr);.. 
ca50: 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68       /* Check th
ca60: 61 74 20 74 68 65 20 61 66 66 69 6e 69 74 79 20  at the affinity 
ca70: 74 68 61 74 20 77 69 6c 6c 20 62 65 20 75 73 65  that will be use
ca80: 64 20 74 6f 20 70 65 72 66 6f 72 6d 20 74 68 65  d to perform the
ca90: 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6d 70 61   .      ** compa
caa0: 72 69 73 6f 6e 20 69 73 20 74 68 65 20 73 61 6d  rison is the sam
cab0: 65 20 61 73 20 74 68 65 20 61 66 66 69 6e 69 74  e as the affinit
cac0: 79 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2e  y of the column.
cad0: 20 49 66 0a 20 20 20 20 20 20 2a 2a 20 69 74 20   If.      ** it 
cae0: 69 73 20 6e 6f 74 2c 20 69 74 20 69 73 20 6e 6f  is not, it is no
caf0: 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 75 73  t possible to us
cb00: 65 20 61 6e 79 20 69 6e 64 65 78 2e 0a 20 20 20  e any index..   
cb10: 20 20 20 2a 2f 0a 20 20 20 20 20 20 54 61 62 6c     */.      Tabl
cb20: 65 20 2a 70 54 61 62 20 3d 20 70 2d 3e 70 53 72  e *pTab = p->pSr
cb30: 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 20 20  c->a[0].pTab;.  
cb40: 20 20 20 20 63 68 61 72 20 61 66 66 20 3d 20 63      char aff = c
cb50: 6f 6d 70 61 72 69 73 6f 6e 41 66 66 69 6e 69 74  omparisonAffinit
cb60: 79 28 70 58 29 3b 0a 20 20 20 20 20 20 69 6e 74  y(pX);.      int
cb70: 20 61 66 66 69 6e 69 74 79 5f 6f 6b 20 3d 20 28   affinity_ok = (
cb80: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
cb90: 2e 61 66 66 69 6e 69 74 79 3d 3d 61 66 66 7c 7c  .affinity==aff||
cba0: 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
cbb0: 4e 4f 4e 45 29 3b 0a 0a 20 20 20 20 20 20 66 6f  NONE);..      fo
cbc0: 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  r(pIdx=pTab->pIn
cbd0: 64 65 78 3b 20 70 49 64 78 20 26 26 20 65 54 79  dex; pIdx && eTy
cbe0: 70 65 3d 3d 30 20 26 26 20 61 66 66 69 6e 69 74  pe==0 && affinit
cbf0: 79 5f 6f 6b 3b 20 70 49 64 78 3d 70 49 64 78 2d  y_ok; pIdx=pIdx-
cc00: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20  >pNext){.       
cc10: 20 69 66 28 20 28 70 49 64 78 2d 3e 61 69 43 6f   if( (pIdx->aiCo
cc20: 6c 75 6d 6e 5b 30 5d 3d 3d 69 43 6f 6c 29 0a 20  lumn[0]==iCol). 
cc30: 20 20 20 20 20 20 20 20 26 26 20 28 70 52 65 71          && (pReq
cc40: 3d 3d 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c  ==sqlite3FindCol
cc50: 6c 53 65 71 28 64 62 2c 20 45 4e 43 28 64 62 29  lSeq(db, ENC(db)
cc60: 2c 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 30  , pIdx->azColl[0
cc70: 5d 2c 20 2d 31 2c 20 30 29 29 0a 20 20 20 20 20  ], -1, 0)).     
cc80: 20 20 20 20 26 26 20 28 21 6d 75 73 74 42 65 55      && (!mustBeU
cc90: 6e 69 71 75 65 20 7c 7c 20 28 70 49 64 78 2d 3e  nique || (pIdx->
cca0: 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 26 26 20 70 49  nColumn==1 && pI
ccb0: 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f  dx->onError!=OE_
ccc0: 4e 6f 6e 65 29 29 0a 20 20 20 20 20 20 20 20 29  None)).        )
ccd0: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
cce0: 69 44 62 3b 0a 20 20 20 20 20 20 20 20 20 20 69  iDb;.          i
ccf0: 6e 74 20 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72  nt iMem = ++pPar
cd00: 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
cd10: 20 20 20 20 69 6e 74 20 69 41 64 64 72 3b 0a 20      int iAddr;. 
cd20: 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 70           char *p
cd30: 4b 65 79 3b 0a 20 20 0a 20 20 20 20 20 20 20 20  Key;.  .        
cd40: 20 20 70 4b 65 79 20 3d 20 28 63 68 61 72 20 2a    pKey = (char *
cd50: 29 73 71 6c 69 74 65 33 49 6e 64 65 78 4b 65 79  )sqlite3IndexKey
cd60: 69 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49 64  info(pParse, pId
cd70: 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 44  x);.          iD
cd80: 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  b = sqlite3Schem
cd90: 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 49 64  aToIndex(db, pId
cda0: 78 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20  x->pSchema);.   
cdb0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
cdc0: 62 65 55 73 65 73 42 74 72 65 65 28 76 2c 20 69  beUsesBtree(v, i
cdd0: 44 62 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20  Db);..          
cde0: 69 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56  iAddr = sqlite3V
cdf0: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
ce00: 49 66 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20 20  If, iMem);.     
ce10: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
ce20: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
ce30: 65 67 65 72 2c 20 31 2c 20 69 4d 65 6d 29 3b 0a  eger, 1, iMem);.
ce40: 20 20 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c    .          sql
ce50: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
ce60: 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69  , OP_OpenRead, i
ce70: 54 61 62 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c  Tab, pIdx->tnum,
ce80: 20 69 44 62 2c 0a 20 20 20 20 20 20 20 20 20 20   iDb,.          
ce90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cea0: 20 20 20 20 20 70 4b 65 79 2c 50 34 5f 4b 45 59       pKey,P4_KEY
ceb0: 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20  INFO_HANDOFF);. 
cec0: 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d           VdbeCom
ced0: 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70  ment((v, "%s", p
cee0: 49 64 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20  Idx->zName));.  
cef0: 20 20 20 20 20 20 20 20 65 54 79 70 65 20 3d 20          eType = 
cf00: 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 3b 0a  IN_INDEX_INDEX;.
cf10: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
cf20: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
cf30: 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c  P_SetNumColumns,
cf40: 20 69 54 61 62 2c 20 70 49 64 78 2d 3e 6e 43 6f   iTab, pIdx->nCo
cf50: 6c 75 6d 6e 29 3b 0a 0a 20 20 20 20 20 20 20 20  lumn);..        
cf60: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
cf70: 70 48 65 72 65 28 76 2c 20 69 41 64 64 72 29 3b  pHere(v, iAddr);
cf80: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
cf90: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
cfa0: 69 66 28 20 65 54 79 70 65 3d 3d 30 20 29 7b 0a  if( eType==0 ){.
cfb0: 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 53      sqlite3CodeS
cfc0: 75 62 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c  ubselect(pParse,
cfd0: 20 70 58 29 3b 0a 20 20 20 20 65 54 79 70 65 20   pX);.    eType 
cfe0: 3d 20 49 4e 5f 49 4e 44 45 58 5f 45 50 48 3b 0a  = IN_INDEX_EPH;.
cff0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 58 2d    }else{.    pX-
d000: 3e 69 54 61 62 6c 65 20 3d 20 69 54 61 62 3b 0a  >iTable = iTab;.
d010: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 65 54 79    }.  return eTy
d020: 70 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  pe;.}.#endif../*
d030: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
d040: 65 20 66 6f 72 20 73 63 61 6c 61 72 20 73 75 62  e for scalar sub
d050: 71 75 65 72 69 65 73 20 75 73 65 64 20 61 73 20  queries used as 
d060: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a  an expression.**
d070: 20 61 6e 64 20 49 4e 20 6f 70 65 72 61 74 6f 72   and IN operator
d080: 73 2e 20 20 45 78 61 6d 70 6c 65 73 3a 0a 2a 2a  s.  Examples:.**
d090: 0a 2a 2a 20 20 20 20 20 28 53 45 4c 45 43 54 20  .**     (SELECT 
d0a0: 61 20 46 52 4f 4d 20 62 29 20 20 20 20 20 20 20  a FROM b)       
d0b0: 20 20 20 2d 2d 20 73 75 62 71 75 65 72 79 0a 2a     -- subquery.*
d0c0: 2a 20 20 20 20 20 45 58 49 53 54 53 20 28 53 45  *     EXISTS (SE
d0d0: 4c 45 43 54 20 61 20 46 52 4f 4d 20 62 29 20 20  LECT a FROM b)  
d0e0: 20 2d 2d 20 45 58 49 53 54 53 20 73 75 62 71 75   -- EXISTS subqu
d0f0: 65 72 79 0a 2a 2a 20 20 20 20 20 78 20 49 4e 20  ery.**     x IN 
d100: 28 34 2c 35 2c 31 31 29 20 20 20 20 20 20 20 20  (4,5,11)        
d110: 20 20 20 20 20 20 2d 2d 20 49 4e 20 6f 70 65 72        -- IN oper
d120: 61 74 6f 72 20 77 69 74 68 20 6c 69 73 74 20 6f  ator with list o
d130: 6e 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64  n right-hand sid
d140: 65 0a 2a 2a 20 20 20 20 20 78 20 49 4e 20 28 53  e.**     x IN (S
d150: 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 62 29 20  ELECT a FROM b) 
d160: 20 20 20 20 2d 2d 20 49 4e 20 6f 70 65 72 61 74      -- IN operat
d170: 6f 72 20 77 69 74 68 20 73 75 62 71 75 65 72 79  or with subquery
d180: 20 6f 6e 20 74 68 65 20 72 69 67 68 74 0a 2a 2a   on the right.**
d190: 0a 2a 2a 20 54 68 65 20 70 45 78 70 72 20 70 61  .** The pExpr pa
d1a0: 72 61 6d 65 74 65 72 20 64 65 73 63 72 69 62 65  rameter describe
d1b0: 73 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  s the expression
d1c0: 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
d1d0: 68 65 20 49 4e 0a 2a 2a 20 6f 70 65 72 61 74 6f  he IN.** operato
d1e0: 72 20 6f 72 20 73 75 62 71 75 65 72 79 2e 0a 2a  r or subquery..*
d1f0: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
d200: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 76  _OMIT_SUBQUERY.v
d210: 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 64 65 53  oid sqlite3CodeS
d220: 75 62 73 65 6c 65 63 74 28 50 61 72 73 65 20 2a  ubselect(Parse *
d230: 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
d240: 78 70 72 29 7b 0a 20 20 69 6e 74 20 74 65 73 74  xpr){.  int test
d250: 41 64 64 72 20 3d 20 30 3b 20 20 20 20 20 20 20  Addr = 0;       
d260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d270: 2f 2a 20 4f 6e 65 2d 74 69 6d 65 20 74 65 73 74  /* One-time test
d280: 20 61 64 64 72 65 73 73 20 2a 2f 0a 20 20 56 64   address */.  Vd
d290: 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47  be *v = sqlite3G
d2a0: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
d2b0: 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74    if( v==0 ) ret
d2c0: 75 72 6e 3b 0a 0a 0a 20 20 2f 2a 20 54 68 69 73  urn;...  /* This
d2d0: 20 63 6f 64 65 20 6d 75 73 74 20 62 65 20 72 75   code must be ru
d2e0: 6e 20 69 6e 20 69 74 73 20 65 6e 74 69 72 65 74  n in its entiret
d2f0: 79 20 65 76 65 72 79 20 74 69 6d 65 20 69 74 20  y every time it 
d300: 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 0a 20  is encountered. 
d310: 20 2a 2a 20 69 66 20 61 6e 79 20 6f 66 20 74 68   ** if any of th
d320: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 74  e following is t
d330: 72 75 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  rue:.  **.  **  
d340: 20 20 2a 20 20 54 68 65 20 72 69 67 68 74 2d 68    *  The right-h
d350: 61 6e 64 20 73 69 64 65 20 69 73 20 61 20 63 6f  and side is a co
d360: 72 72 65 6c 61 74 65 64 20 73 75 62 71 75 65 72  rrelated subquer
d370: 79 0a 20 20 2a 2a 20 20 20 20 2a 20 20 54 68 65  y.  **    *  The
d380: 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65   right-hand side
d390: 20 69 73 20 61 6e 20 65 78 70 72 65 73 73 69 6f   is an expressio
d3a0: 6e 20 6c 69 73 74 20 63 6f 6e 74 61 69 6e 69 6e  n list containin
d3b0: 67 20 76 61 72 69 61 62 6c 65 73 0a 20 20 2a 2a  g variables.  **
d3c0: 20 20 20 20 2a 20 20 57 65 20 61 72 65 20 69 6e      *  We are in
d3d0: 73 69 64 65 20 61 20 74 72 69 67 67 65 72 0a 20  side a trigger. 
d3e0: 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 61 6c 6c 20   **.  ** If all 
d3f0: 6f 66 20 74 68 65 20 61 62 6f 76 65 20 61 72 65  of the above are
d400: 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 77 65 20   false, then we 
d410: 63 61 6e 20 72 75 6e 20 74 68 69 73 20 63 6f 64  can run this cod
d420: 65 20 6a 75 73 74 20 6f 6e 63 65 0a 20 20 2a 2a  e just once.  **
d430: 20 73 61 76 65 20 74 68 65 20 72 65 73 75 6c 74   save the result
d440: 73 2c 20 61 6e 64 20 72 65 75 73 65 20 74 68 65  s, and reuse the
d450: 20 73 61 6d 65 20 72 65 73 75 6c 74 20 6f 6e 20   same result on 
d460: 73 75 62 73 65 71 75 65 6e 74 20 69 6e 76 6f 63  subsequent invoc
d470: 61 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69  ations..  */.  i
d480: 66 28 20 21 45 78 70 72 48 61 73 41 6e 79 50 72  f( !ExprHasAnyPr
d490: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
d4a0: 5f 56 61 72 53 65 6c 65 63 74 29 20 26 26 20 21  _VarSelect) && !
d4b0: 70 50 61 72 73 65 2d 3e 74 72 69 67 53 74 61 63  pParse->trigStac
d4c0: 6b 20 29 7b 0a 20 20 20 20 69 6e 74 20 6d 65 6d  k ){.    int mem
d4d0: 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
d4e0: 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  m;.    sqlite3Vd
d4f0: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49  beAddOp1(v, OP_I
d500: 66 2c 20 6d 65 6d 29 3b 0a 20 20 20 20 74 65 73  f, mem);.    tes
d510: 74 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56  tAddr = sqlite3V
d520: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
d530: 49 6e 74 65 67 65 72 2c 20 31 2c 20 6d 65 6d 29  Integer, 1, mem)
d540: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 74 65  ;.    assert( te
d550: 73 74 41 64 64 72 3e 30 20 7c 7c 20 70 50 61 72  stAddr>0 || pPar
d560: 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
d570: 69 6c 65 64 20 29 3b 0a 20 20 7d 0a 0a 20 20 73  iled );.  }..  s
d580: 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70  witch( pExpr->op
d590: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
d5a0: 49 4e 3a 20 7b 0a 20 20 20 20 20 20 63 68 61 72  IN: {.      char
d5b0: 20 61 66 66 69 6e 69 74 79 3b 0a 20 20 20 20 20   affinity;.     
d5c0: 20 4b 65 79 49 6e 66 6f 20 6b 65 79 49 6e 66 6f   KeyInfo keyInfo
d5d0: 3b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  ;.      int addr
d5e0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72  ;        /* Addr
d5f0: 65 73 73 20 6f 66 20 4f 50 5f 4f 70 65 6e 45 70  ess of OP_OpenEp
d600: 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 75 63 74  hemeral instruct
d610: 69 6f 6e 20 2a 2f 0a 0a 20 20 20 20 20 20 61 66  ion */..      af
d620: 66 69 6e 69 74 79 20 3d 20 73 71 6c 69 74 65 33  finity = sqlite3
d630: 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 45 78  ExprAffinity(pEx
d640: 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 0a 20 20 20  pr->pLeft);..   
d650: 20 20 20 2f 2a 20 57 68 65 74 68 65 72 20 74 68     /* Whether th
d660: 69 73 20 69 73 20 61 6e 20 27 78 20 49 4e 28 53  is is an 'x IN(S
d670: 45 4c 45 43 54 2e 2e 2e 29 27 20 6f 72 20 61 6e  ELECT...)' or an
d680: 20 27 78 20 49 4e 28 3c 65 78 70 72 6c 69 73 74   'x IN(<exprlist
d690: 3e 29 27 0a 20 20 20 20 20 20 2a 2a 20 65 78 70  >)'.      ** exp
d6a0: 72 65 73 73 69 6f 6e 20 69 74 20 69 73 20 68 61  ression it is ha
d6b0: 6e 64 6c 65 64 20 74 68 65 20 73 61 6d 65 20 77  ndled the same w
d6c0: 61 79 2e 20 41 20 76 69 72 74 75 61 6c 20 74 61  ay. A virtual ta
d6d0: 62 6c 65 20 69 73 20 0a 20 20 20 20 20 20 2a 2a  ble is .      **
d6e0: 20 66 69 6c 6c 65 64 20 77 69 74 68 20 73 69 6e   filled with sin
d6f0: 67 6c 65 2d 66 69 65 6c 64 20 69 6e 64 65 78 20  gle-field index 
d700: 6b 65 79 73 20 72 65 70 72 65 73 65 6e 74 69 6e  keys representin
d710: 67 20 74 68 65 20 72 65 73 75 6c 74 73 0a 20 20  g the results.  
d720: 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20      ** from the 
d730: 53 45 4c 45 43 54 20 6f 72 20 74 68 65 20 3c 65  SELECT or the <e
d740: 78 70 72 6c 69 73 74 3e 2e 0a 20 20 20 20 20 20  xprlist>..      
d750: 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74  **.      ** If t
d760: 68 65 20 27 78 27 20 65 78 70 72 65 73 73 69 6f  he 'x' expressio
d770: 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 76 61  n is a column va
d780: 6c 75 65 2c 20 6f 72 20 74 68 65 20 53 45 4c 45  lue, or the SELE
d790: 43 54 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 73  CT....      ** s
d7a0: 74 61 74 65 6d 65 6e 74 20 72 65 74 75 72 6e 73  tatement returns
d7b0: 20 61 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 2c   a column value,
d7c0: 20 74 68 65 6e 20 74 68 65 20 61 66 66 69 6e 69   then the affini
d7d0: 74 79 20 6f 66 20 74 68 61 74 0a 20 20 20 20 20  ty of that.     
d7e0: 20 2a 2a 20 63 6f 6c 75 6d 6e 20 69 73 20 75 73   ** column is us
d7f0: 65 64 20 74 6f 20 62 75 69 6c 64 20 74 68 65 20  ed to build the 
d800: 69 6e 64 65 78 20 6b 65 79 73 2e 20 49 66 20 62  index keys. If b
d810: 6f 74 68 20 27 78 27 20 61 6e 64 20 74 68 65 0a  oth 'x' and the.
d820: 20 20 20 20 20 20 2a 2a 20 53 45 4c 45 43 54 2e        ** SELECT.
d830: 2e 2e 20 73 74 61 74 65 6d 65 6e 74 20 61 72 65  .. statement are
d840: 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 6e   columns, then n
d850: 75 6d 65 72 69 63 20 61 66 66 69 6e 69 74 79 20  umeric affinity 
d860: 69 73 20 75 73 65 64 0a 20 20 20 20 20 20 2a 2a  is used.      **
d870: 20 69 66 20 65 69 74 68 65 72 20 63 6f 6c 75 6d   if either colum
d880: 6e 20 68 61 73 20 4e 55 4d 45 52 49 43 20 6f 72  n has NUMERIC or
d890: 20 49 4e 54 45 47 45 52 20 61 66 66 69 6e 69 74   INTEGER affinit
d8a0: 79 2e 20 49 66 20 6e 65 69 74 68 65 72 0a 20 20  y. If neither.  
d8b0: 20 20 20 20 2a 2a 20 27 78 27 20 6e 6f 72 20 74      ** 'x' nor t
d8c0: 68 65 20 53 45 4c 45 43 54 2e 2e 2e 20 73 74 61  he SELECT... sta
d8d0: 74 65 6d 65 6e 74 20 61 72 65 20 63 6f 6c 75 6d  tement are colum
d8e0: 6e 73 2c 20 74 68 65 6e 20 6e 75 6d 65 72 69 63  ns, then numeric
d8f0: 20 61 66 66 69 6e 69 74 79 0a 20 20 20 20 20 20   affinity.      
d900: 2a 2a 20 69 73 20 75 73 65 64 2e 0a 20 20 20 20  ** is used..    
d910: 20 20 2a 2f 0a 20 20 20 20 20 20 70 45 78 70 72    */.      pExpr
d920: 2d 3e 69 54 61 62 6c 65 20 3d 20 70 50 61 72 73  ->iTable = pPars
d930: 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20  e->nTab++;.     
d940: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
d950: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
d960: 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70  OpenEphemeral, p
d970: 45 78 70 72 2d 3e 69 54 61 62 6c 65 29 3b 0a 20  Expr->iTable);. 
d980: 20 20 20 20 20 6d 65 6d 73 65 74 28 26 6b 65 79       memset(&key
d990: 49 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Info, 0, sizeof(
d9a0: 6b 65 79 49 6e 66 6f 29 29 3b 0a 20 20 20 20 20  keyInfo));.     
d9b0: 20 6b 65 79 49 6e 66 6f 2e 6e 46 69 65 6c 64 20   keyInfo.nField 
d9c0: 3d 20 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  = 1;.      sqlit
d9d0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
d9e0: 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73  OP_SetNumColumns
d9f0: 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
da00: 20 31 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20   1);..      if( 
da10: 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 20 29  pExpr->pSelect )
da20: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 61 73  {.        /* Cas
da30: 65 20 31 3a 20 20 20 20 20 65 78 70 72 20 49 4e  e 1:     expr IN
da40: 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 20 20   (SELECT ...).  
da50: 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
da60: 20 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   ** Generate cod
da70: 65 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 72  e to write the r
da80: 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73 65  esults of the se
da90: 6c 65 63 74 20 69 6e 74 6f 20 74 68 65 20 74 65  lect into the te
daa0: 6d 70 6f 72 61 72 79 0a 20 20 20 20 20 20 20 20  mporary.        
dab0: 2a 2a 20 74 61 62 6c 65 20 61 6c 6c 6f 63 61 74  ** table allocat
dac0: 65 64 20 61 6e 64 20 6f 70 65 6e 65 64 20 61 62  ed and opened ab
dad0: 6f 76 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ove..        */.
dae0: 20 20 20 20 20 20 20 20 53 65 6c 65 63 74 44 65          SelectDe
daf0: 73 74 20 64 65 73 74 3b 0a 20 20 20 20 20 20 20  st dest;.       
db00: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
db10: 74 3b 0a 0a 20 20 20 20 20 20 20 20 73 71 6c 69  t;..        sqli
db20: 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69  te3SelectDestIni
db30: 74 28 26 64 65 73 74 2c 20 53 52 54 5f 53 65 74  t(&dest, SRT_Set
db40: 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 29  , pExpr->iTable)
db50: 3b 0a 20 20 20 20 20 20 20 20 64 65 73 74 2e 61  ;.        dest.a
db60: 66 66 69 6e 69 74 79 20 3d 20 28 69 6e 74 29 61  ffinity = (int)a
db70: 66 66 69 6e 69 74 79 3b 0a 20 20 20 20 20 20 20  ffinity;.       
db80: 20 61 73 73 65 72 74 28 20 28 70 45 78 70 72 2d   assert( (pExpr-
db90: 3e 69 54 61 62 6c 65 26 30 78 30 30 30 30 46 46  >iTable&0x0000FF
dba0: 46 46 29 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62  FF)==pExpr->iTab
dbb0: 6c 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  le );.        if
dbc0: 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  ( sqlite3Select(
dbd0: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
dbe0: 53 65 6c 65 63 74 2c 20 26 64 65 73 74 2c 20 30  Select, &dest, 0
dbf0: 2c 20 30 2c 20 30 2c 20 30 29 20 29 7b 0a 20 20  , 0, 0, 0) ){.  
dc00: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a          return;.
dc10: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
dc20: 20 20 70 45 4c 69 73 74 20 3d 20 70 45 78 70 72    pEList = pExpr
dc30: 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73  ->pSelect->pELis
dc40: 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  t;.        if( p
dc50: 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d  EList && pEList-
dc60: 3e 6e 45 78 70 72 3e 30 20 29 7b 20 0a 20 20 20  >nExpr>0 ){ .   
dc70: 20 20 20 20 20 20 20 6b 65 79 49 6e 66 6f 2e 61         keyInfo.a
dc80: 43 6f 6c 6c 5b 30 5d 20 3d 20 73 71 6c 69 74 65  Coll[0] = sqlite
dc90: 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f  3BinaryCompareCo
dca0: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 45  llSeq(pParse, pE
dcb0: 78 70 72 2d 3e 70 4c 65 66 74 2c 0a 20 20 20 20  xpr->pLeft,.    
dcc0: 20 20 20 20 20 20 20 20 20 20 70 45 4c 69 73 74            pEList
dcd0: 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[0].pExpr);. 
dce0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
dcf0: 65 6c 73 65 20 69 66 28 20 70 45 78 70 72 2d 3e  else if( pExpr->
dd00: 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20  pList ){.       
dd10: 20 2f 2a 20 43 61 73 65 20 32 3a 20 20 20 20 20   /* Case 2:     
dd20: 65 78 70 72 20 49 4e 20 28 65 78 70 72 6c 69 73  expr IN (exprlis
dd30: 74 29 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  t).        **.  
dd40: 20 20 20 20 20 20 2a 2a 20 46 6f 72 20 65 61 63        ** For eac
dd50: 68 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 62 75  h expression, bu
dd60: 69 6c 64 20 61 6e 20 69 6e 64 65 78 20 6b 65 79  ild an index key
dd70: 20 66 72 6f 6d 20 74 68 65 20 65 76 61 6c 75 61   from the evalua
dd80: 74 69 6f 6e 20 61 6e 64 0a 20 20 20 20 20 20 20  tion and.       
dd90: 20 2a 2a 20 73 74 6f 72 65 20 69 74 20 69 6e 20   ** store it in 
dda0: 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  the temporary ta
ddb0: 62 6c 65 2e 20 49 66 20 3c 65 78 70 72 3e 20 69  ble. If <expr> i
ddc0: 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e  s a column, then
ddd0: 20 75 73 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   use.        ** 
dde0: 74 68 61 74 20 63 6f 6c 75 6d 6e 73 20 61 66 66  that columns aff
ddf0: 69 6e 69 74 79 20 77 68 65 6e 20 62 75 69 6c 64  inity when build
de00: 69 6e 67 20 69 6e 64 65 78 20 6b 65 79 73 2e 20  ing index keys. 
de10: 49 66 20 3c 65 78 70 72 3e 20 69 73 20 6e 6f 74  If <expr> is not
de20: 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 63 6f  .        ** a co
de30: 6c 75 6d 6e 2c 20 75 73 65 20 6e 75 6d 65 72 69  lumn, use numeri
de40: 63 20 61 66 66 69 6e 69 74 79 2e 0a 20 20 20 20  c affinity..    
de50: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
de60: 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20 45 78  nt i;.        Ex
de70: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20  prList *pList = 
de80: 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20  pExpr->pList;.  
de90: 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70        struct Exp
dea0: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
deb0: 6d 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  m;.        int r
dec0: 31 2c 20 72 32 3b 0a 0a 20 20 20 20 20 20 20 20  1, r2;..        
ded0: 69 66 28 20 21 61 66 66 69 6e 69 74 79 20 29 7b  if( !affinity ){
dee0: 0a 20 20 20 20 20 20 20 20 20 20 61 66 66 69 6e  .          affin
def0: 69 74 79 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  ity = SQLITE_AFF
df00: 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d  _NONE;.        }
df10: 0a 20 20 20 20 20 20 20 20 6b 65 79 49 6e 66 6f  .        keyInfo
df20: 2e 61 43 6f 6c 6c 5b 30 5d 20 3d 20 70 45 78 70  .aColl[0] = pExp
df30: 72 2d 3e 70 4c 65 66 74 2d 3e 70 43 6f 6c 6c 3b  r->pLeft->pColl;
df40: 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f  ..        /* Loo
df50: 70 20 74 68 72 6f 75 67 68 20 65 61 63 68 20 65  p through each e
df60: 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 3c 65 78  xpression in <ex
df70: 70 72 6c 69 73 74 3e 2e 20 2a 2f 0a 20 20 20 20  prlist>. */.    
df80: 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
df90: 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
dfa0: 65 29 3b 0a 20 20 20 20 20 20 20 20 72 32 20 3d  e);.        r2 =
dfb0: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
dfc0: 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
dfd0: 20 20 20 20 66 6f 72 28 69 3d 70 4c 69 73 74 2d      for(i=pList-
dfe0: 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d 70 4c  >nExpr, pItem=pL
dff0: 69 73 74 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d  ist->a; i>0; i--
e000: 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
e010: 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 32 20        Expr *pE2 
e020: 3d 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a  = pItem->pExpr;.
e030: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66  .          /* If
e040: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
e050: 69 73 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 20  is not constant 
e060: 74 68 65 6e 20 77 65 20 77 69 6c 6c 20 6e 65 65  then we will nee
e070: 64 20 74 6f 0a 20 20 20 20 20 20 20 20 20 20 2a  d to.          *
e080: 2a 20 64 69 73 61 62 6c 65 20 74 68 65 20 74 65  * disable the te
e090: 73 74 20 74 68 61 74 20 77 61 73 20 67 65 6e 65  st that was gene
e0a0: 72 61 74 65 64 20 61 62 6f 76 65 20 74 68 61 74  rated above that
e0b0: 20 6d 61 6b 65 73 20 73 75 72 65 0a 20 20 20 20   makes sure.    
e0c0: 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 63 6f        ** this co
e0d0: 64 65 20 6f 6e 6c 79 20 65 78 65 63 75 74 65 73  de only executes
e0e0: 20 6f 6e 63 65 2e 20 20 42 65 63 61 75 73 65 20   once.  Because 
e0f0: 66 6f 72 20 61 20 6e 6f 6e 2d 63 6f 6e 73 74 61  for a non-consta
e100: 6e 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  nt.          ** 
e110: 65 78 70 72 65 73 73 69 6f 6e 20 77 65 20 6e 65  expression we ne
e120: 65 64 20 74 6f 20 72 65 72 75 6e 20 74 68 69 73  ed to rerun this
e130: 20 63 6f 64 65 20 65 61 63 68 20 74 69 6d 65 2e   code each time.
e140: 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
e150: 20 20 20 20 20 20 20 20 69 66 28 20 74 65 73 74          if( test
e160: 41 64 64 72 20 26 26 20 21 73 71 6c 69 74 65 33  Addr && !sqlite3
e170: 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70  ExprIsConstant(p
e180: 45 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  E2) ){.         
e190: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
e1a0: 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 74 65  angeToNoop(v, te
e1b0: 73 74 41 64 64 72 2d 31 2c 20 32 29 3b 0a 20 20  stAddr-1, 2);.  
e1c0: 20 20 20 20 20 20 20 20 20 20 74 65 73 74 41 64            testAd
e1d0: 64 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  dr = 0;.        
e1e0: 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 2f    }..          /
e1f0: 2a 20 45 76 61 6c 75 61 74 65 20 74 68 65 20 65  * Evaluate the e
e200: 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 69 6e  xpression and in
e210: 73 65 72 74 20 69 74 20 69 6e 74 6f 20 74 68 65  sert it into the
e220: 20 74 65 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20   temp table */. 
e230: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
e240: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
e250: 20 70 45 32 2c 20 72 31 29 3b 0a 20 20 20 20 20   pE2, r1);.     
e260: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
e270: 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b  AddOp4(v, OP_Mak
e280: 65 52 65 63 6f 72 64 2c 20 72 31 2c 20 31 2c 20  eRecord, r1, 1, 
e290: 72 32 2c 20 26 61 66 66 69 6e 69 74 79 2c 20 31  r2, &affinity, 1
e2a0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
e2b0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
e2c0: 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20  , OP_IdxInsert, 
e2d0: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 72  pExpr->iTable, r
e2e0: 32 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  2);.        }.  
e2f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
e300: 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
e310: 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20  se, r1);.       
e320: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
e330: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
e340: 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  2);.      }.    
e350: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
e360: 6e 67 65 50 34 28 76 2c 20 61 64 64 72 2c 20 28  ngeP4(v, addr, (
e370: 76 6f 69 64 20 2a 29 26 6b 65 79 49 6e 66 6f 2c  void *)&keyInfo,
e380: 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20   P4_KEYINFO);.  
e390: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
e3a0: 0a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58  ..    case TK_EX
e3b0: 49 53 54 53 3a 0a 20 20 20 20 63 61 73 65 20 54  ISTS:.    case T
e3c0: 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20  K_SELECT: {.    
e3d0: 20 20 2f 2a 20 54 68 69 73 20 68 61 73 20 74 6f    /* This has to
e3e0: 20 62 65 20 61 20 73 63 61 6c 61 72 20 53 45 4c   be a scalar SEL
e3f0: 45 43 54 2e 20 20 47 65 6e 65 72 61 74 65 20 63  ECT.  Generate c
e400: 6f 64 65 20 74 6f 20 70 75 74 20 74 68 65 0a 20  ode to put the. 
e410: 20 20 20 20 20 2a 2a 20 76 61 6c 75 65 20 6f 66       ** value of
e420: 20 74 68 69 73 20 73 65 6c 65 63 74 20 69 6e 20   this select in 
e430: 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e  a memory cell an
e440: 64 20 72 65 63 6f 72 64 20 74 68 65 20 6e 75 6d  d record the num
e450: 62 65 72 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20  ber.      ** of 
e460: 74 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20  the memory cell 
e470: 69 6e 20 69 43 6f 6c 75 6d 6e 2e 0a 20 20 20 20  in iColumn..    
e480: 20 20 2a 2f 0a 20 20 20 20 20 20 73 74 61 74 69    */.      stati
e490: 63 20 63 6f 6e 73 74 20 54 6f 6b 65 6e 20 6f 6e  c const Token on
e4a0: 65 20 3d 20 7b 20 28 75 38 2a 29 22 31 22 2c 20  e = { (u8*)"1", 
e4b0: 30 2c 20 31 20 7d 3b 0a 20 20 20 20 20 20 53 65  0, 1 };.      Se
e4c0: 6c 65 63 74 20 2a 70 53 65 6c 3b 0a 20 20 20 20  lect *pSel;.    
e4d0: 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73    SelectDest des
e4e0: 74 3b 0a 0a 20 20 20 20 20 20 70 53 65 6c 20 3d  t;..      pSel =
e4f0: 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 3b   pExpr->pSelect;
e500: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65  .      sqlite3Se
e510: 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65  lectDestInit(&de
e520: 73 74 2c 20 30 2c 20 2b 2b 70 50 61 72 73 65 2d  st, 0, ++pParse-
e530: 3e 6e 4d 65 6d 29 3b 0a 20 20 20 20 20 20 69 66  >nMem);.      if
e540: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
e550: 53 45 4c 45 43 54 20 29 7b 0a 20 20 20 20 20 20  SELECT ){.      
e560: 20 20 64 65 73 74 2e 65 44 65 73 74 20 3d 20 53    dest.eDest = S
e570: 52 54 5f 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20  RT_Mem;.        
e580: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
e590: 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  2(v, OP_Null, 0,
e5a0: 20 64 65 73 74 2e 69 50 61 72 6d 29 3b 0a 20 20   dest.iParm);.  
e5b0: 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
e5c0: 74 28 28 76 2c 20 22 49 6e 69 74 20 73 75 62 71  t((v, "Init subq
e5d0: 75 65 72 79 20 72 65 73 75 6c 74 22 29 29 3b 0a  uery result"));.
e5e0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
e5f0: 20 20 20 20 20 64 65 73 74 2e 65 44 65 73 74 20       dest.eDest 
e600: 3d 20 53 52 54 5f 45 78 69 73 74 73 3b 0a 20 20  = SRT_Exists;.  
e610: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
e620: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
e630: 74 65 67 65 72 2c 20 30 2c 20 64 65 73 74 2e 69  teger, 0, dest.i
e640: 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 20 20 56  Parm);.        V
e650: 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
e660: 49 6e 69 74 20 45 58 49 53 54 53 20 72 65 73 75  Init EXISTS resu
e670: 6c 74 22 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20  lt"));.      }. 
e680: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
e690: 44 65 6c 65 74 65 28 70 53 65 6c 2d 3e 70 4c 69  Delete(pSel->pLi
e6a0: 6d 69 74 29 3b 0a 20 20 20 20 20 20 70 53 65 6c  mit);.      pSel
e6b0: 2d 3e 70 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74  ->pLimit = sqlit
e6c0: 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
e6d0: 54 4b 5f 49 4e 54 45 47 45 52 2c 20 30 2c 20 30  TK_INTEGER, 0, 0
e6e0: 2c 20 26 6f 6e 65 29 3b 0a 20 20 20 20 20 20 69  , &one);.      i
e6f0: 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  f( sqlite3Select
e700: 28 70 50 61 72 73 65 2c 20 70 53 65 6c 2c 20 26  (pParse, pSel, &
e710: 64 65 73 74 2c 20 30 2c 20 30 2c 20 30 2c 20 30  dest, 0, 0, 0, 0
e720: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  ) ){.        ret
e730: 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  urn;.      }.   
e740: 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d     pExpr->iColum
e750: 6e 20 3d 20 64 65 73 74 2e 69 50 61 72 6d 3b 0a  n = dest.iParm;.
e760: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
e770: 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 74 65   }.  }..  if( te
e780: 73 74 41 64 64 72 20 29 7b 0a 20 20 20 20 73 71  stAddr ){.    sq
e790: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
e7a0: 65 28 76 2c 20 74 65 73 74 41 64 64 72 2d 31 29  e(v, testAddr-1)
e7b0: 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 3b  ;.  }..  return;
e7c0: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
e7d0: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
e7e0: 59 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 44 75 70 6c  Y */../*.** Dupl
e7f0: 69 63 61 74 65 20 61 6e 20 38 2d 62 79 74 65 20  icate an 8-byte 
e800: 76 61 6c 75 65 0a 2a 2f 0a 73 74 61 74 69 63 20  value.*/.static 
e810: 63 68 61 72 20 2a 64 75 70 38 62 79 74 65 73 28  char *dup8bytes(
e820: 56 64 62 65 20 2a 76 2c 20 63 6f 6e 73 74 20 63  Vdbe *v, const c
e830: 68 61 72 20 2a 69 6e 29 7b 0a 20 20 63 68 61 72  har *in){.  char
e840: 20 2a 6f 75 74 20 3d 20 73 71 6c 69 74 65 33 44   *out = sqlite3D
e850: 62 4d 61 6c 6c 6f 63 52 61 77 28 73 71 6c 69 74  bMallocRaw(sqlit
e860: 65 33 56 64 62 65 44 62 28 76 29 2c 20 38 29 3b  e3VdbeDb(v), 8);
e870: 0a 20 20 69 66 28 20 6f 75 74 20 29 7b 0a 20 20  .  if( out ){.  
e880: 20 20 6d 65 6d 63 70 79 28 6f 75 74 2c 20 69 6e    memcpy(out, in
e890: 2c 20 38 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  , 8);.  }.  retu
e8a0: 72 6e 20 6f 75 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn out;.}../*.**
e8b0: 20 47 65 6e 65 72 61 74 65 20 61 6e 20 69 6e 73   Generate an ins
e8c0: 74 72 75 63 74 69 6f 6e 20 74 68 61 74 20 77 69  truction that wi
e8d0: 6c 6c 20 70 75 74 20 74 68 65 20 66 6c 6f 61 74  ll put the float
e8e0: 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20 76 61 6c  ing point.** val
e8f0: 75 65 20 64 65 73 63 72 69 62 65 64 20 62 79 20  ue described by 
e900: 7a 5b 30 2e 2e 6e 2d 31 5d 20 69 6e 74 6f 20 72  z[0..n-1] into r
e910: 65 67 69 73 74 65 72 20 69 4d 65 6d 2e 0a 2a 2a  egister iMem..**
e920: 0a 2a 2a 20 54 68 65 20 7a 5b 5d 20 73 74 72 69  .** The z[] stri
e930: 6e 67 20 77 69 6c 6c 20 70 72 6f 62 61 62 6c 79  ng will probably
e940: 20 6e 6f 74 20 62 65 20 7a 65 72 6f 2d 74 65 72   not be zero-ter
e950: 6d 69 6e 61 74 65 64 2e 20 20 42 75 74 20 74 68  minated.  But th
e960: 65 20 0a 2a 2a 20 7a 5b 6e 5d 20 63 68 61 72 61  e .** z[n] chara
e970: 63 74 65 72 20 69 73 20 67 75 61 72 61 6e 74 65  cter is guarante
e980: 65 64 20 74 6f 20 62 65 20 73 6f 6d 65 74 68 69  ed to be somethi
e990: 6e 67 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74  ng that does not
e9a0: 20 6c 6f 6f 6b 0a 2a 2a 20 6c 69 6b 65 20 74 68   look.** like th
e9b0: 65 20 63 6f 6e 74 69 6e 75 61 74 69 6f 6e 20 6f  e continuation o
e9c0: 66 20 74 68 65 20 6e 75 6d 62 65 72 2e 0a 2a 2f  f the number..*/
e9d0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64  .static void cod
e9e0: 65 52 65 61 6c 28 56 64 62 65 20 2a 76 2c 20 63  eReal(Vdbe *v, c
e9f0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e  onst char *z, in
ea00: 74 20 6e 2c 20 69 6e 74 20 6e 65 67 61 74 65 46  t n, int negateF
ea10: 6c 61 67 2c 20 69 6e 74 20 69 4d 65 6d 29 7b 0a  lag, int iMem){.
ea20: 20 20 61 73 73 65 72 74 28 20 7a 20 7c 7c 20 76    assert( z || v
ea30: 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 56 64  ==0 || sqlite3Vd
ea40: 62 65 44 62 28 76 29 2d 3e 6d 61 6c 6c 6f 63 46  beDb(v)->mallocF
ea50: 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 7a  ailed );.  if( z
ea60: 20 29 7b 0a 20 20 20 20 64 6f 75 62 6c 65 20 76   ){.    double v
ea70: 61 6c 75 65 3b 0a 20 20 20 20 63 68 61 72 20 2a  alue;.    char *
ea80: 7a 56 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  zV;.    assert( 
ea90: 21 69 73 64 69 67 69 74 28 7a 5b 6e 5d 29 20 29  !isdigit(z[n]) )
eaa0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 41 74 6f  ;.    sqlite3Ato
eab0: 46 28 7a 2c 20 26 76 61 6c 75 65 29 3b 0a 20 20  F(z, &value);.  
eac0: 20 20 69 66 28 20 6e 65 67 61 74 65 46 6c 61 67    if( negateFlag
ead0: 20 29 20 76 61 6c 75 65 20 3d 20 2d 76 61 6c 75   ) value = -valu
eae0: 65 3b 0a 20 20 20 20 7a 56 20 3d 20 64 75 70 38  e;.    zV = dup8
eaf0: 62 79 74 65 73 28 76 2c 20 28 63 68 61 72 2a 29  bytes(v, (char*)
eb00: 26 76 61 6c 75 65 29 3b 0a 20 20 20 20 73 71 6c  &value);.    sql
eb10: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
eb20: 2c 20 4f 50 5f 52 65 61 6c 2c 20 30 2c 20 69 4d  , OP_Real, 0, iM
eb30: 65 6d 2c 20 30 2c 20 7a 56 2c 20 50 34 5f 52 45  em, 0, zV, P4_RE
eb40: 41 4c 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a  AL);.  }.}.../*.
eb50: 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 6e 20 69  ** Generate an i
eb60: 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 61 74 20  nstruction that 
eb70: 77 69 6c 6c 20 70 75 74 20 74 68 65 20 69 6e 74  will put the int
eb80: 65 67 65 72 20 64 65 73 63 72 69 62 65 20 62 79  eger describe by
eb90: 0a 2a 2a 20 74 65 78 74 20 7a 5b 30 2e 2e 6e 2d  .** text z[0..n-
eba0: 31 5d 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72  1] into register
ebb0: 20 69 4d 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   iMem..**.** The
ebc0: 20 7a 5b 5d 20 73 74 72 69 6e 67 20 77 69 6c 6c   z[] string will
ebd0: 20 70 72 6f 62 61 62 6c 79 20 6e 6f 74 20 62 65   probably not be
ebe0: 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74 65 64   zero-terminated
ebf0: 2e 20 20 42 75 74 20 74 68 65 20 0a 2a 2a 20 7a  .  But the .** z
ec00: 5b 6e 5d 20 63 68 61 72 61 63 74 65 72 20 69 73  [n] character is
ec10: 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62   guaranteed to b
ec20: 65 20 73 6f 6d 65 74 68 69 6e 67 20 74 68 61 74  e something that
ec30: 20 64 6f 65 73 20 6e 6f 74 20 6c 6f 6f 6b 0a 2a   does not look.*
ec40: 2a 20 6c 69 6b 65 20 74 68 65 20 63 6f 6e 74 69  * like the conti
ec50: 6e 75 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e  nuation of the n
ec60: 75 6d 62 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  umber..*/.static
ec70: 20 76 6f 69 64 20 63 6f 64 65 49 6e 74 65 67 65   void codeIntege
ec80: 72 28 56 64 62 65 20 2a 76 2c 20 63 6f 6e 73 74  r(Vdbe *v, const
ec90: 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 2c   char *z, int n,
eca0: 20 69 6e 74 20 6e 65 67 46 6c 61 67 2c 20 69 6e   int negFlag, in
ecb0: 74 20 69 4d 65 6d 29 7b 0a 20 20 61 73 73 65 72  t iMem){.  asser
ecc0: 74 28 20 7a 20 7c 7c 20 76 3d 3d 30 20 7c 7c 20  t( z || v==0 || 
ecd0: 73 71 6c 69 74 65 33 56 64 62 65 44 62 28 76 29  sqlite3VdbeDb(v)
ece0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
ecf0: 3b 0a 20 20 69 66 28 20 7a 20 29 7b 0a 20 20 20  ;.  if( z ){.   
ed00: 20 69 6e 74 20 69 3b 0a 20 20 20 20 61 73 73 65   int i;.    asse
ed10: 72 74 28 20 21 69 73 64 69 67 69 74 28 7a 5b 6e  rt( !isdigit(z[n
ed20: 5d 29 20 29 3b 0a 20 20 20 20 69 66 28 20 73 71  ]) );.    if( sq
ed30: 6c 69 74 65 33 47 65 74 49 6e 74 33 32 28 7a 2c  lite3GetInt32(z,
ed40: 20 26 69 29 20 29 7b 0a 20 20 20 20 20 20 69 66   &i) ){.      if
ed50: 28 20 6e 65 67 46 6c 61 67 20 29 20 69 20 3d 20  ( negFlag ) i = 
ed60: 2d 69 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  -i;.      sqlite
ed70: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
ed80: 50 5f 49 6e 74 65 67 65 72 2c 20 69 2c 20 69 4d  P_Integer, i, iM
ed90: 65 6d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  em);.    }else i
eda0: 66 28 20 73 71 6c 69 74 65 33 46 69 74 73 49 6e  f( sqlite3FitsIn
edb0: 36 34 42 69 74 73 28 7a 2c 20 6e 65 67 46 6c 61  64Bits(z, negFla
edc0: 67 29 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20  g) ){.      i64 
edd0: 76 61 6c 75 65 3b 0a 20 20 20 20 20 20 63 68 61  value;.      cha
ede0: 72 20 2a 7a 56 3b 0a 20 20 20 20 20 20 73 71 6c  r *zV;.      sql
edf0: 69 74 65 33 41 74 6f 69 36 34 28 7a 2c 20 26 76  ite3Atoi64(z, &v
ee00: 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 69 66 28  alue);.      if(
ee10: 20 6e 65 67 46 6c 61 67 20 29 20 76 61 6c 75 65   negFlag ) value
ee20: 20 3d 20 2d 76 61 6c 75 65 3b 0a 20 20 20 20 20   = -value;.     
ee30: 20 7a 56 20 3d 20 64 75 70 38 62 79 74 65 73 28   zV = dup8bytes(
ee40: 76 2c 20 28 63 68 61 72 2a 29 26 76 61 6c 75 65  v, (char*)&value
ee50: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
ee60: 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
ee70: 5f 49 6e 74 36 34 2c 20 30 2c 20 69 4d 65 6d 2c  _Int64, 0, iMem,
ee80: 20 30 2c 20 7a 56 2c 20 50 34 5f 49 4e 54 36 34   0, zV, P4_INT64
ee90: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
eea0: 20 20 20 20 63 6f 64 65 52 65 61 6c 28 76 2c 20      codeReal(v, 
eeb0: 7a 2c 20 6e 2c 20 6e 65 67 46 6c 61 67 2c 20 69  z, n, negFlag, i
eec0: 4d 65 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Mem);.    }.  }.
eed0: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  }.../*.** Genera
eee0: 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c  te code that wil
eef0: 6c 20 65 78 74 72 61 63 74 20 74 68 65 20 69 43  l extract the iC
ef00: 6f 6c 75 6d 6e 2d 74 68 20 63 6f 6c 75 6d 6e 20  olumn-th column 
ef10: 66 72 6f 6d 0a 2a 2a 20 74 61 62 6c 65 20 70 54  from.** table pT
ef20: 61 62 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65  ab and store the
ef30: 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69 6e   column value in
ef40: 20 72 65 67 69 73 74 65 72 20 69 52 65 67 2e 0a   register iReg..
ef50: 2a 2a 20 54 68 65 72 65 20 69 73 20 61 6e 20 6f  ** There is an o
ef60: 70 65 6e 20 63 75 72 73 6f 72 20 74 6f 20 70 54  pen cursor to pT
ef70: 61 62 20 69 6e 20 0a 2a 2a 20 69 54 61 62 6c 65  ab in .** iTable
ef80: 2e 20 20 49 66 20 69 43 6f 6c 75 6d 6e 3c 30 20  .  If iColumn<0 
ef90: 74 68 65 6e 20 63 6f 64 65 20 69 73 20 67 65 6e  then code is gen
efa0: 65 72 61 74 65 64 20 74 68 61 74 20 65 78 74 72  erated that extr
efb0: 61 63 74 73 20 74 68 65 20 72 6f 77 69 64 2e 0a  acts the rowid..
efc0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
efd0: 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e  xprCodeGetColumn
efe0: 28 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20  (.  Vdbe *v,    
eff0: 20 20 20 20 20 2f 2a 20 54 68 65 20 56 4d 20 62       /* The VM b
f000: 65 69 6e 67 20 63 72 65 61 74 65 64 20 2a 2f 0a  eing created */.
f010: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20    Table *pTab,  
f020: 20 20 20 2f 2a 20 44 65 73 63 72 69 70 74 69 6f     /* Descriptio
f030: 6e 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 77  n of the table w
f040: 65 20 61 72 65 20 72 65 61 64 69 6e 67 20 66 72  e are reading fr
f050: 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c  om */.  int iCol
f060: 75 6d 6e 2c 20 20 20 20 20 2f 2a 20 49 6e 64 65  umn,     /* Inde
f070: 78 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 63  x of the table c
f080: 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  olumn */.  int i
f090: 54 61 62 6c 65 2c 20 20 20 20 20 20 2f 2a 20 54  Table,      /* T
f0a0: 68 65 20 63 75 72 73 6f 72 20 70 6f 69 6e 74 69  he cursor pointi
f0b0: 6e 67 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20  ng to the table 
f0c0: 2a 2f 0a 20 20 69 6e 74 20 69 52 65 67 20 20 20  */.  int iReg   
f0d0: 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 72        /* Store r
f0e0: 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29  esults here */.)
f0f0: 7b 0a 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3c  {.  if( iColumn<
f100: 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6f 70 20  0 ){.    int op 
f110: 3d 20 28 70 54 61 62 20 26 26 20 49 73 56 69 72  = (pTab && IsVir
f120: 74 75 61 6c 28 70 54 61 62 29 29 20 3f 20 4f 50  tual(pTab)) ? OP
f130: 5f 56 52 6f 77 69 64 20 3a 20 4f 50 5f 52 6f 77  _VRowid : OP_Row
f140: 69 64 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  id;.    sqlite3V
f150: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c  dbeAddOp2(v, op,
f160: 20 69 54 61 62 6c 65 2c 20 69 52 65 67 29 3b 0a   iTable, iReg);.
f170: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54 61 62    }else if( pTab
f180: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
f190: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
f1a0: 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 54 61 62 6c  OP_Column, iTabl
f1b0: 65 2c 20 69 43 6f 6c 75 6d 6e 2c 20 69 52 65 67  e, iColumn, iReg
f1c0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
f1d0: 69 6e 74 20 6f 70 20 3d 20 49 73 56 69 72 74 75  int op = IsVirtu
f1e0: 61 6c 28 70 54 61 62 29 20 3f 20 4f 50 5f 56 43  al(pTab) ? OP_VC
f1f0: 6f 6c 75 6d 6e 20 3a 20 4f 50 5f 43 6f 6c 75 6d  olumn : OP_Colum
f200: 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  n;.    sqlite3Vd
f210: 62 65 41 64 64 4f 70 33 28 76 2c 20 6f 70 2c 20  beAddOp3(v, op, 
f220: 69 54 61 62 6c 65 2c 20 69 43 6f 6c 75 6d 6e 2c  iTable, iColumn,
f230: 20 69 52 65 67 29 3b 0a 20 20 20 20 73 71 6c 69   iReg);.    sqli
f240: 74 65 33 43 6f 6c 75 6d 6e 44 65 66 61 75 6c 74  te3ColumnDefault
f250: 28 76 2c 20 70 54 61 62 2c 20 69 43 6f 6c 75 6d  (v, pTab, iColum
f260: 6e 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  n);.#ifndef SQLI
f270: 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47  TE_OMIT_FLOATING
f280: 5f 50 4f 49 4e 54 0a 20 20 20 20 69 66 28 20 70  _POINT.    if( p
f290: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 75 6d  Tab->aCol[iColum
f2a0: 6e 5d 2e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c  n].affinity==SQL
f2b0: 49 54 45 5f 41 46 46 5f 52 45 41 4c 20 29 7b 0a  ITE_AFF_REAL ){.
f2c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
f2d0: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65  eAddOp1(v, OP_Re
f2e0: 61 6c 41 66 66 69 6e 69 74 79 2c 20 69 52 65 67  alAffinity, iReg
f2f0: 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
f300: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e    }.}../*.** Gen
f310: 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20  erate code into 
f320: 74 68 65 20 63 75 72 72 65 6e 74 20 56 64 62 65  the current Vdbe
f330: 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65   to evaluate the
f340: 20 67 69 76 65 6e 0a 2a 2a 20 65 78 70 72 65 73   given.** expres
f350: 73 69 6f 6e 2e 20 20 41 74 74 65 6d 70 74 20 74  sion.  Attempt t
f360: 6f 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75  o store the resu
f370: 6c 74 73 20 69 6e 20 72 65 67 69 73 74 65 72 20  lts in register 
f380: 22 74 61 72 67 65 74 22 2e 0a 2a 2a 20 52 65 74  "target"..** Ret
f390: 75 72 6e 20 74 68 65 20 72 65 67 69 73 74 65 72  urn the register
f3a0: 20 77 68 65 72 65 20 72 65 73 75 6c 74 73 20 61   where results a
f3b0: 72 65 20 73 74 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a  re stored..**.**
f3c0: 20 57 69 74 68 20 74 68 69 73 20 72 6f 75 74 69   With this routi
f3d0: 6e 65 2c 20 74 68 65 72 65 20 69 73 20 6e 6f 20  ne, there is no 
f3e0: 67 75 61 72 61 6e 74 65 65 64 20 74 68 61 74 20  guaranteed that 
f3f0: 72 65 73 75 6c 74 73 20 77 69 6c 6c 0a 2a 2a 20  results will.** 
f400: 62 65 20 73 74 6f 72 65 64 20 69 6e 20 74 61 72  be stored in tar
f410: 67 65 74 2e 20 20 54 68 65 20 72 65 73 75 6c 74  get.  The result
f420: 20 6d 69 67 68 74 20 62 65 20 73 74 6f 72 65 64   might be stored
f430: 20 69 6e 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a   in some other.*
f440: 2a 20 72 65 67 69 73 74 65 72 20 69 66 20 69 74  * register if it
f450: 20 69 73 20 63 6f 6e 76 65 6e 69 65 6e 74 20 74   is convenient t
f460: 6f 20 64 6f 20 73 6f 2e 20 20 54 68 65 20 63 61  o do so.  The ca
f470: 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a 2a  lling function.*
f480: 2a 20 6d 75 73 74 20 63 68 65 63 6b 20 74 68 65  * must check the
f490: 20 72 65 74 75 72 6e 20 63 6f 64 65 20 61 6e 64   return code and
f4a0: 20 6d 6f 76 65 20 74 68 65 20 72 65 73 75 6c 74   move the result
f4b0: 73 20 74 6f 20 74 68 65 20 64 65 73 69 72 65 64  s to the desired
f4c0: 0a 2a 2a 20 72 65 67 69 73 74 65 72 2e 0a 2a 2f  .** register..*/
f4d0: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69  .static int sqli
f4e0: 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65  te3ExprCodeTarge
f4f0: 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  t(Parse *pParse,
f500: 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e   Expr *pExpr, in
f510: 74 20 74 61 72 67 65 74 29 7b 0a 20 20 56 64 62  t target){.  Vdb
f520: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
f530: 56 64 62 65 3b 20 20 2f 2a 20 54 68 65 20 56 4d  Vdbe;  /* The VM
f540: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
f550: 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b  ion */.  int op;
f560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f570: 20 20 20 2f 2a 20 54 68 65 20 6f 70 63 6f 64 65     /* The opcode
f580: 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a   being coded */.
f590: 20 20 69 6e 74 20 69 6e 52 65 67 20 3d 20 74 61    int inReg = ta
f5a0: 72 67 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 52  rget;       /* R
f5b0: 65 73 75 6c 74 73 20 73 74 6f 72 65 64 20 69 6e  esults stored in
f5c0: 20 72 65 67 69 73 74 65 72 20 69 6e 52 65 67 20   register inReg 
f5d0: 2a 2f 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65  */.  int regFree
f5e0: 31 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f  1 = 0;         /
f5f0: 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20 66 72  * If non-zero fr
f600: 65 65 20 74 68 69 73 20 74 65 6d 70 6f 72 61 72  ee this temporar
f610: 79 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20  y register */.  
f620: 69 6e 74 20 72 65 67 46 72 65 65 32 20 3d 20 30  int regFree2 = 0
f630: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  ;         /* If 
f640: 6e 6f 6e 2d 7a 65 72 6f 20 66 72 65 65 20 74 68  non-zero free th
f650: 69 73 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67  is temporary reg
f660: 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72  ister */.  int r
f670: 31 2c 20 72 32 2c 20 72 33 3b 20 20 20 20 20 20  1, r2, r3;      
f680: 20 20 20 20 20 2f 2a 20 56 61 72 69 6f 75 73 20       /* Various 
f690: 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72 73  register numbers
f6a0: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 76   */..  assert( v
f6b0: 21 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64  !=0 || pParse->d
f6c0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
f6d0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 74 61 72  );.  assert( tar
f6e0: 67 65 74 3e 30 20 26 26 20 74 61 72 67 65 74 3c  get>0 && target<
f6f0: 3d 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 29 3b  =pParse->nMem );
f700: 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65  .  if( v==0 ) re
f710: 74 75 72 6e 20 30 3b 0a 0a 20 20 69 66 28 20 70  turn 0;..  if( p
f720: 45 78 70 72 3d 3d 30 20 29 7b 0a 20 20 20 20 6f  Expr==0 ){.    o
f730: 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 7d  p = TK_NULL;.  }
f740: 65 6c 73 65 7b 0a 20 20 20 20 6f 70 20 3d 20 70  else{.    op = p
f750: 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 7d 0a 20 20  Expr->op;.  }.  
f760: 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20  switch( op ){.  
f770: 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f    case TK_AGG_CO
f780: 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 41 67  LUMN: {.      Ag
f790: 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 20  gInfo *pAggInfo 
f7a0: 3d 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66  = pExpr->pAggInf
f7b0: 6f 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  o;.      struct 
f7c0: 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f  AggInfo_col *pCo
f7d0: 6c 20 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e 61  l = &pAggInfo->a
f7e0: 43 6f 6c 5b 70 45 78 70 72 2d 3e 69 41 67 67 5d  Col[pExpr->iAgg]
f7f0: 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 41 67  ;.      if( !pAg
f800: 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64  gInfo->directMod
f810: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  e ){.        ass
f820: 65 72 74 28 20 70 43 6f 6c 2d 3e 69 4d 65 6d 3e  ert( pCol->iMem>
f830: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 52  0 );.        inR
f840: 65 67 20 3d 20 70 43 6f 6c 2d 3e 69 4d 65 6d 3b  eg = pCol->iMem;
f850: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
f860: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
f870: 70 41 67 67 49 6e 66 6f 2d 3e 75 73 65 53 6f 72  pAggInfo->useSor
f880: 74 69 6e 67 49 64 78 20 29 7b 0a 20 20 20 20 20  tingIdx ){.     
f890: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
f8a0: 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
f8b0: 6e 2c 20 70 41 67 67 49 6e 66 6f 2d 3e 73 6f 72  n, pAggInfo->sor
f8c0: 74 69 6e 67 49 64 78 2c 0a 20 20 20 20 20 20 20  tingIdx,.       
f8d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f8e0: 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f         pCol->iSo
f8f0: 72 74 65 72 43 6f 6c 75 6d 6e 2c 20 74 61 72 67  rterColumn, targ
f900: 65 74 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  et);.        bre
f910: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
f920: 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 2c 20    /* Otherwise, 
f930: 66 61 6c 6c 20 74 68 72 75 20 69 6e 74 6f 20 74  fall thru into t
f940: 68 65 20 54 4b 5f 43 4f 4c 55 4d 4e 20 63 61 73  he TK_COLUMN cas
f950: 65 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 63  e */.    }.    c
f960: 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b  ase TK_COLUMN: {
f970: 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
f980: 2d 3e 69 54 61 62 6c 65 3c 30 20 29 7b 0a 20 20  ->iTable<0 ){.  
f990: 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 6f 6e        /* This on
f9a0: 6c 79 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20  ly happens when 
f9b0: 63 6f 64 69 6e 67 20 63 68 65 63 6b 20 63 6f 6e  coding check con
f9c0: 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 20 20  straints */.    
f9d0: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
f9e0: 73 65 2d 3e 63 6b 42 61 73 65 3e 30 20 29 3b 0a  se->ckBase>0 );.
f9f0: 20 20 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20          inReg = 
fa00: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 2b  pExpr->iColumn +
fa10: 20 70 50 61 72 73 65 2d 3e 63 6b 42 61 73 65 3b   pParse->ckBase;
fa20: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
fa30: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
fa40: 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28 76  rCodeGetColumn(v
fa50: 2c 20 70 45 78 70 72 2d 3e 70 54 61 62 2c 0a 20  , pExpr->pTab,. 
fa60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fa70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fa80: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20  pExpr->iColumn, 
fa90: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 74  pExpr->iTable, t
faa0: 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a  arget);.      }.
fab0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
fac0: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49   }.    case TK_I
fad0: 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20 20 20  NTEGER: {.      
fae0: 63 6f 64 65 49 6e 74 65 67 65 72 28 76 2c 20 28  codeInteger(v, (
faf0: 63 68 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f 6b  char*)pExpr->tok
fb00: 65 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b  en.z, pExpr->tok
fb10: 65 6e 2e 6e 2c 20 30 2c 20 74 61 72 67 65 74 29  en.n, 0, target)
fb20: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
fb30: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
fb40: 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20  _FLOAT: {.      
fb50: 63 6f 64 65 52 65 61 6c 28 76 2c 20 28 63 68 61  codeReal(v, (cha
fb60: 72 2a 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e  r*)pExpr->token.
fb70: 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e  z, pExpr->token.
fb80: 6e 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20  n, 0, 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 62  oken.n);.      b
fc60: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
fc70: 63 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a 20 7b 0a  case TK_NULL: {.
fc80: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
fc90: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75  eAddOp2(v, OP_Nu
fca0: 6c 6c 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a  ll, 0, target);.
fcb0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
fcc0: 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
fcd0: 45 5f 4f 4d 49 54 5f 42 4c 4f 42 5f 4c 49 54 45  E_OMIT_BLOB_LITE
fce0: 52 41 4c 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  RAL.    case TK_
fcf0: 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20 69 6e  BLOB: {.      in
fd00: 74 20 6e 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74  t n;.      const
fd10: 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 20 20   char *z;.      
fd20: 63 68 61 72 20 2a 7a 42 6c 6f 62 3b 0a 20 20 20  char *zBlob;.   
fd30: 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
fd40: 2d 3e 74 6f 6b 65 6e 2e 6e 3e 3d 33 20 29 3b 0a  ->token.n>=3 );.
fd50: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
fd60: 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 5b 30 5d 3d  xpr->token.z[0]=
fd70: 3d 27 78 27 20 7c 7c 20 70 45 78 70 72 2d 3e 74  ='x' || pExpr->t
fd80: 6f 6b 65 6e 2e 7a 5b 30 5d 3d 3d 27 58 27 20 29  oken.z[0]=='X' )
fd90: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
fda0: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 5b 31  pExpr->token.z[1
fdb0: 5d 3d 3d 27 5c 27 27 20 29 3b 0a 20 20 20 20 20  ]=='\'' );.     
fdc0: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
fdd0: 74 6f 6b 65 6e 2e 7a 5b 70 45 78 70 72 2d 3e 74  token.z[pExpr->t
fde0: 6f 6b 65 6e 2e 6e 2d 31 5d 3d 3d 27 5c 27 27 20  oken.n-1]=='\'' 
fdf0: 29 3b 0a 20 20 20 20 20 20 6e 20 3d 20 70 45 78  );.      n = pEx
fe00: 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 20 2d 20 33 3b  pr->token.n - 3;
fe10: 0a 20 20 20 20 20 20 7a 20 3d 20 28 63 68 61 72  .      z = (char
fe20: 2a 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a  *)pExpr->token.z
fe30: 20 2b 20 32 3b 0a 20 20 20 20 20 20 7a 42 6c 6f   + 2;.      zBlo
fe40: 62 20 3d 20 73 71 6c 69 74 65 33 48 65 78 54 6f  b = sqlite3HexTo
fe50: 42 6c 6f 62 28 73 71 6c 69 74 65 33 56 64 62 65  Blob(sqlite3Vdbe
fe60: 44 62 28 76 29 2c 20 7a 2c 20 6e 29 3b 0a 20 20  Db(v), z, n);.  
fe70: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
fe80: 64 64 4f 70 34 28 76 2c 20 4f 50 5f 42 6c 6f 62  ddOp4(v, OP_Blob
fe90: 2c 20 6e 2f 32 2c 20 74 61 72 67 65 74 2c 20 30  , n/2, target, 0
fea0: 2c 20 7a 42 6c 6f 62 2c 20 50 34 5f 44 59 4e 41  , zBlob, P4_DYNA
feb0: 4d 49 43 29 3b 0a 20 20 20 20 20 20 62 72 65 61  MIC);.      brea
fec0: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
fed0: 20 20 20 20 63 61 73 65 20 54 4b 5f 56 41 52 49      case TK_VARI
fee0: 41 42 4c 45 3a 20 7b 0a 20 20 20 20 20 20 73 71  ABLE: {.      sq
fef0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
ff00: 76 2c 20 4f 50 5f 56 61 72 69 61 62 6c 65 2c 20  v, OP_Variable, 
ff10: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 74  pExpr->iTable, t
ff20: 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 69 66  arget);.      if
ff30: 28 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e  ( pExpr->token.n
ff40: 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  >1 ){.        sq
ff50: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
ff60: 34 28 76 2c 20 2d 31 2c 20 28 63 68 61 72 2a 29  4(v, -1, (char*)
ff70: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20  pExpr->token.z, 
ff80: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b  pExpr->token.n);
ff90: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
ffa0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
ffb0: 63 61 73 65 20 54 4b 5f 52 45 47 49 53 54 45 52  case TK_REGISTER
ffc0: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 52 65 67 20  : {.      inReg 
ffd0: 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b  = pExpr->iTable;
ffe0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
fff0: 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
10000 54 45 5f 4f 4d 49 54 5f 43 41 53 54 0a 20 20 20  TE_OMIT_CAST.   
10010 20 63 61 73 65 20 54 4b 5f 43 41 53 54 3a 20 7b   case TK_CAST: {
10020 0a 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73  .      /* Expres
10030 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 66 6f 72  sions of the for
10040 6d 3a 20 20 20 43 41 53 54 28 70 4c 65 66 74 20  m:   CAST(pLeft 
10050 41 53 20 74 6f 6b 65 6e 29 20 2a 2f 0a 20 20 20  AS token) */.   
10060 20 20 20 69 6e 74 20 61 66 66 2c 20 74 6f 5f 6f     int aff, to_o
10070 70 3b 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d  p;.      inReg =
10080 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
10090 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70  Target(pParse, p
100a0 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 74 61 72  Expr->pLeft, tar
100b0 67 65 74 29 3b 0a 20 20 20 20 20 20 61 66 66 20  get);.      aff 
100c0 3d 20 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74  = sqlite3Affinit
100d0 79 54 79 70 65 28 26 70 45 78 70 72 2d 3e 74 6f  yType(&pExpr->to
100e0 6b 65 6e 29 3b 0a 20 20 20 20 20 20 74 6f 5f 6f  ken);.      to_o
100f0 70 20 3d 20 61 66 66 20 2d 20 53 51 4c 49 54 45  p = aff - SQLITE
10100 5f 41 46 46 5f 54 45 58 54 20 2b 20 4f 50 5f 54  _AFF_TEXT + OP_T
10110 6f 54 65 78 74 3b 0a 20 20 20 20 20 20 61 73 73  oText;.      ass
10120 65 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54  ert( to_op==OP_T
10130 6f 54 65 78 74 20 20 20 20 7c 7c 20 61 66 66 21  oText    || aff!
10140 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54  =SQLITE_AFF_TEXT
10150 20 20 20 20 29 3b 0a 20 20 20 20 20 20 61 73 73      );.      ass
10160 65 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54  ert( to_op==OP_T
10170 6f 42 6c 6f 62 20 20 20 20 7c 7c 20 61 66 66 21  oBlob    || aff!
10180 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45  =SQLITE_AFF_NONE
10190 20 20 20 20 29 3b 0a 20 20 20 20 20 20 61 73 73      );.      ass
101a0 65 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54  ert( to_op==OP_T
101b0 6f 4e 75 6d 65 72 69 63 20 7c 7c 20 61 66 66 21  oNumeric || aff!
101c0 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45  =SQLITE_AFF_NUME
101d0 52 49 43 20 29 3b 0a 20 20 20 20 20 20 61 73 73  RIC );.      ass
101e0 65 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54  ert( to_op==OP_T
101f0 6f 49 6e 74 20 20 20 20 20 7c 7c 20 61 66 66 21  oInt     || aff!
10200 3d 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45  =SQLITE_AFF_INTE
10210 47 45 52 20 29 3b 0a 20 20 20 20 20 20 61 73 73  GER );.      ass
10220 65 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54  ert( to_op==OP_T
10230 6f 52 65 61 6c 20 20 20 20 7c 7c 20 61 66 66 21  oReal    || aff!
10240 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c  =SQLITE_AFF_REAL
10250 20 20 20 20 29 3b 0a 20 20 20 20 20 20 73 71 6c      );.      sql
10260 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
10270 2c 20 74 6f 5f 6f 70 2c 20 69 6e 52 65 67 29 3b  , to_op, inReg);
10280 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
10290 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
102a0 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54 20 2a  LITE_OMIT_CAST *
102b0 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54  /.    case TK_LT
102c0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45  :.    case TK_LE
102d0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54  :.    case TK_GT
102e0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45  :.    case TK_GE
102f0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45  :.    case TK_NE
10300 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51  :.    case TK_EQ
10310 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
10320 28 20 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 20 29  ( TK_LT==OP_Lt )
10330 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
10340 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 20 29 3b 0a  TK_LE==OP_Le );.
10350 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
10360 5f 47 54 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20 20  _GT==OP_Gt );.  
10370 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47      assert( TK_G
10380 45 3d 3d 4f 50 5f 47 65 20 29 3b 0a 20 20 20 20  E==OP_Ge );.    
10390 20 20 61 73 73 65 72 74 28 20 54 4b 5f 45 51 3d    assert( TK_EQ=
103a0 3d 4f 50 5f 45 71 20 29 3b 0a 20 20 20 20 20 20  =OP_Eq );.      
103b0 61 73 73 65 72 74 28 20 54 4b 5f 4e 45 3d 3d 4f  assert( TK_NE==O
103c0 50 5f 4e 65 20 29 3b 0a 20 20 20 20 20 20 72 31  P_Ne );.      r1
103d0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
103e0 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
103f0 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65  Expr->pLeft, &re
10400 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 72  gFree1);.      r
10410 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  2 = sqlite3ExprC
10420 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
10430 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26  pExpr->pRight, &
10440 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20  regFree2);.     
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 61 73 73 65 72 74 28 20 54 4b 5f 41 4e     assert( TK_AN
105c0 44 3d 3d 4f 50 5f 41 6e 64 20 29 3b 0a 20 20 20  D==OP_And );.   
105d0 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4f 52     assert( TK_OR
105e0 3d 3d 4f 50 5f 4f 72 20 29 3b 0a 20 20 20 20 20  ==OP_Or );.     
105f0 20 61 73 73 65 72 74 28 20 54 4b 5f 50 4c 55 53   assert( TK_PLUS
10600 3d 3d 4f 50 5f 41 64 64 20 29 3b 0a 20 20 20 20  ==OP_Add );.    
10610 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4d 49 4e    assert( TK_MIN
10620 55 53 3d 3d 4f 50 5f 53 75 62 74 72 61 63 74 20  US==OP_Subtract 
10630 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
10640 20 54 4b 5f 52 45 4d 3d 3d 4f 50 5f 52 65 6d 61   TK_REM==OP_Rema
10650 69 6e 64 65 72 20 29 3b 0a 20 20 20 20 20 20 61  inder );.      a
10660 73 73 65 72 74 28 20 54 4b 5f 42 49 54 41 4e 44  ssert( TK_BITAND
10670 3d 3d 4f 50 5f 42 69 74 41 6e 64 20 29 3b 0a 20  ==OP_BitAnd );. 
10680 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
10690 42 49 54 4f 52 3d 3d 4f 50 5f 42 69 74 4f 72 20  BITOR==OP_BitOr 
106a0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
106b0 20 54 4b 5f 53 4c 41 53 48 3d 3d 4f 50 5f 44 69   TK_SLASH==OP_Di
106c0 76 69 64 65 20 29 3b 0a 20 20 20 20 20 20 61 73  vide );.      as
106d0 73 65 72 74 28 20 54 4b 5f 4c 53 48 49 46 54 3d  sert( TK_LSHIFT=
106e0 3d 4f 50 5f 53 68 69 66 74 4c 65 66 74 20 29 3b  =OP_ShiftLeft );
106f0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
10700 4b 5f 52 53 48 49 46 54 3d 3d 4f 50 5f 53 68 69  K_RSHIFT==OP_Shi
10710 66 74 52 69 67 68 74 20 29 3b 0a 20 20 20 20 20  ftRight );.     
10720 20 61 73 73 65 72 74 28 20 54 4b 5f 43 4f 4e 43   assert( TK_CONC
10730 41 54 3d 3d 4f 50 5f 43 6f 6e 63 61 74 20 29 3b  AT==OP_Concat );
10740 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69  .      r1 = sqli
10750 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
10760 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
10770 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29  Left, &regFree1)
10780 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c  ;.      r2 = sql
10790 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
107a0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
107b0 70 52 69 67 68 74 2c 20 26 72 65 67 46 72 65 65  pRight, &regFree
107c0 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  2);.      sqlite
107d0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 6f  3VdbeAddOp3(v, o
107e0 70 2c 20 72 32 2c 20 72 31 2c 20 74 61 72 67 65  p, r2, r1, targe
107f0 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  t);.      break;
10800 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
10810 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20  TK_UMINUS: {.   
10820 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d     Expr *pLeft =
10830 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20   pExpr->pLeft;. 
10840 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 65       assert( pLe
10850 66 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ft );.      if( 
10860 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c  pLeft->op==TK_FL
10870 4f 41 54 20 7c 7c 20 70 4c 65 66 74 2d 3e 6f 70  OAT || pLeft->op
10880 3d 3d 54 4b 5f 49 4e 54 45 47 45 52 20 29 7b 0a  ==TK_INTEGER ){.
10890 20 20 20 20 20 20 20 20 54 6f 6b 65 6e 20 2a 70          Token *p
108a0 20 3d 20 26 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e   = &pLeft->token
108b0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4c  ;.        if( pL
108c0 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41  eft->op==TK_FLOA
108d0 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63  T ){.          c
108e0 6f 64 65 52 65 61 6c 28 76 2c 20 28 63 68 61 72  odeReal(v, (char
108f0 2a 29 70 2d 3e 7a 2c 20 70 2d 3e 6e 2c 20 31 2c  *)p->z, p->n, 1,
10900 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
10910 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
10920 20 20 20 63 6f 64 65 49 6e 74 65 67 65 72 28 76     codeInteger(v
10930 2c 20 28 63 68 61 72 2a 29 70 2d 3e 7a 2c 20 70  , (char*)p->z, p
10940 2d 3e 6e 2c 20 31 2c 20 74 61 72 67 65 74 29 3b  ->n, 1, target);
10950 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
10960 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
10970 72 65 67 46 72 65 65 31 20 3d 20 72 31 20 3d 20  regFree1 = r1 = 
10980 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
10990 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
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 72 32 20 3d 20 73 71 6c 69 74 65 33      r2 = sqlite3
109e0 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70  ExprCodeTarget(p
109f0 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
10a00 65 66 74 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  eft, target);.  
10a10 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
10a20 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 75  eAddOp3(v, OP_Su
10a30 62 74 72 61 63 74 2c 20 72 32 2c 20 72 31 2c 20  btract, r2, r1, 
10a40 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 7d  target);.      }
10a50 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 74  .      inReg = t
10a60 61 72 67 65 74 3b 0a 20 20 20 20 20 20 62 72 65  arget;.      bre
10a70 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
10a80 73 65 20 54 4b 5f 42 49 54 4e 4f 54 3a 0a 20 20  se TK_BITNOT:.  
10a90 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b    case TK_NOT: {
10aa0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
10ab0 4b 5f 42 49 54 4e 4f 54 3d 3d 4f 50 5f 42 69 74  K_BITNOT==OP_Bit
10ac0 4e 6f 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73  Not );.      ass
10ad0 65 72 74 28 20 54 4b 5f 4e 4f 54 3d 3d 4f 50 5f  ert( TK_NOT==OP_
10ae0 4e 6f 74 20 29 3b 0a 20 20 20 20 20 20 69 6e 52  Not );.      inR
10af0 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  eg = sqlite3Expr
10b00 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73  CodeTarget(pPars
10b10 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
10b20 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
10b30 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10b40 31 28 76 2c 20 6f 70 2c 20 69 6e 52 65 67 29 3b  1(v, op, inReg);
10b50 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
10b60 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
10b70 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65  ISNULL:.    case
10b80 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20   TK_NOTNULL: {. 
10b90 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20       int addr;. 
10ba0 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
10bb0 49 53 4e 55 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c  ISNULL==OP_IsNul
10bc0 6c 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  l );.      asser
10bd0 74 28 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f  t( TK_NOTNULL==O
10be0 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 0a 20 20 20  P_NotNull );.   
10bf0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
10c00 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
10c10 65 72 2c 20 31 2c 20 74 61 72 67 65 74 29 3b 0a  er, 1, target);.
10c20 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
10c30 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
10c40 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
10c50 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b  eft, &regFree1);
10c60 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71  .      addr = sq
10c70 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
10c80 76 2c 20 6f 70 2c 20 72 31 29 3b 0a 20 20 20 20  v, op, r1);.    
10c90 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
10ca0 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d  Op2(v, OP_AddImm
10cb0 2c 20 74 61 72 67 65 74 2c 20 2d 31 29 3b 0a 20  , target, -1);. 
10cc0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
10cd0 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
10ce0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
10cf0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
10d00 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 20  K_AGG_FUNCTION: 
10d10 7b 0a 20 20 20 20 20 20 41 67 67 49 6e 66 6f 20  {.      AggInfo 
10d20 2a 70 49 6e 66 6f 20 3d 20 70 45 78 70 72 2d 3e  *pInfo = pExpr->
10d30 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20  pAggInfo;.      
10d40 69 66 28 20 70 49 6e 66 6f 3d 3d 30 20 29 7b 0a  if( pInfo==0 ){.
10d50 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
10d60 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
10d70 22 6d 69 73 75 73 65 20 6f 66 20 61 67 67 72 65  "misuse of aggre
10d80 67 61 74 65 3a 20 25 54 22 2c 0a 20 20 20 20 20  gate: %T",.     
10d90 20 20 20 20 20 20 20 26 70 45 78 70 72 2d 3e 73         &pExpr->s
10da0 70 61 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  pan);.      }els
10db0 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 52 65 67  e{.        inReg
10dc0 20 3d 20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b   = pInfo->aFunc[
10dd0 70 45 78 70 72 2d 3e 69 41 67 67 5d 2e 69 4d 65  pExpr->iAgg].iMe
10de0 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  m;.      }.     
10df0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
10e00 20 20 63 61 73 65 20 54 4b 5f 43 4f 4e 53 54 5f    case TK_CONST_
10e10 46 55 4e 43 3a 0a 20 20 20 20 63 61 73 65 20 54  FUNC:.    case T
10e20 4b 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20  K_FUNCTION: {.  
10e30 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c      ExprList *pL
10e40 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69  ist = pExpr->pLi
10e50 73 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 45  st;.      int nE
10e60 78 70 72 20 3d 20 70 4c 69 73 74 20 3f 20 70 4c  xpr = pList ? pL
10e70 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 0a  ist->nExpr : 0;.
10e80 20 20 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70        FuncDef *p
10e90 44 65 66 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e  Def;.      int n
10ea0 49 64 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20  Id;.      const 
10eb0 63 68 61 72 20 2a 7a 49 64 3b 0a 20 20 20 20 20  char *zId;.     
10ec0 20 69 6e 74 20 63 6f 6e 73 74 4d 61 73 6b 20 3d   int constMask =
10ed0 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b   0;.      int i;
10ee0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a  .      sqlite3 *
10ef0 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
10f00 0a 20 20 20 20 20 20 75 38 20 65 6e 63 20 3d 20  .      u8 enc = 
10f10 45 4e 43 28 64 62 29 3b 0a 20 20 20 20 20 20 43  ENC(db);.      C
10f20 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20  ollSeq *pColl = 
10f30 30 3b 0a 0a 20 20 20 20 20 20 7a 49 64 20 3d 20  0;..      zId = 
10f40 28 63 68 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f  (char*)pExpr->to
10f50 6b 65 6e 2e 7a 3b 0a 20 20 20 20 20 20 6e 49 64  ken.z;.      nId
10f60 20 3d 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e   = pExpr->token.
10f70 6e 3b 0a 20 20 20 20 20 20 70 44 65 66 20 3d 20  n;.      pDef = 
10f80 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74  sqlite3FindFunct
10f90 69 6f 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ion(pParse->db, 
10fa0 7a 49 64 2c 20 6e 49 64 2c 20 6e 45 78 70 72 2c  zId, nId, nExpr,
10fb0 20 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20   enc, 0);.      
10fc0 61 73 73 65 72 74 28 20 70 44 65 66 21 3d 30 20  assert( pDef!=0 
10fd0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 69  );.      if( pLi
10fe0 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 45  st ){.        nE
10ff0 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78  xpr = pList->nEx
11000 70 72 3b 0a 20 20 20 20 20 20 20 20 72 31 20 3d  pr;.        r1 =
11010 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
11020 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 45 78  ange(pParse, nEx
11030 70 72 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  pr);.        sql
11040 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72  ite3ExprCodeExpr
11050 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 4c 69  List(pParse, pLi
11060 73 74 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 7d  st, r1);.      }
11070 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6e 45  else{.        nE
11080 78 70 72 20 3d 20 72 31 20 3d 20 30 3b 0a 20 20  xpr = r1 = 0;.  
11090 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
110a0 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
110b0 4c 54 41 42 4c 45 0a 20 20 20 20 20 20 2f 2a 20  LTABLE.      /* 
110c0 50 6f 73 73 69 62 6c 79 20 6f 76 65 72 6c 6f 61  Possibly overloa
110d0 64 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 69  d the function i
110e0 66 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  f the first argu
110f0 6d 65 6e 74 20 69 73 0a 20 20 20 20 20 20 2a 2a  ment is.      **
11100 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65   a virtual table
11110 20 63 6f 6c 75 6d 6e 2e 0a 20 20 20 20 20 20 2a   column..      *
11120 2a 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72 20 69  *.      ** For i
11130 6e 66 69 78 20 66 75 6e 63 74 69 6f 6e 73 20 28  nfix functions (
11140 4c 49 4b 45 2c 20 47 4c 4f 42 2c 20 52 45 47 45  LIKE, GLOB, REGE
11150 58 50 2c 20 61 6e 64 20 4d 41 54 43 48 29 20 75  XP, and MATCH) u
11160 73 65 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  se the.      ** 
11170 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c  second argument,
11180 20 6e 6f 74 20 74 68 65 20 66 69 72 73 74 2c 20   not the first, 
11190 61 73 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20  as the argument 
111a0 74 6f 20 74 65 73 74 20 74 6f 0a 20 20 20 20 20  to test to.     
111b0 20 2a 2a 20 73 65 65 20 69 66 20 69 74 20 69 73   ** see if it is
111c0 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 61 20 76   a column in a v
111d0 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20 20 54  irtual table.  T
111e0 68 69 73 20 69 73 20 64 6f 6e 65 20 62 65 63 61  his is done beca
111f0 75 73 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  use.      ** the
11200 20 6c 65 66 74 20 6f 70 65 72 61 6e 64 20 6f 66   left operand of
11210 20 69 6e 66 69 78 20 66 75 6e 63 74 69 6f 6e 73   infix functions
11220 20 28 74 68 65 20 6f 70 65 72 61 6e 64 20 77 65   (the operand we
11230 20 77 61 6e 74 20 74 6f 0a 20 20 20 20 20 20 2a   want to.      *
11240 2a 20 63 6f 6e 74 72 6f 6c 20 6f 76 65 72 6c 6f  * control overlo
11250 61 64 69 6e 67 29 20 65 6e 64 73 20 75 70 20 61  ading) ends up a
11260 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
11270 75 6d 65 6e 74 20 74 6f 20 74 68 65 0a 20 20 20  ument to the.   
11280 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 20     ** function. 
11290 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
112a0 22 41 20 67 6c 6f 62 20 42 22 20 69 73 20 65 71  "A glob B" is eq
112b0 75 69 76 61 6c 65 6e 74 20 74 6f 20 0a 20 20 20  uivalent to .   
112c0 20 20 20 2a 2a 20 22 67 6c 6f 62 28 42 2c 41 29     ** "glob(B,A)
112d0 2e 20 20 57 65 20 77 61 6e 74 20 74 6f 20 75 73  .  We want to us
112e0 65 20 74 68 65 20 41 20 69 6e 20 22 41 20 67 6c  e the A in "A gl
112f0 6f 62 20 42 22 20 74 6f 20 74 65 73 74 0a 20 20  ob B" to test.  
11300 20 20 20 20 2a 2a 20 66 6f 72 20 66 75 6e 63 74      ** for funct
11310 69 6f 6e 20 6f 76 65 72 6c 6f 61 64 69 6e 67 2e  ion overloading.
11320 20 20 42 75 74 20 77 65 20 75 73 65 20 74 68 65    But we use the
11330 20 42 20 74 65 72 6d 20 69 6e 20 22 67 6c 6f 62   B term in "glob
11340 28 42 2c 41 29 22 2e 0a 20 20 20 20 20 20 2a 2f  (B,A)"..      */
11350 0a 20 20 20 20 20 20 69 66 28 20 6e 45 78 70 72  .      if( nExpr
11360 3e 3d 32 20 26 26 20 28 70 45 78 70 72 2d 3e 66  >=2 && (pExpr->f
11370 6c 61 67 73 20 26 20 45 50 5f 49 6e 66 69 78 46  lags & EP_InfixF
11380 75 6e 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20  unc) ){.        
11390 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33 56 74  pDef = sqlite3Vt
113a0 61 62 4f 76 65 72 6c 6f 61 64 46 75 6e 63 74 69  abOverloadFuncti
113b0 6f 6e 28 64 62 2c 20 70 44 65 66 2c 20 6e 45 78  on(db, pDef, nEx
113c0 70 72 2c 20 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e  pr, pList->a[1].
113d0 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 65  pExpr);.      }e
113e0 6c 73 65 20 69 66 28 20 6e 45 78 70 72 3e 30 20  lse if( nExpr>0 
113f0 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65 66 20  ){.        pDef 
11400 3d 20 73 71 6c 69 74 65 33 56 74 61 62 4f 76 65  = sqlite3VtabOve
11410 72 6c 6f 61 64 46 75 6e 63 74 69 6f 6e 28 64 62  rloadFunction(db
11420 2c 20 70 44 65 66 2c 20 6e 45 78 70 72 2c 20 70  , pDef, nExpr, p
11430 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
11440 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
11450 66 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  f.      for(i=0;
11460 20 69 3c 6e 45 78 70 72 20 26 26 20 69 3c 33 32   i<nExpr && i<32
11470 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
11480 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49  if( sqlite3ExprI
11490 73 43 6f 6e 73 74 61 6e 74 28 70 4c 69 73 74 2d  sConstant(pList-
114a0 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a  >a[i].pExpr) ){.
114b0 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 4d            constM
114c0 61 73 6b 20 7c 3d 20 28 31 3c 3c 69 29 3b 0a 20  ask |= (1<<i);. 
114d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
114e0 20 69 66 28 20 70 44 65 66 2d 3e 6e 65 65 64 43   if( pDef->needC
114f0 6f 6c 6c 53 65 71 20 26 26 20 21 70 43 6f 6c 6c  ollSeq && !pColl
11500 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43   ){.          pC
11510 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
11520 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
11530 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78   pList->a[i].pEx
11540 70 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  pr);.        }. 
11550 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
11560 20 70 44 65 66 2d 3e 6e 65 65 64 43 6f 6c 6c 53   pDef->needCollS
11570 65 71 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  eq ){.        if
11580 28 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c  ( !pColl ) pColl
11590 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70   = pParse->db->p
115a0 44 66 6c 74 43 6f 6c 6c 3b 20 0a 20 20 20 20 20  DfltColl; .     
115b0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
115c0 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53  dOp4(v, OP_CollS
115d0 65 71 2c 20 30 2c 20 30 2c 20 30 2c 20 28 63 68  eq, 0, 0, 0, (ch
115e0 61 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43  ar *)pColl, P4_C
115f0 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 20 20 7d  OLLSEQ);.      }
11600 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
11610 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 46  beAddOp4(v, OP_F
11620 75 6e 63 74 69 6f 6e 2c 20 63 6f 6e 73 74 4d 61  unction, constMa
11630 73 6b 2c 20 72 31 2c 20 74 61 72 67 65 74 2c 0a  sk, r1, target,.
11640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11650 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70          (char*)p
11660 44 65 66 2c 20 50 34 5f 46 55 4e 43 44 45 46 29  Def, P4_FUNCDEF)
11670 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
11680 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 6e  dbeChangeP5(v, n
11690 45 78 70 72 29 3b 0a 20 20 20 20 20 20 69 66 28  Expr);.      if(
116a0 20 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20   nExpr ){.      
116b0 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
116c0 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
116d0 2c 20 72 31 2c 20 6e 45 78 70 72 29 3b 0a 20 20  , r1, nExpr);.  
116e0 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
116f0 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  k;.    }.#ifndef
11700 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
11710 51 55 45 52 59 0a 20 20 20 20 63 61 73 65 20 54  QUERY.    case T
11720 4b 5f 45 58 49 53 54 53 3a 0a 20 20 20 20 63 61  K_EXISTS:.    ca
11730 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a  se TK_SELECT: {.
11740 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
11750 3e 69 43 6f 6c 75 6d 6e 3d 3d 30 20 29 7b 0a 20  >iColumn==0 ){. 
11760 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f         sqlite3Co
11770 64 65 53 75 62 73 65 6c 65 63 74 28 70 50 61 72  deSubselect(pPar
11780 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20  se, pExpr);.    
11790 20 20 7d 0a 20 20 20 20 20 20 69 6e 52 65 67 20    }.      inReg 
117a0 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  = pExpr->iColumn
117b0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
117c0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
117d0 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  _IN: {.      int
117e0 20 6a 31 2c 20 6a 32 2c 20 6a 33 2c 20 6a 34 2c   j1, j2, j3, j4,
117f0 20 6a 35 3b 0a 20 20 20 20 20 20 63 68 61 72 20   j5;.      char 
11800 61 66 66 69 6e 69 74 79 3b 0a 20 20 20 20 20 20  affinity;.      
11810 69 6e 74 20 65 54 79 70 65 3b 0a 0a 20 20 20 20  int eType;..    
11820 20 20 65 54 79 70 65 20 3d 20 73 71 6c 69 74 65    eType = sqlite
11830 33 46 69 6e 64 49 6e 49 6e 64 65 78 28 70 50 61  3FindInIndex(pPa
11840 72 73 65 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a  rse, pExpr, 0);.
11850 0a 20 20 20 20 20 20 2f 2a 20 46 69 67 75 72 65  .      /* Figure
11860 20 6f 75 74 20 74 68 65 20 61 66 66 69 6e 69 74   out the affinit
11870 79 20 74 6f 20 75 73 65 20 74 6f 20 63 72 65 61  y to use to crea
11880 74 65 20 61 20 6b 65 79 20 66 72 6f 6d 20 74 68  te a key from th
11890 65 20 72 65 73 75 6c 74 73 0a 20 20 20 20 20 20  e results.      
118a0 2a 2a 20 6f 66 20 74 68 65 20 65 78 70 72 65 73  ** of the expres
118b0 73 69 6f 6e 2e 20 61 66 66 69 6e 69 74 79 53 74  sion. affinitySt
118c0 72 20 73 74 6f 72 65 73 20 61 20 73 74 61 74 69  r stores a stati
118d0 63 20 73 74 72 69 6e 67 20 73 75 69 74 61 62 6c  c string suitabl
118e0 65 20 66 6f 72 0a 20 20 20 20 20 20 2a 2a 20 50  e for.      ** P
118f0 34 20 6f 66 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  4 of OP_MakeReco
11900 72 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  rd..      */.   
11910 20 20 20 61 66 66 69 6e 69 74 79 20 3d 20 63 6f     affinity = co
11920 6d 70 61 72 69 73 6f 6e 41 66 66 69 6e 69 74 79  mparisonAffinity
11930 28 70 45 78 70 72 29 3b 0a 0a 20 20 20 20 20 20  (pExpr);..      
11940 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
11950 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
11960 20 31 2c 20 74 61 72 67 65 74 29 3b 0a 0a 20 20   1, target);..  
11970 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20      /* Code the 
11980 3c 65 78 70 72 3e 20 66 72 6f 6d 20 22 3c 65 78  <expr> from "<ex
11990 70 72 3e 20 49 4e 20 28 2e 2e 2e 29 22 2e 20 54  pr> IN (...)". T
119a0 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  he temporary tab
119b0 6c 65 0a 20 20 20 20 20 20 2a 2a 20 70 45 78 70  le.      ** pExp
119c0 72 2d 3e 69 54 61 62 6c 65 20 63 6f 6e 74 61 69  r->iTable contai
119d0 6e 73 20 74 68 65 20 76 61 6c 75 65 73 20 74 68  ns the values th
119e0 61 74 20 6d 61 6b 65 20 75 70 20 74 68 65 20 28  at make up the (
119f0 2e 2e 2e 29 20 73 65 74 2e 0a 20 20 20 20 20 20  ...) set..      
11a00 2a 2f 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71  */.      r1 = sq
11a10 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
11a20 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
11a30 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65  >pLeft, &regFree
11a40 31 29 3b 0a 20 20 20 20 20 20 6a 31 20 3d 20 73  1);.      j1 = s
11a50 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
11a60 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20  (v, OP_NotNull, 
11a70 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  r1);.      sqlit
11a80 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
11a90 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61 72 67  OP_Null, 0, targ
11aa0 65 74 29 3b 0a 20 20 20 20 20 20 6a 32 20 20 3d  et);.      j2  =
11ab0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
11ac0 70 30 28 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a  p0(v, OP_Goto);.
11ad0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
11ae0 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 31 29  eJumpHere(v, j1)
11af0 3b 0a 20 20 20 20 20 20 69 66 28 20 65 54 79 70  ;.      if( eTyp
11b00 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49  e==IN_INDEX_ROWI
11b10 44 20 29 7b 0a 20 20 20 20 20 20 20 20 6a 33 20  D ){.        j3 
11b20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
11b30 4f 70 33 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65  Op3(v, OP_MustBe
11b40 49 6e 74 2c 20 72 31 2c 20 30 2c 20 31 29 3b 0a  Int, r1, 0, 1);.
11b50 20 20 20 20 20 20 20 20 6a 34 20 3d 20 73 71 6c          j4 = sql
11b60 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
11b70 2c 20 4f 50 5f 4e 6f 74 45 78 69 73 74 73 2c 20  , OP_NotExists, 
11b80 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 30  pExpr->iTable, 0
11b90 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 6a  , r1);.        j
11ba0 35 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  5 = sqlite3VdbeA
11bb0 64 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp0(v, OP_Goto
11bc0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
11bd0 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
11be0 2c 20 6a 33 29 3b 0a 20 20 20 20 20 20 20 20 73  , j3);.        s
11bf0 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
11c00 72 65 28 76 2c 20 6a 34 29 3b 0a 20 20 20 20 20  re(v, j4);.     
11c10 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
11c20 72 32 20 3d 20 72 65 67 46 72 65 65 32 20 3d 20  r2 = regFree2 = 
11c30 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
11c40 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
11c50 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
11c60 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp4(v, OP_MakeR
11c70 65 63 6f 72 64 2c 20 72 31 2c 20 31 2c 20 72 32  ecord, r1, 1, r2
11c80 2c 20 26 61 66 66 69 6e 69 74 79 2c 20 31 29 3b  , &affinity, 1);
11c90 0a 20 20 20 20 20 20 20 20 6a 35 20 3d 20 73 71  .        j5 = sq
11ca0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
11cb0 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 70 45 78  v, OP_Found, pEx
11cc0 70 72 2d 3e 69 54 61 62 6c 65 2c 20 30 2c 20 72  pr->iTable, 0, r
11cd0 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  2);.      }.    
11ce0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
11cf0 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d  Op2(v, OP_AddImm
11d00 2c 20 74 61 72 67 65 74 2c 20 2d 31 29 3b 0a 20  , target, -1);. 
11d10 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
11d20 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 32 29 3b  JumpHere(v, j2);
11d30 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
11d40 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 35  beJumpHere(v, j5
11d50 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
11d60 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
11d70 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 20 20 78 20   /*.    **    x 
11d80 42 45 54 57 45 45 4e 20 79 20 41 4e 44 20 7a 0a  BETWEEN y AND z.
11d90 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
11da0 69 73 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74  is is equivalent
11db0 20 74 6f 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a   to.    **.    *
11dc0 2a 20 20 20 20 78 3e 3d 79 20 41 4e 44 20 78 3c  *    x>=y AND x<
11dd0 3d 7a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  =z.    **.    **
11de0 20 58 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20   X is stored in 
11df0 70 45 78 70 72 2d 3e 70 4c 65 66 74 2e 0a 20 20  pExpr->pLeft..  
11e00 20 20 2a 2a 20 59 20 69 73 20 73 74 6f 72 65 64    ** Y is stored
11e10 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 69 73 74   in pExpr->pList
11e20 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2e 0a 20 20  ->a[0].pExpr..  
11e30 20 20 2a 2a 20 5a 20 69 73 20 73 74 6f 72 65 64    ** Z is stored
11e40 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 69 73 74   in pExpr->pList
11e50 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 2e 0a 20 20  ->a[1].pExpr..  
11e60 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b    */.    case TK
11e70 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20  _BETWEEN: {.    
11e80 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20    Expr *pLeft = 
11e90 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20  pExpr->pLeft;.  
11ea0 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
11eb0 69 73 74 5f 69 74 65 6d 20 2a 70 4c 49 74 65 6d  ist_item *pLItem
11ec0 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d   = pExpr->pList-
11ed0 3e 61 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  >a;.      Expr *
11ee0 70 52 69 67 68 74 20 3d 20 70 4c 49 74 65 6d 2d  pRight = pLItem-
11ef0 3e 70 45 78 70 72 3b 0a 0a 20 20 20 20 20 20 72  >pExpr;..      r
11f00 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  1 = sqlite3ExprC
11f10 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
11f20 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31  pLeft, &regFree1
11f30 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71  );.      r2 = sq
11f40 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
11f50 70 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74  p(pParse, pRight
11f60 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20  , &regFree2);.  
11f70 20 20 20 20 72 33 20 3d 20 73 71 6c 69 74 65 33      r3 = sqlite3
11f80 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
11f90 65 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f  e);.      codeCo
11fa0 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 4c  mpare(pParse, pL
11fb0 65 66 74 2c 20 70 52 69 67 68 74 2c 20 4f 50 5f  eft, pRight, OP_
11fc0 47 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  Ge,.            
11fd0 20 20 20 20 20 20 72 31 2c 20 72 32 2c 20 72 33        r1, r2, r3
11fe0 2c 20 53 51 4c 49 54 45 5f 53 54 4f 52 45 50 32  , SQLITE_STOREP2
11ff0 29 3b 0a 20 20 20 20 20 20 70 4c 49 74 65 6d 2b  );.      pLItem+
12000 2b 3b 0a 20 20 20 20 20 20 70 52 69 67 68 74 20  +;.      pRight 
12010 3d 20 70 4c 49 74 65 6d 2d 3e 70 45 78 70 72 3b  = pLItem->pExpr;
12020 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
12030 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
12040 72 73 65 2c 20 72 65 67 46 72 65 65 32 29 3b 0a  rse, regFree2);.
12050 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74        r2 = sqlit
12060 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
12070 50 61 72 73 65 2c 20 70 52 69 67 68 74 2c 20 26  Parse, pRight, &
12080 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20  regFree2);.     
12090 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61   codeCompare(pPa
120a0 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 52 69 67  rse, pLeft, pRig
120b0 68 74 2c 20 4f 50 5f 4c 65 2c 20 72 31 2c 20 72  ht, OP_Le, r1, r
120c0 32 2c 20 72 32 2c 20 53 51 4c 49 54 45 5f 53 54  2, r2, SQLITE_ST
120d0 4f 52 45 50 32 29 3b 0a 20 20 20 20 20 20 73 71  OREP2);.      sq
120e0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
120f0 76 2c 20 4f 50 5f 41 6e 64 2c 20 72 33 2c 20 72  v, OP_And, r3, r
12100 32 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  2, target);.    
12110 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
12120 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
12130 72 33 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  r3);.      break
12140 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
12150 20 54 4b 5f 55 50 4c 55 53 3a 20 7b 0a 20 20 20   TK_UPLUS: {.   
12160 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74     inReg = sqlit
12170 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74  e3ExprCodeTarget
12180 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
12190 70 4c 65 66 74 2c 20 74 61 72 67 65 74 29 3b 0a  pLeft, target);.
121a0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
121b0 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a   }..    /*.    *
121c0 2a 20 46 6f 72 6d 20 41 3a 0a 20 20 20 20 2a 2a  * Form A:.    **
121d0 20 20 20 43 41 53 45 20 78 20 57 48 45 4e 20 65     CASE x WHEN e
121e0 31 20 54 48 45 4e 20 72 31 20 57 48 45 4e 20 65  1 THEN r1 WHEN e
121f0 32 20 54 48 45 4e 20 72 32 20 2e 2e 2e 20 57 48  2 THEN r2 ... WH
12200 45 4e 20 65 4e 20 54 48 45 4e 20 72 4e 20 45 4c  EN eN THEN rN EL
12210 53 45 20 79 20 45 4e 44 0a 20 20 20 20 2a 2a 0a  SE y END.    **.
12220 20 20 20 20 2a 2a 20 46 6f 72 6d 20 42 3a 0a 20      ** Form B:. 
12230 20 20 20 2a 2a 20 20 20 43 41 53 45 20 57 48 45     **   CASE WHE
12240 4e 20 65 31 20 54 48 45 4e 20 72 31 20 57 48 45  N e1 THEN r1 WHE
12250 4e 20 65 32 20 54 48 45 4e 20 72 32 20 2e 2e 2e  N e2 THEN r2 ...
12260 20 57 48 45 4e 20 65 4e 20 54 48 45 4e 20 72 4e   WHEN eN THEN rN
12270 20 45 4c 53 45 20 79 20 45 4e 44 0a 20 20 20 20   ELSE y END.    
12280 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 6d 20 41  **.    ** Form A
12290 20 69 73 20 63 61 6e 20 62 65 20 74 72 61 6e 73   is can be trans
122a0 66 6f 72 6d 65 64 20 69 6e 74 6f 20 74 68 65 20  formed into the 
122b0 65 71 75 69 76 61 6c 65 6e 74 20 66 6f 72 6d 20  equivalent form 
122c0 42 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20  B as follows:.  
122d0 20 20 2a 2a 20 20 20 43 41 53 45 20 57 48 45 4e    **   CASE WHEN
122e0 20 78 3d 65 31 20 54 48 45 4e 20 72 31 20 57 48   x=e1 THEN r1 WH
122f0 45 4e 20 78 3d 65 32 20 54 48 45 4e 20 72 32 20  EN x=e2 THEN r2 
12300 2e 2e 2e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  ....    **      
12310 20 20 57 48 45 4e 20 78 3d 65 4e 20 54 48 45 4e    WHEN x=eN THEN
12320 20 72 4e 20 45 4c 53 45 20 79 20 45 4e 44 0a 20   rN ELSE y END. 
12330 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 58 20 28     **.    ** X (
12340 69 66 20 69 74 20 65 78 69 73 74 73 29 20 69 73  if it exists) is
12350 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 65 66 74   in pExpr->pLeft
12360 2e 0a 20 20 20 20 2a 2a 20 59 20 69 73 20 69 6e  ..    ** Y is in
12370 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2e 20   pExpr->pRight. 
12380 20 54 68 65 20 59 20 69 73 20 61 6c 73 6f 20 6f   The Y is also o
12390 70 74 69 6f 6e 61 6c 2e 20 20 49 66 20 74 68 65  ptional.  If the
123a0 72 65 20 69 73 20 6e 6f 0a 20 20 20 20 2a 2a 20  re is no.    ** 
123b0 45 4c 53 45 20 63 6c 61 75 73 65 20 61 6e 64 20  ELSE clause and 
123c0 6e 6f 20 6f 74 68 65 72 20 74 65 72 6d 20 6d 61  no other term ma
123d0 74 63 68 65 73 2c 20 74 68 65 6e 20 74 68 65 20  tches, then the 
123e0 72 65 73 75 6c 74 20 6f 66 20 74 68 65 0a 20 20  result of the.  
123f0 20 20 2a 2a 20 65 78 70 72 73 73 69 6f 6e 20 69    ** exprssion i
12400 73 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2a 20 45  s NULL..    ** E
12410 69 20 69 73 20 69 6e 20 70 45 78 70 72 2d 3e 70  i is in pExpr->p
12420 4c 69 73 74 2d 3e 61 5b 69 2a 32 5d 20 61 6e 64  List->a[i*2] and
12430 20 52 69 20 69 73 20 70 45 78 70 72 2d 3e 70 4c   Ri is pExpr->pL
12440 69 73 74 2d 3e 61 5b 69 2a 32 2b 31 5d 2e 0a 20  ist->a[i*2+1].. 
12450 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
12460 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 65   result of the e
12470 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 68 65  xpression is the
12480 20 52 69 20 66 6f 72 20 74 68 65 20 66 69 72 73   Ri for the firs
12490 74 20 6d 61 74 63 68 69 6e 67 20 45 69 2c 0a 20  t matching Ei,. 
124a0 20 20 20 2a 2a 20 6f 72 20 69 66 20 74 68 65 72     ** or if ther
124b0 65 20 69 73 20 6e 6f 20 6d 61 74 63 68 69 6e 67  e is no matching
124c0 20 45 69 2c 20 74 68 65 20 45 4c 53 45 20 74 65   Ei, the ELSE te
124d0 72 6d 20 59 2c 20 6f 72 20 69 66 20 74 68 65 72  rm Y, or if ther
124e0 65 20 69 73 0a 20 20 20 20 2a 2a 20 6e 6f 20 45  e is.    ** no E
124f0 4c 53 45 20 74 65 72 6d 2c 20 4e 55 4c 4c 2e 0a  LSE term, NULL..
12500 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
12510 54 4b 5f 43 41 53 45 3a 20 7b 0a 20 20 20 20 20  TK_CASE: {.     
12520 20 69 6e 74 20 65 6e 64 4c 61 62 65 6c 3b 20 20   int endLabel;  
12530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12540 20 20 20 2f 2a 20 47 4f 54 4f 20 6c 61 62 65 6c     /* GOTO label
12550 20 66 6f 72 20 65 6e 64 20 6f 66 20 43 41 53 45   for end of CASE
12560 20 73 74 6d 74 20 2a 2f 0a 20 20 20 20 20 20 69   stmt */.      i
12570 6e 74 20 6e 65 78 74 43 61 73 65 3b 20 20 20 20  nt nextCase;    
12580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12590 20 2f 2a 20 47 4f 54 4f 20 6c 61 62 65 6c 20 66   /* GOTO label f
125a0 6f 72 20 6e 65 78 74 20 57 48 45 4e 20 63 6c 61  or next WHEN cla
125b0 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  use */.      int
125c0 20 6e 45 78 70 72 3b 20 20 20 20 20 20 20 20 20   nExpr;         
125d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
125e0 2a 20 32 78 20 6e 75 6d 62 65 72 20 6f 66 20 57  * 2x number of W
125f0 48 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20  HEN terms */.   
12600 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20     int i;       
12610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12620 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
12630 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 45 78  nter */.      Ex
12640 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 20  prList *pEList; 
12650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12660 2f 2a 20 4c 69 73 74 20 6f 66 20 57 48 45 4e 20  /* List of WHEN 
12670 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20 73  terms */.      s
12680 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
12690 74 65 6d 20 2a 61 4c 69 73 74 65 6c 65 6d 3b 20  tem *aListelem; 
126a0 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 57 48 45   /* Array of WHE
126b0 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20  N terms */.     
126c0 20 45 78 70 72 20 6f 70 43 6f 6d 70 61 72 65 3b   Expr opCompare;
126d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
126e0 20 20 20 2f 2a 20 54 68 65 20 58 3d 3d 45 69 20     /* The X==Ei 
126f0 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20  expression */.  
12700 20 20 20 20 45 78 70 72 20 63 61 63 68 65 58 3b      Expr cacheX;
12710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12720 20 20 20 20 20 20 2f 2a 20 43 61 63 68 65 64 20        /* Cached 
12730 65 78 70 72 65 73 73 69 6f 6e 20 58 20 2a 2f 0a  expression X */.
12740 20 20 20 20 20 20 45 78 70 72 20 2a 70 58 3b 20        Expr *pX; 
12750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12760 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 58          /* The X
12770 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20   expression */. 
12780 20 20 20 20 20 45 78 70 72 20 2a 70 54 65 73 74       Expr *pTest
12790 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
127a0 20 20 20 20 20 20 20 2f 2a 20 58 3d 3d 45 69 20         /* X==Ei 
127b0 28 66 6f 72 6d 20 41 29 20 6f 72 20 6a 75 73 74  (form A) or just
127c0 20 45 69 20 28 66 6f 72 6d 20 42 29 20 2a 2f 0a   Ei (form B) */.
127d0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 70 45  .      assert(pE
127e0 78 70 72 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 20  xpr->pList);.   
127f0 20 20 20 61 73 73 65 72 74 28 28 70 45 78 70 72     assert((pExpr
12800 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 25  ->pList->nExpr %
12810 20 32 29 20 3d 3d 20 30 29 3b 0a 20 20 20 20 20   2) == 0);.     
12820 20 61 73 73 65 72 74 28 70 45 78 70 72 2d 3e 70   assert(pExpr->p
12830 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3e 20 30 29  List->nExpr > 0)
12840 3b 0a 20 20 20 20 20 20 70 45 4c 69 73 74 20 3d  ;.      pEList =
12850 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b 0a 20   pExpr->pList;. 
12860 20 20 20 20 20 61 4c 69 73 74 65 6c 65 6d 20 3d       aListelem =
12870 20 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20   pEList->a;.    
12880 20 20 6e 45 78 70 72 20 3d 20 70 45 4c 69 73 74    nExpr = pEList
12890 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 65  ->nExpr;.      e
128a0 6e 64 4c 61 62 65 6c 20 3d 20 73 71 6c 69 74 65  ndLabel = sqlite
128b0 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
128c0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 58  );.      if( (pX
128d0 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29   = pExpr->pLeft)
128e0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63  !=0 ){.        c
128f0 61 63 68 65 58 20 3d 20 2a 70 58 3b 0a 20 20 20  acheX = *pX;.   
12900 20 20 20 20 20 63 61 63 68 65 58 2e 69 54 61 62       cacheX.iTab
12910 6c 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  le = sqlite3Expr
12920 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
12930 20 70 58 2c 20 26 72 65 67 46 72 65 65 31 29 3b   pX, &regFree1);
12940 0a 20 20 20 20 20 20 20 20 63 61 63 68 65 58 2e  .        cacheX.
12950 6f 70 20 3d 20 54 4b 5f 52 45 47 49 53 54 45 52  op = TK_REGISTER
12960 3b 0a 20 20 20 20 20 20 20 20 6f 70 43 6f 6d 70  ;.        opComp
12970 61 72 65 2e 6f 70 20 3d 20 54 4b 5f 45 51 3b 0a  are.op = TK_EQ;.
12980 20 20 20 20 20 20 20 20 6f 70 43 6f 6d 70 61 72          opCompar
12990 65 2e 70 4c 65 66 74 20 3d 20 26 63 61 63 68 65  e.pLeft = &cache
129a0 58 3b 0a 20 20 20 20 20 20 20 20 70 54 65 73 74  X;.        pTest
129b0 20 3d 20 26 6f 70 43 6f 6d 70 61 72 65 3b 0a 20   = &opCompare;. 
129c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72       }.      for
129d0 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72 3b 20 69  (i=0; i<nExpr; i
129e0 3d 69 2b 32 29 7b 0a 20 20 20 20 20 20 20 20 69  =i+2){.        i
129f0 66 28 20 70 58 20 29 7b 0a 20 20 20 20 20 20 20  f( pX ){.       
12a00 20 20 20 6f 70 43 6f 6d 70 61 72 65 2e 70 52 69     opCompare.pRi
12a10 67 68 74 20 3d 20 61 4c 69 73 74 65 6c 65 6d 5b  ght = aListelem[
12a20 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  i].pExpr;.      
12a30 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
12a40 20 20 20 70 54 65 73 74 20 3d 20 61 4c 69 73 74     pTest = aList
12a50 65 6c 65 6d 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  elem[i].pExpr;. 
12a60 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
12a70 20 6e 65 78 74 43 61 73 65 20 3d 20 73 71 6c 69   nextCase = sqli
12a80 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
12a90 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  (v);.        sql
12aa0 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
12ab0 70 50 61 72 73 65 2c 20 70 54 65 73 74 2c 20 6e  pParse, pTest, n
12ac0 65 78 74 43 61 73 65 2c 20 53 51 4c 49 54 45 5f  extCase, SQLITE_
12ad0 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20  JUMPIFNULL);.   
12ae0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
12af0 43 6f 64 65 28 70 50 61 72 73 65 2c 20 61 4c 69  Code(pParse, aLi
12b00 73 74 65 6c 65 6d 5b 69 2b 31 5d 2e 70 45 78 70  stelem[i+1].pExp
12b10 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  r, target);.    
12b20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
12b30 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
12b40 2c 20 30 2c 20 65 6e 64 4c 61 62 65 6c 29 3b 0a  , 0, endLabel);.
12b50 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
12b60 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
12b70 76 2c 20 6e 65 78 74 43 61 73 65 29 3b 0a 20 20  v, nextCase);.  
12b80 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
12b90 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20 29 7b  pExpr->pRight ){
12ba0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
12bb0 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
12bc0 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
12bd0 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 7d  target);.      }
12be0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
12bf0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
12c00 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74  v, OP_Null, 0, t
12c10 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a  arget);.      }.
12c20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
12c30 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
12c40 20 65 6e 64 4c 61 62 65 6c 29 3b 0a 20 20 20 20   endLabel);.    
12c50 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
12c60 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
12c70 49 54 5f 54 52 49 47 47 45 52 0a 20 20 20 20 63  IT_TRIGGER.    c
12c80 61 73 65 20 54 4b 5f 52 41 49 53 45 3a 20 7b 0a  ase TK_RAISE: {.
12c90 20 20 20 20 20 20 69 66 28 20 21 70 50 61 72 73        if( !pPars
12ca0 65 2d 3e 74 72 69 67 53 74 61 63 6b 20 29 7b 0a  e->trigStack ){.
12cb0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
12cc0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 0a  rrorMsg(pParse,.
12cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12ce0 20 20 20 20 20 20 20 22 52 41 49 53 45 28 29 20         "RAISE() 
12cf0 6d 61 79 20 6f 6e 6c 79 20 62 65 20 75 73 65 64  may only be used
12d00 20 77 69 74 68 69 6e 20 61 20 74 72 69 67 67 65   within a trigge
12d10 72 2d 70 72 6f 67 72 61 6d 22 29 3b 0a 20 20 20  r-program");.   
12d20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
12d30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
12d40 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 21   pExpr->iColumn!
12d50 3d 4f 45 5f 49 67 6e 6f 72 65 20 29 7b 0a 20 20  =OE_Ignore ){.  
12d60 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
12d70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 4f  Expr->iColumn==O
12d80 45 5f 52 6f 6c 6c 62 61 63 6b 20 7c 7c 0a 20 20  E_Rollback ||.  
12d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
12da0 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 3d  Expr->iColumn ==
12db0 20 4f 45 5f 41 62 6f 72 74 20 7c 7c 0a 20 20 20   OE_Abort ||.   
12dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
12dd0 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 3d 20  xpr->iColumn == 
12de0 4f 45 5f 46 61 69 6c 20 29 3b 0a 20 20 20 20 20  OE_Fail );.     
12df0 20 20 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f      sqlite3Dequo
12e00 74 65 45 78 70 72 28 70 50 61 72 73 65 2d 3e 64  teExpr(pParse->d
12e10 62 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20  b, pExpr);.     
12e20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
12e30 64 64 4f 70 34 28 76 2c 20 4f 50 5f 48 61 6c 74  ddOp4(v, OP_Halt
12e40 2c 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  , SQLITE_CONSTRA
12e50 49 4e 54 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c  INT, pExpr->iCol
12e60 75 6d 6e 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  umn, 0,.        
12e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12e80 28 63 68 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f  (char*)pExpr->to
12e90 6b 65 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f  ken.z, pExpr->to
12ea0 6b 65 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 7d 20  ken.n);.      } 
12eb0 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20  else {.         
12ec0 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 69  assert( pExpr->i
12ed0 43 6f 6c 75 6d 6e 20 3d 3d 20 4f 45 5f 49 67 6e  Column == OE_Ign
12ee0 6f 72 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ore );.         
12ef0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
12f00 32 28 76 2c 20 4f 50 5f 43 6f 6e 74 65 78 74 50  2(v, OP_ContextP
12f10 6f 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  op, 0, 0);.     
12f20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
12f30 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
12f40 2c 20 30 2c 20 70 50 61 72 73 65 2d 3e 74 72 69  , 0, pParse->tri
12f50 67 53 74 61 63 6b 2d 3e 69 67 6e 6f 72 65 4a 75  gStack->ignoreJu
12f60 6d 70 29 3b 0a 20 20 20 20 20 20 20 20 20 56 64  mp);.         Vd
12f70 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 72  beComment((v, "r
12f80 61 69 73 65 28 49 47 4e 4f 52 45 29 22 29 29 3b  aise(IGNORE)"));
12f90 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
12fa0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
12fb0 69 66 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  if.  }.  sqlite3
12fc0 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
12fd0 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 31 29  Parse, regFree1)
12fe0 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  ;.  sqlite3Relea
12ff0 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
13000 2c 20 72 65 67 46 72 65 65 32 29 3b 0a 20 20 72  , regFree2);.  r
13010 65 74 75 72 6e 20 69 6e 52 65 67 3b 0a 7d 0a 0a  eturn inReg;.}..
13020 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
13030 6f 64 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20  ode to evaluate 
13040 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e  an expression an
13050 64 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75  d store the resu
13060 6c 74 73 0a 2a 2a 20 69 6e 74 6f 20 61 20 72 65  lts.** into a re
13070 67 69 73 74 65 72 2e 20 20 52 65 74 75 72 6e 20  gister.  Return 
13080 74 68 65 20 72 65 67 69 73 74 65 72 20 6e 75 6d  the register num
13090 62 65 72 20 77 68 65 72 65 20 74 68 65 20 72 65  ber where the re
130a0 73 75 6c 74 73 0a 2a 2a 20 61 72 65 20 73 74 6f  sults.** are sto
130b0 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  red..**.** If th
130c0 65 20 72 65 67 69 73 74 65 72 20 69 73 20 61 20  e register is a 
130d0 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74  temporary regist
130e0 65 72 20 74 68 61 74 20 63 61 6e 20 62 65 20 64  er that can be d
130f0 65 61 6c 6c 6f 63 61 74 65 64 2c 0a 2a 2a 20 74  eallocated,.** t
13100 68 65 6e 20 77 72 69 74 65 20 69 74 73 20 6e 75  hen write its nu
13110 6d 62 65 72 20 69 6e 74 6f 20 2a 70 52 65 67 2e  mber into *pReg.
13120 20 20 49 66 20 74 68 65 20 72 65 73 75 6c 74 20    If the result 
13130 72 65 67 69 73 74 65 72 20 69 73 20 6e 6f 0a 2a  register is no.*
13140 2a 20 61 20 74 65 6d 70 6f 72 61 72 79 2c 20 74  * a temporary, t
13150 68 65 6e 20 73 65 74 20 2a 70 52 65 67 20 74 6f  hen set *pReg to
13160 20 7a 65 72 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71   zero..*/.int sq
13170 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
13180 70 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  p(Parse *pParse,
13190 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e   Expr *pExpr, in
131a0 74 20 2a 70 52 65 67 29 7b 0a 20 20 69 6e 74 20  t *pReg){.  int 
131b0 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r1 = sqlite3GetT
131c0 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
131d0 20 20 69 6e 74 20 72 32 20 3d 20 73 71 6c 69 74    int r2 = sqlit
131e0 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74  e3ExprCodeTarget
131f0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
13200 72 31 29 3b 0a 20 20 69 66 28 20 72 32 3d 3d 72  r1);.  if( r2==r
13210 31 20 29 7b 0a 20 20 20 20 2a 70 52 65 67 20 3d  1 ){.    *pReg =
13220 20 72 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   r1;.  }else{.  
13230 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
13240 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
13250 72 31 29 3b 0a 20 20 20 20 2a 70 52 65 67 20 3d  r1);.    *pReg =
13260 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
13270 20 72 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65   r2;.}../*.** Ge
13280 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
13290 20 77 69 6c 6c 20 65 76 61 6c 75 61 74 65 20 65   will evaluate e
132a0 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20  xpression pExpr 
132b0 61 6e 64 20 73 74 6f 72 65 20 74 68 65 0a 2a 2a  and store the.**
132c0 20 72 65 73 75 6c 74 73 20 69 6e 20 72 65 67 69   results in regi
132d0 73 74 65 72 20 74 61 72 67 65 74 2e 20 20 54 68  ster target.  Th
132e0 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 67 75  e results are gu
132f0 61 72 61 6e 74 65 65 64 20 74 6f 20 61 70 70 65  aranteed to appe
13300 61 72 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74 65  ar.** in registe
13310 72 20 74 61 72 67 65 74 2e 0a 2a 2f 0a 69 6e 74  r target..*/.int
13320 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
13330 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
13340 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74  Expr *pExpr, int
13350 20 74 61 72 67 65 74 29 7b 0a 20 20 69 6e 74 20   target){.  int 
13360 69 6e 52 65 67 3b 0a 0a 20 20 61 73 73 65 72 74  inReg;..  assert
13370 28 20 74 61 72 67 65 74 3e 30 20 26 26 20 74 61  ( target>0 && ta
13380 72 67 65 74 3c 3d 70 50 61 72 73 65 2d 3e 6e 4d  rget<=pParse->nM
13390 65 6d 20 29 3b 0a 20 20 69 6e 52 65 67 20 3d 20  em );.  inReg = 
133a0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
133b0 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 45  arget(pParse, pE
133c0 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  xpr, target);.  
133d0 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
133e0 70 56 64 62 65 20 7c 7c 20 70 50 61 72 73 65 2d  pVdbe || pParse-
133f0 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
13400 64 20 29 3b 0a 20 20 69 66 28 20 69 6e 52 65 67  d );.  if( inReg
13410 21 3d 74 61 72 67 65 74 20 26 26 20 70 50 61 72  !=target && pPar
13420 73 65 2d 3e 70 56 64 62 65 20 29 7b 0a 20 20 20  se->pVdbe ){.   
13430 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
13440 70 32 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65  p2(pParse->pVdbe
13450 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 69 6e 52 65  , OP_SCopy, inRe
13460 67 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 7d 0a  g, target);.  }.
13470 20 20 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b    return target;
13480 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
13490 74 65 20 63 6f 64 65 20 74 68 61 74 20 65 76 61  te code that eva
134a0 6c 75 74 65 73 20 74 68 65 20 67 69 76 65 6e 20  lutes the given 
134b0 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 70  expression and p
134c0 75 74 73 20 74 68 65 20 72 65 73 75 6c 74 0a 2a  uts the result.*
134d0 2a 20 69 6e 20 72 65 67 69 73 74 65 72 20 74 61  * in register ta
134e0 72 67 65 74 2e 20 20 49 66 20 74 61 72 67 65 74  rget.  If target
134f0 3d 3d 2d 31 2c 20 74 68 65 6e 20 61 6c 6c 6f 63  ==-1, then alloc
13500 61 74 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20  ate a temporary 
13510 72 65 67 69 73 74 65 72 0a 2a 2a 20 69 6e 20 77  register.** in w
13520 68 69 63 68 20 74 6f 20 73 74 6f 72 65 20 74 68  hich to store th
13530 65 20 72 65 73 75 6c 74 2e 20 20 49 6e 20 65 69  e result.  In ei
13540 74 68 65 72 20 63 61 73 65 2c 20 72 65 74 75 72  ther case, retur
13550 6e 20 74 68 65 20 72 65 67 69 73 74 65 72 0a 2a  n the register.*
13560 2a 20 6e 75 6d 62 65 72 20 77 68 65 72 65 20 74  * number where t
13570 68 65 20 72 65 73 75 6c 74 20 69 73 20 73 74 6f  he result is sto
13580 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20  red..**.** Also 
13590 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74  make a copy of t
135a0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 72 65  he expression re
135b0 73 75 6c 74 73 20 69 6e 74 6f 20 61 6e 6f 74 68  sults into anoth
135c0 65 72 20 22 63 61 63 68 65 22 20 72 65 67 69 73  er "cache" regis
135d0 74 65 72 0a 2a 2a 20 61 6e 64 20 6d 6f 64 69 66  ter.** and modif
135e0 79 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  y the expression
135f0 20 73 6f 20 74 68 61 74 20 74 68 65 20 6e 65 78   so that the nex
13600 74 20 74 69 6d 65 20 69 74 20 69 73 20 65 76 61  t time it is eva
13610 6c 75 61 74 65 64 2c 0a 2a 2a 20 74 68 65 20 72  luated,.** the r
13620 65 73 75 6c 74 20 69 73 20 61 20 63 6f 70 79 20  esult is a copy 
13630 6f 66 20 74 68 65 20 63 61 63 68 65 20 72 65 67  of the cache reg
13640 69 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ister..**.** Thi
13650 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
13660 64 20 66 6f 72 20 65 78 70 72 65 73 73 69 6f 6e  d for expression
13670 73 20 74 68 61 74 20 61 72 65 20 75 73 65 64 20  s that are used 
13680 6d 75 6c 74 69 70 6c 65 20 0a 2a 2a 20 74 69 6d  multiple .** tim
13690 65 73 2e 20 20 54 68 65 79 20 61 72 65 20 65 76  es.  They are ev
136a0 61 6c 75 61 74 65 64 20 6f 6e 63 65 20 61 6e 64  aluated once and
136b0 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20   the results of 
136c0 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a  the expression.*
136d0 2a 20 61 72 65 20 72 65 75 73 65 64 2e 0a 2a 2f  * are reused..*/
136e0 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
136f0 43 6f 64 65 41 6e 64 43 61 63 68 65 28 50 61 72  CodeAndCache(Par
13700 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
13710 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 74 61 72   *pExpr, int tar
13720 67 65 74 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  get){.  Vdbe *v 
13730 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
13740 0a 20 20 69 6e 74 20 69 6e 52 65 67 3b 0a 20 20  .  int inReg;.  
13750 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45  inReg = sqlite3E
13760 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
13770 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a  pExpr, target);.
13780 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21    if( pExpr->op!
13790 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29 7b 20  =TK_REGISTER ){ 
137a0 20 0a 20 20 20 20 69 6e 74 20 69 4d 65 6d 3b 0a   .    int iMem;.
137b0 20 20 20 20 69 66 28 20 74 61 72 67 65 74 3c 30      if( target<0
137c0 20 29 7b 0a 20 20 20 20 20 20 69 4d 65 6d 20 3d   ){.      iMem =
137d0 20 69 6e 52 65 67 3b 0a 20 20 20 20 7d 65 6c 73   inReg;.    }els
137e0 65 7b 0a 20 20 20 20 20 20 69 4d 65 6d 20 3d 20  e{.      iMem = 
137f0 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
13800 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
13810 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f  eAddOp2(v, OP_Co
13820 70 79 2c 20 69 6e 52 65 67 2c 20 69 4d 65 6d 29  py, inReg, iMem)
13830 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 45 78 70  ;.    }.    pExp
13840 72 2d 3e 69 54 61 62 6c 65 20 3d 20 69 4d 65 6d  r->iTable = iMem
13850 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20  ;.    pExpr->op 
13860 3d 20 54 4b 5f 52 45 47 49 53 54 45 52 3b 0a 20  = TK_REGISTER;. 
13870 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 6e 52 65   }.  return inRe
13880 67 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  g;.}.../*.** Gen
13890 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
138a0 70 75 73 68 65 73 20 74 68 65 20 76 61 6c 75 65  pushes the value
138b0 20 6f 66 20 65 76 65 72 79 20 65 6c 65 6d 65 6e   of every elemen
138c0 74 20 6f 66 20 74 68 65 20 67 69 76 65 6e 0a 2a  t of the given.*
138d0 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  * expression lis
138e0 74 20 69 6e 74 6f 20 61 20 73 65 71 75 65 6e 63  t into a sequenc
138f0 65 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 62  e of registers b
13900 65 67 69 6e 6e 69 6e 67 20 61 74 20 74 61 72 67  eginning at targ
13910 65 74 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  et..**.** Return
13920 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
13930 6c 65 6d 65 6e 74 73 20 65 76 61 6c 75 61 74 65  lements evaluate
13940 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
13950 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73  3ExprCodeExprLis
13960 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
13970 73 65 2c 20 20 20 20 20 2f 2a 20 50 61 72 73 69  se,     /* Parsi
13980 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
13990 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c  ExprList *pList,
139a0 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73     /* The expres
139b0 73 69 6f 6e 20 6c 69 73 74 20 74 6f 20 62 65 20  sion list to be 
139c0 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 74  coded */.  int t
139d0 61 72 67 65 74 20 20 20 20 20 20 20 20 20 2f 2a  arget         /*
139e0 20 57 68 65 72 65 20 74 6f 20 77 72 69 74 65 20   Where to write 
139f0 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20  results */.){.  
13a00 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
13a10 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69  item *pItem;.  i
13a20 6e 74 20 69 2c 20 6e 3b 0a 20 20 61 73 73 65 72  nt i, n;.  asser
13a30 74 28 20 70 4c 69 73 74 21 3d 30 20 7c 7c 20 70  t( pList!=0 || p
13a40 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
13a50 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28  cFailed );.  if(
13a60 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20   pList==0 ){.   
13a70 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
13a80 20 61 73 73 65 72 74 28 20 74 61 72 67 65 74 3e   assert( target>
13a90 30 20 29 3b 0a 20 20 6e 20 3d 20 70 4c 69 73 74  0 );.  n = pList
13aa0 2d 3e 6e 45 78 70 72 3b 0a 20 20 66 6f 72 28 70  ->nExpr;.  for(p
13ab0 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69  Item=pList->a, i
13ac0 3d 6e 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 49  =n; i>0; i--, pI
13ad0 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  tem++){.    sqli
13ae0 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
13af0 73 65 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72  se, pItem->pExpr
13b00 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 74  , target);.    t
13b10 61 72 67 65 74 2b 2b 3b 0a 20 20 7d 0a 20 20 72  arget++;.  }.  r
13b20 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn n;.}../*.*
13b30 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
13b40 66 6f 72 20 61 20 62 6f 6f 6c 65 61 6e 20 65 78  for a boolean ex
13b50 70 72 65 73 73 69 6f 6e 20 73 75 63 68 20 74 68  pression such th
13b60 61 74 20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64  at a jump is mad
13b70 65 0a 2a 2a 20 74 6f 20 74 68 65 20 6c 61 62 65  e.** to the labe
13b80 6c 20 22 64 65 73 74 22 20 69 66 20 74 68 65 20  l "dest" if the 
13b90 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 72  expression is tr
13ba0 75 65 20 62 75 74 20 65 78 65 63 75 74 69 6f 6e  ue but execution
13bb0 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 73 20 73 74  .** continues st
13bc0 72 61 69 67 68 74 20 74 68 72 75 20 69 66 20 74  raight thru if t
13bd0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
13be0 20 66 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66   false..**.** If
13bf0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
13c00 65 76 61 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c  evaluates to NUL
13c10 4c 20 28 6e 65 69 74 68 65 72 20 74 72 75 65 20  L (neither true 
13c20 6e 6f 72 20 66 61 6c 73 65 29 2c 20 74 68 65 6e  nor false), then
13c30 0a 2a 2a 20 74 61 6b 65 20 74 68 65 20 6a 75 6d  .** take the jum
13c40 70 20 69 66 20 74 68 65 20 6a 75 6d 70 49 66 4e  p if the jumpIfN
13c50 75 6c 6c 20 66 6c 61 67 20 69 73 20 53 51 4c 49  ull flag is SQLI
13c60 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 2e 0a 2a  TE_JUMPIFNULL..*
13c70 2a 0a 2a 2a 20 54 68 69 73 20 63 6f 64 65 20 64  *.** This code d
13c80 65 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 66 61  epends on the fa
13c90 63 74 20 74 68 61 74 20 63 65 72 74 61 69 6e 20  ct that certain 
13ca0 74 6f 6b 65 6e 20 76 61 6c 75 65 73 20 28 65 78  token values (ex
13cb0 3a 20 54 4b 5f 45 51 29 0a 2a 2a 20 61 72 65 20  : TK_EQ).** are 
13cc0 74 68 65 20 73 61 6d 65 20 61 73 20 6f 70 63 6f  the same as opco
13cd0 64 65 20 76 61 6c 75 65 73 20 28 65 78 3a 20 4f  de values (ex: O
13ce0 50 5f 45 71 29 20 74 68 61 74 20 69 6d 70 6c 65  P_Eq) that imple
13cf0 6d 65 6e 74 20 74 68 65 20 63 6f 72 72 65 73 70  ment the corresp
13d00 6f 6e 64 69 6e 67 0a 2a 2a 20 6f 70 65 72 61 74  onding.** operat
13d10 69 6f 6e 2e 20 20 53 70 65 63 69 61 6c 20 63 6f  ion.  Special co
13d20 6d 6d 65 6e 74 73 20 69 6e 20 76 64 62 65 2e 63  mments in vdbe.c
13d30 20 61 6e 64 20 74 68 65 20 6d 6b 6f 70 63 6f 64   and the mkopcod
13d40 65 68 2e 61 77 6b 20 73 63 72 69 70 74 20 69 6e  eh.awk script in
13d50 0a 2a 2a 20 74 68 65 20 6d 61 6b 65 20 70 72 6f  .** the make pro
13d60 63 65 73 73 20 63 61 75 73 65 20 74 68 65 73 65  cess cause these
13d70 20 76 61 6c 75 65 73 20 74 6f 20 61 6c 69 67 6e   values to align
13d80 2e 20 20 41 73 73 65 72 74 28 29 73 20 69 6e 20  .  Assert()s in 
13d90 74 68 65 20 63 6f 64 65 0a 2a 2a 20 62 65 6c 6f  the code.** belo
13da0 77 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68  w verify that th
13db0 65 20 6e 75 6d 62 65 72 73 20 61 72 65 20 61 6c  e numbers are al
13dc0 69 67 6e 65 64 20 63 6f 72 72 65 63 74 6c 79 2e  igned correctly.
13dd0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
13de0 45 78 70 72 49 66 54 72 75 65 28 50 61 72 73 65  ExprIfTrue(Parse
13df0 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
13e00 70 45 78 70 72 2c 20 69 6e 74 20 64 65 73 74 2c  pExpr, int dest,
13e10 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29   int jumpIfNull)
13e20 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
13e30 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
13e40 6e 74 20 6f 70 20 3d 20 30 3b 0a 20 20 69 6e 74  nt op = 0;.  int
13e50 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b 0a 20   regFree1 = 0;. 
13e60 20 69 6e 74 20 72 65 67 46 72 65 65 32 20 3d 20   int regFree2 = 
13e70 30 3b 0a 20 20 69 6e 74 20 72 31 2c 20 72 32 3b  0;.  int r1, r2;
13e80 0a 0a 20 20 61 73 73 65 72 74 28 20 6a 75 6d 70  ..  assert( jump
13e90 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4a  IfNull==SQLITE_J
13ea0 55 4d 50 49 46 4e 55 4c 4c 20 7c 7c 20 6a 75 6d  UMPIFNULL || jum
13eb0 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
13ec0 69 66 28 20 76 3d 3d 30 20 7c 7c 20 70 45 78 70  if( v==0 || pExp
13ed0 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  r==0 ) return;. 
13ee0 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b   op = pExpr->op;
13ef0 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b  .  switch( op ){
13f00 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44  .    case TK_AND
13f10 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 32  : {.      int d2
13f20 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
13f30 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
13f40 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
13f50 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 78  alse(pParse, pEx
13f60 70 72 2d 3e 70 4c 65 66 74 2c 20 64 32 2c 6a 75  pr->pLeft, d2,ju
13f70 6d 70 49 66 4e 75 6c 6c 5e 53 51 4c 49 54 45 5f  mpIfNull^SQLITE_
13f80 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20  JUMPIFNULL);.   
13f90 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
13fa0 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78  True(pParse, pEx
13fb0 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74  pr->pRight, dest
13fc0 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
13fd0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
13fe0 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
13ff0 64 32 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  d2);.      break
14000 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
14010 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20 20 20   TK_OR: {.      
14020 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75  sqlite3ExprIfTru
14030 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
14040 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75  >pLeft, dest, ju
14050 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
14060 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72   sqlite3ExprIfTr
14070 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ue(pParse, pExpr
14080 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20  ->pRight, dest, 
14090 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
140a0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
140b0 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a      case TK_NOT:
140c0 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
140d0 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
140e0 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
140f0 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
14100 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ll);.      break
14110 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
14120 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65   TK_LT:.    case
14130 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65   TK_LE:.    case
14140 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65   TK_GT:.    case
14150 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65   TK_GE:.    case
14160 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65   TK_NE:.    case
14170 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20   TK_EQ: {.      
14180 61 73 73 65 72 74 28 20 54 4b 5f 4c 54 3d 3d 4f  assert( TK_LT==O
14190 50 5f 4c 74 20 29 3b 0a 20 20 20 20 20 20 61 73  P_Lt );.      as
141a0 73 65 72 74 28 20 54 4b 5f 4c 45 3d 3d 4f 50 5f  sert( TK_LE==OP_
141b0 4c 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  Le );.      asse
141c0 72 74 28 20 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74  rt( TK_GT==OP_Gt
141d0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
141e0 28 20 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65 20 29  ( TK_GE==OP_Ge )
141f0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
14200 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71 20 29 3b 0a  TK_EQ==OP_Eq );.
14210 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
14220 5f 4e 45 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20  _NE==OP_Ne );.  
14230 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
14240 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
14250 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
14260 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20  t, &regFree1);. 
14270 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65       r2 = sqlite
14280 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
14290 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69  arse, pExpr->pRi
142a0 67 68 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b  ght, &regFree2);
142b0 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61  .      codeCompa
142c0 72 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  re(pParse, pExpr
142d0 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e  ->pLeft, pExpr->
142e0 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20  pRight, op,.    
142f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 31                r1
14300 2c 20 72 32 2c 20 64 65 73 74 2c 20 6a 75 6d 70  , r2, dest, jump
14310 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62  IfNull);.      b
14320 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
14330 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a  case TK_ISNULL:.
14340 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e      case TK_NOTN
14350 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  ULL: {.      ass
14360 65 72 74 28 20 54 4b 5f 49 53 4e 55 4c 4c 3d 3d  ert( TK_ISNULL==
14370 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 0a 20 20 20  OP_IsNull );.   
14380 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f     assert( TK_NO
14390 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c  TNULL==OP_NotNul
143a0 6c 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20  l );.      r1 = 
143b0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
143c0 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
143d0 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72  r->pLeft, &regFr
143e0 65 65 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ee1);.      sqli
143f0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
14400 20 6f 70 2c 20 72 31 2c 20 64 65 73 74 29 3b 0a   op, r1, dest);.
14410 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
14420 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42   }.    case TK_B
14430 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20  ETWEEN: {.      
14440 2f 2a 20 20 20 20 78 20 42 45 54 57 45 45 4e 20  /*    x BETWEEN 
14450 79 20 41 4e 44 20 7a 0a 20 20 20 20 20 20 2a 2a  y AND z.      **
14460 0a 20 20 20 20 20 20 2a 2a 20 49 73 20 65 71 75  .      ** Is equ
14470 69 76 61 6c 65 6e 74 20 74 6f 20 0a 20 20 20 20  ivalent to .    
14480 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20    **.      **   
14490 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 0a 20   x>=y AND x<=z. 
144a0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
144b0 20 43 6f 64 65 20 69 74 20 61 73 20 73 75 63 68   Code it as such
144c0 2c 20 74 61 6b 69 6e 67 20 63 61 72 65 20 74 6f  , taking care to
144d0 20 64 6f 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 73   do the common s
144e0 75 62 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 20  ubexpression.   
144f0 20 20 20 2a 2a 20 65 6c 65 6d 65 6e 74 61 74 69     ** elementati
14500 6f 6e 20 6f 66 20 78 2e 0a 20 20 20 20 20 20 2a  on of x..      *
14510 2f 0a 20 20 20 20 20 20 45 78 70 72 20 65 78 70  /.      Expr exp
14520 72 41 6e 64 3b 0a 20 20 20 20 20 20 45 78 70 72  rAnd;.      Expr
14530 20 63 6f 6d 70 4c 65 66 74 3b 0a 20 20 20 20 20   compLeft;.     
14540 20 45 78 70 72 20 63 6f 6d 70 52 69 67 68 74 3b   Expr compRight;
14550 0a 20 20 20 20 20 20 45 78 70 72 20 65 78 70 72  .      Expr expr
14560 58 3b 0a 0a 20 20 20 20 20 20 65 78 70 72 58 20  X;..      exprX 
14570 3d 20 2a 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b  = *pExpr->pLeft;
14580 0a 20 20 20 20 20 20 65 78 70 72 41 6e 64 2e 6f  .      exprAnd.o
14590 70 20 3d 20 54 4b 5f 41 4e 44 3b 0a 20 20 20 20  p = TK_AND;.    
145a0 20 20 65 78 70 72 41 6e 64 2e 70 4c 65 66 74 20    exprAnd.pLeft 
145b0 3d 20 26 63 6f 6d 70 4c 65 66 74 3b 0a 20 20 20  = &compLeft;.   
145c0 20 20 20 65 78 70 72 41 6e 64 2e 70 52 69 67 68     exprAnd.pRigh
145d0 74 20 3d 20 26 63 6f 6d 70 52 69 67 68 74 3b 0a  t = &compRight;.
145e0 20 20 20 20 20 20 63 6f 6d 70 4c 65 66 74 2e 6f        compLeft.o
145f0 70 20 3d 20 54 4b 5f 47 45 3b 0a 20 20 20 20 20  p = TK_GE;.     
14600 20 63 6f 6d 70 4c 65 66 74 2e 70 4c 65 66 74 20   compLeft.pLeft 
14610 3d 20 26 65 78 70 72 58 3b 0a 20 20 20 20 20 20  = &exprX;.      
14620 63 6f 6d 70 4c 65 66 74 2e 70 52 69 67 68 74 20  compLeft.pRight 
14630 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e  = pExpr->pList->
14640 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[0].pExpr;.    
14650 20 20 63 6f 6d 70 52 69 67 68 74 2e 6f 70 20 3d    compRight.op =
14660 20 54 4b 5f 4c 45 3b 0a 20 20 20 20 20 20 63 6f   TK_LE;.      co
14670 6d 70 52 69 67 68 74 2e 70 4c 65 66 74 20 3d 20  mpRight.pLeft = 
14680 26 65 78 70 72 58 3b 0a 20 20 20 20 20 20 63 6f  &exprX;.      co
14690 6d 70 52 69 67 68 74 2e 70 52 69 67 68 74 20 3d  mpRight.pRight =
146a0 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61   pExpr->pList->a
146b0 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [1].pExpr;.     
146c0 20 65 78 70 72 58 2e 69 54 61 62 6c 65 20 3d 20   exprX.iTable = 
146d0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
146e0 65 6d 70 28 70 50 61 72 73 65 2c 20 26 65 78 70  emp(pParse, &exp
146f0 72 58 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  rX, &regFree1);.
14700 20 20 20 20 20 20 65 78 70 72 58 2e 6f 70 20 3d        exprX.op =
14710 20 54 4b 5f 52 45 47 49 53 54 45 52 3b 0a 20 20   TK_REGISTER;.  
14720 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
14730 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 26 65  fTrue(pParse, &e
14740 78 70 72 41 6e 64 2c 20 64 65 73 74 2c 20 6a 75  xprAnd, dest, ju
14750 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
14760 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
14770 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
14780 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
14790 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
147a0 73 65 2c 20 70 45 78 70 72 2c 20 26 72 65 67 46  se, pExpr, &regF
147b0 72 65 65 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  ree1);.      sql
147c0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
147d0 2c 20 4f 50 5f 49 66 2c 20 72 31 2c 20 64 65 73  , OP_If, r1, des
147e0 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30  t, jumpIfNull!=0
147f0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
14800 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
14810 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
14820 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65  g(pParse, regFre
14830 65 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65  e1);.  sqlite3Re
14840 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
14850 72 73 65 2c 20 72 65 67 46 72 65 65 32 29 3b 20  rse, regFree2); 
14860 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72   .}../*.** Gener
14870 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20 62  ate code for a b
14880 6f 6f 6c 65 61 6e 20 65 78 70 72 65 73 73 69 6f  oolean expressio
14890 6e 20 73 75 63 68 20 74 68 61 74 20 61 20 6a 75  n such that a ju
148a0 6d 70 20 69 73 20 6d 61 64 65 0a 2a 2a 20 74 6f  mp is made.** to
148b0 20 74 68 65 20 6c 61 62 65 6c 20 22 64 65 73 74   the label "dest
148c0 22 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  " if the express
148d0 69 6f 6e 20 69 73 20 66 61 6c 73 65 20 62 75 74  ion is false but
148e0 20 65 78 65 63 75 74 69 6f 6e 0a 2a 2a 20 63 6f   execution.** co
148f0 6e 74 69 6e 75 65 73 20 73 74 72 61 69 67 68 74  ntinues straight
14900 20 74 68 72 75 20 69 66 20 74 68 65 20 65 78 70   thru if the exp
14910 72 65 73 73 69 6f 6e 20 69 73 20 74 72 75 65 2e  ression is true.
14920 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78  .**.** If the ex
14930 70 72 65 73 73 69 6f 6e 20 65 76 61 6c 75 61 74  pression evaluat
14940 65 73 20 74 6f 20 4e 55 4c 4c 20 28 6e 65 69 74  es to NULL (neit
14950 68 65 72 20 74 72 75 65 20 6e 6f 72 20 66 61 6c  her true nor fal
14960 73 65 29 20 74 68 65 6e 0a 2a 2a 20 6a 75 6d 70  se) then.** jump
14970 20 69 66 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 69   if jumpIfNull i
14980 73 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  s SQLITE_JUMPIFN
14990 55 4c 4c 20 6f 72 20 66 61 6c 6c 20 74 68 72 6f  ULL or fall thro
149a0 75 67 68 20 69 66 20 6a 75 6d 70 49 66 4e 75 6c  ugh if jumpIfNul
149b0 6c 0a 2a 2a 20 69 73 20 30 2e 0a 2a 2f 0a 76 6f  l.** is 0..*/.vo
149c0 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 49 66  id sqlite3ExprIf
149d0 46 61 6c 73 65 28 50 61 72 73 65 20 2a 70 50 61  False(Parse *pPa
149e0 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
149f0 2c 20 69 6e 74 20 64 65 73 74 2c 20 69 6e 74 20  , int dest, int 
14a00 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 56  jumpIfNull){.  V
14a10 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
14a20 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 6f 70  >pVdbe;.  int op
14a30 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 67 46   = 0;.  int regF
14a40 72 65 65 31 20 3d 20 30 3b 0a 20 20 69 6e 74 20  ree1 = 0;.  int 
14a50 72 65 67 46 72 65 65 32 20 3d 20 30 3b 0a 20 20  regFree2 = 0;.  
14a60 69 6e 74 20 72 31 2c 20 72 32 3b 0a 0a 20 20 61  int r1, r2;..  a
14a70 73 73 65 72 74 28 20 6a 75 6d 70 49 66 4e 75 6c  ssert( jumpIfNul
14a80 6c 3d 3d 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46  l==SQLITE_JUMPIF
14a90 4e 55 4c 4c 20 7c 7c 20 6a 75 6d 70 49 66 4e 75  NULL || jumpIfNu
14aa0 6c 6c 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 76  ll==0 );.  if( v
14ab0 3d 3d 30 20 7c 7c 20 70 45 78 70 72 3d 3d 30 20  ==0 || pExpr==0 
14ac0 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20  ) return;..  /* 
14ad0 54 68 65 20 76 61 6c 75 65 20 6f 66 20 70 45 78  The value of pEx
14ae0 70 72 2d 3e 6f 70 20 61 6e 64 20 6f 70 20 61 72  pr->op and op ar
14af0 65 20 72 65 6c 61 74 65 64 20 61 73 20 66 6f 6c  e related as fol
14b00 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  lows:.  **.  ** 
14b10 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20        pExpr->op 
14b20 20 20 20 20 20 20 20 20 20 20 20 6f 70 0a 20 20             op.  
14b30 2a 2a 20 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d  **       -------
14b40 2d 2d 20 20 20 20 20 20 20 20 20 20 2d 2d 2d 2d  --          ----
14b50 2d 2d 2d 2d 2d 2d 0a 20 20 2a 2a 20 20 20 20 20  ------.  **     
14b60 20 20 54 4b 5f 49 53 4e 55 4c 4c 20 20 20 20 20    TK_ISNULL     
14b70 20 20 20 20 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 0a       OP_NotNull.
14b80 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4e 4f    **       TK_NO
14b90 54 4e 55 4c 4c 20 20 20 20 20 20 20 20 20 4f 50  TNULL         OP
14ba0 5f 49 73 4e 75 6c 6c 0a 20 20 2a 2a 20 20 20 20  _IsNull.  **    
14bb0 20 20 20 54 4b 5f 4e 45 20 20 20 20 20 20 20 20     TK_NE        
14bc0 20 20 20 20 20 20 4f 50 5f 45 71 0a 20 20 2a 2a        OP_Eq.  **
14bd0 20 20 20 20 20 20 20 54 4b 5f 45 51 20 20 20 20         TK_EQ    
14be0 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4e 65 0a            OP_Ne.
14bf0 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 47 54    **       TK_GT
14c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50                OP
14c10 5f 4c 65 0a 20 20 2a 2a 20 20 20 20 20 20 20 54  _Le.  **       T
14c20 4b 5f 4c 45 20 20 20 20 20 20 20 20 20 20 20 20  K_LE            
14c30 20 20 4f 50 5f 47 74 0a 20 20 2a 2a 20 20 20 20    OP_Gt.  **    
14c40 20 20 20 54 4b 5f 47 45 20 20 20 20 20 20 20 20     TK_GE        
14c50 20 20 20 20 20 20 4f 50 5f 4c 74 0a 20 20 2a 2a        OP_Lt.  **
14c60 20 20 20 20 20 20 20 54 4b 5f 4c 54 20 20 20 20         TK_LT    
14c70 20 20 20 20 20 20 20 20 20 20 4f 50 5f 47 65 0a            OP_Ge.
14c80 20 20 2a 2a 0a 20 20 2a 2a 20 46 6f 72 20 6f 74    **.  ** For ot
14c90 68 65 72 20 76 61 6c 75 65 73 20 6f 66 20 70 45  her values of pE
14ca0 78 70 72 2d 3e 6f 70 2c 20 6f 70 20 69 73 20 75  xpr->op, op is u
14cb0 6e 64 65 66 69 6e 65 64 20 61 6e 64 20 75 6e 75  ndefined and unu
14cc0 73 65 64 2e 0a 20 20 2a 2a 20 54 68 65 20 76 61  sed..  ** The va
14cd0 6c 75 65 20 6f 66 20 54 4b 5f 20 61 6e 64 20 4f  lue of TK_ and O
14ce0 50 5f 20 63 6f 6e 73 74 61 6e 74 73 20 61 72 65  P_ constants are
14cf0 20 61 72 72 61 6e 67 65 64 20 73 75 63 68 20 74   arranged such t
14d00 68 61 74 20 77 65 0a 20 20 2a 2a 20 63 61 6e 20  hat we.  ** can 
14d10 63 6f 6d 70 75 74 65 20 74 68 65 20 6d 61 70 70  compute the mapp
14d20 69 6e 67 20 61 62 6f 76 65 20 75 73 69 6e 67 20  ing above using 
14d30 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 78  the following ex
14d40 70 72 65 73 73 69 6f 6e 2e 0a 20 20 2a 2a 20 41  pression..  ** A
14d50 73 73 65 72 74 28 29 73 20 76 65 72 69 66 79 20  ssert()s verify 
14d60 74 68 61 74 20 74 68 65 20 63 6f 6d 70 75 74 61  that the computa
14d70 74 69 6f 6e 20 69 73 20 63 6f 72 72 65 63 74 2e  tion is correct.
14d80 0a 20 20 2a 2f 0a 20 20 6f 70 20 3d 20 28 28 70  .  */.  op = ((p
14d90 45 78 70 72 2d 3e 6f 70 2b 28 54 4b 5f 49 53 4e  Expr->op+(TK_ISN
14da0 55 4c 4c 26 31 29 29 5e 31 29 2d 28 54 4b 5f 49  ULL&1))^1)-(TK_I
14db0 53 4e 55 4c 4c 26 31 29 3b 0a 0a 20 20 2f 2a 20  SNULL&1);..  /* 
14dc0 56 65 72 69 66 79 20 63 6f 72 72 65 63 74 20 61  Verify correct a
14dd0 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 54 4b 5f 20  lignment of TK_ 
14de0 61 6e 64 20 4f 50 5f 20 63 6f 6e 73 74 61 6e 74  and OP_ constant
14df0 73 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  s.  */.  assert(
14e00 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 49   pExpr->op!=TK_I
14e10 53 4e 55 4c 4c 20 7c 7c 20 6f 70 3d 3d 4f 50 5f  SNULL || op==OP_
14e20 4e 6f 74 4e 75 6c 6c 20 29 3b 0a 20 20 61 73 73  NotNull );.  ass
14e30 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d  ert( pExpr->op!=
14e40 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 7c 7c 20 6f 70  TK_NOTNULL || op
14e50 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 0a 20  ==OP_IsNull );. 
14e60 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
14e70 6f 70 21 3d 54 4b 5f 4e 45 20 7c 7c 20 6f 70 3d  op!=TK_NE || op=
14e80 3d 4f 50 5f 45 71 20 29 3b 0a 20 20 61 73 73 65  =OP_Eq );.  asse
14e90 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  rt( pExpr->op!=T
14ea0 4b 5f 45 51 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4e  K_EQ || op==OP_N
14eb0 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
14ec0 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4c 54 20  Expr->op!=TK_LT 
14ed0 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 65 20 29 3b 0a  || op==OP_Ge );.
14ee0 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
14ef0 3e 6f 70 21 3d 54 4b 5f 4c 45 20 7c 7c 20 6f 70  >op!=TK_LE || op
14f00 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20 20 61 73 73  ==OP_Gt );.  ass
14f10 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d  ert( pExpr->op!=
14f20 54 4b 5f 47 54 20 7c 7c 20 6f 70 3d 3d 4f 50 5f  TK_GT || op==OP_
14f30 4c 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Le );.  assert( 
14f40 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 47 45  pExpr->op!=TK_GE
14f50 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c 74 20 29 3b   || op==OP_Lt );
14f60 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70  ..  switch( pExp
14f70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  r->op ){.    cas
14f80 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a 20 20 20 20  e TK_AND: {.    
14f90 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
14fa0 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 78  alse(pParse, pEx
14fb0 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c  pr->pLeft, dest,
14fc0 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
14fd0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
14fe0 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
14ff0 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65  Expr->pRight, de
15000 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
15010 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
15020 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
15030 4f 52 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  OR: {.      int 
15040 64 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  d2 = sqlite3Vdbe
15050 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
15060 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
15070 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45  fTrue(pParse, pE
15080 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 32 2c 20  xpr->pLeft, d2, 
15090 6a 75 6d 70 49 66 4e 75 6c 6c 5e 53 51 4c 49 54  jumpIfNull^SQLIT
150a0 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20  E_JUMPIFNULL);. 
150b0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
150c0 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
150d0 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64  pExpr->pRight, d
150e0 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
150f0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
15100 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
15110 76 2c 20 64 32 29 3b 0a 20 20 20 20 20 20 62 72  v, d2);.      br
15120 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
15130 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20  ase TK_NOT: {.  
15140 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
15150 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45  fTrue(pParse, pE
15160 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74  xpr->pLeft, dest
15170 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
15180 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
15190 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54  }.    case TK_LT
151a0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45  :.    case TK_LE
151b0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54  :.    case TK_GT
151c0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45  :.    case TK_GE
151d0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45  :.    case TK_NE
151e0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51  :.    case TK_EQ
151f0 3a 20 7b 0a 20 20 20 20 20 20 72 31 20 3d 20 73  : {.      r1 = s
15200 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
15210 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
15220 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65  ->pLeft, &regFre
15230 65 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20  e1);.      r2 = 
15240 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
15250 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
15260 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46  r->pRight, &regF
15270 72 65 65 32 29 3b 0a 20 20 20 20 20 20 63 6f 64  ree2);.      cod
15280 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c  eCompare(pParse,
15290 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70   pExpr->pLeft, p
152a0 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70  Expr->pRight, op
152b0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
152c0 20 20 20 20 72 31 2c 20 72 32 2c 20 64 65 73 74      r1, r2, dest
152d0 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
152e0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
152f0 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53  }.    case TK_IS
15300 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54  NULL:.    case T
15310 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20  K_NOTNULL: {.   
15320 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
15330 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
15340 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
15350 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20  , &regFree1);.  
15360 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
15370 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20 72 31 2c  ddOp2(v, op, r1,
15380 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 62 72   dest);.      br
15390 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
153a0 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20  ase TK_BETWEEN: 
153b0 7b 0a 20 20 20 20 20 20 2f 2a 20 20 20 20 78 20  {.      /*    x 
153c0 42 45 54 57 45 45 4e 20 79 20 41 4e 44 20 7a 0a  BETWEEN y AND z.
153d0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
153e0 2a 20 49 73 20 65 71 75 69 76 61 6c 65 6e 74 20  * Is equivalent 
153f0 74 6f 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  to .      **.   
15400 20 20 20 2a 2a 20 20 20 20 78 3e 3d 79 20 41 4e     **    x>=y AN
15410 44 20 78 3c 3d 7a 0a 20 20 20 20 20 20 2a 2a 0a  D x<=z.      **.
15420 20 20 20 20 20 20 2a 2a 20 43 6f 64 65 20 69 74        ** Code it
15430 20 61 73 20 73 75 63 68 2c 20 74 61 6b 69 6e 67   as such, taking
15440 20 63 61 72 65 20 74 6f 20 64 6f 20 74 68 65 20   care to do the 
15450 63 6f 6d 6d 6f 6e 20 73 75 62 65 78 70 72 65 73  common subexpres
15460 73 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 65 6c  sion.      ** el
15470 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 78 2e  ementation of x.
15480 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
15490 45 78 70 72 20 65 78 70 72 41 6e 64 3b 0a 20 20  Expr exprAnd;.  
154a0 20 20 20 20 45 78 70 72 20 63 6f 6d 70 4c 65 66      Expr compLef
154b0 74 3b 0a 20 20 20 20 20 20 45 78 70 72 20 63 6f  t;.      Expr co
154c0 6d 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 45  mpRight;.      E
154d0 78 70 72 20 65 78 70 72 58 3b 0a 0a 20 20 20 20  xpr exprX;..    
154e0 20 20 65 78 70 72 58 20 3d 20 2a 70 45 78 70 72    exprX = *pExpr
154f0 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 65  ->pLeft;.      e
15500 78 70 72 41 6e 64 2e 6f 70 20 3d 20 54 4b 5f 41  xprAnd.op = TK_A
15510 4e 44 3b 0a 20 20 20 20 20 20 65 78 70 72 41 6e  ND;.      exprAn
15520 64 2e 70 4c 65 66 74 20 3d 20 26 63 6f 6d 70 4c  d.pLeft = &compL
15530 65 66 74 3b 0a 20 20 20 20 20 20 65 78 70 72 41  eft;.      exprA
15540 6e 64 2e 70 52 69 67 68 74 20 3d 20 26 63 6f 6d  nd.pRight = &com
15550 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 63 6f  pRight;.      co
15560 6d 70 4c 65 66 74 2e 6f 70 20 3d 20 54 4b 5f 47  mpLeft.op = TK_G
15570 45 3b 0a 20 20 20 20 20 20 63 6f 6d 70 4c 65 66  E;.      compLef
15580 74 2e 70 4c 65 66 74 20 3d 20 26 65 78 70 72 58  t.pLeft = &exprX
15590 3b 0a 20 20 20 20 20 20 63 6f 6d 70 4c 65 66 74  ;.      compLeft
155a0 2e 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d  .pRight = pExpr-
155b0 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  >pList->a[0].pEx
155c0 70 72 3b 0a 20 20 20 20 20 20 63 6f 6d 70 52 69  pr;.      compRi
155d0 67 68 74 2e 6f 70 20 3d 20 54 4b 5f 4c 45 3b 0a  ght.op = TK_LE;.
155e0 20 20 20 20 20 20 63 6f 6d 70 52 69 67 68 74 2e        compRight.
155f0 70 4c 65 66 74 20 3d 20 26 65 78 70 72 58 3b 0a  pLeft = &exprX;.
15600 20 20 20 20 20 20 63 6f 6d 70 52 69 67 68 74 2e        compRight.
15610 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e  pRight = pExpr->
15620 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70  pList->a[1].pExp
15630 72 3b 0a 20 20 20 20 20 20 65 78 70 72 58 2e 69  r;.      exprX.i
15640 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 33 45  Table = sqlite3E
15650 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
15660 73 65 2c 20 26 65 78 70 72 58 2c 20 26 72 65 67  se, &exprX, &reg
15670 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 65 78  Free1);.      ex
15680 70 72 58 2e 6f 70 20 3d 20 54 4b 5f 52 45 47 49  prX.op = TK_REGI
15690 53 54 45 52 3b 0a 20 20 20 20 20 20 73 71 6c 69  STER;.      sqli
156a0 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
156b0 50 61 72 73 65 2c 20 26 65 78 70 72 41 6e 64 2c  Parse, &exprAnd,
156c0 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
156d0 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  l);.      break;
156e0 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75  .    }.    defau
156f0 6c 74 3a 20 7b 0a 20 20 20 20 20 20 72 31 20 3d  lt: {.      r1 =
15700 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
15710 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
15720 70 72 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  pr, &regFree1);.
15730 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
15740 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66  eAddOp3(v, OP_If
15750 4e 6f 74 2c 20 72 31 2c 20 64 65 73 74 2c 20 6a  Not, r1, dest, j
15760 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 29 3b 0a 20  umpIfNull!=0);. 
15770 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
15780 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52  }.  }.  sqlite3R
15790 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
157a0 61 72 73 65 2c 20 72 65 67 46 72 65 65 31 29 3b  arse, regFree1);
157b0 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
157c0 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
157d0 20 72 65 67 46 72 65 65 32 29 3b 0a 7d 0a 0a 2f   regFree2);.}../
157e0 2a 0a 2a 2a 20 44 6f 20 61 20 64 65 65 70 20 63  *.** Do a deep c
157f0 6f 6d 70 61 72 69 73 6f 6e 20 6f 66 20 74 77 6f  omparison of two
15800 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
15810 73 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45 20  s.  Return TRUE 
15820 28 6e 6f 6e 2d 7a 65 72 6f 29 0a 2a 2a 20 69 66  (non-zero).** if
15830 20 74 68 65 79 20 61 72 65 20 69 64 65 6e 74 69   they are identi
15840 63 61 6c 20 61 6e 64 20 72 65 74 75 72 6e 20 46  cal and return F
15850 41 4c 53 45 20 69 66 20 74 68 65 79 20 64 69 66  ALSE if they dif
15860 66 65 72 20 69 6e 20 61 6e 79 20 77 61 79 2e 0a  fer in any way..
15870 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20  **.** Sometimes 
15880 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  this routine wil
15890 6c 20 72 65 74 75 72 6e 20 46 41 4c 53 45 20 65  l return FALSE e
158a0 76 65 6e 20 69 66 20 74 68 65 20 74 77 6f 20 65  ven if the two e
158b0 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 72 65  xpressions.** re
158c0 61 6c 6c 79 20 61 72 65 20 65 71 75 69 76 61 6c  ally are equival
158d0 65 6e 74 2e 20 20 49 66 20 77 65 20 63 61 6e 6e  ent.  If we cann
158e0 6f 74 20 70 72 6f 76 65 20 74 68 61 74 20 74 68  ot prove that th
158f0 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72  e expressions ar
15900 65 0a 2a 2a 20 69 64 65 6e 74 69 63 61 6c 2c 20  e.** identical, 
15910 77 65 20 72 65 74 75 72 6e 20 46 41 4c 53 45 20  we return FALSE 
15920 6a 75 73 74 20 74 6f 20 62 65 20 73 61 66 65 2e  just to be safe.
15930 20 20 53 6f 20 69 66 20 74 68 69 73 20 72 6f 75    So if this rou
15940 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20  tine.** returns 
15950 66 61 6c 73 65 2c 20 74 68 65 6e 20 79 6f 75 20  false, then you 
15960 64 6f 20 6e 6f 74 20 72 65 61 6c 6c 79 20 6b 6e  do not really kn
15970 6f 77 20 66 6f 72 20 63 65 72 74 61 69 6e 20 69  ow for certain i
15980 66 20 74 68 65 20 74 77 6f 0a 2a 2a 20 65 78 70  f the two.** exp
15990 72 65 73 73 69 6f 6e 73 20 61 72 65 20 74 68 65  ressions are the
159a0 20 73 61 6d 65 2e 20 20 42 75 74 20 69 66 20 79   same.  But if y
159b0 6f 75 20 67 65 74 20 61 20 54 52 55 45 20 72 65  ou get a TRUE re
159c0 74 75 72 6e 2c 20 74 68 65 6e 20 79 6f 75 0a 2a  turn, then you.*
159d0 2a 20 63 61 6e 20 62 65 20 73 75 72 65 20 74 68  * can be sure th
159e0 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72  e expressions ar
159f0 65 20 74 68 65 20 73 61 6d 65 2e 20 20 49 6e 20  e the same.  In 
15a00 74 68 65 20 70 6c 61 63 65 73 20 77 68 65 72 65  the places where
15a10 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
15a20 20 69 73 20 75 73 65 64 2c 20 69 74 20 64 6f 65   is used, it doe
15a30 73 20 6e 6f 74 20 68 75 72 74 20 74 6f 20 67 65  s not hurt to ge
15a40 74 20 61 6e 20 65 78 74 72 61 20 46 41 4c 53 45  t an extra FALSE
15a50 20 2d 20 74 68 61 74 0a 2a 2a 20 6a 75 73 74 20   - that.** just 
15a60 6d 69 67 68 74 20 72 65 73 75 6c 74 20 69 6e 20  might result in 
15a70 73 6f 6d 65 20 73 6c 69 67 68 74 6c 79 20 73 6c  some slightly sl
15a80 6f 77 65 72 20 63 6f 64 65 2e 20 20 42 75 74 20  ower code.  But 
15a90 72 65 74 75 72 6e 69 6e 67 0a 2a 2a 20 61 6e 20  returning.** an 
15aa0 69 6e 63 6f 72 72 65 63 74 20 54 52 55 45 20 63  incorrect TRUE c
15ab0 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20 61 20 6d  ould lead to a m
15ac0 61 6c 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69  alfunction..*/.i
15ad0 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  nt sqlite3ExprCo
15ae0 6d 70 61 72 65 28 45 78 70 72 20 2a 70 41 2c 20  mpare(Expr *pA, 
15af0 45 78 70 72 20 2a 70 42 29 7b 0a 20 20 69 6e 74  Expr *pB){.  int
15b00 20 69 3b 0a 20 20 69 66 28 20 70 41 3d 3d 30 7c   i;.  if( pA==0|
15b10 7c 70 42 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  |pB==0 ){.    re
15b20 74 75 72 6e 20 70 42 3d 3d 70 41 3b 0a 20 20 7d  turn pB==pA;.  }
15b30 0a 20 20 69 66 28 20 70 41 2d 3e 6f 70 21 3d 70  .  if( pA->op!=p
15b40 42 2d 3e 6f 70 20 29 20 72 65 74 75 72 6e 20 30  B->op ) return 0
15b50 3b 0a 20 20 69 66 28 20 28 70 41 2d 3e 66 6c 61  ;.  if( (pA->fla
15b60 67 73 20 26 20 45 50 5f 44 69 73 74 69 6e 63 74  gs & EP_Distinct
15b70 29 21 3d 28 70 42 2d 3e 66 6c 61 67 73 20 26 20  )!=(pB->flags & 
15b80 45 50 5f 44 69 73 74 69 6e 63 74 29 20 29 20 72  EP_Distinct) ) r
15b90 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 21  eturn 0;.  if( !
15ba0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
15bb0 72 65 28 70 41 2d 3e 70 4c 65 66 74 2c 20 70 42  re(pA->pLeft, pB
15bc0 2d 3e 70 4c 65 66 74 29 20 29 20 72 65 74 75 72  ->pLeft) ) retur
15bd0 6e 20 30 3b 0a 20 20 69 66 28 20 21 73 71 6c 69  n 0;.  if( !sqli
15be0 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70  te3ExprCompare(p
15bf0 41 2d 3e 70 52 69 67 68 74 2c 20 70 42 2d 3e 70  A->pRight, pB->p
15c00 52 69 67 68 74 29 20 29 20 72 65 74 75 72 6e 20  Right) ) return 
15c10 30 3b 0a 20 20 69 66 28 20 70 41 2d 3e 70 4c 69  0;.  if( pA->pLi
15c20 73 74 20 29 7b 0a 20 20 20 20 69 66 28 20 70 42  st ){.    if( pB
15c30 2d 3e 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  ->pList==0 ) ret
15c40 75 72 6e 20 30 3b 0a 20 20 20 20 69 66 28 20 70  urn 0;.    if( p
15c50 41 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 21  A->pList->nExpr!
15c60 3d 70 42 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70  =pB->pList->nExp
15c70 72 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  r ) return 0;.  
15c80 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 2d    for(i=0; i<pA-
15c90 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  >pList->nExpr; i
15ca0 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21  ++){.      if( !
15cb0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
15cc0 72 65 28 70 41 2d 3e 70 4c 69 73 74 2d 3e 61 5b  re(pA->pList->a[
15cd0 69 5d 2e 70 45 78 70 72 2c 20 70 42 2d 3e 70 4c  i].pExpr, pB->pL
15ce0 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  ist->a[i].pExpr)
15cf0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
15d00 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 0;.      }.  
15d10 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
15d20 70 42 2d 3e 70 4c 69 73 74 20 29 7b 0a 20 20 20  pB->pList ){.   
15d30 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
15d40 20 69 66 28 20 70 41 2d 3e 70 53 65 6c 65 63 74   if( pA->pSelect
15d50 20 7c 7c 20 70 42 2d 3e 70 53 65 6c 65 63 74 20   || pB->pSelect 
15d60 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
15d70 28 20 70 41 2d 3e 69 54 61 62 6c 65 21 3d 70 42  ( pA->iTable!=pB
15d80 2d 3e 69 54 61 62 6c 65 20 7c 7c 20 70 41 2d 3e  ->iTable || pA->
15d90 69 43 6f 6c 75 6d 6e 21 3d 70 42 2d 3e 69 43 6f  iColumn!=pB->iCo
15da0 6c 75 6d 6e 20 29 20 72 65 74 75 72 6e 20 30 3b  lumn ) return 0;
15db0 0a 20 20 69 66 28 20 70 41 2d 3e 6f 70 21 3d 54  .  if( pA->op!=T
15dc0 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 41 2d 3e  K_COLUMN && pA->
15dd0 74 6f 6b 65 6e 2e 7a 20 29 7b 0a 20 20 20 20 69  token.z ){.    i
15de0 66 28 20 70 42 2d 3e 74 6f 6b 65 6e 2e 7a 3d 3d  f( pB->token.z==
15df0 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
15e00 20 20 69 66 28 20 70 42 2d 3e 74 6f 6b 65 6e 2e    if( pB->token.
15e10 6e 21 3d 70 41 2d 3e 74 6f 6b 65 6e 2e 6e 20 29  n!=pA->token.n )
15e20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 69   return 0;.    i
15e30 66 28 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43  f( sqlite3StrNIC
15e40 6d 70 28 28 63 68 61 72 2a 29 70 41 2d 3e 74 6f  mp((char*)pA->to
15e50 6b 65 6e 2e 7a 2c 28 63 68 61 72 2a 29 70 42 2d  ken.z,(char*)pB-
15e60 3e 74 6f 6b 65 6e 2e 7a 2c 70 42 2d 3e 74 6f 6b  >token.z,pB->tok
15e70 65 6e 2e 6e 29 21 3d 30 20 29 7b 0a 20 20 20 20  en.n)!=0 ){.    
15e80 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
15e90 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31  }.  }.  return 1
15ea0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  ;.}.../*.** Add 
15eb0 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f  a new element to
15ec0 20 74 68 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61   the pAggInfo->a
15ed0 43 6f 6c 5b 5d 20 61 72 72 61 79 2e 20 20 52 65  Col[] array.  Re
15ee0 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f  turn the index o
15ef0 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 65 6c 65  f.** the new ele
15f00 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 20 61 20  ment.  Return a 
15f10 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72 20  negative number 
15f20 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 2e  if malloc fails.
15f30 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
15f40 64 64 41 67 67 49 6e 66 6f 43 6f 6c 75 6d 6e 28  ddAggInfoColumn(
15f50 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 41 67 67  sqlite3 *db, Agg
15f60 49 6e 66 6f 20 2a 70 49 6e 66 6f 29 7b 0a 20 20  Info *pInfo){.  
15f70 69 6e 74 20 69 3b 0a 20 20 70 49 6e 66 6f 2d 3e  int i;.  pInfo->
15f80 61 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 41 72  aCol = sqlite3Ar
15f90 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20 20  rayAllocate(.   
15fa0 20 20 20 20 64 62 2c 0a 20 20 20 20 20 20 20 70      db,.       p
15fb0 49 6e 66 6f 2d 3e 61 43 6f 6c 2c 0a 20 20 20 20  Info->aCol,.    
15fc0 20 20 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d     sizeof(pInfo-
15fd0 3e 61 43 6f 6c 5b 30 5d 29 2c 0a 20 20 20 20 20  >aCol[0]),.     
15fe0 20 20 33 2c 0a 20 20 20 20 20 20 20 26 70 49 6e    3,.       &pIn
15ff0 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 2c 0a 20 20 20  fo->nColumn,.   
16000 20 20 20 20 26 70 49 6e 66 6f 2d 3e 6e 43 6f 6c      &pInfo->nCol
16010 75 6d 6e 41 6c 6c 6f 63 2c 0a 20 20 20 20 20 20  umnAlloc,.      
16020 20 26 69 0a 20 20 29 3b 0a 20 20 72 65 74 75 72   &i.  );.  retur
16030 6e 20 69 3b 0a 7d 20 20 20 20 0a 0a 2f 2a 0a 2a  n i;.}    ../*.*
16040 2a 20 41 64 64 20 61 20 6e 65 77 20 65 6c 65 6d  * Add a new elem
16050 65 6e 74 20 74 6f 20 74 68 65 20 70 41 67 67 49  ent to the pAggI
16060 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 20 61 72 72  nfo->aFunc[] arr
16070 61 79 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  ay.  Return the 
16080 69 6e 64 65 78 20 6f 66 0a 2a 2a 20 74 68 65 20  index of.** the 
16090 6e 65 77 20 65 6c 65 6d 65 6e 74 2e 20 20 52 65  new element.  Re
160a0 74 75 72 6e 20 61 20 6e 65 67 61 74 69 76 65 20  turn a negative 
160b0 6e 75 6d 62 65 72 20 69 66 20 6d 61 6c 6c 6f 63  number if malloc
160c0 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69   fails..*/.stati
160d0 63 20 69 6e 74 20 61 64 64 41 67 67 49 6e 66 6f  c int addAggInfo
160e0 46 75 6e 63 28 73 71 6c 69 74 65 33 20 2a 64 62  Func(sqlite3 *db
160f0 2c 20 41 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f  , AggInfo *pInfo
16100 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 70 49  ){.  int i;.  pI
16110 6e 66 6f 2d 3e 61 46 75 6e 63 20 3d 20 73 71 6c  nfo->aFunc = sql
16120 69 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61 74  ite3ArrayAllocat
16130 65 28 0a 20 20 20 20 20 20 20 64 62 2c 20 0a 20  e(.       db, . 
16140 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61 46 75        pInfo->aFu
16150 6e 63 2c 0a 20 20 20 20 20 20 20 73 69 7a 65 6f  nc,.       sizeo
16160 66 28 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 30  f(pInfo->aFunc[0
16170 5d 29 2c 0a 20 20 20 20 20 20 20 33 2c 0a 20 20  ]),.       3,.  
16180 20 20 20 20 20 26 70 49 6e 66 6f 2d 3e 6e 46 75       &pInfo->nFu
16190 6e 63 2c 0a 20 20 20 20 20 20 20 26 70 49 6e 66  nc,.       &pInf
161a0 6f 2d 3e 6e 46 75 6e 63 41 6c 6c 6f 63 2c 0a 20  o->nFuncAlloc,. 
161b0 20 20 20 20 20 20 26 69 0a 20 20 29 3b 0a 20 20        &i.  );.  
161c0 72 65 74 75 72 6e 20 69 3b 0a 7d 20 20 20 20 0a  return i;.}    .
161d0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61  ./*.** This is a
161e0 6e 20 78 46 75 6e 63 20 66 6f 72 20 77 61 6c 6b  n xFunc for walk
161f0 45 78 70 72 54 72 65 65 28 29 20 75 73 65 64 20  ExprTree() used 
16200 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 0a 2a 2a  to implement .**
16210 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
16220 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 29 2e  yzeAggregates().
16230 20 20 53 65 65 20 73 71 6c 69 74 65 33 45 78 70    See sqlite3Exp
16240 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74  rAnalyzeAggregat
16250 65 73 0a 2a 2a 20 66 6f 72 20 61 64 64 69 74 69  es.** for additi
16260 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
16270 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
16280 74 69 6e 65 20 61 6e 61 6c 79 7a 65 73 20 74 68  tine analyzes th
16290 65 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  e aggregate func
162a0 74 69 6f 6e 20 61 74 20 70 45 78 70 72 2e 0a 2a  tion at pExpr..*
162b0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6e 61  /.static int ana
162c0 6c 79 7a 65 41 67 67 72 65 67 61 74 65 28 76 6f  lyzeAggregate(vo
162d0 69 64 20 2a 70 41 72 67 2c 20 45 78 70 72 20 2a  id *pArg, Expr *
162e0 70 45 78 70 72 29 7b 0a 20 20 69 6e 74 20 69 3b  pExpr){.  int i;
162f0 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a  .  NameContext *
16300 70 4e 43 20 3d 20 28 4e 61 6d 65 43 6f 6e 74 65  pNC = (NameConte
16310 78 74 20 2a 29 70 41 72 67 3b 0a 20 20 50 61 72  xt *)pArg;.  Par
16320 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 4e 43  se *pParse = pNC
16330 2d 3e 70 50 61 72 73 65 3b 0a 20 20 53 72 63 4c  ->pParse;.  SrcL
16340 69 73 74 20 2a 70 53 72 63 4c 69 73 74 20 3d 20  ist *pSrcList = 
16350 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3b 0a 20  pNC->pSrcList;. 
16360 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e   AggInfo *pAggIn
16370 66 6f 20 3d 20 70 4e 43 2d 3e 70 41 67 67 49 6e  fo = pNC->pAggIn
16380 66 6f 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 70  fo;..  switch( p
16390 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  Expr->op ){.    
163a0 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55  case TK_AGG_COLU
163b0 4d 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  MN:.    case TK_
163c0 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20  COLUMN: {.      
163d0 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  /* Check to see 
163e0 69 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73  if the column is
163f0 20 69 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 74   in one of the t
16400 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52 4f  ables in the FRO
16410 4d 0a 20 20 20 20 20 20 2a 2a 20 63 6c 61 75 73  M.      ** claus
16420 65 20 6f 66 20 74 68 65 20 61 67 67 72 65 67 61  e of the aggrega
16430 74 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 20 20  te query */.    
16440 20 20 69 66 28 20 70 53 72 63 4c 69 73 74 20 29    if( pSrcList )
16450 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74  {.        struct
16460 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
16470 49 74 65 6d 20 3d 20 70 53 72 63 4c 69 73 74 2d  Item = pSrcList-
16480 3e 61 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  >a;.        for(
16490 69 3d 30 3b 20 69 3c 70 53 72 63 4c 69 73 74 2d  i=0; i<pSrcList-
164a0 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65  >nSrc; i++, pIte
164b0 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  m++){.          
164c0 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63  struct AggInfo_c
164d0 6f 6c 20 2a 70 43 6f 6c 3b 0a 20 20 20 20 20 20  ol *pCol;.      
164e0 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69      if( pExpr->i
164f0 54 61 62 6c 65 3d 3d 70 49 74 65 6d 2d 3e 69 43  Table==pItem->iC
16500 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 20  ursor ){.       
16510 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20 72 65       /* If we re
16520 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20  ach this point, 
16530 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 70 45  it means that pE
16540 78 70 72 20 72 65 66 65 72 73 20 74 6f 20 61 20  xpr refers to a 
16550 74 61 62 6c 65 0a 20 20 20 20 20 20 20 20 20 20  table.          
16560 20 20 2a 2a 20 74 68 61 74 20 69 73 20 69 6e 20    ** that is in 
16570 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
16580 6f 66 20 74 68 65 20 61 67 67 72 65 67 61 74 65  of the aggregate
16590 20 71 75 65 72 79 2e 20 20 0a 20 20 20 20 20 20   query.  .      
165a0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
165b0 20 20 20 20 20 2a 2a 20 4d 61 6b 65 20 61 6e 20       ** Make an 
165c0 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 63 6f  entry for the co
165d0 6c 75 6d 6e 20 69 6e 20 70 41 67 67 49 6e 66 6f  lumn in pAggInfo
165e0 2d 3e 61 43 6f 6c 5b 5d 20 69 66 20 74 68 65 72  ->aCol[] if ther
165f0 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  e.            **
16600 20 69 73 20 6e 6f 74 20 61 6e 20 65 6e 74 72 79   is not an entry
16610 20 74 68 65 72 65 20 61 6c 72 65 61 64 79 2e 0a   there already..
16620 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20              */. 
16630 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6b             int k
16640 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43  ;.            pC
16650 6f 6c 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 61  ol = pAggInfo->a
16660 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Col;.           
16670 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 41 67 67   for(k=0; k<pAgg
16680 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6b  Info->nColumn; k
16690 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20  ++, pCol++){.   
166a0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
166b0 43 6f 6c 2d 3e 69 54 61 62 6c 65 3d 3d 70 45 78  Col->iTable==pEx
166c0 70 72 2d 3e 69 54 61 62 6c 65 20 26 26 0a 20 20  pr->iTable &&.  
166d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
166e0 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70  pCol->iColumn==p
166f0 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b  Expr->iColumn ){
16700 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
16710 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
16720 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
16730 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
16740 20 20 69 66 28 20 28 6b 3e 3d 70 41 67 67 49 6e    if( (k>=pAggIn
16750 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 29 0a 20 20 20  fo->nColumn).   
16760 20 20 20 20 20 20 20 20 20 20 26 26 20 28 6b 20            && (k 
16770 3d 20 61 64 64 41 67 67 49 6e 66 6f 43 6f 6c 75  = addAggInfoColu
16780 6d 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  mn(pParse->db, p
16790 41 67 67 49 6e 66 6f 29 29 3e 3d 30 20 0a 20 20  AggInfo))>=0 .  
167a0 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20            ){.   
167b0 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 20             pCol 
167c0 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f  = &pAggInfo->aCo
167d0 6c 5b 6b 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  l[k];.          
167e0 20 20 20 20 70 43 6f 6c 2d 3e 70 54 61 62 20 3d      pCol->pTab =
167f0 20 70 45 78 70 72 2d 3e 70 54 61 62 3b 0a 20 20   pExpr->pTab;.  
16800 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
16810 2d 3e 69 54 61 62 6c 65 20 3d 20 70 45 78 70 72  ->iTable = pExpr
16820 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20  ->iTable;.      
16830 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 43          pCol->iC
16840 6f 6c 75 6d 6e 20 3d 20 70 45 78 70 72 2d 3e 69  olumn = pExpr->i
16850 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20  Column;.        
16860 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 4d 65 6d        pCol->iMem
16870 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
16880 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  m;.             
16890 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f   pCol->iSorterCo
168a0 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20  lumn = -1;.     
168b0 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70           pCol->p
168c0 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20  Expr = pExpr;.  
168d0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
168e0 70 41 67 67 49 6e 66 6f 2d 3e 70 47 72 6f 75 70  pAggInfo->pGroup
168f0 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  By ){.          
16900 20 20 20 20 20 20 69 6e 74 20 6a 2c 20 6e 3b 0a        int j, n;.
16910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16920 45 78 70 72 4c 69 73 74 20 2a 70 47 42 20 3d 20  ExprList *pGB = 
16930 70 41 67 67 49 6e 66 6f 2d 3e 70 47 72 6f 75 70  pAggInfo->pGroup
16940 42 79 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  By;.            
16950 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
16960 69 73 74 5f 69 74 65 6d 20 2a 70 54 65 72 6d 20  ist_item *pTerm 
16970 3d 20 70 47 42 2d 3e 61 3b 0a 20 20 20 20 20 20  = pGB->a;.      
16980 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20 70 47            n = pG
16990 42 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20  B->nExpr;.      
169a0 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d            for(j=
169b0 30 3b 20 6a 3c 6e 3b 20 6a 2b 2b 2c 20 70 54 65  0; j<n; j++, pTe
169c0 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  rm++){.         
169d0 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70           Expr *p
169e0 45 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  E = pTerm->pExpr
169f0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
16a00 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d      if( pE->op==
16a10 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 45 2d  TK_COLUMN && pE-
16a20 3e 69 54 61 62 6c 65 3d 3d 70 45 78 70 72 2d 3e  >iTable==pExpr->
16a30 69 54 61 62 6c 65 20 26 26 0a 20 20 20 20 20 20  iTable &&.      
16a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16a50 70 45 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78  pE->iColumn==pEx
16a60 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20  pr->iColumn ){. 
16a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16a80 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72     pCol->iSorter
16a90 43 6f 6c 75 6d 6e 20 3d 20 6a 3b 0a 20 20 20 20  Column = j;.    
16aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16ab0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
16ac0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
16ad0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
16ae0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
16af0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
16b00 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75  Col->iSorterColu
16b10 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  mn<0 ){.        
16b20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53          pCol->iS
16b30 6f 72 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 70 41  orterColumn = pA
16b40 67 67 49 6e 66 6f 2d 3e 6e 53 6f 72 74 69 6e 67  ggInfo->nSorting
16b50 43 6f 6c 75 6d 6e 2b 2b 3b 0a 20 20 20 20 20 20  Column++;.      
16b60 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
16b70 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
16b80 20 20 20 20 2f 2a 20 54 68 65 72 65 20 69 73 20      /* There is 
16b90 6e 6f 77 20 61 6e 20 65 6e 74 72 79 20 66 6f 72  now an entry for
16ba0 20 70 45 78 70 72 20 69 6e 20 70 41 67 67 49 6e   pExpr in pAggIn
16bb0 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 28 65 69 74 68  fo->aCol[] (eith
16bc0 65 72 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  er.            *
16bd0 2a 20 62 65 63 61 75 73 65 20 69 74 20 77 61 73  * because it was
16be0 20 74 68 65 72 65 20 62 65 66 6f 72 65 20 6f 72   there before or
16bf0 20 62 65 63 61 75 73 65 20 77 65 20 6a 75 73 74   because we just
16c00 20 63 72 65 61 74 65 64 20 69 74 29 2e 0a 20 20   created it)..  
16c10 20 20 20 20 20 20 20 20 20 20 2a 2a 20 43 6f 6e            ** Con
16c20 76 65 72 74 20 74 68 65 20 70 45 78 70 72 20 74  vert the pExpr t
16c30 6f 20 62 65 20 61 20 54 4b 5f 41 47 47 5f 43 4f  o be a TK_AGG_CO
16c40 4c 55 4d 4e 20 72 65 66 65 72 72 69 6e 67 20 74  LUMN referring t
16c50 6f 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 20  o that.         
16c60 20 20 20 2a 2a 20 70 41 67 67 49 6e 66 6f 2d 3e     ** pAggInfo->
16c70 61 43 6f 6c 5b 5d 20 65 6e 74 72 79 2e 0a 20 20  aCol[] entry..  
16c80 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
16c90 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
16ca0 70 41 67 67 49 6e 66 6f 20 3d 20 70 41 67 67 49  pAggInfo = pAggI
16cb0 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nfo;.           
16cc0 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f   pExpr->op = TK_
16cd0 41 47 47 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20  AGG_COLUMN;.    
16ce0 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69          pExpr->i
16cf0 41 67 67 20 3d 20 6b 3b 0a 20 20 20 20 20 20 20  Agg = k;.       
16d00 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
16d10 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64 69 66        } /* endif
16d20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d   pExpr->iTable==
16d30 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 2a  pItem->iCursor *
16d40 2f 0a 20 20 20 20 20 20 20 20 7d 20 2f 2a 20 65  /.        } /* e
16d50 6e 64 20 6c 6f 6f 70 20 6f 76 65 72 20 70 53 72  nd loop over pSr
16d60 63 4c 69 73 74 20 2a 2f 0a 20 20 20 20 20 20 7d  cList */.      }
16d70 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
16d80 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
16d90 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a  TK_AGG_FUNCTION:
16da0 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20   {.      /* The 
16db0 70 4e 43 2d 3e 6e 44 65 70 74 68 3d 3d 30 20 74  pNC->nDepth==0 t
16dc0 65 73 74 20 63 61 75 73 65 73 20 61 67 67 72 65  est causes aggre
16dd0 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 69  gate functions i
16de0 6e 20 73 75 62 71 75 65 72 69 65 73 0a 20 20 20  n subqueries.   
16df0 20 20 20 2a 2a 20 74 6f 20 62 65 20 69 67 6e 6f     ** to be igno
16e00 72 65 64 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  red */.      if(
16e10 20 70 4e 43 2d 3e 6e 44 65 70 74 68 3d 3d 30 20   pNC->nDepth==0 
16e20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68  ){.        /* Ch
16e30 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 70 45  eck to see if pE
16e40 78 70 72 20 69 73 20 61 20 64 75 70 6c 69 63 61  xpr is a duplica
16e50 74 65 20 6f 66 20 61 6e 6f 74 68 65 72 20 61 67  te of another ag
16e60 67 72 65 67 61 74 65 20 0a 20 20 20 20 20 20 20  gregate .       
16e70 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 74 68 61   ** function tha
16e80 74 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20  t is already in 
16e90 74 68 65 20 70 41 67 67 49 6e 66 6f 20 73 74 72  the pAggInfo str
16ea0 75 63 74 75 72 65 0a 20 20 20 20 20 20 20 20 2a  ucture.        *
16eb0 2f 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74  /.        struct
16ec0 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70   AggInfo_func *p
16ed0 49 74 65 6d 20 3d 20 70 41 67 67 49 6e 66 6f 2d  Item = pAggInfo-
16ee0 3e 61 46 75 6e 63 3b 0a 20 20 20 20 20 20 20 20  >aFunc;.        
16ef0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 67 67 49  for(i=0; i<pAggI
16f00 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c  nfo->nFunc; i++,
16f10 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
16f20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
16f30 45 78 70 72 43 6f 6d 70 61 72 65 28 70 49 74 65  ExprCompare(pIte
16f40 6d 2d 3e 70 45 78 70 72 2c 20 70 45 78 70 72 29  m->pExpr, pExpr)
16f50 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
16f60 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
16f70 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
16f80 20 20 20 20 20 69 66 28 20 69 3e 3d 70 41 67 67       if( i>=pAgg
16f90 49 6e 66 6f 2d 3e 6e 46 75 6e 63 20 29 7b 0a 20  Info->nFunc ){. 
16fa0 20 20 20 20 20 20 20 20 20 2f 2a 20 70 45 78 70           /* pExp
16fb0 72 20 69 73 20 6f 72 69 67 69 6e 61 6c 2e 20 20  r is original.  
16fc0 4d 61 6b 65 20 61 20 6e 65 77 20 65 6e 74 72 79  Make a new entry
16fd0 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46   in pAggInfo->aF
16fe0 75 6e 63 5b 5d 0a 20 20 20 20 20 20 20 20 20 20  unc[].          
16ff0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 75 38 20  */.          u8 
17000 65 6e 63 20 3d 20 45 4e 43 28 70 50 61 72 73 65  enc = ENC(pParse
17010 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20  ->db);.         
17020 20 69 20 3d 20 61 64 64 41 67 67 49 6e 66 6f 46   i = addAggInfoF
17030 75 6e 63 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  unc(pParse->db, 
17040 70 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20  pAggInfo);.     
17050 20 20 20 20 20 69 66 28 20 69 3e 3d 30 20 29 7b       if( i>=0 ){
17060 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74  .            pIt
17070 65 6d 20 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e  em = &pAggInfo->
17080 61 46 75 6e 63 5b 69 5d 3b 0a 20 20 20 20 20 20  aFunc[i];.      
17090 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 45 78        pItem->pEx
170a0 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20  pr = pExpr;.    
170b0 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69          pItem->i
170c0 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  Mem = ++pParse->
170d0 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 20 20  nMem;.          
170e0 20 20 70 49 74 65 6d 2d 3e 70 46 75 6e 63 20 3d    pItem->pFunc =
170f0 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63   sqlite3FindFunc
17100 74 69 6f 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c  tion(pParse->db,
17110 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17120 20 20 20 20 28 63 68 61 72 2a 29 70 45 78 70 72      (char*)pExpr
17130 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70 72  ->token.z, pExpr
17140 2d 3e 74 6f 6b 65 6e 2e 6e 2c 0a 20 20 20 20 20  ->token.n,.     
17150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
17160 78 70 72 2d 3e 70 4c 69 73 74 20 3f 20 70 45 78  xpr->pList ? pEx
17170 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  pr->pList->nExpr
17180 20 3a 20 30 2c 20 65 6e 63 2c 20 30 29 3b 0a 20   : 0, enc, 0);. 
17190 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
171a0 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50  Expr->flags & EP
171b0 5f 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20  _Distinct ){.   
171c0 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d             pItem
171d0 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d 20 70 50  ->iDistinct = pP
171e0 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
171f0 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
17200 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
17210 49 74 65 6d 2d 3e 69 44 69 73 74 69 6e 63 74 20  Item->iDistinct 
17220 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20  = -1;.          
17230 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
17240 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
17250 20 20 2f 2a 20 4d 61 6b 65 20 70 45 78 70 72 20    /* Make pExpr 
17260 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 61 70 70  point to the app
17270 72 6f 70 72 69 61 74 65 20 70 41 67 67 49 6e 66  ropriate pAggInf
17280 6f 2d 3e 61 46 75 6e 63 5b 5d 20 65 6e 74 72 79  o->aFunc[] entry
17290 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
172a0 20 20 20 20 70 45 78 70 72 2d 3e 69 41 67 67 20      pExpr->iAgg 
172b0 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 70 45 78  = i;.        pEx
172c0 70 72 2d 3e 70 41 67 67 49 6e 66 6f 20 3d 20 70  pr->pAggInfo = p
172d0 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20  AggInfo;.       
172e0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
172f0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
17300 2f 2a 20 52 65 63 75 72 73 69 76 65 6c 79 20 77  /* Recursively w
17310 61 6c 6b 20 73 75 62 71 75 65 72 69 65 73 20 6c  alk subqueries l
17320 6f 6f 6b 69 6e 67 20 66 6f 72 20 54 4b 5f 43 4f  ooking for TK_CO
17330 4c 55 4d 4e 20 6e 6f 64 65 73 20 74 68 61 74 20  LUMN nodes that 
17340 6e 65 65 64 0a 20 20 2a 2a 20 74 6f 20 62 65 20  need.  ** to be 
17350 63 68 61 6e 67 65 64 20 74 6f 20 54 4b 5f 41 47  changed to TK_AG
17360 47 5f 43 4f 4c 55 4d 4e 2e 20 20 42 75 74 20 69  G_COLUMN.  But i
17370 6e 63 72 65 6d 65 6e 74 20 6e 44 65 70 74 68 20  ncrement nDepth 
17380 73 6f 20 74 68 61 74 0a 20 20 2a 2a 20 54 4b 5f  so that.  ** TK_
17390 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 6e 6f 64  AGG_FUNCTION nod
173a0 65 73 20 69 6e 20 73 75 62 71 75 65 72 69 65 73  es in subqueries
173b0 20 77 69 6c 6c 20 62 65 20 75 6e 63 68 61 6e 67   will be unchang
173c0 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ed..  */.  if( p
173d0 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 20 29 7b  Expr->pSelect ){
173e0 0a 20 20 20 20 70 4e 43 2d 3e 6e 44 65 70 74 68  .    pNC->nDepth
173f0 2b 2b 3b 0a 20 20 20 20 77 61 6c 6b 53 65 6c 65  ++;.    walkSele
17400 63 74 45 78 70 72 28 70 45 78 70 72 2d 3e 70 53  ctExpr(pExpr->pS
17410 65 6c 65 63 74 2c 20 61 6e 61 6c 79 7a 65 41 67  elect, analyzeAg
17420 67 72 65 67 61 74 65 2c 20 70 4e 43 29 3b 0a 20  gregate, pNC);. 
17430 20 20 20 70 4e 43 2d 3e 6e 44 65 70 74 68 2d 2d     pNC->nDepth--
17440 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
17450 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79  ;.}../*.** Analy
17460 7a 65 20 74 68 65 20 67 69 76 65 6e 20 65 78 70  ze the given exp
17470 72 65 73 73 69 6f 6e 20 6c 6f 6f 6b 69 6e 67 20  ression looking 
17480 66 6f 72 20 61 67 67 72 65 67 61 74 65 20 66 75  for aggregate fu
17490 6e 63 74 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66  nctions and.** f
174a0 6f 72 20 76 61 72 69 61 62 6c 65 73 20 74 68 61  or variables tha
174b0 74 20 6e 65 65 64 20 74 6f 20 62 65 20 61 64 64  t need to be add
174c0 65 64 20 74 6f 20 74 68 65 20 70 50 61 72 73 65  ed to the pParse
174d0 2d 3e 61 41 67 67 5b 5d 20 61 72 72 61 79 2e 0a  ->aAgg[] array..
174e0 2a 2a 20 4d 61 6b 65 20 61 64 64 69 74 69 6f 6e  ** Make addition
174f0 61 6c 20 65 6e 74 72 69 65 73 20 74 6f 20 74 68  al entries to th
17500 65 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 5d  e pParse->aAgg[]
17510 20 61 72 72 61 79 20 61 73 20 6e 65 63 65 73 73   array as necess
17520 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ary..**.** This 
17530 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 6f  routine should o
17540 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 61 66  nly be called af
17550 74 65 72 20 74 68 65 20 65 78 70 72 65 73 73 69  ter the expressi
17560 6f 6e 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 61  on has been.** a
17570 6e 61 6c 79 7a 65 64 20 62 79 20 73 71 6c 69 74  nalyzed by sqlit
17580 65 33 45 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d  e3ExprResolveNam
17590 65 73 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65  es()..**.** If e
175a0 72 72 6f 72 73 20 61 72 65 20 73 65 65 6e 2c 20  rrors are seen, 
175b0 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d  leave an error m
175c0 65 73 73 61 67 65 20 69 6e 20 7a 45 72 72 4d 73  essage in zErrMs
175d0 67 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20  g and return.** 
175e0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72  the number of er
175f0 72 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rors..*/.int sql
17600 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
17610 67 67 72 65 67 61 74 65 73 28 4e 61 6d 65 43 6f  ggregates(NameCo
17620 6e 74 65 78 74 20 2a 70 4e 43 2c 20 45 78 70 72  ntext *pNC, Expr
17630 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74 20   *pExpr){.  int 
17640 6e 45 72 72 20 3d 20 70 4e 43 2d 3e 70 50 61 72  nErr = pNC->pPar
17650 73 65 2d 3e 6e 45 72 72 3b 0a 20 20 77 61 6c 6b  se->nErr;.  walk
17660 45 78 70 72 54 72 65 65 28 70 45 78 70 72 2c 20  ExprTree(pExpr, 
17670 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  analyzeAggregate
17680 2c 20 70 4e 43 29 3b 0a 20 20 72 65 74 75 72 6e  , pNC);.  return
17690 20 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 6e 45   pNC->pParse->nE
176a0 72 72 20 2d 20 6e 45 72 72 3b 0a 7d 0a 0a 2f 2a  rr - nErr;.}../*
176b0 0a 2a 2a 20 43 61 6c 6c 20 73 71 6c 69 74 65 33  .** Call sqlite3
176c0 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65  ExprAnalyzeAggre
176d0 67 61 74 65 73 28 29 20 66 6f 72 20 65 76 65 72  gates() for ever
176e0 79 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20  y expression in 
176f0 61 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  an.** expression
17700 20 6c 69 73 74 2e 20 20 52 65 74 75 72 6e 20 74   list.  Return t
17710 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72  he number of err
17720 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ors..**.** If an
17730 20 65 72 72 6f 72 20 69 73 20 66 6f 75 6e 64 2c   error is found,
17740 20 74 68 65 20 61 6e 61 6c 79 73 69 73 20 69 73   the analysis is
17750 20 63 75 74 20 73 68 6f 72 74 2e 0a 2a 2f 0a 69   cut short..*/.i
17760 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e  nt sqlite3ExprAn
17770 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 4e 61 6d  alyzeAggList(Nam
17780 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 45  eContext *pNC, E
17790 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b  xprList *pList){
177a0 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69  .  struct ExprLi
177b0 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
177c0 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e    int i;.  int n
177d0 45 72 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  Err = 0;.  if( p
177e0 4c 69 73 74 20 29 7b 0a 20 20 20 20 66 6f 72 28  List ){.    for(
177f0 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20  pItem=pList->a, 
17800 69 3d 30 3b 20 6e 45 72 72 3d 3d 30 20 26 26 20  i=0; nErr==0 && 
17810 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  i<pList->nExpr; 
17820 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  i++, pItem++){. 
17830 20 20 20 20 20 6e 45 72 72 20 2b 3d 20 73 71 6c       nErr += sql
17840 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
17850 67 67 72 65 67 61 74 65 73 28 70 4e 43 2c 20 70  ggregates(pNC, p
17860 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20  Item->pExpr);.  
17870 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
17880 20 6e 45 72 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   nErr;.}../*.** 
17890 41 6c 6c 6f 63 61 74 65 20 6f 72 20 64 65 61 6c  Allocate or deal
178a0 6c 6f 63 61 74 65 20 74 65 6d 70 6f 72 61 72 79  locate temporary
178b0 20 75 73 65 20 72 65 67 69 73 74 65 72 73 20 64   use registers d
178c0 75 72 69 6e 67 20 63 6f 64 65 20 67 65 6e 65 72  uring code gener
178d0 61 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ation..*/.int sq
178e0 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
178f0 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
17900 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 54    if( pParse->nT
17910 65 6d 70 52 65 67 20 29 7b 0a 20 20 20 20 72 65  empReg ){.    re
17920 74 75 72 6e 20 70 50 61 72 73 65 2d 3e 61 54 65  turn pParse->aTe
17930 6d 70 52 65 67 5b 2d 2d 70 50 61 72 73 65 2d 3e  mpReg[--pParse->
17940 6e 54 65 6d 70 52 65 67 5d 3b 0a 20 20 7d 65 6c  nTempReg];.  }el
17950 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 2b  se{.    return +
17960 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
17970 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65   }.}.void sqlite
17980 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
17990 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
179a0 6e 74 20 69 52 65 67 29 7b 0a 20 20 69 66 28 20  nt iReg){.  if( 
179b0 69 52 65 67 20 26 26 20 70 50 61 72 73 65 2d 3e  iReg && pParse->
179c0 6e 54 65 6d 70 52 65 67 3c 41 72 72 61 79 53 69  nTempReg<ArraySi
179d0 7a 65 28 70 50 61 72 73 65 2d 3e 61 54 65 6d 70  ze(pParse->aTemp
179e0 52 65 67 29 20 29 7b 0a 20 20 20 20 61 73 73 65  Reg) ){.    asse
179f0 72 74 28 20 69 52 65 67 3e 30 20 29 3b 0a 20 20  rt( iReg>0 );.  
17a00 20 20 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52    pParse->aTempR
17a10 65 67 5b 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70  eg[pParse->nTemp
17a20 52 65 67 2b 2b 5d 20 3d 20 69 52 65 67 3b 0a 20  Reg++] = iReg;. 
17a30 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f   }.}../*.** Allo
17a40 63 61 74 65 20 6f 72 20 64 65 61 6c 6c 6f 63 61  cate or dealloca
17a50 74 65 20 61 20 62 6c 6f 63 6b 20 6f 66 20 6e 52  te a block of nR
17a60 65 67 20 63 6f 6e 73 65 63 75 74 69 76 65 20 72  eg consecutive r
17a70 65 67 69 73 74 65 72 73 0a 2a 2f 0a 69 6e 74 20  egisters.*/.int 
17a80 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61  sqlite3GetTempRa
17a90 6e 67 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  nge(Parse *pPars
17aa0 65 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20  e, int nReg){.  
17ab0 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 6e 52 65  int i;.  if( nRe
17ac0 67 3c 3d 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67  g<=pParse->nRang
17ad0 65 52 65 67 20 29 7b 0a 20 20 20 20 69 20 20 3d  eReg ){.    i  =
17ae0 20 70 50 61 72 73 65 2d 3e 69 52 61 6e 67 65 52   pParse->iRangeR
17af0 65 67 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  eg;.    pParse->
17b00 69 52 61 6e 67 65 52 65 67 20 2b 3d 20 6e 52 65  iRangeReg += nRe
17b10 67 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  g;.    pParse->n
17b20 52 61 6e 67 65 52 65 67 20 2d 3d 20 6e 52 65 67  RangeReg -= nReg
17b30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
17b40 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b   = pParse->nMem+
17b50 31 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  1;.    pParse->n
17b60 4d 65 6d 20 2b 3d 20 6e 52 65 67 3b 0a 20 20 7d  Mem += nReg;.  }
17b70 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 76  .  return i;.}.v
17b80 6f 69 64 20 73 71 6c 69 74 65 33 52 65 6c 65 61  oid sqlite3Relea
17b90 73 65 54 65 6d 70 52 61 6e 67 65 28 50 61 72 73  seTempRange(Pars
17ba0 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
17bb0 52 65 67 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a  Reg, int nReg){.
17bc0 20 20 69 66 28 20 6e 52 65 67 3e 70 50 61 72 73    if( nReg>pPars
17bd0 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20 29 7b 0a  e->nRangeReg ){.
17be0 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e      pParse->nRan
17bf0 67 65 52 65 67 20 3d 20 6e 52 65 67 3b 0a 20 20  geReg = nReg;.  
17c00 20 20 70 50 61 72 73 65 2d 3e 69 52 61 6e 67 65    pParse->iRange
17c10 52 65 67 20 3d 20 69 52 65 67 3b 0a 20 20 7d 0a  Reg = iReg;.  }.
17c20 7d 0a                                            }.