/ Hex Artifact Content
Login

Artifact 7aecda0fb4f078718281a9b56993677c1f45a399:


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 36 37 20 32 30 30 38 2f 30 34 2f 31 35 20  .367 2008/04/15 
0220: 31 32 3a 31 34 3a 32 32 20 64 72 68 20 45 78 70  12:14:22 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 74 68  *.** Generate th
17c0: 65 20 6f 70 65 72 61 6e 64 73 20 66 6f 72 20 61  e operands for a
17d0: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72   comparison oper
17e0: 61 74 69 6f 6e 2e 20 20 42 65 66 6f 72 65 0a 2a  ation.  Before.*
17f0: 2a 20 67 65 6e 65 72 61 74 69 6e 67 20 74 68 65  * generating the
1800: 20 63 6f 64 65 20 66 6f 72 20 65 61 63 68 20 6f   code for each o
1810: 70 65 72 61 6e 64 2c 20 73 65 74 20 74 68 65 20  perand, set the 
1820: 45 50 5f 41 6e 79 41 66 66 0a 2a 2a 20 66 6c 61  EP_AnyAff.** fla
1830: 67 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73  g on the express
1840: 69 6f 6e 20 73 6f 20 74 68 61 74 20 69 74 20 77  ion so that it w
1850: 69 6c 6c 20 62 65 20 61 62 6c 65 20 74 6f 20 75  ill be able to u
1860: 73 65 64 20 61 0a 2a 2a 20 63 61 63 68 65 64 20  sed a.** cached 
1870: 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 74 68 61  column value tha
1880: 74 20 68 61 73 20 70 72 65 76 69 6f 75 73 6c 79  t has previously
1890: 20 75 6e 64 65 72 67 6f 6e 65 20 61 6e 0a 2a 2a   undergone an.**
18a0: 20 61 66 66 69 6e 69 74 79 20 63 68 61 6e 67 65   affinity change
18b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
18c0: 20 63 6f 64 65 43 6f 6d 70 61 72 65 4f 70 65 72   codeCompareOper
18d0: 61 6e 64 73 28 0a 20 20 50 61 72 73 65 20 2a 70  ands(.  Parse *p
18e0: 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72  Parse,    /* Par
18f0: 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65  sing and code ge
1900: 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74  nerating context
1910: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c 65 66   */.  Expr *pLef
1920: 74 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c  t,      /* The l
1930: 65 66 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20  eft operand */. 
1940: 20 69 6e 74 20 2a 70 52 65 67 4c 65 66 74 2c 20   int *pRegLeft, 
1950: 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 77     /* Register w
1960: 68 65 72 65 20 6c 65 66 74 20 6f 70 65 72 61 6e  here left operan
1970: 64 20 69 73 20 73 74 6f 72 65 64 20 2a 2f 0a 20  d is stored */. 
1980: 20 69 6e 74 20 2a 70 46 72 65 65 4c 65 66 74 2c   int *pFreeLeft,
1990: 20 20 20 2f 2a 20 46 72 65 65 20 74 68 69 73 20     /* Free this 
19a0: 72 65 67 69 73 74 65 72 20 77 68 65 6e 20 64 6f  register when do
19b0: 6e 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 52  ne */.  Expr *pR
19c0: 69 67 68 74 2c 20 20 20 20 20 2f 2a 20 54 68 65  ight,     /* The
19d0: 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20 2a   right operand *
19e0: 2f 0a 20 20 69 6e 74 20 2a 70 52 65 67 52 69 67  /.  int *pRegRig
19f0: 68 74 2c 20 20 20 2f 2a 20 52 65 67 69 73 74 65  ht,   /* Registe
1a00: 72 20 77 68 65 72 65 20 72 69 67 68 74 20 6f 70  r where right op
1a10: 65 72 61 6e 64 20 69 73 20 73 74 6f 72 65 64 20  erand is stored 
1a20: 2a 2f 0a 20 20 69 6e 74 20 2a 70 46 72 65 65 52  */.  int *pFreeR
1a30: 69 67 68 74 20 20 20 2f 2a 20 57 72 69 74 65 20  ight   /* Write 
1a40: 74 65 6d 70 20 72 65 67 69 73 74 65 72 20 66 6f  temp register fo
1a50: 72 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20  r right operand 
1a60: 74 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 77 68  there */.){.  wh
1a70: 69 6c 65 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d  ile( pLeft->op==
1a80: 54 4b 5f 55 50 4c 55 53 20 29 20 70 4c 65 66 74  TK_UPLUS ) pLeft
1a90: 20 3d 20 70 4c 65 66 74 2d 3e 70 4c 65 66 74 3b   = pLeft->pLeft;
1aa0: 0a 20 20 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20  .  pLeft->flags 
1ab0: 7c 3d 20 45 50 5f 41 6e 79 41 66 66 3b 0a 20 20  |= EP_AnyAff;.  
1ac0: 2a 70 52 65 67 4c 65 66 74 20 3d 20 73 71 6c 69  *pRegLeft = sqli
1ad0: 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
1ae0: 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 70  pParse, pLeft, p
1af0: 46 72 65 65 4c 65 66 74 29 3b 0a 20 20 77 68 69  FreeLeft);.  whi
1b00: 6c 65 28 20 70 52 69 67 68 74 2d 3e 6f 70 3d 3d  le( pRight->op==
1b10: 54 4b 5f 55 50 4c 55 53 20 29 20 70 52 69 67 68  TK_UPLUS ) pRigh
1b20: 74 20 3d 20 70 52 69 67 68 74 2d 3e 70 4c 65 66  t = pRight->pLef
1b30: 74 3b 0a 20 20 70 52 69 67 68 74 2d 3e 66 6c 61  t;.  pRight->fla
1b40: 67 73 20 7c 3d 20 45 50 5f 41 6e 79 41 66 66 3b  gs |= EP_AnyAff;
1b50: 0a 20 20 2a 70 52 65 67 52 69 67 68 74 20 3d 20  .  *pRegRight = 
1b60: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
1b70: 65 6d 70 28 70 50 61 72 73 65 2c 20 70 52 69 67  emp(pParse, pRig
1b80: 68 74 2c 20 70 46 72 65 65 52 69 67 68 74 29 3b  ht, pFreeRight);
1b90: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
1ba0: 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20 63 6f  te code for a co
1bb0: 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f  mparison operato
1bc0: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
1bd0: 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 0a 20 20   codeCompare(.  
1be0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
1bf0: 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67    /* The parsing
1c00: 20 28 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72   (and code gener
1c10: 61 74 69 6e 67 29 20 63 6f 6e 74 65 78 74 20 2a  ating) context *
1c20: 2f 0a 20 20 45 78 70 72 20 2a 70 4c 65 66 74 2c  /.  Expr *pLeft,
1c30: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 65 66        /* The lef
1c40: 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 45  t operand */.  E
1c50: 78 70 72 20 2a 70 52 69 67 68 74 2c 20 20 20 20  xpr *pRight,    
1c60: 20 2f 2a 20 54 68 65 20 72 69 67 68 74 20 6f 70   /* The right op
1c70: 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  erand */.  int o
1c80: 70 63 6f 64 65 2c 20 20 20 20 20 20 20 2f 2a 20  pcode,       /* 
1c90: 54 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f  The comparison o
1ca0: 70 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69  pcode */.  int i
1cb0: 6e 31 2c 20 69 6e 74 20 69 6e 32 2c 20 2f 2a 20  n1, int in2, /* 
1cc0: 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67  Register holding
1cd0: 20 6f 70 65 72 61 6e 64 73 20 2a 2f 0a 20 20 69   operands */.  i
1ce0: 6e 74 20 64 65 73 74 2c 20 20 20 20 20 20 20 20  nt dest,        
1cf0: 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66   /* Jump here if
1d00: 20 74 72 75 65 2e 20 20 2a 2f 0a 20 20 69 6e 74   true.  */.  int
1d10: 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 20 20 20 2f   jumpIfNull    /
1d20: 2a 20 49 66 20 74 72 75 65 2c 20 6a 75 6d 70 20  * If true, jump 
1d30: 69 66 20 65 69 74 68 65 72 20 6f 70 65 72 61 6e  if either operan
1d40: 64 20 69 73 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a  d is NULL */.){.
1d50: 20 20 69 6e 74 20 70 35 3b 0a 20 20 69 6e 74 20    int p5;.  int 
1d60: 61 64 64 72 3b 0a 20 20 43 6f 6c 6c 53 65 71 20  addr;.  CollSeq 
1d70: 2a 70 34 3b 0a 0a 20 20 70 34 20 3d 20 73 71 6c  *p4;..  p4 = sql
1d80: 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72  ite3BinaryCompar
1d90: 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  eCollSeq(pParse,
1da0: 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 29 3b   pLeft, pRight);
1db0: 0a 20 20 70 35 20 3d 20 62 69 6e 61 72 79 43 6f  .  p5 = binaryCo
1dc0: 6d 70 61 72 65 50 35 28 70 4c 65 66 74 2c 20 70  mpareP5(pLeft, p
1dd0: 52 69 67 68 74 2c 20 6a 75 6d 70 49 66 4e 75 6c  Right, jumpIfNul
1de0: 6c 29 3b 0a 20 20 61 64 64 72 20 3d 20 73 71 6c  l);.  addr = sql
1df0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 70  ite3VdbeAddOp4(p
1e00: 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 6f 70  Parse->pVdbe, op
1e10: 63 6f 64 65 2c 20 69 6e 32 2c 20 64 65 73 74 2c  code, in2, dest,
1e20: 20 69 6e 31 2c 0a 20 20 20 20 20 20 20 20 20 20   in1,.          
1e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e40: 20 28 76 6f 69 64 2a 29 70 34 2c 20 50 34 5f 43   (void*)p4, P4_C
1e50: 4f 4c 4c 53 45 51 29 3b 0a 20 20 73 71 6c 69 74  OLLSEQ);.  sqlit
1e60: 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 70  e3VdbeChangeP5(p
1e70: 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 70 35  Parse->pVdbe, p5
1e80: 29 3b 0a 20 20 69 66 28 20 70 35 20 26 20 53 51  );.  if( p5 & SQ
1e90: 4c 49 54 45 5f 41 46 46 5f 4d 41 53 4b 20 29 7b  LITE_AFF_MASK ){
1ea0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
1eb0: 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61  CacheAffinityCha
1ec0: 6e 67 65 28 70 50 61 72 73 65 2c 20 69 6e 31 2c  nge(pParse, in1,
1ed0: 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   1);.    sqlite3
1ee0: 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74  ExprCacheAffinit
1ef0: 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20  yChange(pParse, 
1f00: 69 6e 32 2c 20 31 29 3b 0a 20 20 7d 0a 20 20 72  in2, 1);.  }.  r
1f10: 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f  eturn addr;.}../
1f20: 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20 61  *.** Construct a
1f30: 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20   new expression 
1f40: 6e 6f 64 65 20 61 6e 64 20 72 65 74 75 72 6e 20  node and return 
1f50: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69 74 2e  a pointer to it.
1f60: 20 20 4d 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72 20    Memory.** for 
1f70: 74 68 69 73 20 6e 6f 64 65 20 69 73 20 6f 62 74  this node is obt
1f80: 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
1f90: 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 20 20 54 68  e3_malloc().  Th
1fa0: 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  e calling functi
1fb0: 6f 6e 0a 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73  on.** is respons
1fc0: 69 62 6c 65 20 66 6f 72 20 6d 61 6b 69 6e 67 20  ible for making 
1fd0: 73 75 72 65 20 74 68 65 20 6e 6f 64 65 20 65 76  sure the node ev
1fe0: 65 6e 74 75 61 6c 6c 79 20 67 65 74 73 20 66 72  entually gets fr
1ff0: 65 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71  eed..*/.Expr *sq
2000: 6c 69 74 65 33 45 78 70 72 28 0a 20 20 73 71 6c  lite3Expr(.  sql
2010: 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
2020: 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 66       /* Handle f
2030: 6f 72 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c  or sqlite3DbMall
2040: 6f 63 5a 65 72 6f 28 29 20 28 6d 61 79 20 62 65  ocZero() (may be
2050: 20 6e 75 6c 6c 29 20 2a 2f 0a 20 20 69 6e 74 20   null) */.  int 
2060: 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  op,             
2070: 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
2080: 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 45 78  n opcode */.  Ex
2090: 70 72 20 2a 70 4c 65 66 74 2c 20 20 20 20 20 20  pr *pLeft,      
20a0: 20 20 20 20 20 20 2f 2a 20 4c 65 66 74 20 6f 70        /* Left op
20b0: 65 72 61 6e 64 20 2a 2f 0a 20 20 45 78 70 72 20  erand */.  Expr 
20c0: 2a 70 52 69 67 68 74 2c 20 20 20 20 20 20 20 20  *pRight,        
20d0: 20 20 20 2f 2a 20 52 69 67 68 74 20 6f 70 65 72     /* Right oper
20e0: 61 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 54  and */.  const T
20f0: 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 20 20 20 20  oken *pToken    
2100: 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f 6b   /* Argument tok
2110: 65 6e 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20  en */.){.  Expr 
2120: 2a 70 4e 65 77 3b 0a 20 20 73 74 61 74 69 63 20  *pNew;.  static 
2130: 63 6f 6e 73 74 20 45 78 70 72 20 7a 65 72 6f 45  const Expr zeroE
2140: 78 70 72 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71  xpr;.  pNew = sq
2150: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
2160: 28 64 62 2c 20 73 69 7a 65 6f 66 28 45 78 70 72  (db, sizeof(Expr
2170: 29 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d  ));.  if( pNew==
2180: 30 20 29 7b 0a 20 20 20 20 2f 2a 20 57 68 65 6e  0 ){.    /* When
2190: 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 2c 20 64   malloc fails, d
21a0: 65 6c 65 74 65 20 70 4c 65 66 74 20 61 6e 64 20  elete pLeft and 
21b0: 70 52 69 67 68 74 2e 20 45 78 70 72 65 73 73 69  pRight. Expressi
21c0: 6f 6e 73 20 70 61 73 73 65 64 20 74 6f 20 0a 20  ons passed to . 
21d0: 20 20 20 2a 2a 20 74 68 69 73 20 66 75 6e 63 74     ** this funct
21e0: 69 6f 6e 20 6d 75 73 74 20 61 6c 77 61 79 73 20  ion must always 
21f0: 62 65 20 61 6c 6c 6f 63 61 74 65 64 20 77 69 74  be allocated wit
2200: 68 20 73 71 6c 69 74 65 33 45 78 70 72 28 29 20  h sqlite3Expr() 
2210: 66 6f 72 20 74 68 69 73 20 0a 20 20 20 20 2a 2a  for this .    **
2220: 20 72 65 61 73 6f 6e 2e 20 0a 20 20 20 20 2a 2f   reason. .    */
2230: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
2240: 44 65 6c 65 74 65 28 70 4c 65 66 74 29 3b 0a 20  Delete(pLeft);. 
2250: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
2260: 6c 65 74 65 28 70 52 69 67 68 74 29 3b 0a 20 20  lete(pRight);.  
2270: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
2280: 20 20 2a 70 4e 65 77 20 3d 20 7a 65 72 6f 45 78    *pNew = zeroEx
2290: 70 72 3b 0a 20 20 70 4e 65 77 2d 3e 6f 70 20 3d  pr;.  pNew->op =
22a0: 20 6f 70 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 65   op;.  pNew->pLe
22b0: 66 74 20 3d 20 70 4c 65 66 74 3b 0a 20 20 70 4e  ft = pLeft;.  pN
22c0: 65 77 2d 3e 70 52 69 67 68 74 20 3d 20 70 52 69  ew->pRight = pRi
22d0: 67 68 74 3b 0a 20 20 70 4e 65 77 2d 3e 69 41 67  ght;.  pNew->iAg
22e0: 67 20 3d 20 2d 31 3b 0a 20 20 69 66 28 20 70 54  g = -1;.  if( pT
22f0: 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 61 73 73 65  oken ){.    asse
2300: 72 74 28 20 70 54 6f 6b 65 6e 2d 3e 64 79 6e 3d  rt( pToken->dyn=
2310: 3d 30 20 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  =0 );.    pNew->
2320: 73 70 61 6e 20 3d 20 70 4e 65 77 2d 3e 74 6f 6b  span = pNew->tok
2330: 65 6e 20 3d 20 2a 70 54 6f 6b 65 6e 3b 0a 20 20  en = *pToken;.  
2340: 7d 65 6c 73 65 20 69 66 28 20 70 4c 65 66 74 20  }else if( pLeft 
2350: 29 7b 0a 20 20 20 20 69 66 28 20 70 52 69 67 68  ){.    if( pRigh
2360: 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  t ){.      sqlit
2370: 65 33 45 78 70 72 53 70 61 6e 28 70 4e 65 77 2c  e3ExprSpan(pNew,
2380: 20 26 70 4c 65 66 74 2d 3e 73 70 61 6e 2c 20 26   &pLeft->span, &
2390: 70 52 69 67 68 74 2d 3e 73 70 61 6e 29 3b 0a 20  pRight->span);. 
23a0: 20 20 20 20 20 69 66 28 20 70 52 69 67 68 74 2d       if( pRight-
23b0: 3e 66 6c 61 67 73 20 26 20 45 50 5f 45 78 70 43  >flags & EP_ExpC
23c0: 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 20 20  ollate ){.      
23d0: 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d    pNew->flags |=
23e0: 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 3b 0a   EP_ExpCollate;.
23f0: 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 43          pNew->pC
2400: 6f 6c 6c 20 3d 20 70 52 69 67 68 74 2d 3e 70 43  oll = pRight->pC
2410: 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  oll;.      }.   
2420: 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 65 66 74   }.    if( pLeft
2430: 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 45 78 70  ->flags & EP_Exp
2440: 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 20  Collate ){.     
2450: 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20   pNew->flags |= 
2460: 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 3b 0a 20  EP_ExpCollate;. 
2470: 20 20 20 20 20 70 4e 65 77 2d 3e 70 43 6f 6c 6c       pNew->pColl
2480: 20 3d 20 70 4c 65 66 74 2d 3e 70 43 6f 6c 6c 3b   = pLeft->pColl;
2490: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 71  .    }.  }..  sq
24a0: 6c 69 74 65 33 45 78 70 72 53 65 74 48 65 69 67  lite3ExprSetHeig
24b0: 68 74 28 70 4e 65 77 29 3b 0a 20 20 72 65 74 75  ht(pNew);.  retu
24c0: 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pNew;.}../*.*
24d0: 2a 20 57 6f 72 6b 73 20 6c 69 6b 65 20 73 71 6c  * Works like sql
24e0: 69 74 65 33 45 78 70 72 28 29 20 65 78 63 65 70  ite3Expr() excep
24f0: 74 20 74 68 61 74 20 69 74 20 74 61 6b 65 73 20  t that it takes 
2500: 61 6e 20 65 78 74 72 61 20 50 61 72 73 65 2a 0a  an extra Parse*.
2510: 2a 2a 20 61 72 67 75 6d 65 6e 74 20 61 6e 64 20  ** argument and 
2520: 6e 6f 74 69 66 69 65 73 20 74 68 65 20 61 73 73  notifies the ass
2530: 6f 63 69 61 74 65 64 20 63 6f 6e 6e 65 63 74 69  ociated connecti
2540: 6f 6e 20 6f 62 6a 65 63 74 20 69 66 20 6d 61 6c  on object if mal
2550: 6c 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a 45 78  loc fails..*/.Ex
2560: 70 72 20 2a 73 71 6c 69 74 65 33 50 45 78 70 72  pr *sqlite3PExpr
2570: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
2580: 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  e,          /* P
2590: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
25a0: 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20  /.  int op,     
25b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
25c0: 78 70 72 65 73 73 69 6f 6e 20 6f 70 63 6f 64 65  xpression opcode
25d0: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c 65 66   */.  Expr *pLef
25e0: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t,            /*
25f0: 20 4c 65 66 74 20 6f 70 65 72 61 6e 64 20 2a 2f   Left operand */
2600: 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 2c  .  Expr *pRight,
2610: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 69             /* Ri
2620: 67 68 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20  ght operand */. 
2630: 20 63 6f 6e 73 74 20 54 6f 6b 65 6e 20 2a 70 54   const Token *pT
2640: 6f 6b 65 6e 20 20 20 20 20 2f 2a 20 41 72 67 75  oken     /* Argu
2650: 6d 65 6e 74 20 74 6f 6b 65 6e 20 2a 2f 0a 29 7b  ment token */.){
2660: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
2670: 33 45 78 70 72 28 70 50 61 72 73 65 2d 3e 64 62  3Expr(pParse->db
2680: 2c 20 6f 70 2c 20 70 4c 65 66 74 2c 20 70 52 69  , op, pLeft, pRi
2690: 67 68 74 2c 20 70 54 6f 6b 65 6e 29 3b 0a 7d 0a  ght, pToken);.}.
26a0: 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 64 6f 69 6e  ./*.** When doin
26b0: 67 20 61 20 6e 65 73 74 65 64 20 70 61 72 73 65  g a nested parse
26c0: 2c 20 79 6f 75 20 63 61 6e 20 69 6e 63 6c 75 64  , you can includ
26d0: 65 20 74 65 72 6d 73 20 69 6e 20 61 6e 20 65 78  e terms in an ex
26e0: 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 74 68 61 74  pression.** that
26f0: 20 6c 6f 6f 6b 20 6c 69 6b 65 20 74 68 69 73 3a   look like this:
2700: 20 20 20 23 31 20 23 32 20 2e 2e 2e 20 20 54 68     #1 #2 ...  Th
2710: 65 73 65 20 74 65 72 6d 73 20 72 65 66 65 72 20  ese terms refer 
2720: 74 6f 20 72 65 67 69 73 74 65 72 73 0a 2a 2a 20  to registers.** 
2730: 69 6e 20 74 68 65 20 76 69 72 74 75 61 6c 20 6d  in the virtual m
2740: 61 63 68 69 6e 65 2e 20 20 23 4e 20 69 73 20 74  achine.  #N is t
2750: 68 65 20 4e 2d 74 68 20 72 65 67 69 73 74 65 72  he N-th register
2760: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
2770: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62  tine is called b
2780: 79 20 74 68 65 20 70 61 72 73 65 72 20 74 6f 20  y the parser to 
2790: 64 65 61 6c 20 77 69 74 68 20 6f 6e 20 6f 66 20  deal with on of 
27a0: 74 68 6f 73 65 20 74 65 72 6d 73 2e 0a 2a 2a 20  those terms..** 
27b0: 49 74 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 67  It immediately g
27c0: 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20 74 6f  enerates code to
27d0: 20 73 74 6f 72 65 20 74 68 65 20 76 61 6c 75 65   store the value
27e0: 20 69 6e 20 61 20 6d 65 6d 6f 72 79 20 6c 6f 63   in a memory loc
27f0: 61 74 69 6f 6e 2e 0a 2a 2a 20 54 68 65 20 72 65  ation..** The re
2800: 74 75 72 6e 73 20 61 6e 20 65 78 70 72 65 73 73  turns an express
2810: 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20 63 6f  ion that will co
2820: 64 65 20 74 6f 20 65 78 74 72 61 63 74 20 74 68  de to extract th
2830: 65 20 76 61 6c 75 65 20 66 72 6f 6d 0a 2a 2a 20  e value from.** 
2840: 74 68 61 74 20 6d 65 6d 6f 72 79 20 6c 6f 63 61  that memory loca
2850: 74 69 6f 6e 20 61 73 20 6e 65 65 64 65 64 2e 0a  tion as needed..
2860: 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33  */.Expr *sqlite3
2870: 52 65 67 69 73 74 65 72 45 78 70 72 28 50 61 72  RegisterExpr(Par
2880: 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65  se *pParse, Toke
2890: 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 56 64  n *pToken){.  Vd
28a0: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
28b0: 70 56 64 62 65 3b 0a 20 20 45 78 70 72 20 2a 70  pVdbe;.  Expr *p
28c0: 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
28d0: 6e 65 73 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20  nested==0 ){.   
28e0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
28f0: 28 70 50 61 72 73 65 2c 20 22 6e 65 61 72 20 5c  (pParse, "near \
2900: 22 25 54 5c 22 3a 20 73 79 6e 74 61 78 20 65 72  "%T\": syntax er
2910: 72 6f 72 22 2c 20 70 54 6f 6b 65 6e 29 3b 0a 20  ror", pToken);. 
2920: 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
2930: 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
2940: 4b 5f 4e 55 4c 4c 2c 20 30 2c 20 30 2c 20 30 29  K_NULL, 0, 0, 0)
2950: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 76 3d 3d 30  ;.  }.  if( v==0
2960: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
2970: 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28   = sqlite3PExpr(
2980: 70 50 61 72 73 65 2c 20 54 4b 5f 52 45 47 49 53  pParse, TK_REGIS
2990: 54 45 52 2c 20 30 2c 20 30 2c 20 70 54 6f 6b 65  TER, 0, 0, pToke
29a0: 6e 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29  n);.  if( p==0 )
29b0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20  {.    return 0; 
29c0: 20 2f 2a 20 4d 61 6c 6c 6f 63 20 66 61 69 6c 65   /* Malloc faile
29d0: 64 20 2a 2f 0a 20 20 7d 0a 20 20 70 2d 3e 69 54  d */.  }.  p->iT
29e0: 61 62 6c 65 20 3d 20 61 74 6f 69 28 28 63 68 61  able = atoi((cha
29f0: 72 2a 29 26 70 54 6f 6b 65 6e 2d 3e 7a 5b 31 5d  r*)&pToken->z[1]
2a00: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d  );.  return p;.}
2a10: 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 69 6e 20 74 77 6f  ../*.** Join two
2a20: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 75 73 69   expressions usi
2a30: 6e 67 20 61 6e 20 41 4e 44 20 6f 70 65 72 61 74  ng an AND operat
2a40: 6f 72 2e 20 20 49 66 20 65 69 74 68 65 72 20 65  or.  If either e
2a50: 78 70 72 65 73 73 69 6f 6e 20 69 73 0a 2a 2a 20  xpression is.** 
2a60: 4e 55 4c 4c 2c 20 74 68 65 6e 20 6a 75 73 74 20  NULL, then just 
2a70: 72 65 74 75 72 6e 20 74 68 65 20 6f 74 68 65 72  return the other
2a80: 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2f 0a   expression..*/.
2a90: 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70  Expr *sqlite3Exp
2aa0: 72 41 6e 64 28 73 71 6c 69 74 65 33 20 2a 64 62  rAnd(sqlite3 *db
2ab0: 2c 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 45  , Expr *pLeft, E
2ac0: 78 70 72 20 2a 70 52 69 67 68 74 29 7b 0a 20 20  xpr *pRight){.  
2ad0: 69 66 28 20 70 4c 65 66 74 3d 3d 30 20 29 7b 0a  if( pLeft==0 ){.
2ae0: 20 20 20 20 72 65 74 75 72 6e 20 70 52 69 67 68      return pRigh
2af0: 74 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  t;.  }else if( p
2b00: 52 69 67 68 74 3d 3d 30 20 29 7b 0a 20 20 20 20  Right==0 ){.    
2b10: 72 65 74 75 72 6e 20 70 4c 65 66 74 3b 0a 20 20  return pLeft;.  
2b20: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
2b30: 6e 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62  n sqlite3Expr(db
2b40: 2c 20 54 4b 5f 41 4e 44 2c 20 70 4c 65 66 74 2c  , TK_AND, pLeft,
2b50: 20 70 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 7d   pRight, 0);.  }
2b60: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
2b70: 65 20 45 78 70 72 2e 73 70 61 6e 20 66 69 65 6c  e Expr.span fiel
2b80: 64 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 65  d of the given e
2b90: 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 73 70 61  xpression to spa
2ba0: 6e 20 61 6c 6c 0a 2a 2a 20 74 65 78 74 20 62 65  n all.** text be
2bb0: 74 77 65 65 6e 20 74 68 65 20 74 77 6f 20 67 69  tween the two gi
2bc0: 76 65 6e 20 74 6f 6b 65 6e 73 2e 0a 2a 2f 0a 76  ven tokens..*/.v
2bd0: 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 53  oid sqlite3ExprS
2be0: 70 61 6e 28 45 78 70 72 20 2a 70 45 78 70 72 2c  pan(Expr *pExpr,
2bf0: 20 54 6f 6b 65 6e 20 2a 70 4c 65 66 74 2c 20 54   Token *pLeft, T
2c00: 6f 6b 65 6e 20 2a 70 52 69 67 68 74 29 7b 0a 20  oken *pRight){. 
2c10: 20 61 73 73 65 72 74 28 20 70 52 69 67 68 74 21   assert( pRight!
2c20: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
2c30: 70 4c 65 66 74 21 3d 30 20 29 3b 0a 20 20 69 66  pLeft!=0 );.  if
2c40: 28 20 70 45 78 70 72 20 26 26 20 70 52 69 67 68  ( pExpr && pRigh
2c50: 74 2d 3e 7a 20 26 26 20 70 4c 65 66 74 2d 3e 7a  t->z && pLeft->z
2c60: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
2c70: 70 4c 65 66 74 2d 3e 64 79 6e 3d 3d 30 20 7c 7c  pLeft->dyn==0 ||
2c80: 20 70 4c 65 66 74 2d 3e 7a 5b 70 4c 65 66 74 2d   pLeft->z[pLeft-
2c90: 3e 6e 5d 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66  >n]==0 );.    if
2ca0: 28 20 70 4c 65 66 74 2d 3e 64 79 6e 3d 3d 30 20  ( pLeft->dyn==0 
2cb0: 26 26 20 70 52 69 67 68 74 2d 3e 64 79 6e 3d 3d  && pRight->dyn==
2cc0: 30 20 29 7b 0a 20 20 20 20 20 20 70 45 78 70 72  0 ){.      pExpr
2cd0: 2d 3e 73 70 61 6e 2e 7a 20 3d 20 70 4c 65 66 74  ->span.z = pLeft
2ce0: 2d 3e 7a 3b 0a 20 20 20 20 20 20 70 45 78 70 72  ->z;.      pExpr
2cf0: 2d 3e 73 70 61 6e 2e 6e 20 3d 20 70 52 69 67 68  ->span.n = pRigh
2d00: 74 2d 3e 6e 20 2b 20 28 70 52 69 67 68 74 2d 3e  t->n + (pRight->
2d10: 7a 20 2d 20 70 4c 65 66 74 2d 3e 7a 29 3b 0a 20  z - pLeft->z);. 
2d20: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2d30: 70 45 78 70 72 2d 3e 73 70 61 6e 2e 7a 20 3d 20  pExpr->span.z = 
2d40: 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  0;.    }.  }.}..
2d50: 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20  /*.** Construct 
2d60: 61 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e  a new expression
2d70: 20 6e 6f 64 65 20 66 6f 72 20 61 20 66 75 6e 63   node for a func
2d80: 74 69 6f 6e 20 77 69 74 68 20 6d 75 6c 74 69 70  tion with multip
2d90: 6c 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 73 2e  le.** arguments.
2da0: 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65  .*/.Expr *sqlite
2db0: 33 45 78 70 72 46 75 6e 63 74 69 6f 6e 28 50 61  3ExprFunction(Pa
2dc0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
2dd0: 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f  rList *pList, To
2de0: 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20  ken *pToken){.  
2df0: 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 61 73  Expr *pNew;.  as
2e00: 73 65 72 74 28 20 70 54 6f 6b 65 6e 20 29 3b 0a  sert( pToken );.
2e10: 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
2e20: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 50 61  DbMallocZero(pPa
2e30: 72 73 65 2d 3e 64 62 2c 20 73 69 7a 65 6f 66 28  rse->db, sizeof(
2e40: 45 78 70 72 29 20 29 3b 0a 20 20 69 66 28 20 70  Expr) );.  if( p
2e50: 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  New==0 ){.    sq
2e60: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
2e70: 65 74 65 28 70 4c 69 73 74 29 3b 20 2f 2a 20 41  ete(pList); /* A
2e80: 76 6f 69 64 20 6c 65 61 6b 69 6e 67 20 6d 65 6d  void leaking mem
2e90: 6f 72 79 20 77 68 65 6e 20 6d 61 6c 6c 6f 63 20  ory when malloc 
2ea0: 66 61 69 6c 73 20 2a 2f 0a 20 20 20 20 72 65 74  fails */.    ret
2eb0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4e 65  urn 0;.  }.  pNe
2ec0: 77 2d 3e 6f 70 20 3d 20 54 4b 5f 46 55 4e 43 54  w->op = TK_FUNCT
2ed0: 49 4f 4e 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69  ION;.  pNew->pLi
2ee0: 73 74 20 3d 20 70 4c 69 73 74 3b 0a 20 20 61 73  st = pList;.  as
2ef0: 73 65 72 74 28 20 70 54 6f 6b 65 6e 2d 3e 64 79  sert( pToken->dy
2f00: 6e 3d 3d 30 20 29 3b 0a 20 20 70 4e 65 77 2d 3e  n==0 );.  pNew->
2f10: 74 6f 6b 65 6e 20 3d 20 2a 70 54 6f 6b 65 6e 3b  token = *pToken;
2f20: 0a 20 20 70 4e 65 77 2d 3e 73 70 61 6e 20 3d 20  .  pNew->span = 
2f30: 70 4e 65 77 2d 3e 74 6f 6b 65 6e 3b 0a 0a 20 20  pNew->token;..  
2f40: 73 71 6c 69 74 65 33 45 78 70 72 53 65 74 48 65  sqlite3ExprSetHe
2f50: 69 67 68 74 28 70 4e 65 77 29 3b 0a 20 20 72 65  ight(pNew);.  re
2f60: 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a  turn pNew;.}../*
2f70: 0a 2a 2a 20 41 73 73 69 67 6e 20 61 20 76 61 72  .** Assign a var
2f80: 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 74 6f 20  iable number to 
2f90: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68  an expression th
2fa0: 61 74 20 65 6e 63 6f 64 65 73 20 61 20 77 69 6c  at encodes a wil
2fb0: 64 63 61 72 64 0a 2a 2a 20 69 6e 20 74 68 65 20  dcard.** in the 
2fc0: 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20 73 74 61  original SQL sta
2fd0: 74 65 6d 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20  tement.  .**.** 
2fe0: 57 69 6c 64 63 61 72 64 73 20 63 6f 6e 73 69 73  Wildcards consis
2ff0: 74 69 6e 67 20 6f 66 20 61 20 73 69 6e 67 6c 65  ting of a single
3000: 20 22 3f 22 20 61 72 65 20 61 73 73 69 67 6e 65   "?" are assigne
3010: 64 20 74 68 65 20 6e 65 78 74 20 73 65 71 75 65  d the next seque
3020: 6e 74 69 61 6c 0a 2a 2a 20 76 61 72 69 61 62 6c  ntial.** variabl
3030: 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20  e number..**.** 
3040: 57 69 6c 64 63 61 72 64 73 20 6f 66 20 74 68 65  Wildcards of the
3050: 20 66 6f 72 6d 20 22 3f 6e 6e 6e 22 20 61 72 65   form "?nnn" are
3060: 20 61 73 73 69 67 6e 65 64 20 74 68 65 20 6e 75   assigned the nu
3070: 6d 62 65 72 20 22 6e 6e 6e 22 2e 20 20 57 65 20  mber "nnn".  We 
3080: 6d 61 6b 65 0a 2a 2a 20 73 75 72 65 20 22 6e 6e  make.** sure "nn
3090: 6e 22 20 69 73 20 6e 6f 74 20 74 6f 6f 20 62 65  n" is not too be
30a0: 20 74 6f 20 61 76 6f 69 64 20 61 20 64 65 6e 69   to avoid a deni
30b0: 61 6c 20 6f 66 20 73 65 72 76 69 63 65 20 61 74  al of service at
30c0: 74 61 63 6b 20 77 68 65 6e 0a 2a 2a 20 74 68 65  tack when.** the
30d0: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 63   SQL statement c
30e0: 6f 6d 65 73 20 66 72 6f 6d 20 61 6e 20 65 78 74  omes from an ext
30f0: 65 72 6e 61 6c 20 73 6f 75 72 63 65 2e 0a 2a 2a  ernal source..**
3100: 0a 2a 2a 20 57 69 6c 64 63 61 72 64 73 20 6f 66  .** Wildcards of
3110: 20 74 68 65 20 66 6f 72 6d 20 22 3a 61 61 61 22   the form ":aaa"
3120: 20 6f 72 20 22 24 61 61 61 22 20 61 72 65 20 61   or "$aaa" are a
3130: 73 73 69 67 6e 65 64 20 74 68 65 20 73 61 6d 65  ssigned the same
3140: 20 6e 75 6d 62 65 72 0a 2a 2a 20 61 73 20 74 68   number.** as th
3150: 65 20 70 72 65 76 69 6f 75 73 20 69 6e 73 74 61  e previous insta
3160: 6e 63 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20  nce of the same 
3170: 77 69 6c 64 63 61 72 64 2e 20 20 4f 72 20 69 66  wildcard.  Or if
3180: 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72   this is the fir
3190: 73 74 0a 2a 2a 20 69 6e 73 74 61 6e 63 65 20 6f  st.** instance o
31a0: 66 20 74 68 65 20 77 69 6c 64 63 61 72 64 2c 20  f the wildcard, 
31b0: 74 68 65 20 6e 65 78 74 20 73 65 71 75 65 6e 69  the next sequeni
31c0: 61 6c 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62  al variable numb
31d0: 65 72 20 69 73 0a 2a 2a 20 61 73 73 69 67 6e 65  er is.** assigne
31e0: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
31f0: 65 33 45 78 70 72 41 73 73 69 67 6e 56 61 72 4e  e3ExprAssignVarN
3200: 75 6d 62 65 72 28 50 61 72 73 65 20 2a 70 50 61  umber(Parse *pPa
3210: 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
3220: 29 7b 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b  ){.  Token *pTok
3230: 65 6e 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  en;.  sqlite3 *d
3240: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
3250: 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20  .  if( pExpr==0 
3260: 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 54 6f 6b  ) return;.  pTok
3270: 65 6e 20 3d 20 26 70 45 78 70 72 2d 3e 74 6f 6b  en = &pExpr->tok
3280: 65 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54  en;.  assert( pT
3290: 6f 6b 65 6e 2d 3e 6e 3e 3d 31 20 29 3b 0a 20 20  oken->n>=1 );.  
32a0: 61 73 73 65 72 74 28 20 70 54 6f 6b 65 6e 2d 3e  assert( pToken->
32b0: 7a 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  z!=0 );.  assert
32c0: 28 20 70 54 6f 6b 65 6e 2d 3e 7a 5b 30 5d 21 3d  ( pToken->z[0]!=
32d0: 30 20 29 3b 0a 20 20 69 66 28 20 70 54 6f 6b 65  0 );.  if( pToke
32e0: 6e 2d 3e 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 2f  n->n==1 ){.    /
32f0: 2a 20 57 69 6c 64 63 61 72 64 20 6f 66 20 74 68  * Wildcard of th
3300: 65 20 66 6f 72 6d 20 22 3f 22 2e 20 20 41 73 73  e form "?".  Ass
3310: 69 67 6e 20 74 68 65 20 6e 65 78 74 20 76 61 72  ign the next var
3320: 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 2a 2f 0a  iable number */.
3330: 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c      pExpr->iTabl
3340: 65 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 56  e = ++pParse->nV
3350: 61 72 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ar;.  }else if( 
3360: 70 54 6f 6b 65 6e 2d 3e 7a 5b 30 5d 3d 3d 27 3f  pToken->z[0]=='?
3370: 27 20 29 7b 0a 20 20 20 20 2f 2a 20 57 69 6c 64  ' ){.    /* Wild
3380: 63 61 72 64 20 6f 66 20 74 68 65 20 66 6f 72 6d  card of the form
3390: 20 22 3f 6e 6e 6e 22 2e 20 20 43 6f 6e 76 65 72   "?nnn".  Conver
33a0: 74 20 22 6e 6e 6e 22 20 74 6f 20 61 6e 20 69 6e  t "nnn" to an in
33b0: 74 65 67 65 72 20 61 6e 64 0a 20 20 20 20 2a 2a  teger and.    **
33c0: 20 75 73 65 20 69 74 20 61 73 20 74 68 65 20 76   use it as the v
33d0: 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 2a  ariable number *
33e0: 2f 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  /.    int i;.   
33f0: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d   pExpr->iTable =
3400: 20 69 20 3d 20 61 74 6f 69 28 28 63 68 61 72 2a   i = atoi((char*
3410: 29 26 70 54 6f 6b 65 6e 2d 3e 7a 5b 31 5d 29 3b  )&pToken->z[1]);
3420: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69  .    testcase( i
3430: 3d 3d 30 20 29 3b 0a 20 20 20 20 74 65 73 74 63  ==0 );.    testc
3440: 61 73 65 28 20 69 3d 3d 31 20 29 3b 0a 20 20 20  ase( i==1 );.   
3450: 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d 64 62   testcase( i==db
3460: 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ->aLimit[SQLITE_
3470: 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e  LIMIT_VARIABLE_N
3480: 55 4d 42 45 52 5d 2d 31 20 29 3b 0a 20 20 20 20  UMBER]-1 );.    
3490: 74 65 73 74 63 61 73 65 28 20 69 3d 3d 64 62 2d  testcase( i==db-
34a0: 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  >aLimit[SQLITE_L
34b0: 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55  IMIT_VARIABLE_NU
34c0: 4d 42 45 52 5d 20 29 3b 0a 20 20 20 20 69 66 28  MBER] );.    if(
34d0: 20 69 3c 31 20 7c 7c 20 69 3e 64 62 2d 3e 61 4c   i<1 || i>db->aL
34e0: 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
34f0: 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45  T_VARIABLE_NUMBE
3500: 52 5d 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  R] ){.      sqli
3510: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
3520: 73 65 2c 20 22 76 61 72 69 61 62 6c 65 20 6e 75  se, "variable nu
3530: 6d 62 65 72 20 6d 75 73 74 20 62 65 20 62 65 74  mber must be bet
3540: 77 65 65 6e 20 3f 31 20 61 6e 64 20 3f 25 64 22  ween ?1 and ?%d"
3550: 2c 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e  ,.          db->
3560: 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
3570: 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d  MIT_VARIABLE_NUM
3580: 42 45 52 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20  BER]);.    }.   
3590: 20 69 66 28 20 69 3e 70 50 61 72 73 65 2d 3e 6e   if( i>pParse->n
35a0: 56 61 72 20 29 7b 0a 20 20 20 20 20 20 70 50 61  Var ){.      pPa
35b0: 72 73 65 2d 3e 6e 56 61 72 20 3d 20 69 3b 0a 20  rse->nVar = i;. 
35c0: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
35d0: 20 20 2f 2a 20 57 69 6c 64 63 61 72 64 73 20 6f    /* Wildcards o
35e0: 66 20 74 68 65 20 66 6f 72 6d 20 22 3a 61 61 61  f the form ":aaa
35f0: 22 20 6f 72 20 22 24 61 61 61 22 2e 20 20 52 65  " or "$aaa".  Re
3600: 75 73 65 20 74 68 65 20 73 61 6d 65 20 76 61 72  use the same var
3610: 69 61 62 6c 65 0a 20 20 20 20 2a 2a 20 6e 75 6d  iable.    ** num
3620: 62 65 72 20 61 73 20 74 68 65 20 70 72 69 6f 72  ber as the prior
3630: 20 61 70 70 65 61 72 61 6e 63 65 20 6f 66 20 74   appearance of t
3640: 68 65 20 73 61 6d 65 20 6e 61 6d 65 2c 20 6f 72  he same name, or
3650: 20 69 66 20 74 68 65 20 6e 61 6d 65 0a 20 20 20   if the name.   
3660: 20 2a 2a 20 68 61 73 20 6e 65 76 65 72 20 61 70   ** has never ap
3670: 70 65 61 72 65 64 20 62 65 66 6f 72 65 2c 20 72  peared before, r
3680: 65 75 73 65 20 74 68 65 20 73 61 6d 65 20 76 61  euse the same va
3690: 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 0a 20 20  riable number.  
36a0: 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 2c 20    */.    int i, 
36b0: 6e 3b 0a 20 20 20 20 6e 20 3d 20 70 54 6f 6b 65  n;.    n = pToke
36c0: 6e 2d 3e 6e 3b 0a 20 20 20 20 66 6f 72 28 69 3d  n->n;.    for(i=
36d0: 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 56 61  0; i<pParse->nVa
36e0: 72 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  rExpr; i++){.   
36f0: 20 20 20 45 78 70 72 20 2a 70 45 3b 0a 20 20 20     Expr *pE;.   
3700: 20 20 20 69 66 28 20 28 70 45 20 3d 20 70 50 61     if( (pE = pPa
3710: 72 73 65 2d 3e 61 70 56 61 72 45 78 70 72 5b 69  rse->apVarExpr[i
3720: 5d 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20  ])!=0.          
3730: 26 26 20 70 45 2d 3e 74 6f 6b 65 6e 2e 6e 3d 3d  && pE->token.n==
3740: 6e 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 6d  n.          && m
3750: 65 6d 63 6d 70 28 70 45 2d 3e 74 6f 6b 65 6e 2e  emcmp(pE->token.
3760: 7a 2c 20 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 6e 29  z, pToken->z, n)
3770: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
3780: 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70  Expr->iTable = p
3790: 45 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20  E->iTable;.     
37a0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
37b0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
37c0: 69 3e 3d 70 50 61 72 73 65 2d 3e 6e 56 61 72 45  i>=pParse->nVarE
37d0: 78 70 72 20 29 7b 0a 20 20 20 20 20 20 70 45 78  xpr ){.      pEx
37e0: 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 2b 2b 70  pr->iTable = ++p
37f0: 50 61 72 73 65 2d 3e 6e 56 61 72 3b 0a 20 20 20  Parse->nVar;.   
3800: 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e     if( pParse->n
3810: 56 61 72 45 78 70 72 3e 3d 70 50 61 72 73 65 2d  VarExpr>=pParse-
3820: 3e 6e 56 61 72 45 78 70 72 41 6c 6c 6f 63 2d 31  >nVarExprAlloc-1
3830: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 72   ){.        pPar
3840: 73 65 2d 3e 6e 56 61 72 45 78 70 72 41 6c 6c 6f  se->nVarExprAllo
3850: 63 20 2b 3d 20 70 50 61 72 73 65 2d 3e 6e 56 61  c += pParse->nVa
3860: 72 45 78 70 72 41 6c 6c 6f 63 20 2b 20 31 30 3b  rExprAlloc + 10;
3870: 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d  .        pParse-
3880: 3e 61 70 56 61 72 45 78 70 72 20 3d 0a 20 20 20  >apVarExpr =.   
3890: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
38a0: 44 62 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28  DbReallocOrFree(
38b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64  .              d
38c0: 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  b,.             
38d0: 20 70 50 61 72 73 65 2d 3e 61 70 56 61 72 45 78   pParse->apVarEx
38e0: 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  pr,.            
38f0: 20 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 45 78    pParse->nVarEx
3900: 70 72 41 6c 6c 6f 63 2a 73 69 7a 65 6f 66 28 70  prAlloc*sizeof(p
3910: 50 61 72 73 65 2d 3e 61 70 56 61 72 45 78 70 72  Parse->apVarExpr
3920: 5b 30 5d 29 0a 20 20 20 20 20 20 20 20 20 20 20  [0]).           
3930: 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
3940: 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f    if( !db->mallo
3950: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20  cFailed ){.     
3960: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73     assert( pPars
3970: 65 2d 3e 61 70 56 61 72 45 78 70 72 21 3d 30 20  e->apVarExpr!=0 
3980: 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  );.        pPars
3990: 65 2d 3e 61 70 56 61 72 45 78 70 72 5b 70 50 61  e->apVarExpr[pPa
39a0: 72 73 65 2d 3e 6e 56 61 72 45 78 70 72 2b 2b 5d  rse->nVarExpr++]
39b0: 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20   = pExpr;.      
39c0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 20 0a 20 20 69  }.    }.  } .  i
39d0: 66 28 20 21 70 50 61 72 73 65 2d 3e 6e 45 72 72  f( !pParse->nErr
39e0: 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 56 61 72   && pParse->nVar
39f0: 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49  >db->aLimit[SQLI
3a00: 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c  TE_LIMIT_VARIABL
3a10: 45 5f 4e 55 4d 42 45 52 5d 20 29 7b 0a 20 20 20  E_NUMBER] ){.   
3a20: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
3a30: 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61  (pParse, "too ma
3a40: 6e 79 20 53 51 4c 20 76 61 72 69 61 62 6c 65 73  ny SQL variables
3a50: 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ");.  }.}../*.**
3a60: 20 52 65 63 75 72 73 69 76 65 6c 79 20 64 65 6c   Recursively del
3a70: 65 74 65 20 61 6e 20 65 78 70 72 65 73 73 69 6f  ete an expressio
3a80: 6e 20 74 72 65 65 2e 0a 2a 2f 0a 76 6f 69 64 20  n tree..*/.void 
3a90: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
3aa0: 65 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66  e(Expr *p){.  if
3ab0: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( p==0 ) return;
3ac0: 0a 20 20 69 66 28 20 70 2d 3e 73 70 61 6e 2e 64  .  if( p->span.d
3ad0: 79 6e 20 29 20 73 71 6c 69 74 65 33 5f 66 72 65  yn ) sqlite3_fre
3ae0: 65 28 28 63 68 61 72 2a 29 70 2d 3e 73 70 61 6e  e((char*)p->span
3af0: 2e 7a 29 3b 0a 20 20 69 66 28 20 70 2d 3e 74 6f  .z);.  if( p->to
3b00: 6b 65 6e 2e 64 79 6e 20 29 20 73 71 6c 69 74 65  ken.dyn ) sqlite
3b10: 33 5f 66 72 65 65 28 28 63 68 61 72 2a 29 70 2d  3_free((char*)p-
3b20: 3e 74 6f 6b 65 6e 2e 7a 29 3b 0a 20 20 73 71 6c  >token.z);.  sql
3b30: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70  ite3ExprDelete(p
3b40: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 73 71 6c 69  ->pLeft);.  sqli
3b50: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 2d  te3ExprDelete(p-
3b60: 3e 70 52 69 67 68 74 29 3b 0a 20 20 73 71 6c 69  >pRight);.  sqli
3b70: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
3b80: 65 28 70 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 73  e(p->pList);.  s
3b90: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
3ba0: 74 65 28 70 2d 3e 70 53 65 6c 65 63 74 29 3b 0a  te(p->pSelect);.
3bb0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
3bc0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  );.}../*.** The 
3bd0: 45 78 70 72 2e 74 6f 6b 65 6e 20 66 69 65 6c 64  Expr.token field
3be0: 20 6d 69 67 68 74 20 62 65 20 61 20 73 74 72 69   might be a stri
3bf0: 6e 67 20 6c 69 74 65 72 61 6c 20 74 68 61 74 20  ng literal that 
3c00: 69 73 20 71 75 6f 74 65 64 2e 0a 2a 2a 20 49 66  is quoted..** If
3c10: 20 73 6f 2c 20 72 65 6d 6f 76 65 20 74 68 65 20   so, remove the 
3c20: 71 75 6f 74 61 74 69 6f 6e 20 6d 61 72 6b 73 2e  quotation marks.
3c30: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
3c40: 44 65 71 75 6f 74 65 45 78 70 72 28 73 71 6c 69  DequoteExpr(sqli
3c50: 74 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70  te3 *db, Expr *p
3c60: 29 7b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73  ){.  if( ExprHas
3c70: 41 6e 79 50 72 6f 70 65 72 74 79 28 70 2c 20 45  AnyProperty(p, E
3c80: 50 5f 44 65 71 75 6f 74 65 64 29 20 29 7b 0a 20  P_Dequoted) ){. 
3c90: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
3ca0: 20 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79   ExprSetProperty
3cb0: 28 70 2c 20 45 50 5f 44 65 71 75 6f 74 65 64 29  (p, EP_Dequoted)
3cc0: 3b 0a 20 20 69 66 28 20 70 2d 3e 74 6f 6b 65 6e  ;.  if( p->token
3cd0: 2e 64 79 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 73  .dyn==0 ){.    s
3ce0: 71 6c 69 74 65 33 54 6f 6b 65 6e 43 6f 70 79 28  qlite3TokenCopy(
3cf0: 64 62 2c 20 26 70 2d 3e 74 6f 6b 65 6e 2c 20 26  db, &p->token, &
3d00: 70 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 7d 0a 20  p->token);.  }. 
3d10: 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28   sqlite3Dequote(
3d20: 28 63 68 61 72 2a 29 70 2d 3e 74 6f 6b 65 6e 2e  (char*)p->token.
3d30: 7a 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  z);.}.../*.** Th
3d40: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 72 6f 75  e following grou
3d50: 70 20 6f 66 20 72 6f 75 74 69 6e 65 73 20 6d 61  p of routines ma
3d60: 6b 65 20 64 65 65 70 20 63 6f 70 69 65 73 20 6f  ke deep copies o
3d70: 66 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 0a 2a  f expressions,.*
3d80: 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  * expression lis
3d90: 74 73 2c 20 49 44 20 6c 69 73 74 73 2c 20 61 6e  ts, ID lists, an
3da0: 64 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65  d select stateme
3db0: 6e 74 73 2e 20 20 54 68 65 20 63 6f 70 69 65 73  nts.  The copies
3dc0: 20 63 61 6e 0a 2a 2a 20 62 65 20 64 65 6c 65 74   can.** be delet
3dd0: 65 64 20 28 62 79 20 62 65 69 6e 67 20 70 61 73  ed (by being pas
3de0: 73 65 64 20 74 6f 20 74 68 65 69 72 20 72 65 73  sed to their res
3df0: 70 65 63 74 69 76 65 20 2e 2e 2e 44 65 6c 65 74  pective ...Delet
3e00: 65 28 29 20 72 6f 75 74 69 6e 65 73 29 0a 2a 2a  e() routines).**
3e10: 20 77 69 74 68 6f 75 74 20 65 66 66 65 63 74 69   without effecti
3e20: 6e 67 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 73  ng the originals
3e30: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 78 70 72  ..**.** The expr
3e40: 65 73 73 69 6f 6e 20 6c 69 73 74 2c 20 49 44 2c  ession list, ID,
3e50: 20 61 6e 64 20 73 6f 75 72 63 65 20 6c 69 73 74   and source list
3e60: 73 20 72 65 74 75 72 6e 20 62 79 20 73 71 6c 69  s return by sqli
3e70: 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 29  te3ExprListDup()
3e80: 2c 0a 2a 2a 20 73 71 6c 69 74 65 33 49 64 4c 69  ,.** sqlite3IdLi
3e90: 73 74 44 75 70 28 29 2c 20 61 6e 64 20 73 71 6c  stDup(), and sql
3ea0: 69 74 65 33 53 72 63 4c 69 73 74 44 75 70 28 29  ite3SrcListDup()
3eb0: 20 63 61 6e 20 6e 6f 74 20 62 65 20 66 75 72 74   can not be furt
3ec0: 68 65 72 20 65 78 70 61 6e 64 65 64 20 0a 2a 2a  her expanded .**
3ed0: 20 62 79 20 73 75 62 73 65 71 75 65 6e 74 20 63   by subsequent c
3ee0: 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 2a 4c  alls to sqlite*L
3ef0: 69 73 74 41 70 70 65 6e 64 28 29 20 72 6f 75 74  istAppend() rout
3f00: 69 6e 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20  ines..**.** Any 
3f10: 74 61 62 6c 65 73 20 74 68 61 74 20 74 68 65 20  tables that the 
3f20: 53 72 63 4c 69 73 74 20 6d 69 67 68 74 20 70 6f  SrcList might po
3f30: 69 6e 74 20 74 6f 20 61 72 65 20 6e 6f 74 20 64  int to are not d
3f40: 75 70 6c 69 63 61 74 65 64 2e 0a 2a 2f 0a 45 78  uplicated..*/.Ex
3f50: 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 44  pr *sqlite3ExprD
3f60: 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  up(sqlite3 *db, 
3f70: 45 78 70 72 20 2a 70 29 7b 0a 20 20 45 78 70 72  Expr *p){.  Expr
3f80: 20 2a 70 4e 65 77 3b 0a 20 20 69 66 28 20 70 3d   *pNew;.  if( p=
3f90: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
3fa0: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44   pNew = sqlite3D
3fb0: 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73  bMallocRaw(db, s
3fc0: 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69  izeof(*p) );.  i
3fd0: 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74  f( pNew==0 ) ret
3fe0: 75 72 6e 20 30 3b 0a 20 20 6d 65 6d 63 70 79 28  urn 0;.  memcpy(
3ff0: 70 4e 65 77 2c 20 70 2c 20 73 69 7a 65 6f 66 28  pNew, p, sizeof(
4000: 2a 70 4e 65 77 29 29 3b 0a 20 20 69 66 28 20 70  *pNew));.  if( p
4010: 2d 3e 74 6f 6b 65 6e 2e 7a 21 3d 30 20 29 7b 0a  ->token.z!=0 ){.
4020: 20 20 20 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e 2e      pNew->token.
4030: 7a 20 3d 20 28 75 38 2a 29 73 71 6c 69 74 65 33  z = (u8*)sqlite3
4040: 44 62 53 74 72 4e 44 75 70 28 64 62 2c 20 28 63  DbStrNDup(db, (c
4050: 68 61 72 2a 29 70 2d 3e 74 6f 6b 65 6e 2e 7a 2c  har*)p->token.z,
4060: 20 70 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a 20 20   p->token.n);.  
4070: 20 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e 2e 64 79    pNew->token.dy
4080: 6e 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  n = 1;.  }else{.
4090: 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77      assert( pNew
40a0: 2d 3e 74 6f 6b 65 6e 2e 7a 3d 3d 30 20 29 3b 0a  ->token.z==0 );.
40b0: 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 73 70 61 6e    }.  pNew->span
40c0: 2e 7a 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  .z = 0;.  pNew->
40d0: 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45  pLeft = sqlite3E
40e0: 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 4c  xprDup(db, p->pL
40f0: 65 66 74 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 52  eft);.  pNew->pR
4100: 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78  ight = sqlite3Ex
4110: 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 52 69  prDup(db, p->pRi
4120: 67 68 74 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c  ght);.  pNew->pL
4130: 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ist = sqlite3Exp
4140: 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e  rListDup(db, p->
4150: 70 4c 69 73 74 29 3b 0a 20 20 70 4e 65 77 2d 3e  pList);.  pNew->
4160: 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65  pSelect = sqlite
4170: 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70  3SelectDup(db, p
4180: 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 72 65  ->pSelect);.  re
4190: 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 76 6f 69  turn pNew;.}.voi
41a0: 64 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e 43 6f  d sqlite3TokenCo
41b0: 70 79 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  py(sqlite3 *db, 
41c0: 54 6f 6b 65 6e 20 2a 70 54 6f 2c 20 54 6f 6b 65  Token *pTo, Toke
41d0: 6e 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 69 66 28  n *pFrom){.  if(
41e0: 20 70 54 6f 2d 3e 64 79 6e 20 29 20 73 71 6c 69   pTo->dyn ) sqli
41f0: 74 65 33 5f 66 72 65 65 28 28 63 68 61 72 2a 29  te3_free((char*)
4200: 70 54 6f 2d 3e 7a 29 3b 0a 20 20 69 66 28 20 70  pTo->z);.  if( p
4210: 46 72 6f 6d 2d 3e 7a 20 29 7b 0a 20 20 20 20 70  From->z ){.    p
4220: 54 6f 2d 3e 6e 20 3d 20 70 46 72 6f 6d 2d 3e 6e  To->n = pFrom->n
4230: 3b 0a 20 20 20 20 70 54 6f 2d 3e 7a 20 3d 20 28  ;.    pTo->z = (
4240: 75 38 2a 29 73 71 6c 69 74 65 33 44 62 53 74 72  u8*)sqlite3DbStr
4250: 4e 44 75 70 28 64 62 2c 20 28 63 68 61 72 2a 29  NDup(db, (char*)
4260: 70 46 72 6f 6d 2d 3e 7a 2c 20 70 46 72 6f 6d 2d  pFrom->z, pFrom-
4270: 3e 6e 29 3b 0a 20 20 20 20 70 54 6f 2d 3e 64 79  >n);.    pTo->dy
4280: 6e 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  n = 1;.  }else{.
4290: 20 20 20 20 70 54 6f 2d 3e 7a 20 3d 20 30 3b 0a      pTo->z = 0;.
42a0: 20 20 7d 0a 7d 0a 45 78 70 72 4c 69 73 74 20 2a    }.}.ExprList *
42b0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
42c0: 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  up(sqlite3 *db, 
42d0: 45 78 70 72 4c 69 73 74 20 2a 70 29 7b 0a 20 20  ExprList *p){.  
42e0: 45 78 70 72 4c 69 73 74 20 2a 70 4e 65 77 3b 0a  ExprList *pNew;.
42f0: 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
4300: 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 2c 20 2a  t_item *pItem, *
4310: 70 4f 6c 64 49 74 65 6d 3b 0a 20 20 69 6e 74 20  pOldItem;.  int 
4320: 69 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  i;.  if( p==0 ) 
4330: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77  return 0;.  pNew
4340: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
4350: 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66  ocRaw(db, sizeof
4360: 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20 69 66 28  (*pNew) );.  if(
4370: 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72   pNew==0 ) retur
4380: 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 69 45 43  n 0;.  pNew->iEC
4390: 75 72 73 6f 72 20 3d 20 30 3b 0a 20 20 70 4e 65  ursor = 0;.  pNe
43a0: 77 2d 3e 6e 45 78 70 72 20 3d 20 70 4e 65 77 2d  w->nExpr = pNew-
43b0: 3e 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 45 78  >nAlloc = p->nEx
43c0: 70 72 3b 0a 20 20 70 4e 65 77 2d 3e 61 20 3d 20  pr;.  pNew->a = 
43d0: 70 49 74 65 6d 20 3d 20 73 71 6c 69 74 65 33 44  pItem = sqlite3D
43e0: 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 20  bMallocRaw(db,  
43f0: 70 2d 3e 6e 45 78 70 72 2a 73 69 7a 65 6f 66 28  p->nExpr*sizeof(
4400: 70 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 69 66  p->a[0]) );.  if
4410: 28 20 70 49 74 65 6d 3d 3d 30 20 29 7b 0a 20 20  ( pItem==0 ){.  
4420: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
4430: 4e 65 77 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  New);.    return
4440: 20 30 3b 0a 20 20 7d 20 0a 20 20 70 4f 6c 64 49   0;.  } .  pOldI
4450: 74 65 6d 20 3d 20 70 2d 3e 61 3b 0a 20 20 66 6f  tem = p->a;.  fo
4460: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 45 78 70  r(i=0; i<p->nExp
4470: 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 2c  r; i++, pItem++,
4480: 20 70 4f 6c 64 49 74 65 6d 2b 2b 29 7b 0a 20 20   pOldItem++){.  
4490: 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72    Expr *pNewExpr
44a0: 2c 20 2a 70 4f 6c 64 45 78 70 72 3b 0a 20 20 20  , *pOldExpr;.   
44b0: 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 20 3d 20   pItem->pExpr = 
44c0: 70 4e 65 77 45 78 70 72 20 3d 20 73 71 6c 69 74  pNewExpr = sqlit
44d0: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4f  e3ExprDup(db, pO
44e0: 6c 64 45 78 70 72 20 3d 20 70 4f 6c 64 49 74 65  ldExpr = pOldIte
44f0: 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 69  m->pExpr);.    i
4500: 66 28 20 70 4f 6c 64 45 78 70 72 2d 3e 73 70 61  f( pOldExpr->spa
4510: 6e 2e 7a 21 3d 30 20 26 26 20 70 4e 65 77 45 78  n.z!=0 && pNewEx
4520: 70 72 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41  pr ){.      /* A
4530: 6c 77 61 79 73 20 6d 61 6b 65 20 61 20 63 6f 70  lways make a cop
4540: 79 20 6f 66 20 74 68 65 20 73 70 61 6e 20 66 6f  y of the span fo
4550: 72 20 74 6f 70 2d 6c 65 76 65 6c 20 65 78 70 72  r top-level expr
4560: 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 0a 20  essions in the. 
4570: 20 20 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69       ** expressi
4580: 6f 6e 20 6c 69 73 74 2e 20 20 54 68 65 20 6c 6f  on list.  The lo
4590: 67 69 63 20 69 6e 20 53 45 4c 45 43 54 20 70 72  gic in SELECT pr
45a0: 6f 63 65 73 73 69 6e 67 20 74 68 61 74 20 64 65  ocessing that de
45b0: 74 65 72 6d 69 6e 65 73 0a 20 20 20 20 20 20 2a  termines.      *
45c0: 2a 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 63  * the names of c
45d0: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65  olumns in the re
45e0: 73 75 6c 74 20 73 65 74 20 6e 65 65 64 73 20 74  sult set needs t
45f0: 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  his information 
4600: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
4610: 54 6f 6b 65 6e 43 6f 70 79 28 64 62 2c 20 26 70  TokenCopy(db, &p
4620: 4e 65 77 45 78 70 72 2d 3e 73 70 61 6e 2c 20 26  NewExpr->span, &
4630: 70 4f 6c 64 45 78 70 72 2d 3e 73 70 61 6e 29 3b  pOldExpr->span);
4640: 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
4650: 74 28 20 70 4e 65 77 45 78 70 72 3d 3d 30 20 7c  t( pNewExpr==0 |
4660: 7c 20 70 4e 65 77 45 78 70 72 2d 3e 73 70 61 6e  | pNewExpr->span
4670: 2e 7a 21 3d 30 20 0a 20 20 20 20 20 20 20 20 20  .z!=0 .         
4680: 20 20 20 7c 7c 20 70 4f 6c 64 45 78 70 72 2d 3e     || pOldExpr->
4690: 73 70 61 6e 2e 7a 3d 3d 30 0a 20 20 20 20 20 20  span.z==0.      
46a0: 20 20 20 20 20 20 7c 7c 20 64 62 2d 3e 6d 61 6c        || db->mal
46b0: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20  locFailed );.   
46c0: 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20   pItem->zName = 
46d0: 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
46e0: 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e  db, pOldItem->zN
46f0: 61 6d 65 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d  ame);.    pItem-
4700: 3e 73 6f 72 74 4f 72 64 65 72 20 3d 20 70 4f 6c  >sortOrder = pOl
4710: 64 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72  dItem->sortOrder
4720: 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 69 73 41  ;.    pItem->isA
4730: 67 67 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69  gg = pOldItem->i
4740: 73 41 67 67 3b 0a 20 20 20 20 70 49 74 65 6d 2d  sAgg;.    pItem-
4750: 3e 64 6f 6e 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  >done = 0;.  }. 
4760: 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a   return pNew;.}.
4770: 0a 2f 2a 0a 2a 2a 20 49 66 20 63 75 72 73 6f 72  ./*.** If cursor
4780: 73 2c 20 74 72 69 67 67 65 72 73 2c 20 76 69 65  s, triggers, vie
4790: 77 73 20 61 6e 64 20 73 75 62 71 75 65 72 69 65  ws and subquerie
47a0: 73 20 61 72 65 20 61 6c 6c 20 6f 6d 69 74 74 65  s are all omitte
47b0: 64 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 62 75  d from.** the bu
47c0: 69 6c 64 2c 20 74 68 65 6e 20 6e 6f 6e 65 20 6f  ild, then none o
47d0: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
47e0: 72 6f 75 74 69 6e 65 73 2c 20 65 78 63 65 70 74  routines, except
47f0: 20 66 6f 72 20 0a 2a 2a 20 73 71 6c 69 74 65 33   for .** sqlite3
4800: 53 65 6c 65 63 74 44 75 70 28 29 2c 20 63 61 6e  SelectDup(), can
4810: 20 62 65 20 63 61 6c 6c 65 64 2e 20 73 71 6c 69   be called. sqli
4820: 74 65 33 53 65 6c 65 63 74 44 75 70 28 29 20 69  te3SelectDup() i
4830: 73 20 73 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20 63  s sometimes.** c
4840: 61 6c 6c 65 64 20 77 69 74 68 20 61 20 4e 55 4c  alled with a NUL
4850: 4c 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 23  L argument..*/.#
4860: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
4870: 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c  TE_OMIT_VIEW) ||
4880: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
4890: 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 29 20 5c  _OMIT_TRIGGER) \
48a0: 0a 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  . || !defined(SQ
48b0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
48c0: 52 59 29 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c  RY).SrcList *sql
48d0: 69 74 65 33 53 72 63 4c 69 73 74 44 75 70 28 73  ite3SrcListDup(s
48e0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 72 63 4c  qlite3 *db, SrcL
48f0: 69 73 74 20 2a 70 29 7b 0a 20 20 53 72 63 4c 69  ist *p){.  SrcLi
4900: 73 74 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20  st *pNew;.  int 
4910: 69 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a  i;.  int nByte;.
4920: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
4930: 75 72 6e 20 30 3b 0a 20 20 6e 42 79 74 65 20 3d  urn 0;.  nByte =
4940: 20 73 69 7a 65 6f 66 28 2a 70 29 20 2b 20 28 70   sizeof(*p) + (p
4950: 2d 3e 6e 53 72 63 3e 30 20 3f 20 73 69 7a 65 6f  ->nSrc>0 ? sizeo
4960: 66 28 70 2d 3e 61 5b 30 5d 29 20 2a 20 28 70 2d  f(p->a[0]) * (p-
4970: 3e 6e 53 72 63 2d 31 29 20 3a 20 30 29 3b 0a 20  >nSrc-1) : 0);. 
4980: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44   pNew = sqlite3D
4990: 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 6e  bMallocRaw(db, n
49a0: 42 79 74 65 20 29 3b 0a 20 20 69 66 28 20 70 4e  Byte );.  if( pN
49b0: 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ew==0 ) return 0
49c0: 3b 0a 20 20 70 4e 65 77 2d 3e 6e 53 72 63 20 3d  ;.  pNew->nSrc =
49d0: 20 70 4e 65 77 2d 3e 6e 41 6c 6c 6f 63 20 3d 20   pNew->nAlloc = 
49e0: 70 2d 3e 6e 53 72 63 3b 0a 20 20 66 6f 72 28 69  p->nSrc;.  for(i
49f0: 3d 30 3b 20 69 3c 70 2d 3e 6e 53 72 63 3b 20 69  =0; i<p->nSrc; i
4a00: 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  ++){.    struct 
4a10: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4e  SrcList_item *pN
4a20: 65 77 49 74 65 6d 20 3d 20 26 70 4e 65 77 2d 3e  ewItem = &pNew->
4a30: 61 5b 69 5d 3b 0a 20 20 20 20 73 74 72 75 63 74  a[i];.    struct
4a40: 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
4a50: 4f 6c 64 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b  OldItem = &p->a[
4a60: 69 5d 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  i];.    Table *p
4a70: 54 61 62 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  Tab;.    pNewIte
4a80: 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d 20 73  m->zDatabase = s
4a90: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
4aa0: 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 44 61  b, pOldItem->zDa
4ab0: 74 61 62 61 73 65 29 3b 0a 20 20 20 20 70 4e 65  tabase);.    pNe
4ac0: 77 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73  wItem->zName = s
4ad0: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
4ae0: 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61  b, pOldItem->zNa
4af0: 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  me);.    pNewIte
4b00: 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 73 71 6c 69  m->zAlias = sqli
4b10: 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
4b20: 70 4f 6c 64 49 74 65 6d 2d 3e 7a 41 6c 69 61 73  pOldItem->zAlias
4b30: 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  );.    pNewItem-
4b40: 3e 6a 6f 69 6e 74 79 70 65 20 3d 20 70 4f 6c 64  >jointype = pOld
4b50: 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 3b 0a  Item->jointype;.
4b60: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 69 43      pNewItem->iC
4b70: 75 72 73 6f 72 20 3d 20 70 4f 6c 64 49 74 65 6d  ursor = pOldItem
4b80: 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 70  ->iCursor;.    p
4b90: 4e 65 77 49 74 65 6d 2d 3e 69 73 50 6f 70 75 6c  NewItem->isPopul
4ba0: 61 74 65 64 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  ated = pOldItem-
4bb0: 3e 69 73 50 6f 70 75 6c 61 74 65 64 3b 0a 20 20  >isPopulated;.  
4bc0: 20 20 70 54 61 62 20 3d 20 70 4e 65 77 49 74 65    pTab = pNewIte
4bd0: 6d 2d 3e 70 54 61 62 20 3d 20 70 4f 6c 64 49 74  m->pTab = pOldIt
4be0: 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69 66  em->pTab;.    if
4bf0: 28 20 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20  ( pTab ){.      
4c00: 70 54 61 62 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20  pTab->nRef++;.  
4c10: 20 20 7d 0a 20 20 20 20 70 4e 65 77 49 74 65 6d    }.    pNewItem
4c20: 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69  ->pSelect = sqli
4c30: 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c  te3SelectDup(db,
4c40: 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 53 65 6c 65   pOldItem->pSele
4c50: 63 74 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  ct);.    pNewIte
4c60: 6d 2d 3e 70 4f 6e 20 3d 20 73 71 6c 69 74 65 33  m->pOn = sqlite3
4c70: 45 78 70 72 44 75 70 28 64 62 2c 20 70 4f 6c 64  ExprDup(db, pOld
4c80: 49 74 65 6d 2d 3e 70 4f 6e 29 3b 0a 20 20 20 20  Item->pOn);.    
4c90: 70 4e 65 77 49 74 65 6d 2d 3e 70 55 73 69 6e 67  pNewItem->pUsing
4ca0: 20 3d 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74   = sqlite3IdList
4cb0: 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d  Dup(db, pOldItem
4cc0: 2d 3e 70 55 73 69 6e 67 29 3b 0a 20 20 20 20 70  ->pUsing);.    p
4cd0: 4e 65 77 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64  NewItem->colUsed
4ce0: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 63 6f 6c   = pOldItem->col
4cf0: 55 73 65 64 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Used;.  }.  retu
4d00: 72 6e 20 70 4e 65 77 3b 0a 7d 0a 49 64 4c 69 73  rn pNew;.}.IdLis
4d10: 74 20 2a 73 71 6c 69 74 65 33 49 64 4c 69 73 74  t *sqlite3IdList
4d20: 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  Dup(sqlite3 *db,
4d30: 20 49 64 4c 69 73 74 20 2a 70 29 7b 0a 20 20 49   IdList *p){.  I
4d40: 64 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 69  dList *pNew;.  i
4d50: 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 3d 3d 30  nt i;.  if( p==0
4d60: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
4d70: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  New = sqlite3DbM
4d80: 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a  allocRaw(db, siz
4d90: 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20  eof(*pNew) );.  
4da0: 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65  if( pNew==0 ) re
4db0: 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  turn 0;.  pNew->
4dc0: 6e 49 64 20 3d 20 70 4e 65 77 2d 3e 6e 41 6c 6c  nId = pNew->nAll
4dd0: 6f 63 20 3d 20 70 2d 3e 6e 49 64 3b 0a 20 20 70  oc = p->nId;.  p
4de0: 4e 65 77 2d 3e 61 20 3d 20 73 71 6c 69 74 65 33  New->a = sqlite3
4df0: 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20  DbMallocRaw(db, 
4e00: 70 2d 3e 6e 49 64 2a 73 69 7a 65 6f 66 28 70 2d  p->nId*sizeof(p-
4e10: 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20  >a[0]) );.  if( 
4e20: 70 4e 65 77 2d 3e 61 3d 3d 30 20 29 7b 0a 20 20  pNew->a==0 ){.  
4e30: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
4e40: 4e 65 77 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  New);.    return
4e50: 20 30 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d   0;.  }.  for(i=
4e60: 30 3b 20 69 3c 70 2d 3e 6e 49 64 3b 20 69 2b 2b  0; i<p->nId; i++
4e70: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 49 64  ){.    struct Id
4e80: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4e 65 77 49  List_item *pNewI
4e90: 74 65 6d 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 69  tem = &pNew->a[i
4ea0: 5d 3b 0a 20 20 20 20 73 74 72 75 63 74 20 49 64  ];.    struct Id
4eb0: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4f 6c 64 49  List_item *pOldI
4ec0: 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a  tem = &p->a[i];.
4ed0: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e      pNewItem->zN
4ee0: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ame = sqlite3DbS
4ef0: 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74  trDup(db, pOldIt
4f00: 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  em->zName);.    
4f10: 70 4e 65 77 49 74 65 6d 2d 3e 69 64 78 20 3d 20  pNewItem->idx = 
4f20: 70 4f 6c 64 49 74 65 6d 2d 3e 69 64 78 3b 0a 20  pOldItem->idx;. 
4f30: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77   }.  return pNew
4f40: 3b 0a 7d 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69  ;.}.Select *sqli
4f50: 74 65 33 53 65 6c 65 63 74 44 75 70 28 73 71 6c  te3SelectDup(sql
4f60: 69 74 65 33 20 2a 64 62 2c 20 53 65 6c 65 63 74  ite3 *db, Select
4f70: 20 2a 70 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a   *p){.  Select *
4f80: 70 4e 65 77 3b 0a 20 20 69 66 28 20 70 3d 3d 30  pNew;.  if( p==0
4f90: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
4fa0: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  New = sqlite3DbM
4fb0: 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a  allocRaw(db, siz
4fc0: 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69 66 28  eof(*p) );.  if(
4fd0: 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72   pNew==0 ) retur
4fe0: 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 69 73 44  n 0;.  pNew->isD
4ff0: 69 73 74 69 6e 63 74 20 3d 20 70 2d 3e 69 73 44  istinct = p->isD
5000: 69 73 74 69 6e 63 74 3b 0a 20 20 70 4e 65 77 2d  istinct;.  pNew-
5010: 3e 70 45 4c 69 73 74 20 3d 20 73 71 6c 69 74 65  >pEList = sqlite
5020: 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c  3ExprListDup(db,
5030: 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 70   p->pEList);.  p
5040: 4e 65 77 2d 3e 70 53 72 63 20 3d 20 73 71 6c 69  New->pSrc = sqli
5050: 74 65 33 53 72 63 4c 69 73 74 44 75 70 28 64 62  te3SrcListDup(db
5060: 2c 20 70 2d 3e 70 53 72 63 29 3b 0a 20 20 70 4e  , p->pSrc);.  pN
5070: 65 77 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c  ew->pWhere = sql
5080: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
5090: 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 70 4e  p->pWhere);.  pN
50a0: 65 77 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73  ew->pGroupBy = s
50b0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
50c0: 70 28 64 62 2c 20 70 2d 3e 70 47 72 6f 75 70 42  p(db, p->pGroupB
50d0: 79 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 48 61 76  y);.  pNew->pHav
50e0: 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ing = sqlite3Exp
50f0: 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 48 61 76  rDup(db, p->pHav
5100: 69 6e 67 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f  ing);.  pNew->pO
5110: 72 64 65 72 42 79 20 3d 20 73 71 6c 69 74 65 33  rderBy = sqlite3
5120: 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20  ExprListDup(db, 
5130: 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20  p->pOrderBy);.  
5140: 70 4e 65 77 2d 3e 6f 70 20 3d 20 70 2d 3e 6f 70  pNew->op = p->op
5150: 3b 0a 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72  ;.  pNew->pPrior
5160: 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
5170: 44 75 70 28 64 62 2c 20 70 2d 3e 70 50 72 69 6f  Dup(db, p->pPrio
5180: 72 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69 6d  r);.  pNew->pLim
5190: 69 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  it = sqlite3Expr
51a0: 44 75 70 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69  Dup(db, p->pLimi
51b0: 74 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 66 66  t);.  pNew->pOff
51c0: 73 65 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  set = sqlite3Exp
51d0: 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 4f 66 66  rDup(db, p->pOff
51e0: 73 65 74 29 3b 0a 20 20 70 4e 65 77 2d 3e 69 4c  set);.  pNew->iL
51f0: 69 6d 69 74 20 3d 20 2d 31 3b 0a 20 20 70 4e 65  imit = -1;.  pNe
5200: 77 2d 3e 69 4f 66 66 73 65 74 20 3d 20 2d 31 3b  w->iOffset = -1;
5210: 0a 20 20 70 4e 65 77 2d 3e 69 73 52 65 73 6f 6c  .  pNew->isResol
5220: 76 65 64 20 3d 20 70 2d 3e 69 73 52 65 73 6f 6c  ved = p->isResol
5230: 76 65 64 3b 0a 20 20 70 4e 65 77 2d 3e 69 73 41  ved;.  pNew->isA
5240: 67 67 20 3d 20 70 2d 3e 69 73 41 67 67 3b 0a 20  gg = p->isAgg;. 
5250: 20 70 4e 65 77 2d 3e 75 73 65 73 45 70 68 6d 20   pNew->usesEphm 
5260: 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 64 69 73  = 0;.  pNew->dis
5270: 61 6c 6c 6f 77 4f 72 64 65 72 42 79 20 3d 20 30  allowOrderBy = 0
5280: 3b 0a 20 20 70 4e 65 77 2d 3e 70 52 69 67 68 74  ;.  pNew->pRight
5290: 6d 6f 73 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77  most = 0;.  pNew
52a0: 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30  ->addrOpenEphm[0
52b0: 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e  ] = -1;.  pNew->
52c0: 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20  addrOpenEphm[1] 
52d0: 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 61 64  = -1;.  pNew->ad
52e0: 64 72 4f 70 65 6e 45 70 68 6d 5b 32 5d 20 3d 20  drOpenEphm[2] = 
52f0: 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65  -1;.  return pNe
5300: 77 3b 0a 7d 0a 23 65 6c 73 65 0a 53 65 6c 65 63  w;.}.#else.Selec
5310: 74 20 2a 73 71 6c 69 74 65 33 53 65 6c 65 63 74  t *sqlite3Select
5320: 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  Dup(sqlite3 *db,
5330: 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 61   Select *p){.  a
5340: 73 73 65 72 74 28 20 70 3d 3d 30 20 29 3b 0a 20  ssert( p==0 );. 
5350: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e   return 0;.}.#en
5360: 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  dif.../*.** Add 
5370: 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f  a new element to
5380: 20 74 68 65 20 65 6e 64 20 6f 66 20 61 6e 20 65   the end of an e
5390: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20  xpression list. 
53a0: 20 49 66 20 70 4c 69 73 74 20 69 73 0a 2a 2a 20   If pList is.** 
53b0: 69 6e 69 74 69 61 6c 6c 79 20 4e 55 4c 4c 2c 20  initially NULL, 
53c0: 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 6e 65  then create a ne
53d0: 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  w expression lis
53e0: 74 2e 0a 2a 2f 0a 45 78 70 72 4c 69 73 74 20 2a  t..*/.ExprList *
53f0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
5400: 70 70 65 6e 64 28 0a 20 20 50 61 72 73 65 20 2a  ppend(.  Parse *
5410: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
5420: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
5430: 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ext */.  ExprLis
5440: 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20  t *pList,       
5450: 20 2f 2a 20 4c 69 73 74 20 74 6f 20 77 68 69 63   /* List to whic
5460: 68 20 74 6f 20 61 70 70 65 6e 64 2e 20 4d 69 67  h to append. Mig
5470: 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ht be NULL */.  
5480: 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20  Expr *pExpr,    
5490: 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65          /* Expre
54a0: 73 73 69 6f 6e 20 74 6f 20 62 65 20 61 70 70 65  ssion to be appe
54b0: 6e 64 65 64 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  nded */.  Token 
54c0: 2a 70 4e 61 6d 65 20 20 20 20 20 20 20 20 20 20  *pName          
54d0: 20 20 2f 2a 20 41 53 20 6b 65 79 77 6f 72 64 20    /* AS keyword 
54e0: 66 6f 72 20 74 68 65 20 65 78 70 72 65 73 73 69  for the expressi
54f0: 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  on */.){.  sqlit
5500: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
5510: 3e 64 62 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  >db;.  if( pList
5520: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74  ==0 ){.    pList
5530: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
5540: 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f  ocZero(db, sizeo
5550: 66 28 45 78 70 72 4c 69 73 74 29 20 29 3b 0a 20  f(ExprList) );. 
5560: 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20     if( pList==0 
5570: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6e 6f  ){.      goto no
5580: 5f 6d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _mem;.    }.    
5590: 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e  assert( pList->n
55a0: 41 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 20 20 7d 0a  Alloc==0 );.  }.
55b0: 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e 41 6c    if( pList->nAl
55c0: 6c 6f 63 3c 3d 70 4c 69 73 74 2d 3e 6e 45 78 70  loc<=pList->nExp
55d0: 72 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  r ){.    struct 
55e0: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61  ExprList_item *a
55f0: 3b 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 4c  ;.    int n = pL
5600: 69 73 74 2d 3e 6e 41 6c 6c 6f 63 2a 32 20 2b 20  ist->nAlloc*2 + 
5610: 34 3b 0a 20 20 20 20 61 20 3d 20 73 71 6c 69 74  4;.    a = sqlit
5620: 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20  e3DbRealloc(db, 
5630: 70 4c 69 73 74 2d 3e 61 2c 20 6e 2a 73 69 7a 65  pList->a, n*size
5640: 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29  of(pList->a[0]))
5650: 3b 0a 20 20 20 20 69 66 28 20 61 3d 3d 30 20 29  ;.    if( a==0 )
5660: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6e 6f 5f  {.      goto no_
5670: 6d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  mem;.    }.    p
5680: 4c 69 73 74 2d 3e 61 20 3d 20 61 3b 0a 20 20 20  List->a = a;.   
5690: 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d   pList->nAlloc =
56a0: 20 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74   n;.  }.  assert
56b0: 28 20 70 4c 69 73 74 2d 3e 61 21 3d 30 20 29 3b  ( pList->a!=0 );
56c0: 0a 20 20 69 66 28 20 70 45 78 70 72 20 7c 7c 20  .  if( pExpr || 
56d0: 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20 73 74 72  pName ){.    str
56e0: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
56f0: 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 4c 69 73  m *pItem = &pLis
5700: 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45 78 70  t->a[pList->nExp
5710: 72 2b 2b 5d 3b 0a 20 20 20 20 6d 65 6d 73 65 74  r++];.    memset
5720: 28 70 49 74 65 6d 2c 20 30 2c 20 73 69 7a 65 6f  (pItem, 0, sizeo
5730: 66 28 2a 70 49 74 65 6d 29 29 3b 0a 20 20 20 20  f(*pItem));.    
5740: 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73  pItem->zName = s
5750: 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
5760: 6b 65 6e 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a  ken(db, pName);.
5770: 20 20 20 20 70 49 74 65 6d 2d 3e 70 45 78 70 72      pItem->pExpr
5780: 20 3d 20 70 45 78 70 72 3b 0a 20 20 7d 0a 20 20   = pExpr;.  }.  
5790: 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 0a 6e  return pList;..n
57a0: 6f 5f 6d 65 6d 3a 20 20 20 20 20 0a 20 20 2f 2a  o_mem:     .  /*
57b0: 20 41 76 6f 69 64 20 6c 65 61 6b 69 6e 67 20 6d   Avoid leaking m
57c0: 65 6d 6f 72 79 20 69 66 20 6d 61 6c 6c 6f 63 20  emory if malloc 
57d0: 68 61 73 20 66 61 69 6c 65 64 2e 20 2a 2f 0a 20  has failed. */. 
57e0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
57f0: 74 65 28 70 45 78 70 72 29 3b 0a 20 20 73 71 6c  te(pExpr);.  sql
5800: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
5810: 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 72 65 74  te(pList);.  ret
5820: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
5830: 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  If the expressio
5840: 6e 20 6c 69 73 74 20 70 45 4c 69 73 74 20 63 6f  n list pEList co
5850: 6e 74 61 69 6e 73 20 6d 6f 72 65 20 74 68 61 6e  ntains more than
5860: 20 69 4c 69 6d 69 74 20 65 6c 65 6d 65 6e 74 73   iLimit elements
5870: 2c 0a 2a 2a 20 6c 65 61 76 65 20 61 6e 20 65 72  ,.** leave an er
5880: 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70  ror message in p
5890: 50 61 72 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73  Parse..*/.void s
58a0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43 68  qlite3ExprListCh
58b0: 65 63 6b 4c 65 6e 67 74 68 28 0a 20 20 50 61 72  eckLength(.  Par
58c0: 73 65 20 2a 70 50 61 72 73 65 2c 0a 20 20 45 78  se *pParse,.  Ex
58d0: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 0a  prList *pEList,.
58e0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f    const char *zO
58f0: 62 6a 65 63 74 0a 29 7b 0a 20 20 69 6e 74 20 6d  bject.){.  int m
5900: 78 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  x = pParse->db->
5910: 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
5920: 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 3b 0a 20 20 74  MIT_COLUMN];.  t
5930: 65 73 74 63 61 73 65 28 20 70 45 4c 69 73 74 20  estcase( pEList 
5940: 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  && pEList->nExpr
5950: 3d 3d 6d 78 20 29 3b 0a 20 20 74 65 73 74 63 61  ==mx );.  testca
5960: 73 65 28 20 70 45 4c 69 73 74 20 26 26 20 70 45  se( pEList && pE
5970: 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 6d 78 2b  List->nExpr==mx+
5980: 31 20 29 3b 0a 20 20 69 66 28 20 70 45 4c 69 73  1 );.  if( pELis
5990: 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78  t && pEList->nEx
59a0: 70 72 3e 6d 78 20 29 7b 0a 20 20 20 20 73 71 6c  pr>mx ){.    sql
59b0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
59c0: 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 63  rse, "too many c
59d0: 6f 6c 75 6d 6e 73 20 69 6e 20 25 73 22 2c 20 7a  olumns in %s", z
59e0: 4f 62 6a 65 63 74 29 3b 0a 20 20 7d 0a 7d 0a 0a  Object);.  }.}..
59f0: 0a 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  ./* The followin
5a00: 67 20 74 68 72 65 65 20 66 75 6e 63 74 69 6f 6e  g three function
5a10: 73 2c 20 68 65 69 67 68 74 4f 66 45 78 70 72 28  s, heightOfExpr(
5a20: 29 2c 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c  ), heightOfExprL
5a30: 69 73 74 28 29 0a 2a 2a 20 61 6e 64 20 68 65 69  ist().** and hei
5a40: 67 68 74 4f 66 53 65 6c 65 63 74 28 29 2c 20 61  ghtOfSelect(), a
5a50: 72 65 20 75 73 65 64 20 74 6f 20 64 65 74 65 72  re used to deter
5a60: 6d 69 6e 65 20 74 68 65 20 6d 61 78 69 6d 75 6d  mine the maximum
5a70: 20 68 65 69 67 68 74 0a 2a 2a 20 6f 66 20 61 6e   height.** of an
5a80: 79 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  y expression tre
5a90: 65 20 72 65 66 65 72 65 6e 63 65 64 20 62 79 20  e referenced by 
5aa0: 74 68 65 20 73 74 72 75 63 74 75 72 65 20 70 61  the structure pa
5ab0: 73 73 65 64 20 61 73 20 74 68 65 0a 2a 2a 20 66  ssed as the.** f
5ac0: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  irst argument..*
5ad0: 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 6d 61 78  *.** If this max
5ae0: 69 6d 75 6d 20 68 65 69 67 68 74 20 69 73 20 67  imum height is g
5af0: 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20  reater than the 
5b00: 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 70 6f  current value po
5b10: 69 6e 74 65 64 0a 2a 2a 20 74 6f 20 62 79 20 70  inted.** to by p
5b20: 6e 48 65 69 67 68 74 2c 20 74 68 65 20 73 65 63  nHeight, the sec
5b30: 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 2c 20 74  ond parameter, t
5b40: 68 65 6e 20 73 65 74 20 2a 70 6e 48 65 69 67 68  hen set *pnHeigh
5b50: 74 20 74 6f 20 74 68 61 74 0a 2a 2a 20 76 61 6c  t to that.** val
5b60: 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ue..*/.static vo
5b70: 69 64 20 68 65 69 67 68 74 4f 66 45 78 70 72 28  id heightOfExpr(
5b80: 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 2a 70 6e  Expr *p, int *pn
5b90: 48 65 69 67 68 74 29 7b 0a 20 20 69 66 28 20 70  Height){.  if( p
5ba0: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e   ){.    if( p->n
5bb0: 48 65 69 67 68 74 3e 2a 70 6e 48 65 69 67 68 74  Height>*pnHeight
5bc0: 20 29 7b 0a 20 20 20 20 20 20 2a 70 6e 48 65 69   ){.      *pnHei
5bd0: 67 68 74 20 3d 20 70 2d 3e 6e 48 65 69 67 68 74  ght = p->nHeight
5be0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74  ;.    }.  }.}.st
5bf0: 61 74 69 63 20 76 6f 69 64 20 68 65 69 67 68 74  atic void height
5c00: 4f 66 45 78 70 72 4c 69 73 74 28 45 78 70 72 4c  OfExprList(ExprL
5c10: 69 73 74 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 48  ist *p, int *pnH
5c20: 65 69 67 68 74 29 7b 0a 20 20 69 66 28 20 70 20  eight){.  if( p 
5c30: 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
5c40: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
5c50: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
5c60: 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 28     heightOfExpr(
5c70: 70 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 70  p->a[i].pExpr, p
5c80: 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20 7d 0a  nHeight);.    }.
5c90: 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69    }.}.static voi
5ca0: 64 20 68 65 69 67 68 74 4f 66 53 65 6c 65 63 74  d heightOfSelect
5cb0: 28 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20  (Select *p, int 
5cc0: 2a 70 6e 48 65 69 67 68 74 29 7b 0a 20 20 69 66  *pnHeight){.  if
5cd0: 28 20 70 20 29 7b 0a 20 20 20 20 68 65 69 67 68  ( p ){.    heigh
5ce0: 74 4f 66 45 78 70 72 28 70 2d 3e 70 57 68 65 72  tOfExpr(p->pWher
5cf0: 65 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20  e, pnHeight);.  
5d00: 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 28 70    heightOfExpr(p
5d10: 2d 3e 70 48 61 76 69 6e 67 2c 20 70 6e 48 65 69  ->pHaving, pnHei
5d20: 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74  ght);.    height
5d30: 4f 66 45 78 70 72 28 70 2d 3e 70 4c 69 6d 69 74  OfExpr(p->pLimit
5d40: 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20  , pnHeight);.   
5d50: 20 68 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d   heightOfExpr(p-
5d60: 3e 70 4f 66 66 73 65 74 2c 20 70 6e 48 65 69 67  >pOffset, pnHeig
5d70: 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f  ht);.    heightO
5d80: 66 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 45 4c  fExprList(p->pEL
5d90: 69 73 74 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a  ist, pnHeight);.
5da0: 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72      heightOfExpr
5db0: 4c 69 73 74 28 70 2d 3e 70 47 72 6f 75 70 42 79  List(p->pGroupBy
5dc0: 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20  , pnHeight);.   
5dd0: 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73   heightOfExprLis
5de0: 74 28 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 70  t(p->pOrderBy, p
5df0: 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65  nHeight);.    he
5e00: 69 67 68 74 4f 66 53 65 6c 65 63 74 28 70 2d 3e  ightOfSelect(p->
5e10: 70 50 72 69 6f 72 2c 20 70 6e 48 65 69 67 68 74  pPrior, pnHeight
5e20: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
5e30: 53 65 74 20 74 68 65 20 45 78 70 72 2e 6e 48 65  Set the Expr.nHe
5e40: 69 67 68 74 20 76 61 72 69 61 62 6c 65 20 69 6e  ight variable in
5e50: 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20 70   the structure p
5e60: 61 73 73 65 64 20 61 73 20 61 6e 20 0a 2a 2a 20  assed as an .** 
5e70: 61 72 67 75 6d 65 6e 74 2e 20 41 6e 20 65 78 70  argument. An exp
5e80: 72 65 73 73 69 6f 6e 20 77 69 74 68 20 6e 6f 20  ression with no 
5e90: 63 68 69 6c 64 72 65 6e 2c 20 45 78 70 72 2e 70  children, Expr.p
5ea0: 4c 69 73 74 20 6f 72 20 0a 2a 2a 20 45 78 70 72  List or .** Expr
5eb0: 2e 70 53 65 6c 65 63 74 20 6d 65 6d 62 65 72 20  .pSelect member 
5ec0: 68 61 73 20 61 20 68 65 69 67 68 74 20 6f 66 20  has a height of 
5ed0: 31 2e 20 41 6e 79 20 6f 74 68 65 72 20 65 78 70  1. Any other exp
5ee0: 72 65 73 73 69 6f 6e 0a 2a 2a 20 68 61 73 20 61  ression.** has a
5ef0: 20 68 65 69 67 68 74 20 65 71 75 61 6c 20 74 6f   height equal to
5f00: 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 68 65 69   the maximum hei
5f10: 67 68 74 20 6f 66 20 61 6e 79 20 6f 74 68 65 72  ght of any other
5f20: 20 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 64 20   .** referenced 
5f30: 45 78 70 72 20 70 6c 75 73 20 6f 6e 65 2e 0a 2a  Expr plus one..*
5f40: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
5f50: 70 72 53 65 74 48 65 69 67 68 74 28 45 78 70 72  prSetHeight(Expr
5f60: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 48 65 69   *p){.  int nHei
5f70: 67 68 74 20 3d 20 30 3b 0a 20 20 68 65 69 67 68  ght = 0;.  heigh
5f80: 74 4f 66 45 78 70 72 28 70 2d 3e 70 4c 65 66 74  tOfExpr(p->pLeft
5f90: 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a 20 20 68  , &nHeight);.  h
5fa0: 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70  eightOfExpr(p->p
5fb0: 52 69 67 68 74 2c 20 26 6e 48 65 69 67 68 74 29  Right, &nHeight)
5fc0: 3b 0a 20 20 68 65 69 67 68 74 4f 66 45 78 70 72  ;.  heightOfExpr
5fd0: 4c 69 73 74 28 70 2d 3e 70 4c 69 73 74 2c 20 26  List(p->pList, &
5fe0: 6e 48 65 69 67 68 74 29 3b 0a 20 20 68 65 69 67  nHeight);.  heig
5ff0: 68 74 4f 66 53 65 6c 65 63 74 28 70 2d 3e 70 53  htOfSelect(p->pS
6000: 65 6c 65 63 74 2c 20 26 6e 48 65 69 67 68 74 29  elect, &nHeight)
6010: 3b 0a 20 20 70 2d 3e 6e 48 65 69 67 68 74 20 3d  ;.  p->nHeight =
6020: 20 6e 48 65 69 67 68 74 20 2b 20 31 3b 0a 7d 0a   nHeight + 1;.}.
6030: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
6040: 65 20 6d 61 78 69 6d 75 6d 20 68 65 69 67 68 74  e maximum height
6050: 20 6f 66 20 61 6e 79 20 65 78 70 72 65 73 73 69   of any expressi
6060: 6f 6e 20 74 72 65 65 20 72 65 66 65 72 65 6e 63  on tree referenc
6070: 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 73 65 6c  ed.** by the sel
6080: 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20 70 61  ect statement pa
6090: 73 73 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d  ssed as an argum
60a0: 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ent..*/.int sqli
60b0: 74 65 33 53 65 6c 65 63 74 45 78 70 72 48 65 69  te3SelectExprHei
60c0: 67 68 74 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a  ght(Select *p){.
60d0: 20 20 69 6e 74 20 6e 48 65 69 67 68 74 20 3d 20    int nHeight = 
60e0: 30 3b 0a 20 20 68 65 69 67 68 74 4f 66 53 65 6c  0;.  heightOfSel
60f0: 65 63 74 28 70 2c 20 26 6e 48 65 69 67 68 74 29  ect(p, &nHeight)
6100: 3b 0a 20 20 72 65 74 75 72 6e 20 6e 48 65 69 67  ;.  return nHeig
6110: 68 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c  ht;.}../*.** Del
6120: 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20 65 78  ete an entire ex
6130: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a  pression list..*
6140: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
6150: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 45 78 70  prListDelete(Exp
6160: 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20  rList *pList){. 
6170: 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74   int i;.  struct
6180: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
6190: 70 49 74 65 6d 3b 0a 20 20 69 66 28 20 70 4c 69  pItem;.  if( pLi
61a0: 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  st==0 ) return;.
61b0: 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d    assert( pList-
61c0: 3e 61 21 3d 30 20 7c 7c 20 28 70 4c 69 73 74 2d  >a!=0 || (pList-
61d0: 3e 6e 45 78 70 72 3d 3d 30 20 26 26 20 70 4c 69  >nExpr==0 && pLi
61e0: 73 74 2d 3e 6e 41 6c 6c 6f 63 3d 3d 30 29 20 29  st->nAlloc==0) )
61f0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73  ;.  assert( pLis
6200: 74 2d 3e 6e 45 78 70 72 3c 3d 70 4c 69 73 74 2d  t->nExpr<=pList-
6210: 3e 6e 41 6c 6c 6f 63 20 29 3b 0a 20 20 66 6f 72  >nAlloc );.  for
6220: 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c  (pItem=pList->a,
6230: 20 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e   i=0; i<pList->n
6240: 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d  Expr; i++, pItem
6250: 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
6260: 45 78 70 72 44 65 6c 65 74 65 28 70 49 74 65 6d  ExprDelete(pItem
6270: 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 73 71  ->pExpr);.    sq
6280: 6c 69 74 65 33 5f 66 72 65 65 28 70 49 74 65 6d  lite3_free(pItem
6290: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20  ->zName);.  }.  
62a0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4c 69  sqlite3_free(pLi
62b0: 73 74 2d 3e 61 29 3b 0a 20 20 73 71 6c 69 74 65  st->a);.  sqlite
62c0: 33 5f 66 72 65 65 28 70 4c 69 73 74 29 3b 0a 7d  3_free(pList);.}
62d0: 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20  ../*.** Walk an 
62e0: 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e  expression tree.
62f0: 20 20 43 61 6c 6c 20 78 46 75 6e 63 20 66 6f 72    Call xFunc for
6300: 20 65 61 63 68 20 6e 6f 64 65 20 76 69 73 69 74   each node visit
6310: 65 64 2e 20 20 78 46 75 6e 63 0a 2a 2a 20 69 73  ed.  xFunc.** is
6320: 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 6e   called on the n
6330: 6f 64 65 20 62 65 66 6f 72 65 20 78 46 75 6e 63  ode before xFunc
6340: 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68   is called on th
6350: 65 20 6e 6f 64 65 73 20 63 68 69 6c 64 72 65 6e  e nodes children
6360: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75  ..**.** The retu
6370: 72 6e 20 76 61 6c 75 65 20 66 72 6f 6d 20 78 46  rn value from xF
6380: 75 6e 63 20 64 65 74 65 72 6d 69 6e 65 73 20 77  unc determines w
6390: 68 65 74 68 65 72 20 74 68 65 20 74 72 65 65 20  hether the tree 
63a0: 77 61 6c 6b 20 63 6f 6e 74 69 6e 75 65 73 2e 0a  walk continues..
63b0: 2a 2a 20 30 20 6d 65 61 6e 73 20 63 6f 6e 74 69  ** 0 means conti
63c0: 6e 75 65 20 77 61 6c 6b 69 6e 67 20 74 68 65 20  nue walking the 
63d0: 74 72 65 65 2e 20 20 31 20 6d 65 61 6e 73 20 64  tree.  1 means d
63e0: 6f 20 6e 6f 74 20 77 61 6c 6b 20 63 68 69 6c 64  o not walk child
63f0: 72 65 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 63 75  ren.** of the cu
6400: 72 72 65 6e 74 20 6e 6f 64 65 20 62 75 74 20 63  rrent node but c
6410: 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 73 69 62  ontinue with sib
6420: 6c 69 6e 67 73 2e 20 20 32 20 6d 65 61 6e 73 20  lings.  2 means 
6430: 61 62 61 6e 64 6f 6e 0a 2a 2a 20 74 68 65 20 74  abandon.** the t
6440: 72 65 65 20 77 61 6c 6b 20 63 6f 6d 70 6c 65 74  ree walk complet
6450: 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72  ely..**.** The r
6460: 65 74 75 72 6e 20 76 61 6c 75 65 20 66 72 6f 6d  eturn value from
6470: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
6480: 20 31 20 74 6f 20 61 62 61 6e 64 6f 6e 20 74 68   1 to abandon th
6490: 65 20 74 72 65 65 20 77 61 6c 6b 0a 2a 2a 20 61  e tree walk.** a
64a0: 6e 64 20 30 20 74 6f 20 63 6f 6e 74 69 6e 75 65  nd 0 to continue
64b0: 2e 0a 2a 2a 0a 2a 2a 20 4e 4f 54 49 43 45 3a 20  ..**.** NOTICE: 
64c0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f   This routine do
64d0: 65 73 20 2a 6e 6f 74 2a 20 64 65 73 63 65 6e 64  es *not* descend
64e0: 20 69 6e 74 6f 20 73 75 62 71 75 65 72 69 65 73   into subqueries
64f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
6500: 77 61 6c 6b 45 78 70 72 4c 69 73 74 28 45 78 70  walkExprList(Exp
6510: 72 4c 69 73 74 20 2a 2c 20 69 6e 74 20 28 2a 29  rList *, int (*)
6520: 28 76 6f 69 64 20 2a 2c 20 45 78 70 72 2a 29 2c  (void *, Expr*),
6530: 20 76 6f 69 64 20 2a 29 3b 0a 73 74 61 74 69 63   void *);.static
6540: 20 69 6e 74 20 77 61 6c 6b 45 78 70 72 54 72 65   int walkExprTre
6550: 65 28 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69  e(Expr *pExpr, i
6560: 6e 74 20 28 2a 78 46 75 6e 63 29 28 76 6f 69 64  nt (*xFunc)(void
6570: 2a 2c 45 78 70 72 2a 29 2c 20 76 6f 69 64 20 2a  *,Expr*), void *
6580: 70 41 72 67 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pArg){.  int rc;
6590: 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20  .  if( pExpr==0 
65a0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 63  ) return 0;.  rc
65b0: 20 3d 20 28 2a 78 46 75 6e 63 29 28 70 41 72 67   = (*xFunc)(pArg
65c0: 2c 20 70 45 78 70 72 29 3b 0a 20 20 69 66 28 20  , pExpr);.  if( 
65d0: 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  rc==0 ){.    if(
65e0: 20 77 61 6c 6b 45 78 70 72 54 72 65 65 28 70 45   walkExprTree(pE
65f0: 78 70 72 2d 3e 70 4c 65 66 74 2c 20 78 46 75 6e  xpr->pLeft, xFun
6600: 63 2c 20 70 41 72 67 29 20 29 20 72 65 74 75 72  c, pArg) ) retur
6610: 6e 20 31 3b 0a 20 20 20 20 69 66 28 20 77 61 6c  n 1;.    if( wal
6620: 6b 45 78 70 72 54 72 65 65 28 70 45 78 70 72 2d  kExprTree(pExpr-
6630: 3e 70 52 69 67 68 74 2c 20 78 46 75 6e 63 2c 20  >pRight, xFunc, 
6640: 70 41 72 67 29 20 29 20 72 65 74 75 72 6e 20 31  pArg) ) return 1
6650: 3b 0a 20 20 20 20 69 66 28 20 77 61 6c 6b 45 78  ;.    if( walkEx
6660: 70 72 4c 69 73 74 28 70 45 78 70 72 2d 3e 70 4c  prList(pExpr->pL
6670: 69 73 74 2c 20 78 46 75 6e 63 2c 20 70 41 72 67  ist, xFunc, pArg
6680: 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  ) ) return 1;.  
6690: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3e 31 3b  }.  return rc>1;
66a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 77  .}../*.** Call w
66b0: 61 6c 6b 45 78 70 72 54 72 65 65 28 29 20 66 6f  alkExprTree() fo
66c0: 72 20 65 76 65 72 79 20 65 78 70 72 65 73 73 69  r every expressi
66d0: 6f 6e 20 69 6e 20 6c 69 73 74 20 70 2e 0a 2a 2f  on in list p..*/
66e0: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 61 6c 6b  .static int walk
66f0: 45 78 70 72 4c 69 73 74 28 45 78 70 72 4c 69 73  ExprList(ExprLis
6700: 74 20 2a 70 2c 20 69 6e 74 20 28 2a 78 46 75 6e  t *p, int (*xFun
6710: 63 29 28 76 6f 69 64 20 2a 2c 20 45 78 70 72 2a  c)(void *, Expr*
6720: 29 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a  ), void *pArg){.
6730: 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63    int i;.  struc
6740: 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
6750: 2a 70 49 74 65 6d 3b 0a 20 20 69 66 28 20 21 70  *pItem;.  if( !p
6760: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 66   ) return 0;.  f
6770: 6f 72 28 69 3d 70 2d 3e 6e 45 78 70 72 2c 20 70  or(i=p->nExpr, p
6780: 49 74 65 6d 3d 70 2d 3e 61 3b 20 69 3e 30 3b 20  Item=p->a; i>0; 
6790: 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  i--, pItem++){. 
67a0: 20 20 20 69 66 28 20 77 61 6c 6b 45 78 70 72 54     if( walkExprT
67b0: 72 65 65 28 70 49 74 65 6d 2d 3e 70 45 78 70 72  ree(pItem->pExpr
67c0: 2c 20 78 46 75 6e 63 2c 20 70 41 72 67 29 20 29  , xFunc, pArg) )
67d0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
67e0: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
67f0: 0a 2a 2a 20 43 61 6c 6c 20 77 61 6c 6b 45 78 70  .** Call walkExp
6800: 72 54 72 65 65 28 29 20 66 6f 72 20 65 76 65 72  rTree() for ever
6810: 79 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20  y expression in 
6820: 53 65 6c 65 63 74 20 70 2c 20 6e 6f 74 20 69 6e  Select p, not in
6830: 63 6c 75 64 69 6e 67 0a 2a 2a 20 65 78 70 72 65  cluding.** expre
6840: 73 73 69 6f 6e 73 20 74 68 61 74 20 61 72 65 20  ssions that are 
6850: 70 61 72 74 20 6f 66 20 73 75 62 2d 73 65 6c 65  part of sub-sele
6860: 63 74 73 20 69 6e 20 61 6e 79 20 46 52 4f 4d 20  cts in any FROM 
6870: 63 6c 61 75 73 65 20 6f 72 20 74 68 65 20 4c 49  clause or the LI
6880: 4d 49 54 0a 2a 2a 20 6f 72 20 4f 46 46 53 45 54  MIT.** or OFFSET
6890: 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 2e 0a 2a   expressions...*
68a0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 61 6c  /.static int wal
68b0: 6b 53 65 6c 65 63 74 45 78 70 72 28 53 65 6c 65  kSelectExpr(Sele
68c0: 63 74 20 2a 70 2c 20 69 6e 74 20 28 2a 78 46 75  ct *p, int (*xFu
68d0: 6e 63 29 28 76 6f 69 64 20 2a 2c 20 45 78 70 72  nc)(void *, Expr
68e0: 2a 29 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 7b  *), void *pArg){
68f0: 0a 20 20 77 61 6c 6b 45 78 70 72 4c 69 73 74 28  .  walkExprList(
6900: 70 2d 3e 70 45 4c 69 73 74 2c 20 78 46 75 6e 63  p->pEList, xFunc
6910: 2c 20 70 41 72 67 29 3b 0a 20 20 77 61 6c 6b 45  , pArg);.  walkE
6920: 78 70 72 54 72 65 65 28 70 2d 3e 70 57 68 65 72  xprTree(p->pWher
6930: 65 2c 20 78 46 75 6e 63 2c 20 70 41 72 67 29 3b  e, xFunc, pArg);
6940: 0a 20 20 77 61 6c 6b 45 78 70 72 4c 69 73 74 28  .  walkExprList(
6950: 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 78 46 75  p->pGroupBy, xFu
6960: 6e 63 2c 20 70 41 72 67 29 3b 0a 20 20 77 61 6c  nc, pArg);.  wal
6970: 6b 45 78 70 72 54 72 65 65 28 70 2d 3e 70 48 61  kExprTree(p->pHa
6980: 76 69 6e 67 2c 20 78 46 75 6e 63 2c 20 70 41 72  ving, xFunc, pAr
6990: 67 29 3b 0a 20 20 77 61 6c 6b 45 78 70 72 4c 69  g);.  walkExprLi
69a0: 73 74 28 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20  st(p->pOrderBy, 
69b0: 78 46 75 6e 63 2c 20 70 41 72 67 29 3b 0a 20 20  xFunc, pArg);.  
69c0: 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b  if( p->pPrior ){
69d0: 0a 20 20 20 20 77 61 6c 6b 53 65 6c 65 63 74 45  .    walkSelectE
69e0: 78 70 72 28 70 2d 3e 70 50 72 69 6f 72 2c 20 78  xpr(p->pPrior, x
69f0: 46 75 6e 63 2c 20 70 41 72 67 29 3b 0a 20 20 7d  Func, pArg);.  }
6a00: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
6a10: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
6a20: 69 6e 65 20 69 73 20 64 65 73 69 67 6e 65 64 20  ine is designed 
6a30: 61 73 20 61 6e 20 78 46 75 6e 63 20 66 6f 72 20  as an xFunc for 
6a40: 77 61 6c 6b 45 78 70 72 54 72 65 65 28 29 2e 0a  walkExprTree()..
6a50: 2a 2a 0a 2a 2a 20 70 41 72 67 20 69 73 20 72 65  **.** pArg is re
6a60: 61 6c 6c 79 20 61 20 70 6f 69 6e 74 65 72 20 74  ally a pointer t
6a70: 6f 20 61 6e 20 69 6e 74 65 67 65 72 2e 20 20 49  o an integer.  I
6a80: 66 20 77 65 20 63 61 6e 20 74 65 6c 6c 20 62 79  f we can tell by
6a90: 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20 61 74 20 70   looking.** at p
6aa0: 45 78 70 72 20 74 68 61 74 20 74 68 65 20 65 78  Expr that the ex
6ab0: 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 63 6f  pression that co
6ac0: 6e 74 61 69 6e 73 20 70 45 78 70 72 20 69 73 20  ntains pExpr is 
6ad0: 6e 6f 74 20 61 20 63 6f 6e 73 74 61 6e 74 0a 2a  not a constant.*
6ae0: 2a 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68  * expression, th
6af0: 65 6e 20 73 65 74 20 2a 70 41 72 67 20 74 6f 20  en set *pArg to 
6b00: 30 20 61 6e 64 20 72 65 74 75 72 6e 20 32 20 74  0 and return 2 t
6b10: 6f 20 61 62 61 6e 64 6f 6e 20 74 68 65 20 74 72  o abandon the tr
6b20: 65 65 20 77 61 6c 6b 2e 0a 2a 2a 20 49 66 20 70  ee walk..** If p
6b30: 45 78 70 72 20 64 6f 65 73 20 64 6f 65 73 20 6e  Expr does does n
6b40: 6f 74 20 64 69 73 71 75 61 6c 69 66 79 20 74 68  ot disqualify th
6b50: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 66 72 6f  e expression fro
6b60: 6d 20 62 65 69 6e 67 20 61 20 63 6f 6e 73 74 61  m being a consta
6b70: 6e 74 0a 2a 2a 20 74 68 65 6e 20 64 6f 20 6e 6f  nt.** then do no
6b80: 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41 66 74  thing..**.** Aft
6b90: 65 72 20 77 61 6c 6b 69 6e 67 20 74 68 65 20 77  er walking the w
6ba0: 68 6f 6c 65 20 74 72 65 65 2c 20 69 66 20 6e 6f  hole tree, if no
6bb0: 20 6e 6f 64 65 73 20 61 72 65 20 66 6f 75 6e 64   nodes are found
6bc0: 20 74 68 61 74 20 64 69 73 71 75 61 6c 69 66 79   that disqualify
6bd0: 0a 2a 2a 20 74 68 65 20 65 78 70 72 65 73 73 69  .** the expressi
6be0: 6f 6e 20 61 73 20 63 6f 6e 73 74 61 6e 74 2c 20  on as constant, 
6bf0: 74 68 65 6e 20 77 65 20 61 73 73 75 6d 65 20 74  then we assume t
6c00: 68 65 20 77 68 6f 6c 65 20 65 78 70 72 65 73 73  he whole express
6c10: 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6e 73 74 61  ion.** is consta
6c20: 6e 74 2e 20 20 53 65 65 20 73 71 6c 69 74 65 33  nt.  See sqlite3
6c30: 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 29  ExprIsConstant()
6c40: 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20   for additional 
6c50: 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a  information..*/.
6c60: 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 4e  static int exprN
6c70: 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 28 76 6f  odeIsConstant(vo
6c80: 69 64 20 2a 70 41 72 67 2c 20 45 78 70 72 20 2a  id *pArg, Expr *
6c90: 70 45 78 70 72 29 7b 0a 20 20 69 6e 74 20 2a 70  pExpr){.  int *p
6ca0: 4e 20 3d 20 28 69 6e 74 2a 29 70 41 72 67 3b 0a  N = (int*)pArg;.
6cb0: 0a 20 20 2f 2a 20 49 66 20 2a 70 41 72 67 20 69  .  /* If *pArg i
6cc0: 73 20 33 20 74 68 65 6e 20 61 6e 79 20 74 65 72  s 3 then any ter
6cd0: 6d 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73  m of the express
6ce0: 69 6f 6e 20 74 68 61 74 20 63 6f 6d 65 73 20 66  ion that comes f
6cf0: 72 6f 6d 0a 20 20 2a 2a 20 74 68 65 20 4f 4e 20  rom.  ** the ON 
6d00: 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73  or USING clauses
6d10: 20 6f 66 20 61 20 6a 6f 69 6e 20 64 69 73 71 75   of a join disqu
6d20: 61 6c 69 66 69 65 73 20 74 68 65 20 65 78 70 72  alifies the expr
6d30: 65 73 73 69 6f 6e 0a 20 20 2a 2a 20 66 72 6f 6d  ession.  ** from
6d40: 20 62 65 69 6e 67 20 63 6f 6e 73 69 64 65 72 65   being considere
6d50: 64 20 63 6f 6e 73 74 61 6e 74 2e 20 2a 2f 0a 20  d constant. */. 
6d60: 20 69 66 28 20 28 2a 70 4e 29 3d 3d 33 20 26 26   if( (*pN)==3 &&
6d70: 20 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70 65   ExprHasAnyPrope
6d80: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46 72  rty(pExpr, EP_Fr
6d90: 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20 2a  omJoin) ){.    *
6da0: 70 4e 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75  pN = 0;.    retu
6db0: 72 6e 20 32 3b 0a 20 20 7d 0a 0a 20 20 73 77 69  rn 2;.  }..  swi
6dc0: 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29  tch( pExpr->op )
6dd0: 7b 0a 20 20 20 20 2f 2a 20 43 6f 6e 73 69 64 65  {.    /* Conside
6de0: 72 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20 62  r functions to b
6df0: 65 20 63 6f 6e 73 74 61 6e 74 20 69 66 20 61 6c  e constant if al
6e00: 6c 20 74 68 65 69 72 20 61 72 67 75 6d 65 6e 74  l their argument
6e10: 73 20 61 72 65 20 63 6f 6e 73 74 61 6e 74 0a 20  s are constant. 
6e20: 20 20 20 2a 2a 20 61 6e 64 20 2a 70 41 72 67 3d     ** and *pArg=
6e30: 3d 32 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54  =2 */.    case T
6e40: 4b 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20  K_FUNCTION:.    
6e50: 20 20 69 66 28 20 28 2a 70 4e 29 3d 3d 32 20 29    if( (*pN)==2 )
6e60: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
6e70: 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67 68   /* Fall through
6e80: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   */.    case TK_
6e90: 49 44 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ID:.    case TK_
6ea0: 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65  COLUMN:.    case
6eb0: 20 54 4b 5f 44 4f 54 3a 0a 20 20 20 20 63 61 73   TK_DOT:.    cas
6ec0: 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f  e TK_AGG_FUNCTIO
6ed0: 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41  N:.    case TK_A
6ee0: 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 23 69 66 6e 64  GG_COLUMN:.#ifnd
6ef0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
6f00: 55 42 51 55 45 52 59 0a 20 20 20 20 63 61 73 65  UBQUERY.    case
6f10: 20 54 4b 5f 53 45 4c 45 43 54 3a 0a 20 20 20 20   TK_SELECT:.    
6f20: 63 61 73 65 20 54 4b 5f 45 58 49 53 54 53 3a 0a  case TK_EXISTS:.
6f30: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
6f40: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45  pExpr->op==TK_SE
6f50: 4c 45 43 54 20 29 3b 0a 20 20 20 20 20 20 74 65  LECT );.      te
6f60: 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
6f70: 70 3d 3d 54 4b 5f 45 58 49 53 54 53 20 29 3b 0a  p==TK_EXISTS );.
6f80: 23 65 6e 64 69 66 0a 20 20 20 20 20 20 74 65 73  #endif.      tes
6f90: 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
6fa0: 3d 3d 54 4b 5f 49 44 20 29 3b 0a 20 20 20 20 20  ==TK_ID );.     
6fb0: 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
6fc0: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
6fd0: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
6fe0: 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
6ff0: 5f 44 4f 54 20 29 3b 0a 20 20 20 20 20 20 74 65  _DOT );.      te
7000: 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
7010: 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49  p==TK_AGG_FUNCTI
7020: 4f 4e 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ON );.      test
7030: 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
7040: 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29  =TK_AGG_COLUMN )
7050: 3b 0a 20 20 20 20 20 20 2a 70 4e 20 3d 20 30 3b  ;.      *pN = 0;
7060: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 32 3b  .      return 2;
7070: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a  .    case TK_IN:
7080: 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
7090: 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ->pSelect ){.   
70a0: 20 20 20 20 20 2a 70 4e 20 3d 20 30 3b 0a 20 20       *pN = 0;.  
70b0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a        return 2;.
70c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61        }.    defa
70d0: 75 6c 74 3a 0a 20 20 20 20 20 20 72 65 74 75 72  ult:.      retur
70e0: 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  n 0;.  }.}../*.*
70f0: 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73  * Walk an expres
7100: 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75  sion tree.  Retu
7110: 72 6e 20 31 20 69 66 20 74 68 65 20 65 78 70 72  rn 1 if the expr
7120: 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61  ession is consta
7130: 6e 74 0a 2a 2a 20 61 6e 64 20 30 20 69 66 20 69  nt.** and 0 if i
7140: 74 20 69 6e 76 6f 6c 76 65 73 20 76 61 72 69 61  t involves varia
7150: 62 6c 65 73 20 6f 72 20 66 75 6e 63 74 69 6f 6e  bles or function
7160: 20 63 61 6c 6c 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f   calls..**.** Fo
7170: 72 20 74 68 65 20 70 75 72 70 6f 73 65 73 20 6f  r the purposes o
7180: 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c  f this function,
7190: 20 61 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65 64   a double-quoted
71a0: 20 73 74 72 69 6e 67 20 28 65 78 3a 20 22 61 62   string (ex: "ab
71b0: 63 22 29 0a 2a 2a 20 69 73 20 63 6f 6e 73 69 64  c").** is consid
71c0: 65 72 65 64 20 61 20 76 61 72 69 61 62 6c 65 20  ered a variable 
71d0: 62 75 74 20 61 20 73 69 6e 67 6c 65 2d 71 75 6f  but a single-quo
71e0: 74 65 64 20 73 74 72 69 6e 67 20 28 65 78 3a 20  ted string (ex: 
71f0: 27 61 62 63 27 29 20 69 73 0a 2a 2a 20 61 20 63  'abc') is.** a c
7200: 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a 69 6e 74 20  onstant..*/.int 
7210: 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
7220: 73 74 61 6e 74 28 45 78 70 72 20 2a 70 29 7b 0a  stant(Expr *p){.
7230: 20 20 69 6e 74 20 69 73 43 6f 6e 73 74 20 3d 20    int isConst = 
7240: 31 3b 0a 20 20 77 61 6c 6b 45 78 70 72 54 72 65  1;.  walkExprTre
7250: 65 28 70 2c 20 65 78 70 72 4e 6f 64 65 49 73 43  e(p, exprNodeIsC
7260: 6f 6e 73 74 61 6e 74 2c 20 26 69 73 43 6f 6e 73  onstant, &isCons
7270: 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 73 43  t);.  return isC
7280: 6f 6e 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  onst;.}../*.** W
7290: 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f  alk an expressio
72a0: 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20  n tree.  Return 
72b0: 31 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  1 if the express
72c0: 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a  ion is constant.
72d0: 2a 2a 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 20  ** that does no 
72e0: 6f 72 69 67 69 6e 61 74 65 20 66 72 6f 6d 20 74  originate from t
72f0: 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63  he ON or USING c
7300: 6c 61 75 73 65 73 20 6f 66 20 61 20 6a 6f 69 6e  lauses of a join
7310: 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20 69 66  ..** Return 0 if
7320: 20 69 74 20 69 6e 76 6f 6c 76 65 73 20 76 61 72   it involves var
7330: 69 61 62 6c 65 73 20 6f 72 20 66 75 6e 63 74 69  iables or functi
7340: 6f 6e 20 63 61 6c 6c 73 20 6f 72 20 74 65 72 6d  on calls or term
7350: 73 20 66 72 6f 6d 0a 2a 2a 20 61 6e 20 4f 4e 20  s from.** an ON 
7360: 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2e  or USING clause.
7370: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
7380: 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74  xprIsConstantNot
7390: 4a 6f 69 6e 28 45 78 70 72 20 2a 70 29 7b 0a 20  Join(Expr *p){. 
73a0: 20 69 6e 74 20 69 73 43 6f 6e 73 74 20 3d 20 33   int isConst = 3
73b0: 3b 0a 20 20 77 61 6c 6b 45 78 70 72 54 72 65 65  ;.  walkExprTree
73c0: 28 70 2c 20 65 78 70 72 4e 6f 64 65 49 73 43 6f  (p, exprNodeIsCo
73d0: 6e 73 74 61 6e 74 2c 20 26 69 73 43 6f 6e 73 74  nstant, &isConst
73e0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 73 43 6f  );.  return isCo
73f0: 6e 73 74 21 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  nst!=0;.}../*.**
7400: 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73   Walk an express
7410: 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72  ion tree.  Retur
7420: 6e 20 31 20 69 66 20 74 68 65 20 65 78 70 72 65  n 1 if the expre
7430: 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e  ssion is constan
7440: 74 0a 2a 2a 20 6f 72 20 61 20 66 75 6e 63 74 69  t.** or a functi
7450: 6f 6e 20 63 61 6c 6c 20 77 69 74 68 20 63 6f 6e  on call with con
7460: 73 74 61 6e 74 20 61 72 67 75 6d 65 6e 74 73 2e  stant arguments.
7470: 20 20 52 65 74 75 72 6e 20 61 6e 64 20 30 20 69    Return and 0 i
7480: 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 61  f there.** are a
7490: 6e 79 20 76 61 72 69 61 62 6c 65 73 2e 0a 2a 2a  ny variables..**
74a0: 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70  .** For the purp
74b0: 6f 73 65 73 20 6f 66 20 74 68 69 73 20 66 75 6e  oses of this fun
74c0: 63 74 69 6f 6e 2c 20 61 20 64 6f 75 62 6c 65 2d  ction, a double-
74d0: 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65  quoted string (e
74e0: 78 3a 20 22 61 62 63 22 29 0a 2a 2a 20 69 73 20  x: "abc").** is 
74f0: 63 6f 6e 73 69 64 65 72 65 64 20 61 20 76 61 72  considered a var
7500: 69 61 62 6c 65 20 62 75 74 20 61 20 73 69 6e 67  iable but a sing
7510: 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67  le-quoted string
7520: 20 28 65 78 3a 20 27 61 62 63 27 29 20 69 73 0a   (ex: 'abc') is.
7530: 2a 2a 20 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a  ** a constant..*
7540: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
7550: 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75 6e  rIsConstantOrFun
7560: 63 74 69 6f 6e 28 45 78 70 72 20 2a 70 29 7b 0a  ction(Expr *p){.
7570: 20 20 69 6e 74 20 69 73 43 6f 6e 73 74 20 3d 20    int isConst = 
7580: 32 3b 0a 20 20 77 61 6c 6b 45 78 70 72 54 72 65  2;.  walkExprTre
7590: 65 28 70 2c 20 65 78 70 72 4e 6f 64 65 49 73 43  e(p, exprNodeIsC
75a0: 6f 6e 73 74 61 6e 74 2c 20 26 69 73 43 6f 6e 73  onstant, &isCons
75b0: 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 73 43  t);.  return isC
75c0: 6f 6e 73 74 21 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  onst!=0;.}../*.*
75d0: 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73  * If the express
75e0: 69 6f 6e 20 70 20 63 6f 64 65 73 20 61 20 63 6f  ion p codes a co
75f0: 6e 73 74 61 6e 74 20 69 6e 74 65 67 65 72 20 74  nstant integer t
7600: 68 61 74 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f  hat is small eno
7610: 75 67 68 0a 2a 2a 20 74 6f 20 66 69 74 20 69 6e  ugh.** to fit in
7620: 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65   a 32-bit intege
7630: 72 2c 20 72 65 74 75 72 6e 20 31 20 61 6e 64 20  r, return 1 and 
7640: 70 75 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66  put the value of
7650: 20 74 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20   the integer.** 
7660: 69 6e 20 2a 70 56 61 6c 75 65 2e 20 20 49 66 20  in *pValue.  If 
7670: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
7680: 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65 72  s not an integer
7690: 20 6f 72 20 69 66 20 69 74 20 69 73 20 74 6f 6f   or if it is too
76a0: 20 62 69 67 0a 2a 2a 20 74 6f 20 66 69 74 20 69   big.** to fit i
76b0: 6e 20 61 20 73 69 67 6e 65 64 20 33 32 2d 62 69  n a signed 32-bi
76c0: 74 20 69 6e 74 65 67 65 72 2c 20 72 65 74 75 72  t integer, retur
76d0: 6e 20 30 20 61 6e 64 20 6c 65 61 76 65 20 2a 70  n 0 and leave *p
76e0: 56 61 6c 75 65 20 75 6e 63 68 61 6e 67 65 64 2e  Value unchanged.
76f0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
7700: 78 70 72 49 73 49 6e 74 65 67 65 72 28 45 78 70  xprIsInteger(Exp
7710: 72 20 2a 70 2c 20 69 6e 74 20 2a 70 56 61 6c 75  r *p, int *pValu
7720: 65 29 7b 0a 20 20 73 77 69 74 63 68 28 20 70 2d  e){.  switch( p-
7730: 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20  >op ){.    case 
7740: 54 4b 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20  TK_INTEGER: {.  
7750: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 47      if( sqlite3G
7760: 65 74 49 6e 74 33 32 28 28 63 68 61 72 2a 29 70  etInt32((char*)p
7770: 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 56 61 6c 75  ->token.z, pValu
7780: 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  e) ){.        re
7790: 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a  turn 1;.      }.
77a0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
77b0: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55   }.    case TK_U
77c0: 50 4c 55 53 3a 20 7b 0a 20 20 20 20 20 20 72 65  PLUS: {.      re
77d0: 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72  turn sqlite3Expr
77e0: 49 73 49 6e 74 65 67 65 72 28 70 2d 3e 70 4c 65  IsInteger(p->pLe
77f0: 66 74 2c 20 70 56 61 6c 75 65 29 3b 0a 20 20 20  ft, pValue);.   
7800: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55   }.    case TK_U
7810: 4d 49 4e 55 53 3a 20 7b 0a 20 20 20 20 20 20 69  MINUS: {.      i
7820: 6e 74 20 76 3b 0a 20 20 20 20 20 20 69 66 28 20  nt v;.      if( 
7830: 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74  sqlite3ExprIsInt
7840: 65 67 65 72 28 70 2d 3e 70 4c 65 66 74 2c 20 26  eger(p->pLeft, &
7850: 76 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70  v) ){.        *p
7860: 56 61 6c 75 65 20 3d 20 2d 76 3b 0a 20 20 20 20  Value = -v;.    
7870: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
7880: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
7890: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66  k;.    }.    def
78a0: 61 75 6c 74 3a 20 62 72 65 61 6b 3b 0a 20 20 7d  ault: break;.  }
78b0: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
78c0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
78d0: 45 20 69 66 20 74 68 65 20 67 69 76 65 6e 20 73  E if the given s
78e0: 74 72 69 6e 67 20 69 73 20 61 20 72 6f 77 2d 69  tring is a row-i
78f0: 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 2e 0a 2a  d column name..*
7900: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 73 52  /.int sqlite3IsR
7910: 6f 77 69 64 28 63 6f 6e 73 74 20 63 68 61 72 20  owid(const char 
7920: 2a 7a 29 7b 0a 20 20 69 66 28 20 73 71 6c 69 74  *z){.  if( sqlit
7930: 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22 5f 52  e3StrICmp(z, "_R
7940: 4f 57 49 44 5f 22 29 3d 3d 30 20 29 20 72 65 74  OWID_")==0 ) ret
7950: 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 73 71 6c  urn 1;.  if( sql
7960: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22  ite3StrICmp(z, "
7970: 52 4f 57 49 44 22 29 3d 3d 30 20 29 20 72 65 74  ROWID")==0 ) ret
7980: 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 73 71 6c  urn 1;.  if( sql
7990: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22  ite3StrICmp(z, "
79a0: 4f 49 44 22 29 3d 3d 30 20 29 20 72 65 74 75 72  OID")==0 ) retur
79b0: 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b  n 1;.  return 0;
79c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  .}../*.** Given 
79d0: 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 63 6f  the name of a co
79e0: 6c 75 6d 6e 20 6f 66 20 74 68 65 20 66 6f 72 6d  lumn of the form
79f0: 20 58 2e 59 2e 5a 20 6f 72 20 59 2e 5a 20 6f 72   X.Y.Z or Y.Z or
7a00: 20 6a 75 73 74 20 5a 2c 20 6c 6f 6f 6b 20 75 70   just Z, look up
7a10: 0a 2a 2a 20 74 68 61 74 20 6e 61 6d 65 20 69 6e  .** that name in
7a20: 20 74 68 65 20 73 65 74 20 6f 66 20 73 6f 75 72   the set of sour
7a30: 63 65 20 74 61 62 6c 65 73 20 69 6e 20 70 53 72  ce tables in pSr
7a40: 63 4c 69 73 74 20 61 6e 64 20 6d 61 6b 65 20 74  cList and make t
7a50: 68 65 20 70 45 78 70 72 20 0a 2a 2a 20 65 78 70  he pExpr .** exp
7a60: 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 72 65 66  ression node ref
7a70: 65 72 20 62 61 63 6b 20 74 6f 20 74 68 61 74 20  er back to that 
7a80: 73 6f 75 72 63 65 20 63 6f 6c 75 6d 6e 2e 20 20  source column.  
7a90: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68  The following ch
7aa0: 61 6e 67 65 73 0a 2a 2a 20 61 72 65 20 6d 61 64  anges.** are mad
7ab0: 65 20 74 6f 20 70 45 78 70 72 3a 0a 2a 2a 0a 2a  e to pExpr:.**.*
7ac0: 2a 20 20 20 20 70 45 78 70 72 2d 3e 69 44 62 20  *    pExpr->iDb 
7ad0: 20 20 20 20 20 20 20 20 20 20 53 65 74 20 74 68            Set th
7ae0: 65 20 69 6e 64 65 78 20 69 6e 20 64 62 2d 3e 61  e index in db->a
7af0: 44 62 5b 5d 20 6f 66 20 74 68 65 20 64 61 74 61  Db[] of the data
7b00: 62 61 73 65 20 68 6f 6c 64 69 6e 67 0a 2a 2a 20  base holding.** 
7b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7b20: 20 20 20 20 20 20 20 20 74 68 65 20 74 61 62 6c          the tabl
7b30: 65 2e 0a 2a 2a 20 20 20 20 70 45 78 70 72 2d 3e  e..**    pExpr->
7b40: 69 54 61 62 6c 65 20 20 20 20 20 20 20 20 53 65  iTable        Se
7b50: 74 20 74 6f 20 74 68 65 20 63 75 72 73 6f 72 20  t to the cursor 
7b60: 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 74  number for the t
7b70: 61 62 6c 65 20 6f 62 74 61 69 6e 65 64 0a 2a 2a  able obtained.**
7b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7b90: 20 20 20 20 20 20 20 20 20 66 72 6f 6d 20 70 53           from pS
7ba0: 72 63 4c 69 73 74 2e 0a 2a 2a 20 20 20 20 70 45  rcList..**    pE
7bb0: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 20 20 20  xpr->iColumn    
7bc0: 20 20 20 53 65 74 20 74 6f 20 74 68 65 20 63 6f     Set to the co
7bd0: 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 77 69 74 68  lumn number with
7be0: 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a  in the table..**
7bf0: 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 20 20      pExpr->op   
7c00: 20 20 20 20 20 20 20 20 20 53 65 74 20 74 6f 20           Set to 
7c10: 54 4b 5f 43 4f 4c 55 4d 4e 2e 0a 2a 2a 20 20 20  TK_COLUMN..**   
7c20: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 20 20   pExpr->pLeft   
7c30: 20 20 20 20 20 20 41 6e 79 20 65 78 70 72 65 73        Any expres
7c40: 73 69 6f 6e 20 74 68 69 73 20 70 6f 69 6e 74 73  sion this points
7c50: 20 74 6f 20 69 73 20 64 65 6c 65 74 65 64 0a 2a   to is deleted.*
7c60: 2a 20 20 20 20 70 45 78 70 72 2d 3e 70 52 69 67  *    pExpr->pRig
7c70: 68 74 20 20 20 20 20 20 20 20 41 6e 79 20 65 78  ht        Any ex
7c80: 70 72 65 73 73 69 6f 6e 20 74 68 69 73 20 70 6f  pression this po
7c90: 69 6e 74 73 20 74 6f 20 69 73 20 64 65 6c 65 74  ints to is delet
7ca0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 44  ed..**.** The pD
7cb0: 62 54 6f 6b 65 6e 20 69 73 20 74 68 65 20 6e 61  bToken is the na
7cc0: 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
7cd0: 73 65 20 28 74 68 65 20 22 58 22 29 2e 20 20 54  se (the "X").  T
7ce0: 68 69 73 20 76 61 6c 75 65 20 6d 61 79 20 62 65  his value may be
7cf0: 0a 2a 2a 20 4e 55 4c 4c 20 6d 65 61 6e 69 6e 67  .** NULL meaning
7d00: 20 74 68 61 74 20 6e 61 6d 65 20 69 73 20 6f 66   that name is of
7d10: 20 74 68 65 20 66 6f 72 6d 20 59 2e 5a 20 6f 72   the form Y.Z or
7d20: 20 5a 2e 20 20 41 6e 79 20 61 76 61 69 6c 61 62   Z.  Any availab
7d30: 6c 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63  le database.** c
7d40: 61 6e 20 62 65 20 75 73 65 64 2e 20 20 54 68 65  an be used.  The
7d50: 20 70 54 61 62 6c 65 54 6f 6b 65 6e 20 69 73 20   pTableToken is 
7d60: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
7d70: 74 61 62 6c 65 20 28 74 68 65 20 22 59 22 29 2e  table (the "Y").
7d80: 20 20 54 68 69 73 0a 2a 2a 20 76 61 6c 75 65 20    This.** value 
7d90: 63 61 6e 20 62 65 20 4e 55 4c 4c 20 69 66 20 70  can be NULL if p
7da0: 44 62 54 6f 6b 65 6e 20 69 73 20 61 6c 73 6f 20  DbToken is also 
7db0: 4e 55 4c 4c 2e 20 20 49 66 20 70 54 61 62 6c 65  NULL.  If pTable
7dc0: 54 6f 6b 65 6e 20 69 73 20 4e 55 4c 4c 20 69 74  Token is NULL it
7dd0: 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 61 74 20 74  .** means that t
7de0: 68 65 20 66 6f 72 6d 20 6f 66 20 74 68 65 20 6e  he form of the n
7df0: 61 6d 65 20 69 73 20 5a 20 61 6e 64 20 74 68 61  ame is Z and tha
7e00: 74 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20 61  t columns from a
7e10: 6e 79 20 74 61 62 6c 65 0a 2a 2a 20 63 61 6e 20  ny table.** can 
7e20: 62 65 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  be used..**.** I
7e30: 66 20 74 68 65 20 6e 61 6d 65 20 63 61 6e 6e 6f  f the name canno
7e40: 74 20 62 65 20 72 65 73 6f 6c 76 65 64 20 75 6e  t be resolved un
7e50: 61 6d 62 69 67 75 6f 75 73 6c 79 2c 20 6c 65 61  ambiguously, lea
7e60: 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  ve an error mess
7e70: 61 67 65 0a 2a 2a 20 69 6e 20 70 50 61 72 73 65  age.** in pParse
7e80: 20 61 6e 64 20 72 65 74 75 72 6e 20 6e 6f 6e 2d   and return non-
7e90: 7a 65 72 6f 2e 20 20 52 65 74 75 72 6e 20 7a 65  zero.  Return ze
7ea0: 72 6f 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a 2a  ro on success..*
7eb0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 6f 6f  /.static int loo
7ec0: 6b 75 70 4e 61 6d 65 28 0a 20 20 50 61 72 73 65  kupName(.  Parse
7ed0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
7ee0: 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63  /* The parsing c
7ef0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65  ontext */.  Toke
7f00: 6e 20 2a 70 44 62 54 6f 6b 65 6e 2c 20 20 20 20  n *pDbToken,    
7f10: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
7f20: 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e  database contain
7f30: 69 6e 67 20 74 61 62 6c 65 2c 20 6f 72 20 4e 55  ing table, or NU
7f40: 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  LL */.  Token *p
7f50: 54 61 62 6c 65 54 6f 6b 65 6e 2c 20 20 2f 2a 20  TableToken,  /* 
7f60: 4e 61 6d 65 20 6f 66 20 74 61 62 6c 65 20 63 6f  Name of table co
7f70: 6e 74 61 69 6e 69 6e 67 20 63 6f 6c 75 6d 6e 2c  ntaining column,
7f80: 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f   or NULL */.  To
7f90: 6b 65 6e 20 2a 70 43 6f 6c 75 6d 6e 54 6f 6b 65  ken *pColumnToke
7fa0: 6e 2c 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68  n, /* Name of th
7fb0: 65 20 63 6f 6c 75 6d 6e 2e 20 2a 2f 0a 20 20 4e  e column. */.  N
7fc0: 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c  ameContext *pNC,
7fd0: 20 20 20 20 2f 2a 20 54 68 65 20 6e 61 6d 65 20      /* The name 
7fe0: 63 6f 6e 74 65 78 74 20 75 73 65 64 20 74 6f 20  context used to 
7ff0: 72 65 73 6f 6c 76 65 20 74 68 65 20 6e 61 6d 65  resolve the name
8000: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70   */.  Expr *pExp
8010: 72 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61  r          /* Ma
8020: 6b 65 20 74 68 69 73 20 45 58 50 52 20 6e 6f 64  ke this EXPR nod
8030: 65 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 73  e point to the s
8040: 65 6c 65 63 74 65 64 20 63 6f 6c 75 6d 6e 20 2a  elected column *
8050: 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 44 62  /.){.  char *zDb
8060: 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e   = 0;       /* N
8070: 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
8080: 61 73 65 2e 20 20 54 68 65 20 22 58 22 20 69 6e  ase.  The "X" in
8090: 20 58 2e 59 2e 5a 20 2a 2f 0a 20 20 63 68 61 72   X.Y.Z */.  char
80a0: 20 2a 7a 54 61 62 20 3d 20 30 3b 20 20 20 20 20   *zTab = 0;     
80b0: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
80c0: 74 61 62 6c 65 2e 20 20 54 68 65 20 22 59 22 20  table.  The "Y" 
80d0: 69 6e 20 58 2e 59 2e 5a 20 6f 72 20 59 2e 5a 20  in X.Y.Z or Y.Z 
80e0: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6c 20  */.  char *zCol 
80f0: 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4e 61 6d  = 0;      /* Nam
8100: 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2e  e of the column.
8110: 20 20 54 68 65 20 22 5a 22 20 2a 2f 0a 20 20 69    The "Z" */.  i
8120: 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20  nt i, j;        
8130: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
8140: 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 63 6e  ters */.  int cn
8150: 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f  t = 0;         /
8160: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6d 61 74 63  * Number of matc
8170: 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  hing column name
8180: 73 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 54 61  s */.  int cntTa
8190: 62 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4e  b = 0;      /* N
81a0: 75 6d 62 65 72 20 6f 66 20 6d 61 74 63 68 69 6e  umber of matchin
81b0: 67 20 74 61 62 6c 65 20 6e 61 6d 65 73 20 2a 2f  g table names */
81c0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
81d0: 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 2f 2a   pParse->db;  /*
81e0: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f   The database */
81f0: 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
8200: 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 20 20  t_item *pItem;  
8210: 20 20 20 20 20 2f 2a 20 55 73 65 20 66 6f 72 20       /* Use for 
8220: 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 70 53 72  looping over pSr
8230: 63 4c 69 73 74 20 69 74 65 6d 73 20 2a 2f 0a 20  cList items */. 
8240: 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
8250: 69 74 65 6d 20 2a 70 4d 61 74 63 68 20 3d 20 30  item *pMatch = 0
8260: 3b 20 20 2f 2a 20 54 68 65 20 6d 61 74 63 68 69  ;  /* The matchi
8270: 6e 67 20 70 53 72 63 4c 69 73 74 20 69 74 65 6d  ng pSrcList item
8280: 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78   */.  NameContex
8290: 74 20 2a 70 54 6f 70 4e 43 20 3d 20 70 4e 43 3b  t *pTopNC = pNC;
82a0: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
82b0: 20 6e 61 6d 65 63 6f 6e 74 65 78 74 20 69 6e 20   namecontext in 
82c0: 74 68 65 20 6c 69 73 74 20 2a 2f 0a 20 20 53 63  the list */.  Sc
82d0: 68 65 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d 20  hema *pSchema = 
82e0: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
82f0: 2f 2a 20 53 63 68 65 6d 61 20 6f 66 20 74 68 65  /* Schema of the
8300: 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 0a   expression */..
8310: 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c 75 6d    assert( pColum
8320: 6e 54 6f 6b 65 6e 20 26 26 20 70 43 6f 6c 75 6d  nToken && pColum
8330: 6e 54 6f 6b 65 6e 2d 3e 7a 20 29 3b 20 2f 2a 20  nToken->z ); /* 
8340: 54 68 65 20 5a 20 69 6e 20 58 2e 59 2e 5a 20 63  The Z in X.Y.Z c
8350: 61 6e 6e 6f 74 20 62 65 20 4e 55 4c 4c 20 2a 2f  annot be NULL */
8360: 0a 20 20 7a 44 62 20 3d 20 73 71 6c 69 74 65 33  .  zDb = sqlite3
8370: 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62  NameFromToken(db
8380: 2c 20 70 44 62 54 6f 6b 65 6e 29 3b 0a 20 20 7a  , pDbToken);.  z
8390: 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  Tab = sqlite3Nam
83a0: 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70  eFromToken(db, p
83b0: 54 61 62 6c 65 54 6f 6b 65 6e 29 3b 0a 20 20 7a  TableToken);.  z
83c0: 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  Col = sqlite3Nam
83d0: 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70  eFromToken(db, p
83e0: 43 6f 6c 75 6d 6e 54 6f 6b 65 6e 29 3b 0a 20 20  ColumnToken);.  
83f0: 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
8400: 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f  iled ){.    goto
8410: 20 6c 6f 6f 6b 75 70 6e 61 6d 65 5f 65 6e 64 3b   lookupname_end;
8420: 0a 20 20 7d 0a 0a 20 20 70 45 78 70 72 2d 3e 69  .  }..  pExpr->i
8430: 54 61 62 6c 65 20 3d 20 2d 31 3b 0a 20 20 77 68  Table = -1;.  wh
8440: 69 6c 65 28 20 70 4e 43 20 26 26 20 63 6e 74 3d  ile( pNC && cnt=
8450: 3d 30 20 29 7b 0a 20 20 20 20 45 78 70 72 4c 69  =0 ){.    ExprLi
8460: 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 20 20  st *pEList;.    
8470: 53 72 63 4c 69 73 74 20 2a 70 53 72 63 4c 69 73  SrcList *pSrcLis
8480: 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73  t = pNC->pSrcLis
8490: 74 3b 0a 0a 20 20 20 20 69 66 28 20 70 53 72 63  t;..    if( pSrc
84a0: 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 66 6f  List ){.      fo
84b0: 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70 53 72  r(i=0, pItem=pSr
84c0: 63 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 53 72 63  cList->a; i<pSrc
84d0: 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c  List->nSrc; i++,
84e0: 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
84f0: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a     Table *pTab;.
8500: 20 20 20 20 20 20 20 20 69 6e 74 20 69 44 62 3b          int iDb;
8510: 0a 20 20 20 20 20 20 20 20 43 6f 6c 75 6d 6e 20  .        Column 
8520: 2a 70 43 6f 6c 3b 0a 20 20 0a 20 20 20 20 20 20  *pCol;.  .      
8530: 20 20 70 54 61 62 20 3d 20 70 49 74 65 6d 2d 3e    pTab = pItem->
8540: 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 61 73  pTab;.        as
8550: 73 65 72 74 28 20 70 54 61 62 21 3d 30 20 29 3b  sert( pTab!=0 );
8560: 0a 20 20 20 20 20 20 20 20 69 44 62 20 3d 20 73  .        iDb = s
8570: 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e  qlite3SchemaToIn
8580: 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53  dex(db, pTab->pS
8590: 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 20 20  chema);.        
85a0: 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 6e 43  assert( pTab->nC
85b0: 6f 6c 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20  ol>0 );.        
85c0: 69 66 28 20 7a 54 61 62 20 29 7b 0a 20 20 20 20  if( zTab ){.    
85d0: 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d        if( pItem-
85e0: 3e 7a 41 6c 69 61 73 20 29 7b 0a 20 20 20 20 20  >zAlias ){.     
85f0: 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 61         char *zTa
8600: 62 4e 61 6d 65 20 3d 20 70 49 74 65 6d 2d 3e 7a  bName = pItem->z
8610: 41 6c 69 61 73 3b 0a 20 20 20 20 20 20 20 20 20  Alias;.         
8620: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
8630: 72 49 43 6d 70 28 7a 54 61 62 4e 61 6d 65 2c 20  rICmp(zTabName, 
8640: 7a 54 61 62 29 21 3d 30 20 29 20 63 6f 6e 74 69  zTab)!=0 ) conti
8650: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  nue;.          }
8660: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
8670: 20 20 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65    char *zTabName
8680: 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a   = pTab->zName;.
8690: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
86a0: 7a 54 61 62 4e 61 6d 65 3d 3d 30 20 7c 7c 20 73  zTabName==0 || s
86b0: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 54  qlite3StrICmp(zT
86c0: 61 62 4e 61 6d 65 2c 20 7a 54 61 62 29 21 3d 30  abName, zTab)!=0
86d0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
86e0: 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 44 62           if( zDb
86f0: 21 3d 30 20 26 26 20 73 71 6c 69 74 65 33 53 74  !=0 && sqlite3St
8700: 72 49 43 6d 70 28 64 62 2d 3e 61 44 62 5b 69 44  rICmp(db->aDb[iD
8710: 62 5d 2e 7a 4e 61 6d 65 2c 20 7a 44 62 29 21 3d  b].zName, zDb)!=
8720: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
8730: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
8740: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
8750: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
8760: 0a 20 20 20 20 20 20 20 20 69 66 28 20 30 3d 3d  .        if( 0==
8770: 28 63 6e 74 54 61 62 2b 2b 29 20 29 7b 0a 20 20  (cntTab++) ){.  
8780: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69          pExpr->i
8790: 54 61 62 6c 65 20 3d 20 70 49 74 65 6d 2d 3e 69  Table = pItem->i
87a0: 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 20 20  Cursor;.        
87b0: 20 20 70 53 63 68 65 6d 61 20 3d 20 70 54 61 62    pSchema = pTab
87c0: 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 20  ->pSchema;.     
87d0: 20 20 20 20 20 70 4d 61 74 63 68 20 3d 20 70 49       pMatch = pI
87e0: 74 65 6d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  tem;.        }. 
87f0: 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20         for(j=0, 
8800: 70 43 6f 6c 3d 70 54 61 62 2d 3e 61 43 6f 6c 3b  pCol=pTab->aCol;
8810: 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a   j<pTab->nCol; j
8820: 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20  ++, pCol++){.   
8830: 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
8840: 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 2d 3e  e3StrICmp(pCol->
8850: 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3d 3d 30 20  zName, zCol)==0 
8860: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  ){.            c
8870: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c  onst char *zColl
8880: 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d   = pTab->aCol[j]
8890: 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20  .zColl;.        
88a0: 20 20 20 20 49 64 4c 69 73 74 20 2a 70 55 73 69      IdList *pUsi
88b0: 6e 67 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ng;.            
88c0: 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  cnt++;.         
88d0: 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65     pExpr->iTable
88e0: 20 3d 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f   = pItem->iCurso
88f0: 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  r;.            p
8900: 4d 61 74 63 68 20 3d 20 70 49 74 65 6d 3b 0a 20  Match = pItem;. 
8910: 20 20 20 20 20 20 20 20 20 20 20 70 53 63 68 65             pSche
8920: 6d 61 20 3d 20 70 54 61 62 2d 3e 70 53 63 68 65  ma = pTab->pSche
8930: 6d 61 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ma;.            
8940: 2f 2a 20 53 75 62 73 74 69 74 75 74 65 20 74 68  /* Substitute th
8950: 65 20 72 6f 77 69 64 20 28 63 6f 6c 75 6d 6e 20  e rowid (column 
8960: 2d 31 29 20 66 6f 72 20 74 68 65 20 49 4e 54 45  -1) for the INTE
8970: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20  GER PRIMARY KEY 
8980: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  */.            p
8990: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20  Expr->iColumn = 
89a0: 6a 3d 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20 3f  j==pTab->iPKey ?
89b0: 20 2d 31 20 3a 20 6a 3b 0a 20 20 20 20 20 20 20   -1 : j;.       
89c0: 20 20 20 20 20 70 45 78 70 72 2d 3e 61 66 66 69       pExpr->affi
89d0: 6e 69 74 79 20 3d 20 70 54 61 62 2d 3e 61 43 6f  nity = pTab->aCo
89e0: 6c 5b 6a 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20  l[j].affinity;. 
89f0: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28             if( (
8a00: 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45  pExpr->flags & E
8a10: 50 5f 45 78 70 43 6f 6c 6c 61 74 65 29 3d 3d 30  P_ExpCollate)==0
8a20: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
8a30: 20 20 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 20 3d    pExpr->pColl =
8a40: 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c   sqlite3FindColl
8a50: 53 65 71 28 64 62 2c 20 45 4e 43 28 64 62 29 2c  Seq(db, ENC(db),
8a60: 20 7a 43 6f 6c 6c 2c 2d 31 2c 20 30 29 3b 0a 20   zColl,-1, 0);. 
8a70: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
8a80: 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3c 70           if( i<p
8a90: 53 72 63 4c 69 73 74 2d 3e 6e 53 72 63 2d 31 20  SrcList->nSrc-1 
8aa0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
8ab0: 20 69 66 28 20 70 49 74 65 6d 5b 31 5d 2e 6a 6f   if( pItem[1].jo
8ac0: 69 6e 74 79 70 65 20 26 20 4a 54 5f 4e 41 54 55  intype & JT_NATU
8ad0: 52 41 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 20  RAL ){.         
8ae0: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69         /* If thi
8af0: 73 20 6d 61 74 63 68 20 6f 63 63 75 72 72 65 64  s match occurred
8b00: 20 69 6e 20 74 68 65 20 6c 65 66 74 20 74 61 62   in the left tab
8b10: 6c 65 20 6f 66 20 61 20 6e 61 74 75 72 61 6c 20  le of a natural 
8b20: 6a 6f 69 6e 2c 0a 20 20 20 20 20 20 20 20 20 20  join,.          
8b30: 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 73 6b        ** then sk
8b40: 69 70 20 74 68 65 20 72 69 67 68 74 20 74 61 62  ip the right tab
8b50: 6c 65 20 74 6f 20 61 76 6f 69 64 20 61 20 64 75  le to avoid a du
8b60: 70 6c 69 63 61 74 65 20 6d 61 74 63 68 20 2a 2f  plicate match */
8b70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8b80: 20 70 49 74 65 6d 2b 2b 3b 0a 20 20 20 20 20 20   pItem++;.      
8b90: 20 20 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20            i++;. 
8ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c               }el
8bb0: 73 65 20 69 66 28 20 28 70 55 73 69 6e 67 20 3d  se if( (pUsing =
8bc0: 20 70 49 74 65 6d 5b 31 5d 2e 70 55 73 69 6e 67   pItem[1].pUsing
8bd0: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
8be0: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
8bf0: 69 73 20 6d 61 74 63 68 20 6f 63 63 75 72 73 20  is match occurs 
8c00: 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20 74 68 61 74  on a column that
8c10: 20 69 73 20 69 6e 20 74 68 65 20 55 53 49 4e 47   is in the USING
8c20: 20 63 6c 61 75 73 65 0a 20 20 20 20 20 20 20 20   clause.        
8c30: 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 61 20          ** of a 
8c40: 6a 6f 69 6e 2c 20 73 6b 69 70 20 74 68 65 20 73  join, skip the s
8c50: 65 61 72 63 68 20 6f 66 20 74 68 65 20 72 69 67  earch of the rig
8c60: 68 74 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20  ht table of the 
8c70: 6a 6f 69 6e 0a 20 20 20 20 20 20 20 20 20 20 20  join.           
8c80: 20 20 20 20 20 2a 2a 20 74 6f 20 61 76 6f 69 64       ** to avoid
8c90: 20 61 20 64 75 70 6c 69 63 61 74 65 20 6d 61 74   a duplicate mat
8ca0: 63 68 20 74 68 65 72 65 2e 20 2a 2f 0a 20 20 20  ch there. */.   
8cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74               int
8cc0: 20 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   k;.            
8cd0: 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70      for(k=0; k<p
8ce0: 55 73 69 6e 67 2d 3e 6e 49 64 3b 20 6b 2b 2b 29  Using->nId; k++)
8cf0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
8d00: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
8d10: 74 72 49 43 6d 70 28 70 55 73 69 6e 67 2d 3e 61  trICmp(pUsing->a
8d20: 5b 6b 5d 2e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29  [k].zName, zCol)
8d30: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
8d40: 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d             pItem
8d50: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ++;.            
8d60: 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20          i++;.   
8d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8d80: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
8d90: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
8da0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
8db0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
8dc0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
8dd0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
8de0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
8df0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
8e00: 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
8e10: 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a  TE_OMIT_TRIGGER.
8e20: 20 20 20 20 2f 2a 20 49 66 20 77 65 20 68 61 76      /* If we hav
8e30: 65 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 72 65  e not already re
8e40: 73 6f 6c 76 65 64 20 74 68 65 20 6e 61 6d 65 2c  solved the name,
8e50: 20 74 68 65 6e 20 6d 61 79 62 65 20 0a 20 20 20   then maybe .   
8e60: 20 2a 2a 20 69 74 20 69 73 20 61 20 6e 65 77 2e   ** it is a new.
8e70: 2a 20 6f 72 20 6f 6c 64 2e 2a 20 74 72 69 67 67  * or old.* trigg
8e80: 65 72 20 61 72 67 75 6d 65 6e 74 20 72 65 66 65  er argument refe
8e90: 72 65 6e 63 65 0a 20 20 20 20 2a 2f 0a 20 20 20  rence.    */.   
8ea0: 20 69 66 28 20 7a 44 62 3d 3d 30 20 26 26 20 7a   if( zDb==0 && z
8eb0: 54 61 62 21 3d 30 20 26 26 20 63 6e 74 3d 3d 30  Tab!=0 && cnt==0
8ec0: 20 26 26 20 70 50 61 72 73 65 2d 3e 74 72 69 67   && pParse->trig
8ed0: 53 74 61 63 6b 21 3d 30 20 29 7b 0a 20 20 20 20  Stack!=0 ){.    
8ee0: 20 20 54 72 69 67 67 65 72 53 74 61 63 6b 20 2a    TriggerStack *
8ef0: 70 54 72 69 67 67 65 72 53 74 61 63 6b 20 3d 20  pTriggerStack = 
8f00: 70 50 61 72 73 65 2d 3e 74 72 69 67 53 74 61 63  pParse->trigStac
8f10: 6b 3b 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a  k;.      Table *
8f20: 70 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 20 20  pTab = 0;.      
8f30: 75 33 32 20 2a 70 69 43 6f 6c 4d 61 73 6b 3b 0a  u32 *piColMask;.
8f40: 20 20 20 20 20 20 69 66 28 20 70 54 72 69 67 67        if( pTrigg
8f50: 65 72 53 74 61 63 6b 2d 3e 6e 65 77 49 64 78 20  erStack->newIdx 
8f60: 21 3d 20 2d 31 20 26 26 20 73 71 6c 69 74 65 33  != -1 && sqlite3
8f70: 53 74 72 49 43 6d 70 28 22 6e 65 77 22 2c 20 7a  StrICmp("new", z
8f80: 54 61 62 29 20 3d 3d 20 30 20 29 7b 0a 20 20 20  Tab) == 0 ){.   
8f90: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62       pExpr->iTab
8fa0: 6c 65 20 3d 20 70 54 72 69 67 67 65 72 53 74 61  le = pTriggerSta
8fb0: 63 6b 2d 3e 6e 65 77 49 64 78 3b 0a 20 20 20 20  ck->newIdx;.    
8fc0: 20 20 20 20 61 73 73 65 72 74 28 20 70 54 72 69      assert( pTri
8fd0: 67 67 65 72 53 74 61 63 6b 2d 3e 70 54 61 62 20  ggerStack->pTab 
8fe0: 29 3b 0a 20 20 20 20 20 20 20 20 70 54 61 62 20  );.        pTab 
8ff0: 3d 20 70 54 72 69 67 67 65 72 53 74 61 63 6b 2d  = pTriggerStack-
9000: 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 70  >pTab;.        p
9010: 69 43 6f 6c 4d 61 73 6b 20 3d 20 26 28 70 54 72  iColMask = &(pTr
9020: 69 67 67 65 72 53 74 61 63 6b 2d 3e 6e 65 77 43  iggerStack->newC
9030: 6f 6c 4d 61 73 6b 29 3b 0a 20 20 20 20 20 20 7d  olMask);.      }
9040: 65 6c 73 65 20 69 66 28 20 70 54 72 69 67 67 65  else if( pTrigge
9050: 72 53 74 61 63 6b 2d 3e 6f 6c 64 49 64 78 20 21  rStack->oldIdx !
9060: 3d 20 2d 31 20 26 26 20 73 71 6c 69 74 65 33 53  = -1 && sqlite3S
9070: 74 72 49 43 6d 70 28 22 6f 6c 64 22 2c 20 7a 54  trICmp("old", zT
9080: 61 62 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ab)==0 ){.      
9090: 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20    pExpr->iTable 
90a0: 3d 20 70 54 72 69 67 67 65 72 53 74 61 63 6b 2d  = pTriggerStack-
90b0: 3e 6f 6c 64 49 64 78 3b 0a 20 20 20 20 20 20 20  >oldIdx;.       
90c0: 20 61 73 73 65 72 74 28 20 70 54 72 69 67 67 65   assert( pTrigge
90d0: 72 53 74 61 63 6b 2d 3e 70 54 61 62 20 29 3b 0a  rStack->pTab );.
90e0: 20 20 20 20 20 20 20 20 70 54 61 62 20 3d 20 70          pTab = p
90f0: 54 72 69 67 67 65 72 53 74 61 63 6b 2d 3e 70 54  TriggerStack->pT
9100: 61 62 3b 0a 20 20 20 20 20 20 20 20 70 69 43 6f  ab;.        piCo
9110: 6c 4d 61 73 6b 20 3d 20 26 28 70 54 72 69 67 67  lMask = &(pTrigg
9120: 65 72 53 74 61 63 6b 2d 3e 6f 6c 64 43 6f 6c 4d  erStack->oldColM
9130: 61 73 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  ask);.      }.. 
9140: 20 20 20 20 20 69 66 28 20 70 54 61 62 20 29 7b       if( pTab ){
9150: 20 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 43   .        int iC
9160: 6f 6c 3b 0a 20 20 20 20 20 20 20 20 43 6f 6c 75  ol;.        Colu
9170: 6d 6e 20 2a 70 43 6f 6c 20 3d 20 70 54 61 62 2d  mn *pCol = pTab-
9180: 3e 61 43 6f 6c 3b 0a 0a 20 20 20 20 20 20 20 20  >aCol;..        
9190: 70 53 63 68 65 6d 61 20 3d 20 70 54 61 62 2d 3e  pSchema = pTab->
91a0: 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 20 20 20  pSchema;.       
91b0: 20 63 6e 74 54 61 62 2b 2b 3b 0a 20 20 20 20 20   cntTab++;.     
91c0: 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20 69     for(iCol=0; i
91d0: 43 6f 6c 20 3c 20 70 54 61 62 2d 3e 6e 43 6f 6c  Col < pTab->nCol
91e0: 3b 20 69 43 6f 6c 2b 2b 2c 20 70 43 6f 6c 2b 2b  ; iCol++, pCol++
91f0: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ) {.          if
9200: 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
9210: 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a 43  (pCol->zName, zC
9220: 6f 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ol)==0 ){.      
9230: 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
9240: 20 2a 7a 43 6f 6c 6c 20 3d 20 70 54 61 62 2d 3e   *zColl = pTab->
9250: 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 43 6f 6c 6c  aCol[iCol].zColl
9260: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6e  ;.            cn
9270: 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  t++;.           
9280: 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20   pExpr->iColumn 
9290: 3d 20 69 43 6f 6c 3d 3d 70 54 61 62 2d 3e 69 50  = iCol==pTab->iP
92a0: 4b 65 79 20 3f 20 2d 31 20 3a 20 69 43 6f 6c 3b  Key ? -1 : iCol;
92b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78  .            pEx
92c0: 70 72 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 70  pr->affinity = p
92d0: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
92e0: 61 66 66 69 6e 69 74 79 3b 0a 20 20 20 20 20 20  affinity;.      
92f0: 20 20 20 20 20 20 69 66 28 20 28 70 45 78 70 72        if( (pExpr
9300: 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 45 78 70  ->flags & EP_Exp
9310: 43 6f 6c 6c 61 74 65 29 3d 3d 30 20 29 7b 0a 20  Collate)==0 ){. 
9320: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
9330: 70 72 2d 3e 70 43 6f 6c 6c 20 3d 20 73 71 6c 69  pr->pColl = sqli
9340: 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64  te3FindCollSeq(d
9350: 62 2c 20 45 4e 43 28 64 62 29 2c 20 7a 43 6f 6c  b, ENC(db), zCol
9360: 6c 2c 2d 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  l,-1, 0);.      
9370: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
9380: 20 20 20 20 70 45 78 70 72 2d 3e 70 54 61 62 20      pExpr->pTab 
9390: 3d 20 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20  = pTab;.        
93a0: 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20      if( iCol>=0 
93b0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
93c0: 20 74 65 73 74 63 61 73 65 28 20 69 43 6f 6c 3d   testcase( iCol=
93d0: 3d 33 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20  =31 );.         
93e0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
93f0: 43 6f 6c 3d 3d 33 32 20 29 3b 0a 20 20 20 20 20  Col==32 );.     
9400: 20 20 20 20 20 20 20 20 20 2a 70 69 43 6f 6c 4d           *piColM
9410: 61 73 6b 20 7c 3d 20 28 28 75 33 32 29 31 3c 3c  ask |= ((u32)1<<
9420: 69 43 6f 6c 29 20 7c 20 28 69 43 6f 6c 3e 3d 33  iCol) | (iCol>=3
9430: 32 3f 30 78 66 66 66 66 66 66 66 66 3a 30 29 3b  2?0xffffffff:0);
9440: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
9450: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
9460: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
9470: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
9480: 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20      }.#endif /* 
9490: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
94a0: 4f 4d 49 54 5f 54 52 49 47 47 45 52 29 20 2a 2f  OMIT_TRIGGER) */
94b0: 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  ..    /*.    ** 
94c0: 50 65 72 68 61 70 73 20 74 68 65 20 6e 61 6d 65  Perhaps the name
94d0: 20 69 73 20 61 20 72 65 66 65 72 65 6e 63 65 20   is a reference 
94e0: 74 6f 20 74 68 65 20 52 4f 57 49 44 0a 20 20 20  to the ROWID.   
94f0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 63 6e 74 3d   */.    if( cnt=
9500: 3d 30 20 26 26 20 63 6e 74 54 61 62 3d 3d 31 20  =0 && cntTab==1 
9510: 26 26 20 73 71 6c 69 74 65 33 49 73 52 6f 77 69  && sqlite3IsRowi
9520: 64 28 7a 43 6f 6c 29 20 29 7b 0a 20 20 20 20 20  d(zCol) ){.     
9530: 20 63 6e 74 20 3d 20 31 3b 0a 20 20 20 20 20 20   cnt = 1;.      
9540: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d  pExpr->iColumn =
9550: 20 2d 31 3b 0a 20 20 20 20 20 20 70 45 78 70 72   -1;.      pExpr
9560: 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 53 51 4c  ->affinity = SQL
9570: 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 3b  ITE_AFF_INTEGER;
9580: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20  .    }..    /*. 
9590: 20 20 20 2a 2a 20 49 66 20 74 68 65 20 69 6e 70     ** If the inp
95a0: 75 74 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72  ut is of the for
95b0: 6d 20 5a 20 28 6e 6f 74 20 59 2e 5a 20 6f 72 20  m Z (not Y.Z or 
95c0: 58 2e 59 2e 5a 29 20 74 68 65 6e 20 74 68 65 20  X.Y.Z) then the 
95d0: 6e 61 6d 65 20 5a 0a 20 20 20 20 2a 2a 20 6d 69  name Z.    ** mi
95e0: 67 68 74 20 72 65 66 65 72 20 74 6f 20 61 6e 20  ght refer to an 
95f0: 72 65 73 75 6c 74 2d 73 65 74 20 61 6c 69 61 73  result-set alias
9600: 2e 20 20 54 68 69 73 20 68 61 70 70 65 6e 73 2c  .  This happens,
9610: 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 77 68   for example, wh
9620: 65 6e 0a 20 20 20 20 2a 2a 20 77 65 20 61 72 65  en.    ** we are
9630: 20 72 65 73 6f 6c 76 69 6e 67 20 6e 61 6d 65 73   resolving names
9640: 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c   in the WHERE cl
9650: 61 75 73 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ause of the foll
9660: 6f 77 69 6e 67 20 63 6f 6d 6d 61 6e 64 3a 0a 20  owing command:. 
9670: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
9680: 20 53 45 4c 45 43 54 20 61 2b 62 20 41 53 20 78   SELECT a+b AS x
9690: 20 46 52 4f 4d 20 74 61 62 6c 65 20 57 48 45 52   FROM table WHER
96a0: 45 20 78 3c 31 30 3b 0a 20 20 20 20 2a 2a 0a 20  E x<10;.    **. 
96b0: 20 20 20 2a 2a 20 49 6e 20 63 61 73 65 73 20 6c     ** In cases l
96c0: 69 6b 65 20 74 68 69 73 2c 20 72 65 70 6c 61 63  ike this, replac
96d0: 65 20 70 45 78 70 72 20 77 69 74 68 20 61 20 63  e pExpr with a c
96e0: 6f 70 79 20 6f 66 20 74 68 65 20 65 78 70 72 65  opy of the expre
96f0: 73 73 69 6f 6e 20 74 68 61 74 0a 20 20 20 20 2a  ssion that.    *
9700: 2a 20 66 6f 72 6d 73 20 74 68 65 20 72 65 73 75  * forms the resu
9710: 6c 74 20 73 65 74 20 65 6e 74 72 79 20 28 22 61  lt set entry ("a
9720: 2b 62 22 20 69 6e 20 74 68 65 20 65 78 61 6d 70  +b" in the examp
9730: 6c 65 29 20 61 6e 64 20 72 65 74 75 72 6e 20 69  le) and return i
9740: 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20 20 20 20  mmediately..    
9750: 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65  ** Note that the
9760: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 74   expression in t
9770: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 73 68  he result set sh
9780: 6f 75 6c 64 20 68 61 76 65 20 61 6c 72 65 61 64  ould have alread
9790: 79 20 62 65 65 6e 0a 20 20 20 20 2a 2a 20 72 65  y been.    ** re
97a0: 73 6f 6c 76 65 64 20 62 79 20 74 68 65 20 74 69  solved by the ti
97b0: 6d 65 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  me the WHERE cla
97c0: 75 73 65 20 69 73 20 72 65 73 6f 6c 76 65 64 2e  use is resolved.
97d0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
97e0: 63 6e 74 3d 3d 30 20 26 26 20 28 70 45 4c 69 73  cnt==0 && (pELis
97f0: 74 20 3d 20 70 4e 43 2d 3e 70 45 4c 69 73 74 29  t = pNC->pEList)
9800: 21 3d 30 20 26 26 20 7a 54 61 62 3d 3d 30 20 29  !=0 && zTab==0 )
9810: 7b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  {.      for(j=0;
9820: 20 6a 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   j<pEList->nExpr
9830: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
9840: 63 68 61 72 20 2a 7a 41 73 20 3d 20 70 45 4c 69  char *zAs = pELi
9850: 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a  st->a[j].zName;.
9860: 20 20 20 20 20 20 20 20 69 66 28 20 7a 41 73 21          if( zAs!
9870: 3d 30 20 26 26 20 73 71 6c 69 74 65 33 53 74 72  =0 && sqlite3Str
9880: 49 43 6d 70 28 7a 41 73 2c 20 7a 43 6f 6c 29 3d  ICmp(zAs, zCol)=
9890: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
98a0: 45 78 70 72 20 2a 70 44 75 70 2c 20 2a 70 4f 72  Expr *pDup, *pOr
98b0: 69 67 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  ig;.          as
98c0: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 4c 65  sert( pExpr->pLe
98d0: 66 74 3d 3d 30 20 26 26 20 70 45 78 70 72 2d 3e  ft==0 && pExpr->
98e0: 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20  pRight==0 );.   
98f0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
9900: 45 78 70 72 2d 3e 70 4c 69 73 74 3d 3d 30 20 29  Expr->pList==0 )
9910: 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
9920: 72 74 28 20 70 45 78 70 72 2d 3e 70 53 65 6c 65  rt( pExpr->pSele
9930: 63 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  ct==0 );.       
9940: 20 20 20 70 4f 72 69 67 20 3d 20 70 45 4c 69 73     pOrig = pELis
9950: 74 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72 3b 0a 20  t->a[j].pExpr;. 
9960: 20 20 20 20 20 20 20 20 20 69 66 28 20 21 70 4e           if( !pN
9970: 43 2d 3e 61 6c 6c 6f 77 41 67 67 20 26 26 20 45  C->allowAgg && E
9980: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
9990: 4f 72 69 67 2c 20 45 50 5f 41 67 67 29 20 29 7b  Orig, EP_Agg) ){
99a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
99b0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
99c0: 72 73 65 2c 20 22 6d 69 73 75 73 65 20 6f 66 20  rse, "misuse of 
99d0: 61 6c 69 61 73 65 64 20 61 67 67 72 65 67 61 74  aliased aggregat
99e0: 65 20 25 73 22 2c 20 7a 41 73 29 3b 0a 20 20 20  e %s", zAs);.   
99f0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
9a00: 5f 66 72 65 65 28 7a 43 6f 6c 29 3b 0a 20 20 20  _free(zCol);.   
9a10: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
9a20: 32 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  2;.          }. 
9a30: 20 20 20 20 20 20 20 20 20 70 44 75 70 20 3d 20           pDup = 
9a40: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
9a50: 62 2c 20 70 4f 72 69 67 29 3b 0a 20 20 20 20 20  b, pOrig);.     
9a60: 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
9a70: 66 6c 61 67 73 20 26 20 45 50 5f 45 78 70 43 6f  flags & EP_ExpCo
9a80: 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 20 20 20  llate ){.       
9a90: 20 20 20 20 20 70 44 75 70 2d 3e 70 43 6f 6c 6c       pDup->pColl
9aa0: 20 3d 20 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 3b   = pExpr->pColl;
9ab0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 44 75  .            pDu
9ac0: 70 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 45  p->flags |= EP_E
9ad0: 78 70 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 20  xpCollate;.     
9ae0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
9af0: 20 69 66 28 20 70 45 78 70 72 2d 3e 73 70 61 6e   if( pExpr->span
9b00: 2e 64 79 6e 20 29 20 73 71 6c 69 74 65 33 5f 66  .dyn ) sqlite3_f
9b10: 72 65 65 28 28 63 68 61 72 2a 29 70 45 78 70 72  ree((char*)pExpr
9b20: 2d 3e 73 70 61 6e 2e 7a 29 3b 0a 20 20 20 20 20  ->span.z);.     
9b30: 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
9b40: 74 6f 6b 65 6e 2e 64 79 6e 20 29 20 73 71 6c 69  token.dyn ) sqli
9b50: 74 65 33 5f 66 72 65 65 28 28 63 68 61 72 2a 29  te3_free((char*)
9b60: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 29 3b  pExpr->token.z);
9b70: 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70  .          memcp
9b80: 79 28 70 45 78 70 72 2c 20 70 44 75 70 2c 20 73  y(pExpr, pDup, s
9b90: 69 7a 65 6f 66 28 2a 70 45 78 70 72 29 29 3b 0a  izeof(*pExpr));.
9ba0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
9bb0: 33 5f 66 72 65 65 28 70 44 75 70 29 3b 0a 20 20  3_free(pDup);.  
9bc0: 20 20 20 20 20 20 20 20 63 6e 74 20 3d 20 31 3b          cnt = 1;
9bd0: 0a 20 20 20 20 20 20 20 20 20 20 70 4d 61 74 63  .          pMatc
9be0: 68 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  h = 0;.         
9bf0: 20 61 73 73 65 72 74 28 20 7a 54 61 62 3d 3d 30   assert( zTab==0
9c00: 20 26 26 20 7a 44 62 3d 3d 30 20 29 3b 0a 20 20   && zDb==0 );.  
9c10: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6c 6f 6f          goto loo
9c20: 6b 75 70 6e 61 6d 65 5f 65 6e 64 5f 32 3b 0a 20  kupname_end_2;. 
9c30: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
9c40: 20 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20   .    }..    /* 
9c50: 41 64 76 61 6e 63 65 20 74 6f 20 74 68 65 20 6e  Advance to the n
9c60: 65 78 74 20 6e 61 6d 65 20 63 6f 6e 74 65 78 74  ext name context
9c70: 2e 20 20 54 68 65 20 6c 6f 6f 70 20 77 69 6c 6c  .  The loop will
9c80: 20 65 78 69 74 20 77 68 65 6e 20 65 69 74 68 65   exit when eithe
9c90: 72 0a 20 20 20 20 2a 2a 20 77 65 20 68 61 76 65  r.    ** we have
9ca0: 20 61 20 6d 61 74 63 68 20 28 63 6e 74 3e 30 29   a match (cnt>0)
9cb0: 20 6f 72 20 77 68 65 6e 20 77 65 20 72 75 6e 20   or when we run 
9cc0: 6f 75 74 20 6f 66 20 6e 61 6d 65 20 63 6f 6e 74  out of name cont
9cd0: 65 78 74 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  exts..    */.   
9ce0: 20 69 66 28 20 63 6e 74 3d 3d 30 20 29 7b 0a 20   if( cnt==0 ){. 
9cf0: 20 20 20 20 20 70 4e 43 20 3d 20 70 4e 43 2d 3e       pNC = pNC->
9d00: 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  pNext;.    }.  }
9d10: 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 58  ..  /*.  ** If X
9d20: 20 61 6e 64 20 59 20 61 72 65 20 4e 55 4c 4c 20   and Y are NULL 
9d30: 28 69 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 20  (in other words 
9d40: 69 66 20 6f 6e 6c 79 20 74 68 65 20 63 6f 6c 75  if only the colu
9d50: 6d 6e 20 6e 61 6d 65 20 5a 20 69 73 0a 20 20 2a  mn name Z is.  *
9d60: 2a 20 73 75 70 70 6c 69 65 64 29 20 61 6e 64 20  * supplied) and 
9d70: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 5a 20 69  the value of Z i
9d80: 73 20 65 6e 63 6c 6f 73 65 64 20 69 6e 20 64 6f  s enclosed in do
9d90: 75 62 6c 65 2d 71 75 6f 74 65 73 2c 20 74 68 65  uble-quotes, the
9da0: 6e 0a 20 20 2a 2a 20 5a 20 69 73 20 61 20 73 74  n.  ** Z is a st
9db0: 72 69 6e 67 20 6c 69 74 65 72 61 6c 20 69 66 20  ring literal if 
9dc0: 69 74 20 64 6f 65 73 6e 27 74 20 6d 61 74 63 68  it doesn't match
9dd0: 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   any column name
9de0: 73 2e 20 20 49 6e 20 74 68 61 74 0a 20 20 2a 2a  s.  In that.  **
9df0: 20 63 61 73 65 2c 20 77 65 20 6e 65 65 64 20 74   case, we need t
9e00: 6f 20 72 65 74 75 72 6e 20 72 69 67 68 74 20 61  o return right a
9e10: 77 61 79 20 61 6e 64 20 6e 6f 74 20 6d 61 6b 65  way and not make
9e20: 20 61 6e 79 20 63 68 61 6e 67 65 73 20 74 6f 0a   any changes to.
9e30: 20 20 2a 2a 20 70 45 78 70 72 2e 0a 20 20 2a 2a    ** pExpr..  **
9e40: 0a 20 20 2a 2a 20 42 65 63 61 75 73 65 20 6e 6f  .  ** Because no
9e50: 20 72 65 66 65 72 65 6e 63 65 20 77 61 73 20 6d   reference was m
9e60: 61 64 65 20 74 6f 20 6f 75 74 65 72 20 63 6f 6e  ade to outer con
9e70: 74 65 78 74 73 2c 20 74 68 65 20 70 4e 43 2d 3e  texts, the pNC->
9e80: 6e 52 65 66 0a 20 20 2a 2a 20 66 69 65 6c 64 73  nRef.  ** fields
9e90: 20 61 72 65 20 6e 6f 74 20 63 68 61 6e 67 65 64   are not changed
9ea0: 20 69 6e 20 61 6e 79 20 63 6f 6e 74 65 78 74 2e   in any context.
9eb0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 6e 74 3d  .  */.  if( cnt=
9ec0: 3d 30 20 26 26 20 7a 54 61 62 3d 3d 30 20 26 26  =0 && zTab==0 &&
9ed0: 20 70 43 6f 6c 75 6d 6e 54 6f 6b 65 6e 2d 3e 7a   pColumnToken->z
9ee0: 5b 30 5d 3d 3d 27 22 27 20 29 7b 0a 20 20 20 20  [0]=='"' ){.    
9ef0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f  sqlite3_free(zCo
9f00: 6c 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  l);.    return 0
9f10: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ;.  }..  /*.  **
9f20: 20 63 6e 74 3d 3d 30 20 6d 65 61 6e 73 20 74 68   cnt==0 means th
9f30: 65 72 65 20 77 61 73 20 6e 6f 74 20 6d 61 74 63  ere was not matc
9f40: 68 2e 20 20 63 6e 74 3e 31 20 6d 65 61 6e 73 20  h.  cnt>1 means 
9f50: 74 68 65 72 65 20 77 65 72 65 20 74 77 6f 20 6f  there were two o
9f60: 72 0a 20 20 2a 2a 20 6d 6f 72 65 20 6d 61 74 63  r.  ** more matc
9f70: 68 65 73 2e 20 20 45 69 74 68 65 72 20 77 61 79  hes.  Either way
9f80: 2c 20 77 65 20 68 61 76 65 20 61 6e 20 65 72 72  , we have an err
9f90: 6f 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63  or..  */.  if( c
9fa0: 6e 74 21 3d 31 20 29 7b 0a 20 20 20 20 63 6f 6e  nt!=1 ){.    con
9fb0: 73 74 20 63 68 61 72 20 2a 7a 45 72 72 3b 0a 20  st char *zErr;. 
9fc0: 20 20 20 7a 45 72 72 20 3d 20 63 6e 74 3d 3d 30     zErr = cnt==0
9fd0: 20 3f 20 22 6e 6f 20 73 75 63 68 20 63 6f 6c 75   ? "no such colu
9fe0: 6d 6e 22 20 3a 20 22 61 6d 62 69 67 75 6f 75 73  mn" : "ambiguous
9ff0: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 22 3b 0a 20   column name";. 
a000: 20 20 20 69 66 28 20 7a 44 62 20 29 7b 0a 20 20     if( zDb ){.  
a010: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
a020: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25 73 3a  Msg(pParse, "%s:
a030: 20 25 73 2e 25 73 2e 25 73 22 2c 20 7a 45 72 72   %s.%s.%s", zErr
a040: 2c 20 7a 44 62 2c 20 7a 54 61 62 2c 20 7a 43 6f  , zDb, zTab, zCo
a050: 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  l);.    }else if
a060: 28 20 7a 54 61 62 20 29 7b 0a 20 20 20 20 20 20  ( zTab ){.      
a070: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
a080: 70 50 61 72 73 65 2c 20 22 25 73 3a 20 25 73 2e  pParse, "%s: %s.
a090: 25 73 22 2c 20 7a 45 72 72 2c 20 7a 54 61 62 2c  %s", zErr, zTab,
a0a0: 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 7d 65 6c 73   zCol);.    }els
a0b0: 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
a0c0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
a0d0: 20 22 25 73 3a 20 25 73 22 2c 20 7a 45 72 72 2c   "%s: %s", zErr,
a0e0: 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 7d 0a 20 20   zCol);.    }.  
a0f0: 20 20 70 54 6f 70 4e 43 2d 3e 6e 45 72 72 2b 2b    pTopNC->nErr++
a100: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61  ;.  }..  /* If a
a110: 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d 20 61 20 74   column from a t
a120: 61 62 6c 65 20 69 6e 20 70 53 72 63 4c 69 73 74  able in pSrcList
a130: 20 69 73 20 72 65 66 65 72 65 6e 63 65 64 2c 20   is referenced, 
a140: 74 68 65 6e 20 72 65 63 6f 72 64 0a 20 20 2a 2a  then record.  **
a150: 20 74 68 69 73 20 66 61 63 74 20 69 6e 20 74 68   this fact in th
a160: 65 20 70 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 63  e pSrcList.a[].c
a170: 6f 6c 55 73 65 64 20 62 69 74 6d 61 73 6b 2e 20  olUsed bitmask. 
a180: 20 43 6f 6c 75 6d 6e 20 30 20 63 61 75 73 65 73   Column 0 causes
a190: 0a 20 20 2a 2a 20 62 69 74 20 30 20 74 6f 20 62  .  ** bit 0 to b
a1a0: 65 20 73 65 74 2e 20 20 43 6f 6c 75 6d 6e 20 31  e set.  Column 1
a1b0: 20 73 65 74 73 20 62 69 74 20 31 2e 20 20 41 6e   sets bit 1.  An
a1c0: 64 20 73 6f 20 66 6f 72 74 68 2e 20 20 49 66 20  d so forth.  If 
a1d0: 74 68 65 0a 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20  the.  ** column 
a1e0: 6e 75 6d 62 65 72 20 69 73 20 67 72 65 61 74 65  number is greate
a1f0: 72 20 74 68 61 6e 20 74 68 65 20 6e 75 6d 62 65  r than the numbe
a200: 72 20 6f 66 20 62 69 74 73 20 69 6e 20 74 68 65  r of bits in the
a210: 20 62 69 74 6d 61 73 6b 0a 20 20 2a 2a 20 74 68   bitmask.  ** th
a220: 65 6e 20 73 65 74 20 74 68 65 20 68 69 67 68 2d  en set the high-
a230: 6f 72 64 65 72 20 62 69 74 20 6f 66 20 74 68 65  order bit of the
a240: 20 62 69 74 6d 61 73 6b 2e 0a 20 20 2a 2f 0a 20   bitmask..  */. 
a250: 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c   if( pExpr->iCol
a260: 75 6d 6e 3e 3d 30 20 26 26 20 70 4d 61 74 63 68  umn>=0 && pMatch
a270: 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e  !=0 ){.    int n
a280: 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d   = pExpr->iColum
a290: 6e 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  n;.    testcase(
a2a0: 20 6e 3d 3d 73 69 7a 65 6f 66 28 42 69 74 6d 61   n==sizeof(Bitma
a2b0: 73 6b 29 2a 38 2d 31 20 29 3b 0a 20 20 20 20 69  sk)*8-1 );.    i
a2c0: 66 28 20 6e 3e 3d 73 69 7a 65 6f 66 28 42 69 74  f( n>=sizeof(Bit
a2d0: 6d 61 73 6b 29 2a 38 20 29 7b 0a 20 20 20 20 20  mask)*8 ){.     
a2e0: 20 6e 20 3d 20 73 69 7a 65 6f 66 28 42 69 74 6d   n = sizeof(Bitm
a2f0: 61 73 6b 29 2a 38 2d 31 3b 0a 20 20 20 20 7d 0a  ask)*8-1;.    }.
a300: 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 61 74      assert( pMat
a310: 63 68 2d 3e 69 43 75 72 73 6f 72 3d 3d 70 45 78  ch->iCursor==pEx
a320: 70 72 2d 3e 69 54 61 62 6c 65 20 29 3b 0a 20 20  pr->iTable );.  
a330: 20 20 70 4d 61 74 63 68 2d 3e 63 6f 6c 55 73 65    pMatch->colUse
a340: 64 20 7c 3d 20 28 28 42 69 74 6d 61 73 6b 29 31  d |= ((Bitmask)1
a350: 29 3c 3c 6e 3b 0a 20 20 7d 0a 0a 6c 6f 6f 6b 75  )<<n;.  }..looku
a360: 70 6e 61 6d 65 5f 65 6e 64 3a 0a 20 20 2f 2a 20  pname_end:.  /* 
a370: 43 6c 65 61 6e 20 75 70 20 61 6e 64 20 72 65 74  Clean up and ret
a380: 75 72 6e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  urn.  */.  sqlit
a390: 65 33 5f 66 72 65 65 28 7a 44 62 29 3b 0a 20 20  e3_free(zDb);.  
a3a0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 61  sqlite3_free(zTa
a3b0: 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  b);.  sqlite3Exp
a3c0: 72 44 65 6c 65 74 65 28 70 45 78 70 72 2d 3e 70  rDelete(pExpr->p
a3d0: 4c 65 66 74 29 3b 0a 20 20 70 45 78 70 72 2d 3e  Left);.  pExpr->
a3e0: 70 4c 65 66 74 20 3d 20 30 3b 0a 20 20 73 71 6c  pLeft = 0;.  sql
a3f0: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70  ite3ExprDelete(p
a400: 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20  Expr->pRight);. 
a410: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20 3d   pExpr->pRight =
a420: 20 30 3b 0a 20 20 70 45 78 70 72 2d 3e 6f 70 20   0;.  pExpr->op 
a430: 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 6c 6f 6f  = TK_COLUMN;.loo
a440: 6b 75 70 6e 61 6d 65 5f 65 6e 64 5f 32 3a 0a 20  kupname_end_2:. 
a450: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43   sqlite3_free(zC
a460: 6f 6c 29 3b 0a 20 20 69 66 28 20 63 6e 74 3d 3d  ol);.  if( cnt==
a470: 31 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  1 ){.    assert(
a480: 20 70 4e 43 21 3d 30 20 29 3b 0a 20 20 20 20 73   pNC!=0 );.    s
a490: 71 6c 69 74 65 33 41 75 74 68 52 65 61 64 28 70  qlite3AuthRead(p
a4a0: 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 70 53  Parse, pExpr, pS
a4b0: 63 68 65 6d 61 2c 20 70 4e 43 2d 3e 70 53 72 63  chema, pNC->pSrc
a4c0: 4c 69 73 74 29 3b 0a 20 20 20 20 69 66 28 20 70  List);.    if( p
a4d0: 4d 61 74 63 68 20 26 26 20 21 70 4d 61 74 63 68  Match && !pMatch
a4e0: 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ->pSelect ){.   
a4f0: 20 20 20 70 45 78 70 72 2d 3e 70 54 61 62 20 3d     pExpr->pTab =
a500: 20 70 4d 61 74 63 68 2d 3e 70 54 61 62 3b 0a 20   pMatch->pTab;. 
a510: 20 20 20 7d 0a 20 20 20 20 2f 2a 20 49 6e 63 72     }.    /* Incr
a520: 65 6d 65 6e 74 20 74 68 65 20 6e 52 65 66 20 76  ement the nRef v
a530: 61 6c 75 65 20 6f 6e 20 61 6c 6c 20 6e 61 6d 65  alue on all name
a540: 20 63 6f 6e 74 65 78 74 73 20 66 72 6f 6d 20 54   contexts from T
a550: 6f 70 4e 43 20 75 70 20 74 6f 0a 20 20 20 20 2a  opNC up to.    *
a560: 2a 20 74 68 65 20 70 6f 69 6e 74 20 77 68 65 72  * the point wher
a570: 65 20 74 68 65 20 6e 61 6d 65 20 6d 61 74 63 68  e the name match
a580: 65 64 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28 3b  ed. */.    for(;
a590: 3b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ;){.      assert
a5a0: 28 20 70 54 6f 70 4e 43 21 3d 30 20 29 3b 0a 20  ( pTopNC!=0 );. 
a5b0: 20 20 20 20 20 70 54 6f 70 4e 43 2d 3e 6e 52 65       pTopNC->nRe
a5c0: 66 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70  f++;.      if( p
a5d0: 54 6f 70 4e 43 3d 3d 70 4e 43 20 29 20 62 72 65  TopNC==pNC ) bre
a5e0: 61 6b 3b 0a 20 20 20 20 20 20 70 54 6f 70 4e 43  ak;.      pTopNC
a5f0: 20 3d 20 70 54 6f 70 4e 43 2d 3e 70 4e 65 78 74   = pTopNC->pNext
a600: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
a610: 72 6e 20 30 3b 0a 20 20 7d 20 65 6c 73 65 20 7b  rn 0;.  } else {
a620: 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
a630: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
a640: 20 72 6f 75 74 69 6e 65 20 69 73 20 64 65 73 69   routine is desi
a650: 67 6e 65 64 20 61 73 20 61 6e 20 78 46 75 6e 63  gned as an xFunc
a660: 20 66 6f 72 20 77 61 6c 6b 45 78 70 72 54 72 65   for walkExprTre
a670: 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 52 65 73 6f 6c  e()..**.** Resol
a680: 76 65 20 73 79 6d 62 6f 6c 69 63 20 6e 61 6d 65  ve symbolic name
a690: 73 20 69 6e 74 6f 20 54 4b 5f 43 4f 4c 55 4d 4e  s into TK_COLUMN
a6a0: 20 6f 70 65 72 61 74 6f 72 73 20 66 6f 72 20 74   operators for t
a6b0: 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 6e 6f  he current.** no
a6c0: 64 65 20 69 6e 20 74 68 65 20 65 78 70 72 65 73  de in the expres
a6d0: 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75  sion tree.  Retu
a6e0: 72 6e 20 30 20 74 6f 20 63 6f 6e 74 69 6e 75 65  rn 0 to continue
a6f0: 20 74 68 65 20 73 65 61 72 63 68 20 64 6f 77 6e   the search down
a700: 0a 2a 2a 20 74 68 65 20 74 72 65 65 20 6f 72 20  .** the tree or 
a710: 32 20 74 6f 20 61 62 6f 72 74 20 74 68 65 20 74  2 to abort the t
a720: 72 65 65 20 77 61 6c 6b 2e 0a 2a 2a 0a 2a 2a 20  ree walk..**.** 
a730: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 73  This routine als
a740: 6f 20 64 6f 65 73 20 65 72 72 6f 72 20 63 68 65  o does error che
a750: 63 6b 69 6e 67 20 61 6e 64 20 6e 61 6d 65 20 72  cking and name r
a760: 65 73 6f 6c 75 74 69 6f 6e 20 66 6f 72 0a 2a 2a  esolution for.**
a770: 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 73 2e   function names.
a780: 20 20 54 68 65 20 6f 70 65 72 61 74 6f 72 20 66    The operator f
a790: 6f 72 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  or aggregate fun
a7a0: 63 74 69 6f 6e 73 20 69 73 20 63 68 61 6e 67 65  ctions is change
a7b0: 64 0a 2a 2a 20 74 6f 20 54 4b 5f 41 47 47 5f 46  d.** to TK_AGG_F
a7c0: 55 4e 43 54 49 4f 4e 2e 0a 2a 2f 0a 73 74 61 74  UNCTION..*/.stat
a7d0: 69 63 20 69 6e 74 20 6e 61 6d 65 52 65 73 6f 6c  ic int nameResol
a7e0: 76 65 72 53 74 65 70 28 76 6f 69 64 20 2a 70 41  verStep(void *pA
a7f0: 72 67 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  rg, Expr *pExpr)
a800: 7b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20  {.  NameContext 
a810: 2a 70 4e 43 20 3d 20 28 4e 61 6d 65 43 6f 6e 74  *pNC = (NameCont
a820: 65 78 74 2a 29 70 41 72 67 3b 0a 20 20 50 61 72  ext*)pArg;.  Par
a830: 73 65 20 2a 70 50 61 72 73 65 3b 0a 0a 20 20 69  se *pParse;..  i
a840: 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65  f( pExpr==0 ) re
a850: 74 75 72 6e 20 31 3b 0a 20 20 61 73 73 65 72 74  turn 1;.  assert
a860: 28 20 70 4e 43 21 3d 30 20 29 3b 0a 20 20 70 50  ( pNC!=0 );.  pP
a870: 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72  arse = pNC->pPar
a880: 73 65 3b 0a 0a 20 20 69 66 28 20 45 78 70 72 48  se;..  if( ExprH
a890: 61 73 41 6e 79 50 72 6f 70 65 72 74 79 28 70 45  asAnyProperty(pE
a8a0: 78 70 72 2c 20 45 50 5f 52 65 73 6f 6c 76 65 64  xpr, EP_Resolved
a8b0: 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  ) ) return 1;.  
a8c0: 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28  ExprSetProperty(
a8d0: 70 45 78 70 72 2c 20 45 50 5f 52 65 73 6f 6c 76  pExpr, EP_Resolv
a8e0: 65 64 29 3b 0a 23 69 66 6e 64 65 66 20 4e 44 45  ed);.#ifndef NDE
a8f0: 42 55 47 0a 20 20 69 66 28 20 70 4e 43 2d 3e 70  BUG.  if( pNC->p
a900: 53 72 63 4c 69 73 74 20 26 26 20 70 4e 43 2d 3e  SrcList && pNC->
a910: 70 53 72 63 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63  pSrcList->nAlloc
a920: 3e 30 20 29 7b 0a 20 20 20 20 53 72 63 4c 69 73  >0 ){.    SrcLis
a930: 74 20 2a 70 53 72 63 4c 69 73 74 20 3d 20 70 4e  t *pSrcList = pN
a940: 43 2d 3e 70 53 72 63 4c 69 73 74 3b 0a 20 20 20  C->pSrcList;.   
a950: 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
a960: 69 3d 30 3b 20 69 3c 70 4e 43 2d 3e 70 53 72 63  i=0; i<pNC->pSrc
a970: 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29  List->nSrc; i++)
a980: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
a990: 70 53 72 63 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69  pSrcList->a[i].i
a9a0: 43 75 72 73 6f 72 3e 3d 30 20 26 26 20 70 53 72  Cursor>=0 && pSr
a9b0: 63 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72  cList->a[i].iCur
a9c0: 73 6f 72 3c 70 50 61 72 73 65 2d 3e 6e 54 61 62  sor<pParse->nTab
a9d0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  );.    }.  }.#en
a9e0: 64 69 66 0a 20 20 73 77 69 74 63 68 28 20 70 45  dif.  switch( pE
a9f0: 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 2f  xpr->op ){.    /
aa00: 2a 20 44 6f 75 62 6c 65 2d 71 75 6f 74 65 64 20  * Double-quoted 
aa10: 73 74 72 69 6e 67 73 20 28 65 78 3a 20 22 61 62  strings (ex: "ab
aa20: 63 22 29 20 61 72 65 20 75 73 65 64 20 61 73 20  c") are used as 
aa30: 69 64 65 6e 74 69 66 69 65 72 73 20 69 66 0a 20  identifiers if. 
aa40: 20 20 20 2a 2a 20 70 6f 73 73 69 62 6c 65 2e 20     ** possible. 
aa50: 20 4f 74 68 65 72 77 69 73 65 20 74 68 65 79 20   Otherwise they 
aa60: 72 65 6d 61 69 6e 20 61 73 20 73 74 72 69 6e 67  remain as string
aa70: 73 2e 20 20 53 69 6e 67 6c 65 2d 71 75 6f 74 65  s.  Single-quote
aa80: 64 0a 20 20 20 20 2a 2a 20 73 74 72 69 6e 67 73  d.    ** strings
aa90: 20 28 65 78 3a 20 27 61 62 63 27 29 20 61 72 65   (ex: 'abc') are
aaa0: 20 61 6c 77 61 79 73 20 73 74 72 69 6e 67 20 6c   always string l
aab0: 69 74 65 72 61 6c 73 2e 0a 20 20 20 20 2a 2f 0a  iterals..    */.
aac0: 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49      case TK_STRI
aad0: 4e 47 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  NG: {.      if( 
aae0: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 5b 30  pExpr->token.z[0
aaf0: 5d 3d 3d 27 5c 27 27 20 29 20 62 72 65 61 6b 3b  ]=='\'' ) break;
ab00: 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74  .      /* Fall t
ab10: 68 72 75 20 69 6e 74 6f 20 74 68 65 20 54 4b 5f  hru into the TK_
ab20: 49 44 20 63 61 73 65 20 69 66 20 74 68 69 73 20  ID case if this 
ab30: 69 73 20 61 20 64 6f 75 62 6c 65 2d 71 75 6f 74  is a double-quot
ab40: 65 64 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 20  ed string */.   
ab50: 20 7d 0a 20 20 20 20 2f 2a 20 41 20 6c 6f 6e 65   }.    /* A lone
ab60: 20 69 64 65 6e 74 69 66 69 65 72 20 69 73 20 74   identifier is t
ab70: 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 63 6f 6c  he name of a col
ab80: 75 6d 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  umn..    */.    
ab90: 63 61 73 65 20 54 4b 5f 49 44 3a 20 7b 0a 20 20  case TK_ID: {.  
aba0: 20 20 20 20 6c 6f 6f 6b 75 70 4e 61 6d 65 28 70      lookupName(p
abb0: 50 61 72 73 65 2c 20 30 2c 20 30 2c 20 26 70 45  Parse, 0, 0, &pE
abc0: 78 70 72 2d 3e 74 6f 6b 65 6e 2c 20 70 4e 43 2c  xpr->token, pNC,
abd0: 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 72   pExpr);.      r
abe0: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
abf0: 20 0a 20 20 20 20 2f 2a 20 41 20 74 61 62 6c 65   .    /* A table
ac00: 20 6e 61 6d 65 20 61 6e 64 20 63 6f 6c 75 6d 6e   name and column
ac10: 20 6e 61 6d 65 3a 20 20 20 20 20 49 44 2e 49 44   name:     ID.ID
ac20: 0a 20 20 20 20 2a 2a 20 4f 72 20 61 20 64 61 74  .    ** Or a dat
ac30: 61 62 61 73 65 2c 20 74 61 62 6c 65 20 61 6e 64  abase, table and
ac40: 20 63 6f 6c 75 6d 6e 3a 20 20 49 44 2e 49 44 2e   column:  ID.ID.
ac50: 49 44 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  ID.    */.    ca
ac60: 73 65 20 54 4b 5f 44 4f 54 3a 20 7b 0a 20 20 20  se TK_DOT: {.   
ac70: 20 20 20 54 6f 6b 65 6e 20 2a 70 43 6f 6c 75 6d     Token *pColum
ac80: 6e 3b 0a 20 20 20 20 20 20 54 6f 6b 65 6e 20 2a  n;.      Token *
ac90: 70 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 54 6f  pTable;.      To
aca0: 6b 65 6e 20 2a 70 44 62 3b 0a 20 20 20 20 20 20  ken *pDb;.      
acb0: 45 78 70 72 20 2a 70 52 69 67 68 74 3b 0a 0a 20  Expr *pRight;.. 
acc0: 20 20 20 20 20 2f 2a 20 69 66 28 20 70 53 72 63       /* if( pSrc
acd0: 4c 69 73 74 3d 3d 30 20 29 20 62 72 65 61 6b 3b  List==0 ) break;
ace0: 20 2a 2f 0a 20 20 20 20 20 20 70 52 69 67 68 74   */.      pRight
acf0: 20 3d 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74   = pExpr->pRight
ad00: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 52 69 67  ;.      if( pRig
ad10: 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 7b  ht->op==TK_ID ){
ad20: 0a 20 20 20 20 20 20 20 20 70 44 62 20 3d 20 30  .        pDb = 0
ad30: 3b 0a 20 20 20 20 20 20 20 20 70 54 61 62 6c 65  ;.        pTable
ad40: 20 3d 20 26 70 45 78 70 72 2d 3e 70 4c 65 66 74   = &pExpr->pLeft
ad50: 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20  ->token;.       
ad60: 20 70 43 6f 6c 75 6d 6e 20 3d 20 26 70 52 69 67   pColumn = &pRig
ad70: 68 74 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20  ht->token;.     
ad80: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
ad90: 61 73 73 65 72 74 28 20 70 52 69 67 68 74 2d 3e  assert( pRight->
ada0: 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29 3b 0a 20 20  op==TK_DOT );.  
adb0: 20 20 20 20 20 20 70 44 62 20 3d 20 26 70 45 78        pDb = &pEx
adc0: 70 72 2d 3e 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e  pr->pLeft->token
add0: 3b 0a 20 20 20 20 20 20 20 20 70 54 61 62 6c 65  ;.        pTable
ade0: 20 3d 20 26 70 52 69 67 68 74 2d 3e 70 4c 65 66   = &pRight->pLef
adf0: 74 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20  t->token;.      
ae00: 20 20 70 43 6f 6c 75 6d 6e 20 3d 20 26 70 52 69    pColumn = &pRi
ae10: 67 68 74 2d 3e 70 52 69 67 68 74 2d 3e 74 6f 6b  ght->pRight->tok
ae20: 65 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  en;.      }.    
ae30: 20 20 6c 6f 6f 6b 75 70 4e 61 6d 65 28 70 50 61    lookupName(pPa
ae40: 72 73 65 2c 20 70 44 62 2c 20 70 54 61 62 6c 65  rse, pDb, pTable
ae50: 2c 20 70 43 6f 6c 75 6d 6e 2c 20 70 4e 43 2c 20  , pColumn, pNC, 
ae60: 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 72 65  pExpr);.      re
ae70: 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 0a 20  turn 1;.    }.. 
ae80: 20 20 20 2f 2a 20 52 65 73 6f 6c 76 65 20 66 75     /* Resolve fu
ae90: 6e 63 74 69 6f 6e 20 6e 61 6d 65 73 0a 20 20 20  nction names.   
aea0: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   */.    case TK_
aeb0: 43 4f 4e 53 54 5f 46 55 4e 43 3a 0a 20 20 20 20  CONST_FUNC:.    
aec0: 63 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e  case TK_FUNCTION
aed0: 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72 4c 69  : {.      ExprLi
aee0: 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 45 78 70  st *pList = pExp
aef0: 72 2d 3e 70 4c 69 73 74 3b 20 20 20 20 2f 2a 20  r->pList;    /* 
af00: 54 68 65 20 61 72 67 75 6d 65 6e 74 20 6c 69 73  The argument lis
af10: 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e  t */.      int n
af20: 20 3d 20 70 4c 69 73 74 20 3f 20 70 4c 69 73 74   = pList ? pList
af30: 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 20 20 2f 2a  ->nExpr : 0;  /*
af40: 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
af50: 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ents */.      in
af60: 74 20 6e 6f 5f 73 75 63 68 5f 66 75 6e 63 20 3d  t no_such_func =
af70: 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 54 72 75   0;       /* Tru
af80: 65 20 69 66 20 6e 6f 20 73 75 63 68 20 66 75 6e  e if no such fun
af90: 63 74 69 6f 6e 20 65 78 69 73 74 73 20 2a 2f 0a  ction exists */.
afa0: 20 20 20 20 20 20 69 6e 74 20 77 72 6f 6e 67 5f        int wrong_
afb0: 6e 75 6d 5f 61 72 67 73 20 3d 20 30 3b 20 20 20  num_args = 0;   
afc0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 77 72 6f    /* True if wro
afd0: 6e 67 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67  ng number of arg
afe0: 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20  uments */.      
aff0: 69 6e 74 20 69 73 5f 61 67 67 20 3d 20 30 3b 20  int is_agg = 0; 
b000: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
b010: 72 75 65 20 69 66 20 69 73 20 61 6e 20 61 67 67  rue if is an agg
b020: 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20  regate function 
b030: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  */.      int i;.
b040: 20 20 20 20 20 20 69 6e 74 20 61 75 74 68 3b 20        int auth; 
b050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b060: 20 20 2f 2a 20 41 75 74 68 6f 72 69 7a 61 74 69    /* Authorizati
b070: 6f 6e 20 74 6f 20 75 73 65 20 74 68 65 20 66 75  on to use the fu
b080: 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  nction */.      
b090: 69 6e 74 20 6e 49 64 3b 20 20 20 20 20 20 20 20  int nId;        
b0a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
b0b0: 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63 74  umber of charact
b0c0: 65 72 73 20 69 6e 20 66 75 6e 63 74 69 6f 6e 20  ers in function 
b0d0: 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 63 6f  name */.      co
b0e0: 6e 73 74 20 63 68 61 72 20 2a 7a 49 64 3b 20 20  nst char *zId;  
b0f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
b100: 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 2e 20   function name. 
b110: 2a 2f 0a 20 20 20 20 20 20 46 75 6e 63 44 65 66  */.      FuncDef
b120: 20 2a 70 44 65 66 3b 20 20 20 20 20 20 20 20 20   *pDef;         
b130: 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74       /* Informat
b140: 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 66 75  ion about the fu
b150: 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  nction */.      
b160: 69 6e 74 20 65 6e 63 20 3d 20 45 4e 43 28 70 50  int enc = ENC(pP
b170: 61 72 73 65 2d 3e 64 62 29 3b 20 20 2f 2a 20 54  arse->db);  /* T
b180: 68 65 20 64 61 74 61 62 61 73 65 20 65 6e 63 6f  he database enco
b190: 64 69 6e 67 20 2a 2f 0a 0a 20 20 20 20 20 20 7a  ding */..      z
b1a0: 49 64 20 3d 20 28 63 68 61 72 2a 29 70 45 78 70  Id = (char*)pExp
b1b0: 72 2d 3e 74 6f 6b 65 6e 2e 7a 3b 0a 20 20 20 20  r->token.z;.    
b1c0: 20 20 6e 49 64 20 3d 20 70 45 78 70 72 2d 3e 74    nId = pExpr->t
b1d0: 6f 6b 65 6e 2e 6e 3b 0a 20 20 20 20 20 20 70 44  oken.n;.      pD
b1e0: 65 66 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ef = sqlite3Find
b1f0: 46 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2d  Function(pParse-
b200: 3e 64 62 2c 20 7a 49 64 2c 20 6e 49 64 2c 20 6e  >db, zId, nId, n
b210: 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20  , enc, 0);.     
b220: 20 69 66 28 20 70 44 65 66 3d 3d 30 20 29 7b 0a   if( pDef==0 ){.
b230: 20 20 20 20 20 20 20 20 70 44 65 66 20 3d 20 73          pDef = s
b240: 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69  qlite3FindFuncti
b250: 6f 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a  on(pParse->db, z
b260: 49 64 2c 20 6e 49 64 2c 20 2d 31 2c 20 65 6e 63  Id, nId, -1, enc
b270: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 0);.        if
b280: 28 20 70 44 65 66 3d 3d 30 20 29 7b 0a 20 20 20  ( pDef==0 ){.   
b290: 20 20 20 20 20 20 20 6e 6f 5f 73 75 63 68 5f 66         no_such_f
b2a0: 75 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  unc = 1;.       
b2b0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
b2c0: 20 20 77 72 6f 6e 67 5f 6e 75 6d 5f 61 72 67 73    wrong_num_args
b2d0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 1;.        }.
b2e0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
b2f0: 20 20 20 20 20 69 73 5f 61 67 67 20 3d 20 70 44       is_agg = pD
b300: 65 66 2d 3e 78 46 75 6e 63 3d 3d 30 3b 0a 20 20  ef->xFunc==0;.  
b310: 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
b320: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52  LITE_OMIT_AUTHOR
b330: 49 5a 41 54 49 4f 4e 0a 20 20 20 20 20 20 69 66  IZATION.      if
b340: 28 20 70 44 65 66 20 29 7b 0a 20 20 20 20 20 20  ( pDef ){.      
b350: 20 20 61 75 74 68 20 3d 20 73 71 6c 69 74 65 33    auth = sqlite3
b360: 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
b370: 2c 20 53 51 4c 49 54 45 5f 46 55 4e 43 54 49 4f  , SQLITE_FUNCTIO
b380: 4e 2c 20 30 2c 20 70 44 65 66 2d 3e 7a 4e 61 6d  N, 0, pDef->zNam
b390: 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69  e, 0);.        i
b3a0: 66 28 20 61 75 74 68 21 3d 53 51 4c 49 54 45 5f  f( auth!=SQLITE_
b3b0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
b3c0: 69 66 28 20 61 75 74 68 3d 3d 53 51 4c 49 54 45  if( auth==SQLITE
b3d0: 5f 44 45 4e 59 20 29 7b 0a 20 20 20 20 20 20 20  _DENY ){.       
b3e0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
b3f0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f  rMsg(pParse, "no
b400: 74 20 61 75 74 68 6f 72 69 7a 65 64 20 74 6f 20  t authorized to 
b410: 75 73 65 20 66 75 6e 63 74 69 6f 6e 3a 20 25 73  use function: %s
b420: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
b430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b440: 20 20 20 20 20 20 20 70 44 65 66 2d 3e 7a 4e 61         pDef->zNa
b450: 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  me);.           
b460: 20 70 4e 43 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20   pNC->nErr++;.  
b470: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
b480: 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20      pExpr->op = 
b490: 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 20  TK_NULL;.       
b4a0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
b4b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23       }.      }.#
b4c0: 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28 20  endif.      if( 
b4d0: 69 73 5f 61 67 67 20 26 26 20 21 70 4e 43 2d 3e  is_agg && !pNC->
b4e0: 61 6c 6c 6f 77 41 67 67 20 29 7b 0a 20 20 20 20  allowAgg ){.    
b4f0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
b500: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6d 69 73  Msg(pParse, "mis
b510: 75 73 65 20 6f 66 20 61 67 67 72 65 67 61 74 65  use of aggregate
b520: 20 66 75 6e 63 74 69 6f 6e 20 25 2e 2a 73 28 29   function %.*s()
b530: 22 2c 20 6e 49 64 2c 7a 49 64 29 3b 0a 20 20 20  ", nId,zId);.   
b540: 20 20 20 20 20 70 4e 43 2d 3e 6e 45 72 72 2b 2b       pNC->nErr++
b550: 3b 0a 20 20 20 20 20 20 20 20 69 73 5f 61 67 67  ;.        is_agg
b560: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 0;.      }els
b570: 65 20 69 66 28 20 6e 6f 5f 73 75 63 68 5f 66 75  e if( no_such_fu
b580: 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  nc ){.        sq
b590: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
b5a0: 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 66  arse, "no such f
b5b0: 75 6e 63 74 69 6f 6e 3a 20 25 2e 2a 73 22 2c 20  unction: %.*s", 
b5c0: 6e 49 64 2c 20 7a 49 64 29 3b 0a 20 20 20 20 20  nId, zId);.     
b5d0: 20 20 20 70 4e 43 2d 3e 6e 45 72 72 2b 2b 3b 0a     pNC->nErr++;.
b5e0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
b5f0: 77 72 6f 6e 67 5f 6e 75 6d 5f 61 72 67 73 20 29  wrong_num_args )
b600: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
b610: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
b620: 2c 22 77 72 6f 6e 67 20 6e 75 6d 62 65 72 20 6f  ,"wrong number o
b630: 66 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 66  f arguments to f
b640: 75 6e 63 74 69 6f 6e 20 25 2e 2a 73 28 29 22 2c  unction %.*s()",
b650: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 49  .             nI
b660: 64 2c 20 7a 49 64 29 3b 0a 20 20 20 20 20 20 20  d, zId);.       
b670: 20 70 4e 43 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20   pNC->nErr++;.  
b680: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
b690: 69 73 5f 61 67 67 20 29 7b 0a 20 20 20 20 20 20  is_agg ){.      
b6a0: 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b    pExpr->op = TK
b6b0: 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3b 0a 20  _AGG_FUNCTION;. 
b6c0: 20 20 20 20 20 20 20 70 4e 43 2d 3e 68 61 73 41         pNC->hasA
b6d0: 67 67 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  gg = 1;.      }.
b6e0: 20 20 20 20 20 20 69 66 28 20 69 73 5f 61 67 67        if( is_agg
b6f0: 20 29 20 70 4e 43 2d 3e 61 6c 6c 6f 77 41 67 67   ) pNC->allowAgg
b700: 20 3d 20 30 3b 0a 20 20 20 20 20 20 66 6f 72 28   = 0;.      for(
b710: 69 3d 30 3b 20 70 4e 43 2d 3e 6e 45 72 72 3d 3d  i=0; pNC->nErr==
b720: 30 20 26 26 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a  0 && i<n; i++){.
b730: 20 20 20 20 20 20 20 20 77 61 6c 6b 45 78 70 72          walkExpr
b740: 54 72 65 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d  Tree(pList->a[i]
b750: 2e 70 45 78 70 72 2c 20 6e 61 6d 65 52 65 73 6f  .pExpr, nameReso
b760: 6c 76 65 72 53 74 65 70 2c 20 70 4e 43 29 3b 0a  lverStep, pNC);.
b770: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
b780: 28 20 69 73 5f 61 67 67 20 29 20 70 4e 43 2d 3e  ( is_agg ) pNC->
b790: 61 6c 6c 6f 77 41 67 67 20 3d 20 31 3b 0a 20 20  allowAgg = 1;.  
b7a0: 20 20 20 20 2f 2a 20 46 49 58 20 4d 45 3a 20 20      /* FIX ME:  
b7b0: 43 6f 6d 70 75 74 65 20 70 45 78 70 72 2d 3e 61  Compute pExpr->a
b7c0: 66 66 69 6e 69 74 79 20 62 61 73 65 64 20 6f 6e  ffinity based on
b7d0: 20 74 68 65 20 65 78 70 65 63 74 65 64 20 72 65   the expected re
b7e0: 74 75 72 6e 0a 20 20 20 20 20 20 2a 2a 20 74 79  turn.      ** ty
b7f0: 70 65 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69  pe of the functi
b800: 6f 6e 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  on .      */.   
b810: 20 20 20 72 65 74 75 72 6e 20 69 73 5f 61 67 67     return is_agg
b820: 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
b830: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
b840: 55 45 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b  UERY.    case TK
b850: 5f 53 45 4c 45 43 54 3a 0a 20 20 20 20 63 61 73  _SELECT:.    cas
b860: 65 20 54 4b 5f 45 58 49 53 54 53 3a 0a 23 65 6e  e TK_EXISTS:.#en
b870: 64 69 66 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  dif.    case TK_
b880: 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  IN: {.      if( 
b890: 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 20 29  pExpr->pSelect )
b8a0: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 52  {.        int nR
b8b0: 65 66 20 3d 20 70 4e 43 2d 3e 6e 52 65 66 3b 0a  ef = pNC->nRef;.
b8c0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
b8d0: 4d 49 54 5f 43 48 45 43 4b 0a 20 20 20 20 20 20  MIT_CHECK.      
b8e0: 20 20 69 66 28 20 70 4e 43 2d 3e 69 73 43 68 65    if( pNC->isChe
b8f0: 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ck ){.          
b900: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
b910: 70 50 61 72 73 65 2c 22 73 75 62 71 75 65 72 69  pParse,"subqueri
b920: 65 73 20 70 72 6f 68 69 62 69 74 65 64 20 69 6e  es prohibited in
b930: 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e   CHECK constrain
b940: 74 73 22 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ts");.        }.
b950: 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 73  #endif.        s
b960: 71 6c 69 74 65 33 53 65 6c 65 63 74 52 65 73 6f  qlite3SelectReso
b970: 6c 76 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  lve(pParse, pExp
b980: 72 2d 3e 70 53 65 6c 65 63 74 2c 20 70 4e 43 29  r->pSelect, pNC)
b990: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
b9a0: 28 20 70 4e 43 2d 3e 6e 52 65 66 3e 3d 6e 52 65  ( pNC->nRef>=nRe
b9b0: 66 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  f );.        if(
b9c0: 20 6e 52 65 66 21 3d 70 4e 43 2d 3e 6e 52 65 66   nRef!=pNC->nRef
b9d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45 78   ){.          Ex
b9e0: 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 45  prSetProperty(pE
b9f0: 78 70 72 2c 20 45 50 5f 56 61 72 53 65 6c 65 63  xpr, EP_VarSelec
ba00: 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  t);.        }.  
ba10: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
ba20: 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  k;.    }.#ifndef
ba30: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45   SQLITE_OMIT_CHE
ba40: 43 4b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 56  CK.    case TK_V
ba50: 41 52 49 41 42 4c 45 3a 20 7b 0a 20 20 20 20 20  ARIABLE: {.     
ba60: 20 69 66 28 20 70 4e 43 2d 3e 69 73 43 68 65 63   if( pNC->isChec
ba70: 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  k ){.        sql
ba80: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
ba90: 72 73 65 2c 22 70 61 72 61 6d 65 74 65 72 73 20  rse,"parameters 
baa0: 70 72 6f 68 69 62 69 74 65 64 20 69 6e 20 43 48  prohibited in CH
bab0: 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 73 22  ECK constraints"
bac0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
bad0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
bae0: 6e 64 69 66 0a 20 20 7d 0a 20 20 72 65 74 75 72  ndif.  }.  retur
baf0: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  n 0;.}../*.** Th
bb00: 69 73 20 72 6f 75 74 69 6e 65 20 77 61 6c 6b 73  is routine walks
bb10: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74   an expression t
bb20: 72 65 65 20 61 6e 64 20 72 65 73 6f 6c 76 65 73  ree and resolves
bb30: 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 0a 2a   references to.*
bb40: 2a 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 2e  * table columns.
bb50: 20 20 4e 6f 64 65 73 20 6f 66 20 74 68 65 20 66    Nodes of the f
bb60: 6f 72 6d 20 49 44 2e 49 44 20 6f 72 20 49 44 20  orm ID.ID or ID 
bb70: 72 65 73 6f 6c 76 65 20 69 6e 74 6f 20 61 6e 0a  resolve into an.
bb80: 2a 2a 20 69 6e 64 65 78 20 74 6f 20 74 68 65 20  ** index to the 
bb90: 74 61 62 6c 65 20 69 6e 20 74 68 65 20 74 61 62  table in the tab
bba0: 6c 65 20 6c 69 73 74 20 61 6e 64 20 61 20 63 6f  le list and a co
bbb0: 6c 75 6d 6e 20 6f 66 66 73 65 74 2e 20 20 54 68  lumn offset.  Th
bbc0: 65 20 0a 2a 2a 20 45 78 70 72 2e 6f 70 63 6f 64  e .** Expr.opcod
bbd0: 65 20 66 6f 72 20 73 75 63 68 20 6e 6f 64 65 73  e for such nodes
bbe0: 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f 20 54   is changed to T
bbf0: 4b 5f 43 4f 4c 55 4d 4e 2e 20 20 54 68 65 20 45  K_COLUMN.  The E
bc00: 78 70 72 2e 69 54 61 62 6c 65 0a 2a 2a 20 76 61  xpr.iTable.** va
bc10: 6c 75 65 20 69 73 20 63 68 61 6e 67 65 64 20 74  lue is changed t
bc20: 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74  o the index of t
bc30: 68 65 20 72 65 66 65 72 65 6e 63 65 64 20 74 61  he referenced ta
bc40: 62 6c 65 20 69 6e 20 70 54 61 62 4c 69 73 74 0a  ble in pTabList.
bc50: 2a 2a 20 70 6c 75 73 20 74 68 65 20 22 62 61 73  ** plus the "bas
bc60: 65 22 20 76 61 6c 75 65 2e 20 20 54 68 65 20 62  e" value.  The b
bc70: 61 73 65 20 76 61 6c 75 65 20 77 69 6c 6c 20 75  ase value will u
bc80: 6c 74 69 6d 61 74 65 6c 79 20 62 65 63 6f 6d 65  ltimately become
bc90: 20 74 68 65 0a 2a 2a 20 56 44 42 45 20 63 75 72   the.** VDBE cur
bca0: 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 61  sor number for a
bcb0: 20 63 75 72 73 6f 72 20 74 68 61 74 20 69 73 20   cursor that is 
bcc0: 70 6f 69 6e 74 69 6e 67 20 69 6e 74 6f 20 74 68  pointing into th
bcd0: 65 20 72 65 66 65 72 65 6e 63 65 64 0a 2a 2a 20  e referenced.** 
bce0: 74 61 62 6c 65 2e 20 20 54 68 65 20 45 78 70 72  table.  The Expr
bcf0: 2e 69 43 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69  .iColumn value i
bd00: 73 20 63 68 61 6e 67 65 64 20 74 6f 20 74 68 65  s changed to the
bd10: 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 63 6f   index of the co
bd20: 6c 75 6d 6e 20 0a 2a 2a 20 6f 66 20 74 68 65 20  lumn .** of the 
bd30: 72 65 66 65 72 65 6e 63 65 64 20 74 61 62 6c 65  referenced table
bd40: 2e 20 20 54 68 65 20 45 78 70 72 2e 69 43 6f 6c  .  The Expr.iCol
bd50: 75 6d 6e 20 76 61 6c 75 65 20 66 6f 72 20 74 68  umn value for th
bd60: 65 20 73 70 65 63 69 61 6c 0a 2a 2a 20 52 4f 57  e special.** ROW
bd70: 49 44 20 63 6f 6c 75 6d 6e 20 69 73 20 2d 31 2e  ID column is -1.
bd80: 20 20 41 6e 79 20 49 4e 54 45 47 45 52 20 50 52    Any INTEGER PR
bd90: 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e  IMARY KEY column
bda0: 20 69 73 20 74 72 69 65 64 20 61 73 20 61 6e 0a   is tried as an.
bdb0: 2a 2a 20 61 6c 69 61 73 20 66 6f 72 20 52 4f 57  ** alias for ROW
bdc0: 49 44 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 72  ID..**.** Also r
bdd0: 65 73 6f 6c 76 65 20 66 75 6e 63 74 69 6f 6e 20  esolve function 
bde0: 6e 61 6d 65 73 20 61 6e 64 20 63 68 65 63 6b 20  names and check 
bdf0: 74 68 65 20 66 75 6e 63 74 69 6f 6e 73 20 66 6f  the functions fo
be00: 72 20 70 72 6f 70 65 72 0a 2a 2a 20 75 73 61 67  r proper.** usag
be10: 65 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 61 6c  e.  Make sure al
be20: 6c 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 73  l function names
be30: 20 61 72 65 20 72 65 63 6f 67 6e 69 7a 65 64 20   are recognized 
be40: 61 6e 64 20 61 6c 6c 20 66 75 6e 63 74 69 6f 6e  and all function
be50: 73 0a 2a 2a 20 68 61 76 65 20 74 68 65 20 63 6f  s.** have the co
be60: 72 72 65 63 74 20 6e 75 6d 62 65 72 20 6f 66 20  rrect number of 
be70: 61 72 67 75 6d 65 6e 74 73 2e 20 20 4c 65 61 76  arguments.  Leav
be80: 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  e an error messa
be90: 67 65 0a 2a 2a 20 69 6e 20 70 50 61 72 73 65 2d  ge.** in pParse-
bea0: 3e 7a 45 72 72 4d 73 67 20 69 66 20 61 6e 79 74  >zErrMsg if anyt
beb0: 68 69 6e 67 20 69 73 20 61 6d 69 73 73 2e 20 20  hing is amiss.  
bec0: 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
bed0: 72 20 6f 66 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a  r of errors..**.
bee0: 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73  ** If the expres
bef0: 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 61 67  sion contains ag
bf00: 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
bf10: 73 20 74 68 65 6e 20 73 65 74 20 74 68 65 20 45  s then set the E
bf20: 50 5f 41 67 67 0a 2a 2a 20 70 72 6f 70 65 72 74  P_Agg.** propert
bf30: 79 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73  y on the express
bf40: 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ion..*/.int sqli
bf50: 74 65 33 45 78 70 72 52 65 73 6f 6c 76 65 4e 61  te3ExprResolveNa
bf60: 6d 65 73 28 20 0a 20 20 4e 61 6d 65 43 6f 6e 74  mes( .  NameCont
bf70: 65 78 74 20 2a 70 4e 43 2c 20 20 20 20 20 20 20  ext *pNC,       
bf80: 2f 2a 20 4e 61 6d 65 73 70 61 63 65 20 74 6f 20  /* Namespace to 
bf90: 72 65 73 6f 6c 76 65 20 65 78 70 72 65 73 73 69  resolve expressi
bfa0: 6f 6e 73 20 69 6e 2e 20 2a 2f 0a 20 20 45 78 70  ons in. */.  Exp
bfb0: 72 20 2a 70 45 78 70 72 20 20 20 20 20 20 20 20  r *pExpr        
bfc0: 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72       /* The expr
bfd0: 65 73 73 69 6f 6e 20 74 6f 20 62 65 20 61 6e 61  ession to be ana
bfe0: 6c 79 7a 65 64 2e 20 2a 2f 0a 29 7b 0a 20 20 69  lyzed. */.){.  i
bff0: 6e 74 20 73 61 76 65 64 48 61 73 41 67 67 3b 0a  nt savedHasAgg;.
c000: 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20  .  if( pExpr==0 
c010: 29 20 72 65 74 75 72 6e 20 30 3b 0a 23 69 66 20  ) return 0;.#if 
c020: 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f  SQLITE_MAX_EXPR_
c030: 44 45 50 54 48 3e 30 0a 20 20 7b 0a 20 20 20 20  DEPTH>0.  {.    
c040: 69 6e 74 20 6d 78 44 65 70 74 68 20 3d 20 70 4e  int mxDepth = pN
c050: 43 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61  C->pParse->db->a
c060: 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
c070: 49 54 5f 45 58 50 52 5f 44 45 50 54 48 5d 3b 0a  IT_EXPR_DEPTH];.
c080: 20 20 20 20 69 66 28 20 28 70 45 78 70 72 2d 3e      if( (pExpr->
c090: 6e 48 65 69 67 68 74 2b 70 4e 43 2d 3e 70 50 61  nHeight+pNC->pPa
c0a0: 72 73 65 2d 3e 6e 48 65 69 67 68 74 29 3e 6d 78  rse->nHeight)>mx
c0b0: 44 65 70 74 68 20 29 7b 0a 20 20 20 20 20 20 73  Depth ){.      s
c0c0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
c0d0: 4e 43 2d 3e 70 50 61 72 73 65 2c 20 0a 20 20 20  NC->pParse, .   
c0e0: 20 20 20 20 20 20 22 45 78 70 72 65 73 73 69 6f        "Expressio
c0f0: 6e 20 74 72 65 65 20 69 73 20 74 6f 6f 20 6c 61  n tree is too la
c100: 72 67 65 20 28 6d 61 78 69 6d 75 6d 20 64 65 70  rge (maximum dep
c110: 74 68 20 25 64 29 22 2c 20 6d 78 44 65 70 74 68  th %d)", mxDepth
c120: 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
c130: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
c140: 20 20 20 20 70 4e 43 2d 3e 70 50 61 72 73 65 2d      pNC->pParse-
c150: 3e 6e 48 65 69 67 68 74 20 2b 3d 20 70 45 78 70  >nHeight += pExp
c160: 72 2d 3e 6e 48 65 69 67 68 74 3b 0a 20 20 7d 0a  r->nHeight;.  }.
c170: 23 65 6e 64 69 66 0a 20 20 73 61 76 65 64 48 61  #endif.  savedHa
c180: 73 41 67 67 20 3d 20 70 4e 43 2d 3e 68 61 73 41  sAgg = pNC->hasA
c190: 67 67 3b 0a 20 20 70 4e 43 2d 3e 68 61 73 41 67  gg;.  pNC->hasAg
c1a0: 67 20 3d 20 30 3b 0a 20 20 77 61 6c 6b 45 78 70  g = 0;.  walkExp
c1b0: 72 54 72 65 65 28 70 45 78 70 72 2c 20 6e 61 6d  rTree(pExpr, nam
c1c0: 65 52 65 73 6f 6c 76 65 72 53 74 65 70 2c 20 70  eResolverStep, p
c1d0: 4e 43 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f  NC);.#if SQLITE_
c1e0: 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48 3e 30  MAX_EXPR_DEPTH>0
c1f0: 0a 20 20 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e  .  pNC->pParse->
c200: 6e 48 65 69 67 68 74 20 2d 3d 20 70 45 78 70 72  nHeight -= pExpr
c210: 2d 3e 6e 48 65 69 67 68 74 3b 0a 23 65 6e 64 69  ->nHeight;.#endi
c220: 66 0a 20 20 69 66 28 20 70 4e 43 2d 3e 6e 45 72  f.  if( pNC->nEr
c230: 72 3e 30 20 29 7b 0a 20 20 20 20 45 78 70 72 53  r>0 ){.    ExprS
c240: 65 74 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  etProperty(pExpr
c250: 2c 20 45 50 5f 45 72 72 6f 72 29 3b 0a 20 20 7d  , EP_Error);.  }
c260: 0a 20 20 69 66 28 20 70 4e 43 2d 3e 68 61 73 41  .  if( pNC->hasA
c270: 67 67 20 29 7b 0a 20 20 20 20 45 78 70 72 53 65  gg ){.    ExprSe
c280: 74 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  tProperty(pExpr,
c290: 20 45 50 5f 41 67 67 29 3b 0a 20 20 7d 65 6c 73   EP_Agg);.  }els
c2a0: 65 20 69 66 28 20 73 61 76 65 64 48 61 73 41 67  e if( savedHasAg
c2b0: 67 20 29 7b 0a 20 20 20 20 70 4e 43 2d 3e 68 61  g ){.    pNC->ha
c2c0: 73 41 67 67 20 3d 20 31 3b 0a 20 20 7d 0a 20 20  sAgg = 1;.  }.  
c2d0: 72 65 74 75 72 6e 20 45 78 70 72 48 61 73 50 72  return ExprHasPr
c2e0: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
c2f0: 5f 45 72 72 6f 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  _Error);.}../*.*
c300: 2a 20 41 20 70 6f 69 6e 74 65 72 20 69 6e 73 74  * A pointer inst
c310: 61 6e 63 65 20 6f 66 20 74 68 69 73 20 73 74 72  ance of this str
c320: 75 63 74 75 72 65 20 69 73 20 75 73 65 64 20 74  ucture is used t
c330: 6f 20 70 61 73 73 20 69 6e 66 6f 72 6d 61 74 69  o pass informati
c340: 6f 6e 0a 2a 2a 20 74 68 72 6f 75 67 68 20 77 61  on.** through wa
c350: 6c 6b 45 78 70 72 54 72 65 65 20 69 6e 74 6f 20  lkExprTree into 
c360: 63 6f 64 65 53 75 62 71 75 65 72 79 53 74 65 70  codeSubqueryStep
c370: 28 29 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  ()..*/.typedef s
c380: 74 72 75 63 74 20 51 75 65 72 79 43 6f 64 65 72  truct QueryCoder
c390: 20 51 75 65 72 79 43 6f 64 65 72 3b 0a 73 74 72   QueryCoder;.str
c3a0: 75 63 74 20 51 75 65 72 79 43 6f 64 65 72 20 7b  uct QueryCoder {
c3b0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
c3c0: 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70  ;       /* The p
c3d0: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
c3e0: 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20  /.  NameContext 
c3f0: 2a 70 4e 43 3b 20 20 20 20 2f 2a 20 4e 61 6d 65  *pNC;    /* Name
c400: 73 70 61 63 65 20 6f 66 20 66 69 72 73 74 20 65  space of first e
c410: 6e 63 6c 6f 73 69 6e 67 20 71 75 65 72 79 20 2a  nclosing query *
c420: 2f 0a 7d 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  /.};..#ifdef SQL
c430: 49 54 45 5f 54 45 53 54 0a 20 20 69 6e 74 20 73  ITE_TEST.  int s
c440: 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 69 6e  qlite3_enable_in
c450: 5f 6f 70 74 20 3d 20 31 3b 0a 23 65 6c 73 65 0a  _opt = 1;.#else.
c460: 20 20 23 64 65 66 69 6e 65 20 73 71 6c 69 74 65    #define sqlite
c470: 33 5f 65 6e 61 62 6c 65 5f 69 6e 5f 6f 70 74 20  3_enable_in_opt 
c480: 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  1.#endif../*.** 
c490: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
c4a0: 20 75 73 65 64 20 62 79 20 74 68 65 20 69 6d 70   used by the imp
c4b0: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
c4c0: 68 65 20 49 4e 20 28 2e 2e 2e 29 20 6f 70 65 72  he IN (...) oper
c4d0: 61 74 6f 72 2e 0a 2a 2a 20 49 74 27 73 20 6a 6f  ator..** It's jo
c4e0: 62 20 69 73 20 74 6f 20 66 69 6e 64 20 6f 72 20  b is to find or 
c4f0: 63 72 65 61 74 65 20 61 20 62 2d 74 72 65 65 20  create a b-tree 
c500: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 6d  structure that m
c510: 61 79 20 62 65 20 75 73 65 64 0a 2a 2a 20 65 69  ay be used.** ei
c520: 74 68 65 72 20 74 6f 20 74 65 73 74 20 66 6f 72  ther to test for
c530: 20 6d 65 6d 62 65 72 73 68 69 70 20 6f 66 20 74   membership of t
c540: 68 65 20 28 2e 2e 2e 29 20 73 65 74 20 6f 72 20  he (...) set or 
c550: 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
c560: 67 68 0a 2a 2a 20 69 74 73 20 6d 65 6d 62 65 72  gh.** its member
c570: 73 2c 20 73 6b 69 70 70 69 6e 67 20 64 75 70 6c  s, skipping dupl
c580: 69 63 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  icates..**.** Th
c590: 65 20 63 75 72 73 6f 72 20 6f 70 65 6e 65 64 20  e cursor opened 
c5a0: 6f 6e 20 74 68 65 20 73 74 72 75 63 74 75 72 65  on the structure
c5b0: 20 28 64 61 74 61 62 61 73 65 20 74 61 62 6c 65   (database table
c5c0: 2c 20 64 61 74 61 62 61 73 65 20 69 6e 64 65 78  , database index
c5d0: 20 0a 2a 2a 20 6f 72 20 65 70 68 65 72 6d 61 6c   .** or ephermal
c5e0: 20 74 61 62 6c 65 29 20 69 73 20 73 74 6f 72 65   table) is store
c5f0: 64 20 69 6e 20 70 58 2d 3e 69 54 61 62 6c 65 20  d in pX->iTable 
c600: 62 65 66 6f 72 65 20 74 68 69 73 20 66 75 6e 63  before this func
c610: 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e 0a 2a 2a  tion returns..**
c620: 20 54 68 65 20 72 65 74 75 72 6e 65 64 20 76 61   The returned va
c630: 6c 75 65 20 69 6e 64 69 63 61 74 65 73 20 74 68  lue indicates th
c640: 65 20 73 74 72 75 63 74 75 72 65 20 74 79 70 65  e structure type
c650: 2c 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  , as follows:.**
c660: 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 52  .**   IN_INDEX_R
c670: 4f 57 49 44 20 2d 20 54 68 65 20 63 75 72 73 6f  OWID - The curso
c680: 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20  r was opened on 
c690: 61 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65  a database table
c6a0: 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f  ..**   IN_INDEX_
c6b0: 49 4e 44 45 58 20 2d 20 54 68 65 20 63 75 72 73  INDEX - The curs
c6c0: 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e  or was opened on
c6d0: 20 61 20 64 61 74 61 62 61 73 65 20 69 6e 64 65   a database inde
c6e0: 78 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58  x..**   IN_INDEX
c6f0: 5f 45 50 48 20 2d 20 20 20 54 68 65 20 63 75 72  _EPH -   The cur
c700: 73 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f  sor was opened o
c710: 6e 20 61 20 73 70 65 63 69 61 6c 6c 79 20 63 72  n a specially cr
c720: 65 61 74 65 64 20 61 6e 64 0a 2a 2a 20 20 20 20  eated and.**    
c730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c740: 70 6f 70 75 6c 61 74 65 64 20 65 70 68 65 72 65  populated ephere
c750: 6d 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  mal table..**.**
c760: 20 41 6e 20 65 78 69 73 74 69 6e 67 20 73 74 72   An existing str
c770: 75 63 74 75 72 65 20 6d 61 79 20 6f 6e 6c 79 20  ucture may only 
c780: 62 65 20 75 73 65 64 20 69 66 20 74 68 65 20 53  be used if the S
c790: 45 4c 45 43 54 20 69 73 20 6f 66 20 74 68 65 20  ELECT is of the 
c7a0: 73 69 6d 70 6c 65 0a 2a 2a 20 66 6f 72 6d 3a 0a  simple.** form:.
c7b0: 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  **.**     SELECT
c7c0: 20 3c 63 6f 6c 75 6d 6e 3e 20 46 52 4f 4d 20 3c   <column> FROM <
c7d0: 74 61 62 6c 65 3e 0a 2a 2a 0a 2a 2a 20 49 66 20  table>.**.** If 
c7e0: 74 68 65 20 6d 75 73 74 42 65 55 6e 69 71 75 65  the mustBeUnique
c7f0: 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 66 61   parameter is fa
c800: 6c 73 65 2c 20 74 68 65 20 73 74 72 75 63 74 75  lse, the structu
c810: 72 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20  re will be used 
c820: 0a 2a 2a 20 66 6f 72 20 66 61 73 74 20 73 65 74  .** for fast set
c830: 20 6d 65 6d 62 65 72 73 68 69 70 20 74 65 73 74   membership test
c840: 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  s. In this case 
c850: 61 6e 20 65 70 68 65 72 65 6d 61 6c 20 74 61 62  an epheremal tab
c860: 6c 65 20 6d 75 73 74 20 0a 2a 2a 20 62 65 20 75  le must .** be u
c870: 73 65 64 20 75 6e 6c 65 73 73 20 3c 63 6f 6c 75  sed unless <colu
c880: 6d 6e 3e 20 69 73 20 61 6e 20 49 4e 54 45 47 45  mn> is an INTEGE
c890: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72  R PRIMARY KEY or
c8a0: 20 61 6e 20 69 6e 64 65 78 20 63 61 6e 20 0a 2a   an index can .*
c8b0: 2a 20 62 65 20 66 6f 75 6e 64 20 77 69 74 68 20  * be found with 
c8c0: 3c 63 6f 6c 75 6d 6e 3e 20 61 73 20 69 74 73 20  <column> as its 
c8d0: 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e  left-most column
c8e0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6d 75 73 74 42  ..**.** If mustB
c8f0: 65 55 6e 69 71 75 65 20 69 73 20 74 72 75 65 2c  eUnique is true,
c900: 20 74 68 65 6e 20 74 68 65 20 73 74 72 75 63 74   then the struct
c910: 75 72 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64  ure will be used
c920: 20 74 6f 20 69 74 65 72 61 74 65 0a 2a 2a 20 74   to iterate.** t
c930: 68 72 6f 75 67 68 20 74 68 65 20 73 65 74 20 6d  hrough the set m
c940: 65 6d 62 65 72 73 2c 20 73 6b 69 70 70 69 6e 67  embers, skipping
c950: 20 61 6e 79 20 64 75 70 6c 69 63 61 74 65 73 2e   any duplicates.
c960: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 61 6e   In this case an
c970: 0a 2a 2a 20 65 70 68 65 72 65 6d 61 6c 20 74 61  .** epheremal ta
c980: 62 6c 65 20 6d 75 73 74 20 62 65 20 75 73 65 64  ble must be used
c990: 20 75 6e 6c 65 73 73 20 74 68 65 20 73 65 6c 65   unless the sele
c9a0: 63 74 65 64 20 3c 63 6f 6c 75 6d 6e 3e 20 69 73  cted <column> is
c9b0: 20 67 75 61 72 61 6e 74 65 65 64 0a 2a 2a 20 74   guaranteed.** t
c9c0: 6f 20 62 65 20 75 6e 69 71 75 65 20 2d 20 65 69  o be unique - ei
c9d0: 74 68 65 72 20 62 65 63 61 75 73 65 20 69 74 20  ther because it 
c9e0: 69 73 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52  is an INTEGER PR
c9f0: 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 69 74 0a  IMARY KEY or it.
ca00: 2a 2a 20 69 73 20 75 6e 69 71 75 65 20 62 79 20  ** is unique by 
ca10: 76 69 72 74 75 65 20 6f 66 20 61 20 63 6f 6e 73  virtue of a cons
ca20: 74 72 61 69 6e 74 20 6f 72 20 69 6d 70 6c 69 63  traint or implic
ca30: 69 74 20 69 6e 64 65 78 2e 0a 2a 2f 0a 23 69 66  it index..*/.#if
ca40: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
ca50: 5f 53 55 42 51 55 45 52 59 0a 69 6e 74 20 73 71  _SUBQUERY.int sq
ca60: 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e 64 65 78  lite3FindInIndex
ca70: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
ca80: 45 78 70 72 20 2a 70 58 2c 20 69 6e 74 20 6d 75  Expr *pX, int mu
ca90: 73 74 42 65 55 6e 69 71 75 65 29 7b 0a 20 20 53  stBeUnique){.  S
caa0: 65 6c 65 63 74 20 2a 70 3b 0a 20 20 69 6e 74 20  elect *p;.  int 
cab0: 65 54 79 70 65 20 3d 20 30 3b 0a 20 20 69 6e 74  eType = 0;.  int
cac0: 20 69 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e   iTab = pParse->
cad0: 6e 54 61 62 2b 2b 3b 0a 0a 20 20 2f 2a 20 54 68  nTab++;..  /* Th
cae0: 65 20 66 6f 6c 6c 77 69 6e 67 20 69 66 28 2e 2e  e follwing if(..
caf0: 2e 29 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  .) expression is
cb00: 20 74 72 75 65 20 69 66 20 74 68 65 20 53 45 4c   true if the SEL
cb10: 45 43 54 20 69 73 20 6f 66 20 74 68 65 20 0a 20  ECT is of the . 
cb20: 20 2a 2a 20 73 69 6d 70 6c 65 20 66 6f 72 6d 3a   ** simple form:
cb30: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53  .  **.  **     S
cb40: 45 4c 45 43 54 20 3c 63 6f 6c 75 6d 6e 3e 20 46  ELECT <column> F
cb50: 52 4f 4d 20 3c 74 61 62 6c 65 3e 0a 20 20 2a 2a  ROM <table>.  **
cb60: 0a 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73  .  ** If this is
cb70: 20 74 68 65 20 63 61 73 65 2c 20 69 74 20 6d 61   the case, it ma
cb80: 79 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74 6f  y be possible to
cb90: 20 75 73 65 20 61 6e 20 65 78 69 73 74 69 6e 67   use an existing
cba0: 20 74 61 62 6c 65 0a 20 20 2a 2a 20 6f 72 20 69   table.  ** or i
cbb0: 6e 64 65 78 20 69 6e 73 74 65 61 64 20 6f 66 20  ndex instead of 
cbc0: 67 65 6e 65 72 61 74 69 6e 67 20 61 6e 20 65 70  generating an ep
cbd0: 68 65 72 65 6d 61 6c 20 74 61 62 6c 65 2e 0a 20  heremal table.. 
cbe0: 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65   */.  if( sqlite
cbf0: 33 5f 65 6e 61 62 6c 65 5f 69 6e 5f 6f 70 74 0a  3_enable_in_opt.
cc00: 20 20 20 26 26 20 28 70 3d 70 58 2d 3e 70 53 65     && (p=pX->pSe
cc10: 6c 65 63 74 29 21 3d 30 20 26 26 20 21 70 2d 3e  lect)!=0 && !p->
cc20: 70 50 72 69 6f 72 0a 20 20 20 26 26 20 21 70 2d  pPrior.   && !p-
cc30: 3e 69 73 44 69 73 74 69 6e 63 74 20 26 26 20 21  >isDistinct && !
cc40: 70 2d 3e 69 73 41 67 67 20 26 26 20 21 70 2d 3e  p->isAgg && !p->
cc50: 70 47 72 6f 75 70 42 79 0a 20 20 20 26 26 20 70  pGroupBy.   && p
cc60: 2d 3e 70 53 72 63 20 26 26 20 70 2d 3e 70 53 72  ->pSrc && p->pSr
cc70: 63 2d 3e 6e 53 72 63 3d 3d 31 20 26 26 20 21 70  c->nSrc==1 && !p
cc80: 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65  ->pSrc->a[0].pSe
cc90: 6c 65 63 74 0a 20 20 20 26 26 20 70 2d 3e 70 53  lect.   && p->pS
cca0: 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 20 26 26  rc->a[0].pTab &&
ccb0: 20 21 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e   !p->pSrc->a[0].
ccc0: 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 0a 20 20  pTab->pSelect.  
ccd0: 20 26 26 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e   && p->pEList->n
cce0: 45 78 70 72 3d 3d 31 20 26 26 20 70 2d 3e 70 45  Expr==1 && p->pE
ccf0: 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
cd00: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a  ->op==TK_COLUMN.
cd10: 20 20 20 26 26 20 21 70 2d 3e 70 4c 69 6d 69 74     && !p->pLimit
cd20: 20 26 26 20 21 70 2d 3e 70 4f 66 66 73 65 74 20   && !p->pOffset 
cd30: 26 26 20 21 70 2d 3e 70 57 68 65 72 65 0a 20 20  && !p->pWhere.  
cd40: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a  ){.    sqlite3 *
cd50: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
cd60: 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78  .    Index *pIdx
cd70: 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70  ;.    Expr *pExp
cd80: 72 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61  r = p->pEList->a
cd90: 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69  [0].pExpr;.    i
cda0: 6e 74 20 69 43 6f 6c 20 3d 20 70 45 78 70 72 2d  nt iCol = pExpr-
cdb0: 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 56 64  >iColumn;.    Vd
cdc0: 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47  be *v = sqlite3G
cdd0: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
cde0: 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 66 75 6e  .    /* This fun
cdf0: 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 63 61  ction is only ca
ce00: 6c 6c 65 64 20 66 72 6f 6d 20 74 77 6f 20 70 6c  lled from two pl
ce10: 61 63 65 73 2e 20 49 6e 20 62 6f 74 68 20 63 61  aces. In both ca
ce20: 73 65 73 20 74 68 65 20 76 64 62 65 0a 20 20 20  ses the vdbe.   
ce30: 20 2a 2a 20 68 61 73 20 61 6c 72 65 61 64 79 20   ** has already 
ce40: 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2e 20  been allocated. 
ce50: 53 6f 20 61 73 73 75 6d 65 20 73 71 6c 69 74 65  So assume sqlite
ce60: 33 47 65 74 56 64 62 65 28 29 20 69 73 20 61 6c  3GetVdbe() is al
ce70: 77 61 79 73 0a 20 20 20 20 2a 2a 20 73 75 63 63  ways.    ** succ
ce80: 65 73 73 66 75 6c 20 68 65 72 65 2e 0a 20 20 20  essful here..   
ce90: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 76   */.    assert(v
cea0: 29 3b 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3c  );.    if( iCol<
ceb0: 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  0 ){.      int i
cec0: 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  Mem = ++pParse->
ced0: 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 69 6e 74 20  nMem;.      int 
cee0: 69 41 64 64 72 3b 0a 20 20 20 20 20 20 54 61 62  iAddr;.      Tab
cef0: 6c 65 20 2a 70 54 61 62 20 3d 20 70 2d 3e 70 53  le *pTab = p->pS
cf00: 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 20  rc->a[0].pTab;. 
cf10: 20 20 20 20 20 69 6e 74 20 69 44 62 20 3d 20 73       int iDb = s
cf20: 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e  qlite3SchemaToIn
cf30: 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53  dex(db, pTab->pS
cf40: 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 73 71  chema);.      sq
cf50: 6c 69 74 65 33 56 64 62 65 55 73 65 73 42 74 72  lite3VdbeUsesBtr
cf60: 65 65 28 76 2c 20 69 44 62 29 3b 0a 0a 20 20 20  ee(v, iDb);..   
cf70: 20 20 20 69 41 64 64 72 20 3d 20 73 71 6c 69 74     iAddr = sqlit
cf80: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
cf90: 4f 50 5f 49 66 2c 20 69 4d 65 6d 29 3b 0a 20 20  OP_If, iMem);.  
cfa0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
cfb0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
cfc0: 67 65 72 2c 20 31 2c 20 69 4d 65 6d 29 3b 0a 0a  ger, 1, iMem);..
cfd0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65        sqlite3Ope
cfe0: 6e 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 69  nTable(pParse, i
cff0: 54 61 62 2c 20 69 44 62 2c 20 70 54 61 62 2c 20  Tab, iDb, pTab, 
d000: 4f 50 5f 4f 70 65 6e 52 65 61 64 29 3b 0a 20 20  OP_OpenRead);.  
d010: 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f 49      eType = IN_I
d020: 4e 44 45 58 5f 52 4f 57 49 44 3b 0a 0a 20 20 20  NDEX_ROWID;..   
d030: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
d040: 6d 70 48 65 72 65 28 76 2c 20 69 41 64 64 72 29  mpHere(v, iAddr)
d050: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
d060: 20 20 20 2f 2a 20 54 68 65 20 63 6f 6c 6c 61 74     /* The collat
d070: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 75 73 65  ion sequence use
d080: 64 20 62 79 20 74 68 65 20 63 6f 6d 70 61 72 69  d by the compari
d090: 73 6f 6e 2e 20 49 66 20 61 6e 20 69 6e 64 65 78  son. If an index
d0a0: 20 69 73 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a   is to .      **
d0b0: 20 62 65 20 75 73 65 64 20 69 6e 20 70 6c 61 63   be used in plac
d0c0: 65 20 6f 66 20 61 20 74 65 6d 70 2d 74 61 62 6c  e of a temp-tabl
d0d0: 65 2c 20 69 74 20 6d 75 73 74 20 62 65 20 6f 72  e, it must be or
d0e0: 64 65 72 65 64 20 61 63 63 6f 72 64 69 6e 67 0a  dered according.
d0f0: 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 68 69 73        ** to this
d100: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
d110: 6e 63 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  nce..      */.  
d120: 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 52 65      CollSeq *pRe
d130: 71 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72  q = sqlite3Binar
d140: 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28  yCompareCollSeq(
d150: 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 4c 65 66  pParse, pX->pLef
d160: 74 2c 20 70 45 78 70 72 29 3b 0a 0a 20 20 20 20  t, pExpr);..    
d170: 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
d180: 74 68 65 20 61 66 66 69 6e 69 74 79 20 74 68 61  the affinity tha
d190: 74 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74  t will be used t
d1a0: 6f 20 70 65 72 66 6f 72 6d 20 74 68 65 20 0a 20  o perform the . 
d1b0: 20 20 20 20 20 2a 2a 20 63 6f 6d 70 61 72 69 73       ** comparis
d1c0: 6f 6e 20 69 73 20 74 68 65 20 73 61 6d 65 20 61  on is the same a
d1d0: 73 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 6f  s the affinity o
d1e0: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2e 20 49 66  f the column. If
d1f0: 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 69 73 20  .      ** it is 
d200: 6e 6f 74 2c 20 69 74 20 69 73 20 6e 6f 74 20 70  not, it is not p
d210: 6f 73 73 69 62 6c 65 20 74 6f 20 75 73 65 20 61  ossible to use a
d220: 6e 79 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20  ny index..      
d230: 2a 2f 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a  */.      Table *
d240: 70 54 61 62 20 3d 20 70 2d 3e 70 53 72 63 2d 3e  pTab = p->pSrc->
d250: 61 5b 30 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20  a[0].pTab;.     
d260: 20 63 68 61 72 20 61 66 66 20 3d 20 63 6f 6d 70   char aff = comp
d270: 61 72 69 73 6f 6e 41 66 66 69 6e 69 74 79 28 70  arisonAffinity(p
d280: 58 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 61 66  X);.      int af
d290: 66 69 6e 69 74 79 5f 6f 6b 20 3d 20 28 70 54 61  finity_ok = (pTa
d2a0: 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 61 66  b->aCol[iCol].af
d2b0: 66 69 6e 69 74 79 3d 3d 61 66 66 7c 7c 61 66 66  finity==aff||aff
d2c0: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  ==SQLITE_AFF_NON
d2d0: 45 29 3b 0a 0a 20 20 20 20 20 20 66 6f 72 28 70  E);..      for(p
d2e0: 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  Idx=pTab->pIndex
d2f0: 3b 20 70 49 64 78 20 26 26 20 65 54 79 70 65 3d  ; pIdx && eType=
d300: 3d 30 20 26 26 20 61 66 66 69 6e 69 74 79 5f 6f  =0 && affinity_o
d310: 6b 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e  k; pIdx=pIdx->pN
d320: 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 69 66  ext){.        if
d330: 28 20 28 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  ( (pIdx->aiColum
d340: 6e 5b 30 5d 3d 3d 69 43 6f 6c 29 0a 20 20 20 20  n[0]==iCol).    
d350: 20 20 20 20 20 26 26 20 28 70 52 65 71 3d 3d 73       && (pReq==s
d360: 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65  qlite3FindCollSe
d370: 71 28 64 62 2c 20 45 4e 43 28 64 62 29 2c 20 70  q(db, ENC(db), p
d380: 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 30 5d 2c 20  Idx->azColl[0], 
d390: 2d 31 2c 20 30 29 29 0a 20 20 20 20 20 20 20 20  -1, 0)).        
d3a0: 20 26 26 20 28 21 6d 75 73 74 42 65 55 6e 69 71   && (!mustBeUniq
d3b0: 75 65 20 7c 7c 20 28 70 49 64 78 2d 3e 6e 43 6f  ue || (pIdx->nCo
d3c0: 6c 75 6d 6e 3d 3d 31 20 26 26 20 70 49 64 78 2d  lumn==1 && pIdx-
d3d0: 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e  >onError!=OE_Non
d3e0: 65 29 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  e)).        ){. 
d3f0: 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 44 62           int iDb
d400: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  ;.          int 
d410: 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d  iMem = ++pParse-
d420: 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 20  >nMem;.         
d430: 20 69 6e 74 20 69 41 64 64 72 3b 0a 20 20 20 20   int iAddr;.    
d440: 20 20 20 20 20 20 63 68 61 72 20 2a 70 4b 65 79        char *pKey
d450: 3b 0a 20 20 0a 20 20 20 20 20 20 20 20 20 20 70  ;.  .          p
d460: 4b 65 79 20 3d 20 28 63 68 61 72 20 2a 29 73 71  Key = (char *)sq
d470: 6c 69 74 65 33 49 6e 64 65 78 4b 65 79 69 6e 66  lite3IndexKeyinf
d480: 6f 28 70 50 61 72 73 65 2c 20 70 49 64 78 29 3b  o(pParse, pIdx);
d490: 0a 20 20 20 20 20 20 20 20 20 20 69 44 62 20 3d  .          iDb =
d4a0: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
d4b0: 49 6e 64 65 78 28 64 62 2c 20 70 49 64 78 2d 3e  Index(db, pIdx->
d4c0: 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20  pSchema);.      
d4d0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 55      sqlite3VdbeU
d4e0: 73 65 73 42 74 72 65 65 28 76 2c 20 69 44 62 29  sesBtree(v, iDb)
d4f0: 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 69 41 64  ;..          iAd
d500: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
d510: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 2c  AddOp1(v, OP_If,
d520: 20 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20 20   iMem);.        
d530: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
d540: 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
d550: 72 2c 20 31 2c 20 69 4d 65 6d 29 3b 0a 20 20 0a  r, 1, iMem);.  .
d560: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
d570: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
d580: 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c  P_SetNumColumns,
d590: 20 30 2c 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d   0, pIdx->nColum
d5a0: 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  n);.          sq
d5b0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
d5c0: 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20  v, OP_OpenRead, 
d5d0: 69 54 61 62 2c 20 70 49 64 78 2d 3e 74 6e 75 6d  iTab, pIdx->tnum
d5e0: 2c 20 69 44 62 2c 0a 20 20 20 20 20 20 20 20 20  , iDb,.         
d5f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d600: 20 20 20 20 20 20 70 4b 65 79 2c 50 34 5f 4b 45        pKey,P4_KE
d610: 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a  YINFO_HANDOFF);.
d620: 20 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f            VdbeCo
d630: 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20  mment((v, "%s", 
d640: 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20  pIdx->zName));. 
d650: 20 20 20 20 20 20 20 20 20 65 54 79 70 65 20 3d           eType =
d660: 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 3b   IN_INDEX_INDEX;
d670: 0a 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ..          sqli
d680: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
d690: 76 2c 20 69 41 64 64 72 29 3b 0a 20 20 20 20 20  v, iAddr);.     
d6a0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
d6b0: 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 65 54   }.  }..  if( eT
d6c0: 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  ype==0 ){.    sq
d6d0: 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65  lite3CodeSubsele
d6e0: 63 74 28 70 50 61 72 73 65 2c 20 70 58 29 3b 0a  ct(pParse, pX);.
d6f0: 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f 49      eType = IN_I
d700: 4e 44 45 58 5f 45 50 48 3b 0a 20 20 7d 65 6c 73  NDEX_EPH;.  }els
d710: 65 7b 0a 20 20 20 20 70 58 2d 3e 69 54 61 62 6c  e{.    pX->iTabl
d720: 65 20 3d 20 69 54 61 62 3b 0a 20 20 7d 0a 20 20  e = iTab;.  }.  
d730: 72 65 74 75 72 6e 20 65 54 79 70 65 3b 0a 7d 0a  return eType;.}.
d740: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65  #endif../*.** Ge
d750: 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
d760: 73 63 61 6c 61 72 20 73 75 62 71 75 65 72 69 65  scalar subquerie
d770: 73 20 75 73 65 64 20 61 73 20 61 6e 20 65 78 70  s used as an exp
d780: 72 65 73 73 69 6f 6e 0a 2a 2a 20 61 6e 64 20 49  ression.** and I
d790: 4e 20 6f 70 65 72 61 74 6f 72 73 2e 20 20 45 78  N operators.  Ex
d7a0: 61 6d 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  amples:.**.**   
d7b0: 20 20 28 53 45 4c 45 43 54 20 61 20 46 52 4f 4d    (SELECT a FROM
d7c0: 20 62 29 20 20 20 20 20 20 20 20 20 20 2d 2d 20   b)          -- 
d7d0: 73 75 62 71 75 65 72 79 0a 2a 2a 20 20 20 20 20  subquery.**     
d7e0: 45 58 49 53 54 53 20 28 53 45 4c 45 43 54 20 61  EXISTS (SELECT a
d7f0: 20 46 52 4f 4d 20 62 29 20 20 20 2d 2d 20 45 58   FROM b)   -- EX
d800: 49 53 54 53 20 73 75 62 71 75 65 72 79 0a 2a 2a  ISTS subquery.**
d810: 20 20 20 20 20 78 20 49 4e 20 28 34 2c 35 2c 31       x IN (4,5,1
d820: 31 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1)              
d830: 2d 2d 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 77  -- IN operator w
d840: 69 74 68 20 6c 69 73 74 20 6f 6e 20 72 69 67 68  ith list on righ
d850: 74 2d 68 61 6e 64 20 73 69 64 65 0a 2a 2a 20 20  t-hand side.**  
d860: 20 20 20 78 20 49 4e 20 28 53 45 4c 45 43 54 20     x IN (SELECT 
d870: 61 20 46 52 4f 4d 20 62 29 20 20 20 20 20 2d 2d  a FROM b)     --
d880: 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 77 69 74   IN operator wit
d890: 68 20 73 75 62 71 75 65 72 79 20 6f 6e 20 74 68  h subquery on th
d8a0: 65 20 72 69 67 68 74 0a 2a 2a 0a 2a 2a 20 54 68  e right.**.** Th
d8b0: 65 20 70 45 78 70 72 20 70 61 72 61 6d 65 74 65  e pExpr paramete
d8c0: 72 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20  r describes the 
d8d0: 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20  expression that 
d8e0: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 49 4e 0a  contains the IN.
d8f0: 2a 2a 20 6f 70 65 72 61 74 6f 72 20 6f 72 20 73  ** operator or s
d900: 75 62 71 75 65 72 79 2e 0a 2a 2f 0a 23 69 66 6e  ubquery..*/.#ifn
d910: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
d920: 53 55 42 51 55 45 52 59 0a 76 6f 69 64 20 73 71  SUBQUERY.void sq
d930: 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65  lite3CodeSubsele
d940: 63 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ct(Parse *pParse
d950: 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  , Expr *pExpr){.
d960: 20 20 69 6e 74 20 74 65 73 74 41 64 64 72 20 3d    int testAddr =
d970: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
d980: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65            /* One
d990: 2d 74 69 6d 65 20 74 65 73 74 20 61 64 64 72 65  -time test addre
d9a0: 73 73 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20  ss */.  Vdbe *v 
d9b0: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
d9c0: 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
d9d0: 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a  v==0 ) return;..
d9e0: 0a 20 20 2f 2a 20 54 68 69 73 20 63 6f 64 65 20  .  /* This code 
d9f0: 6d 75 73 74 20 62 65 20 72 75 6e 20 69 6e 20 69  must be run in i
da00: 74 73 20 65 6e 74 69 72 65 74 79 20 65 76 65 72  ts entirety ever
da10: 79 20 74 69 6d 65 20 69 74 20 69 73 20 65 6e 63  y time it is enc
da20: 6f 75 6e 74 65 72 65 64 0a 20 20 2a 2a 20 69 66  ountered.  ** if
da30: 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c   any of the foll
da40: 6f 77 69 6e 67 20 69 73 20 74 72 75 65 3a 0a 20  owing is true:. 
da50: 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 2a 20 20 54   **.  **    *  T
da60: 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69  he right-hand si
da70: 64 65 20 69 73 20 61 20 63 6f 72 72 65 6c 61 74  de is a correlat
da80: 65 64 20 73 75 62 71 75 65 72 79 0a 20 20 2a 2a  ed subquery.  **
da90: 20 20 20 20 2a 20 20 54 68 65 20 72 69 67 68 74      *  The right
daa0: 2d 68 61 6e 64 20 73 69 64 65 20 69 73 20 61 6e  -hand side is an
dab0: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
dac0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 76 61 72 69   containing vari
dad0: 61 62 6c 65 73 0a 20 20 2a 2a 20 20 20 20 2a 20  ables.  **    * 
dae0: 20 57 65 20 61 72 65 20 69 6e 73 69 64 65 20 61   We are inside a
daf0: 20 74 72 69 67 67 65 72 0a 20 20 2a 2a 0a 20 20   trigger.  **.  
db00: 2a 2a 20 49 66 20 61 6c 6c 20 6f 66 20 74 68 65  ** If all of the
db10: 20 61 62 6f 76 65 20 61 72 65 20 66 61 6c 73 65   above are false
db20: 2c 20 74 68 65 6e 20 77 65 20 63 61 6e 20 72 75  , then we can ru
db30: 6e 20 74 68 69 73 20 63 6f 64 65 20 6a 75 73 74  n this code just
db40: 20 6f 6e 63 65 0a 20 20 2a 2a 20 73 61 76 65 20   once.  ** save 
db50: 74 68 65 20 72 65 73 75 6c 74 73 2c 20 61 6e 64  the results, and
db60: 20 72 65 75 73 65 20 74 68 65 20 73 61 6d 65 20   reuse the same 
db70: 72 65 73 75 6c 74 20 6f 6e 20 73 75 62 73 65 71  result on subseq
db80: 75 65 6e 74 20 69 6e 76 6f 63 61 74 69 6f 6e 73  uent invocations
db90: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 45 78  ..  */.  if( !Ex
dba0: 70 72 48 61 73 41 6e 79 50 72 6f 70 65 72 74 79  prHasAnyProperty
dbb0: 28 70 45 78 70 72 2c 20 45 50 5f 56 61 72 53 65  (pExpr, EP_VarSe
dbc0: 6c 65 63 74 29 20 26 26 20 21 70 50 61 72 73 65  lect) && !pParse
dbd0: 2d 3e 74 72 69 67 53 74 61 63 6b 20 29 7b 0a 20  ->trigStack ){. 
dbe0: 20 20 20 69 6e 74 20 6d 65 6d 20 3d 20 2b 2b 70     int mem = ++p
dbf0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
dc00: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
dc10: 70 31 28 76 2c 20 4f 50 5f 49 66 2c 20 6d 65 6d  p1(v, OP_If, mem
dc20: 29 3b 0a 20 20 20 20 74 65 73 74 41 64 64 72 20  );.    testAddr 
dc30: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
dc40: 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
dc50: 72 2c 20 31 2c 20 6d 65 6d 29 3b 0a 20 20 20 20  r, 1, mem);.    
dc60: 61 73 73 65 72 74 28 20 74 65 73 74 41 64 64 72  assert( testAddr
dc70: 3e 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62  >0 || pParse->db
dc80: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
dc90: 3b 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63 68 28  ;.  }..  switch(
dca0: 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20   pExpr->op ){.  
dcb0: 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a    case TK_IN: {.
dcc0: 20 20 20 20 20 20 63 68 61 72 20 61 66 66 69 6e        char affin
dcd0: 69 74 79 3b 0a 20 20 20 20 20 20 4b 65 79 49 6e  ity;.      KeyIn
dce0: 66 6f 20 6b 65 79 49 6e 66 6f 3b 0a 20 20 20 20  fo keyInfo;.    
dcf0: 20 20 69 6e 74 20 61 64 64 72 3b 20 20 20 20 20    int addr;     
dd00: 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
dd10: 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
dd20: 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f  l instruction */
dd30: 0a 0a 20 20 20 20 20 20 61 66 66 69 6e 69 74 79  ..      affinity
dd40: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 66   = sqlite3ExprAf
dd50: 66 69 6e 69 74 79 28 70 45 78 70 72 2d 3e 70 4c  finity(pExpr->pL
dd60: 65 66 74 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  eft);..      /* 
dd70: 57 68 65 74 68 65 72 20 74 68 69 73 20 69 73 20  Whether this is 
dd80: 61 6e 20 27 78 20 49 4e 28 53 45 4c 45 43 54 2e  an 'x IN(SELECT.
dd90: 2e 2e 29 27 20 6f 72 20 61 6e 20 27 78 20 49 4e  ..)' or an 'x IN
dda0: 28 3c 65 78 70 72 6c 69 73 74 3e 29 27 0a 20 20  (<exprlist>)'.  
ddb0: 20 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f      ** expressio
ddc0: 6e 20 69 74 20 69 73 20 68 61 6e 64 6c 65 64 20  n it is handled 
ddd0: 74 68 65 20 73 61 6d 65 20 77 61 79 2e 20 41 20  the same way. A 
dde0: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 69 73  virtual table is
ddf0: 20 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 6c 65   .      ** fille
de00: 64 20 77 69 74 68 20 73 69 6e 67 6c 65 2d 66 69  d with single-fi
de10: 65 6c 64 20 69 6e 64 65 78 20 6b 65 79 73 20 72  eld index keys r
de20: 65 70 72 65 73 65 6e 74 69 6e 67 20 74 68 65 20  epresenting the 
de30: 72 65 73 75 6c 74 73 0a 20 20 20 20 20 20 2a 2a  results.      **
de40: 20 66 72 6f 6d 20 74 68 65 20 53 45 4c 45 43 54   from the SELECT
de50: 20 6f 72 20 74 68 65 20 3c 65 78 70 72 6c 69 73   or the <exprlis
de60: 74 3e 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  t>..      **.   
de70: 20 20 20 2a 2a 20 49 66 20 74 68 65 20 27 78 27     ** If the 'x'
de80: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61   expression is a
de90: 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 2c 20 6f   column value, o
dea0: 72 20 74 68 65 20 53 45 4c 45 43 54 2e 2e 2e 0a  r the SELECT....
deb0: 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65        ** stateme
dec0: 6e 74 20 72 65 74 75 72 6e 73 20 61 20 63 6f 6c  nt returns a col
ded0: 75 6d 6e 20 76 61 6c 75 65 2c 20 74 68 65 6e 20  umn value, then 
dee0: 74 68 65 20 61 66 66 69 6e 69 74 79 20 6f 66 20  the affinity of 
def0: 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 63 6f  that.      ** co
df00: 6c 75 6d 6e 20 69 73 20 75 73 65 64 20 74 6f 20  lumn is used to 
df10: 62 75 69 6c 64 20 74 68 65 20 69 6e 64 65 78 20  build the index 
df20: 6b 65 79 73 2e 20 49 66 20 62 6f 74 68 20 27 78  keys. If both 'x
df30: 27 20 61 6e 64 20 74 68 65 0a 20 20 20 20 20 20  ' and the.      
df40: 2a 2a 20 53 45 4c 45 43 54 2e 2e 2e 20 73 74 61  ** SELECT... sta
df50: 74 65 6d 65 6e 74 20 61 72 65 20 63 6f 6c 75 6d  tement are colum
df60: 6e 73 2c 20 74 68 65 6e 20 6e 75 6d 65 72 69 63  ns, then numeric
df70: 20 61 66 66 69 6e 69 74 79 20 69 73 20 75 73 65   affinity is use
df80: 64 0a 20 20 20 20 20 20 2a 2a 20 69 66 20 65 69  d.      ** if ei
df90: 74 68 65 72 20 63 6f 6c 75 6d 6e 20 68 61 73 20  ther column has 
dfa0: 4e 55 4d 45 52 49 43 20 6f 72 20 49 4e 54 45 47  NUMERIC or INTEG
dfb0: 45 52 20 61 66 66 69 6e 69 74 79 2e 20 49 66 20  ER affinity. If 
dfc0: 6e 65 69 74 68 65 72 0a 20 20 20 20 20 20 2a 2a  neither.      **
dfd0: 20 27 78 27 20 6e 6f 72 20 74 68 65 20 53 45 4c   'x' nor the SEL
dfe0: 45 43 54 2e 2e 2e 20 73 74 61 74 65 6d 65 6e 74  ECT... statement
dff0: 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2c 20 74 68   are columns, th
e000: 65 6e 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e  en numeric affin
e010: 69 74 79 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  ity.      ** is 
e020: 75 73 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  used..      */. 
e030: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62       pExpr->iTab
e040: 6c 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  le = pParse->nTa
e050: 62 2b 2b 3b 0a 20 20 20 20 20 20 61 64 64 72 20  b++;.      addr 
e060: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
e070: 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70  Op2(v, OP_OpenEp
e080: 68 65 6d 65 72 61 6c 2c 20 70 45 78 70 72 2d 3e  hemeral, pExpr->
e090: 69 54 61 62 6c 65 2c 20 31 29 3b 0a 20 20 20 20  iTable, 1);.    
e0a0: 20 20 6d 65 6d 73 65 74 28 26 6b 65 79 49 6e 66    memset(&keyInf
e0b0: 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6b 65 79  o, 0, sizeof(key
e0c0: 49 6e 66 6f 29 29 3b 0a 20 20 20 20 20 20 6b 65  Info));.      ke
e0d0: 79 49 6e 66 6f 2e 6e 46 69 65 6c 64 20 3d 20 31  yInfo.nField = 1
e0e0: 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70 45 78  ;..      if( pEx
e0f0: 70 72 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20  pr->pSelect ){. 
e100: 20 20 20 20 20 20 20 2f 2a 20 43 61 73 65 20 31         /* Case 1
e110: 3a 20 20 20 20 20 65 78 70 72 20 49 4e 20 28 53  :     expr IN (S
e120: 45 4c 45 43 54 20 2e 2e 2e 29 0a 20 20 20 20 20  ELECT ...).     
e130: 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
e140: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
e150: 6f 20 77 72 69 74 65 20 74 68 65 20 72 65 73 75  o write the resu
e160: 6c 74 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63  lts of the selec
e170: 74 20 69 6e 74 6f 20 74 68 65 20 74 65 6d 70 6f  t into the tempo
e180: 72 61 72 79 0a 20 20 20 20 20 20 20 20 2a 2a 20  rary.        ** 
e190: 74 61 62 6c 65 20 61 6c 6c 6f 63 61 74 65 64 20  table allocated 
e1a0: 61 6e 64 20 6f 70 65 6e 65 64 20 61 62 6f 76 65  and opened above
e1b0: 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
e1c0: 20 20 20 20 20 53 65 6c 65 63 74 44 65 73 74 20       SelectDest 
e1d0: 64 65 73 74 3b 0a 20 20 20 20 20 20 20 20 45 78  dest;.        Ex
e1e0: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a  prList *pEList;.
e1f0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
e200: 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26  SelectDestInit(&
e210: 64 65 73 74 2c 20 53 52 54 5f 53 65 74 2c 20 70  dest, SRT_Set, p
e220: 45 78 70 72 2d 3e 69 54 61 62 6c 65 29 3b 0a 20  Expr->iTable);. 
e230: 20 20 20 20 20 20 20 64 65 73 74 2e 61 66 66 69         dest.affi
e240: 6e 69 74 79 20 3d 20 28 69 6e 74 29 61 66 66 69  nity = (int)affi
e250: 6e 69 74 79 3b 0a 20 20 20 20 20 20 20 20 61 73  nity;.        as
e260: 73 65 72 74 28 20 28 70 45 78 70 72 2d 3e 69 54  sert( (pExpr->iT
e270: 61 62 6c 65 26 30 78 30 30 30 30 46 46 46 46 29  able&0x0000FFFF)
e280: 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20  ==pExpr->iTable 
e290: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  );.        if( s
e2a0: 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
e2b0: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 53 65 6c  rse, pExpr->pSel
e2c0: 65 63 74 2c 20 26 64 65 73 74 2c 20 30 2c 20 30  ect, &dest, 0, 0
e2d0: 2c 20 30 2c 20 30 29 20 29 7b 0a 20 20 20 20 20  , 0, 0) ){.     
e2e0: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
e2f0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
e300: 45 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 70  EList = pExpr->p
e310: 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a  Select->pEList;.
e320: 20 20 20 20 20 20 20 20 69 66 28 20 70 45 4c 69          if( pELi
e330: 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45  st && pEList->nE
e340: 78 70 72 3e 30 20 29 7b 20 0a 20 20 20 20 20 20  xpr>0 ){ .      
e350: 20 20 20 20 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c      keyInfo.aCol
e360: 6c 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 42 69  l[0] = sqlite3Bi
e370: 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53  naryCompareCollS
e380: 65 71 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  eq(pParse, pExpr
e390: 2d 3e 70 4c 65 66 74 2c 0a 20 20 20 20 20 20 20  ->pLeft,.       
e3a0: 20 20 20 20 20 20 20 70 45 4c 69 73 74 2d 3e 61         pEList->a
e3b0: 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [0].pExpr);.    
e3c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
e3d0: 65 20 69 66 28 20 70 45 78 70 72 2d 3e 70 4c 69  e if( pExpr->pLi
e3e0: 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  st ){.        /*
e3f0: 20 43 61 73 65 20 32 3a 20 20 20 20 20 65 78 70   Case 2:     exp
e400: 72 20 49 4e 20 28 65 78 70 72 6c 69 73 74 29 0a  r IN (exprlist).
e410: 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
e420: 20 20 20 2a 2a 20 46 6f 72 20 65 61 63 68 20 65     ** For each e
e430: 78 70 72 65 73 73 69 6f 6e 2c 20 62 75 69 6c 64  xpression, build
e440: 20 61 6e 20 69 6e 64 65 78 20 6b 65 79 20 66 72   an index key fr
e450: 6f 6d 20 74 68 65 20 65 76 61 6c 75 61 74 69 6f  om the evaluatio
e460: 6e 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a  n and.        **
e470: 20 73 74 6f 72 65 20 69 74 20 69 6e 20 74 68 65   store it in the
e480: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
e490: 2e 20 49 66 20 3c 65 78 70 72 3e 20 69 73 20 61  . If <expr> is a
e4a0: 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e 20 75 73   column, then us
e4b0: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61  e.        ** tha
e4c0: 74 20 63 6f 6c 75 6d 6e 73 20 61 66 66 69 6e 69  t columns affini
e4d0: 74 79 20 77 68 65 6e 20 62 75 69 6c 64 69 6e 67  ty when building
e4e0: 20 69 6e 64 65 78 20 6b 65 79 73 2e 20 49 66 20   index keys. If 
e4f0: 3c 65 78 70 72 3e 20 69 73 20 6e 6f 74 0a 20 20  <expr> is not.  
e500: 20 20 20 20 20 20 2a 2a 20 61 20 63 6f 6c 75 6d        ** a colum
e510: 6e 2c 20 75 73 65 20 6e 75 6d 65 72 69 63 20 61  n, use numeric a
e520: 66 66 69 6e 69 74 79 2e 0a 20 20 20 20 20 20 20  ffinity..       
e530: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
e540: 69 3b 0a 20 20 20 20 20 20 20 20 45 78 70 72 4c  i;.        ExprL
e550: 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 45 78  ist *pList = pEx
e560: 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 20 20 20  pr->pList;.     
e570: 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
e580: 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
e590: 20 20 20 20 20 20 20 20 69 6e 74 20 72 31 2c 20          int r1, 
e5a0: 72 32 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28  r2;..        if(
e5b0: 20 21 61 66 66 69 6e 69 74 79 20 29 7b 0a 20 20   !affinity ){.  
e5c0: 20 20 20 20 20 20 20 20 61 66 66 69 6e 69 74 79          affinity
e5d0: 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f   = SQLITE_AFF_NO
e5e0: 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  NE;.        }.  
e5f0: 20 20 20 20 20 20 6b 65 79 49 6e 66 6f 2e 61 43        keyInfo.aC
e600: 6f 6c 6c 5b 30 5d 20 3d 20 70 45 78 70 72 2d 3e  oll[0] = pExpr->
e610: 70 4c 65 66 74 2d 3e 70 43 6f 6c 6c 3b 0a 0a 20  pLeft->pColl;.. 
e620: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74         /* Loop t
e630: 68 72 6f 75 67 68 20 65 61 63 68 20 65 78 70 72  hrough each expr
e640: 65 73 73 69 6f 6e 20 69 6e 20 3c 65 78 70 72 6c  ession in <exprl
e650: 69 73 74 3e 2e 20 2a 2f 0a 20 20 20 20 20 20 20  ist>. */.       
e660: 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
e670: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
e680: 0a 20 20 20 20 20 20 20 20 72 32 20 3d 20 73 71  .        r2 = sq
e690: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
e6a0: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
e6b0: 20 66 6f 72 28 69 3d 70 4c 69 73 74 2d 3e 6e 45   for(i=pList->nE
e6c0: 78 70 72 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74  xpr, pItem=pList
e6d0: 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70  ->a; i>0; i--, p
e6e0: 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Item++){.       
e6f0: 20 20 20 45 78 70 72 20 2a 70 45 32 20 3d 20 70     Expr *pE2 = p
e700: 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 0a 20 20  Item->pExpr;..  
e710: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
e720: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
e730: 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 20 74 68 65  not constant the
e740: 6e 20 77 65 20 77 69 6c 6c 20 6e 65 65 64 20 74  n we will need t
e750: 6f 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 64  o.          ** d
e760: 69 73 61 62 6c 65 20 74 68 65 20 74 65 73 74 20  isable the test 
e770: 74 68 61 74 20 77 61 73 20 67 65 6e 65 72 61 74  that was generat
e780: 65 64 20 61 62 6f 76 65 20 74 68 61 74 20 6d 61  ed above that ma
e790: 6b 65 73 20 73 75 72 65 0a 20 20 20 20 20 20 20  kes sure.       
e7a0: 20 20 20 2a 2a 20 74 68 69 73 20 63 6f 64 65 20     ** this code 
e7b0: 6f 6e 6c 79 20 65 78 65 63 75 74 65 73 20 6f 6e  only executes on
e7c0: 63 65 2e 20 20 42 65 63 61 75 73 65 20 66 6f 72  ce.  Because for
e7d0: 20 61 20 6e 6f 6e 2d 63 6f 6e 73 74 61 6e 74 0a   a non-constant.
e7e0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 65 78 70            ** exp
e7f0: 72 65 73 73 69 6f 6e 20 77 65 20 6e 65 65 64 20  ression we need 
e800: 74 6f 20 72 65 72 75 6e 20 74 68 69 73 20 63 6f  to rerun this co
e810: 64 65 20 65 61 63 68 20 74 69 6d 65 2e 0a 20 20  de each time..  
e820: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
e830: 20 20 20 20 20 69 66 28 20 74 65 73 74 41 64 64       if( testAdd
e840: 72 20 26 26 20 21 73 71 6c 69 74 65 33 45 78 70  r && !sqlite3Exp
e850: 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 45 32 29  rIsConstant(pE2)
e860: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
e870: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
e880: 65 54 6f 4e 6f 6f 70 28 76 2c 20 74 65 73 74 41  eToNoop(v, testA
e890: 64 64 72 2d 31 2c 20 32 29 3b 0a 20 20 20 20 20  ddr-1, 2);.     
e8a0: 20 20 20 20 20 20 20 74 65 73 74 41 64 64 72 20         testAddr 
e8b0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = 0;.          }
e8c0: 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45  ..          /* E
e8d0: 76 61 6c 75 61 74 65 20 74 68 65 20 65 78 70 72  valuate the expr
e8e0: 65 73 73 69 6f 6e 20 61 6e 64 20 69 6e 73 65 72  ession and inser
e8f0: 74 20 69 74 20 69 6e 74 6f 20 74 68 65 20 74 65  t it into the te
e900: 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  mp table */.    
e910: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64 69        pParse->di
e920: 73 61 62 6c 65 43 6f 6c 43 61 63 68 65 2b 2b 3b  sableColCache++;
e930: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
e940: 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
e950: 65 2c 20 70 45 32 2c 20 72 31 29 3b 0a 20 20 20  e, pE2, r1);.   
e960: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
e970: 50 61 72 73 65 2d 3e 64 69 73 61 62 6c 65 43 6f  Parse->disableCo
e980: 6c 43 61 63 68 65 3e 30 20 29 3b 0a 20 20 20 20  lCache>0 );.    
e990: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64 69        pParse->di
e9a0: 73 61 62 6c 65 43 6f 6c 43 61 63 68 65 2d 2d 3b  sableColCache--;
e9b0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
e9c0: 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
e9d0: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72  OP_MakeRecord, r
e9e0: 31 2c 20 31 2c 20 72 32 2c 20 26 61 66 66 69 6e  1, 1, r2, &affin
e9f0: 69 74 79 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  ity, 1);.       
ea00: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
ea10: 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67  cheAffinityChang
ea20: 65 28 70 50 61 72 73 65 2c 20 72 31 2c 20 31 29  e(pParse, r1, 1)
ea30: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
ea40: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
ea50: 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 70   OP_IdxInsert, p
ea60: 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 72 32  Expr->iTable, r2
ea70: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
ea80: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
ea90: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
eaa0: 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20  e, r1);.        
eab0: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
eac0: 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 32  mpReg(pParse, r2
ead0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
eae0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
eaf0: 67 65 50 34 28 76 2c 20 61 64 64 72 2c 20 28 76  geP4(v, addr, (v
eb00: 6f 69 64 20 2a 29 26 6b 65 79 49 6e 66 6f 2c 20  oid *)&keyInfo, 
eb10: 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20  P4_KEYINFO);.   
eb20: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
eb30: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 49  .    case TK_EXI
eb40: 53 54 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  STS:.    case TK
eb50: 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20 20  _SELECT: {.     
eb60: 20 2f 2a 20 54 68 69 73 20 68 61 73 20 74 6f 20   /* This has to 
eb70: 62 65 20 61 20 73 63 61 6c 61 72 20 53 45 4c 45  be a scalar SELE
eb80: 43 54 2e 20 20 47 65 6e 65 72 61 74 65 20 63 6f  CT.  Generate co
eb90: 64 65 20 74 6f 20 70 75 74 20 74 68 65 0a 20 20  de to put the.  
eba0: 20 20 20 20 2a 2a 20 76 61 6c 75 65 20 6f 66 20      ** value of 
ebb0: 74 68 69 73 20 73 65 6c 65 63 74 20 69 6e 20 61  this select in a
ebc0: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64   memory cell and
ebd0: 20 72 65 63 6f 72 64 20 74 68 65 20 6e 75 6d 62   record the numb
ebe0: 65 72 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74  er.      ** of t
ebf0: 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 69  he memory cell i
ec00: 6e 20 69 43 6f 6c 75 6d 6e 2e 0a 20 20 20 20 20  n iColumn..     
ec10: 20 2a 2f 0a 20 20 20 20 20 20 73 74 61 74 69 63   */.      static
ec20: 20 63 6f 6e 73 74 20 54 6f 6b 65 6e 20 6f 6e 65   const Token one
ec30: 20 3d 20 7b 20 28 75 38 2a 29 22 31 22 2c 20 30   = { (u8*)"1", 0
ec40: 2c 20 31 20 7d 3b 0a 20 20 20 20 20 20 53 65 6c  , 1 };.      Sel
ec50: 65 63 74 20 2a 70 53 65 6c 3b 0a 20 20 20 20 20  ect *pSel;.     
ec60: 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74   SelectDest dest
ec70: 3b 0a 0a 20 20 20 20 20 20 70 53 65 6c 20 3d 20  ;..      pSel = 
ec80: 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 3b 0a  pExpr->pSelect;.
ec90: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
eca0: 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73  ectDestInit(&des
ecb0: 74 2c 20 30 2c 20 2b 2b 70 50 61 72 73 65 2d 3e  t, 0, ++pParse->
ecc0: 6e 4d 65 6d 29 3b 0a 20 20 20 20 20 20 69 66 28  nMem);.      if(
ecd0: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53   pExpr->op==TK_S
ece0: 45 4c 45 43 54 20 29 7b 0a 20 20 20 20 20 20 20  ELECT ){.       
ecf0: 20 64 65 73 74 2e 65 44 65 73 74 20 3d 20 53 52   dest.eDest = SR
ed00: 54 5f 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 73  T_Mem;.        s
ed10: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
ed20: 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20  (v, OP_Null, 0, 
ed30: 64 65 73 74 2e 69 50 61 72 6d 29 3b 0a 20 20 20  dest.iParm);.   
ed40: 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
ed50: 28 28 76 2c 20 22 49 6e 69 74 20 73 75 62 71 75  ((v, "Init subqu
ed60: 65 72 79 20 72 65 73 75 6c 74 22 29 29 3b 0a 20  ery result"));. 
ed70: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
ed80: 20 20 20 20 64 65 73 74 2e 65 44 65 73 74 20 3d      dest.eDest =
ed90: 20 53 52 54 5f 45 78 69 73 74 73 3b 0a 20 20 20   SRT_Exists;.   
eda0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
edb0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
edc0: 65 67 65 72 2c 20 30 2c 20 64 65 73 74 2e 69 50  eger, 0, dest.iP
edd0: 61 72 6d 29 3b 0a 20 20 20 20 20 20 20 20 56 64  arm);.        Vd
ede0: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 49  beComment((v, "I
edf0: 6e 69 74 20 45 58 49 53 54 53 20 72 65 73 75 6c  nit EXISTS resul
ee00: 74 22 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  t"));.      }.  
ee10: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
ee20: 65 6c 65 74 65 28 70 53 65 6c 2d 3e 70 4c 69 6d  elete(pSel->pLim
ee30: 69 74 29 3b 0a 20 20 20 20 20 20 70 53 65 6c 2d  it);.      pSel-
ee40: 3e 70 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74 65  >pLimit = sqlite
ee50: 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
ee60: 4b 5f 49 4e 54 45 47 45 52 2c 20 30 2c 20 30 2c  K_INTEGER, 0, 0,
ee70: 20 26 6f 6e 65 29 3b 0a 20 20 20 20 20 20 69 66   &one);.      if
ee80: 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  ( sqlite3Select(
ee90: 70 50 61 72 73 65 2c 20 70 53 65 6c 2c 20 26 64  pParse, pSel, &d
eea0: 65 73 74 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29  est, 0, 0, 0, 0)
eeb0: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
eec0: 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rn;.      }.    
eed0: 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e    pExpr->iColumn
eee0: 20 3d 20 64 65 73 74 2e 69 50 61 72 6d 3b 0a 20   = dest.iParm;. 
eef0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
ef00: 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 74 65 73  }.  }..  if( tes
ef10: 74 41 64 64 72 20 29 7b 0a 20 20 20 20 73 71 6c  tAddr ){.    sql
ef20: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
ef30: 28 76 2c 20 74 65 73 74 41 64 64 72 2d 31 29 3b  (v, testAddr-1);
ef40: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 3b 0a  .  }..  return;.
ef50: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
ef60: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
ef70: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 44 75 70 6c 69   */../*.** Dupli
ef80: 63 61 74 65 20 61 6e 20 38 2d 62 79 74 65 20 76  cate an 8-byte v
ef90: 61 6c 75 65 0a 2a 2f 0a 73 74 61 74 69 63 20 63  alue.*/.static c
efa0: 68 61 72 20 2a 64 75 70 38 62 79 74 65 73 28 56  har *dup8bytes(V
efb0: 64 62 65 20 2a 76 2c 20 63 6f 6e 73 74 20 63 68  dbe *v, const ch
efc0: 61 72 20 2a 69 6e 29 7b 0a 20 20 63 68 61 72 20  ar *in){.  char 
efd0: 2a 6f 75 74 20 3d 20 73 71 6c 69 74 65 33 44 62  *out = sqlite3Db
efe0: 4d 61 6c 6c 6f 63 52 61 77 28 73 71 6c 69 74 65  MallocRaw(sqlite
eff0: 33 56 64 62 65 44 62 28 76 29 2c 20 38 29 3b 0a  3VdbeDb(v), 8);.
f000: 20 20 69 66 28 20 6f 75 74 20 29 7b 0a 20 20 20    if( out ){.   
f010: 20 6d 65 6d 63 70 79 28 6f 75 74 2c 20 69 6e 2c   memcpy(out, in,
f020: 20 38 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   8);.  }.  retur
f030: 6e 20 6f 75 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n out;.}../*.** 
f040: 47 65 6e 65 72 61 74 65 20 61 6e 20 69 6e 73 74  Generate an inst
f050: 72 75 63 74 69 6f 6e 20 74 68 61 74 20 77 69 6c  ruction that wil
f060: 6c 20 70 75 74 20 74 68 65 20 66 6c 6f 61 74 69  l put the floati
f070: 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20 76 61 6c 75  ng point.** valu
f080: 65 20 64 65 73 63 72 69 62 65 64 20 62 79 20 7a  e described by z
f090: 5b 30 2e 2e 6e 2d 31 5d 20 69 6e 74 6f 20 72 65  [0..n-1] into re
f0a0: 67 69 73 74 65 72 20 69 4d 65 6d 2e 0a 2a 2a 0a  gister iMem..**.
f0b0: 2a 2a 20 54 68 65 20 7a 5b 5d 20 73 74 72 69 6e  ** The z[] strin
f0c0: 67 20 77 69 6c 6c 20 70 72 6f 62 61 62 6c 79 20  g will probably 
f0d0: 6e 6f 74 20 62 65 20 7a 65 72 6f 2d 74 65 72 6d  not be zero-term
f0e0: 69 6e 61 74 65 64 2e 20 20 42 75 74 20 74 68 65  inated.  But the
f0f0: 20 0a 2a 2a 20 7a 5b 6e 5d 20 63 68 61 72 61 63   .** z[n] charac
f100: 74 65 72 20 69 73 20 67 75 61 72 61 6e 74 65 65  ter is guarantee
f110: 64 20 74 6f 20 62 65 20 73 6f 6d 65 74 68 69 6e  d to be somethin
f120: 67 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20  g that does not 
f130: 6c 6f 6f 6b 0a 2a 2a 20 6c 69 6b 65 20 74 68 65  look.** like the
f140: 20 63 6f 6e 74 69 6e 75 61 74 69 6f 6e 20 6f 66   continuation of
f150: 20 74 68 65 20 6e 75 6d 62 65 72 2e 0a 2a 2f 0a   the number..*/.
f160: 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65  static void code
f170: 52 65 61 6c 28 56 64 62 65 20 2a 76 2c 20 63 6f  Real(Vdbe *v, co
f180: 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74  nst char *z, int
f190: 20 6e 2c 20 69 6e 74 20 6e 65 67 61 74 65 46 6c   n, int negateFl
f1a0: 61 67 2c 20 69 6e 74 20 69 4d 65 6d 29 7b 0a 20  ag, int iMem){. 
f1b0: 20 61 73 73 65 72 74 28 20 7a 20 7c 7c 20 76 3d   assert( z || v=
f1c0: 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 56 64 62  =0 || sqlite3Vdb
f1d0: 65 44 62 28 76 29 2d 3e 6d 61 6c 6c 6f 63 46 61  eDb(v)->mallocFa
f1e0: 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 7a 20  iled );.  if( z 
f1f0: 29 7b 0a 20 20 20 20 64 6f 75 62 6c 65 20 76 61  ){.    double va
f200: 6c 75 65 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  lue;.    char *z
f210: 56 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  V;.    assert( !
f220: 69 73 64 69 67 69 74 28 7a 5b 6e 5d 29 20 29 3b  isdigit(z[n]) );
f230: 0a 20 20 20 20 73 71 6c 69 74 65 33 41 74 6f 46  .    sqlite3AtoF
f240: 28 7a 2c 20 26 76 61 6c 75 65 29 3b 0a 20 20 20  (z, &value);.   
f250: 20 69 66 28 20 6e 65 67 61 74 65 46 6c 61 67 20   if( negateFlag 
f260: 29 20 76 61 6c 75 65 20 3d 20 2d 76 61 6c 75 65  ) value = -value
f270: 3b 0a 20 20 20 20 7a 56 20 3d 20 64 75 70 38 62  ;.    zV = dup8b
f280: 79 74 65 73 28 76 2c 20 28 63 68 61 72 2a 29 26  ytes(v, (char*)&
f290: 76 61 6c 75 65 29 3b 0a 20 20 20 20 73 71 6c 69  value);.    sqli
f2a0: 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
f2b0: 20 4f 50 5f 52 65 61 6c 2c 20 30 2c 20 69 4d 65   OP_Real, 0, iMe
f2c0: 6d 2c 20 30 2c 20 7a 56 2c 20 50 34 5f 52 45 41  m, 0, zV, P4_REA
f2d0: 4c 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a  L);.  }.}.../*.*
f2e0: 2a 20 47 65 6e 65 72 61 74 65 20 61 6e 20 69 6e  * Generate an in
f2f0: 73 74 72 75 63 74 69 6f 6e 20 74 68 61 74 20 77  struction that w
f300: 69 6c 6c 20 70 75 74 20 74 68 65 20 69 6e 74 65  ill put the inte
f310: 67 65 72 20 64 65 73 63 72 69 62 65 20 62 79 0a  ger describe by.
f320: 2a 2a 20 74 65 78 74 20 7a 5b 30 2e 2e 6e 2d 31  ** text z[0..n-1
f330: 5d 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20  ] into register 
f340: 69 4d 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  iMem..**.** The 
f350: 7a 5b 5d 20 73 74 72 69 6e 67 20 77 69 6c 6c 20  z[] string will 
f360: 70 72 6f 62 61 62 6c 79 20 6e 6f 74 20 62 65 20  probably not be 
f370: 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74 65 64 2e  zero-terminated.
f380: 20 20 42 75 74 20 74 68 65 20 0a 2a 2a 20 7a 5b    But the .** z[
f390: 6e 5d 20 63 68 61 72 61 63 74 65 72 20 69 73 20  n] character is 
f3a0: 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65  guaranteed to be
f3b0: 20 73 6f 6d 65 74 68 69 6e 67 20 74 68 61 74 20   something that 
f3c0: 64 6f 65 73 20 6e 6f 74 20 6c 6f 6f 6b 0a 2a 2a  does not look.**
f3d0: 20 6c 69 6b 65 20 74 68 65 20 63 6f 6e 74 69 6e   like the contin
f3e0: 75 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e 75  uation of the nu
f3f0: 6d 62 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  mber..*/.static 
f400: 76 6f 69 64 20 63 6f 64 65 49 6e 74 65 67 65 72  void codeInteger
f410: 28 56 64 62 65 20 2a 76 2c 20 63 6f 6e 73 74 20  (Vdbe *v, const 
f420: 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 2c 20  char *z, int n, 
f430: 69 6e 74 20 6e 65 67 46 6c 61 67 2c 20 69 6e 74  int negFlag, int
f440: 20 69 4d 65 6d 29 7b 0a 20 20 61 73 73 65 72 74   iMem){.  assert
f450: 28 20 7a 20 7c 7c 20 76 3d 3d 30 20 7c 7c 20 73  ( z || v==0 || s
f460: 71 6c 69 74 65 33 56 64 62 65 44 62 28 76 29 2d  qlite3VdbeDb(v)-
f470: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
f480: 0a 20 20 69 66 28 20 7a 20 29 7b 0a 20 20 20 20  .  if( z ){.    
f490: 69 6e 74 20 69 3b 0a 20 20 20 20 61 73 73 65 72  int i;.    asser
f4a0: 74 28 20 21 69 73 64 69 67 69 74 28 7a 5b 6e 5d  t( !isdigit(z[n]
f4b0: 29 20 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  ) );.    if( sql
f4c0: 69 74 65 33 47 65 74 49 6e 74 33 32 28 7a 2c 20  ite3GetInt32(z, 
f4d0: 26 69 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28  &i) ){.      if(
f4e0: 20 6e 65 67 46 6c 61 67 20 29 20 69 20 3d 20 2d   negFlag ) i = -
f4f0: 69 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  i;.      sqlite3
f500: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
f510: 5f 49 6e 74 65 67 65 72 2c 20 69 2c 20 69 4d 65  _Integer, i, iMe
f520: 6d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  m);.    }else if
f530: 28 20 73 71 6c 69 74 65 33 46 69 74 73 49 6e 36  ( sqlite3FitsIn6
f540: 34 42 69 74 73 28 7a 2c 20 6e 65 67 46 6c 61 67  4Bits(z, negFlag
f550: 29 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 76  ) ){.      i64 v
f560: 61 6c 75 65 3b 0a 20 20 20 20 20 20 63 68 61 72  alue;.      char
f570: 20 2a 7a 56 3b 0a 20 20 20 20 20 20 73 71 6c 69   *zV;.      sqli
f580: 74 65 33 41 74 6f 69 36 34 28 7a 2c 20 26 76 61  te3Atoi64(z, &va
f590: 6c 75 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  lue);.      if( 
f5a0: 6e 65 67 46 6c 61 67 20 29 20 76 61 6c 75 65 20  negFlag ) value 
f5b0: 3d 20 2d 76 61 6c 75 65 3b 0a 20 20 20 20 20 20  = -value;.      
f5c0: 7a 56 20 3d 20 64 75 70 38 62 79 74 65 73 28 76  zV = dup8bytes(v
f5d0: 2c 20 28 63 68 61 72 2a 29 26 76 61 6c 75 65 29  , (char*)&value)
f5e0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
f5f0: 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
f600: 49 6e 74 36 34 2c 20 30 2c 20 69 4d 65 6d 2c 20  Int64, 0, iMem, 
f610: 30 2c 20 7a 56 2c 20 50 34 5f 49 4e 54 36 34 29  0, zV, P4_INT64)
f620: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
f630: 20 20 20 63 6f 64 65 52 65 61 6c 28 76 2c 20 7a     codeReal(v, z
f640: 2c 20 6e 2c 20 6e 65 67 46 6c 61 67 2c 20 69 4d  , n, negFlag, iM
f650: 65 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  em);.    }.  }.}
f660: 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  .../*.** Generat
f670: 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
f680: 20 65 78 74 72 61 63 74 20 74 68 65 20 69 43 6f   extract the iCo
f690: 6c 75 6d 6e 2d 74 68 20 63 6f 6c 75 6d 6e 20 66  lumn-th column f
f6a0: 72 6f 6d 0a 2a 2a 20 74 61 62 6c 65 20 70 54 61  rom.** table pTa
f6b0: 62 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20  b and store the 
f6c0: 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69 6e 20  column value in 
f6d0: 61 20 72 65 67 69 73 74 65 72 2e 20 20 41 6e 20  a register.  An 
f6e0: 65 66 66 6f 72 74 0a 2a 2a 20 69 73 20 6d 61 64  effort.** is mad
f6f0: 65 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 63  e to store the c
f700: 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69 6e 20 72  olumn value in r
f710: 65 67 69 73 74 65 72 20 69 52 65 67 2c 20 62 75  egister iReg, bu
f720: 74 20 74 68 69 73 20 69 73 0a 2a 2a 20 6e 6f 74  t this is.** not
f730: 20 67 75 61 72 61 6e 74 65 65 64 2e 20 20 54 68   guaranteed.  Th
f740: 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68  e location of th
f750: 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69  e column value i
f760: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  s returned..**.*
f770: 2a 20 54 68 65 72 65 20 6d 75 73 74 20 62 65 20  * There must be 
f780: 61 6e 20 6f 70 65 6e 20 63 75 72 73 6f 72 20 74  an open cursor t
f790: 6f 20 70 54 61 62 20 69 6e 20 69 54 61 62 6c 65  o pTab in iTable
f7a0: 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
f7b0: 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 2e  ne.** is called.
f7c0: 20 20 49 66 20 69 43 6f 6c 75 6d 6e 3c 30 20 74    If iColumn<0 t
f7d0: 68 65 6e 20 63 6f 64 65 20 69 73 20 67 65 6e 65  hen code is gene
f7e0: 72 61 74 65 64 20 74 68 61 74 20 65 78 74 72 61  rated that extra
f7f0: 63 74 73 20 74 68 65 20 72 6f 77 69 64 2e 0a 2a  cts the rowid..*
f800: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
f810: 65 20 6d 69 67 68 74 20 61 74 74 65 6d 70 74 20  e might attempt 
f820: 74 6f 20 72 65 75 73 65 20 74 68 65 20 76 61 6c  to reuse the val
f830: 75 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  ue of the column
f840: 20 74 68 61 74 0a 2a 2a 20 68 61 73 20 61 6c 72   that.** has alr
f850: 65 61 64 79 20 62 65 65 6e 20 6c 6f 61 64 65 64  eady been loaded
f860: 20 69 6e 74 6f 20 61 20 72 65 67 69 73 74 65 72   into a register
f870: 2e 20 20 54 68 65 20 76 61 6c 75 65 20 77 69 6c  .  The value wil
f880: 6c 20 61 6c 77 61 79 73 0a 2a 2a 20 62 65 20 75  l always.** be u
f890: 73 65 64 20 69 66 20 69 74 20 68 61 73 20 6e 6f  sed if it has no
f8a0: 74 20 75 6e 64 65 72 67 6f 6e 65 20 61 6e 79 20  t undergone any 
f8b0: 61 66 66 69 6e 69 74 79 20 63 68 61 6e 67 65 73  affinity changes
f8c0: 2e 20 20 42 75 74 20 69 66 0a 2a 2a 20 61 6e 20  .  But if.** an 
f8d0: 61 66 66 69 6e 69 74 79 20 63 68 61 6e 67 65 20  affinity change 
f8e0: 68 61 73 20 6f 63 63 75 72 72 65 64 2c 20 74 68  has occurred, th
f8f0: 65 6e 20 74 68 65 20 63 61 63 68 65 64 20 76 61  en the cached va
f900: 6c 75 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 62 65  lue will only be
f910: 0a 2a 2a 20 75 73 65 64 20 69 66 20 61 6c 6c 6f  .** used if allo
f920: 77 41 66 66 43 68 6e 67 20 69 73 20 74 72 75 65  wAffChng is true
f930: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
f940: 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d  ExprCodeGetColum
f950: 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  n(.  Parse *pPar
f960: 73 65 2c 20 20 20 2f 2a 20 50 61 72 73 69 6e 67  se,   /* Parsing
f970: 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61   and code genera
f980: 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  ting context */.
f990: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20    Table *pTab,  
f9a0: 20 20 20 2f 2a 20 44 65 73 63 72 69 70 74 69 6f     /* Descriptio
f9b0: 6e 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 77  n of the table w
f9c0: 65 20 61 72 65 20 72 65 61 64 69 6e 67 20 66 72  e are reading fr
f9d0: 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c  om */.  int iCol
f9e0: 75 6d 6e 2c 20 20 20 20 20 2f 2a 20 49 6e 64 65  umn,     /* Inde
f9f0: 78 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 63  x of the table c
fa00: 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  olumn */.  int i
fa10: 54 61 62 6c 65 2c 20 20 20 20 20 20 2f 2a 20 54  Table,      /* T
fa20: 68 65 20 63 75 72 73 6f 72 20 70 6f 69 6e 74 69  he cursor pointi
fa30: 6e 67 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20  ng to the table 
fa40: 2a 2f 0a 20 20 69 6e 74 20 69 52 65 67 2c 20 20  */.  int iReg,  
fa50: 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 72        /* Store r
fa60: 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 20  esults here */. 
fa70: 20 69 6e 74 20 61 6c 6c 6f 77 41 66 66 43 68 6e   int allowAffChn
fa80: 67 20 2f 2a 20 54 72 75 65 20 69 66 20 70 72 69  g /* True if pri
fa90: 6f 72 20 61 66 66 69 6e 69 74 79 20 63 68 61 6e  or affinity chan
faa0: 67 65 73 20 61 72 65 20 4f 4b 20 2a 2f 0a 29 7b  ges are OK */.){
fab0: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
fac0: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
fad0: 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 79 43  t i;.  struct yC
fae0: 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 0a 20 20 66  olCache *p;..  f
faf0: 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65  or(i=0, p=pParse
fb00: 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 70  ->aColCache; i<p
fb10: 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65  Parse->nColCache
fb20: 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20  ; i++, p++){.   
fb30: 20 69 66 28 20 70 2d 3e 69 54 61 62 6c 65 3d 3d   if( p->iTable==
fb40: 69 54 61 62 6c 65 20 26 26 20 70 2d 3e 69 43 6f  iTable && p->iCo
fb50: 6c 75 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e 0a 20 20  lumn==iColumn.  
fb60: 20 20 20 20 20 20 20 20 20 26 26 20 28 21 70 2d           && (!p-
fb70: 3e 61 66 66 43 68 61 6e 67 65 20 7c 7c 20 61 6c  >affChange || al
fb80: 6c 6f 77 41 66 66 43 68 6e 67 29 20 29 7b 0a 23  lowAffChng) ){.#
fb90: 69 66 20 30 0a 20 20 20 20 20 20 73 71 6c 69 74  if 0.      sqlit
fba0: 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20  e3VdbeAddOp0(v, 
fbb0: 4f 50 5f 4e 6f 6f 70 29 3b 0a 20 20 20 20 20 20  OP_Noop);.      
fbc0: 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
fbd0: 22 4f 50 54 3a 20 74 61 62 25 64 2e 63 6f 6c 25  "OPT: tab%d.col%
fbe0: 64 20 2d 3e 20 72 25 64 22 2c 20 69 54 61 62 6c  d -> r%d", iTabl
fbf0: 65 2c 20 69 43 6f 6c 75 6d 6e 2c 20 70 2d 3e 69  e, iColumn, p->i
fc00: 52 65 67 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20  Reg));.#endif.  
fc10: 20 20 20 20 72 65 74 75 72 6e 20 70 2d 3e 69 52      return p->iR
fc20: 65 67 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 20 0a  eg;.    }.  }  .
fc30: 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29    assert( v!=0 )
fc40: 3b 0a 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3c  ;.  if( iColumn<
fc50: 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6f 70 20  0 ){.    int op 
fc60: 3d 20 28 70 54 61 62 20 26 26 20 49 73 56 69 72  = (pTab && IsVir
fc70: 74 75 61 6c 28 70 54 61 62 29 29 20 3f 20 4f 50  tual(pTab)) ? OP
fc80: 5f 56 52 6f 77 69 64 20 3a 20 4f 50 5f 52 6f 77  _VRowid : OP_Row
fc90: 69 64 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  id;.    sqlite3V
fca0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c  dbeAddOp2(v, op,
fcb0: 20 69 54 61 62 6c 65 2c 20 69 52 65 67 29 3b 0a   iTable, iReg);.
fcc0: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54 61 62    }else if( pTab
fcd0: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
fce0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
fcf0: 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 54 61 62 6c  OP_Column, iTabl
fd00: 65 2c 20 69 43 6f 6c 75 6d 6e 2c 20 69 52 65 67  e, iColumn, iReg
fd10: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
fd20: 69 6e 74 20 6f 70 20 3d 20 49 73 56 69 72 74 75  int op = IsVirtu
fd30: 61 6c 28 70 54 61 62 29 20 3f 20 4f 50 5f 56 43  al(pTab) ? OP_VC
fd40: 6f 6c 75 6d 6e 20 3a 20 4f 50 5f 43 6f 6c 75 6d  olumn : OP_Colum
fd50: 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  n;.    sqlite3Vd
fd60: 62 65 41 64 64 4f 70 33 28 76 2c 20 6f 70 2c 20  beAddOp3(v, op, 
fd70: 69 54 61 62 6c 65 2c 20 69 43 6f 6c 75 6d 6e 2c  iTable, iColumn,
fd80: 20 69 52 65 67 29 3b 0a 20 20 20 20 73 71 6c 69   iReg);.    sqli
fd90: 74 65 33 43 6f 6c 75 6d 6e 44 65 66 61 75 6c 74  te3ColumnDefault
fda0: 28 76 2c 20 70 54 61 62 2c 20 69 43 6f 6c 75 6d  (v, pTab, iColum
fdb0: 6e 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  n);.#ifndef SQLI
fdc0: 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47  TE_OMIT_FLOATING
fdd0: 5f 50 4f 49 4e 54 0a 20 20 20 20 69 66 28 20 70  _POINT.    if( p
fde0: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 75 6d  Tab->aCol[iColum
fdf0: 6e 5d 2e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c  n].affinity==SQL
fe00: 49 54 45 5f 41 46 46 5f 52 45 41 4c 20 29 7b 0a  ITE_AFF_REAL ){.
fe10: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
fe20: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65  eAddOp1(v, OP_Re
fe30: 61 6c 41 66 66 69 6e 69 74 79 2c 20 69 52 65 67  alAffinity, iReg
fe40: 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
fe50: 20 20 7d 0a 20 20 69 66 28 20 70 50 61 72 73 65    }.  if( pParse
fe60: 2d 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61 63 68  ->disableColCach
fe70: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 69 20 3d 20  e==0 ){.    i = 
fe80: 70 50 61 72 73 65 2d 3e 69 43 6f 6c 43 61 63 68  pParse->iColCach
fe90: 65 3b 0a 20 20 20 20 70 20 3d 20 26 70 50 61 72  e;.    p = &pPar
fea0: 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 69 5d  se->aColCache[i]
feb0: 3b 0a 20 20 20 20 70 2d 3e 69 54 61 62 6c 65 20  ;.    p->iTable 
fec0: 3d 20 69 54 61 62 6c 65 3b 0a 20 20 20 20 70 2d  = iTable;.    p-
fed0: 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69 43 6f 6c 75  >iColumn = iColu
fee0: 6d 6e 3b 0a 20 20 20 20 70 2d 3e 69 52 65 67 20  mn;.    p->iReg 
fef0: 3d 20 69 52 65 67 3b 0a 20 20 20 20 70 2d 3e 61  = iReg;.    p->a
ff00: 66 66 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20  ffChange = 0;.  
ff10: 20 20 69 2b 2b 3b 0a 20 20 20 20 69 66 28 20 69    i++;.    if( i
ff20: 3e 3d 41 72 72 61 79 53 69 7a 65 28 70 50 61 72  >=ArraySize(pPar
ff30: 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 29 20 29  se->aColCache) )
ff40: 20 69 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20   i = 0;.    if( 
ff50: 69 3e 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61  i>pParse->nColCa
ff60: 63 68 65 20 29 20 70 50 61 72 73 65 2d 3e 6e 43  che ) pParse->nC
ff70: 6f 6c 43 61 63 68 65 20 3d 20 69 3b 0a 20 20 20  olCache = i;.   
ff80: 20 70 50 61 72 73 65 2d 3e 69 43 6f 6c 43 61 63   pParse->iColCac
ff90: 68 65 20 3d 20 69 3b 0a 20 20 7d 0a 20 20 72 65  he = i;.  }.  re
ffa0: 74 75 72 6e 20 69 52 65 67 3b 0a 7d 0a 0a 2f 2a  turn iReg;.}../*
ffb0: 0a 2a 2a 20 43 6c 65 61 72 20 61 6c 6c 20 63 6f  .** Clear all co
ffc0: 6c 75 6d 6e 20 63 61 63 68 65 20 65 6e 74 72 69  lumn cache entri
ffd0: 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
ffe0: 74 68 20 74 68 65 20 76 64 62 65 0a 2a 2a 20 63  th the vdbe.** c
fff0: 75 72 73 6f 72 20 77 69 74 68 20 63 75 72 73 6f  ursor with curso
10000 72 20 6e 75 6d 62 65 72 20 69 54 61 62 6c 65 2e  r number iTable.
10010 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
10020 45 78 70 72 43 6c 65 61 72 43 6f 6c 75 6d 6e 43  ExprClearColumnC
10030 61 63 68 65 28 50 61 72 73 65 20 2a 70 50 61 72  ache(Parse *pPar
10040 73 65 2c 20 69 6e 74 20 69 54 61 62 6c 65 29 7b  se, int iTable){
10050 0a 20 20 69 66 28 20 69 54 61 62 6c 65 3c 30 20  .  if( iTable<0 
10060 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  ){.    pParse->n
10070 43 6f 6c 43 61 63 68 65 20 3d 20 30 3b 0a 20 20  ColCache = 0;.  
10080 20 20 70 50 61 72 73 65 2d 3e 69 43 6f 6c 43 61    pParse->iColCa
10090 63 68 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  che = 0;.  }else
100a0 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
100b0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72   for(i=0; i<pPar
100c0 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 3b 20 69  se->nColCache; i
100d0 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ++){.      if( p
100e0 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65  Parse->aColCache
100f0 5b 69 5d 2e 69 54 61 62 6c 65 3d 3d 69 54 61 62  [i].iTable==iTab
10100 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 74 65  le ){.        te
10110 73 74 63 61 73 65 28 20 69 3d 3d 70 50 61 72 73  stcase( i==pPars
10120 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 2d 31 20 29  e->nColCache-1 )
10130 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65  ;.        pParse
10140 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 69 5d 20 3d  ->aColCache[i] =
10150 20 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63   pParse->aColCac
10160 68 65 5b 2d 2d 70 50 61 72 73 65 2d 3e 6e 43 6f  he[--pParse->nCo
10170 6c 43 61 63 68 65 5d 3b 0a 20 20 20 20 20 20 20  lCache];.       
10180 20 70 50 61 72 73 65 2d 3e 69 43 6f 6c 43 61 63   pParse->iColCac
10190 68 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 43 6f  he = pParse->nCo
101a0 6c 43 61 63 68 65 3b 0a 20 20 20 20 20 20 7d 0a  lCache;.      }.
101b0 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
101c0 2a 2a 20 52 65 63 6f 72 64 20 74 68 65 20 66 61  ** Record the fa
101d0 63 74 20 74 68 61 74 20 61 6e 20 61 66 66 69 6e  ct that an affin
101e0 69 74 79 20 63 68 61 6e 67 65 20 68 61 73 20 6f  ity change has o
101f0 63 63 75 72 72 65 64 20 6f 6e 20 69 43 6f 75 6e  ccurred on iCoun
10200 74 0a 2a 2a 20 72 65 67 69 73 74 65 72 73 20 73  t.** registers s
10210 74 61 72 74 69 6e 67 20 77 69 74 68 20 69 53 74  tarting with iSt
10220 61 72 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  art..*/.void sql
10230 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66  ite3ExprCacheAff
10240 69 6e 69 74 79 43 68 61 6e 67 65 28 50 61 72 73  inityChange(Pars
10250 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
10260 53 74 61 72 74 2c 20 69 6e 74 20 69 43 6f 75 6e  Start, int iCoun
10270 74 29 7b 0a 20 20 69 6e 74 20 69 45 6e 64 20 3d  t){.  int iEnd =
10280 20 69 53 74 61 72 74 20 2b 20 69 43 6f 75 6e 74   iStart + iCount
10290 20 2d 20 31 3b 0a 20 20 69 6e 74 20 69 3b 0a 20   - 1;.  int i;. 
102a0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72   for(i=0; i<pPar
102b0 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 3b 20 69  se->nColCache; i
102c0 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 72 20 3d  ++){.    int r =
102d0 20 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63   pParse->aColCac
102e0 68 65 5b 69 5d 2e 69 52 65 67 3b 0a 20 20 20 20  he[i].iReg;.    
102f0 69 66 28 20 72 3e 3d 69 53 74 61 72 74 20 26 26  if( r>=iStart &&
10300 20 72 3c 3d 69 45 6e 64 20 29 7b 0a 20 20 20 20   r<=iEnd ){.    
10310 20 20 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61    pParse->aColCa
10320 63 68 65 5b 69 5d 2e 61 66 66 43 68 61 6e 67 65  che[i].affChange
10330 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 1;.    }.  }.
10340 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
10350 65 20 63 6f 64 65 20 74 6f 20 6d 6f 76 65 73 20  e code to moves 
10360 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 6f 6e 65  content from one
10370 20 72 65 67 69 73 74 65 72 20 74 6f 20 61 6e 6f   register to ano
10380 74 68 65 72 2e 0a 2a 2a 20 4b 65 65 70 20 74 68  ther..** Keep th
10390 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 75  e column cache u
103a0 70 2d 74 6f 2d 64 61 74 65 2e 0a 2a 2f 0a 76 6f  p-to-date..*/.vo
103b0 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  id sqlite3ExprCo
103c0 64 65 4d 6f 76 65 28 50 61 72 73 65 20 2a 70 50  deMove(Parse *pP
103d0 61 72 73 65 2c 20 69 6e 74 20 69 46 72 6f 6d 2c  arse, int iFrom,
103e0 20 69 6e 74 20 69 54 6f 29 7b 0a 20 20 69 6e 74   int iTo){.  int
103f0 20 69 3b 0a 20 20 69 66 28 20 69 46 72 6f 6d 3d   i;.  if( iFrom=
10400 3d 69 54 6f 20 29 20 72 65 74 75 72 6e 3b 0a 20  =iTo ) return;. 
10410 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10420 70 32 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65  p2(pParse->pVdbe
10430 2c 20 4f 50 5f 4d 6f 76 65 2c 20 69 46 72 6f 6d  , OP_Move, iFrom
10440 2c 20 69 54 6f 29 3b 0a 20 20 66 6f 72 28 69 3d  , iTo);.  for(i=
10450 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 43 6f  0; i<pParse->nCo
10460 6c 43 61 63 68 65 3b 20 69 2b 2b 29 7b 0a 20 20  lCache; i++){.  
10470 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 61 43    if( pParse->aC
10480 6f 6c 43 61 63 68 65 5b 69 5d 2e 69 52 65 67 3d  olCache[i].iReg=
10490 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20  =iFrom ){.      
104a0 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68  pParse->aColCach
104b0 65 5b 69 5d 2e 69 52 65 67 20 3d 20 69 54 6f 3b  e[i].iReg = iTo;
104c0 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
104d0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
104e0 69 66 20 61 6e 79 20 72 65 67 69 73 74 65 72 20  if any register 
104f0 69 6e 20 74 68 65 20 72 61 6e 67 65 20 69 46 72  in the range iFr
10500 6f 6d 2e 2e 69 54 6f 20 28 69 6e 63 6c 75 73 69  om..iTo (inclusi
10510 76 65 29 0a 2a 2a 20 69 73 20 75 73 65 64 20 61  ve).** is used a
10520 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 63 6f  s part of the co
10530 6c 75 6d 6e 20 63 61 63 68 65 2e 0a 2a 2f 0a 73  lumn cache..*/.s
10540 74 61 74 69 63 20 69 6e 74 20 75 73 65 64 41 73  tatic int usedAs
10550 43 6f 6c 75 6d 6e 43 61 63 68 65 28 50 61 72 73  ColumnCache(Pars
10560 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
10570 46 72 6f 6d 2c 20 69 6e 74 20 69 54 6f 29 7b 0a  From, int iTo){.
10580 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
10590 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 43  =0; i<pParse->nC
105a0 6f 6c 43 61 63 68 65 3b 20 69 2b 2b 29 7b 0a 20  olCache; i++){. 
105b0 20 20 20 69 6e 74 20 72 20 3d 20 70 50 61 72 73     int r = pPars
105c0 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 69 5d 2e  e->aColCache[i].
105d0 69 52 65 67 3b 0a 20 20 20 20 69 66 28 20 72 3e  iReg;.    if( r>
105e0 3d 69 46 72 6f 6d 20 26 26 20 72 3c 3d 69 54 6f  =iFrom && r<=iTo
105f0 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d   ) return 1;.  }
10600 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
10610 2f 2a 0a 2a 2a 20 54 68 65 72 65 73 20 69 73 20  /*.** Theres is 
10620 61 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73  a value in regis
10630 74 65 72 20 69 43 75 72 72 65 6e 74 2e 20 20 57  ter iCurrent.  W
10640 65 20 75 6c 74 69 6d 61 74 65 6c 79 20 77 61 6e  e ultimately wan
10650 74 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 74  t.** the value t
10660 6f 20 62 65 20 69 6e 20 72 65 67 69 73 74 65 72  o be in register
10670 20 69 54 61 72 67 65 74 2e 20 20 49 74 20 6d 69   iTarget.  It mi
10680 67 68 74 20 62 65 20 74 68 61 74 0a 2a 2a 20 69  ght be that.** i
10690 43 75 72 72 65 6e 74 20 61 6e 64 20 69 54 61 72  Current and iTar
106a0 67 65 74 20 61 72 65 20 74 68 65 20 73 61 6d 65  get are the same
106b0 20 72 65 67 69 73 74 65 72 2e 0a 2a 2a 0a 2a 2a   register..**.**
106c0 20 57 65 20 61 72 65 20 67 6f 69 6e 67 20 74 6f   We are going to
106d0 20 6d 6f 64 69 66 79 20 74 68 65 20 76 61 6c 75   modify the valu
106e0 65 2c 20 73 6f 20 77 65 20 6e 65 65 64 20 74 6f  e, so we need to
106f0 20 6d 61 6b 65 20 73 75 72 65 20 69 74 0a 2a 2a   make sure it.**
10700 20 69 73 20 6e 6f 74 20 61 20 63 61 63 68 65 64   is not a cached
10710 20 72 65 67 69 73 74 65 72 2e 20 20 49 66 20 69   register.  If i
10720 43 75 72 72 65 6e 74 20 69 73 20 61 20 63 61 63  Current is a cac
10730 68 65 64 20 72 65 67 69 73 74 65 72 2c 0a 2a 2a  hed register,.**
10740 20 74 68 65 6e 20 74 72 79 20 74 6f 20 6d 6f 76   then try to mov
10750 65 20 74 68 65 20 76 61 6c 75 65 20 6f 76 65 72  e the value over
10760 20 74 6f 20 69 54 61 72 67 65 74 2e 20 20 49 66   to iTarget.  If
10770 20 69 54 61 72 67 65 74 20 69 73 20 61 0a 2a 2a   iTarget is a.**
10780 20 63 61 63 68 65 64 20 72 65 67 69 73 74 65 72   cached register
10790 2c 20 74 68 65 6e 20 63 6c 65 61 72 20 74 68 65  , then clear the
107a0 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 63   corresponding c
107b0 61 63 68 65 20 6c 69 6e 65 2e 0a 2a 2a 0a 2a 2a  ache line..**.**
107c0 20 52 65 74 75 72 6e 20 74 68 65 20 72 65 67 69   Return the regi
107d0 73 74 65 72 20 74 68 61 74 20 74 68 65 20 76 61  ster that the va
107e0 6c 75 65 20 65 6e 64 73 20 75 70 20 69 6e 2e 0a  lue ends up in..
107f0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
10800 70 72 57 72 69 74 61 62 6c 65 52 65 67 69 73 74  prWritableRegist
10810 65 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  er(Parse *pParse
10820 2c 20 69 6e 74 20 69 43 75 72 72 65 6e 74 2c 20  , int iCurrent, 
10830 69 6e 74 20 69 54 61 72 67 65 74 29 7b 0a 20 20  int iTarget){.  
10840 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28  int i;.  assert(
10850 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 21 3d   pParse->pVdbe!=
10860 30 20 29 3b 0a 20 20 69 66 28 20 21 75 73 65 64  0 );.  if( !used
10870 41 73 43 6f 6c 75 6d 6e 43 61 63 68 65 28 70 50  AsColumnCache(pP
10880 61 72 73 65 2c 20 69 43 75 72 72 65 6e 74 2c 20  arse, iCurrent, 
10890 69 43 75 72 72 65 6e 74 29 20 29 7b 0a 20 20 20  iCurrent) ){.   
108a0 20 72 65 74 75 72 6e 20 69 43 75 72 72 65 6e 74   return iCurrent
108b0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 43 75 72  ;.  }.  if( iCur
108c0 72 65 6e 74 21 3d 69 54 61 72 67 65 74 20 29 7b  rent!=iTarget ){
108d0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
108e0 41 64 64 4f 70 32 28 70 50 61 72 73 65 2d 3e 70  AddOp2(pParse->p
108f0 56 64 62 65 2c 20 4f 50 5f 53 43 6f 70 79 2c 20  Vdbe, OP_SCopy, 
10900 69 43 75 72 72 65 6e 74 2c 20 69 54 61 72 67 65  iCurrent, iTarge
10910 74 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d  t);.  }.  for(i=
10920 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 43 6f  0; i<pParse->nCo
10930 6c 43 61 63 68 65 3b 20 69 2b 2b 29 7b 0a 20 20  lCache; i++){.  
10940 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 61 43    if( pParse->aC
10950 6f 6c 43 61 63 68 65 5b 69 5d 2e 69 52 65 67 3d  olCache[i].iReg=
10960 3d 69 54 61 72 67 65 74 20 29 7b 0a 20 20 20 20  =iTarget ){.    
10970 20 20 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61    pParse->aColCa
10980 63 68 65 5b 69 5d 20 3d 20 70 50 61 72 73 65 2d  che[i] = pParse-
10990 3e 61 43 6f 6c 43 61 63 68 65 5b 2d 2d 70 50 61  >aColCache[--pPa
109a0 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 5d 3b  rse->nColCache];
109b0 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 69  .      pParse->i
109c0 43 6f 6c 43 61 63 68 65 20 3d 20 70 50 61 72 73  ColCache = pPars
109d0 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 3b 0a 20 20  e->nColCache;.  
109e0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
109f0 20 69 54 61 72 67 65 74 3b 0a 7d 0a 0a 2f 2a 0a   iTarget;.}../*.
10a00 2a 2a 20 49 66 20 74 68 65 20 6c 61 73 74 20 69  ** If the last i
10a10 6e 73 74 72 75 63 74 69 6f 6e 20 63 6f 64 65 64  nstruction coded
10a20 20 69 73 20 61 6e 20 65 70 68 65 6d 65 72 61 6c   is an ephemeral
10a30 20 63 6f 70 79 20 6f 66 20 61 6e 79 20 6f 66 0a   copy of any of.
10a40 2a 2a 20 74 68 65 20 72 65 67 69 73 74 65 72 73  ** the registers
10a50 20 69 6e 20 74 68 65 20 6e 52 65 67 20 72 65 67   in the nReg reg
10a60 69 73 74 65 72 73 20 62 65 67 69 6e 6e 69 6e 67  isters beginning
10a70 20 77 69 74 68 20 69 52 65 67 2c 20 74 68 65 6e   with iReg, then
10a80 0a 2a 2a 20 63 6f 6e 76 65 72 74 20 74 68 65 20  .** convert the 
10a90 6c 61 73 74 20 69 6e 73 74 72 75 63 74 69 6f 6e  last instruction
10aa0 20 66 72 6f 6d 20 4f 50 5f 53 43 6f 70 79 20 74   from OP_SCopy t
10ab0 6f 20 4f 50 5f 43 6f 70 79 2e 0a 2a 2f 0a 76 6f  o OP_Copy..*/.vo
10ac0 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 48 61  id sqlite3ExprHa
10ad0 72 64 43 6f 70 79 28 50 61 72 73 65 20 2a 70 50  rdCopy(Parse *pP
10ae0 61 72 73 65 2c 20 69 6e 74 20 69 52 65 67 2c 20  arse, int iReg, 
10af0 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20 69 6e 74  int nReg){.  int
10b00 20 61 64 64 72 3b 0a 20 20 56 64 62 65 4f 70 20   addr;.  VdbeOp 
10b10 2a 70 4f 70 3b 0a 20 20 56 64 62 65 20 2a 76 3b  *pOp;.  Vdbe *v;
10b20 0a 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e  ..  v = pParse->
10b30 70 56 64 62 65 3b 0a 20 20 61 64 64 72 20 3d 20  pVdbe;.  addr = 
10b40 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
10b50 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 70 4f 70  ntAddr(v);.  pOp
10b60 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47 65   = sqlite3VdbeGe
10b70 74 4f 70 28 76 2c 20 61 64 64 72 2d 31 29 3b 0a  tOp(v, addr-1);.
10b80 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64    if( pOp->opcod
10b90 65 3d 3d 4f 50 5f 53 43 6f 70 79 20 26 26 20 70  e==OP_SCopy && p
10ba0 4f 70 2d 3e 70 31 3e 3d 69 52 65 67 20 26 26 20  Op->p1>=iReg && 
10bb0 70 4f 70 2d 3e 70 31 3c 69 52 65 67 2b 6e 52 65  pOp->p1<iReg+nRe
10bc0 67 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 6f 70  g ){.    pOp->op
10bd0 63 6f 64 65 20 3d 20 4f 50 5f 43 6f 70 79 3b 0a  code = OP_Copy;.
10be0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e    }.}../*.** Gen
10bf0 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20  erate code into 
10c00 74 68 65 20 63 75 72 72 65 6e 74 20 56 64 62 65  the current Vdbe
10c10 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65   to evaluate the
10c20 20 67 69 76 65 6e 0a 2a 2a 20 65 78 70 72 65 73   given.** expres
10c30 73 69 6f 6e 2e 20 20 41 74 74 65 6d 70 74 20 74  sion.  Attempt t
10c40 6f 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75  o store the resu
10c50 6c 74 73 20 69 6e 20 72 65 67 69 73 74 65 72 20  lts in register 
10c60 22 74 61 72 67 65 74 22 2e 0a 2a 2a 20 52 65 74  "target"..** Ret
10c70 75 72 6e 20 74 68 65 20 72 65 67 69 73 74 65 72  urn the register
10c80 20 77 68 65 72 65 20 72 65 73 75 6c 74 73 20 61   where results a
10c90 72 65 20 73 74 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a  re stored..**.**
10ca0 20 57 69 74 68 20 74 68 69 73 20 72 6f 75 74 69   With this routi
10cb0 6e 65 2c 20 74 68 65 72 65 20 69 73 20 6e 6f 20  ne, there is no 
10cc0 67 75 61 72 61 6e 74 65 65 64 20 74 68 61 74 20  guaranteed that 
10cd0 72 65 73 75 6c 74 73 20 77 69 6c 6c 0a 2a 2a 20  results will.** 
10ce0 62 65 20 73 74 6f 72 65 64 20 69 6e 20 74 61 72  be stored in tar
10cf0 67 65 74 2e 20 20 54 68 65 20 72 65 73 75 6c 74  get.  The result
10d00 20 6d 69 67 68 74 20 62 65 20 73 74 6f 72 65 64   might be stored
10d10 20 69 6e 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a   in some other.*
10d20 2a 20 72 65 67 69 73 74 65 72 20 69 66 20 69 74  * register if it
10d30 20 69 73 20 63 6f 6e 76 65 6e 69 65 6e 74 20 74   is convenient t
10d40 6f 20 64 6f 20 73 6f 2e 20 20 54 68 65 20 63 61  o do so.  The ca
10d50 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a 2a  lling function.*
10d60 2a 20 6d 75 73 74 20 63 68 65 63 6b 20 74 68 65  * must check the
10d70 20 72 65 74 75 72 6e 20 63 6f 64 65 20 61 6e 64   return code and
10d80 20 6d 6f 76 65 20 74 68 65 20 72 65 73 75 6c 74   move the result
10d90 73 20 74 6f 20 74 68 65 20 64 65 73 69 72 65 64  s to the desired
10da0 0a 2a 2a 20 72 65 67 69 73 74 65 72 2e 0a 2a 2f  .** register..*/
10db0 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
10dc0 43 6f 64 65 54 61 72 67 65 74 28 50 61 72 73 65  CodeTarget(Parse
10dd0 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
10de0 70 45 78 70 72 2c 20 69 6e 74 20 74 61 72 67 65  pExpr, int targe
10df0 74 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  t){.  Vdbe *v = 
10e00 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20  pParse->pVdbe;  
10e10 2f 2a 20 54 68 65 20 56 4d 20 75 6e 64 65 72 20  /* The VM under 
10e20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a  construction */.
10e30 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20    int op;       
10e40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
10e50 68 65 20 6f 70 63 6f 64 65 20 62 65 69 6e 67 20  he opcode being 
10e60 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69  coded */.  int i
10e70 6e 52 65 67 20 3d 20 74 61 72 67 65 74 3b 20 20  nReg = target;  
10e80 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 73 20       /* Results 
10e90 73 74 6f 72 65 64 20 69 6e 20 72 65 67 69 73 74  stored in regist
10ea0 65 72 20 69 6e 52 65 67 20 2a 2f 0a 20 20 69 6e  er inReg */.  in
10eb0 74 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b 20  t regFree1 = 0; 
10ec0 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f          /* If no
10ed0 6e 2d 7a 65 72 6f 20 66 72 65 65 20 74 68 69 73  n-zero free this
10ee0 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73   temporary regis
10ef0 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  ter */.  int reg
10f00 46 72 65 65 32 20 3d 20 30 3b 20 20 20 20 20 20  Free2 = 0;      
10f10 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72     /* If non-zer
10f20 6f 20 66 72 65 65 20 74 68 69 73 20 74 65 6d 70  o free this temp
10f30 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 20 2a  orary register *
10f40 2f 0a 20 20 69 6e 74 20 72 31 2c 20 72 32 2c 20  /.  int r1, r2, 
10f50 72 33 2c 20 72 34 3b 20 20 20 20 20 20 20 2f 2a  r3, r4;       /*
10f60 20 56 61 72 69 6f 75 73 20 72 65 67 69 73 74 65   Various registe
10f70 72 20 6e 75 6d 62 65 72 73 20 2a 2f 0a 0a 20 20  r numbers */..  
10f80 61 73 73 65 72 74 28 20 76 21 3d 30 20 7c 7c 20  assert( v!=0 || 
10f90 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
10fa0 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 61 73  ocFailed );.  as
10fb0 73 65 72 74 28 20 74 61 72 67 65 74 3e 30 20 26  sert( target>0 &
10fc0 26 20 74 61 72 67 65 74 3c 3d 70 50 61 72 73 65  & target<=pParse
10fd0 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 69 66 28 20  ->nMem );.  if( 
10fe0 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  v==0 ) return 0;
10ff0 0a 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30  ..  if( pExpr==0
11000 20 29 7b 0a 20 20 20 20 6f 70 20 3d 20 54 4b 5f   ){.    op = TK_
11010 4e 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  NULL;.  }else{. 
11020 20 20 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f     op = pExpr->o
11030 70 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63 68 28  p;.  }.  switch(
11040 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20   op ){.    case 
11050 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 20 7b  TK_AGG_COLUMN: {
11060 0a 20 20 20 20 20 20 41 67 67 49 6e 66 6f 20 2a  .      AggInfo *
11070 70 41 67 67 49 6e 66 6f 20 3d 20 70 45 78 70 72  pAggInfo = pExpr
11080 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20  ->pAggInfo;.    
11090 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f    struct AggInfo
110a0 5f 63 6f 6c 20 2a 70 43 6f 6c 20 3d 20 26 70 41  _col *pCol = &pA
110b0 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 70 45 78  ggInfo->aCol[pEx
110c0 70 72 2d 3e 69 41 67 67 5d 3b 0a 20 20 20 20 20  pr->iAgg];.     
110d0 20 69 66 28 20 21 70 41 67 67 49 6e 66 6f 2d 3e   if( !pAggInfo->
110e0 64 69 72 65 63 74 4d 6f 64 65 20 29 7b 0a 20 20  directMode ){.  
110f0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
11100 6f 6c 2d 3e 69 4d 65 6d 3e 30 20 29 3b 0a 20 20  ol->iMem>0 );.  
11110 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 70 43        inReg = pC
11120 6f 6c 2d 3e 69 4d 65 6d 3b 0a 20 20 20 20 20 20  ol->iMem;.      
11130 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
11140 65 6c 73 65 20 69 66 28 20 70 41 67 67 49 6e 66  else if( pAggInf
11150 6f 2d 3e 75 73 65 53 6f 72 74 69 6e 67 49 64 78  o->useSortingIdx
11160 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
11170 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
11180 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70 41 67 67   OP_Column, pAgg
11190 49 6e 66 6f 2d 3e 73 6f 72 74 69 6e 67 49 64 78  Info->sortingIdx
111a0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
111b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
111c0 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c  pCol->iSorterCol
111d0 75 6d 6e 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  umn, target);.  
111e0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
111f0 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 4f 74     }.      /* Ot
11200 68 65 72 77 69 73 65 2c 20 66 61 6c 6c 20 74 68  herwise, fall th
11210 72 75 20 69 6e 74 6f 20 74 68 65 20 54 4b 5f 43  ru into the TK_C
11220 4f 4c 55 4d 4e 20 63 61 73 65 20 2a 2f 0a 20 20  OLUMN case */.  
11230 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
11240 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20  COLUMN: {.      
11250 69 66 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  if( pExpr->iTabl
11260 65 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  e<0 ){.        /
11270 2a 20 54 68 69 73 20 6f 6e 6c 79 20 68 61 70 70  * This only happ
11280 65 6e 73 20 77 68 65 6e 20 63 6f 64 69 6e 67 20  ens when coding 
11290 63 68 65 63 6b 20 63 6f 6e 73 74 72 61 69 6e 74  check constraint
112a0 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73  s */.        ass
112b0 65 72 74 28 20 70 50 61 72 73 65 2d 3e 63 6b 42  ert( pParse->ckB
112c0 61 73 65 3e 30 20 29 3b 0a 20 20 20 20 20 20 20  ase>0 );.       
112d0 20 69 6e 52 65 67 20 3d 20 70 45 78 70 72 2d 3e   inReg = pExpr->
112e0 69 43 6f 6c 75 6d 6e 20 2b 20 70 50 61 72 73 65  iColumn + pParse
112f0 2d 3e 63 6b 42 61 73 65 3b 0a 20 20 20 20 20 20  ->ckBase;.      
11300 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 74  }else{.        t
11310 65 73 74 63 61 73 65 28 20 28 70 45 78 70 72 2d  estcase( (pExpr-
11320 3e 66 6c 61 67 73 20 26 20 45 50 5f 41 6e 79 41  >flags & EP_AnyA
11330 66 66 29 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  ff)!=0 );.      
11340 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65    inReg = sqlite
11350 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75  3ExprCodeGetColu
11360 6d 6e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mn(pParse, pExpr
11370 2d 3e 70 54 61 62 2c 0a 20 20 20 20 20 20 20 20  ->pTab,.        
11380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11390 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
113a0 69 43 6f 6c 75 6d 6e 2c 20 70 45 78 70 72 2d 3e  iColumn, pExpr->
113b0 69 54 61 62 6c 65 2c 20 74 61 72 67 65 74 2c 0a  iTable, target,.
113c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
113d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
113e0 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20   pExpr->flags & 
113f0 45 50 5f 41 6e 79 41 66 66 29 3b 0a 20 20 20 20  EP_AnyAff);.    
11400 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
11410 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
11420 54 4b 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20  TK_INTEGER: {.  
11430 20 20 20 20 63 6f 64 65 49 6e 74 65 67 65 72 28      codeInteger(
11440 76 2c 20 28 63 68 61 72 2a 29 70 45 78 70 72 2d  v, (char*)pExpr-
11450 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70 72 2d  >token.z, pExpr-
11460 3e 74 6f 6b 65 6e 2e 6e 2c 20 30 2c 20 74 61 72  >token.n, 0, tar
11470 67 65 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61  get);.      brea
11480 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
11490 65 20 54 4b 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20  e TK_FLOAT: {.  
114a0 20 20 20 20 63 6f 64 65 52 65 61 6c 28 76 2c 20      codeReal(v, 
114b0 28 63 68 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f  (char*)pExpr->to
114c0 6b 65 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f  ken.z, pExpr->to
114d0 6b 65 6e 2e 6e 2c 20 30 2c 20 74 61 72 67 65 74  ken.n, 0, target
114e0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
114f0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
11500 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20  K_STRING: {.    
11510 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65    sqlite3Dequote
11520 45 78 70 72 28 70 50 61 72 73 65 2d 3e 64 62 2c  Expr(pParse->db,
11530 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 73   pExpr);.      s
11540 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
11550 28 76 2c 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30  (v,OP_String8, 0
11560 2c 20 74 61 72 67 65 74 2c 20 30 2c 0a 20 20 20  , target, 0,.   
11570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11580 20 20 20 20 20 28 63 68 61 72 2a 29 70 45 78 70       (char*)pExp
11590 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70  r->token.z, pExp
115a0 72 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a 20 20 20  r->token.n);.   
115b0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
115c0 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 55 4c 4c      case TK_NULL
115d0 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
115e0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
115f0 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61 72 67 65  P_Null, 0, targe
11600 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  t);.      break;
11610 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
11620 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 4c 4f 42 5f  QLITE_OMIT_BLOB_
11630 4c 49 54 45 52 41 4c 0a 20 20 20 20 63 61 73 65  LITERAL.    case
11640 20 54 4b 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20   TK_BLOB: {.    
11650 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 63    int n;.      c
11660 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20  onst char *z;.  
11670 20 20 20 20 63 68 61 72 20 2a 7a 42 6c 6f 62 3b      char *zBlob;
11680 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
11690 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 3e 3d 33  Expr->token.n>=3
116a0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
116b0 28 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a  ( pExpr->token.z
116c0 5b 30 5d 3d 3d 27 78 27 20 7c 7c 20 70 45 78 70  [0]=='x' || pExp
116d0 72 2d 3e 74 6f 6b 65 6e 2e 7a 5b 30 5d 3d 3d 27  r->token.z[0]=='
116e0 58 27 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  X' );.      asse
116f0 72 74 28 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  rt( pExpr->token
11700 2e 7a 5b 31 5d 3d 3d 27 5c 27 27 20 29 3b 0a 20  .z[1]=='\'' );. 
11710 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
11720 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 5b 70 45 78 70  pr->token.z[pExp
11730 72 2d 3e 74 6f 6b 65 6e 2e 6e 2d 31 5d 3d 3d 27  r->token.n-1]=='
11740 5c 27 27 20 29 3b 0a 20 20 20 20 20 20 6e 20 3d  \'' );.      n =
11750 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 20   pExpr->token.n 
11760 2d 20 33 3b 0a 20 20 20 20 20 20 7a 20 3d 20 28  - 3;.      z = (
11770 63 68 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f 6b  char*)pExpr->tok
11780 65 6e 2e 7a 20 2b 20 32 3b 0a 20 20 20 20 20 20  en.z + 2;.      
11790 7a 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 48  zBlob = sqlite3H
117a0 65 78 54 6f 42 6c 6f 62 28 73 71 6c 69 74 65 33  exToBlob(sqlite3
117b0 56 64 62 65 44 62 28 76 29 2c 20 7a 2c 20 6e 29  VdbeDb(v), z, n)
117c0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
117d0 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
117e0 42 6c 6f 62 2c 20 6e 2f 32 2c 20 74 61 72 67 65  Blob, n/2, targe
117f0 74 2c 20 30 2c 20 7a 42 6c 6f 62 2c 20 50 34 5f  t, 0, zBlob, P4_
11800 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20  DYNAMIC);.      
11810 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
11820 64 69 66 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  dif.    case TK_
11830 56 41 52 49 41 42 4c 45 3a 20 7b 0a 20 20 20 20  VARIABLE: {.    
11840 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
11850 4f 70 32 28 76 2c 20 4f 50 5f 56 61 72 69 61 62  Op2(v, OP_Variab
11860 6c 65 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  le, pExpr->iTabl
11870 65 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  e, target);.    
11880 20 20 69 66 28 20 70 45 78 70 72 2d 3e 74 6f 6b    if( pExpr->tok
11890 65 6e 2e 6e 3e 31 20 29 7b 0a 20 20 20 20 20 20  en.n>1 ){.      
118a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
118b0 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 28 63 68  ngeP4(v, -1, (ch
118c0 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  ar*)pExpr->token
118d0 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  .z, pExpr->token
118e0 2e 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  .n);.      }.   
118f0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
11900 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45 47 49      case TK_REGI
11910 53 54 45 52 3a 20 7b 0a 20 20 20 20 20 20 69 6e  STER: {.      in
11920 52 65 67 20 3d 20 70 45 78 70 72 2d 3e 69 54 61  Reg = pExpr->iTa
11930 62 6c 65 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ble;.      break
11940 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
11950 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54  SQLITE_OMIT_CAST
11960 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 41 53  .    case TK_CAS
11970 54 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 78  T: {.      /* Ex
11980 70 72 65 73 73 69 6f 6e 73 20 6f 66 20 74 68 65  pressions of the
11990 20 66 6f 72 6d 3a 20 20 20 43 41 53 54 28 70 4c   form:   CAST(pL
119a0 65 66 74 20 41 53 20 74 6f 6b 65 6e 29 20 2a 2f  eft AS token) */
119b0 0a 20 20 20 20 20 20 69 6e 74 20 61 66 66 2c 20  .      int aff, 
119c0 74 6f 5f 6f 70 3b 0a 20 20 20 20 20 20 69 6e 52  to_op;.      inR
119d0 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  eg = sqlite3Expr
119e0 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73  CodeTarget(pPars
119f0 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
11a00 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
11a10 61 66 66 20 3d 20 73 71 6c 69 74 65 33 41 66 66  aff = sqlite3Aff
11a20 69 6e 69 74 79 54 79 70 65 28 26 70 45 78 70 72  inityType(&pExpr
11a30 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20  ->token);.      
11a40 74 6f 5f 6f 70 20 3d 20 61 66 66 20 2d 20 53 51  to_op = aff - SQ
11a50 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20 2b 20  LITE_AFF_TEXT + 
11a60 4f 50 5f 54 6f 54 65 78 74 3b 0a 20 20 20 20 20  OP_ToText;.     
11a70 20 61 73 73 65 72 74 28 20 74 6f 5f 6f 70 3d 3d   assert( to_op==
11a80 4f 50 5f 54 6f 54 65 78 74 20 20 20 20 7c 7c 20  OP_ToText    || 
11a90 61 66 66 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff!=SQLITE_AFF_
11aa0 54 45 58 54 20 20 20 20 29 3b 0a 20 20 20 20 20  TEXT    );.     
11ab0 20 61 73 73 65 72 74 28 20 74 6f 5f 6f 70 3d 3d   assert( to_op==
11ac0 4f 50 5f 54 6f 42 6c 6f 62 20 20 20 20 7c 7c 20  OP_ToBlob    || 
11ad0 61 66 66 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff!=SQLITE_AFF_
11ae0 4e 4f 4e 45 20 20 20 20 29 3b 0a 20 20 20 20 20  NONE    );.     
11af0 20 61 73 73 65 72 74 28 20 74 6f 5f 6f 70 3d 3d   assert( to_op==
11b00 4f 50 5f 54 6f 4e 75 6d 65 72 69 63 20 7c 7c 20  OP_ToNumeric || 
11b10 61 66 66 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff!=SQLITE_AFF_
11b20 4e 55 4d 45 52 49 43 20 29 3b 0a 20 20 20 20 20  NUMERIC );.     
11b30 20 61 73 73 65 72 74 28 20 74 6f 5f 6f 70 3d 3d   assert( to_op==
11b40 4f 50 5f 54 6f 49 6e 74 20 20 20 20 20 7c 7c 20  OP_ToInt     || 
11b50 61 66 66 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff!=SQLITE_AFF_
11b60 49 4e 54 45 47 45 52 20 29 3b 0a 20 20 20 20 20  INTEGER );.     
11b70 20 61 73 73 65 72 74 28 20 74 6f 5f 6f 70 3d 3d   assert( to_op==
11b80 4f 50 5f 54 6f 52 65 61 6c 20 20 20 20 7c 7c 20  OP_ToReal    || 
11b90 61 66 66 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff!=SQLITE_AFF_
11ba0 52 45 41 4c 20 20 20 20 29 3b 0a 20 20 20 20 20  REAL    );.     
11bb0 20 74 65 73 74 63 61 73 65 28 20 74 6f 5f 6f 70   testcase( to_op
11bc0 3d 3d 4f 50 5f 54 6f 54 65 78 74 20 29 3b 0a 20  ==OP_ToText );. 
11bd0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 74       testcase( t
11be0 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 42 6c 6f 62 20  o_op==OP_ToBlob 
11bf0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
11c00 65 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 4e  e( to_op==OP_ToN
11c10 75 6d 65 72 69 63 20 29 3b 0a 20 20 20 20 20 20  umeric );.      
11c20 74 65 73 74 63 61 73 65 28 20 74 6f 5f 6f 70 3d  testcase( to_op=
11c30 3d 4f 50 5f 54 6f 49 6e 74 20 29 3b 0a 20 20 20  =OP_ToInt );.   
11c40 20 20 20 74 65 73 74 63 61 73 65 28 20 74 6f 5f     testcase( to_
11c50 6f 70 3d 3d 4f 50 5f 54 6f 52 65 61 6c 20 29 3b  op==OP_ToReal );
11c60 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
11c70 62 65 41 64 64 4f 70 31 28 76 2c 20 74 6f 5f 6f  beAddOp1(v, to_o
11c80 70 2c 20 69 6e 52 65 67 29 3b 0a 20 20 20 20 20  p, inReg);.     
11c90 20 74 65 73 74 63 61 73 65 28 20 75 73 65 64 41   testcase( usedA
11ca0 73 43 6f 6c 75 6d 6e 43 61 63 68 65 28 70 50 61  sColumnCache(pPa
11cb0 72 73 65 2c 20 69 6e 52 65 67 2c 20 69 6e 52 65  rse, inReg, inRe
11cc0 67 29 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  g) );.      sqli
11cd0 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69  te3ExprCacheAffi
11ce0 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73  nityChange(pPars
11cf0 65 2c 20 69 6e 52 65 67 2c 20 31 29 3b 0a 20 20  e, inReg, 1);.  
11d00 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
11d10 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
11d20 45 5f 4f 4d 49 54 5f 43 41 53 54 20 2a 2f 0a 20  E_OMIT_CAST */. 
11d30 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20     case TK_LT:. 
11d40 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20     case TK_LE:. 
11d50 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20     case TK_GT:. 
11d60 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20     case TK_GE:. 
11d70 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20     case TK_NE:. 
11d80 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b     case TK_EQ: {
11d90 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
11da0 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 20 29 3b 0a 20  K_LT==OP_Lt );. 
11db0 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
11dc0 4c 45 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20 20  LE==OP_Le );.   
11dd0 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 54     assert( TK_GT
11de0 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20 20 20 20 20  ==OP_Gt );.     
11df0 20 61 73 73 65 72 74 28 20 54 4b 5f 47 45 3d 3d   assert( TK_GE==
11e00 4f 50 5f 47 65 20 29 3b 0a 20 20 20 20 20 20 61  OP_Ge );.      a
11e10 73 73 65 72 74 28 20 54 4b 5f 45 51 3d 3d 4f 50  ssert( TK_EQ==OP
11e20 5f 45 71 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _Eq );.      ass
11e30 65 72 74 28 20 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e  ert( TK_NE==OP_N
11e40 65 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  e );.      testc
11e50 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c 54 20 29  ase( op==TK_LT )
11e60 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
11e70 28 20 6f 70 3d 3d 54 4b 5f 4c 45 20 29 3b 0a 20  ( op==TK_LE );. 
11e80 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
11e90 70 3d 3d 54 4b 5f 47 54 20 29 3b 0a 20 20 20 20  p==TK_GT );.    
11ea0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
11eb0 54 4b 5f 47 45 20 29 3b 0a 20 20 20 20 20 20 74  TK_GE );.      t
11ec0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
11ed0 45 51 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  EQ );.      test
11ee0 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 45 20  case( op==TK_NE 
11ef0 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d  );.      codeCom
11f00 70 61 72 65 4f 70 65 72 61 6e 64 73 28 70 50 61  pareOperands(pPa
11f10 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
11f20 74 2c 20 26 72 31 2c 20 26 72 65 67 46 72 65 65  t, &r1, &regFree
11f30 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  1,.             
11f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11f50 20 20 20 20 20 70 45 78 70 72 2d 3e 70 52 69 67       pExpr->pRig
11f60 68 74 2c 20 26 72 32 2c 20 26 72 65 67 46 72 65  ht, &r2, &regFre
11f70 65 32 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43  e2);.      codeC
11f80 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70  ompare(pParse, p
11f90 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78  Expr->pLeft, pEx
11fa0 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a  pr->pRight, op,.
11fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11fc0 20 20 72 31 2c 20 72 32 2c 20 69 6e 52 65 67 2c    r1, r2, inReg,
11fd0 20 53 51 4c 49 54 45 5f 53 54 4f 52 45 50 32 29   SQLITE_STOREP2)
11fe0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
11ff0 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  ( regFree1==0 );
12000 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
12010 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a   regFree2==0 );.
12020 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
12030 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41   }.    case TK_A
12040 4e 44 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ND:.    case TK_
12050 4f 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  OR:.    case TK_
12060 50 4c 55 53 3a 0a 20 20 20 20 63 61 73 65 20 54  PLUS:.    case T
12070 4b 5f 53 54 41 52 3a 0a 20 20 20 20 63 61 73 65  K_STAR:.    case
12080 20 54 4b 5f 4d 49 4e 55 53 3a 0a 20 20 20 20 63   TK_MINUS:.    c
12090 61 73 65 20 54 4b 5f 52 45 4d 3a 0a 20 20 20 20  ase TK_REM:.    
120a0 63 61 73 65 20 54 4b 5f 42 49 54 41 4e 44 3a 0a  case TK_BITAND:.
120b0 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4f      case TK_BITO
120c0 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53  R:.    case TK_S
120d0 4c 41 53 48 3a 0a 20 20 20 20 63 61 73 65 20 54  LASH:.    case T
120e0 4b 5f 4c 53 48 49 46 54 3a 0a 20 20 20 20 63 61  K_LSHIFT:.    ca
120f0 73 65 20 54 4b 5f 52 53 48 49 46 54 3a 20 0a 20  se TK_RSHIFT: . 
12100 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4e 43 41     case TK_CONCA
12110 54 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  T: {.      asser
12120 74 28 20 54 4b 5f 41 4e 44 3d 3d 4f 50 5f 41 6e  t( TK_AND==OP_An
12130 64 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  d );.      asser
12140 74 28 20 54 4b 5f 4f 52 3d 3d 4f 50 5f 4f 72 20  t( TK_OR==OP_Or 
12150 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
12160 20 54 4b 5f 50 4c 55 53 3d 3d 4f 50 5f 41 64 64   TK_PLUS==OP_Add
12170 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
12180 28 20 54 4b 5f 4d 49 4e 55 53 3d 3d 4f 50 5f 53  ( TK_MINUS==OP_S
12190 75 62 74 72 61 63 74 20 29 3b 0a 20 20 20 20 20  ubtract );.     
121a0 20 61 73 73 65 72 74 28 20 54 4b 5f 52 45 4d 3d   assert( TK_REM=
121b0 3d 4f 50 5f 52 65 6d 61 69 6e 64 65 72 20 29 3b  =OP_Remainder );
121c0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
121d0 4b 5f 42 49 54 41 4e 44 3d 3d 4f 50 5f 42 69 74  K_BITAND==OP_Bit
121e0 41 6e 64 20 29 3b 0a 20 20 20 20 20 20 61 73 73  And );.      ass
121f0 65 72 74 28 20 54 4b 5f 42 49 54 4f 52 3d 3d 4f  ert( TK_BITOR==O
12200 50 5f 42 69 74 4f 72 20 29 3b 0a 20 20 20 20 20  P_BitOr );.     
12210 20 61 73 73 65 72 74 28 20 54 4b 5f 53 4c 41 53   assert( TK_SLAS
12220 48 3d 3d 4f 50 5f 44 69 76 69 64 65 20 29 3b 0a  H==OP_Divide );.
12230 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
12240 5f 4c 53 48 49 46 54 3d 3d 4f 50 5f 53 68 69 66  _LSHIFT==OP_Shif
12250 74 4c 65 66 74 20 29 3b 0a 20 20 20 20 20 20 61  tLeft );.      a
12260 73 73 65 72 74 28 20 54 4b 5f 52 53 48 49 46 54  ssert( TK_RSHIFT
12270 3d 3d 4f 50 5f 53 68 69 66 74 52 69 67 68 74 20  ==OP_ShiftRight 
12280 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
12290 20 54 4b 5f 43 4f 4e 43 41 54 3d 3d 4f 50 5f 43   TK_CONCAT==OP_C
122a0 6f 6e 63 61 74 20 29 3b 0a 20 20 20 20 20 20 74  oncat );.      t
122b0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
122c0 41 4e 44 20 29 3b 0a 20 20 20 20 20 20 74 65 73  AND );.      tes
122d0 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4f 52  tcase( op==TK_OR
122e0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
122f0 73 65 28 20 6f 70 3d 3d 54 4b 5f 50 4c 55 53 20  se( op==TK_PLUS 
12300 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
12310 65 28 20 6f 70 3d 3d 54 4b 5f 4d 49 4e 55 53 20  e( op==TK_MINUS 
12320 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
12330 65 28 20 6f 70 3d 3d 54 4b 5f 52 45 4d 20 29 3b  e( op==TK_REM );
12340 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
12350 20 6f 70 3d 3d 54 4b 5f 42 49 54 41 4e 44 20 29   op==TK_BITAND )
12360 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
12370 28 20 6f 70 3d 3d 54 4b 5f 42 49 54 4f 52 20 29  ( op==TK_BITOR )
12380 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
12390 28 20 6f 70 3d 3d 54 4b 5f 53 4c 41 53 48 20 29  ( op==TK_SLASH )
123a0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
123b0 28 20 6f 70 3d 3d 54 4b 5f 4c 53 48 49 46 54 20  ( op==TK_LSHIFT 
123c0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
123d0 65 28 20 6f 70 3d 3d 54 4b 5f 52 53 48 49 46 54  e( op==TK_RSHIFT
123e0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
123f0 73 65 28 20 6f 70 3d 3d 54 4b 5f 43 4f 4e 43 41  se( op==TK_CONCA
12400 54 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20  T );.      r1 = 
12410 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
12420 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
12430 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72  r->pLeft, &regFr
12440 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d  ee1);.      r2 =
12450 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
12460 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
12470 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67  pr->pRight, &reg
12480 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 73 71  Free2);.      sq
12490 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
124a0 76 2c 20 6f 70 2c 20 72 32 2c 20 72 31 2c 20 74  v, op, r2, r1, t
124b0 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 74 65  arget);.      te
124c0 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31  stcase( regFree1
124d0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ==0 );.      tes
124e0 74 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d  tcase( regFree2=
124f0 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  =0 );.      brea
12500 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
12510 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20  e TK_UMINUS: {. 
12520 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74       Expr *pLeft
12530 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b   = pExpr->pLeft;
12540 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
12550 4c 65 66 74 20 29 3b 0a 20 20 20 20 20 20 69 66  Left );.      if
12560 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f  ( pLeft->op==TK_
12570 46 4c 4f 41 54 20 7c 7c 20 70 4c 65 66 74 2d 3e  FLOAT || pLeft->
12580 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47 45 52 20 29  op==TK_INTEGER )
12590 7b 0a 20 20 20 20 20 20 20 20 54 6f 6b 65 6e 20  {.        Token 
125a0 2a 70 20 3d 20 26 70 4c 65 66 74 2d 3e 74 6f 6b  *p = &pLeft->tok
125b0 65 6e 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  en;.        if( 
125c0 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c  pLeft->op==TK_FL
125d0 4f 41 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20  OAT ){.         
125e0 20 63 6f 64 65 52 65 61 6c 28 76 2c 20 28 63 68   codeReal(v, (ch
125f0 61 72 2a 29 70 2d 3e 7a 2c 20 70 2d 3e 6e 2c 20  ar*)p->z, p->n, 
12600 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  1, target);.    
12610 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
12620 20 20 20 20 20 63 6f 64 65 49 6e 74 65 67 65 72       codeInteger
12630 28 76 2c 20 28 63 68 61 72 2a 29 70 2d 3e 7a 2c  (v, (char*)p->z,
12640 20 70 2d 3e 6e 2c 20 31 2c 20 74 61 72 67 65 74   p->n, 1, target
12650 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
12660 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
12670 20 20 72 65 67 46 72 65 65 31 20 3d 20 72 31 20    regFree1 = r1 
12680 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
12690 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
126a0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
126b0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
126c0 65 67 65 72 2c 20 30 2c 20 72 31 29 3b 0a 20 20  eger, 0, r1);.  
126d0 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74        r2 = sqlit
126e0 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
126f0 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
12700 65 66 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b  eft, &regFree2);
12710 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
12720 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
12730 5f 53 75 62 74 72 61 63 74 2c 20 72 32 2c 20 72  _Subtract, r2, r
12740 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  1, target);.    
12750 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
12760 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20  gFree2==0 );.   
12770 20 20 20 7d 0a 20 20 20 20 20 20 69 6e 52 65 67     }.      inReg
12780 20 3d 20 74 61 72 67 65 74 3b 0a 20 20 20 20 20   = target;.     
12790 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
127a0 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4e 4f 54    case TK_BITNOT
127b0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f  :.    case TK_NO
127c0 54 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  T: {.      asser
127d0 74 28 20 54 4b 5f 42 49 54 4e 4f 54 3d 3d 4f 50  t( TK_BITNOT==OP
127e0 5f 42 69 74 4e 6f 74 20 29 3b 0a 20 20 20 20 20  _BitNot );.     
127f0 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54 3d   assert( TK_NOT=
12800 3d 4f 50 5f 4e 6f 74 20 29 3b 0a 20 20 20 20 20  =OP_Not );.     
12810 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
12820 4b 5f 42 49 54 4e 4f 54 20 29 3b 0a 20 20 20 20  K_BITNOT );.    
12830 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
12840 54 4b 5f 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20  TK_NOT );.      
12850 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45  inReg = sqlite3E
12860 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50  xprCodeTarget(pP
12870 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
12880 66 74 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  ft, target);.   
12890 20 20 20 74 65 73 74 63 61 73 65 28 20 69 6e 52     testcase( inR
128a0 65 67 3d 3d 74 61 72 67 65 74 20 29 3b 0a 20 20  eg==target );.  
128b0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 75 73      testcase( us
128c0 65 64 41 73 43 6f 6c 75 6d 6e 43 61 63 68 65 28  edAsColumnCache(
128d0 70 50 61 72 73 65 2c 20 69 6e 52 65 67 2c 20 69  pParse, inReg, i
128e0 6e 52 65 67 29 20 29 3b 0a 20 20 20 20 20 20 69  nReg) );.      i
128f0 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78  nReg = sqlite3Ex
12900 70 72 57 72 69 74 61 62 6c 65 52 65 67 69 73 74  prWritableRegist
12910 65 72 28 70 50 61 72 73 65 2c 20 69 6e 52 65 67  er(pParse, inReg
12920 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
12930 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12940 70 31 28 76 2c 20 6f 70 2c 20 69 6e 52 65 67 29  p1(v, op, inReg)
12950 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
12960 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
12970 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73  _ISNULL:.    cas
12980 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a  e TK_NOTNULL: {.
12990 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a        int addr;.
129a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
129b0 5f 49 53 4e 55 4c 4c 3d 3d 4f 50 5f 49 73 4e 75  _ISNULL==OP_IsNu
129c0 6c 6c 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ll );.      asse
129d0 72 74 28 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d  rt( TK_NOTNULL==
129e0 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 0a 20 20  OP_NotNull );.  
129f0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
12a00 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20  ==TK_ISNULL );. 
12a10 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
12a20 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b  p==TK_NOTNULL );
12a30 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
12a40 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
12a50 6e 74 65 67 65 72 2c 20 31 2c 20 74 61 72 67 65  nteger, 1, targe
12a60 74 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73  t);.      r1 = s
12a70 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
12a80 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
12a90 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65  ->pLeft, &regFre
12aa0 65 31 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  e1);.      testc
12ab0 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30  ase( regFree1==0
12ac0 20 29 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d   );.      addr =
12ad0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12ae0 70 31 28 76 2c 20 6f 70 2c 20 72 31 29 3b 0a 20  p1(v, op, r1);. 
12af0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
12b00 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64  AddOp2(v, OP_Add
12b10 49 6d 6d 2c 20 74 61 72 67 65 74 2c 20 2d 31 29  Imm, target, -1)
12b20 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
12b30 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
12b40 64 64 72 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ddr);.      brea
12b50 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
12b60 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f  e TK_AGG_FUNCTIO
12b70 4e 3a 20 7b 0a 20 20 20 20 20 20 41 67 67 49 6e  N: {.      AggIn
12b80 66 6f 20 2a 70 49 6e 66 6f 20 3d 20 70 45 78 70  fo *pInfo = pExp
12b90 72 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20  r->pAggInfo;.   
12ba0 20 20 20 69 66 28 20 70 49 6e 66 6f 3d 3d 30 20     if( pInfo==0 
12bb0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
12bc0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
12bd0 65 2c 20 22 6d 69 73 75 73 65 20 6f 66 20 61 67  e, "misuse of ag
12be0 67 72 65 67 61 74 65 3a 20 25 54 22 2c 0a 20 20  gregate: %T",.  
12bf0 20 20 20 20 20 20 20 20 20 20 26 70 45 78 70 72            &pExpr
12c00 2d 3e 73 70 61 6e 29 3b 0a 20 20 20 20 20 20 7d  ->span);.      }
12c10 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e  else{.        in
12c20 52 65 67 20 3d 20 70 49 6e 66 6f 2d 3e 61 46 75  Reg = pInfo->aFu
12c30 6e 63 5b 70 45 78 70 72 2d 3e 69 41 67 67 5d 2e  nc[pExpr->iAgg].
12c40 69 4d 65 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  iMem;.      }.  
12c50 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
12c60 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4e  .    case TK_CON
12c70 53 54 5f 46 55 4e 43 3a 0a 20 20 20 20 63 61 73  ST_FUNC:.    cas
12c80 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b  e TK_FUNCTION: {
12c90 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20  .      ExprList 
12ca0 2a 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e  *pList = pExpr->
12cb0 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 69 6e 74  pList;.      int
12cc0 20 6e 45 78 70 72 20 3d 20 70 4c 69 73 74 20 3f   nExpr = pList ?
12cd0 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20   pList->nExpr : 
12ce0 30 3b 0a 20 20 20 20 20 20 46 75 6e 63 44 65 66  0;.      FuncDef
12cf0 20 2a 70 44 65 66 3b 0a 20 20 20 20 20 20 69 6e   *pDef;.      in
12d00 74 20 6e 49 64 3b 0a 20 20 20 20 20 20 63 6f 6e  t nId;.      con
12d10 73 74 20 63 68 61 72 20 2a 7a 49 64 3b 0a 20 20  st char *zId;.  
12d20 20 20 20 20 69 6e 74 20 63 6f 6e 73 74 4d 61 73      int constMas
12d30 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74  k = 0;.      int
12d40 20 69 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   i;.      sqlite
12d50 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
12d60 64 62 3b 0a 20 20 20 20 20 20 75 38 20 65 6e 63  db;.      u8 enc
12d70 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20 20 20   = ENC(db);.    
12d80 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
12d90 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 74 65 73   = 0;..      tes
12da0 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 43 4f  tcase( op==TK_CO
12db0 4e 53 54 5f 46 55 4e 43 20 29 3b 0a 20 20 20 20  NST_FUNC );.    
12dc0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
12dd0 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20  TK_FUNCTION );. 
12de0 20 20 20 20 20 7a 49 64 20 3d 20 28 63 68 61 72       zId = (char
12df0 2a 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a  *)pExpr->token.z
12e00 3b 0a 20 20 20 20 20 20 6e 49 64 20 3d 20 70 45  ;.      nId = pE
12e10 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 3b 0a 20 20  xpr->token.n;.  
12e20 20 20 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74      pDef = sqlit
12e30 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 70  e3FindFunction(p
12e40 50 61 72 73 65 2d 3e 64 62 2c 20 7a 49 64 2c 20  Parse->db, zId, 
12e50 6e 49 64 2c 20 6e 45 78 70 72 2c 20 65 6e 63 2c  nId, nExpr, enc,
12e60 20 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72   0);.      asser
12e70 74 28 20 70 44 65 66 21 3d 30 20 29 3b 0a 20 20  t( pDef!=0 );.  
12e80 20 20 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b      if( pList ){
12e90 0a 20 20 20 20 20 20 20 20 6e 45 78 70 72 20 3d  .        nExpr =
12ea0 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20   pList->nExpr;. 
12eb0 20 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69         r1 = sqli
12ec0 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28  te3GetTempRange(
12ed0 70 50 61 72 73 65 2c 20 6e 45 78 70 72 29 3b 0a  pParse, nExpr);.
12ee0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
12ef0 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28  xprCodeExprList(
12f00 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2c 20 72  pParse, pList, r
12f10 31 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c  1, 1);.      }el
12f20 73 65 7b 0a 20 20 20 20 20 20 20 20 6e 45 78 70  se{.        nExp
12f30 72 20 3d 20 72 31 20 3d 20 30 3b 0a 20 20 20 20  r = r1 = 0;.    
12f40 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
12f50 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
12f60 41 42 4c 45 0a 20 20 20 20 20 20 2f 2a 20 50 6f  ABLE.      /* Po
12f70 73 73 69 62 6c 79 20 6f 76 65 72 6c 6f 61 64 20  ssibly overload 
12f80 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 69 66 20  the function if 
12f90 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
12fa0 6e 74 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61  nt is.      ** a
12fb0 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 63   virtual table c
12fc0 6f 6c 75 6d 6e 2e 0a 20 20 20 20 20 20 2a 2a 0a  olumn..      **.
12fd0 20 20 20 20 20 20 2a 2a 20 46 6f 72 20 69 6e 66        ** For inf
12fe0 69 78 20 66 75 6e 63 74 69 6f 6e 73 20 28 4c 49  ix functions (LI
12ff0 4b 45 2c 20 47 4c 4f 42 2c 20 52 45 47 45 58 50  KE, GLOB, REGEXP
13000 2c 20 61 6e 64 20 4d 41 54 43 48 29 20 75 73 65  , and MATCH) use
13010 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 73 65   the.      ** se
13020 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 20 6e  cond argument, n
13030 6f 74 20 74 68 65 20 66 69 72 73 74 2c 20 61 73  ot the first, as
13040 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f   the argument to
13050 20 74 65 73 74 20 74 6f 0a 20 20 20 20 20 20 2a   test to.      *
13060 2a 20 73 65 65 20 69 66 20 69 74 20 69 73 20 61  * see if it is a
13070 20 63 6f 6c 75 6d 6e 20 69 6e 20 61 20 76 69 72   column in a vir
13080 74 75 61 6c 20 74 61 62 6c 65 2e 20 20 54 68 69  tual table.  Thi
13090 73 20 69 73 20 64 6f 6e 65 20 62 65 63 61 75 73  s is done becaus
130a0 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6c  e.      ** the l
130b0 65 66 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 69  eft operand of i
130c0 6e 66 69 78 20 66 75 6e 63 74 69 6f 6e 73 20 28  nfix functions (
130d0 74 68 65 20 6f 70 65 72 61 6e 64 20 77 65 20 77  the operand we w
130e0 61 6e 74 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  ant to.      ** 
130f0 63 6f 6e 74 72 6f 6c 20 6f 76 65 72 6c 6f 61 64  control overload
13100 69 6e 67 29 20 65 6e 64 73 20 75 70 20 61 73 20  ing) ends up as 
13110 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
13120 65 6e 74 20 74 6f 20 74 68 65 0a 20 20 20 20 20  ent to the.     
13130 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54   ** function.  T
13140 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 22 41  he expression "A
13150 20 67 6c 6f 62 20 42 22 20 69 73 20 65 71 75 69   glob B" is equi
13160 76 61 6c 65 6e 74 20 74 6f 20 0a 20 20 20 20 20  valent to .     
13170 20 2a 2a 20 22 67 6c 6f 62 28 42 2c 41 29 2e 20   ** "glob(B,A). 
13180 20 57 65 20 77 61 6e 74 20 74 6f 20 75 73 65 20   We want to use 
13190 74 68 65 20 41 20 69 6e 20 22 41 20 67 6c 6f 62  the A in "A glob
131a0 20 42 22 20 74 6f 20 74 65 73 74 0a 20 20 20 20   B" to test.    
131b0 20 20 2a 2a 20 66 6f 72 20 66 75 6e 63 74 69 6f    ** for functio
131c0 6e 20 6f 76 65 72 6c 6f 61 64 69 6e 67 2e 20 20  n overloading.  
131d0 42 75 74 20 77 65 20 75 73 65 20 74 68 65 20 42  But we use the B
131e0 20 74 65 72 6d 20 69 6e 20 22 67 6c 6f 62 28 42   term in "glob(B
131f0 2c 41 29 22 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ,A)"..      */. 
13200 20 20 20 20 20 69 66 28 20 6e 45 78 70 72 3e 3d       if( nExpr>=
13210 32 20 26 26 20 28 70 45 78 70 72 2d 3e 66 6c 61  2 && (pExpr->fla
13220 67 73 20 26 20 45 50 5f 49 6e 66 69 78 46 75 6e  gs & EP_InfixFun
13230 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44  c) ){.        pD
13240 65 66 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62  ef = sqlite3Vtab
13250 4f 76 65 72 6c 6f 61 64 46 75 6e 63 74 69 6f 6e  OverloadFunction
13260 28 64 62 2c 20 70 44 65 66 2c 20 6e 45 78 70 72  (db, pDef, nExpr
13270 2c 20 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45  , pList->a[1].pE
13280 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  xpr);.      }els
13290 65 20 69 66 28 20 6e 45 78 70 72 3e 30 20 29 7b  e if( nExpr>0 ){
132a0 0a 20 20 20 20 20 20 20 20 70 44 65 66 20 3d 20  .        pDef = 
132b0 73 71 6c 69 74 65 33 56 74 61 62 4f 76 65 72 6c  sqlite3VtabOverl
132c0 6f 61 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20  oadFunction(db, 
132d0 70 44 65 66 2c 20 6e 45 78 70 72 2c 20 70 4c 69  pDef, nExpr, pLi
132e0 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b  st->a[0].pExpr);
132f0 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
13300 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
13310 3c 6e 45 78 70 72 20 26 26 20 69 3c 33 32 3b 20  <nExpr && i<32; 
13320 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  i++){.        if
13330 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43  ( sqlite3ExprIsC
13340 6f 6e 73 74 61 6e 74 28 70 4c 69 73 74 2d 3e 61  onstant(pList->a
13350 5b 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20  [i].pExpr) ){.  
13360 20 20 20 20 20 20 20 20 63 6f 6e 73 74 4d 61 73          constMas
13370 6b 20 7c 3d 20 28 31 3c 3c 69 29 3b 0a 20 20 20  k |= (1<<i);.   
13380 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
13390 66 28 20 70 44 65 66 2d 3e 6e 65 65 64 43 6f 6c  f( pDef->needCol
133a0 6c 53 65 71 20 26 26 20 21 70 43 6f 6c 6c 20 29  lSeq && !pColl )
133b0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c  {.          pCol
133c0 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
133d0 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
133e0 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
133f0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
13400 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
13410 44 65 66 2d 3e 6e 65 65 64 43 6f 6c 6c 53 65 71  Def->needCollSeq
13420 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
13430 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d  !pColl ) pColl =
13440 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66   pParse->db->pDf
13450 6c 74 43 6f 6c 6c 3b 20 0a 20 20 20 20 20 20 20  ltColl; .       
13460 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
13470 70 34 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71  p4(v, OP_CollSeq
13480 2c 20 30 2c 20 30 2c 20 30 2c 20 28 63 68 61 72  , 0, 0, 0, (char
13490 20 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c   *)pColl, P4_COL
134a0 4c 53 45 51 29 3b 0a 20 20 20 20 20 20 7d 0a 20  LSEQ);.      }. 
134b0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
134c0 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 46 75 6e  AddOp4(v, OP_Fun
134d0 63 74 69 6f 6e 2c 20 63 6f 6e 73 74 4d 61 73 6b  ction, constMask
134e0 2c 20 72 31 2c 20 74 61 72 67 65 74 2c 0a 20 20  , r1, target,.  
134f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13500 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 44 65        (char*)pDe
13510 66 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a  f, P4_FUNCDEF);.
13520 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
13530 65 43 68 61 6e 67 65 50 35 28 76 2c 20 6e 45 78  eChangeP5(v, nEx
13540 70 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  pr);.      if( n
13550 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20  Expr ){.        
13560 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
13570 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
13580 72 31 2c 20 6e 45 78 70 72 29 3b 0a 20 20 20 20  r1, nExpr);.    
13590 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
135a0 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69  3ExprCacheAffini
135b0 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c  tyChange(pParse,
135c0 20 72 31 2c 20 6e 45 78 70 72 29 3b 0a 20 20 20   r1, nExpr);.   
135d0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
135e0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
135f0 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20  MIT_SUBQUERY.   
13600 20 63 61 73 65 20 54 4b 5f 45 58 49 53 54 53 3a   case TK_EXISTS:
13610 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c  .    case TK_SEL
13620 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 74 65 73  ECT: {.      tes
13630 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 45 58  tcase( op==TK_EX
13640 49 53 54 53 20 29 3b 0a 20 20 20 20 20 20 74 65  ISTS );.      te
13650 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 53  stcase( op==TK_S
13660 45 4c 45 43 54 20 29 3b 0a 20 20 20 20 20 20 69  ELECT );.      i
13670 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  f( pExpr->iColum
13680 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  n==0 ){.        
13690 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65  sqlite3CodeSubse
136a0 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 45 78  lect(pParse, pEx
136b0 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  pr);.      }.   
136c0 20 20 20 69 6e 52 65 67 20 3d 20 70 45 78 70 72     inReg = pExpr
136d0 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  ->iColumn;.     
136e0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
136f0 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a    case TK_IN: {.
13700 20 20 20 20 20 20 69 6e 74 20 6a 31 2c 20 6a 32        int j1, j2
13710 2c 20 6a 33 2c 20 6a 34 2c 20 6a 35 3b 0a 20 20  , j3, j4, j5;.  
13720 20 20 20 20 63 68 61 72 20 61 66 66 69 6e 69 74      char affinit
13730 79 3b 0a 20 20 20 20 20 20 69 6e 74 20 65 54 79  y;.      int eTy
13740 70 65 3b 0a 0a 20 20 20 20 20 20 65 54 79 70 65  pe;..      eType
13750 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e   = sqlite3FindIn
13760 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 45  Index(pParse, pE
13770 78 70 72 2c 20 30 29 3b 0a 0a 20 20 20 20 20 20  xpr, 0);..      
13780 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 74 68  /* Figure out th
13790 65 20 61 66 66 69 6e 69 74 79 20 74 6f 20 75 73  e affinity to us
137a0 65 20 74 6f 20 63 72 65 61 74 65 20 61 20 6b 65  e to create a ke
137b0 79 20 66 72 6f 6d 20 74 68 65 20 72 65 73 75 6c  y from the resul
137c0 74 73 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74  ts.      ** of t
137d0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 61  he expression. a
137e0 66 66 69 6e 69 74 79 53 74 72 20 73 74 6f 72 65  ffinityStr store
137f0 73 20 61 20 73 74 61 74 69 63 20 73 74 72 69 6e  s a static strin
13800 67 20 73 75 69 74 61 62 6c 65 20 66 6f 72 0a 20  g suitable for. 
13810 20 20 20 20 20 2a 2a 20 50 34 20 6f 66 20 4f 50       ** P4 of OP
13820 5f 4d 61 6b 65 52 65 63 6f 72 64 2e 0a 20 20 20  _MakeRecord..   
13830 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 66 66 69     */.      affi
13840 6e 69 74 79 20 3d 20 63 6f 6d 70 61 72 69 73 6f  nity = compariso
13850 6e 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 29  nAffinity(pExpr)
13860 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ;..      sqlite3
13870 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
13880 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 74 61 72  _Integer, 1, tar
13890 67 65 74 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  get);..      /* 
138a0 43 6f 64 65 20 74 68 65 20 3c 65 78 70 72 3e 20  Code the <expr> 
138b0 66 72 6f 6d 20 22 3c 65 78 70 72 3e 20 49 4e 20  from "<expr> IN 
138c0 28 2e 2e 2e 29 22 2e 20 54 68 65 20 74 65 6d 70  (...)". The temp
138d0 6f 72 61 72 79 20 74 61 62 6c 65 0a 20 20 20 20  orary table.    
138e0 20 20 2a 2a 20 70 45 78 70 72 2d 3e 69 54 61 62    ** pExpr->iTab
138f0 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  le contains the 
13900 76 61 6c 75 65 73 20 74 68 61 74 20 6d 61 6b 65  values that make
13910 20 75 70 20 74 68 65 20 28 2e 2e 2e 29 20 73 65   up the (...) se
13920 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  t..      */.    
13930 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78    r1 = sqlite3Ex
13940 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
13950 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
13960 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20   &regFree1);.   
13970 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
13980 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
13990 20 20 6a 31 20 3d 20 73 71 6c 69 74 65 33 56 64    j1 = sqlite3Vd
139a0 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e  beAddOp1(v, OP_N
139b0 6f 74 4e 75 6c 6c 2c 20 72 31 29 3b 0a 20 20 20  otNull, r1);.   
139c0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
139d0 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c  dOp2(v, OP_Null,
139e0 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20   0, target);.   
139f0 20 20 20 6a 32 20 20 3d 20 73 71 6c 69 74 65 33     j2  = sqlite3
13a00 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50  VdbeAddOp0(v, OP
13a10 5f 47 6f 74 6f 29 3b 0a 20 20 20 20 20 20 73 71  _Goto);.      sq
13a20 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
13a30 65 28 76 2c 20 6a 31 29 3b 0a 20 20 20 20 20 20  e(v, j1);.      
13a40 69 66 28 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e  if( eType==IN_IN
13a50 44 45 58 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20  DEX_ROWID ){.   
13a60 20 20 20 20 20 6a 33 20 3d 20 73 71 6c 69 74 65       j3 = sqlite
13a70 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
13a80 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 72 31 29  P_MustBeInt, r1)
13a90 3b 0a 20 20 20 20 20 20 20 20 6a 34 20 3d 20 73  ;.        j4 = s
13aa0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
13ab0 28 76 2c 20 4f 50 5f 4e 6f 74 45 78 69 73 74 73  (v, OP_NotExists
13ac0 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
13ad0 20 30 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20   0, r1);.       
13ae0 20 6a 35 20 3d 20 73 71 6c 69 74 65 33 56 64 62   j5 = sqlite3Vdb
13af0 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f  eAddOp0(v, OP_Go
13b00 74 6f 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  to);.        sql
13b10 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
13b20 28 76 2c 20 6a 33 29 3b 0a 20 20 20 20 20 20 20  (v, j3);.       
13b30 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
13b40 48 65 72 65 28 76 2c 20 6a 34 29 3b 0a 20 20 20  Here(v, j4);.   
13b50 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
13b60 20 20 72 32 20 3d 20 72 65 67 46 72 65 65 32 20    r2 = regFree2 
13b70 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
13b80 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
13b90 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
13ba0 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b  AddOp4(v, OP_Mak
13bb0 65 52 65 63 6f 72 64 2c 20 72 31 2c 20 31 2c 20  eRecord, r1, 1, 
13bc0 72 32 2c 20 26 61 66 66 69 6e 69 74 79 2c 20 31  r2, &affinity, 1
13bd0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
13be0 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e  e3ExprCacheAffin
13bf0 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65  ityChange(pParse
13c00 2c 20 72 31 2c 20 31 29 3b 0a 20 20 20 20 20 20  , r1, 1);.      
13c10 20 20 6a 35 20 3d 20 73 71 6c 69 74 65 33 56 64    j5 = sqlite3Vd
13c20 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 46  beAddOp3(v, OP_F
13c30 6f 75 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54 61  ound, pExpr->iTa
13c40 62 6c 65 2c 20 30 2c 20 72 32 29 3b 0a 20 20 20  ble, 0, r2);.   
13c50 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
13c60 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
13c70 4f 50 5f 41 64 64 49 6d 6d 2c 20 74 61 72 67 65  OP_AddImm, targe
13c80 74 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 73 71  t, -1);.      sq
13c90 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
13ca0 65 28 76 2c 20 6a 32 29 3b 0a 20 20 20 20 20 20  e(v, j2);.      
13cb0 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
13cc0 65 72 65 28 76 2c 20 6a 35 29 3b 0a 20 20 20 20  ere(v, j5);.    
13cd0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
13ce0 65 6e 64 69 66 0a 20 20 20 20 2f 2a 0a 20 20 20  endif.    /*.   
13cf0 20 2a 2a 20 20 20 20 78 20 42 45 54 57 45 45 4e   **    x BETWEEN
13d00 20 79 20 41 4e 44 20 7a 0a 20 20 20 20 2a 2a 0a   y AND z.    **.
13d10 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 65      ** This is e
13d20 71 75 69 76 61 6c 65 6e 74 20 74 6f 0a 20 20 20  quivalent to.   
13d30 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 78 3e   **.    **    x>
13d40 3d 79 20 41 4e 44 20 78 3c 3d 7a 0a 20 20 20 20  =y AND x<=z.    
13d50 2a 2a 0a 20 20 20 20 2a 2a 20 58 20 69 73 20 73  **.    ** X is s
13d60 74 6f 72 65 64 20 69 6e 20 70 45 78 70 72 2d 3e  tored in pExpr->
13d70 70 4c 65 66 74 2e 0a 20 20 20 20 2a 2a 20 59 20  pLeft..    ** Y 
13d80 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70 45 78  is stored in pEx
13d90 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e  pr->pList->a[0].
13da0 70 45 78 70 72 2e 0a 20 20 20 20 2a 2a 20 5a 20  pExpr..    ** Z 
13db0 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70 45 78  is stored in pEx
13dc0 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e  pr->pList->a[1].
13dd0 70 45 78 70 72 2e 0a 20 20 20 20 2a 2f 0a 20 20  pExpr..    */.  
13de0 20 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45    case TK_BETWEE
13df0 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72 20  N: {.      Expr 
13e00 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e  *pLeft = pExpr->
13e10 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 73 74 72  pLeft;.      str
13e20 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
13e30 6d 20 2a 70 4c 49 74 65 6d 20 3d 20 70 45 78 70  m *pLItem = pExp
13e40 72 2d 3e 70 4c 69 73 74 2d 3e 61 3b 0a 20 20 20  r->pList->a;.   
13e50 20 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 20     Expr *pRight 
13e60 3d 20 70 4c 49 74 65 6d 2d 3e 70 45 78 70 72 3b  = pLItem->pExpr;
13e70 0a 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70  ..      codeComp
13e80 61 72 65 4f 70 65 72 61 6e 64 73 28 70 50 61 72  areOperands(pPar
13e90 73 65 2c 20 70 4c 65 66 74 2c 20 26 72 31 2c 20  se, pLeft, &r1, 
13ea0 26 72 65 67 46 72 65 65 31 2c 0a 20 20 20 20 20  &regFree1,.     
13eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 52 69               pRi
13ed0 67 68 74 2c 20 26 72 32 2c 20 26 72 65 67 46 72  ght, &r2, &regFr
13ee0 65 65 32 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ee2);.      test
13ef0 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d  case( regFree1==
13f00 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  0 );.      testc
13f10 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30  ase( regFree2==0
13f20 20 29 3b 0a 20 20 20 20 20 20 72 33 20 3d 20 73   );.      r3 = s
13f30 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
13f40 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
13f50 72 34 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r4 = sqlite3GetT
13f60 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
13f70 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72        codeCompar
13f80 65 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c  e(pParse, pLeft,
13f90 20 70 52 69 67 68 74 2c 20 4f 50 5f 47 65 2c 0a   pRight, OP_Ge,.
13fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13fb0 20 20 72 31 2c 20 72 32 2c 20 72 33 2c 20 53 51    r1, r2, r3, SQ
13fc0 4c 49 54 45 5f 53 54 4f 52 45 50 32 29 3b 0a 20  LITE_STOREP2);. 
13fd0 20 20 20 20 20 70 4c 49 74 65 6d 2b 2b 3b 0a 20       pLItem++;. 
13fe0 20 20 20 20 20 70 52 69 67 68 74 20 3d 20 70 4c       pRight = pL
13ff0 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Item->pExpr;.   
14000 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
14010 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
14020 20 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20   regFree2);.    
14030 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78    r2 = sqlite3Ex
14040 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
14050 65 2c 20 70 52 69 67 68 74 2c 20 26 72 65 67 46  e, pRight, &regF
14060 72 65 65 32 29 3b 0a 20 20 20 20 20 20 74 65 73  ree2);.      tes
14070 74 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d  tcase( regFree2=
14080 3d 30 20 29 3b 0a 20 20 20 20 20 20 63 6f 64 65  =0 );.      code
14090 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20  Compare(pParse, 
140a0 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20 4f  pLeft, pRight, O
140b0 50 5f 4c 65 2c 20 72 31 2c 20 72 32 2c 20 72 34  P_Le, r1, r2, r4
140c0 2c 20 53 51 4c 49 54 45 5f 53 54 4f 52 45 50 32  , SQLITE_STOREP2
140d0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
140e0 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
140f0 5f 41 6e 64 2c 20 72 33 2c 20 72 34 2c 20 74 61  _And, r3, r4, ta
14100 72 67 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  rget);.      sql
14110 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
14120 65 67 28 70 50 61 72 73 65 2c 20 72 33 29 3b 0a  eg(pParse, r3);.
14130 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
14140 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
14150 73 65 2c 20 72 34 29 3b 0a 20 20 20 20 20 20 62  se, r4);.      b
14160 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
14170 63 61 73 65 20 54 4b 5f 55 50 4c 55 53 3a 20 7b  case TK_UPLUS: {
14180 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 73  .      inReg = s
14190 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61  qlite3ExprCodeTa
141a0 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 78  rget(pParse, pEx
141b0 70 72 2d 3e 70 4c 65 66 74 2c 20 74 61 72 67 65  pr->pLeft, targe
141c0 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  t);.      break;
141d0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20  .    }..    /*. 
141e0 20 20 20 2a 2a 20 46 6f 72 6d 20 41 3a 0a 20 20     ** Form A:.  
141f0 20 20 2a 2a 20 20 20 43 41 53 45 20 78 20 57 48    **   CASE x WH
14200 45 4e 20 65 31 20 54 48 45 4e 20 72 31 20 57 48  EN e1 THEN r1 WH
14210 45 4e 20 65 32 20 54 48 45 4e 20 72 32 20 2e 2e  EN e2 THEN r2 ..
14220 2e 20 57 48 45 4e 20 65 4e 20 54 48 45 4e 20 72  . WHEN eN THEN r
14230 4e 20 45 4c 53 45 20 79 20 45 4e 44 0a 20 20 20  N ELSE y END.   
14240 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 6d 20   **.    ** Form 
14250 42 3a 0a 20 20 20 20 2a 2a 20 20 20 43 41 53 45  B:.    **   CASE
14260 20 57 48 45 4e 20 65 31 20 54 48 45 4e 20 72 31   WHEN e1 THEN r1
14270 20 57 48 45 4e 20 65 32 20 54 48 45 4e 20 72 32   WHEN e2 THEN r2
14280 20 2e 2e 2e 20 57 48 45 4e 20 65 4e 20 54 48 45   ... WHEN eN THE
14290 4e 20 72 4e 20 45 4c 53 45 20 79 20 45 4e 44 0a  N rN ELSE y END.
142a0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f      **.    ** Fo
142b0 72 6d 20 41 20 69 73 20 63 61 6e 20 62 65 20 74  rm A is can be t
142c0 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74 6f 20  ransformed into 
142d0 74 68 65 20 65 71 75 69 76 61 6c 65 6e 74 20 66  the equivalent f
142e0 6f 72 6d 20 42 20 61 73 20 66 6f 6c 6c 6f 77 73  orm B as follows
142f0 3a 0a 20 20 20 20 2a 2a 20 20 20 43 41 53 45 20  :.    **   CASE 
14300 57 48 45 4e 20 78 3d 65 31 20 54 48 45 4e 20 72  WHEN x=e1 THEN r
14310 31 20 57 48 45 4e 20 78 3d 65 32 20 54 48 45 4e  1 WHEN x=e2 THEN
14320 20 72 32 20 2e 2e 2e 0a 20 20 20 20 2a 2a 20 20   r2 ....    **  
14330 20 20 20 20 20 20 57 48 45 4e 20 78 3d 65 4e 20        WHEN x=eN 
14340 54 48 45 4e 20 72 4e 20 45 4c 53 45 20 79 20 45  THEN rN ELSE y E
14350 4e 44 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  ND.    **.    **
14360 20 58 20 28 69 66 20 69 74 20 65 78 69 73 74 73   X (if it exists
14370 29 20 69 73 20 69 6e 20 70 45 78 70 72 2d 3e 70  ) is in pExpr->p
14380 4c 65 66 74 2e 0a 20 20 20 20 2a 2a 20 59 20 69  Left..    ** Y i
14390 73 20 69 6e 20 70 45 78 70 72 2d 3e 70 52 69 67  s in pExpr->pRig
143a0 68 74 2e 20 20 54 68 65 20 59 20 69 73 20 61 6c  ht.  The Y is al
143b0 73 6f 20 6f 70 74 69 6f 6e 61 6c 2e 20 20 49 66  so optional.  If
143c0 20 74 68 65 72 65 20 69 73 20 6e 6f 0a 20 20 20   there is no.   
143d0 20 2a 2a 20 45 4c 53 45 20 63 6c 61 75 73 65 20   ** ELSE clause 
143e0 61 6e 64 20 6e 6f 20 6f 74 68 65 72 20 74 65 72  and no other ter
143f0 6d 20 6d 61 74 63 68 65 73 2c 20 74 68 65 6e 20  m matches, then 
14400 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68  the result of th
14410 65 0a 20 20 20 20 2a 2a 20 65 78 70 72 73 73 69  e.    ** exprssi
14420 6f 6e 20 69 73 20 4e 55 4c 4c 2e 0a 20 20 20 20  on is NULL..    
14430 2a 2a 20 45 69 20 69 73 20 69 6e 20 70 45 78 70  ** Ei is in pExp
14440 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 2a 32 5d  r->pList->a[i*2]
14450 20 61 6e 64 20 52 69 20 69 73 20 70 45 78 70 72   and Ri is pExpr
14460 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 2a 32 2b 31  ->pList->a[i*2+1
14470 5d 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  ]..    **.    **
14480 20 54 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74   The result of t
14490 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
144a0 20 74 68 65 20 52 69 20 66 6f 72 20 74 68 65 20   the Ri for the 
144b0 66 69 72 73 74 20 6d 61 74 63 68 69 6e 67 20 45  first matching E
144c0 69 2c 0a 20 20 20 20 2a 2a 20 6f 72 20 69 66 20  i,.    ** or if 
144d0 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 61 74 63  there is no matc
144e0 68 69 6e 67 20 45 69 2c 20 74 68 65 20 45 4c 53  hing Ei, the ELS
144f0 45 20 74 65 72 6d 20 59 2c 20 6f 72 20 69 66 20  E term Y, or if 
14500 74 68 65 72 65 20 69 73 0a 20 20 20 20 2a 2a 20  there is.    ** 
14510 6e 6f 20 45 4c 53 45 20 74 65 72 6d 2c 20 4e 55  no ELSE term, NU
14520 4c 4c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  LL..    */.    c
14530 61 73 65 20 54 4b 5f 43 41 53 45 3a 20 7b 0a 20  ase TK_CASE: {. 
14540 20 20 20 20 20 69 6e 74 20 65 6e 64 4c 61 62 65       int endLabe
14550 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
14560 20 20 20 20 20 20 20 2f 2a 20 47 4f 54 4f 20 6c         /* GOTO l
14570 61 62 65 6c 20 66 6f 72 20 65 6e 64 20 6f 66 20  abel for end of 
14580 43 41 53 45 20 73 74 6d 74 20 2a 2f 0a 20 20 20  CASE stmt */.   
14590 20 20 20 69 6e 74 20 6e 65 78 74 43 61 73 65 3b     int nextCase;
145a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
145b0 20 20 20 20 20 2f 2a 20 47 4f 54 4f 20 6c 61 62       /* GOTO lab
145c0 65 6c 20 66 6f 72 20 6e 65 78 74 20 57 48 45 4e  el for next WHEN
145d0 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20   clause */.     
145e0 20 69 6e 74 20 6e 45 78 70 72 3b 20 20 20 20 20   int nExpr;     
145f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14600 20 20 20 2f 2a 20 32 78 20 6e 75 6d 62 65 72 20     /* 2x number 
14610 6f 66 20 57 48 45 4e 20 74 65 72 6d 73 20 2a 2f  of WHEN terms */
14620 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 20 20 20  .      int i;   
14630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14640 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
14650 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20   counter */.    
14660 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
14670 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  st;             
14680 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 57      /* List of W
14690 48 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20  HEN terms */.   
146a0 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
146b0 73 74 5f 69 74 65 6d 20 2a 61 4c 69 73 74 65 6c  st_item *aListel
146c0 65 6d 3b 20 20 2f 2a 20 41 72 72 61 79 20 6f 66  em;  /* Array of
146d0 20 57 48 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20   WHEN terms */. 
146e0 20 20 20 20 20 45 78 70 72 20 6f 70 43 6f 6d 70       Expr opComp
146f0 61 72 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  are;            
14700 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 58 3d         /* The X=
14710 3d 45 69 20 65 78 70 72 65 73 73 69 6f 6e 20 2a  =Ei expression *
14720 2f 0a 20 20 20 20 20 20 45 78 70 72 20 63 61 63  /.      Expr cac
14730 68 65 58 3b 20 20 20 20 20 20 20 20 20 20 20 20  heX;            
14740 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 61 63            /* Cac
14750 68 65 64 20 65 78 70 72 65 73 73 69 6f 6e 20 58  hed expression X
14760 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a   */.      Expr *
14770 70 58 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  pX;             
14780 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
14790 68 65 20 58 20 65 78 70 72 65 73 73 69 6f 6e 20  he X expression 
147a0 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  */.      Expr *p
147b0 54 65 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  Test;           
147c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 58 3d             /* X=
147d0 3d 45 69 20 28 66 6f 72 6d 20 41 29 20 6f 72 20  =Ei (form A) or 
147e0 6a 75 73 74 20 45 69 20 28 66 6f 72 6d 20 42 29  just Ei (form B)
147f0 20 2a 2f 0a 0a 20 20 20 20 20 20 61 73 73 65 72   */..      asser
14800 74 28 70 45 78 70 72 2d 3e 70 4c 69 73 74 29 3b  t(pExpr->pList);
14810 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 28 70  .      assert((p
14820 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78  Expr->pList->nEx
14830 70 72 20 25 20 32 29 20 3d 3d 20 30 29 3b 0a 20  pr % 2) == 0);. 
14840 20 20 20 20 20 61 73 73 65 72 74 28 70 45 78 70       assert(pExp
14850 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20  r->pList->nExpr 
14860 3e 20 30 29 3b 0a 20 20 20 20 20 20 70 45 4c 69  > 0);.      pELi
14870 73 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73  st = pExpr->pLis
14880 74 3b 0a 20 20 20 20 20 20 61 4c 69 73 74 65 6c  t;.      aListel
14890 65 6d 20 3d 20 70 45 4c 69 73 74 2d 3e 61 3b 0a  em = pEList->a;.
148a0 20 20 20 20 20 20 6e 45 78 70 72 20 3d 20 70 45        nExpr = pE
148b0 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  List->nExpr;.   
148c0 20 20 20 65 6e 64 4c 61 62 65 6c 20 3d 20 73 71     endLabel = sq
148d0 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
148e0 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 66 28  el(v);.      if(
148f0 20 28 70 58 20 3d 20 70 45 78 70 72 2d 3e 70 4c   (pX = pExpr->pL
14900 65 66 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  eft)!=0 ){.     
14910 20 20 20 63 61 63 68 65 58 20 3d 20 2a 70 58 3b     cacheX = *pX;
14920 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
14930 65 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  e( pX->op==TK_CO
14940 4c 55 4d 4e 20 7c 7c 20 70 58 2d 3e 6f 70 3d 3d  LUMN || pX->op==
14950 54 4b 5f 52 45 47 49 53 54 45 52 20 29 3b 0a 20  TK_REGISTER );. 
14960 20 20 20 20 20 20 20 63 61 63 68 65 58 2e 69 54         cacheX.iT
14970 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 33 45 78  able = sqlite3Ex
14980 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
14990 65 2c 20 70 58 2c 20 26 72 65 67 46 72 65 65 31  e, pX, &regFree1
149a0 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
149b0 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30  ase( regFree1==0
149c0 20 29 3b 0a 20 20 20 20 20 20 20 20 63 61 63 68   );.        cach
149d0 65 58 2e 6f 70 20 3d 20 54 4b 5f 52 45 47 49 53  eX.op = TK_REGIS
149e0 54 45 52 3b 0a 20 20 20 20 20 20 20 20 63 61 63  TER;.        cac
149f0 68 65 58 2e 69 43 6f 6c 75 6d 6e 20 3d 20 30 3b  heX.iColumn = 0;
14a00 0a 20 20 20 20 20 20 20 20 6f 70 43 6f 6d 70 61  .        opCompa
14a10 72 65 2e 6f 70 20 3d 20 54 4b 5f 45 51 3b 0a 20  re.op = TK_EQ;. 
14a20 20 20 20 20 20 20 20 6f 70 43 6f 6d 70 61 72 65         opCompare
14a30 2e 70 4c 65 66 74 20 3d 20 26 63 61 63 68 65 58  .pLeft = &cacheX
14a40 3b 0a 20 20 20 20 20 20 20 20 70 54 65 73 74 20  ;.        pTest 
14a50 3d 20 26 6f 70 43 6f 6d 70 61 72 65 3b 0a 20 20  = &opCompare;.  
14a60 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 72      }.      pPar
14a70 73 65 2d 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61  se->disableColCa
14a80 63 68 65 2b 2b 3b 0a 20 20 20 20 20 20 66 6f 72  che++;.      for
14a90 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72 3b 20 69  (i=0; i<nExpr; i
14aa0 3d 69 2b 32 29 7b 0a 20 20 20 20 20 20 20 20 69  =i+2){.        i
14ab0 66 28 20 70 58 20 29 7b 0a 20 20 20 20 20 20 20  f( pX ){.       
14ac0 20 20 20 6f 70 43 6f 6d 70 61 72 65 2e 70 52 69     opCompare.pRi
14ad0 67 68 74 20 3d 20 61 4c 69 73 74 65 6c 65 6d 5b  ght = aListelem[
14ae0 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  i].pExpr;.      
14af0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
14b00 20 20 20 70 54 65 73 74 20 3d 20 61 4c 69 73 74     pTest = aList
14b10 65 6c 65 6d 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  elem[i].pExpr;. 
14b20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
14b30 20 6e 65 78 74 43 61 73 65 20 3d 20 73 71 6c 69   nextCase = sqli
14b40 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
14b50 28 76 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  (v);.        tes
14b60 74 63 61 73 65 28 20 70 54 65 73 74 2d 3e 6f 70  tcase( pTest->op
14b70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70  ==TK_COLUMN || p
14b80 54 65 73 74 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47  Test->op==TK_REG
14b90 49 53 54 45 52 20 29 3b 0a 20 20 20 20 20 20 20  ISTER );.       
14ba0 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
14bb0 6c 73 65 28 70 50 61 72 73 65 2c 20 70 54 65 73  lse(pParse, pTes
14bc0 74 2c 20 6e 65 78 74 43 61 73 65 2c 20 53 51 4c  t, nextCase, SQL
14bd0 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b  ITE_JUMPIFNULL);
14be0 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
14bf0 65 28 20 61 4c 69 73 74 65 6c 65 6d 5b 69 2b 31  e( aListelem[i+1
14c00 5d 2e 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ].pExpr->op==TK_
14c10 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20  COLUMN );.      
14c20 20 20 74 65 73 74 63 61 73 65 28 20 61 4c 69 73    testcase( aLis
14c30 74 65 6c 65 6d 5b 69 2b 31 5d 2e 70 45 78 70 72  telem[i+1].pExpr
14c40 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45  ->op==TK_REGISTE
14c50 52 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  R );.        sql
14c60 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
14c70 72 73 65 2c 20 61 4c 69 73 74 65 6c 65 6d 5b 69  rse, aListelem[i
14c80 2b 31 5d 2e 70 45 78 70 72 2c 20 74 61 72 67 65  +1].pExpr, targe
14c90 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  t);.        sqli
14ca0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
14cb0 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 65 6e 64   OP_Goto, 0, end
14cc0 4c 61 62 65 6c 29 3b 0a 20 20 20 20 20 20 20 20  Label);.        
14cd0 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
14ce0 76 65 4c 61 62 65 6c 28 76 2c 20 6e 65 78 74 43  veLabel(v, nextC
14cf0 61 73 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ase);.      }.  
14d00 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70      if( pExpr->p
14d10 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 20  Right ){.       
14d20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
14d30 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
14d40 70 52 69 67 68 74 2c 20 74 61 72 67 65 74 29 3b  pRight, target);
14d50 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
14d60 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
14d70 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75  eAddOp2(v, OP_Nu
14d80 6c 6c 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a  ll, 0, target);.
14d90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
14da0 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
14db0 4c 61 62 65 6c 28 76 2c 20 65 6e 64 4c 61 62 65  Label(v, endLabe
14dc0 6c 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  l);.      assert
14dd0 28 20 70 50 61 72 73 65 2d 3e 64 69 73 61 62 6c  ( pParse->disabl
14de0 65 43 6f 6c 43 61 63 68 65 3e 30 20 29 3b 0a 20  eColCache>0 );. 
14df0 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64 69 73       pParse->dis
14e00 61 62 6c 65 43 6f 6c 43 61 63 68 65 2d 2d 3b 0a  ableColCache--;.
14e10 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
14e20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
14e30 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a 20  E_OMIT_TRIGGER. 
14e40 20 20 20 63 61 73 65 20 54 4b 5f 52 41 49 53 45     case TK_RAISE
14e50 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 21 70  : {.      if( !p
14e60 50 61 72 73 65 2d 3e 74 72 69 67 53 74 61 63 6b  Parse->trigStack
14e70 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
14e80 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
14e90 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  se,.            
14ea0 20 20 20 20 20 20 20 20 20 20 20 22 52 41 49 53             "RAIS
14eb0 45 28 29 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20  E() may only be 
14ec0 75 73 65 64 20 77 69 74 68 69 6e 20 61 20 74 72  used within a tr
14ed0 69 67 67 65 72 2d 70 72 6f 67 72 61 6d 22 29 3b  igger-program");
14ee0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
14ef0 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
14f00 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c   if( pExpr->iCol
14f10 75 6d 6e 21 3d 4f 45 5f 49 67 6e 6f 72 65 20 29  umn!=OE_Ignore )
14f20 7b 0a 20 20 20 20 20 20 20 20 20 61 73 73 65 72  {.         asser
14f30 74 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  t( pExpr->iColum
14f40 6e 3d 3d 4f 45 5f 52 6f 6c 6c 62 61 63 6b 20 7c  n==OE_Rollback |
14f50 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  |.              
14f60 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d     pExpr->iColum
14f70 6e 20 3d 3d 20 4f 45 5f 41 62 6f 72 74 20 7c 7c  n == OE_Abort ||
14f80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
14f90 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e    pExpr->iColumn
14fa0 20 3d 3d 20 4f 45 5f 46 61 69 6c 20 29 3b 0a 20   == OE_Fail );. 
14fb0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
14fc0 65 71 75 6f 74 65 45 78 70 72 28 70 50 61 72 73  equoteExpr(pPars
14fd0 65 2d 3e 64 62 2c 20 70 45 78 70 72 29 3b 0a 20  e->db, pExpr);. 
14fe0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
14ff0 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
15000 48 61 6c 74 2c 20 53 51 4c 49 54 45 5f 43 4f 4e  Halt, SQLITE_CON
15010 53 54 52 41 49 4e 54 2c 20 70 45 78 70 72 2d 3e  STRAINT, pExpr->
15020 69 43 6f 6c 75 6d 6e 2c 20 30 2c 0a 20 20 20 20  iColumn, 0,.    
15030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15040 20 20 20 20 28 63 68 61 72 2a 29 70 45 78 70 72      (char*)pExpr
15050 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70 72  ->token.z, pExpr
15060 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a 20 20 20 20  ->token.n);.    
15070 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
15080 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
15090 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 3d 20 4f 45  r->iColumn == OE
150a0 5f 49 67 6e 6f 72 65 20 29 3b 0a 20 20 20 20 20  _Ignore );.     
150b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
150c0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 6e 74  ddOp2(v, OP_Cont
150d0 65 78 74 50 6f 70 2c 20 30 2c 20 30 29 3b 0a 20  extPop, 0, 0);. 
150e0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
150f0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
15100 47 6f 74 6f 2c 20 30 2c 20 70 50 61 72 73 65 2d  Goto, 0, pParse-
15110 3e 74 72 69 67 53 74 61 63 6b 2d 3e 69 67 6e 6f  >trigStack->igno
15120 72 65 4a 75 6d 70 29 3b 0a 20 20 20 20 20 20 20  reJump);.       
15130 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
15140 2c 20 22 72 61 69 73 65 28 49 47 4e 4f 52 45 29  , "raise(IGNORE)
15150 22 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  "));.      }.   
15160 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
15170 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 73 71 6c  #endif.  }.  sql
15180 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
15190 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72  eg(pParse, regFr
151a0 65 65 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 52  ee1);.  sqlite3R
151b0 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
151c0 61 72 73 65 2c 20 72 65 67 46 72 65 65 32 29 3b  arse, regFree2);
151d0 0a 20 20 72 65 74 75 72 6e 20 69 6e 52 65 67 3b  .  return inReg;
151e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
151f0 74 65 20 63 6f 64 65 20 74 6f 20 65 76 61 6c 75  te code to evalu
15200 61 74 65 20 61 6e 20 65 78 70 72 65 73 73 69 6f  ate an expressio
15210 6e 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20  n and store the 
15220 72 65 73 75 6c 74 73 0a 2a 2a 20 69 6e 74 6f 20  results.** into 
15230 61 20 72 65 67 69 73 74 65 72 2e 20 20 52 65 74  a register.  Ret
15240 75 72 6e 20 74 68 65 20 72 65 67 69 73 74 65 72  urn the register
15250 20 6e 75 6d 62 65 72 20 77 68 65 72 65 20 74 68   number where th
15260 65 20 72 65 73 75 6c 74 73 0a 2a 2a 20 61 72 65  e results.** are
15270 20 73 74 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49   stored..**.** I
15280 66 20 74 68 65 20 72 65 67 69 73 74 65 72 20 69  f the register i
15290 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 72 65  s a temporary re
152a0 67 69 73 74 65 72 20 74 68 61 74 20 63 61 6e 20  gister that can 
152b0 62 65 20 64 65 61 6c 6c 6f 63 61 74 65 64 2c 0a  be deallocated,.
152c0 2a 2a 20 74 68 65 6e 20 77 72 69 74 65 20 69 74  ** then write it
152d0 73 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20 2a 70  s number into *p
152e0 52 65 67 2e 20 20 49 66 20 74 68 65 20 72 65 73  Reg.  If the res
152f0 75 6c 74 20 72 65 67 69 73 74 65 72 20 69 73 20  ult register is 
15300 6e 6f 74 0a 2a 2a 20 61 20 74 65 6d 70 6f 72 61  not.** a tempora
15310 72 79 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 52  ry, then set *pR
15320 65 67 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2f 0a 69  eg to zero..*/.i
15330 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  nt sqlite3ExprCo
15340 64 65 54 65 6d 70 28 50 61 72 73 65 20 2a 70 50  deTemp(Parse *pP
15350 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
15360 72 2c 20 69 6e 74 20 2a 70 52 65 67 29 7b 0a 20  r, int *pReg){. 
15370 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65   int r1 = sqlite
15380 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
15390 73 65 29 3b 0a 20 20 69 6e 74 20 72 32 20 3d 20  se);.  int r2 = 
153a0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
153b0 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 45  arget(pParse, pE
153c0 78 70 72 2c 20 72 31 29 3b 0a 20 20 69 66 28 20  xpr, r1);.  if( 
153d0 72 32 3d 3d 72 31 20 29 7b 0a 20 20 20 20 2a 70  r2==r1 ){.    *p
153e0 52 65 67 20 3d 20 72 31 3b 0a 20 20 7d 65 6c 73  Reg = r1;.  }els
153f0 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65  e{.    sqlite3Re
15400 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
15410 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 2a 70  rse, r1);.    *p
15420 52 65 67 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  Reg = 0;.  }.  r
15430 65 74 75 72 6e 20 72 32 3b 0a 7d 0a 0a 2f 2a 0a  eturn r2;.}../*.
15440 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
15450 20 74 68 61 74 20 77 69 6c 6c 20 65 76 61 6c 75   that will evalu
15460 61 74 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70  ate expression p
15470 45 78 70 72 20 61 6e 64 20 73 74 6f 72 65 20 74  Expr and store t
15480 68 65 0a 2a 2a 20 72 65 73 75 6c 74 73 20 69 6e  he.** results in
15490 20 72 65 67 69 73 74 65 72 20 74 61 72 67 65 74   register target
154a0 2e 20 20 54 68 65 20 72 65 73 75 6c 74 73 20 61  .  The results a
154b0 72 65 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  re guaranteed to
154c0 20 61 70 70 65 61 72 0a 2a 2a 20 69 6e 20 72 65   appear.** in re
154d0 67 69 73 74 65 72 20 74 61 72 67 65 74 2e 0a 2a  gister target..*
154e0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
154f0 72 43 6f 64 65 28 50 61 72 73 65 20 2a 70 50 61  rCode(Parse *pPa
15500 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
15510 2c 20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a 20  , int target){. 
15520 20 69 6e 74 20 69 6e 52 65 67 3b 0a 0a 20 20 61   int inReg;..  a
15530 73 73 65 72 74 28 20 74 61 72 67 65 74 3e 30 20  ssert( target>0 
15540 26 26 20 74 61 72 67 65 74 3c 3d 70 50 61 72 73  && target<=pPars
15550 65 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 69 6e 52  e->nMem );.  inR
15560 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  eg = sqlite3Expr
15570 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73  CodeTarget(pPars
15580 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65 74  e, pExpr, target
15590 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
155a0 72 73 65 2d 3e 70 56 64 62 65 20 7c 7c 20 70 50  rse->pVdbe || pP
155b0 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
155c0 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20  Failed );.  if( 
155d0 69 6e 52 65 67 21 3d 74 61 72 67 65 74 20 26 26  inReg!=target &&
155e0 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 20 29   pParse->pVdbe )
155f0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
15600 65 41 64 64 4f 70 32 28 70 50 61 72 73 65 2d 3e  eAddOp2(pParse->
15610 70 56 64 62 65 2c 20 4f 50 5f 53 43 6f 70 79 2c  pVdbe, OP_SCopy,
15620 20 69 6e 52 65 67 2c 20 74 61 72 67 65 74 29 3b   inReg, target);
15630 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 74 61  .  }.  return ta
15640 72 67 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  rget;.}../*.** G
15650 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
15660 74 20 65 76 61 6c 75 74 65 73 20 74 68 65 20 67  t evalutes the g
15670 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  iven expression 
15680 61 6e 64 20 70 75 74 73 20 74 68 65 20 72 65 73  and puts the res
15690 75 6c 74 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74  ult.** in regist
156a0 65 72 20 74 61 72 67 65 74 2e 0a 2a 2a 0a 2a 2a  er target..**.**
156b0 20 41 6c 73 6f 20 6d 61 6b 65 20 61 20 63 6f 70   Also make a cop
156c0 79 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73  y of the express
156d0 69 6f 6e 20 72 65 73 75 6c 74 73 20 69 6e 74 6f  ion results into
156e0 20 61 6e 6f 74 68 65 72 20 22 63 61 63 68 65 22   another "cache"
156f0 20 72 65 67 69 73 74 65 72 0a 2a 2a 20 61 6e 64   register.** and
15700 20 6d 6f 64 69 66 79 20 74 68 65 20 65 78 70 72   modify the expr
15710 65 73 73 69 6f 6e 20 73 6f 20 74 68 61 74 20 74  ession so that t
15720 68 65 20 6e 65 78 74 20 74 69 6d 65 20 69 74 20  he next time it 
15730 69 73 20 65 76 61 6c 75 61 74 65 64 2c 0a 2a 2a  is evaluated,.**
15740 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 61   the result is a
15750 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63 61 63   copy of the cac
15760 68 65 20 72 65 67 69 73 74 65 72 2e 0a 2a 2a 0a  he register..**.
15770 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
15780 69 73 20 75 73 65 64 20 66 6f 72 20 65 78 70 72  is used for expr
15790 65 73 73 69 6f 6e 73 20 74 68 61 74 20 61 72 65  essions that are
157a0 20 75 73 65 64 20 6d 75 6c 74 69 70 6c 65 20 0a   used multiple .
157b0 2a 2a 20 74 69 6d 65 73 2e 20 20 54 68 65 79 20  ** times.  They 
157c0 61 72 65 20 65 76 61 6c 75 61 74 65 64 20 6f 6e  are evaluated on
157d0 63 65 20 61 6e 64 20 74 68 65 20 72 65 73 75 6c  ce and the resul
157e0 74 73 20 6f 66 20 74 68 65 20 65 78 70 72 65 73  ts of the expres
157f0 73 69 6f 6e 0a 2a 2a 20 61 72 65 20 72 65 75 73  sion.** are reus
15800 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
15810 65 33 45 78 70 72 43 6f 64 65 41 6e 64 43 61 63  e3ExprCodeAndCac
15820 68 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  he(Parse *pParse
15830 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69  , Expr *pExpr, i
15840 6e 74 20 74 61 72 67 65 74 29 7b 0a 20 20 56 64  nt target){.  Vd
15850 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
15860 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 6e 52  pVdbe;.  int inR
15870 65 67 3b 0a 20 20 69 6e 52 65 67 20 3d 20 73 71  eg;.  inReg = sq
15880 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
15890 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72  arse, pExpr, tar
158a0 67 65 74 29 3b 0a 20 20 61 73 73 65 72 74 28 20  get);.  assert( 
158b0 74 61 72 67 65 74 3e 30 20 29 3b 0a 20 20 69 66  target>0 );.  if
158c0 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
158d0 52 45 47 49 53 54 45 52 20 29 7b 20 20 0a 20 20  REGISTER ){  .  
158e0 20 20 69 6e 74 20 69 4d 65 6d 3b 0a 20 20 20 20    int iMem;.    
158f0 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d  iMem = ++pParse-
15900 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74  >nMem;.    sqlit
15910 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
15920 4f 50 5f 43 6f 70 79 2c 20 69 6e 52 65 67 2c 20  OP_Copy, inReg, 
15930 69 4d 65 6d 29 3b 0a 20 20 20 20 70 45 78 70 72  iMem);.    pExpr
15940 2d 3e 69 54 61 62 6c 65 20 3d 20 69 4d 65 6d 3b  ->iTable = iMem;
15950 0a 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c  .    pExpr->iCol
15960 75 6d 6e 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b  umn = pExpr->op;
15970 0a 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d  .    pExpr->op =
15980 20 54 4b 5f 52 45 47 49 53 54 45 52 3b 0a 20 20   TK_REGISTER;.  
15990 7d 0a 20 20 72 65 74 75 72 6e 20 69 6e 52 65 67  }.  return inReg
159a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
159b0 6e 20 54 52 55 45 20 69 66 20 70 45 78 70 72 20  n TRUE if pExpr 
159c0 69 73 20 61 6e 20 63 6f 6e 73 74 61 6e 74 20 65  is an constant e
159d0 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 69  xpression that i
159e0 73 20 61 70 70 72 6f 70 72 69 61 74 65 0a 2a 2a  s appropriate.**
159f0 20 66 6f 72 20 66 61 63 74 6f 72 69 6e 67 20 6f   for factoring o
15a00 75 74 20 6f 66 20 61 20 6c 6f 6f 70 2e 20 20 41  ut of a loop.  A
15a10 70 70 72 6f 70 72 69 61 74 65 20 65 78 70 72 65  ppropriate expre
15a20 73 73 69 6f 6e 73 20 61 72 65 3a 0a 2a 2a 0a 2a  ssions are:.**.*
15a30 2a 20 20 20 20 2a 20 20 41 6e 79 20 65 78 70 72  *    *  Any expr
15a40 65 73 73 69 6f 6e 20 74 68 61 74 20 65 76 61 6c  ession that eval
15a50 75 61 74 65 73 20 74 6f 20 74 77 6f 20 6f 72 20  uates to two or 
15a60 6d 6f 72 65 20 6f 70 63 6f 64 65 73 2e 0a 2a 2a  more opcodes..**
15a70 0a 2a 2a 20 20 20 20 2a 20 20 41 6e 79 20 4f 50  .**    *  Any OP
15a80 5f 49 6e 74 65 67 65 72 2c 20 4f 50 5f 52 65 61  _Integer, OP_Rea
15a90 6c 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 4f 50  l, OP_String, OP
15aa0 5f 42 6c 6f 62 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  _Blob, OP_Null, 
15ab0 0a 2a 2a 20 20 20 20 20 20 20 6f 72 20 4f 50 5f  .**       or OP_
15ac0 56 61 72 69 61 62 6c 65 20 74 68 61 74 20 64 6f  Variable that do
15ad0 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62  es not need to b
15ae0 65 20 70 6c 61 63 65 64 20 69 6e 20 61 20 0a 2a  e placed in a .*
15af0 2a 20 20 20 20 20 20 20 73 70 65 63 69 66 69 63  *       specific
15b00 20 72 65 67 69 73 74 65 72 2e 0a 2a 2a 0a 2a 2a   register..**.**
15b10 20 54 68 65 72 65 20 69 73 20 6e 6f 20 70 6f 69   There is no poi
15b20 6e 74 20 69 6e 20 66 61 63 74 6f 72 69 6e 67 20  nt in factoring 
15b30 6f 75 74 20 73 69 6e 67 6c 65 2d 69 6e 73 74 72  out single-instr
15b40 75 63 74 69 6f 6e 20 63 6f 6e 73 74 61 6e 74 0a  uction constant.
15b50 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74  ** expressions t
15b60 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20 70  hat need to be p
15b70 6c 61 63 65 64 20 69 6e 20 61 20 70 61 72 74 69  laced in a parti
15b80 63 75 6c 61 72 20 72 65 67 69 73 74 65 72 2e 20  cular register. 
15b90 20 0a 2a 2a 20 57 65 20 63 6f 75 6c 64 20 66 61   .** We could fa
15ba0 63 74 6f 72 20 74 68 65 6d 20 6f 75 74 2c 20 62  ctor them out, b
15bb0 75 74 20 74 68 65 6e 20 77 65 20 77 6f 75 6c 64  ut then we would
15bc0 20 65 6e 64 20 75 70 20 61 64 64 69 6e 67 20 61   end up adding a
15bd0 6e 0a 2a 2a 20 4f 50 5f 53 43 6f 70 79 20 69 6e  n.** OP_SCopy in
15be0 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 6d 6f 76  struction to mov
15bf0 65 20 74 68 65 20 76 61 6c 75 65 20 69 6e 74 6f  e the value into
15c00 20 74 68 65 20 63 6f 72 72 65 63 74 20 72 65 67   the correct reg
15c10 69 73 74 65 72 0a 2a 2a 20 6c 61 74 65 72 2e 20  ister.** later. 
15c20 20 57 65 20 6d 69 67 68 74 20 61 73 20 77 65 6c   We might as wel
15c30 6c 20 6a 75 73 74 20 75 73 65 20 74 68 65 20 6f  l just use the o
15c40 72 69 67 69 6e 61 6c 20 69 6e 73 74 72 75 63 74  riginal instruct
15c50 69 6f 6e 20 61 6e 64 0a 2a 2a 20 61 76 6f 69 64  ion and.** avoid
15c60 20 74 68 65 20 4f 50 5f 53 43 6f 70 79 2e 0a 2a   the OP_SCopy..*
15c70 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73 41  /.static int isA
15c80 70 70 72 6f 70 72 69 61 74 65 46 6f 72 46 61 63  ppropriateForFac
15c90 74 6f 72 69 6e 67 28 45 78 70 72 20 2a 70 29 7b  toring(Expr *p){
15ca0 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 45  .  if( !sqlite3E
15cb0 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74  xprIsConstantNot
15cc0 4a 6f 69 6e 28 70 29 20 29 7b 0a 20 20 20 20 72  Join(p) ){.    r
15cd0 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 4f 6e 6c  eturn 0;  /* Onl
15ce0 79 20 63 6f 6e 73 74 61 6e 74 20 65 78 70 72 65  y constant expre
15cf0 73 73 69 6f 6e 73 20 61 72 65 20 61 70 70 72 6f  ssions are appro
15d00 70 72 69 61 74 65 20 66 6f 72 20 66 61 63 74 6f  priate for facto
15d10 72 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 69 66  ring */.  }.  if
15d20 28 20 28 70 2d 3e 66 6c 61 67 73 20 26 20 45 50  ( (p->flags & EP
15d30 5f 46 69 78 65 64 44 65 73 74 29 3d 3d 30 20 29  _FixedDest)==0 )
15d40 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 20  {.    return 1; 
15d50 20 2f 2a 20 41 6e 79 20 63 6f 6e 73 74 61 6e 74   /* Any constant
15d60 20 77 69 74 68 6f 75 74 20 61 20 66 69 78 65 64   without a fixed
15d70 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 69 73 20   destination is 
15d80 61 70 70 72 6f 70 72 69 61 74 65 20 2a 2f 0a 20  appropriate */. 
15d90 20 7d 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 6f   }.  while( p->o
15da0 70 3d 3d 54 4b 5f 55 50 4c 55 53 20 29 20 70 20  p==TK_UPLUS ) p 
15db0 3d 20 70 2d 3e 70 4c 65 66 74 3b 0a 20 20 73 77  = p->pLeft;.  sw
15dc0 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 23  itch( p->op ){.#
15dd0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
15de0 49 54 5f 42 4c 4f 42 5f 4c 49 54 45 52 41 4c 0a  IT_BLOB_LITERAL.
15df0 20 20 20 20 63 61 73 65 20 54 4b 5f 42 4c 4f 42      case TK_BLOB
15e00 3a 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73  :.#endif.    cas
15e10 65 20 54 4b 5f 56 41 52 49 41 42 4c 45 3a 0a 20  e TK_VARIABLE:. 
15e20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 47     case TK_INTEG
15e30 45 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ER:.    case TK_
15e40 46 4c 4f 41 54 3a 0a 20 20 20 20 63 61 73 65 20  FLOAT:.    case 
15e50 54 4b 5f 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73  TK_NULL:.    cas
15e60 65 20 54 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a 20  e TK_STRING: {. 
15e70 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
15e80 2d 3e 6f 70 3d 3d 54 4b 5f 42 4c 4f 42 20 29 3b  ->op==TK_BLOB );
15e90 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
15ea0 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 56 41 52 49 41   p->op==TK_VARIA
15eb0 42 4c 45 20 29 3b 0a 20 20 20 20 20 20 74 65 73  BLE );.      tes
15ec0 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b  tcase( p->op==TK
15ed0 5f 49 4e 54 45 47 45 52 20 29 3b 0a 20 20 20 20  _INTEGER );.    
15ee0 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e 6f    testcase( p->o
15ef0 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20 29 3b 0a 20  p==TK_FLOAT );. 
15f00 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
15f10 2d 3e 6f 70 3d 3d 54 4b 5f 4e 55 4c 4c 20 29 3b  ->op==TK_NULL );
15f20 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
15f30 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 53 54 52 49 4e   p->op==TK_STRIN
15f40 47 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20 53 69  G );.      /* Si
15f50 6e 67 6c 65 2d 69 6e 73 74 72 75 63 74 69 6f 6e  ngle-instruction
15f60 20 63 6f 6e 73 74 61 6e 74 73 20 77 69 74 68 20   constants with 
15f70 61 20 66 69 78 65 64 20 64 65 73 74 69 6e 61 74  a fixed destinat
15f80 69 6f 6e 20 61 72 65 0a 20 20 20 20 20 20 2a 2a  ion are.      **
15f90 20 62 65 74 74 65 72 20 64 6f 6e 65 20 69 6e 2d   better done in-
15fa0 6c 69 6e 65 2e 20 20 49 66 20 77 65 20 66 61 63  line.  If we fac
15fb0 74 6f 72 20 74 68 65 6d 2c 20 74 68 65 79 20 77  tor them, they w
15fc0 69 6c 6c 20 6a 75 73 74 20 65 6e 64 0a 20 20 20  ill just end.   
15fd0 20 20 20 2a 2a 20 75 70 20 67 65 6e 65 72 61 74     ** up generat
15fe0 69 6e 67 20 61 6e 20 4f 50 5f 53 43 6f 70 79 20  ing an OP_SCopy 
15ff0 74 6f 20 6d 6f 76 65 20 74 68 65 20 76 61 6c 75  to move the valu
16000 65 20 74 6f 20 74 68 65 20 64 65 73 74 69 6e 61  e to the destina
16010 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 72 65  tion.      ** re
16020 67 69 73 74 65 72 2e 20 2a 2f 0a 20 20 20 20 20  gister. */.     
16030 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
16040 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4d 49  .    case TK_UMI
16050 4e 55 53 3a 20 7b 0a 20 20 20 20 20 20 20 69 66  NUS: {.       if
16060 28 20 70 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d  ( p->pLeft->op==
16070 54 4b 5f 46 4c 4f 41 54 20 7c 7c 20 70 2d 3e 70  TK_FLOAT || p->p
16080 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54  Left->op==TK_INT
16090 45 47 45 52 20 29 7b 0a 20 20 20 20 20 20 20 20  EGER ){.        
160a0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
160b0 20 20 7d 0a 20 20 20 20 20 20 20 62 72 65 61 6b    }.       break
160c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61  ;.    }.    defa
160d0 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 62 72 65  ult: {.      bre
160e0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
160f0 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a  return 1;.}../*.
16100 2a 2a 20 49 66 20 70 45 78 70 72 20 69 73 20 61  ** If pExpr is a
16110 20 63 6f 6e 73 74 61 6e 74 20 65 78 70 72 65 73   constant expres
16120 73 69 6f 6e 20 74 68 61 74 20 69 73 20 61 70 70  sion that is app
16130 72 6f 70 72 69 61 74 65 20 66 6f 72 0a 2a 2a 20  ropriate for.** 
16140 66 61 63 74 6f 72 69 6e 67 20 6f 75 74 20 6f 66  factoring out of
16150 20 61 20 6c 6f 6f 70 2c 20 74 68 65 6e 20 65 76   a loop, then ev
16160 61 6c 75 61 74 65 20 74 68 65 20 65 78 70 72 65  aluate the expre
16170 73 73 69 6f 6e 0a 2a 2a 20 69 6e 74 6f 20 61 20  ssion.** into a 
16180 72 65 67 69 73 74 65 72 20 61 6e 64 20 63 6f 6e  register and con
16190 76 65 72 74 20 74 68 65 20 65 78 70 72 65 73 73  vert the express
161a0 69 6f 6e 20 69 6e 74 6f 20 61 20 54 4b 5f 52 45  ion into a TK_RE
161b0 47 49 53 54 45 52 0a 2a 2a 20 65 78 70 72 65 73  GISTER.** expres
161c0 73 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  sion..*/.static 
161d0 69 6e 74 20 65 76 61 6c 43 6f 6e 73 74 45 78 70  int evalConstExp
161e0 72 28 76 6f 69 64 20 2a 70 41 72 67 2c 20 45 78  r(void *pArg, Ex
161f0 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 50 61  pr *pExpr){.  Pa
16200 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 28 50  rse *pParse = (P
16210 61 72 73 65 2a 29 70 41 72 67 3b 0a 20 20 73 77  arse*)pArg;.  sw
16220 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20  itch( pExpr->op 
16230 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52  ){.    case TK_R
16240 45 47 49 53 54 45 52 3a 20 7b 0a 20 20 20 20 20  EGISTER: {.     
16250 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
16260 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e  .    case TK_FUN
16270 43 54 49 4f 4e 3a 0a 20 20 20 20 63 61 73 65 20  CTION:.    case 
16280 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a  TK_AGG_FUNCTION:
16290 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4e  .    case TK_CON
162a0 53 54 5f 46 55 4e 43 3a 20 7b 0a 20 20 20 20 20  ST_FUNC: {.     
162b0 20 2f 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74   /* The argument
162c0 73 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20  s to a function 
162d0 68 61 76 65 20 61 20 66 69 78 65 64 20 64 65 73  have a fixed des
162e0 74 69 6e 61 74 69 6f 6e 2e 0a 20 20 20 20 20 20  tination..      
162f0 2a 2a 20 4d 61 72 6b 20 74 68 65 6d 20 74 68 69  ** Mark them thi
16300 73 20 77 61 79 20 74 6f 20 61 76 6f 69 64 20 67  s way to avoid g
16310 65 6e 65 72 61 74 65 64 20 75 6e 6e 65 65 64 65  enerated unneede
16320 64 20 4f 50 5f 53 43 6f 70 79 0a 20 20 20 20 20  d OP_SCopy.     
16330 20 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 73   ** instructions
16340 2e 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  . .      */.    
16350 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
16360 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74  t = pExpr->pList
16370 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 69 73  ;.      if( pLis
16380 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  t ){.        int
16390 20 69 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70   i = pList->nExp
163a0 72 3b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63  r;.        struc
163b0 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
163c0 2a 70 49 74 65 6d 20 3d 20 70 4c 69 73 74 2d 3e  *pItem = pList->
163d0 61 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 3b  a;.        for(;
163e0 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 49 74 65 6d   i>0; i--, pItem
163f0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ++){.          i
16400 66 28 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 20  f( pItem->pExpr 
16410 29 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 2d 3e  ) pItem->pExpr->
16420 66 6c 61 67 73 20 7c 3d 20 45 50 5f 46 69 78 65  flags |= EP_Fixe
16430 64 44 65 73 74 3b 0a 20 20 20 20 20 20 20 20 7d  dDest;.        }
16440 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
16450 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
16460 20 20 69 66 28 20 69 73 41 70 70 72 6f 70 72 69    if( isAppropri
16470 61 74 65 46 6f 72 46 61 63 74 6f 72 69 6e 67 28  ateForFactoring(
16480 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 69 6e  pExpr) ){.    in
16490 74 20 72 31 20 3d 20 2b 2b 70 50 61 72 73 65 2d  t r1 = ++pParse-
164a0 3e 6e 4d 65 6d 3b 0a 20 20 20 20 69 6e 74 20 72  >nMem;.    int r
164b0 32 3b 0a 20 20 20 20 72 32 20 3d 20 73 71 6c 69  2;.    r2 = sqli
164c0 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65  te3ExprCodeTarge
164d0 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  t(pParse, pExpr,
164e0 20 72 31 29 3b 0a 20 20 20 20 69 66 28 20 72 31   r1);.    if( r1
164f0 21 3d 72 32 20 29 20 73 71 6c 69 74 65 33 52 65  !=r2 ) sqlite3Re
16500 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
16510 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 70 45  rse, r1);.    pE
16520 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 70  xpr->iColumn = p
16530 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 20 20 70 45  Expr->op;.    pE
16540 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 52 45 47  xpr->op = TK_REG
16550 49 53 54 45 52 3b 0a 20 20 20 20 70 45 78 70 72  ISTER;.    pExpr
16560 2d 3e 69 54 61 62 6c 65 20 3d 20 72 32 3b 0a 20  ->iTable = r2;. 
16570 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
16580 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
16590 2f 2a 0a 2a 2a 20 50 72 65 65 76 61 6c 75 61 74  /*.** Preevaluat
165a0 65 20 63 6f 6e 73 74 61 6e 74 20 73 75 62 65 78  e constant subex
165b0 70 72 65 73 73 69 6f 6e 73 20 77 69 74 68 69 6e  pressions within
165c0 20 70 45 78 70 72 20 61 6e 64 20 73 74 6f 72 65   pExpr and store
165d0 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 73 20   the.** results 
165e0 69 6e 20 72 65 67 69 73 74 65 72 73 2e 20 20 4d  in registers.  M
165f0 6f 64 69 66 79 20 70 45 78 70 72 20 73 6f 20 74  odify pExpr so t
16600 68 61 74 20 74 68 65 20 63 6f 6e 73 74 61 6e 74  hat the constant
16610 20 73 75 62 65 78 70 72 65 73 69 6f 6e 73 0a 2a   subexpresions.*
16620 2a 20 61 72 65 20 54 4b 5f 52 45 47 49 53 54 45  * are TK_REGISTE
16630 52 20 6f 70 63 6f 64 65 73 20 74 68 61 74 20 72  R opcodes that r
16640 65 66 65 72 20 74 6f 20 74 68 65 20 70 72 65 63  efer to the prec
16650 6f 6d 70 75 74 65 64 20 76 61 6c 75 65 73 2e 0a  omputed values..
16660 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
16670 78 70 72 43 6f 64 65 43 6f 6e 73 74 61 6e 74 73  xprCodeConstants
16680 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
16690 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
166a0 20 77 61 6c 6b 45 78 70 72 54 72 65 65 28 70 45   walkExprTree(pE
166b0 78 70 72 2c 20 65 76 61 6c 43 6f 6e 73 74 45 78  xpr, evalConstEx
166c0 70 72 2c 20 70 50 61 72 73 65 29 3b 0a 7d 0a 0a  pr, pParse);.}..
166d0 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
166e0 63 6f 64 65 20 74 68 61 74 20 70 75 73 68 65 73  code that pushes
166f0 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 65 76   the value of ev
16700 65 72 79 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74  ery element of t
16710 68 65 20 67 69 76 65 6e 0a 2a 2a 20 65 78 70 72  he given.** expr
16720 65 73 73 69 6f 6e 20 6c 69 73 74 20 69 6e 74 6f  ession list into
16730 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20 72   a sequence of r
16740 65 67 69 73 74 65 72 73 20 62 65 67 69 6e 6e 69  egisters beginni
16750 6e 67 20 61 74 20 74 61 72 67 65 74 2e 0a 2a 2a  ng at target..**
16760 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
16770 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74  umber of element
16780 73 20 65 76 61 6c 75 61 74 65 64 2e 0a 2a 2f 0a  s evaluated..*/.
16790 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43  int sqlite3ExprC
167a0 6f 64 65 45 78 70 72 4c 69 73 74 28 0a 20 20 50  odeExprList(.  P
167b0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
167c0 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
167d0 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69  text */.  ExprLi
167e0 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 2f 2a 20  st *pList,   /* 
167f0 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  The expression l
16800 69 73 74 20 74 6f 20 62 65 20 63 6f 64 65 64 20  ist to be coded 
16810 2a 2f 0a 20 20 69 6e 74 20 74 61 72 67 65 74 2c  */.  int target,
16820 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65          /* Where
16830 20 74 6f 20 77 72 69 74 65 20 72 65 73 75 6c 74   to write result
16840 73 20 2a 2f 0a 20 20 69 6e 74 20 64 6f 48 61 72  s */.  int doHar
16850 64 43 6f 70 79 20 20 20 20 20 2f 2a 20 43 61 6c  dCopy     /* Cal
16860 6c 20 73 71 6c 69 74 65 33 45 78 70 72 48 61 72  l sqlite3ExprHar
16870 64 43 6f 70 79 20 6f 6e 20 65 61 63 68 20 65 6c  dCopy on each el
16880 65 6d 65 6e 74 20 69 66 20 74 72 75 65 20 2a 2f  ement if true */
16890 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 45 78 70  .){.  struct Exp
168a0 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
168b0 6d 3b 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20  m;.  int i, n;. 
168c0 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d   assert( pList!=
168d0 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d  0 || pParse->db-
168e0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
168f0 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
16900 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
16910 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 74  .  }.  assert( t
16920 61 72 67 65 74 3e 30 20 29 3b 0a 20 20 6e 20 3d  arget>0 );.  n =
16930 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20   pList->nExpr;. 
16940 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74   for(pItem=pList
16950 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 6e 3b 20 69  ->a, i=0; i<n; i
16960 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
16970 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
16980 65 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d  e(pParse, pItem-
16990 3e 70 45 78 70 72 2c 20 74 61 72 67 65 74 2b 69  >pExpr, target+i
169a0 29 3b 0a 20 20 20 20 69 66 28 20 64 6f 48 61 72  );.    if( doHar
169b0 64 43 6f 70 79 20 29 20 73 71 6c 69 74 65 33 45  dCopy ) sqlite3E
169c0 78 70 72 48 61 72 64 43 6f 70 79 28 70 50 61 72  xprHardCopy(pPar
169d0 73 65 2c 20 74 61 72 67 65 74 2c 20 6e 29 3b 0a  se, target, n);.
169e0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a    }.  return n;.
169f0 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
16a00 65 20 63 6f 64 65 20 66 6f 72 20 61 20 62 6f 6f  e code for a boo
16a10 6c 65 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  lean expression 
16a20 73 75 63 68 20 74 68 61 74 20 61 20 6a 75 6d 70  such that a jump
16a30 20 69 73 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 74   is made.** to t
16a40 68 65 20 6c 61 62 65 6c 20 22 64 65 73 74 22 20  he label "dest" 
16a50 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
16a60 6e 20 69 73 20 74 72 75 65 20 62 75 74 20 65 78  n is true but ex
16a70 65 63 75 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74 69  ecution.** conti
16a80 6e 75 65 73 20 73 74 72 61 69 67 68 74 20 74 68  nues straight th
16a90 72 75 20 69 66 20 74 68 65 20 65 78 70 72 65 73  ru if the expres
16aa0 73 69 6f 6e 20 69 73 20 66 61 6c 73 65 2e 0a 2a  sion is false..*
16ab0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72  *.** If the expr
16ac0 65 73 73 69 6f 6e 20 65 76 61 6c 75 61 74 65 73  ession evaluates
16ad0 20 74 6f 20 4e 55 4c 4c 20 28 6e 65 69 74 68 65   to NULL (neithe
16ae0 72 20 74 72 75 65 20 6e 6f 72 20 66 61 6c 73 65  r true nor false
16af0 29 2c 20 74 68 65 6e 0a 2a 2a 20 74 61 6b 65 20  ), then.** take 
16b00 74 68 65 20 6a 75 6d 70 20 69 66 20 74 68 65 20  the jump if the 
16b10 6a 75 6d 70 49 66 4e 75 6c 6c 20 66 6c 61 67 20  jumpIfNull flag 
16b20 69 73 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46  is SQLITE_JUMPIF
16b30 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  NULL..**.** This
16b40 20 63 6f 64 65 20 64 65 70 65 6e 64 73 20 6f 6e   code depends on
16b50 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20 63   the fact that c
16b60 65 72 74 61 69 6e 20 74 6f 6b 65 6e 20 76 61 6c  ertain token val
16b70 75 65 73 20 28 65 78 3a 20 54 4b 5f 45 51 29 0a  ues (ex: TK_EQ).
16b80 2a 2a 20 61 72 65 20 74 68 65 20 73 61 6d 65 20  ** are the same 
16b90 61 73 20 6f 70 63 6f 64 65 20 76 61 6c 75 65 73  as opcode values
16ba0 20 28 65 78 3a 20 4f 50 5f 45 71 29 20 74 68 61   (ex: OP_Eq) tha
16bb0 74 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20  t implement the 
16bc0 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a  corresponding.**
16bd0 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 53 70 65   operation.  Spe
16be0 63 69 61 6c 20 63 6f 6d 6d 65 6e 74 73 20 69 6e  cial comments in
16bf0 20 76 64 62 65 2e 63 20 61 6e 64 20 74 68 65 20   vdbe.c and the 
16c00 6d 6b 6f 70 63 6f 64 65 68 2e 61 77 6b 20 73 63  mkopcodeh.awk sc
16c10 72 69 70 74 20 69 6e 0a 2a 2a 20 74 68 65 20 6d  ript in.** the m
16c20 61 6b 65 20 70 72 6f 63 65 73 73 20 63 61 75 73  ake process caus
16c30 65 20 74 68 65 73 65 20 76 61 6c 75 65 73 20 74  e these values t
16c40 6f 20 61 6c 69 67 6e 2e 20 20 41 73 73 65 72 74  o align.  Assert
16c50 28 29 73 20 69 6e 20 74 68 65 20 63 6f 64 65 0a  ()s in the code.
16c60 2a 2a 20 62 65 6c 6f 77 20 76 65 72 69 66 79 20  ** below verify 
16c70 74 68 61 74 20 74 68 65 20 6e 75 6d 62 65 72 73  that the numbers
16c80 20 61 72 65 20 61 6c 69 67 6e 65 64 20 63 6f 72   are aligned cor
16c90 72 65 63 74 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20  rectly..*/.void 
16ca0 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75  sqlite3ExprIfTru
16cb0 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
16cc0 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e   Expr *pExpr, in
16cd0 74 20 64 65 73 74 2c 20 69 6e 74 20 6a 75 6d 70  t dest, int jump
16ce0 49 66 4e 75 6c 6c 29 7b 0a 20 20 56 64 62 65 20  IfNull){.  Vdbe 
16cf0 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
16d00 62 65 3b 0a 20 20 69 6e 74 20 6f 70 20 3d 20 30  be;.  int op = 0
16d10 3b 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65 31  ;.  int regFree1
16d20 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 67 46   = 0;.  int regF
16d30 72 65 65 32 20 3d 20 30 3b 0a 20 20 69 6e 74 20  ree2 = 0;.  int 
16d40 72 31 2c 20 72 32 3b 0a 0a 20 20 61 73 73 65 72  r1, r2;..  asser
16d50 74 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53  t( jumpIfNull==S
16d60 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
16d70 20 7c 7c 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d   || jumpIfNull==
16d80 30 20 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20  0 );.  if( v==0 
16d90 7c 7c 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65  || pExpr==0 ) re
16da0 74 75 72 6e 3b 0a 20 20 6f 70 20 3d 20 70 45 78  turn;.  op = pEx
16db0 70 72 2d 3e 6f 70 3b 0a 20 20 73 77 69 74 63 68  pr->op;.  switch
16dc0 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ( op ){.    case
16dd0 20 54 4b 5f 41 4e 44 3a 20 7b 0a 20 20 20 20 20   TK_AND: {.     
16de0 20 69 6e 74 20 64 32 20 3d 20 73 71 6c 69 74 65   int d2 = sqlite
16df0 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
16e00 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
16e10 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  e( jumpIfNull==0
16e20 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
16e30 73 65 28 20 70 50 61 72 73 65 2d 3e 64 69 73 61  se( pParse->disa
16e40 62 6c 65 43 6f 6c 43 61 63 68 65 3d 3d 30 20 29  bleColCache==0 )
16e50 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
16e60 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
16e70 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
16e80 20 64 32 2c 6a 75 6d 70 49 66 4e 75 6c 6c 5e 53   d2,jumpIfNull^S
16e90 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
16ea0 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  );.      pParse-
16eb0 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61 63 68 65  >disableColCache
16ec0 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ++;.      sqlite
16ed0 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72  3ExprIfTrue(pPar
16ee0 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
16ef0 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  t, dest, jumpIfN
16f00 75 6c 6c 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ull);.      asse
16f10 72 74 28 20 70 50 61 72 73 65 2d 3e 64 69 73 61  rt( pParse->disa
16f20 62 6c 65 43 6f 6c 43 61 63 68 65 3e 30 20 29 3b  bleColCache>0 );
16f30 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64  .      pParse->d
16f40 69 73 61 62 6c 65 43 6f 6c 43 61 63 68 65 2d 2d  isableColCache--
16f50 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
16f60 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
16f70 76 2c 20 64 32 29 3b 0a 20 20 20 20 20 20 62 72  v, d2);.      br
16f80 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
16f90 61 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20  ase TK_OR: {.   
16fa0 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d     testcase( jum
16fb0 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
16fc0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 50      testcase( pP
16fd0 61 72 73 65 2d 3e 64 69 73 61 62 6c 65 43 6f 6c  arse->disableCol
16fe0 43 61 63 68 65 3d 3d 30 20 29 3b 0a 20 20 20 20  Cache==0 );.    
16ff0 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54    sqlite3ExprIfT
17000 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  rue(pParse, pExp
17010 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20  r->pLeft, dest, 
17020 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
17030 20 20 20 70 50 61 72 73 65 2d 3e 64 69 73 61 62     pParse->disab
17040 6c 65 43 6f 6c 43 61 63 68 65 2b 2b 3b 0a 20 20  leColCache++;.  
17050 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
17060 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45  fTrue(pParse, pE
17070 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73  xpr->pRight, des
17080 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
17090 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
170a0 61 72 73 65 2d 3e 64 69 73 61 62 6c 65 43 6f 6c  arse->disableCol
170b0 43 61 63 68 65 3e 30 20 29 3b 0a 20 20 20 20 20  Cache>0 );.     
170c0 20 70 50 61 72 73 65 2d 3e 64 69 73 61 62 6c 65   pParse->disable
170d0 43 6f 6c 43 61 63 68 65 2d 2d 3b 0a 20 20 20 20  ColCache--;.    
170e0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
170f0 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20     case TK_NOT: 
17100 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
17110 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  ( jumpIfNull==0 
17120 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
17130 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
17140 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
17150 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
17160 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ll);.      break
17170 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
17180 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65   TK_LT:.    case
17190 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65   TK_LE:.    case
171a0 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65   TK_GT:.    case
171b0 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65   TK_GE:.    case
171c0 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65   TK_NE:.    case
171d0 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20   TK_EQ: {.      
171e0 61 73 73 65 72 74 28 20 54 4b 5f 4c 54 3d 3d 4f  assert( TK_LT==O
171f0 50 5f 4c 74 20 29 3b 0a 20 20 20 20 20 20 61 73  P_Lt );.      as
17200 73 65 72 74 28 20 54 4b 5f 4c 45 3d 3d 4f 50 5f  sert( TK_LE==OP_
17210 4c 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  Le );.      asse
17220 72 74 28 20 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74  rt( TK_GT==OP_Gt
17230 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
17240 28 20 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65 20 29  ( TK_GE==OP_Ge )
17250 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
17260 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71 20 29 3b 0a  TK_EQ==OP_Eq );.
17270 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
17280 5f 4e 45 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20  _NE==OP_Ne );.  
17290 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
172a0 3d 3d 54 4b 5f 4c 54 20 29 3b 0a 20 20 20 20 20  ==TK_LT );.     
172b0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
172c0 4b 5f 4c 45 20 29 3b 0a 20 20 20 20 20 20 74 65  K_LE );.      te
172d0 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 47  stcase( op==TK_G
172e0 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  T );.      testc
172f0 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 47 45 20 29  ase( op==TK_GE )
17300 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
17310 28 20 6f 70 3d 3d 54 4b 5f 45 51 20 29 3b 0a 20  ( op==TK_EQ );. 
17320 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
17330 70 3d 3d 54 4b 5f 4e 45 20 29 3b 0a 20 20 20 20  p==TK_NE );.    
17340 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
17350 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  IfNull==0 );.   
17360 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 4f 70     codeCompareOp
17370 65 72 61 6e 64 73 28 70 50 61 72 73 65 2c 20 70  erands(pParse, p
17380 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 31  Expr->pLeft, &r1
17390 2c 20 26 72 65 67 46 72 65 65 31 2c 0a 20 20 20  , &regFree1,.   
173a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
173b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
173c0 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72  Expr->pRight, &r
173d0 32 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20  2, &regFree2);. 
173e0 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65       codeCompare
173f0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
17400 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52  pLeft, pExpr->pR
17410 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20  ight, op,.      
17420 20 20 20 20 20 20 20 20 20 20 20 20 72 31 2c 20              r1, 
17430 72 32 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  r2, dest, jumpIf
17440 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 74 65 73  Null);.      tes
17450 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
17460 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  =0 );.      test
17470 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d  case( regFree2==
17480 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
17490 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
174a0 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20   TK_ISNULL:.    
174b0 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a  case TK_NOTNULL:
174c0 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
174d0 20 54 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f 50 5f 49   TK_ISNULL==OP_I
174e0 73 4e 75 6c 6c 20 29 3b 0a 20 20 20 20 20 20 61  sNull );.      a
174f0 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54 4e 55 4c  ssert( TK_NOTNUL
17500 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b  L==OP_NotNull );
17510 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
17520 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29   op==TK_ISNULL )
17530 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
17540 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c  ( op==TK_NOTNULL
17550 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73   );.      r1 = s
17560 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
17570 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
17580 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65  ->pLeft, &regFre
17590 65 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  e1);.      sqlit
175a0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
175b0 6f 70 2c 20 72 31 2c 20 64 65 73 74 29 3b 0a 20  op, r1, dest);. 
175c0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
175d0 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
175e0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
175f0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54  .    case TK_BET
17600 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  WEEN: {.      /*
17610 20 20 20 20 78 20 42 45 54 57 45 45 4e 20 79 20      x BETWEEN y 
17620 41 4e 44 20 7a 0a 20 20 20 20 20 20 2a 2a 0a 20  AND z.      **. 
17630 20 20 20 20 20 2a 2a 20 49 73 20 65 71 75 69 76       ** Is equiv
17640 61 6c 65 6e 74 20 74 6f 20 0a 20 20 20 20 20 20  alent to .      
17650 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 78  **.      **    x
17660 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 0a 20 20 20  >=y AND x<=z.   
17670 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 43     **.      ** C
17680 6f 64 65 20 69 74 20 61 73 20 73 75 63 68 2c 20  ode it as such, 
17690 74 61 6b 69 6e 67 20 63 61 72 65 20 74 6f 20 64  taking care to d
176a0 6f 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 73 75 62  o the common sub
176b0 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 20 20 20  expression.     
176c0 20 2a 2a 20 65 6c 65 6d 65 6e 74 61 74 69 6f 6e   ** elementation
176d0 20 6f 66 20 78 2e 0a 20 20 20 20 20 20 2a 2f 0a   of x..      */.
176e0 20 20 20 20 20 20 45 78 70 72 20 65 78 70 72 41        Expr exprA
176f0 6e 64 3b 0a 20 20 20 20 20 20 45 78 70 72 20 63  nd;.      Expr c
17700 6f 6d 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 45  ompLeft;.      E
17710 78 70 72 20 63 6f 6d 70 52 69 67 68 74 3b 0a 20  xpr compRight;. 
17720 20 20 20 20 20 45 78 70 72 20 65 78 70 72 58 3b       Expr exprX;
17730 0a 0a 20 20 20 20 20 20 65 78 70 72 58 20 3d 20  ..      exprX = 
17740 2a 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20  *pExpr->pLeft;. 
17750 20 20 20 20 20 65 78 70 72 41 6e 64 2e 6f 70 20       exprAnd.op 
17760 3d 20 54 4b 5f 41 4e 44 3b 0a 20 20 20 20 20 20  = TK_AND;.      
17770 65 78 70 72 41 6e 64 2e 70 4c 65 66 74 20 3d 20  exprAnd.pLeft = 
17780 26 63 6f 6d 70 4c 65 66 74 3b 0a 20 20 20 20 20  &compLeft;.     
17790 20 65 78 70 72 41 6e 64 2e 70 52 69 67 68 74 20   exprAnd.pRight 
177a0 3d 20 26 63 6f 6d 70 52 69 67 68 74 3b 0a 20 20  = &compRight;.  
177b0 20 20 20 20 63 6f 6d 70 4c 65 66 74 2e 6f 70 20      compLeft.op 
177c0 3d 20 54 4b 5f 47 45 3b 0a 20 20 20 20 20 20 63  = TK_GE;.      c
177d0 6f 6d 70 4c 65 66 74 2e 70 4c 65 66 74 20 3d 20  ompLeft.pLeft = 
177e0 26 65 78 70 72 58 3b 0a 20 20 20 20 20 20 63 6f  &exprX;.      co
177f0 6d 70 4c 65 66 74 2e 70 52 69 67 68 74 20 3d 20  mpLeft.pRight = 
17800 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b  pExpr->pList->a[
17810 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  0].pExpr;.      
17820 63 6f 6d 70 52 69 67 68 74 2e 6f 70 20 3d 20 54  compRight.op = T
17830 4b 5f 4c 45 3b 0a 20 20 20 20 20 20 63 6f 6d 70  K_LE;.      comp
17840 52 69 67 68 74 2e 70 4c 65 66 74 20 3d 20 26 65  Right.pLeft = &e
17850 78 70 72 58 3b 0a 20 20 20 20 20 20 63 6f 6d 70  xprX;.      comp
17860 52 69 67 68 74 2e 70 52 69 67 68 74 20 3d 20 70  Right.pRight = p
17870 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 31  Expr->pList->a[1
17880 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 65  ].pExpr;.      e
17890 78 70 72 58 2e 69 54 61 62 6c 65 20 3d 20 73 71  xprX.iTable = sq
178a0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
178b0 70 28 70 50 61 72 73 65 2c 20 26 65 78 70 72 58  p(pParse, &exprX
178c0 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20  , &regFree1);.  
178d0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
178e0 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20  gFree1==0 );.   
178f0 20 20 20 65 78 70 72 58 2e 6f 70 20 3d 20 54 4b     exprX.op = TK
17900 5f 52 45 47 49 53 54 45 52 3b 0a 20 20 20 20 20  _REGISTER;.     
17910 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
17920 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  fNull==0 );.    
17930 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54    sqlite3ExprIfT
17940 72 75 65 28 70 50 61 72 73 65 2c 20 26 65 78 70  rue(pParse, &exp
17950 72 41 6e 64 2c 20 64 65 73 74 2c 20 6a 75 6d 70  rAnd, dest, jump
17960 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62  IfNull);.      b
17970 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
17980 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
17990 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r1 = sqlite3Exp
179a0 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
179b0 2c 20 70 45 78 70 72 2c 20 26 72 65 67 46 72 65  , pExpr, &regFre
179c0 65 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  e1);.      sqlit
179d0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
179e0 4f 50 5f 49 66 2c 20 72 31 2c 20 64 65 73 74 2c  OP_If, r1, dest,
179f0 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 29 3b   jumpIfNull!=0);
17a00 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
17a10 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
17a20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
17a30 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
17a40 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
17a50 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
17a60 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
17a70 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 31  pParse, regFree1
17a80 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65  );.  sqlite3Rele
17a90 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
17aa0 65 2c 20 72 65 67 46 72 65 65 32 29 3b 20 20 0a  e, regFree2);  .
17ab0 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
17ac0 65 20 63 6f 64 65 20 66 6f 72 20 61 20 62 6f 6f  e code for a boo
17ad0 6c 65 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  lean expression 
17ae0 73 75 63 68 20 74 68 61 74 20 61 20 6a 75 6d 70  such that a jump
17af0 20 69 73 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 74   is made.** to t
17b00 68 65 20 6c 61 62 65 6c 20 22 64 65 73 74 22 20  he label "dest" 
17b10 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
17b20 6e 20 69 73 20 66 61 6c 73 65 20 62 75 74 20 65  n is false but e
17b30 78 65 63 75 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74  xecution.** cont
17b40 69 6e 75 65 73 20 73 74 72 61 69 67 68 74 20 74  inues straight t
17b50 68 72 75 20 69 66 20 74 68 65 20 65 78 70 72 65  hru if the expre
17b60 73 73 69 6f 6e 20 69 73 20 74 72 75 65 2e 0a 2a  ssion is true..*
17b70 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72  *.** If the expr
17b80 65 73 73 69 6f 6e 20 65 76 61 6c 75 61 74 65 73  ession evaluates
17b90 20 74 6f 20 4e 55 4c 4c 20 28 6e 65 69 74 68 65   to NULL (neithe
17ba0 72 20 74 72 75 65 20 6e 6f 72 20 66 61 6c 73 65  r true nor false
17bb0 29 20 74 68 65 6e 0a 2a 2a 20 6a 75 6d 70 20 69  ) then.** jump i
17bc0 66 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 69 73 20  f jumpIfNull is 
17bd0 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
17be0 4c 20 6f 72 20 66 61 6c 6c 20 74 68 72 6f 75 67  L or fall throug
17bf0 68 20 69 66 20 6a 75 6d 70 49 66 4e 75 6c 6c 0a  h if jumpIfNull.
17c00 2a 2a 20 69 73 20 30 2e 0a 2a 2f 0a 76 6f 69 64  ** is 0..*/.void
17c10 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
17c20 6c 73 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  lse(Parse *pPars
17c30 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  e, Expr *pExpr, 
17c40 69 6e 74 20 64 65 73 74 2c 20 69 6e 74 20 6a 75  int dest, int ju
17c50 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 56 64 62  mpIfNull){.  Vdb
17c60 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
17c70 56 64 62 65 3b 0a 20 20 69 6e 74 20 6f 70 20 3d  Vdbe;.  int op =
17c80 20 30 3b 0a 20 20 69 6e 74 20 72 65 67 46 72 65   0;.  int regFre
17c90 65 31 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65  e1 = 0;.  int re
17ca0 67 46 72 65 65 32 20 3d 20 30 3b 0a 20 20 69 6e  gFree2 = 0;.  in
17cb0 74 20 72 31 2c 20 72 32 3b 0a 0a 20 20 61 73 73  t r1, r2;..  ass
17cc0 65 72 74 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  ert( jumpIfNull=
17cd0 3d 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55  =SQLITE_JUMPIFNU
17ce0 4c 4c 20 7c 7c 20 6a 75 6d 70 49 66 4e 75 6c 6c  LL || jumpIfNull
17cf0 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 76 3d 3d  ==0 );.  if( v==
17d00 30 20 7c 7c 20 70 45 78 70 72 3d 3d 30 20 29 20  0 || pExpr==0 ) 
17d10 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 54 68  return;..  /* Th
17d20 65 20 76 61 6c 75 65 20 6f 66 20 70 45 78 70 72  e value of pExpr
17d30 2d 3e 6f 70 20 61 6e 64 20 6f 70 20 61 72 65 20  ->op and op are 
17d40 72 65 6c 61 74 65 64 20 61 73 20 66 6f 6c 6c 6f  related as follo
17d50 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ws:.  **.  **   
17d60 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 20 20      pExpr->op   
17d70 20 20 20 20 20 20 20 20 20 6f 70 0a 20 20 2a 2a           op.  **
17d80 20 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d         ---------
17d90 20 20 20 20 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d            ------
17da0 2d 2d 2d 2d 0a 20 20 2a 2a 20 20 20 20 20 20 20  ----.  **       
17db0 54 4b 5f 49 53 4e 55 4c 4c 20 20 20 20 20 20 20  TK_ISNULL       
17dc0 20 20 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 0a 20 20     OP_NotNull.  
17dd0 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4e 4f 54 4e  **       TK_NOTN
17de0 55 4c 4c 20 20 20 20 20 20 20 20 20 4f 50 5f 49  ULL         OP_I
17df0 73 4e 75 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 20  sNull.  **      
17e00 20 54 4b 5f 4e 45 20 20 20 20 20 20 20 20 20 20   TK_NE          
17e10 20 20 20 20 4f 50 5f 45 71 0a 20 20 2a 2a 20 20      OP_Eq.  **  
17e20 20 20 20 20 20 54 4b 5f 45 51 20 20 20 20 20 20       TK_EQ      
17e30 20 20 20 20 20 20 20 20 4f 50 5f 4e 65 0a 20 20          OP_Ne.  
17e40 2a 2a 20 20 20 20 20 20 20 54 4b 5f 47 54 20 20  **       TK_GT  
17e50 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4c              OP_L
17e60 65 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f  e.  **       TK_
17e70 4c 45 20 20 20 20 20 20 20 20 20 20 20 20 20 20  LE              
17e80 4f 50 5f 47 74 0a 20 20 2a 2a 20 20 20 20 20 20  OP_Gt.  **      
17e90 20 54 4b 5f 47 45 20 20 20 20 20 20 20 20 20 20   TK_GE          
17ea0 20 20 20 20 4f 50 5f 4c 74 0a 20 20 2a 2a 20 20      OP_Lt.  **  
17eb0 20 20 20 20 20 54 4b 5f 4c 54 20 20 20 20 20 20       TK_LT      
17ec0 20 20 20 20 20 20 20 20 4f 50 5f 47 65 0a 20 20          OP_Ge.  
17ed0 2a 2a 0a 20 20 2a 2a 20 46 6f 72 20 6f 74 68 65  **.  ** For othe
17ee0 72 20 76 61 6c 75 65 73 20 6f 66 20 70 45 78 70  r values of pExp
17ef0 72 2d 3e 6f 70 2c 20 6f 70 20 69 73 20 75 6e 64  r->op, op is und
17f00 65 66 69 6e 65 64 20 61 6e 64 20 75 6e 75 73 65  efined and unuse
17f10 64 2e 0a 20 20 2a 2a 20 54 68 65 20 76 61 6c 75  d..  ** The valu
17f20 65 20 6f 66 20 54 4b 5f 20 61 6e 64 20 4f 50 5f  e of TK_ and OP_
17f30 20 63 6f 6e 73 74 61 6e 74 73 20 61 72 65 20 61   constants are a
17f40 72 72 61 6e 67 65 64 20 73 75 63 68 20 74 68 61  rranged such tha
17f50 74 20 77 65 0a 20 20 2a 2a 20 63 61 6e 20 63 6f  t we.  ** can co
17f60 6d 70 75 74 65 20 74 68 65 20 6d 61 70 70 69 6e  mpute the mappin
17f70 67 20 61 62 6f 76 65 20 75 73 69 6e 67 20 74 68  g above using th
17f80 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 78 70 72  e following expr
17f90 65 73 73 69 6f 6e 2e 0a 20 20 2a 2a 20 41 73 73  ession..  ** Ass
17fa0 65 72 74 28 29 73 20 76 65 72 69 66 79 20 74 68  ert()s verify th
17fb0 61 74 20 74 68 65 20 63 6f 6d 70 75 74 61 74 69  at the computati
17fc0 6f 6e 20 69 73 20 63 6f 72 72 65 63 74 2e 0a 20  on is correct.. 
17fd0 20 2a 2f 0a 20 20 6f 70 20 3d 20 28 28 70 45 78   */.  op = ((pEx
17fe0 70 72 2d 3e 6f 70 2b 28 54 4b 5f 49 53 4e 55 4c  pr->op+(TK_ISNUL
17ff0 4c 26 31 29 29 5e 31 29 2d 28 54 4b 5f 49 53 4e  L&1))^1)-(TK_ISN
18000 55 4c 4c 26 31 29 3b 0a 0a 20 20 2f 2a 20 56 65  ULL&1);..  /* Ve
18010 72 69 66 79 20 63 6f 72 72 65 63 74 20 61 6c 69  rify correct ali
18020 67 6e 6d 65 6e 74 20 6f 66 20 54 4b 5f 20 61 6e  gnment of TK_ an
18030 64 20 4f 50 5f 20 63 6f 6e 73 74 61 6e 74 73 0a  d OP_ constants.
18040 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
18050 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 49 53 4e  Expr->op!=TK_ISN
18060 55 4c 4c 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4e 6f  ULL || op==OP_No
18070 74 4e 75 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72  tNull );.  asser
18080 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  t( pExpr->op!=TK
18090 5f 4e 4f 54 4e 55 4c 4c 20 7c 7c 20 6f 70 3d 3d  _NOTNULL || op==
180a0 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 0a 20 20 61  OP_IsNull );.  a
180b0 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
180c0 21 3d 54 4b 5f 4e 45 20 7c 7c 20 6f 70 3d 3d 4f  !=TK_NE || op==O
180d0 50 5f 45 71 20 29 3b 0a 20 20 61 73 73 65 72 74  P_Eq );.  assert
180e0 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
180f0 45 51 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4e 65 20  EQ || op==OP_Ne 
18100 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
18110 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4c 54 20 7c 7c  pr->op!=TK_LT ||
18120 20 6f 70 3d 3d 4f 50 5f 47 65 20 29 3b 0a 20 20   op==OP_Ge );.  
18130 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
18140 70 21 3d 54 4b 5f 4c 45 20 7c 7c 20 6f 70 3d 3d  p!=TK_LE || op==
18150 4f 50 5f 47 74 20 29 3b 0a 20 20 61 73 73 65 72  OP_Gt );.  asser
18160 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  t( pExpr->op!=TK
18170 5f 47 54 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c 65  _GT || op==OP_Le
18180 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
18190 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 47 45 20 7c  xpr->op!=TK_GE |
181a0 7c 20 6f 70 3d 3d 4f 50 5f 4c 74 20 29 3b 0a 0a  | op==OP_Lt );..
181b0 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d    switch( pExpr-
181c0 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20  >op ){.    case 
181d0 54 4b 5f 41 4e 44 3a 20 7b 0a 20 20 20 20 20 20  TK_AND: {.      
181e0 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
181f0 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Null==0 );.     
18200 20 74 65 73 74 63 61 73 65 28 20 70 50 61 72 73   testcase( pPars
18210 65 2d 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61 63  e->disableColCac
18220 68 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73  he==0 );.      s
18230 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
18240 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
18250 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75  >pLeft, dest, ju
18260 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
18270 20 70 50 61 72 73 65 2d 3e 64 69 73 61 62 6c 65   pParse->disable
18280 43 6f 6c 43 61 63 68 65 2b 2b 3b 0a 20 20 20 20  ColCache++;.    
18290 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
182a0 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 78  alse(pParse, pEx
182b0 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74  pr->pRight, dest
182c0 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
182d0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
182e0 72 73 65 2d 3e 64 69 73 61 62 6c 65 43 6f 6c 43  rse->disableColC
182f0 61 63 68 65 3e 30 20 29 3b 0a 20 20 20 20 20 20  ache>0 );.      
18300 70 50 61 72 73 65 2d 3e 64 69 73 61 62 6c 65 43  pParse->disableC
18310 6f 6c 43 61 63 68 65 2d 2d 3b 0a 20 20 20 20 20  olCache--;.     
18320 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
18330 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a    case TK_OR: {.
18340 20 20 20 20 20 20 69 6e 74 20 64 32 20 3d 20 73        int d2 = s
18350 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
18360 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 74 65  bel(v);.      te
18370 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75  stcase( jumpIfNu
18380 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74  ll==0 );.      t
18390 65 73 74 63 61 73 65 28 20 70 50 61 72 73 65 2d  estcase( pParse-
183a0 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61 63 68 65  >disableColCache
183b0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ==0 );.      sql
183c0 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70  ite3ExprIfTrue(p
183d0 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
183e0 65 66 74 2c 20 64 32 2c 20 6a 75 6d 70 49 66 4e  eft, d2, jumpIfN
183f0 75 6c 6c 5e 53 51 4c 49 54 45 5f 4a 55 4d 50 49  ull^SQLITE_JUMPI
18400 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 70 50  FNULL);.      pP
18410 61 72 73 65 2d 3e 64 69 73 61 62 6c 65 43 6f 6c  arse->disableCol
18420 43 61 63 68 65 2b 2b 3b 0a 20 20 20 20 20 20 73  Cache++;.      s
18430 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
18440 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
18450 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a  >pRight, dest, j
18460 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
18470 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
18480 2d 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61 63 68  ->disableColCach
18490 65 3e 30 20 29 3b 0a 20 20 20 20 20 20 70 50 61  e>0 );.      pPa
184a0 72 73 65 2d 3e 64 69 73 61 62 6c 65 43 6f 6c 43  rse->disableColC
184b0 61 63 68 65 2d 2d 3b 0a 20 20 20 20 20 20 73 71  ache--;.      sq
184c0 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
184d0 4c 61 62 65 6c 28 76 2c 20 64 32 29 3b 0a 20 20  Label(v, d2);.  
184e0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
184f0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54  .    case TK_NOT
18500 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
18510 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72  3ExprIfTrue(pPar
18520 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
18530 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
18540 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ll);.      break
18550 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
18560 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65   TK_LT:.    case
18570 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65   TK_LE:.    case
18580 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65   TK_GT:.    case
18590 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65   TK_GE:.    case
185a0 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65   TK_NE:.    case
185b0 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20   TK_EQ: {.      
185c0 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
185d0 5f 4c 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _LT );.      tes
185e0 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c 45  tcase( op==TK_LE
185f0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
18600 73 65 28 20 6f 70 3d 3d 54 4b 5f 47 54 20 29 3b  se( op==TK_GT );
18610 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
18620 20 6f 70 3d 3d 54 4b 5f 47 45 20 29 3b 0a 20 20   op==TK_GE );.  
18630 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
18640 3d 3d 54 4b 5f 45 51 20 29 3b 0a 20 20 20 20 20  ==TK_EQ );.     
18650 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
18660 4b 5f 4e 45 20 29 3b 0a 20 20 20 20 20 20 74 65  K_NE );.      te
18670 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75  stcase( jumpIfNu
18680 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 63  ll==0 );.      c
18690 6f 64 65 43 6f 6d 70 61 72 65 4f 70 65 72 61 6e  odeCompareOperan
186a0 64 73 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ds(pParse, pExpr
186b0 2d 3e 70 4c 65 66 74 2c 20 26 72 31 2c 20 26 72  ->pLeft, &r1, &r
186c0 65 67 46 72 65 65 31 2c 0a 20 20 20 20 20 20 20  egFree1,.       
186d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
186e0 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
186f0 2d 3e 70 52 69 67 68 74 2c 20 26 72 32 2c 20 26  ->pRight, &r2, &
18700 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20  regFree2);.     
18710 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61   codeCompare(pPa
18720 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
18730 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  t, pExpr->pRight
18740 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20  , op,.          
18750 20 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c 20          r1, r2, 
18760 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
18770 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
18780 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  e( regFree1==0 )
18790 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
187a0 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b  ( regFree2==0 );
187b0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
187c0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
187d0 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65  ISNULL:.    case
187e0 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20   TK_NOTNULL: {. 
187f0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
18800 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b 0a  p==TK_ISNULL );.
18810 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
18820 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29  op==TK_NOTNULL )
18830 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  ;.      r1 = sql
18840 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
18850 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
18860 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31  pLeft, &regFree1
18870 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
18880 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 6f 70  VdbeAddOp2(v, op
18890 2c 20 72 31 2c 20 64 65 73 74 29 3b 0a 20 20 20  , r1, dest);.   
188a0 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
188b0 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
188c0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
188d0 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45     case TK_BETWE
188e0 45 4e 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 20  EN: {.      /*  
188f0 20 20 78 20 42 45 54 57 45 45 4e 20 79 20 41 4e    x BETWEEN y AN
18900 44 20 7a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  D z.      **.   
18910 20 20 20 2a 2a 20 49 73 20 65 71 75 69 76 61 6c     ** Is equival
18920 65 6e 74 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a  ent to .      **
18930 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 78 3e 3d  .      **    x>=
18940 79 20 41 4e 44 20 78 3c 3d 7a 0a 20 20 20 20 20  y AND x<=z.     
18950 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 43 6f 64   **.      ** Cod
18960 65 20 69 74 20 61 73 20 73 75 63 68 2c 20 74 61  e it as such, ta
18970 6b 69 6e 67 20 63 61 72 65 20 74 6f 20 64 6f 20  king care to do 
18980 74 68 65 20 63 6f 6d 6d 6f 6e 20 73 75 62 65 78  the common subex
18990 70 72 65 73 73 69 6f 6e 0a 20 20 20 20 20 20 2a  pression.      *
189a0 2a 20 65 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  * elementation o
189b0 66 20 78 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  f x..      */.  
189c0 20 20 20 20 45 78 70 72 20 65 78 70 72 41 6e 64      Expr exprAnd
189d0 3b 0a 20 20 20 20 20 20 45 78 70 72 20 63 6f 6d  ;.      Expr com
189e0 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 45 78 70  pLeft;.      Exp
189f0 72 20 63 6f 6d 70 52 69 67 68 74 3b 0a 20 20 20  r compRight;.   
18a00 20 20 20 45 78 70 72 20 65 78 70 72 58 3b 0a 0a     Expr exprX;..
18a10 20 20 20 20 20 20 65 78 70 72 58 20 3d 20 2a 70        exprX = *p
18a20 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20  Expr->pLeft;.   
18a30 20 20 20 65 78 70 72 41 6e 64 2e 6f 70 20 3d 20     exprAnd.op = 
18a40 54 4b 5f 41 4e 44 3b 0a 20 20 20 20 20 20 65 78  TK_AND;.      ex
18a50 70 72 41 6e 64 2e 70 4c 65 66 74 20 3d 20 26 63  prAnd.pLeft = &c
18a60 6f 6d 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 65  ompLeft;.      e
18a70 78 70 72 41 6e 64 2e 70 52 69 67 68 74 20 3d 20  xprAnd.pRight = 
18a80 26 63 6f 6d 70 52 69 67 68 74 3b 0a 20 20 20 20  &compRight;.    
18a90 20 20 63 6f 6d 70 4c 65 66 74 2e 6f 70 20 3d 20    compLeft.op = 
18aa0 54 4b 5f 47 45 3b 0a 20 20 20 20 20 20 63 6f 6d  TK_GE;.      com
18ab0 70 4c 65 66 74 2e 70 4c 65 66 74 20 3d 20 26 65  pLeft.pLeft = &e
18ac0 78 70 72 58 3b 0a 20 20 20 20 20 20 63 6f 6d 70  xprX;.      comp
18ad0 4c 65 66 74 2e 70 52 69 67 68 74 20 3d 20 70 45  Left.pRight = pE
18ae0 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d  xpr->pList->a[0]
18af0 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 63 6f  .pExpr;.      co
18b00 6d 70 52 69 67 68 74 2e 6f 70 20 3d 20 54 4b 5f  mpRight.op = TK_
18b10 4c 45 3b 0a 20 20 20 20 20 20 63 6f 6d 70 52 69  LE;.      compRi
18b20 67 68 74 2e 70 4c 65 66 74 20 3d 20 26 65 78 70  ght.pLeft = &exp
18b30 72 58 3b 0a 20 20 20 20 20 20 63 6f 6d 70 52 69  rX;.      compRi
18b40 67 68 74 2e 70 52 69 67 68 74 20 3d 20 70 45 78  ght.pRight = pEx
18b50 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e  pr->pList->a[1].
18b60 70 45 78 70 72 3b 0a 20 20 20 20 20 20 65 78 70  pExpr;.      exp
18b70 72 58 2e 69 54 61 62 6c 65 20 3d 20 73 71 6c 69  rX.iTable = sqli
18b80 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
18b90 70 50 61 72 73 65 2c 20 26 65 78 70 72 58 2c 20  pParse, &exprX, 
18ba0 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20  &regFree1);.    
18bb0 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
18bc0 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
18bd0 20 65 78 70 72 58 2e 6f 70 20 3d 20 54 4b 5f 52   exprX.op = TK_R
18be0 45 47 49 53 54 45 52 3b 0a 20 20 20 20 20 20 74  EGISTER;.      t
18bf0 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e  estcase( jumpIfN
18c00 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ull==0 );.      
18c10 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
18c20 73 65 28 70 50 61 72 73 65 2c 20 26 65 78 70 72  se(pParse, &expr
18c30 41 6e 64 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49  And, dest, jumpI
18c40 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72  fNull);.      br
18c50 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64  eak;.    }.    d
18c60 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
18c70 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
18c80 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
18c90 20 70 45 78 70 72 2c 20 26 72 65 67 46 72 65 65   pExpr, &regFree
18ca0 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
18cb0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
18cc0 50 5f 49 66 4e 6f 74 2c 20 72 31 2c 20 64 65 73  P_IfNot, r1, des
18cd0 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30  t, jumpIfNull!=0
18ce0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
18cf0 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  e( regFree1==0 )
18d00 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
18d10 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  ( jumpIfNull==0 
18d20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
18d30 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
18d40 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
18d50 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65  g(pParse, regFre
18d60 65 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65  e1);.  sqlite3Re
18d70 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
18d80 72 73 65 2c 20 72 65 67 46 72 65 65 32 29 3b 0a  rse, regFree2);.
18d90 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 61 20 64 65  }../*.** Do a de
18da0 65 70 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 66  ep comparison of
18db0 20 74 77 6f 20 65 78 70 72 65 73 73 69 6f 6e 20   two expression 
18dc0 74 72 65 65 73 2e 20 20 52 65 74 75 72 6e 20 54  trees.  Return T
18dd0 52 55 45 20 28 6e 6f 6e 2d 7a 65 72 6f 29 0a 2a  RUE (non-zero).*
18de0 2a 20 69 66 20 74 68 65 79 20 61 72 65 20 69 64  * if they are id
18df0 65 6e 74 69 63 61 6c 20 61 6e 64 20 72 65 74 75  entical and retu
18e00 72 6e 20 46 41 4c 53 45 20 69 66 20 74 68 65 79  rn FALSE if they
18e10 20 64 69 66 66 65 72 20 69 6e 20 61 6e 79 20 77   differ in any w
18e20 61 79 2e 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69  ay..**.** Someti
18e30 6d 65 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65  mes this routine
18e40 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 46 41 4c   will return FAL
18e50 53 45 20 65 76 65 6e 20 69 66 20 74 68 65 20 74  SE even if the t
18e60 77 6f 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a  wo expressions.*
18e70 2a 20 72 65 61 6c 6c 79 20 61 72 65 20 65 71 75  * really are equ
18e80 69 76 61 6c 65 6e 74 2e 20 20 49 66 20 77 65 20  ivalent.  If we 
18e90 63 61 6e 6e 6f 74 20 70 72 6f 76 65 20 74 68 61  cannot prove tha
18ea0 74 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  t the expression
18eb0 73 20 61 72 65 0a 2a 2a 20 69 64 65 6e 74 69 63  s are.** identic
18ec0 61 6c 2c 20 77 65 20 72 65 74 75 72 6e 20 46 41  al, we return FA
18ed0 4c 53 45 20 6a 75 73 74 20 74 6f 20 62 65 20 73  LSE just to be s
18ee0 61 66 65 2e 20 20 53 6f 20 69 66 20 74 68 69 73  afe.  So if this
18ef0 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75   routine.** retu
18f00 72 6e 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20  rns false, then 
18f10 79 6f 75 20 64 6f 20 6e 6f 74 20 72 65 61 6c 6c  you do not reall
18f20 79 20 6b 6e 6f 77 20 66 6f 72 20 63 65 72 74 61  y know for certa
18f30 69 6e 20 69 66 20 74 68 65 20 74 77 6f 0a 2a 2a  in if the two.**
18f40 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65   expressions are
18f50 20 74 68 65 20 73 61 6d 65 2e 20 20 42 75 74 20   the same.  But 
18f60 69 66 20 79 6f 75 20 67 65 74 20 61 20 54 52 55  if you get a TRU
18f70 45 20 72 65 74 75 72 6e 2c 20 74 68 65 6e 20 79  E return, then y
18f80 6f 75 0a 2a 2a 20 63 61 6e 20 62 65 20 73 75 72  ou.** can be sur
18f90 65 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  e the expression
18fa0 73 20 61 72 65 20 74 68 65 20 73 61 6d 65 2e 20  s are the same. 
18fb0 20 49 6e 20 74 68 65 20 70 6c 61 63 65 73 20 77   In the places w
18fc0 68 65 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75  here.** this rou
18fd0 74 69 6e 65 20 69 73 20 75 73 65 64 2c 20 69 74  tine is used, it
18fe0 20 64 6f 65 73 20 6e 6f 74 20 68 75 72 74 20 74   does not hurt t
18ff0 6f 20 67 65 74 20 61 6e 20 65 78 74 72 61 20 46  o get an extra F
19000 41 4c 53 45 20 2d 20 74 68 61 74 0a 2a 2a 20 6a  ALSE - that.** j
19010 75 73 74 20 6d 69 67 68 74 20 72 65 73 75 6c 74  ust might result
19020 20 69 6e 20 73 6f 6d 65 20 73 6c 69 67 68 74 6c   in some slightl
19030 79 20 73 6c 6f 77 65 72 20 63 6f 64 65 2e 20 20  y slower code.  
19040 42 75 74 20 72 65 74 75 72 6e 69 6e 67 0a 2a 2a  But returning.**
19050 20 61 6e 20 69 6e 63 6f 72 72 65 63 74 20 54 52   an incorrect TR
19060 55 45 20 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f  UE could lead to
19070 20 61 20 6d 61 6c 66 75 6e 63 74 69 6f 6e 2e 0a   a malfunction..
19080 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
19090 70 72 43 6f 6d 70 61 72 65 28 45 78 70 72 20 2a  prCompare(Expr *
190a0 70 41 2c 20 45 78 70 72 20 2a 70 42 29 7b 0a 20  pA, Expr *pB){. 
190b0 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 41   int i;.  if( pA
190c0 3d 3d 30 7c 7c 70 42 3d 3d 30 20 29 7b 0a 20 20  ==0||pB==0 ){.  
190d0 20 20 72 65 74 75 72 6e 20 70 42 3d 3d 70 41 3b    return pB==pA;
190e0 0a 20 20 7d 0a 20 20 69 66 28 20 70 41 2d 3e 6f  .  }.  if( pA->o
190f0 70 21 3d 70 42 2d 3e 6f 70 20 29 20 72 65 74 75  p!=pB->op ) retu
19100 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 70 41 2d  rn 0;.  if( (pA-
19110 3e 66 6c 61 67 73 20 26 20 45 50 5f 44 69 73 74  >flags & EP_Dist
19120 69 6e 63 74 29 21 3d 28 70 42 2d 3e 66 6c 61 67  inct)!=(pB->flag
19130 73 20 26 20 45 50 5f 44 69 73 74 69 6e 63 74 29  s & EP_Distinct)
19140 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
19150 66 28 20 21 73 71 6c 69 74 65 33 45 78 70 72 43  f( !sqlite3ExprC
19160 6f 6d 70 61 72 65 28 70 41 2d 3e 70 4c 65 66 74  ompare(pA->pLeft
19170 2c 20 70 42 2d 3e 70 4c 65 66 74 29 20 29 20 72  , pB->pLeft) ) r
19180 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 21  eturn 0;.  if( !
19190 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
191a0 72 65 28 70 41 2d 3e 70 52 69 67 68 74 2c 20 70  re(pA->pRight, p
191b0 42 2d 3e 70 52 69 67 68 74 29 20 29 20 72 65 74  B->pRight) ) ret
191c0 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 41 2d  urn 0;.  if( pA-
191d0 3e 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 69 66  >pList ){.    if
191e0 28 20 70 42 2d 3e 70 4c 69 73 74 3d 3d 30 20 29  ( pB->pList==0 )
191f0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 69   return 0;.    i
19200 66 28 20 70 41 2d 3e 70 4c 69 73 74 2d 3e 6e 45  f( pA->pList->nE
19210 78 70 72 21 3d 70 42 2d 3e 70 4c 69 73 74 2d 3e  xpr!=pB->pList->
19220 6e 45 78 70 72 20 29 20 72 65 74 75 72 6e 20 30  nExpr ) return 0
19230 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
19240 3c 70 41 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70  <pA->pList->nExp
19250 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  r; i++){.      i
19260 66 28 20 21 73 71 6c 69 74 65 33 45 78 70 72 43  f( !sqlite3ExprC
19270 6f 6d 70 61 72 65 28 70 41 2d 3e 70 4c 69 73 74  ompare(pA->pList
19280 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 70 42  ->a[i].pExpr, pB
19290 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  ->pList->a[i].pE
192a0 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  xpr) ){.        
192b0 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
192c0 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20  }.    }.  }else 
192d0 69 66 28 20 70 42 2d 3e 70 4c 69 73 74 20 29 7b  if( pB->pList ){
192e0 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
192f0 20 7d 0a 20 20 69 66 28 20 70 41 2d 3e 70 53 65   }.  if( pA->pSe
19300 6c 65 63 74 20 7c 7c 20 70 42 2d 3e 70 53 65 6c  lect || pB->pSel
19310 65 63 74 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ect ) return 0;.
19320 20 20 69 66 28 20 70 41 2d 3e 69 54 61 62 6c 65    if( pA->iTable
19330 21 3d 70 42 2d 3e 69 54 61 62 6c 65 20 7c 7c 20  !=pB->iTable || 
19340 70 41 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70 42 2d  pA->iColumn!=pB-
19350 3e 69 43 6f 6c 75 6d 6e 20 29 20 72 65 74 75 72  >iColumn ) retur
19360 6e 20 30 3b 0a 20 20 69 66 28 20 70 41 2d 3e 6f  n 0;.  if( pA->o
19370 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20  p!=TK_COLUMN && 
19380 70 41 2d 3e 74 6f 6b 65 6e 2e 7a 20 29 7b 0a 20  pA->token.z ){. 
19390 20 20 20 69 66 28 20 70 42 2d 3e 74 6f 6b 65 6e     if( pB->token
193a0 2e 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  .z==0 ) return 0
193b0 3b 0a 20 20 20 20 69 66 28 20 70 42 2d 3e 74 6f  ;.    if( pB->to
193c0 6b 65 6e 2e 6e 21 3d 70 41 2d 3e 74 6f 6b 65 6e  ken.n!=pA->token
193d0 2e 6e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  .n ) return 0;. 
193e0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
193f0 72 4e 49 43 6d 70 28 28 63 68 61 72 2a 29 70 41  rNICmp((char*)pA
19400 2d 3e 74 6f 6b 65 6e 2e 7a 2c 28 63 68 61 72 2a  ->token.z,(char*
19410 29 70 42 2d 3e 74 6f 6b 65 6e 2e 7a 2c 70 42 2d  )pB->token.z,pB-
19420 3e 74 6f 6b 65 6e 2e 6e 29 21 3d 30 20 29 7b 0a  >token.n)!=0 ){.
19430 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
19440 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
19450 72 6e 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  rn 1;.}.../*.** 
19460 41 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e  Add a new elemen
19470 74 20 74 6f 20 74 68 65 20 70 41 67 67 49 6e 66  t to the pAggInf
19480 6f 2d 3e 61 43 6f 6c 5b 5d 20 61 72 72 61 79 2e  o->aCol[] array.
19490 20 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64    Return the ind
194a0 65 78 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77  ex of.** the new
194b0 20 65 6c 65 6d 65 6e 74 2e 20 20 52 65 74 75 72   element.  Retur
194c0 6e 20 61 20 6e 65 67 61 74 69 76 65 20 6e 75 6d  n a negative num
194d0 62 65 72 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61  ber if malloc fa
194e0 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ils..*/.static i
194f0 6e 74 20 61 64 64 41 67 67 49 6e 66 6f 43 6f 6c  nt addAggInfoCol
19500 75 6d 6e 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  umn(sqlite3 *db,
19510 20 41 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 29   AggInfo *pInfo)
19520 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 70 49 6e  {.  int i;.  pIn
19530 66 6f 2d 3e 61 43 6f 6c 20 3d 20 73 71 6c 69 74  fo->aCol = sqlit
19540 65 33 41 72 72 61 79 41 6c 6c 6f 63 61 74 65 28  e3ArrayAllocate(
19550 0a 20 20 20 20 20 20 20 64 62 2c 0a 20 20 20 20  .       db,.    
19560 20 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 2c 0a     pInfo->aCol,.
19570 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70 49         sizeof(pI
19580 6e 66 6f 2d 3e 61 43 6f 6c 5b 30 5d 29 2c 0a 20  nfo->aCol[0]),. 
19590 20 20 20 20 20 20 33 2c 0a 20 20 20 20 20 20 20        3,.       
195a0 26 70 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 2c  &pInfo->nColumn,
195b0 0a 20 20 20 20 20 20 20 26 70 49 6e 66 6f 2d 3e  .       &pInfo->
195c0 6e 43 6f 6c 75 6d 6e 41 6c 6c 6f 63 2c 0a 20 20  nColumnAlloc,.  
195d0 20 20 20 20 20 26 69 0a 20 20 29 3b 0a 20 20 72       &i.  );.  r
195e0 65 74 75 72 6e 20 69 3b 0a 7d 20 20 20 20 0a 0a  eturn i;.}    ..
195f0 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20  /*.** Add a new 
19600 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 70  element to the p
19610 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d  AggInfo->aFunc[]
19620 20 61 72 72 61 79 2e 20 20 52 65 74 75 72 6e 20   array.  Return 
19630 74 68 65 20 69 6e 64 65 78 20 6f 66 0a 2a 2a 20  the index of.** 
19640 74 68 65 20 6e 65 77 20 65 6c 65 6d 65 6e 74 2e  the new element.
19650 20 20 52 65 74 75 72 6e 20 61 20 6e 65 67 61 74    Return a negat
19660 69 76 65 20 6e 75 6d 62 65 72 20 69 66 20 6d 61  ive number if ma
19670 6c 6c 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73  lloc fails..*/.s
19680 74 61 74 69 63 20 69 6e 74 20 61 64 64 41 67 67  tatic int addAgg
19690 49 6e 66 6f 46 75 6e 63 28 73 71 6c 69 74 65 33  InfoFunc(sqlite3
196a0 20 2a 64 62 2c 20 41 67 67 49 6e 66 6f 20 2a 70   *db, AggInfo *p
196b0 49 6e 66 6f 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  Info){.  int i;.
196c0 20 20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 20 3d    pInfo->aFunc =
196d0 20 73 71 6c 69 74 65 33 41 72 72 61 79 41 6c 6c   sqlite3ArrayAll
196e0 6f 63 61 74 65 28 0a 20 20 20 20 20 20 20 64 62  ocate(.       db
196f0 2c 20 0a 20 20 20 20 20 20 20 70 49 6e 66 6f 2d  , .       pInfo-
19700 3e 61 46 75 6e 63 2c 0a 20 20 20 20 20 20 20 73  >aFunc,.       s
19710 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 61 46 75  izeof(pInfo->aFu
19720 6e 63 5b 30 5d 29 2c 0a 20 20 20 20 20 20 20 33  nc[0]),.       3
19730 2c 0a 20 20 20 20 20 20 20 26 70 49 6e 66 6f 2d  ,.       &pInfo-
19740 3e 6e 46 75 6e 63 2c 0a 20 20 20 20 20 20 20 26  >nFunc,.       &
19750 70 49 6e 66 6f 2d 3e 6e 46 75 6e 63 41 6c 6c 6f  pInfo->nFuncAllo
19760 63 2c 0a 20 20 20 20 20 20 20 26 69 0a 20 20 29  c,.       &i.  )
19770 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 20  ;.  return i;.} 
19780 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20     ../*.** This 
19790 69 73 20 61 6e 20 78 46 75 6e 63 20 66 6f 72 20  is an xFunc for 
197a0 77 61 6c 6b 45 78 70 72 54 72 65 65 28 29 20 75  walkExprTree() u
197b0 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  sed to implement
197c0 20 0a 2a 2a 20 73 71 6c 69 74 65 33 45 78 70 72   .** sqlite3Expr
197d0 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  AnalyzeAggregate
197e0 73 28 29 2e 20 20 53 65 65 20 73 71 6c 69 74 65  s().  See sqlite
197f0 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72  3ExprAnalyzeAggr
19800 65 67 61 74 65 73 0a 2a 2a 20 66 6f 72 20 61 64  egates.** for ad
19810 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61  ditional informa
19820 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tion..**.** This
19830 20 72 6f 75 74 69 6e 65 20 61 6e 61 6c 79 7a 65   routine analyze
19840 73 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20  s the aggregate 
19850 66 75 6e 63 74 69 6f 6e 20 61 74 20 70 45 78 70  function at pExp
19860 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
19870 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74   analyzeAggregat
19880 65 28 76 6f 69 64 20 2a 70 41 72 67 2c 20 45 78  e(void *pArg, Ex
19890 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e  pr *pExpr){.  in
198a0 74 20 69 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65  t i;.  NameConte
198b0 78 74 20 2a 70 4e 43 20 3d 20 28 4e 61 6d 65 43  xt *pNC = (NameC
198c0 6f 6e 74 65 78 74 20 2a 29 70 41 72 67 3b 0a 20  ontext *)pArg;. 
198d0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d   Parse *pParse =
198e0 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20   pNC->pParse;.  
198f0 53 72 63 4c 69 73 74 20 2a 70 53 72 63 4c 69 73  SrcList *pSrcLis
19900 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73  t = pNC->pSrcLis
19910 74 3b 0a 20 20 41 67 67 49 6e 66 6f 20 2a 70 41  t;.  AggInfo *pA
19920 67 67 49 6e 66 6f 20 3d 20 70 4e 43 2d 3e 70 41  ggInfo = pNC->pA
19930 67 67 49 6e 66 6f 3b 0a 0a 20 20 73 77 69 74 63  ggInfo;..  switc
19940 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a  h( pExpr->op ){.
19950 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f      case TK_AGG_
19960 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65  COLUMN:.    case
19970 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20   TK_COLUMN: {.  
19980 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20      /* Check to 
19990 73 65 65 20 69 66 20 74 68 65 20 63 6f 6c 75 6d  see if the colum
199a0 6e 20 69 73 20 69 6e 20 6f 6e 65 20 6f 66 20 74  n is in one of t
199b0 68 65 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65  he tables in the
199c0 20 46 52 4f 4d 0a 20 20 20 20 20 20 2a 2a 20 63   FROM.      ** c
199d0 6c 61 75 73 65 20 6f 66 20 74 68 65 20 61 67 67  lause of the agg
199e0 72 65 67 61 74 65 20 71 75 65 72 79 20 2a 2f 0a  regate query */.
199f0 20 20 20 20 20 20 69 66 28 20 70 53 72 63 4c 69        if( pSrcLi
19a00 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74  st ){.        st
19a10 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
19a20 6d 20 2a 70 49 74 65 6d 20 3d 20 70 53 72 63 4c  m *pItem = pSrcL
19a30 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20 20 20  ist->a;.        
19a40 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72 63 4c  for(i=0; i<pSrcL
19a50 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20  ist->nSrc; i++, 
19a60 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
19a70 20 20 20 20 73 74 72 75 63 74 20 41 67 67 49 6e      struct AggIn
19a80 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 3b 0a 20 20  fo_col *pCol;.  
19a90 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78 70          if( pExp
19aa0 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 49 74 65 6d  r->iTable==pItem
19ab0 2d 3e 69 43 75 72 73 6f 72 20 29 7b 0a 20 20 20  ->iCursor ){.   
19ac0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77           /* If w
19ad0 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69  e reach this poi
19ae0 6e 74 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61  nt, it means tha
19af0 74 20 70 45 78 70 72 20 72 65 66 65 72 73 20 74  t pExpr refers t
19b00 6f 20 61 20 74 61 62 6c 65 0a 20 20 20 20 20 20  o a table.      
19b10 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 69 73        ** that is
19b20 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
19b30 75 73 65 20 6f 66 20 74 68 65 20 61 67 67 72 65  use of the aggre
19b40 67 61 74 65 20 71 75 65 72 79 2e 20 20 0a 20 20  gate query.  .  
19b50 20 20 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20            **.   
19b60 20 20 20 20 20 20 20 20 20 2a 2a 20 4d 61 6b 65           ** Make
19b70 20 61 6e 20 65 6e 74 72 79 20 66 6f 72 20 74 68   an entry for th
19b80 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 41 67 67  e column in pAgg
19b90 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 69 66 20  Info->aCol[] if 
19ba0 74 68 65 72 65 0a 20 20 20 20 20 20 20 20 20 20  there.          
19bb0 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61 6e 20 65    ** is not an e
19bc0 6e 74 72 79 20 74 68 65 72 65 20 61 6c 72 65 61  ntry there alrea
19bd0 64 79 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  dy..            
19be0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  */.            i
19bf0 6e 74 20 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  nt k;.          
19c00 20 20 70 43 6f 6c 20 3d 20 70 41 67 67 49 6e 66    pCol = pAggInf
19c10 6f 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 20 20 20  o->aCol;.       
19c20 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c       for(k=0; k<
19c30 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d  pAggInfo->nColum
19c40 6e 3b 20 6b 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b  n; k++, pCol++){
19c50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
19c60 66 28 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 3d  f( pCol->iTable=
19c70 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 26  =pExpr->iTable &
19c80 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  &.              
19c90 20 20 20 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d      pCol->iColum
19ca0 6e 3d 3d 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  n==pExpr->iColum
19cb0 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  n ){.           
19cc0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
19cd0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
19ce0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
19cf0 20 20 20 20 20 20 69 66 28 20 28 6b 3e 3d 70 41        if( (k>=pA
19d00 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 29  ggInfo->nColumn)
19d10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26  .             &&
19d20 20 28 6b 20 3d 20 61 64 64 41 67 67 49 6e 66 6f   (k = addAggInfo
19d30 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2d 3e 64  Column(pParse->d
19d40 62 2c 20 70 41 67 67 49 6e 66 6f 29 29 3e 3d 30  b, pAggInfo))>=0
19d50 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 29 7b   .            ){
19d60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
19d70 43 6f 6c 20 3d 20 26 70 41 67 67 49 6e 66 6f 2d  Col = &pAggInfo-
19d80 3e 61 43 6f 6c 5b 6b 5d 3b 0a 20 20 20 20 20 20  >aCol[k];.      
19d90 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 54          pCol->pT
19da0 61 62 20 3d 20 70 45 78 70 72 2d 3e 70 54 61 62  ab = pExpr->pTab
19db0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
19dc0 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 20 3d 20 70  pCol->iTable = p
19dd0 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20  Expr->iTable;.  
19de0 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
19df0 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 70 45 78 70  ->iColumn = pExp
19e00 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  r->iColumn;.    
19e10 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e            pCol->
19e20 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d  iMem = ++pParse-
19e30 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 20  >nMem;.         
19e40 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74       pCol->iSort
19e50 65 72 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20  erColumn = -1;. 
19e60 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
19e70 6c 2d 3e 70 45 78 70 72 20 3d 20 70 45 78 70 72  l->pExpr = pExpr
19e80 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
19e90 69 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e 70 47  if( pAggInfo->pG
19ea0 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20  roupBy ){.      
19eb0 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6a 2c            int j,
19ec0 20 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   n;.            
19ed0 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47      ExprList *pG
19ee0 42 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 70 47  B = pAggInfo->pG
19ef0 72 6f 75 70 42 79 3b 0a 20 20 20 20 20 20 20 20  roupBy;.        
19f00 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 45          struct E
19f10 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54  xprList_item *pT
19f20 65 72 6d 20 3d 20 70 47 42 2d 3e 61 3b 0a 20 20  erm = pGB->a;.  
19f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 20                n 
19f40 3d 20 70 47 42 2d 3e 6e 45 78 70 72 3b 0a 20 20  = pGB->nExpr;.  
19f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f                fo
19f60 72 28 6a 3d 30 3b 20 6a 3c 6e 3b 20 6a 2b 2b 2c  r(j=0; j<n; j++,
19f70 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20   pTerm++){.     
19f80 20 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70               Exp
19f90 72 20 2a 70 45 20 3d 20 70 54 65 72 6d 2d 3e 70  r *pE = pTerm->p
19fa0 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20  Expr;.          
19fb0 20 20 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e          if( pE->
19fc0 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26  op==TK_COLUMN &&
19fd0 20 70 45 2d 3e 69 54 61 62 6c 65 3d 3d 70 45 78   pE->iTable==pEx
19fe0 70 72 2d 3e 69 54 61 62 6c 65 20 26 26 0a 20 20  pr->iTable &&.  
19ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a000 20 20 20 20 70 45 2d 3e 69 43 6f 6c 75 6d 6e 3d      pE->iColumn=
1a010 3d 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20  =pExpr->iColumn 
1a020 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
1a030 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f         pCol->iSo
1a040 72 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 6a 3b 0a  rterColumn = j;.
1a050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a060 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1a070 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
1a080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
1a090 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
1a0a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
1a0b0 66 28 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72  f( pCol->iSorter
1a0c0 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20  Column<0 ){.    
1a0d0 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
1a0e0 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 20  ->iSorterColumn 
1a0f0 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 53 6f 72  = pAggInfo->nSor
1a100 74 69 6e 67 43 6f 6c 75 6d 6e 2b 2b 3b 0a 20 20  tingColumn++;.  
1a110 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
1a120 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1a130 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 72 65          /* There
1a140 20 69 73 20 6e 6f 77 20 61 6e 20 65 6e 74 72 79   is now an entry
1a150 20 66 6f 72 20 70 45 78 70 72 20 69 6e 20 70 41   for pExpr in pA
1a160 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 28  ggInfo->aCol[] (
1a170 65 69 74 68 65 72 0a 20 20 20 20 20 20 20 20 20  either.         
1a180 20 20 20 2a 2a 20 62 65 63 61 75 73 65 20 69 74     ** because it
1a190 20 77 61 73 20 74 68 65 72 65 20 62 65 66 6f 72   was there befor
1a1a0 65 20 6f 72 20 62 65 63 61 75 73 65 20 77 65 20  e or because we 
1a1b0 6a 75 73 74 20 63 72 65 61 74 65 64 20 69 74 29  just created it)
1a1c0 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  ..            **
1a1d0 20 43 6f 6e 76 65 72 74 20 74 68 65 20 70 45 78   Convert the pEx
1a1e0 70 72 20 74 6f 20 62 65 20 61 20 54 4b 5f 41 47  pr to be a TK_AG
1a1f0 47 5f 43 4f 4c 55 4d 4e 20 72 65 66 65 72 72 69  G_COLUMN referri
1a200 6e 67 20 74 6f 20 74 68 61 74 0a 20 20 20 20 20  ng to that.     
1a210 20 20 20 20 20 20 20 2a 2a 20 70 41 67 67 49 6e         ** pAggIn
1a220 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 65 6e 74 72 79  fo->aCol[] entry
1a230 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f  ..            */
1a240 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78  .            pEx
1a250 70 72 2d 3e 70 41 67 67 49 6e 66 6f 20 3d 20 70  pr->pAggInfo = p
1a260 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20  AggInfo;.       
1a270 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d       pExpr->op =
1a280 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3b 0a   TK_AGG_COLUMN;.
1a290 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
1a2a0 72 2d 3e 69 41 67 67 20 3d 20 6b 3b 0a 20 20 20  r->iAgg = k;.   
1a2b0 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
1a2c0 20 20 20 20 20 20 20 20 20 20 7d 20 2f 2a 20 65            } /* e
1a2d0 6e 64 69 66 20 70 45 78 70 72 2d 3e 69 54 61 62  ndif pExpr->iTab
1a2e0 6c 65 3d 3d 70 49 74 65 6d 2d 3e 69 43 75 72 73  le==pItem->iCurs
1a2f0 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 20  or */.        } 
1a300 2f 2a 20 65 6e 64 20 6c 6f 6f 70 20 6f 76 65 72  /* end loop over
1a310 20 70 53 72 63 4c 69 73 74 20 2a 2f 0a 20 20 20   pSrcList */.   
1a320 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72     }.      retur
1a330 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  n 1;.    }.    c
1a340 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54  ase TK_AGG_FUNCT
1a350 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  ION: {.      /* 
1a360 54 68 65 20 70 4e 43 2d 3e 6e 44 65 70 74 68 3d  The pNC->nDepth=
1a370 3d 30 20 74 65 73 74 20 63 61 75 73 65 73 20 61  =0 test causes a
1a380 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
1a390 6e 73 20 69 6e 20 73 75 62 71 75 65 72 69 65 73  ns in subqueries
1a3a0 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 62 65 20  .      ** to be 
1a3b0 69 67 6e 6f 72 65 64 20 2a 2f 0a 20 20 20 20 20  ignored */.     
1a3c0 20 69 66 28 20 70 4e 43 2d 3e 6e 44 65 70 74 68   if( pNC->nDepth
1a3d0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ==0 ){.        /
1a3e0 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
1a3f0 66 20 70 45 78 70 72 20 69 73 20 61 20 64 75 70  f pExpr is a dup
1a400 6c 69 63 61 74 65 20 6f 66 20 61 6e 6f 74 68 65  licate of anothe
1a410 72 20 61 67 67 72 65 67 61 74 65 20 0a 20 20 20  r aggregate .   
1a420 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e       ** function
1a430 20 74 68 61 74 20 69 73 20 61 6c 72 65 61 64 79   that is already
1a440 20 69 6e 20 74 68 65 20 70 41 67 67 49 6e 66 6f   in the pAggInfo
1a450 20 73 74 72 75 63 74 75 72 65 0a 20 20 20 20 20   structure.     
1a460 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 74     */.        st
1a470 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e  ruct AggInfo_fun
1a480 63 20 2a 70 49 74 65 6d 20 3d 20 70 41 67 67 49  c *pItem = pAggI
1a490 6e 66 6f 2d 3e 61 46 75 6e 63 3b 0a 20 20 20 20  nfo->aFunc;.    
1a4a0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
1a4b0 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20  AggInfo->nFunc; 
1a4c0 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  i++, pItem++){. 
1a4d0 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c           if( sql
1a4e0 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28  ite3ExprCompare(
1a4f0 70 49 74 65 6d 2d 3e 70 45 78 70 72 2c 20 70 45  pItem->pExpr, pE
1a500 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  xpr) ){.        
1a510 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1a520 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
1a530 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 3e 3d  .        if( i>=
1a540 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 20  pAggInfo->nFunc 
1a550 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
1a560 70 45 78 70 72 20 69 73 20 6f 72 69 67 69 6e 61  pExpr is origina
1a570 6c 2e 20 20 4d 61 6b 65 20 61 20 6e 65 77 20 65  l.  Make a new e
1a580 6e 74 72 79 20 69 6e 20 70 41 67 67 49 6e 66 6f  ntry in pAggInfo
1a590 2d 3e 61 46 75 6e 63 5b 5d 0a 20 20 20 20 20 20  ->aFunc[].      
1a5a0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
1a5b0 20 75 38 20 65 6e 63 20 3d 20 45 4e 43 28 70 50   u8 enc = ENC(pP
1a5c0 61 72 73 65 2d 3e 64 62 29 3b 0a 20 20 20 20 20  arse->db);.     
1a5d0 20 20 20 20 20 69 20 3d 20 61 64 64 41 67 67 49       i = addAggI
1a5e0 6e 66 6f 46 75 6e 63 28 70 50 61 72 73 65 2d 3e  nfoFunc(pParse->
1a5f0 64 62 2c 20 70 41 67 67 49 6e 66 6f 29 3b 0a 20  db, pAggInfo);. 
1a600 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3e 3d           if( i>=
1a610 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
1a620 20 70 49 74 65 6d 20 3d 20 26 70 41 67 67 49 6e   pItem = &pAggIn
1a630 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d 3b 0a 20 20  fo->aFunc[i];.  
1a640 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d            pItem-
1a650 3e 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a  >pExpr = pExpr;.
1a660 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65              pIte
1a670 6d 2d 3e 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72  m->iMem = ++pPar
1a680 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
1a690 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 46 75        pItem->pFu
1a6a0 6e 63 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  nc = sqlite3Find
1a6b0 46 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2d  Function(pParse-
1a6c0 3e 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20  >db,.           
1a6d0 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70          (char*)p
1a6e0 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70  Expr->token.z, p
1a6f0 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 2c 0a 20  Expr->token.n,. 
1a700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a710 20 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 20 3f    pExpr->pList ?
1a720 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e   pExpr->pList->n
1a730 45 78 70 72 20 3a 20 30 2c 20 65 6e 63 2c 20 30  Expr : 0, enc, 0
1a740 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
1a750 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 20  f( pExpr->flags 
1a760 26 20 45 50 5f 44 69 73 74 69 6e 63 74 20 29 7b  & EP_Distinct ){
1a770 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
1a780 49 74 65 6d 2d 3e 69 44 69 73 74 69 6e 63 74 20  Item->iDistinct 
1a790 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
1a7a0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65  ;.            }e
1a7b0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
1a7c0 20 20 20 70 49 74 65 6d 2d 3e 69 44 69 73 74 69     pItem->iDisti
1a7d0 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  nct = -1;.      
1a7e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1a7f0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
1a800 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 70 45        /* Make pE
1a810 78 70 72 20 70 6f 69 6e 74 20 74 6f 20 74 68 65  xpr point to the
1a820 20 61 70 70 72 6f 70 72 69 61 74 65 20 70 41 67   appropriate pAg
1a830 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 20 65  gInfo->aFunc[] e
1a840 6e 74 72 79 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ntry.        */.
1a850 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69          pExpr->i
1a860 41 67 67 20 3d 20 69 3b 0a 20 20 20 20 20 20 20  Agg = i;.       
1a870 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f   pExpr->pAggInfo
1a880 20 3d 20 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20   = pAggInfo;.   
1a890 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
1a8a0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1a8b0 0a 0a 20 20 2f 2a 20 52 65 63 75 72 73 69 76 65  ..  /* Recursive
1a8c0 6c 79 20 77 61 6c 6b 20 73 75 62 71 75 65 72 69  ly walk subqueri
1a8d0 65 73 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 54  es looking for T
1a8e0 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73 20 74  K_COLUMN nodes t
1a8f0 68 61 74 20 6e 65 65 64 0a 20 20 2a 2a 20 74 6f  hat need.  ** to
1a900 20 62 65 20 63 68 61 6e 67 65 64 20 74 6f 20 54   be changed to T
1a910 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 2e 20 20 42  K_AGG_COLUMN.  B
1a920 75 74 20 69 6e 63 72 65 6d 65 6e 74 20 6e 44 65  ut increment nDe
1a930 70 74 68 20 73 6f 20 74 68 61 74 0a 20 20 2a 2a  pth so that.  **
1a940 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e   TK_AGG_FUNCTION
1a950 20 6e 6f 64 65 73 20 69 6e 20 73 75 62 71 75 65   nodes in subque
1a960 72 69 65 73 20 77 69 6c 6c 20 62 65 20 75 6e 63  ries will be unc
1a970 68 61 6e 67 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  hanged..  */.  i
1a980 66 28 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63  f( pExpr->pSelec
1a990 74 20 29 7b 0a 20 20 20 20 70 4e 43 2d 3e 6e 44  t ){.    pNC->nD
1a9a0 65 70 74 68 2b 2b 3b 0a 20 20 20 20 77 61 6c 6b  epth++;.    walk
1a9b0 53 65 6c 65 63 74 45 78 70 72 28 70 45 78 70 72  SelectExpr(pExpr
1a9c0 2d 3e 70 53 65 6c 65 63 74 2c 20 61 6e 61 6c 79  ->pSelect, analy
1a9d0 7a 65 41 67 67 72 65 67 61 74 65 2c 20 70 4e 43  zeAggregate, pNC
1a9e0 29 3b 0a 20 20 20 20 70 4e 43 2d 3e 6e 44 65 70  );.    pNC->nDep
1a9f0 74 68 2d 2d 3b 0a 20 20 7d 0a 20 20 72 65 74 75  th--;.  }.  retu
1aa00 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  rn 0;.}../*.** A
1aa10 6e 61 6c 79 7a 65 20 74 68 65 20 67 69 76 65 6e  nalyze the given
1aa20 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 6f 6f 6b   expression look
1aa30 69 6e 67 20 66 6f 72 20 61 67 67 72 65 67 61 74  ing for aggregat
1aa40 65 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 0a  e functions and.
1aa50 2a 2a 20 66 6f 72 20 76 61 72 69 61 62 6c 65 73  ** for variables
1aa60 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65   that need to be
1aa70 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 70 50   added to the pP
1aa80 61 72 73 65 2d 3e 61 41 67 67 5b 5d 20 61 72 72  arse->aAgg[] arr
1aa90 61 79 2e 0a 2a 2a 20 4d 61 6b 65 20 61 64 64 69  ay..** Make addi
1aaa0 74 69 6f 6e 61 6c 20 65 6e 74 72 69 65 73 20 74  tional entries t
1aab0 6f 20 74 68 65 20 70 50 61 72 73 65 2d 3e 61 41  o the pParse->aA
1aac0 67 67 5b 5d 20 61 72 72 61 79 20 61 73 20 6e 65  gg[] array as ne
1aad0 63 65 73 73 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 54  cessary..**.** T
1aae0 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75  his routine shou
1aaf0 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65  ld only be calle
1ab00 64 20 61 66 74 65 72 20 74 68 65 20 65 78 70 72  d after the expr
1ab10 65 73 73 69 6f 6e 20 68 61 73 20 62 65 65 6e 0a  ession has been.
1ab20 2a 2a 20 61 6e 61 6c 79 7a 65 64 20 62 79 20 73  ** analyzed by s
1ab30 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76  qlite3ExprResolv
1ab40 65 4e 61 6d 65 73 28 29 2e 0a 2a 2f 0a 76 6f 69  eNames()..*/.voi
1ab50 64 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61  d sqlite3ExprAna
1ab60 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 4e  lyzeAggregates(N
1ab70 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c  ameContext *pNC,
1ab80 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20   Expr *pExpr){. 
1ab90 20 77 61 6c 6b 45 78 70 72 54 72 65 65 28 70 45   walkExprTree(pE
1aba0 78 70 72 2c 20 61 6e 61 6c 79 7a 65 41 67 67 72  xpr, analyzeAggr
1abb0 65 67 61 74 65 2c 20 70 4e 43 29 3b 0a 7d 0a 0a  egate, pNC);.}..
1abc0 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 73 71 6c 69 74  /*.** Call sqlit
1abd0 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
1abe0 72 65 67 61 74 65 73 28 29 20 66 6f 72 20 65 76  regates() for ev
1abf0 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20 69  ery expression i
1ac00 6e 20 61 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69  n an.** expressi
1ac10 6f 6e 20 6c 69 73 74 2e 20 20 52 65 74 75 72 6e  on list.  Return
1ac20 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
1ac30 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  rrors..**.** If 
1ac40 61 6e 20 65 72 72 6f 72 20 69 73 20 66 6f 75 6e  an error is foun
1ac50 64 2c 20 74 68 65 20 61 6e 61 6c 79 73 69 73 20  d, the analysis 
1ac60 69 73 20 63 75 74 20 73 68 6f 72 74 2e 0a 2a 2f  is cut short..*/
1ac70 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
1ac80 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28  rAnalyzeAggList(
1ac90 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43  NameContext *pNC
1aca0 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73  , ExprList *pLis
1acb0 74 29 7b 0a 20 20 73 74 72 75 63 74 20 45 78 70  t){.  struct Exp
1acc0 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
1acd0 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  m;.  int i;.  if
1ace0 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 66  ( pList ){.    f
1acf0 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e  or(pItem=pList->
1ad00 61 2c 20 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  a, i=0; i<pList-
1ad10 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74  >nExpr; i++, pIt
1ad20 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c  em++){.      sql
1ad30 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
1ad40 67 67 72 65 67 61 74 65 73 28 70 4e 43 2c 20 70  ggregates(pNC, p
1ad50 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20  Item->pExpr);.  
1ad60 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
1ad70 20 41 6c 6c 6f 63 61 74 65 20 6f 72 20 64 65 61   Allocate or dea
1ad80 6c 6c 6f 63 61 74 65 20 74 65 6d 70 6f 72 61 72  llocate temporar
1ad90 79 20 75 73 65 20 72 65 67 69 73 74 65 72 73 20  y use registers 
1ada0 64 75 72 69 6e 67 20 63 6f 64 65 20 67 65 6e 65  during code gene
1adb0 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73  ration..*/.int s
1adc0 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
1add0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b  (Parse *pParse){
1ade0 0a 20 20 69 6e 74 20 69 2c 20 72 3b 0a 20 20 69  .  int i, r;.  i
1adf0 66 28 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70  f( pParse->nTemp
1ae00 52 65 67 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  Reg==0 ){.    re
1ae10 74 75 72 6e 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  turn ++pParse->n
1ae20 4d 65 6d 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  Mem;.  }.  for(i
1ae30 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 54  =0; i<pParse->nT
1ae40 65 6d 70 52 65 67 3b 20 69 2b 2b 29 7b 0a 20 20  empReg; i++){.  
1ae50 20 20 72 20 3d 20 70 50 61 72 73 65 2d 3e 61 54    r = pParse->aT
1ae60 65 6d 70 52 65 67 5b 69 5d 3b 0a 20 20 20 20 69  empReg[i];.    i
1ae70 66 28 20 75 73 65 64 41 73 43 6f 6c 75 6d 6e 43  f( usedAsColumnC
1ae80 61 63 68 65 28 70 50 61 72 73 65 2c 20 72 2c 20  ache(pParse, r, 
1ae90 72 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  r) ) continue;. 
1aea0 20 7d 0a 20 20 69 66 28 20 69 3e 3d 70 50 61 72   }.  if( i>=pPar
1aeb0 73 65 2d 3e 6e 54 65 6d 70 52 65 67 20 29 7b 0a  se->nTempReg ){.
1aec0 20 20 20 20 72 65 74 75 72 6e 20 2b 2b 70 50 61      return ++pPa
1aed0 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 7d 0a 20  rse->nMem;.  }. 
1aee0 20 77 68 69 6c 65 28 20 69 3c 70 50 61 72 73 65   while( i<pParse
1aef0 2d 3e 6e 54 65 6d 70 52 65 67 2d 31 20 29 7b 0a  ->nTempReg-1 ){.
1af00 20 20 20 20 70 50 61 72 73 65 2d 3e 61 54 65 6d      pParse->aTem
1af10 70 52 65 67 5b 69 5d 20 3d 20 70 50 61 72 73 65  pReg[i] = pParse
1af20 2d 3e 61 54 65 6d 70 52 65 67 5b 69 2b 31 5d 3b  ->aTempReg[i+1];
1af30 0a 20 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 6e  .  }.  pParse->n
1af40 54 65 6d 70 52 65 67 2d 2d 3b 0a 20 20 72 65 74  TempReg--;.  ret
1af50 75 72 6e 20 72 3b 0a 7d 0a 76 6f 69 64 20 73 71  urn r;.}.void sq
1af60 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
1af70 52 65 67 28 50 61 72 73 65 20 2a 70 50 61 72 73  Reg(Parse *pPars
1af80 65 2c 20 69 6e 74 20 69 52 65 67 29 7b 0a 20 20  e, int iReg){.  
1af90 69 66 28 20 69 52 65 67 20 26 26 20 70 50 61 72  if( iReg && pPar
1afa0 73 65 2d 3e 6e 54 65 6d 70 52 65 67 3c 41 72 72  se->nTempReg<Arr
1afb0 61 79 53 69 7a 65 28 70 50 61 72 73 65 2d 3e 61  aySize(pParse->a
1afc0 54 65 6d 70 52 65 67 29 20 29 7b 0a 20 20 20 20  TempReg) ){.    
1afd0 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67  pParse->aTempReg
1afe0 5b 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65  [pParse->nTempRe
1aff0 67 2b 2b 5d 20 3d 20 69 52 65 67 3b 0a 20 20 7d  g++] = iReg;.  }
1b000 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  .}../*.** Alloca
1b010 74 65 20 6f 72 20 64 65 61 6c 6c 6f 63 61 74 65  te or deallocate
1b020 20 61 20 62 6c 6f 63 6b 20 6f 66 20 6e 52 65 67   a block of nReg
1b030 20 63 6f 6e 73 65 63 75 74 69 76 65 20 72 65 67   consecutive reg
1b040 69 73 74 65 72 73 0a 2a 2f 0a 69 6e 74 20 73 71  isters.*/.int sq
1b050 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67  lite3GetTempRang
1b060 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
1b070 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20 69 6e   int nReg){.  in
1b080 74 20 69 2c 20 6e 3b 0a 20 20 69 20 3d 20 70 50  t i, n;.  i = pP
1b090 61 72 73 65 2d 3e 69 52 61 6e 67 65 52 65 67 3b  arse->iRangeReg;
1b0a0 0a 20 20 6e 20 3d 20 70 50 61 72 73 65 2d 3e 6e  .  n = pParse->n
1b0b0 52 61 6e 67 65 52 65 67 3b 0a 20 20 69 66 28 20  RangeReg;.  if( 
1b0c0 6e 52 65 67 3c 3d 6e 20 26 26 20 21 75 73 65 64  nReg<=n && !used
1b0d0 41 73 43 6f 6c 75 6d 6e 43 61 63 68 65 28 70 50  AsColumnCache(pP
1b0e0 61 72 73 65 2c 20 69 2c 20 69 2b 6e 2d 31 29 20  arse, i, i+n-1) 
1b0f0 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 69  ){.    pParse->i
1b100 52 61 6e 67 65 52 65 67 20 2b 3d 20 6e 52 65 67  RangeReg += nReg
1b110 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 52  ;.    pParse->nR
1b120 61 6e 67 65 52 65 67 20 2d 3d 20 6e 52 65 67 3b  angeReg -= nReg;
1b130 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 20  .  }else{.    i 
1b140 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31  = pParse->nMem+1
1b150 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d  ;.    pParse->nM
1b160 65 6d 20 2b 3d 20 6e 52 65 67 3b 0a 20 20 7d 0a  em += nReg;.  }.
1b170 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 76 6f    return i;.}.vo
1b180 69 64 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  id sqlite3Releas
1b190 65 54 65 6d 70 52 61 6e 67 65 28 50 61 72 73 65  eTempRange(Parse
1b1a0 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 52   *pParse, int iR
1b1b0 65 67 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20  eg, int nReg){. 
1b1c0 20 69 66 28 20 6e 52 65 67 3e 70 50 61 72 73 65   if( nReg>pParse
1b1d0 2d 3e 6e 52 61 6e 67 65 52 65 67 20 29 7b 0a 20  ->nRangeReg ){. 
1b1e0 20 20 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67     pParse->nRang
1b1f0 65 52 65 67 20 3d 20 6e 52 65 67 3b 0a 20 20 20  eReg = nReg;.   
1b200 20 70 50 61 72 73 65 2d 3e 69 52 61 6e 67 65 52   pParse->iRangeR
1b210 65 67 20 3d 20 69 52 65 67 3b 0a 20 20 7d 0a 7d  eg = iReg;.  }.}
1b220 0a                                               .