/ Hex Artifact Content
Login

Artifact a3aed7057bafb3a01e8af98a5f74a102621b7a91:


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 31 31 37 20 32 30 30 34 2f 30 35 2f 31 31 20  .117 2004/05/11 
0220: 30 37 3a 31 31 3a 35 33 20 64 61 6e 69 65 6c 6b  07:11:53 danielk
0230: 31 39 37 37 20 45 78 70 20 24 0a 2a 2f 0a 23 69  1977 Exp $.*/.#i
0240: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
0250: 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c 63  t.h".#include <c
0260: 74 79 70 65 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20 43  type.h>../*.** C
0270: 6f 6e 73 74 72 75 63 74 20 61 20 6e 65 77 20 65  onstruct a new e
0280: 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 61  xpression node a
0290: 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  nd return a poin
02a0: 74 65 72 20 74 6f 20 69 74 2e 20 20 4d 65 6d 6f  ter to it.  Memo
02b0: 72 79 0a 2a 2a 20 66 6f 72 20 74 68 69 73 20 6e  ry.** for this n
02c0: 6f 64 65 20 69 73 20 6f 62 74 61 69 6e 65 64 20  ode is obtained 
02d0: 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  from sqliteMallo
02e0: 63 28 29 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e  c().  The callin
02f0: 67 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73  g function.** is
0300: 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72   responsible for
0310: 20 6d 61 6b 69 6e 67 20 73 75 72 65 20 74 68 65   making sure the
0320: 20 6e 6f 64 65 20 65 76 65 6e 74 75 61 6c 6c 79   node eventually
0330: 20 67 65 74 73 20 66 72 65 65 64 2e 0a 2a 2f 0a   gets freed..*/.
0340: 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70  Expr *sqlite3Exp
0350: 72 28 69 6e 74 20 6f 70 2c 20 45 78 70 72 20 2a  r(int op, Expr *
0360: 70 4c 65 66 74 2c 20 45 78 70 72 20 2a 70 52 69  pLeft, Expr *pRi
0370: 67 68 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b  ght, Token *pTok
0380: 65 6e 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65  en){.  Expr *pNe
0390: 77 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  w;.  pNew = sqli
03a0: 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  teMalloc( sizeof
03b0: 28 45 78 70 72 29 20 29 3b 0a 20 20 69 66 28 20  (Expr) );.  if( 
03c0: 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  pNew==0 ){.    /
03d0: 2a 20 57 68 65 6e 20 6d 61 6c 6c 6f 63 20 66 61  * When malloc fa
03e0: 69 6c 73 2c 20 77 65 20 6c 65 61 6b 20 6d 65 6d  ils, we leak mem
03f0: 6f 72 79 20 66 72 6f 6d 20 70 4c 65 66 74 20 61  ory from pLeft a
0400: 6e 64 20 70 52 69 67 68 74 20 2a 2f 0a 20 20 20  nd pRight */.   
0410: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
0420: 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 6f 70 3b 0a   pNew->op = op;.
0430: 20 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20    pNew->pLeft = 
0440: 70 4c 65 66 74 3b 0a 20 20 70 4e 65 77 2d 3e 70  pLeft;.  pNew->p
0450: 52 69 67 68 74 20 3d 20 70 52 69 67 68 74 3b 0a  Right = pRight;.
0460: 20 20 69 66 28 20 70 54 6f 6b 65 6e 20 29 7b 0a    if( pToken ){.
0470: 20 20 20 20 61 73 73 65 72 74 28 20 70 54 6f 6b      assert( pTok
0480: 65 6e 2d 3e 64 79 6e 3d 3d 30 20 29 3b 0a 20 20  en->dyn==0 );.  
0490: 20 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e 20 3d 20    pNew->token = 
04a0: 2a 70 54 6f 6b 65 6e 3b 0a 20 20 20 20 70 4e 65  *pToken;.    pNe
04b0: 77 2d 3e 73 70 61 6e 20 3d 20 2a 70 54 6f 6b 65  w->span = *pToke
04c0: 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  n;.  }else{.    
04d0: 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 74 6f  assert( pNew->to
04e0: 6b 65 6e 2e 64 79 6e 3d 3d 30 20 29 3b 0a 20 20  ken.dyn==0 );.  
04f0: 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e    assert( pNew->
0500: 74 6f 6b 65 6e 2e 7a 3d 3d 30 20 29 3b 0a 20 20  token.z==0 );.  
0510: 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e    assert( pNew->
0520: 74 6f 6b 65 6e 2e 6e 3d 3d 30 20 29 3b 0a 20 20  token.n==0 );.  
0530: 20 20 69 66 28 20 70 4c 65 66 74 20 26 26 20 70    if( pLeft && p
0540: 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 73  Right ){.      s
0550: 71 6c 69 74 65 33 45 78 70 72 53 70 61 6e 28 70  qlite3ExprSpan(p
0560: 4e 65 77 2c 20 26 70 4c 65 66 74 2d 3e 73 70 61  New, &pLeft->spa
0570: 6e 2c 20 26 70 52 69 67 68 74 2d 3e 73 70 61 6e  n, &pRight->span
0580: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
0590: 20 20 20 20 70 4e 65 77 2d 3e 73 70 61 6e 20 3d      pNew->span =
05a0: 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e 3b 0a 20 20   pNew->token;.  
05b0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
05c0: 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pNew;.}../*.** 
05d0: 53 65 74 20 74 68 65 20 45 78 70 72 2e 73 70 61  Set the Expr.spa
05e0: 6e 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 67  n field of the g
05f0: 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  iven expression 
0600: 74 6f 20 73 70 61 6e 20 61 6c 6c 0a 2a 2a 20 74  to span all.** t
0610: 65 78 74 20 62 65 74 77 65 65 6e 20 74 68 65 20  ext between the 
0620: 74 77 6f 20 67 69 76 65 6e 20 74 6f 6b 65 6e 73  two given tokens
0630: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
0640: 33 45 78 70 72 53 70 61 6e 28 45 78 70 72 20 2a  3ExprSpan(Expr *
0650: 70 45 78 70 72 2c 20 54 6f 6b 65 6e 20 2a 70 4c  pExpr, Token *pL
0660: 65 66 74 2c 20 54 6f 6b 65 6e 20 2a 70 52 69 67  eft, Token *pRig
0670: 68 74 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  ht){.  assert( p
0680: 52 69 67 68 74 21 3d 30 20 29 3b 0a 20 20 61 73  Right!=0 );.  as
0690: 73 65 72 74 28 20 70 4c 65 66 74 21 3d 30 20 29  sert( pLeft!=0 )
06a0: 3b 0a 20 20 2f 2a 20 4e 6f 74 65 3a 20 70 45 78  ;.  /* Note: pEx
06b0: 70 72 20 6d 69 67 68 74 20 62 65 20 4e 55 4c 4c  pr might be NULL
06c0: 20 64 75 65 20 74 6f 20 61 20 70 72 69 6f 72 20   due to a prior 
06d0: 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20 2a  malloc failure *
06e0: 2f 0a 20 20 69 66 28 20 70 45 78 70 72 20 26 26  /.  if( pExpr &&
06f0: 20 70 52 69 67 68 74 2d 3e 7a 20 26 26 20 70 4c   pRight->z && pL
0700: 65 66 74 2d 3e 7a 20 29 7b 0a 20 20 20 20 69 66  eft->z ){.    if
0710: 28 20 70 4c 65 66 74 2d 3e 64 79 6e 3d 3d 30 20  ( pLeft->dyn==0 
0720: 26 26 20 70 52 69 67 68 74 2d 3e 64 79 6e 3d 3d  && pRight->dyn==
0730: 30 20 29 7b 0a 20 20 20 20 20 20 70 45 78 70 72  0 ){.      pExpr
0740: 2d 3e 73 70 61 6e 2e 7a 20 3d 20 70 4c 65 66 74  ->span.z = pLeft
0750: 2d 3e 7a 3b 0a 20 20 20 20 20 20 70 45 78 70 72  ->z;.      pExpr
0760: 2d 3e 73 70 61 6e 2e 6e 20 3d 20 70 52 69 67 68  ->span.n = pRigh
0770: 74 2d 3e 6e 20 2b 20 41 64 64 72 28 70 52 69 67  t->n + Addr(pRig
0780: 68 74 2d 3e 7a 29 20 2d 20 41 64 64 72 28 70 4c  ht->z) - Addr(pL
0790: 65 66 74 2d 3e 7a 29 3b 0a 20 20 20 20 7d 65 6c  eft->z);.    }el
07a0: 73 65 7b 0a 20 20 20 20 20 20 70 45 78 70 72 2d  se{.      pExpr-
07b0: 3e 73 70 61 6e 2e 7a 20 3d 20 30 3b 0a 20 20 20  >span.z = 0;.   
07c0: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
07d0: 43 6f 6e 73 74 72 75 63 74 20 61 20 6e 65 77 20  Construct a new 
07e0: 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20  expression node 
07f0: 66 6f 72 20 61 20 66 75 6e 63 74 69 6f 6e 20 77  for a function w
0800: 69 74 68 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20  ith multiple.** 
0810: 61 72 67 75 6d 65 6e 74 73 2e 0a 2a 2f 0a 45 78  arguments..*/.Ex
0820: 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 46  pr *sqlite3ExprF
0830: 75 6e 63 74 69 6f 6e 28 45 78 70 72 4c 69 73 74  unction(ExprList
0840: 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a   *pList, Token *
0850: 70 54 6f 6b 65 6e 29 7b 0a 20 20 45 78 70 72 20  pToken){.  Expr 
0860: 2a 70 4e 65 77 3b 0a 20 20 70 4e 65 77 20 3d 20  *pNew;.  pNew = 
0870: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69  sqliteMalloc( si
0880: 7a 65 6f 66 28 45 78 70 72 29 20 29 3b 0a 20 20  zeof(Expr) );.  
0890: 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20  if( pNew==0 ){. 
08a0: 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 45 78 70     /* sqlite3Exp
08b0: 72 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73  rListDelete(pLis
08c0: 74 29 3b 20 2f 2f 20 4c 65 61 6b 20 70 4c 69 73  t); // Leak pLis
08d0: 74 20 77 68 65 6e 20 6d 61 6c 6c 6f 63 20 66 61  t when malloc fa
08e0: 69 6c 73 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  ils */.    retur
08f0: 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 2d  n 0;.  }.  pNew-
0900: 3e 6f 70 20 3d 20 54 4b 5f 46 55 4e 43 54 49 4f  >op = TK_FUNCTIO
0910: 4e 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69 73 74  N;.  pNew->pList
0920: 20 3d 20 70 4c 69 73 74 3b 0a 20 20 69 66 28 20   = pList;.  if( 
0930: 70 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 61 73  pToken ){.    as
0940: 73 65 72 74 28 20 70 54 6f 6b 65 6e 2d 3e 64 79  sert( pToken->dy
0950: 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 70 4e 65 77  n==0 );.    pNew
0960: 2d 3e 74 6f 6b 65 6e 20 3d 20 2a 70 54 6f 6b 65  ->token = *pToke
0970: 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  n;.  }else{.    
0980: 70 4e 65 77 2d 3e 74 6f 6b 65 6e 2e 7a 20 3d 20  pNew->token.z = 
0990: 30 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 73  0;.  }.  pNew->s
09a0: 70 61 6e 20 3d 20 70 4e 65 77 2d 3e 74 6f 6b 65  pan = pNew->toke
09b0: 6e 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77  n;.  return pNew
09c0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 75 72  ;.}../*.** Recur
09d0: 73 69 76 65 6c 79 20 64 65 6c 65 74 65 20 61 6e  sively delete an
09e0: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
09f0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
0a00: 33 45 78 70 72 44 65 6c 65 74 65 28 45 78 70 72  3ExprDelete(Expr
0a10: 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 3d 3d 30   *p){.  if( p==0
0a20: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
0a30: 20 70 2d 3e 73 70 61 6e 2e 64 79 6e 20 29 20 73   p->span.dyn ) s
0a40: 71 6c 69 74 65 46 72 65 65 28 28 63 68 61 72 2a  qliteFree((char*
0a50: 29 70 2d 3e 73 70 61 6e 2e 7a 29 3b 0a 20 20 69  )p->span.z);.  i
0a60: 66 28 20 70 2d 3e 74 6f 6b 65 6e 2e 64 79 6e 20  f( p->token.dyn 
0a70: 29 20 73 71 6c 69 74 65 46 72 65 65 28 28 63 68  ) sqliteFree((ch
0a80: 61 72 2a 29 70 2d 3e 74 6f 6b 65 6e 2e 7a 29 3b  ar*)p->token.z);
0a90: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  .  sqlite3ExprDe
0aa0: 6c 65 74 65 28 70 2d 3e 70 4c 65 66 74 29 3b 0a  lete(p->pLeft);.
0ab0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
0ac0: 65 74 65 28 70 2d 3e 70 52 69 67 68 74 29 3b 0a  ete(p->pRight);.
0ad0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
0ae0: 74 44 65 6c 65 74 65 28 70 2d 3e 70 4c 69 73 74  tDelete(p->pList
0af0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  );.  sqlite3Sele
0b00: 63 74 44 65 6c 65 74 65 28 70 2d 3e 70 53 65 6c  ctDelete(p->pSel
0b10: 65 63 74 29 3b 0a 20 20 73 71 6c 69 74 65 46 72  ect);.  sqliteFr
0b20: 65 65 28 70 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  ee(p);.}.../*.**
0b30: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67   The following g
0b40: 72 6f 75 70 20 6f 66 20 72 6f 75 74 69 6e 65 73  roup of routines
0b50: 20 6d 61 6b 65 20 64 65 65 70 20 63 6f 70 69 65   make deep copie
0b60: 73 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73  s of expressions
0b70: 2c 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20  ,.** expression 
0b80: 6c 69 73 74 73 2c 20 49 44 20 6c 69 73 74 73 2c  lists, ID lists,
0b90: 20 61 6e 64 20 73 65 6c 65 63 74 20 73 74 61 74   and select stat
0ba0: 65 6d 65 6e 74 73 2e 20 20 54 68 65 20 63 6f 70  ements.  The cop
0bb0: 69 65 73 20 63 61 6e 0a 2a 2a 20 62 65 20 64 65  ies can.** be de
0bc0: 6c 65 74 65 64 20 28 62 79 20 62 65 69 6e 67 20  leted (by being 
0bd0: 70 61 73 73 65 64 20 74 6f 20 74 68 65 69 72 20  passed to their 
0be0: 72 65 73 70 65 63 74 69 76 65 20 2e 2e 2e 44 65  respective ...De
0bf0: 6c 65 74 65 28 29 20 72 6f 75 74 69 6e 65 73 29  lete() routines)
0c00: 0a 2a 2a 20 77 69 74 68 6f 75 74 20 65 66 66 65  .** without effe
0c10: 63 74 69 6e 67 20 74 68 65 20 6f 72 69 67 69 6e  cting the origin
0c20: 61 6c 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65  als..**.** The e
0c30: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2c 20  xpression list, 
0c40: 49 44 2c 20 61 6e 64 20 73 6f 75 72 63 65 20 6c  ID, and source l
0c50: 69 73 74 73 20 72 65 74 75 72 6e 20 62 79 20 73  ists return by s
0c60: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
0c70: 70 28 29 2c 0a 2a 2a 20 73 71 6c 69 74 65 33 49  p(),.** sqlite3I
0c80: 64 4c 69 73 74 44 75 70 28 29 2c 20 61 6e 64 20  dListDup(), and 
0c90: 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 75  sqlite3SrcListDu
0ca0: 70 28 29 20 63 61 6e 20 6e 6f 74 20 62 65 20 66  p() can not be f
0cb0: 75 72 74 68 65 72 20 65 78 70 61 6e 64 65 64 20  urther expanded 
0cc0: 0a 2a 2a 20 62 79 20 73 75 62 73 65 71 75 65 6e  .** by subsequen
0cd0: 74 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74  t calls to sqlit
0ce0: 65 2a 4c 69 73 74 41 70 70 65 6e 64 28 29 20 72  e*ListAppend() r
0cf0: 6f 75 74 69 6e 65 73 2e 0a 2a 2a 0a 2a 2a 20 41  outines..**.** A
0d00: 6e 79 20 74 61 62 6c 65 73 20 74 68 61 74 20 74  ny tables that t
0d10: 68 65 20 53 72 63 4c 69 73 74 20 6d 69 67 68 74  he SrcList might
0d20: 20 70 6f 69 6e 74 20 74 6f 20 61 72 65 20 6e 6f   point to are no
0d30: 74 20 64 75 70 6c 69 63 61 74 65 64 2e 0a 2a 2f  t duplicated..*/
0d40: 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78  .Expr *sqlite3Ex
0d50: 70 72 44 75 70 28 45 78 70 72 20 2a 70 29 7b 0a  prDup(Expr *p){.
0d60: 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20    Expr *pNew;.  
0d70: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
0d80: 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71  n 0;.  pNew = sq
0d90: 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 73  liteMallocRaw( s
0da0: 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69  izeof(*p) );.  i
0db0: 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74  f( pNew==0 ) ret
0dc0: 75 72 6e 20 30 3b 0a 20 20 6d 65 6d 63 70 79 28  urn 0;.  memcpy(
0dd0: 70 4e 65 77 2c 20 70 2c 20 73 69 7a 65 6f 66 28  pNew, p, sizeof(
0de0: 2a 70 4e 65 77 29 29 3b 0a 20 20 69 66 28 20 70  *pNew));.  if( p
0df0: 2d 3e 74 6f 6b 65 6e 2e 7a 21 3d 30 20 29 7b 0a  ->token.z!=0 ){.
0e00: 20 20 20 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e 2e      pNew->token.
0e10: 7a 20 3d 20 73 71 6c 69 74 65 53 74 72 44 75 70  z = sqliteStrDup
0e20: 28 70 2d 3e 74 6f 6b 65 6e 2e 7a 29 3b 0a 20 20  (p->token.z);.  
0e30: 20 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e 2e 64 79    pNew->token.dy
0e40: 6e 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  n = 1;.  }else{.
0e50: 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77      assert( pNew
0e60: 2d 3e 74 6f 6b 65 6e 2e 7a 3d 3d 30 20 29 3b 0a  ->token.z==0 );.
0e70: 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 73 70 61 6e    }.  pNew->span
0e80: 2e 7a 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  .z = 0;.  pNew->
0e90: 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45  pLeft = sqlite3E
0ea0: 78 70 72 44 75 70 28 70 2d 3e 70 4c 65 66 74 29  xprDup(p->pLeft)
0eb0: 3b 0a 20 20 70 4e 65 77 2d 3e 70 52 69 67 68 74  ;.  pNew->pRight
0ec0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
0ed0: 70 28 70 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20  p(p->pRight);.  
0ee0: 70 4e 65 77 2d 3e 70 4c 69 73 74 20 3d 20 73 71  pNew->pList = sq
0ef0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
0f00: 28 70 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 70 4e  (p->pList);.  pN
0f10: 65 77 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71  ew->pSelect = sq
0f20: 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 70  lite3SelectDup(p
0f30: 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 72 65  ->pSelect);.  re
0f40: 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 76 6f 69  turn pNew;.}.voi
0f50: 64 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e 43 6f  d sqlite3TokenCo
0f60: 70 79 28 54 6f 6b 65 6e 20 2a 70 54 6f 2c 20 54  py(Token *pTo, T
0f70: 6f 6b 65 6e 20 2a 70 46 72 6f 6d 29 7b 0a 20 20  oken *pFrom){.  
0f80: 69 66 28 20 70 54 6f 2d 3e 64 79 6e 20 29 20 73  if( pTo->dyn ) s
0f90: 71 6c 69 74 65 46 72 65 65 28 28 63 68 61 72 2a  qliteFree((char*
0fa0: 29 70 54 6f 2d 3e 7a 29 3b 0a 20 20 69 66 28 20  )pTo->z);.  if( 
0fb0: 70 46 72 6f 6d 2d 3e 7a 20 29 7b 0a 20 20 20 20  pFrom->z ){.    
0fc0: 70 54 6f 2d 3e 6e 20 3d 20 70 46 72 6f 6d 2d 3e  pTo->n = pFrom->
0fd0: 6e 3b 0a 20 20 20 20 70 54 6f 2d 3e 7a 20 3d 20  n;.    pTo->z = 
0fe0: 73 71 6c 69 74 65 53 74 72 4e 44 75 70 28 70 46  sqliteStrNDup(pF
0ff0: 72 6f 6d 2d 3e 7a 2c 20 70 46 72 6f 6d 2d 3e 6e  rom->z, pFrom->n
1000: 29 3b 0a 20 20 20 20 70 54 6f 2d 3e 64 79 6e 20  );.    pTo->dyn 
1010: 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 1;.  }else{.  
1020: 20 20 70 54 6f 2d 3e 7a 20 3d 20 30 3b 0a 20 20    pTo->z = 0;.  
1030: 7d 0a 7d 0a 45 78 70 72 4c 69 73 74 20 2a 73 71  }.}.ExprList *sq
1040: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
1050: 28 45 78 70 72 4c 69 73 74 20 2a 70 29 7b 0a 20  (ExprList *p){. 
1060: 20 45 78 70 72 4c 69 73 74 20 2a 70 4e 65 77 3b   ExprList *pNew;
1070: 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69  .  struct ExprLi
1080: 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
1090: 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70    int i;.  if( p
10a0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
10b0: 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 4d    pNew = sqliteM
10c0: 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70  alloc( sizeof(*p
10d0: 4e 65 77 29 20 29 3b 0a 20 20 69 66 28 20 70 4e  New) );.  if( pN
10e0: 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ew==0 ) return 0
10f0: 3b 0a 20 20 70 4e 65 77 2d 3e 6e 45 78 70 72 20  ;.  pNew->nExpr 
1100: 3d 20 70 4e 65 77 2d 3e 6e 41 6c 6c 6f 63 20 3d  = pNew->nAlloc =
1110: 20 70 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 4e 65   p->nExpr;.  pNe
1120: 77 2d 3e 61 20 3d 20 70 49 74 65 6d 20 3d 20 73  w->a = pItem = s
1130: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70 2d 3e  qliteMalloc( p->
1140: 6e 45 78 70 72 2a 73 69 7a 65 6f 66 28 70 2d 3e  nExpr*sizeof(p->
1150: 61 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 70  a[0]) );.  if( p
1160: 49 74 65 6d 3d 3d 30 20 29 20 72 65 74 75 72 6e  Item==0 ) return
1170: 20 30 3b 20 20 2f 2a 20 4c 65 61 6b 73 20 6d 65   0;  /* Leaks me
1180: 6d 6f 72 79 20 61 66 74 65 72 20 61 20 6d 61 6c  mory after a mal
1190: 6c 6f 63 20 66 61 69 6c 75 72 65 20 2a 2f 0a 20  loc failure */. 
11a0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
11b0: 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d  Expr; i++, pItem
11c0: 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
11d0: 4e 65 77 45 78 70 72 2c 20 2a 70 4f 6c 64 45 78  NewExpr, *pOldEx
11e0: 70 72 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 70  pr;.    pItem->p
11f0: 45 78 70 72 20 3d 20 70 4e 65 77 45 78 70 72 20  Expr = pNewExpr 
1200: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
1210: 28 70 4f 6c 64 45 78 70 72 20 3d 20 70 2d 3e 61  (pOldExpr = p->a
1220: 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [i].pExpr);.    
1230: 69 66 28 20 70 4f 6c 64 45 78 70 72 2d 3e 73 70  if( pOldExpr->sp
1240: 61 6e 2e 7a 21 3d 30 20 26 26 20 70 4e 65 77 45  an.z!=0 && pNewE
1250: 78 70 72 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  xpr ){.      /* 
1260: 41 6c 77 61 79 73 20 6d 61 6b 65 20 61 20 63 6f  Always make a co
1270: 70 79 20 6f 66 20 74 68 65 20 73 70 61 6e 20 66  py of the span f
1280: 6f 72 20 74 6f 70 2d 6c 65 76 65 6c 20 65 78 70  or top-level exp
1290: 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 0a  ressions in the.
12a0: 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65 73 73        ** express
12b0: 69 6f 6e 20 6c 69 73 74 2e 20 20 54 68 65 20 6c  ion list.  The l
12c0: 6f 67 69 63 20 69 6e 20 53 45 4c 45 43 54 20 70  ogic in SELECT p
12d0: 72 6f 63 65 73 73 69 6e 67 20 74 68 61 74 20 64  rocessing that d
12e0: 65 74 65 72 6d 69 6e 65 73 0a 20 20 20 20 20 20  etermines.      
12f0: 2a 2a 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20  ** the names of 
1300: 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72  columns in the r
1310: 65 73 75 6c 74 20 73 65 74 20 6e 65 65 64 73 20  esult set needs 
1320: 74 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  this information
1330: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
1340: 33 54 6f 6b 65 6e 43 6f 70 79 28 26 70 4e 65 77  3TokenCopy(&pNew
1350: 45 78 70 72 2d 3e 73 70 61 6e 2c 20 26 70 4f 6c  Expr->span, &pOl
1360: 64 45 78 70 72 2d 3e 73 70 61 6e 29 3b 0a 20 20  dExpr->span);.  
1370: 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
1380: 70 4e 65 77 45 78 70 72 3d 3d 30 20 7c 7c 20 70  pNewExpr==0 || p
1390: 4e 65 77 45 78 70 72 2d 3e 73 70 61 6e 2e 7a 21  NewExpr->span.z!
13a0: 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  =0 .            
13b0: 7c 7c 20 70 4f 6c 64 45 78 70 72 2d 3e 73 70 61  || pOldExpr->spa
13c0: 6e 2e 7a 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65  n.z==0 || sqlite
13d0: 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20  3_malloc_failed 
13e0: 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 4e  );.    pItem->zN
13f0: 61 6d 65 20 3d 20 73 71 6c 69 74 65 53 74 72 44  ame = sqliteStrD
1400: 75 70 28 70 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  up(p->a[i].zName
1410: 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 73 6f  );.    pItem->so
1420: 72 74 4f 72 64 65 72 20 3d 20 70 2d 3e 61 5b 69  rtOrder = p->a[i
1430: 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20  ].sortOrder;.   
1440: 20 70 49 74 65 6d 2d 3e 69 73 41 67 67 20 3d 20   pItem->isAgg = 
1450: 70 2d 3e 61 5b 69 5d 2e 69 73 41 67 67 3b 0a 20  p->a[i].isAgg;. 
1460: 20 20 20 70 49 74 65 6d 2d 3e 64 6f 6e 65 20 3d     pItem->done =
1470: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
1480: 20 70 4e 65 77 3b 0a 7d 0a 53 72 63 4c 69 73 74   pNew;.}.SrcList
1490: 20 2a 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74   *sqlite3SrcList
14a0: 44 75 70 28 53 72 63 4c 69 73 74 20 2a 70 29 7b  Dup(SrcList *p){
14b0: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 4e 65 77  .  SrcList *pNew
14c0: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ;.  int i;.  int
14d0: 20 6e 42 79 74 65 3b 0a 20 20 69 66 28 20 70 3d   nByte;.  if( p=
14e0: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
14f0: 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28   nByte = sizeof(
1500: 2a 70 29 20 2b 20 28 70 2d 3e 6e 53 72 63 3e 30  *p) + (p->nSrc>0
1510: 20 3f 20 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30   ? sizeof(p->a[0
1520: 5d 29 20 2a 20 28 70 2d 3e 6e 53 72 63 2d 31 29  ]) * (p->nSrc-1)
1530: 20 3a 20 30 29 3b 0a 20 20 70 4e 65 77 20 3d 20   : 0);.  pNew = 
1540: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28  sqliteMallocRaw(
1550: 20 6e 42 79 74 65 20 29 3b 0a 20 20 69 66 28 20   nByte );.  if( 
1560: 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e  pNew==0 ) return
1570: 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e 53 72 63   0;.  pNew->nSrc
1580: 20 3d 20 70 4e 65 77 2d 3e 6e 41 6c 6c 6f 63 20   = pNew->nAlloc 
1590: 3d 20 70 2d 3e 6e 53 72 63 3b 0a 20 20 66 6f 72  = p->nSrc;.  for
15a0: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 53 72 63 3b  (i=0; i<p->nSrc;
15b0: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63   i++){.    struc
15c0: 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
15d0: 70 4e 65 77 49 74 65 6d 20 3d 20 26 70 4e 65 77  pNewItem = &pNew
15e0: 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 73 74 72 75  ->a[i];.    stru
15f0: 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
1600: 2a 70 4f 6c 64 49 74 65 6d 20 3d 20 26 70 2d 3e  *pOldItem = &p->
1610: 61 5b 69 5d 3b 0a 20 20 20 20 70 4e 65 77 49 74  a[i];.    pNewIt
1620: 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d 20  em->zDatabase = 
1630: 73 71 6c 69 74 65 53 74 72 44 75 70 28 70 4f 6c  sqliteStrDup(pOl
1640: 64 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65  dItem->zDatabase
1650: 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  );.    pNewItem-
1660: 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 53  >zName = sqliteS
1670: 74 72 44 75 70 28 70 4f 6c 64 49 74 65 6d 2d 3e  trDup(pOldItem->
1680: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77  zName);.    pNew
1690: 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 73  Item->zAlias = s
16a0: 71 6c 69 74 65 53 74 72 44 75 70 28 70 4f 6c 64  qliteStrDup(pOld
16b0: 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20  Item->zAlias);. 
16c0: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 6a 6f 69     pNewItem->joi
16d0: 6e 74 79 70 65 20 3d 20 70 4f 6c 64 49 74 65 6d  ntype = pOldItem
16e0: 2d 3e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20  ->jointype;.    
16f0: 70 4e 65 77 49 74 65 6d 2d 3e 69 43 75 72 73 6f  pNewItem->iCurso
1700: 72 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 43  r = pOldItem->iC
1710: 75 72 73 6f 72 3b 0a 20 20 20 20 70 4e 65 77 49  ursor;.    pNewI
1720: 74 65 6d 2d 3e 70 54 61 62 20 3d 20 30 3b 0a 20  tem->pTab = 0;. 
1730: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 53 65     pNewItem->pSe
1740: 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65  lect = sqlite3Se
1750: 6c 65 63 74 44 75 70 28 70 4f 6c 64 49 74 65 6d  lectDup(pOldItem
1760: 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  ->pSelect);.    
1770: 70 4e 65 77 49 74 65 6d 2d 3e 70 4f 6e 20 3d 20  pNewItem->pOn = 
1780: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70  sqlite3ExprDup(p
1790: 4f 6c 64 49 74 65 6d 2d 3e 70 4f 6e 29 3b 0a 20  OldItem->pOn);. 
17a0: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 55 73     pNewItem->pUs
17b0: 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 49 64 4c  ing = sqlite3IdL
17c0: 69 73 74 44 75 70 28 70 4f 6c 64 49 74 65 6d 2d  istDup(pOldItem-
17d0: 3e 70 55 73 69 6e 67 29 3b 0a 20 20 7d 0a 20 20  >pUsing);.  }.  
17e0: 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 49  return pNew;.}.I
17f0: 64 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 49 64  dList *sqlite3Id
1800: 4c 69 73 74 44 75 70 28 49 64 4c 69 73 74 20 2a  ListDup(IdList *
1810: 70 29 7b 0a 20 20 49 64 4c 69 73 74 20 2a 70 4e  p){.  IdList *pN
1820: 65 77 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  ew;.  int i;.  i
1830: 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
1840: 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c   0;.  pNew = sql
1850: 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 73 69  iteMallocRaw( si
1860: 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20  zeof(*pNew) );. 
1870: 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72   if( pNew==0 ) r
1880: 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d  eturn 0;.  pNew-
1890: 3e 6e 49 64 20 3d 20 70 4e 65 77 2d 3e 6e 41 6c  >nId = pNew->nAl
18a0: 6c 6f 63 20 3d 20 70 2d 3e 6e 49 64 3b 0a 20 20  loc = p->nId;.  
18b0: 70 4e 65 77 2d 3e 61 20 3d 20 73 71 6c 69 74 65  pNew->a = sqlite
18c0: 4d 61 6c 6c 6f 63 52 61 77 28 20 70 2d 3e 6e 49  MallocRaw( p->nI
18d0: 64 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d  d*sizeof(p->a[0]
18e0: 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d  ) );.  if( pNew-
18f0: 3e 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  >a==0 ) return 0
1900: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
1910: 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nId; i++){.   
1920: 20 73 74 72 75 63 74 20 49 64 4c 69 73 74 5f 69   struct IdList_i
1930: 74 65 6d 20 2a 70 4e 65 77 49 74 65 6d 20 3d 20  tem *pNewItem = 
1940: 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b 0a 20 20 20  &pNew->a[i];.   
1950: 20 73 74 72 75 63 74 20 49 64 4c 69 73 74 5f 69   struct IdList_i
1960: 74 65 6d 20 2a 70 4f 6c 64 49 74 65 6d 20 3d 20  tem *pOldItem = 
1970: 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 70 4e  &p->a[i];.    pN
1980: 65 77 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20  ewItem->zName = 
1990: 73 71 6c 69 74 65 53 74 72 44 75 70 28 70 4f 6c  sqliteStrDup(pOl
19a0: 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  dItem->zName);. 
19b0: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 69 64 78     pNewItem->idx
19c0: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 64 78   = pOldItem->idx
19d0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
19e0: 4e 65 77 3b 0a 7d 0a 53 65 6c 65 63 74 20 2a 73  New;.}.Select *s
19f0: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28  qlite3SelectDup(
1a00: 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 53 65  Select *p){.  Se
1a10: 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20 20 69 66  lect *pNew;.  if
1a20: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( p==0 ) return 
1a30: 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  0;.  pNew = sqli
1a40: 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 73 69 7a  teMallocRaw( siz
1a50: 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69 66 28  eof(*p) );.  if(
1a60: 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72   pNew==0 ) retur
1a70: 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 69 73 44  n 0;.  pNew->isD
1a80: 69 73 74 69 6e 63 74 20 3d 20 70 2d 3e 69 73 44  istinct = p->isD
1a90: 69 73 74 69 6e 63 74 3b 0a 20 20 70 4e 65 77 2d  istinct;.  pNew-
1aa0: 3e 70 45 4c 69 73 74 20 3d 20 73 71 6c 69 74 65  >pEList = sqlite
1ab0: 33 45 78 70 72 4c 69 73 74 44 75 70 28 70 2d 3e  3ExprListDup(p->
1ac0: 70 45 4c 69 73 74 29 3b 0a 20 20 70 4e 65 77 2d  pEList);.  pNew-
1ad0: 3e 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33 53  >pSrc = sqlite3S
1ae0: 72 63 4c 69 73 74 44 75 70 28 70 2d 3e 70 53 72  rcListDup(p->pSr
1af0: 63 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 57 68 65  c);.  pNew->pWhe
1b00: 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  re = sqlite3Expr
1b10: 44 75 70 28 70 2d 3e 70 57 68 65 72 65 29 3b 0a  Dup(p->pWhere);.
1b20: 20 20 70 4e 65 77 2d 3e 70 47 72 6f 75 70 42 79    pNew->pGroupBy
1b30: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
1b40: 73 74 44 75 70 28 70 2d 3e 70 47 72 6f 75 70 42  stDup(p->pGroupB
1b50: 79 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 48 61 76  y);.  pNew->pHav
1b60: 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ing = sqlite3Exp
1b70: 72 44 75 70 28 70 2d 3e 70 48 61 76 69 6e 67 29  rDup(p->pHaving)
1b80: 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72  ;.  pNew->pOrder
1b90: 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  By = sqlite3Expr
1ba0: 4c 69 73 74 44 75 70 28 70 2d 3e 70 4f 72 64 65  ListDup(p->pOrde
1bb0: 72 42 79 29 3b 0a 20 20 70 4e 65 77 2d 3e 6f 70  rBy);.  pNew->op
1bc0: 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 70 4e 65 77   = p->op;.  pNew
1bd0: 2d 3e 70 50 72 69 6f 72 20 3d 20 73 71 6c 69 74  ->pPrior = sqlit
1be0: 65 33 53 65 6c 65 63 74 44 75 70 28 70 2d 3e 70  e3SelectDup(p->p
1bf0: 50 72 69 6f 72 29 3b 0a 20 20 70 4e 65 77 2d 3e  Prior);.  pNew->
1c00: 6e 4c 69 6d 69 74 20 3d 20 70 2d 3e 6e 4c 69 6d  nLimit = p->nLim
1c10: 69 74 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4f 66 66  it;.  pNew->nOff
1c20: 73 65 74 20 3d 20 70 2d 3e 6e 4f 66 66 73 65 74  set = p->nOffset
1c30: 3b 0a 20 20 70 4e 65 77 2d 3e 7a 53 65 6c 65 63  ;.  pNew->zSelec
1c40: 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 69  t = 0;.  pNew->i
1c50: 4c 69 6d 69 74 20 3d 20 2d 31 3b 0a 20 20 70 4e  Limit = -1;.  pN
1c60: 65 77 2d 3e 69 4f 66 66 73 65 74 20 3d 20 2d 31  ew->iOffset = -1
1c70: 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b  ;.  return pNew;
1c80: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  .}.../*.** Add a
1c90: 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20   new element to 
1ca0: 74 68 65 20 65 6e 64 20 6f 66 20 61 6e 20 65 78  the end of an ex
1cb0: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20 20  pression list.  
1cc0: 49 66 20 70 4c 69 73 74 20 69 73 0a 2a 2a 20 69  If pList is.** i
1cd0: 6e 69 74 69 61 6c 6c 79 20 4e 55 4c 4c 2c 20 74  nitially NULL, t
1ce0: 68 65 6e 20 63 72 65 61 74 65 20 61 20 6e 65 77  hen create a new
1cf0: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
1d00: 2e 0a 2a 2f 0a 45 78 70 72 4c 69 73 74 20 2a 73  ..*/.ExprList *s
1d10: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
1d20: 70 65 6e 64 28 45 78 70 72 4c 69 73 74 20 2a 70  pend(ExprList *p
1d30: 4c 69 73 74 2c 20 45 78 70 72 20 2a 70 45 78 70  List, Expr *pExp
1d40: 72 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29  r, Token *pName)
1d50: 7b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  {.  if( pList==0
1d60: 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20   ){.    pList = 
1d70: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69  sqliteMalloc( si
1d80: 7a 65 6f 66 28 45 78 70 72 4c 69 73 74 29 20 29  zeof(ExprList) )
1d90: 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d  ;.    if( pList=
1da0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 73  =0 ){.      /* s
1db0: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
1dc0: 28 70 45 78 70 72 29 3b 20 2f 2f 20 4c 65 61 6b  (pExpr); // Leak
1dd0: 20 6d 65 6d 6f 72 79 20 69 66 20 6d 61 6c 6c 6f   memory if mallo
1de0: 63 20 66 61 69 6c 73 20 2a 2f 0a 20 20 20 20 20  c fails */.     
1df0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
1e00: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69  .    assert( pLi
1e10: 73 74 2d 3e 6e 41 6c 6c 6f 63 3d 3d 30 20 29 3b  st->nAlloc==0 );
1e20: 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c 69 73 74  .  }.  if( pList
1e30: 2d 3e 6e 41 6c 6c 6f 63 3c 3d 70 4c 69 73 74 2d  ->nAlloc<=pList-
1e40: 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 70 4c  >nExpr ){.    pL
1e50: 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70 4c  ist->nAlloc = pL
1e60: 69 73 74 2d 3e 6e 41 6c 6c 6f 63 2a 32 20 2b 20  ist->nAlloc*2 + 
1e70: 34 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 20  4;.    pList->a 
1e80: 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28  = sqliteRealloc(
1e90: 70 4c 69 73 74 2d 3e 61 2c 20 70 4c 69 73 74 2d  pList->a, pList-
1ea0: 3e 6e 41 6c 6c 6f 63 2a 73 69 7a 65 6f 66 28 70  >nAlloc*sizeof(p
1eb0: 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20  List->a[0]));.  
1ec0: 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 61 3d 3d    if( pList->a==
1ed0: 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 73 71  0 ){.      /* sq
1ee0: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
1ef0: 70 45 78 70 72 29 3b 20 2f 2f 20 4c 65 61 6b 20  pExpr); // Leak 
1f00: 6d 65 6d 6f 72 79 20 69 66 20 6d 61 6c 6c 6f 63  memory if malloc
1f10: 20 66 61 69 6c 73 20 2a 2f 0a 20 20 20 20 20 20   fails */.      
1f20: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3d 20 70  pList->nExpr = p
1f30: 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 30  List->nAlloc = 0
1f40: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  ;.      return p
1f50: 4c 69 73 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  List;.    }.  }.
1f60: 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d    assert( pList-
1f70: 3e 61 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  >a!=0 );.  if( p
1f80: 45 78 70 72 20 7c 7c 20 70 4e 61 6d 65 20 29 7b  Expr || pName ){
1f90: 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72  .    struct Expr
1fa0: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
1fb0: 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69   = &pList->a[pLi
1fc0: 73 74 2d 3e 6e 45 78 70 72 2b 2b 5d 3b 0a 20 20  st->nExpr++];.  
1fd0: 20 20 6d 65 6d 73 65 74 28 70 49 74 65 6d 2c 20    memset(pItem, 
1fe0: 30 2c 20 73 69 7a 65 6f 66 28 2a 70 49 74 65 6d  0, sizeof(*pItem
1ff0: 29 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 70  ));.    pItem->p
2000: 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20  Expr = pExpr;.  
2010: 20 20 69 66 28 20 70 4e 61 6d 65 20 29 7b 0a 20    if( pName ){. 
2020: 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 4e       sqlite3SetN
2030: 53 74 72 69 6e 67 28 26 70 49 74 65 6d 2d 3e 7a  String(&pItem->z
2040: 4e 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e 7a 2c 20  Name, pName->z, 
2050: 70 4e 61 6d 65 2d 3e 6e 2c 20 30 29 3b 0a 20 20  pName->n, 0);.  
2060: 20 20 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f      sqlite3Dequo
2070: 74 65 28 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29  te(pItem->zName)
2080: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
2090: 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f  turn pList;.}../
20a0: 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 65  *.** Delete an e
20b0: 6e 74 69 72 65 20 65 78 70 72 65 73 73 69 6f 6e  ntire expression
20c0: 20 6c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73   list..*/.void s
20d0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
20e0: 6c 65 74 65 28 45 78 70 72 4c 69 73 74 20 2a 70  lete(ExprList *p
20f0: 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  List){.  int i;.
2100: 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
2110: 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72   return;.  asser
2120: 74 28 20 70 4c 69 73 74 2d 3e 61 21 3d 30 20 7c  t( pList->a!=0 |
2130: 7c 20 28 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3d  | (pList->nExpr=
2140: 3d 30 20 26 26 20 70 4c 69 73 74 2d 3e 6e 41 6c  =0 && pList->nAl
2150: 6c 6f 63 3d 3d 30 29 20 29 3b 0a 20 20 61 73 73  loc==0) );.  ass
2160: 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70  ert( pList->nExp
2170: 72 3c 3d 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63  r<=pList->nAlloc
2180: 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   );.  for(i=0; i
2190: 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  <pList->nExpr; i
21a0: 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
21b0: 45 78 70 72 44 65 6c 65 74 65 28 70 4c 69 73 74  ExprDelete(pList
21c0: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[i].pExpr);. 
21d0: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c     sqliteFree(pL
21e0: 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29  ist->a[i].zName)
21f0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72  ;.  }.  sqliteFr
2200: 65 65 28 70 4c 69 73 74 2d 3e 61 29 3b 0a 20 20  ee(pList->a);.  
2210: 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74  sqliteFree(pList
2220: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b  );.}../*.** Walk
2230: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74   an expression t
2240: 72 65 65 2e 20 20 52 65 74 75 72 6e 20 31 20 69  ree.  Return 1 i
2250: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
2260: 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20   is constant.** 
2270: 61 6e 64 20 30 20 69 66 20 69 74 20 69 6e 76 6f  and 0 if it invo
2280: 6c 76 65 73 20 76 61 72 69 61 62 6c 65 73 2e 0a  lves variables..
2290: 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70 75  **.** For the pu
22a0: 72 70 6f 73 65 73 20 6f 66 20 74 68 69 73 20 66  rposes of this f
22b0: 75 6e 63 74 69 6f 6e 2c 20 61 20 64 6f 75 62 6c  unction, a doubl
22c0: 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20  e-quoted string 
22d0: 28 65 78 3a 20 22 61 62 63 22 29 0a 2a 2a 20 69  (ex: "abc").** i
22e0: 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20 76  s considered a v
22f0: 61 72 69 61 62 6c 65 20 62 75 74 20 61 20 73 69  ariable but a si
2300: 6e 67 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69  ngle-quoted stri
2310: 6e 67 20 28 65 78 3a 20 27 61 62 63 27 29 20 69  ng (ex: 'abc') i
2320: 73 0a 2a 2a 20 61 20 63 6f 6e 73 74 61 6e 74 2e  s.** a constant.
2330: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
2340: 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 45 78  xprIsConstant(Ex
2350: 70 72 20 2a 70 29 7b 0a 20 20 73 77 69 74 63 68  pr *p){.  switch
2360: 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63  ( p->op ){.    c
2370: 61 73 65 20 54 4b 5f 49 44 3a 0a 20 20 20 20 63  ase TK_ID:.    c
2380: 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20  ase TK_COLUMN:. 
2390: 20 20 20 63 61 73 65 20 54 4b 5f 44 4f 54 3a 0a     case TK_DOT:.
23a0: 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43      case TK_FUNC
23b0: 54 49 4f 4e 3a 0a 20 20 20 20 20 20 72 65 74 75  TION:.      retu
23c0: 72 6e 20 30 3b 0a 20 20 20 20 63 61 73 65 20 54  rn 0;.    case T
23d0: 4b 5f 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65  K_NULL:.    case
23e0: 20 54 4b 5f 53 54 52 49 4e 47 3a 0a 20 20 20 20   TK_STRING:.    
23f0: 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a  case TK_INTEGER:
2400: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f  .    case TK_FLO
2410: 41 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  AT:.    case TK_
2420: 56 41 52 49 41 42 4c 45 3a 0a 20 20 20 20 20 20  VARIABLE:.      
2430: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 64 65  return 1;.    de
2440: 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 69  fault: {.      i
2450: 66 28 20 70 2d 3e 70 4c 65 66 74 20 26 26 20 21  f( p->pLeft && !
2460: 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
2470: 73 74 61 6e 74 28 70 2d 3e 70 4c 65 66 74 29 20  stant(p->pLeft) 
2480: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
2490: 20 20 69 66 28 20 70 2d 3e 70 52 69 67 68 74 20    if( p->pRight 
24a0: 26 26 20 21 73 71 6c 69 74 65 33 45 78 70 72 49  && !sqlite3ExprI
24b0: 73 43 6f 6e 73 74 61 6e 74 28 70 2d 3e 70 52 69  sConstant(p->pRi
24c0: 67 68 74 29 20 29 20 72 65 74 75 72 6e 20 30 3b  ght) ) return 0;
24d0: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4c  .      if( p->pL
24e0: 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ist ){.        i
24f0: 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20 66 6f  nt i;.        fo
2500: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 70 4c 69 73  r(i=0; i<p->pLis
2510: 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
2520: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 73            if( !s
2530: 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
2540: 74 61 6e 74 28 70 2d 3e 70 4c 69 73 74 2d 3e 61  tant(p->pList->a
2550: 5b 69 5d 2e 70 45 78 70 72 29 20 29 20 72 65 74  [i].pExpr) ) ret
2560: 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  urn 0;.        }
2570: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
2580: 65 74 75 72 6e 20 70 2d 3e 70 4c 65 66 74 21 3d  eturn p->pLeft!=
2590: 30 20 7c 7c 20 70 2d 3e 70 52 69 67 68 74 21 3d  0 || p->pRight!=
25a0: 30 20 7c 7c 20 28 70 2d 3e 70 4c 69 73 74 20 26  0 || (p->pList &
25b0: 26 20 70 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70  & p->pList->nExp
25c0: 72 3e 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  r>0);.    }.  }.
25d0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
25e0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 67 69 76 65  *.** If the give
25f0: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 63 6f 64  n expression cod
2600: 65 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 69 6e  es a constant in
2610: 74 65 67 65 72 20 74 68 61 74 20 69 73 20 73 6d  teger that is sm
2620: 61 6c 6c 20 65 6e 6f 75 67 68 0a 2a 2a 20 74 6f  all enough.** to
2630: 20 66 69 74 20 69 6e 20 61 20 33 32 2d 62 69 74   fit in a 32-bit
2640: 20 69 6e 74 65 67 65 72 2c 20 72 65 74 75 72 6e   integer, return
2650: 20 31 20 61 6e 64 20 70 75 74 20 74 68 65 20 76   1 and put the v
2660: 61 6c 75 65 20 6f 66 20 74 68 65 20 69 6e 74 65  alue of the inte
2670: 67 65 72 0a 2a 2a 20 69 6e 20 2a 70 56 61 6c 75  ger.** in *pValu
2680: 65 2e 20 20 49 66 20 74 68 65 20 65 78 70 72 65  e.  If the expre
2690: 73 73 69 6f 6e 20 69 73 20 6e 6f 74 20 61 6e 20  ssion is not an 
26a0: 69 6e 74 65 67 65 72 20 6f 72 20 69 66 20 69 74  integer or if it
26b0: 20 69 73 20 74 6f 6f 20 62 69 67 0a 2a 2a 20 74   is too big.** t
26c0: 6f 20 66 69 74 20 69 6e 20 61 20 73 69 67 6e 65  o fit in a signe
26d0: 64 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72  d 32-bit integer
26e0: 2c 20 72 65 74 75 72 6e 20 30 20 61 6e 64 20 6c  , return 0 and l
26f0: 65 61 76 65 20 2a 70 56 61 6c 75 65 20 75 6e 63  eave *pValue unc
2700: 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  hanged..*/.int s
2710: 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65  qlite3ExprIsInte
2720: 67 65 72 28 45 78 70 72 20 2a 70 2c 20 69 6e 74  ger(Expr *p, int
2730: 20 2a 70 56 61 6c 75 65 29 7b 0a 20 20 73 77 69   *pValue){.  swi
2740: 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20  tch( p->op ){.  
2750: 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45    case TK_INTEGE
2760: 52 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 73  R: {.      if( s
2770: 71 6c 69 74 65 33 46 69 74 73 49 6e 33 32 42 69  qlite3FitsIn32Bi
2780: 74 73 28 70 2d 3e 74 6f 6b 65 6e 2e 7a 29 20 29  ts(p->token.z) )
2790: 7b 0a 20 20 20 20 20 20 20 20 2a 70 56 61 6c 75  {.        *pValu
27a0: 65 20 3d 20 61 74 6f 69 28 70 2d 3e 74 6f 6b 65  e = atoi(p->toke
27b0: 6e 2e 7a 29 3b 0a 20 20 20 20 20 20 20 20 72 65  n.z);.        re
27c0: 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a  turn 1;.      }.
27d0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
27e0: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53   }.    case TK_S
27f0: 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20 63  TRING: {.      c
2800: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 70  onst char *z = p
2810: 2d 3e 74 6f 6b 65 6e 2e 7a 3b 0a 20 20 20 20 20  ->token.z;.     
2820: 20 69 6e 74 20 6e 20 3d 20 70 2d 3e 74 6f 6b 65   int n = p->toke
2830: 6e 2e 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  n.n;.      if( n
2840: 3e 30 20 26 26 20 7a 5b 30 5d 3d 3d 27 2d 27 20  >0 && z[0]=='-' 
2850: 29 7b 20 7a 2b 2b 3b 20 6e 2d 2d 3b 20 7d 0a 20  ){ z++; n--; }. 
2860: 20 20 20 20 20 77 68 69 6c 65 28 20 6e 3e 30 20       while( n>0 
2870: 26 26 20 2a 7a 20 26 26 20 69 73 64 69 67 69 74  && *z && isdigit
2880: 28 2a 7a 29 20 29 7b 20 7a 2b 2b 3b 20 6e 2d 2d  (*z) ){ z++; n--
2890: 3b 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 3d  ; }.      if( n=
28a0: 3d 30 20 26 26 20 73 71 6c 69 74 65 33 46 69 74  =0 && sqlite3Fit
28b0: 73 49 6e 33 32 42 69 74 73 28 70 2d 3e 74 6f 6b  sIn32Bits(p->tok
28c0: 65 6e 2e 7a 29 20 29 7b 0a 20 20 20 20 20 20 20  en.z) ){.       
28d0: 20 2a 70 56 61 6c 75 65 20 3d 20 61 74 6f 69 28   *pValue = atoi(
28e0: 70 2d 3e 74 6f 6b 65 6e 2e 7a 29 3b 0a 20 20 20  p->token.z);.   
28f0: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
2900: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
2910: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
2920: 73 65 20 54 4b 5f 55 50 4c 55 53 3a 20 7b 0a 20  se TK_UPLUS: {. 
2930: 20 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69       return sqli
2940: 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72  te3ExprIsInteger
2950: 28 70 2d 3e 70 4c 65 66 74 2c 20 70 56 61 6c 75  (p->pLeft, pValu
2960: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  e);.    }.    ca
2970: 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a  se TK_UMINUS: {.
2980: 20 20 20 20 20 20 69 6e 74 20 76 3b 0a 20 20 20        int v;.   
2990: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
29a0: 70 72 49 73 49 6e 74 65 67 65 72 28 70 2d 3e 70  prIsInteger(p->p
29b0: 4c 65 66 74 2c 20 26 76 29 20 29 7b 0a 20 20 20  Left, &v) ){.   
29c0: 20 20 20 20 20 2a 70 56 61 6c 75 65 20 3d 20 2d       *pValue = -
29d0: 76 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  v;.        retur
29e0: 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 1;.      }.   
29f0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
2a00: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 62 72 65      default: bre
2a10: 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ak;.  }.  return
2a20: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74   0;.}../*.** Ret
2a30: 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
2a40: 67 69 76 65 6e 20 73 74 72 69 6e 67 20 69 73 20  given string is 
2a50: 61 20 72 6f 77 2d 69 64 20 63 6f 6c 75 6d 6e 20  a row-id column 
2a60: 6e 61 6d 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  name..*/.int sql
2a70: 69 74 65 33 49 73 52 6f 77 69 64 28 63 6f 6e 73  ite3IsRowid(cons
2a80: 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 66  t char *z){.  if
2a90: 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
2aa0: 28 7a 2c 20 22 5f 52 4f 57 49 44 5f 22 29 3d 3d  (z, "_ROWID_")==
2ab0: 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
2ac0: 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
2ad0: 6d 70 28 7a 2c 20 22 52 4f 57 49 44 22 29 3d 3d  mp(z, "ROWID")==
2ae0: 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
2af0: 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
2b00: 6d 70 28 7a 2c 20 22 4f 49 44 22 29 3d 3d 30 20  mp(z, "OID")==0 
2b10: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 72 65  ) return 1;.  re
2b20: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
2b30: 20 47 69 76 65 6e 20 74 68 65 20 6e 61 6d 65 20   Given the name 
2b40: 6f 66 20 61 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  of a column of t
2b50: 68 65 20 66 6f 72 6d 20 58 2e 59 2e 5a 20 6f 72  he form X.Y.Z or
2b60: 20 59 2e 5a 20 6f 72 20 6a 75 73 74 20 5a 2c 20   Y.Z or just Z, 
2b70: 6c 6f 6f 6b 20 75 70 0a 2a 2a 20 74 68 61 74 20  look up.** that 
2b80: 6e 61 6d 65 20 69 6e 20 74 68 65 20 73 65 74 20  name in the set 
2b90: 6f 66 20 73 6f 75 72 63 65 20 74 61 62 6c 65 73  of source tables
2ba0: 20 69 6e 20 70 53 72 63 4c 69 73 74 20 61 6e 64   in pSrcList and
2bb0: 20 6d 61 6b 65 20 74 68 65 20 70 45 78 70 72 20   make the pExpr 
2bc0: 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6e  .** expression n
2bd0: 6f 64 65 20 72 65 66 65 72 20 62 61 63 6b 20 74  ode refer back t
2be0: 6f 20 74 68 61 74 20 73 6f 75 72 63 65 20 63 6f  o that source co
2bf0: 6c 75 6d 6e 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  lumn.  The follo
2c00: 77 69 6e 67 20 63 68 61 6e 67 65 73 0a 2a 2a 20  wing changes.** 
2c10: 61 72 65 20 6d 61 64 65 20 74 6f 20 70 45 78 70  are made to pExp
2c20: 72 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 70 45 78 70  r:.**.**    pExp
2c30: 72 2d 3e 69 44 62 20 20 20 20 20 20 20 20 20 20  r->iDb          
2c40: 20 53 65 74 20 74 68 65 20 69 6e 64 65 78 20 69   Set the index i
2c50: 6e 20 64 62 2d 3e 61 44 62 5b 5d 20 6f 66 20 74  n db->aDb[] of t
2c60: 68 65 20 64 61 74 61 62 61 73 65 20 68 6f 6c 64  he database hold
2c70: 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ing.**          
2c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
2c90: 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20  he table..**    
2ca0: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 20 20  pExpr->iTable   
2cb0: 20 20 20 20 20 53 65 74 20 74 6f 20 74 68 65 20       Set to the 
2cc0: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f  cursor number fo
2cd0: 72 20 74 68 65 20 74 61 62 6c 65 20 6f 62 74 61  r the table obta
2ce0: 69 6e 65 64 0a 2a 2a 20 20 20 20 20 20 20 20 20  ined.**         
2cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d00: 66 72 6f 6d 20 70 53 72 63 4c 69 73 74 2e 0a 2a  from pSrcList..*
2d10: 2a 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c  *    pExpr->iCol
2d20: 75 6d 6e 20 20 20 20 20 20 20 53 65 74 20 74 6f  umn       Set to
2d30: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62   the column numb
2d40: 65 72 20 77 69 74 68 69 6e 20 74 68 65 20 74 61  er within the ta
2d50: 62 6c 65 2e 0a 2a 2a 20 20 20 20 70 45 78 70 72  ble..**    pExpr
2d60: 2d 3e 64 61 74 61 54 79 70 65 20 20 20 20 20 20  ->dataType      
2d70: 53 65 74 20 74 6f 20 74 68 65 20 61 70 70 72 6f  Set to the appro
2d80: 70 72 69 61 74 65 20 64 61 74 61 20 74 79 70 65  priate data type
2d90: 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 2e   for the column.
2da0: 0a 2a 2a 20 20 20 20 70 45 78 70 72 2d 3e 6f 70  .**    pExpr->op
2db0: 20 20 20 20 20 20 20 20 20 20 20 20 53 65 74 20              Set 
2dc0: 74 6f 20 54 4b 5f 43 4f 4c 55 4d 4e 2e 0a 2a 2a  to TK_COLUMN..**
2dd0: 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74      pExpr->pLeft
2de0: 20 20 20 20 20 20 20 20 20 41 6e 79 20 65 78 70           Any exp
2df0: 72 65 73 73 69 6f 6e 20 74 68 69 73 20 70 6f 69  ression this poi
2e00: 6e 74 73 20 74 6f 20 69 73 20 64 65 6c 65 74 65  nts to is delete
2e10: 64 0a 2a 2a 20 20 20 20 70 45 78 70 72 2d 3e 70  d.**    pExpr->p
2e20: 52 69 67 68 74 20 20 20 20 20 20 20 20 41 6e 79  Right        Any
2e30: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 69 73   expression this
2e40: 20 70 6f 69 6e 74 73 20 74 6f 20 69 73 20 64 65   points to is de
2e50: 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  leted..**.** The
2e60: 20 70 44 62 54 6f 6b 65 6e 20 69 73 20 74 68 65   pDbToken is the
2e70: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   name of the dat
2e80: 61 62 61 73 65 20 28 74 68 65 20 22 58 22 29 2e  abase (the "X").
2e90: 20 20 54 68 69 73 20 76 61 6c 75 65 20 6d 61 79    This value may
2ea0: 20 62 65 0a 2a 2a 20 4e 55 4c 4c 20 6d 65 61 6e   be.** NULL mean
2eb0: 69 6e 67 20 74 68 61 74 20 6e 61 6d 65 20 69 73  ing that name is
2ec0: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 59 2e 5a   of the form Y.Z
2ed0: 20 6f 72 20 5a 2e 20 20 41 6e 79 20 61 76 61 69   or Z.  Any avai
2ee0: 6c 61 62 6c 65 20 64 61 74 61 62 61 73 65 0a 2a  lable database.*
2ef0: 2a 20 63 61 6e 20 62 65 20 75 73 65 64 2e 20 20  * can be used.  
2f00: 54 68 65 20 70 54 61 62 6c 65 54 6f 6b 65 6e 20  The pTableToken 
2f10: 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  is the name of t
2f20: 68 65 20 74 61 62 6c 65 20 28 74 68 65 20 22 59  he table (the "Y
2f30: 22 29 2e 20 20 54 68 69 73 0a 2a 2a 20 76 61 6c  ").  This.** val
2f40: 75 65 20 63 61 6e 20 62 65 20 4e 55 4c 4c 20 69  ue can be NULL i
2f50: 66 20 70 44 62 54 6f 6b 65 6e 20 69 73 20 61 6c  f pDbToken is al
2f60: 73 6f 20 4e 55 4c 4c 2e 20 20 49 66 20 70 54 61  so NULL.  If pTa
2f70: 62 6c 65 54 6f 6b 65 6e 20 69 73 20 4e 55 4c 4c  bleToken is NULL
2f80: 20 69 74 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 61   it.** means tha
2f90: 74 20 74 68 65 20 66 6f 72 6d 20 6f 66 20 74 68  t the form of th
2fa0: 65 20 6e 61 6d 65 20 69 73 20 5a 20 61 6e 64 20  e name is Z and 
2fb0: 74 68 61 74 20 63 6f 6c 75 6d 6e 73 20 66 72 6f  that columns fro
2fc0: 6d 20 61 6e 79 20 74 61 62 6c 65 0a 2a 2a 20 63  m any table.** c
2fd0: 61 6e 20 62 65 20 75 73 65 64 2e 0a 2a 2a 0a 2a  an be used..**.*
2fe0: 2a 20 49 66 20 74 68 65 20 6e 61 6d 65 20 63 61  * If the name ca
2ff0: 6e 6e 6f 74 20 62 65 20 72 65 73 6f 6c 76 65 64  nnot be resolved
3000: 20 75 6e 61 6d 62 69 67 75 6f 75 73 6c 79 2c 20   unambiguously, 
3010: 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d  leave an error m
3020: 65 73 73 61 67 65 0a 2a 2a 20 69 6e 20 70 50 61  essage.** in pPa
3030: 72 73 65 20 61 6e 64 20 72 65 74 75 72 6e 20 6e  rse and return n
3040: 6f 6e 2d 7a 65 72 6f 2e 20 20 52 65 74 75 72 6e  on-zero.  Return
3050: 20 7a 65 72 6f 20 6f 6e 20 73 75 63 63 65 73 73   zero on success
3060: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
3070: 6c 6f 6f 6b 75 70 4e 61 6d 65 28 0a 20 20 50 61  lookupName(.  Pa
3080: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
3090: 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67    /* The parsing
30a0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f   context */.  To
30b0: 6b 65 6e 20 2a 70 44 62 54 6f 6b 65 6e 2c 20 20  ken *pDbToken,  
30c0: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
30d0: 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61  e database conta
30e0: 69 6e 69 6e 67 20 74 61 62 6c 65 2c 20 6f 72 20  ining table, or 
30f0: 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  NULL */.  Token 
3100: 2a 70 54 61 62 6c 65 54 6f 6b 65 6e 2c 20 20 2f  *pTableToken,  /
3110: 2a 20 4e 61 6d 65 20 6f 66 20 74 61 62 6c 65 20  * Name of table 
3120: 63 6f 6e 74 61 69 6e 69 6e 67 20 63 6f 6c 75 6d  containing colum
3130: 6e 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20  n, or NULL */.  
3140: 54 6f 6b 65 6e 20 2a 70 43 6f 6c 75 6d 6e 54 6f  Token *pColumnTo
3150: 6b 65 6e 2c 20 2f 2a 20 4e 61 6d 65 20 6f 66 20  ken, /* Name of 
3160: 74 68 65 20 63 6f 6c 75 6d 6e 2e 20 2a 2f 0a 20  the column. */. 
3170: 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 4c 69   SrcList *pSrcLi
3180: 73 74 2c 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66  st,   /* List of
3190: 20 74 61 62 6c 65 73 20 75 73 65 64 20 74 6f 20   tables used to 
31a0: 72 65 73 6f 6c 76 65 20 63 6f 6c 75 6d 6e 20 6e  resolve column n
31b0: 61 6d 65 73 20 2a 2f 0a 20 20 45 78 70 72 4c 69  ames */.  ExprLi
31c0: 73 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 20 2f  st *pEList,    /
31d0: 2a 20 4c 69 73 74 20 6f 66 20 65 78 70 72 65 73  * List of expres
31e0: 73 69 6f 6e 73 20 75 73 65 64 20 74 6f 20 72 65  sions used to re
31f0: 73 6f 6c 76 65 20 22 41 53 22 20 2a 2f 0a 20 20  solve "AS" */.  
3200: 45 78 70 72 20 2a 70 45 78 70 72 20 20 20 20 20  Expr *pExpr     
3210: 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 74 68 69       /* Make thi
3220: 73 20 45 58 50 52 20 6e 6f 64 65 20 70 6f 69 6e  s EXPR node poin
3230: 74 20 74 6f 20 74 68 65 20 73 65 6c 65 63 74 65  t to the selecte
3240: 64 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 29 7b 0a 20  d column */.){. 
3250: 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 30 3b 20   char *zDb = 0; 
3260: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
3270: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
3280: 54 68 65 20 22 58 22 20 69 6e 20 58 2e 59 2e 5a  The "X" in X.Y.Z
3290: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 54 61 62   */.  char *zTab
32a0: 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4e 61   = 0;      /* Na
32b0: 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e  me of the table.
32c0: 20 20 54 68 65 20 22 59 22 20 69 6e 20 58 2e 59    The "Y" in X.Y
32d0: 2e 5a 20 6f 72 20 59 2e 5a 20 2a 2f 0a 20 20 63  .Z or Y.Z */.  c
32e0: 68 61 72 20 2a 7a 43 6f 6c 20 3d 20 30 3b 20 20  har *zCol = 0;  
32f0: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
3300: 68 65 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 65 20  he column.  The 
3310: 22 5a 22 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20  "Z" */.  int i, 
3320: 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  j;            /*
3330: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a   Loop counters *
3340: 2f 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b  /.  int cnt = 0;
3350: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
3360: 65 72 20 6f 66 20 6d 61 74 63 68 69 6e 67 20 63  er of matching c
3370: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20  olumn names */. 
3380: 20 69 6e 74 20 63 6e 74 54 61 62 20 3d 20 30 3b   int cntTab = 0;
3390: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
33a0: 6f 66 20 6d 61 74 63 68 69 6e 67 20 74 61 62 6c  of matching tabl
33b0: 65 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 73 71 6c  e names */.  sql
33c0: 69 74 65 20 2a 64 62 20 3d 20 70 50 61 72 73 65  ite *db = pParse
33d0: 2d 3e 64 62 3b 20 20 2f 2a 20 54 68 65 20 64 61  ->db;  /* The da
33e0: 74 61 62 61 73 65 20 2a 2f 0a 0a 20 20 61 73 73  tabase */..  ass
33f0: 65 72 74 28 20 70 43 6f 6c 75 6d 6e 54 6f 6b 65  ert( pColumnToke
3400: 6e 20 26 26 20 70 43 6f 6c 75 6d 6e 54 6f 6b 65  n && pColumnToke
3410: 6e 2d 3e 7a 20 29 3b 20 2f 2a 20 54 68 65 20 5a  n->z ); /* The Z
3420: 20 69 6e 20 58 2e 59 2e 5a 20 63 61 6e 6e 6f 74   in X.Y.Z cannot
3430: 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 66   be NULL */.  if
3440: 28 20 70 44 62 54 6f 6b 65 6e 20 26 26 20 70 44  ( pDbToken && pD
3450: 62 54 6f 6b 65 6e 2d 3e 7a 20 29 7b 0a 20 20 20  bToken->z ){.   
3460: 20 7a 44 62 20 3d 20 73 71 6c 69 74 65 53 74 72   zDb = sqliteStr
3470: 4e 44 75 70 28 70 44 62 54 6f 6b 65 6e 2d 3e 7a  NDup(pDbToken->z
3480: 2c 20 70 44 62 54 6f 6b 65 6e 2d 3e 6e 29 3b 0a  , pDbToken->n);.
3490: 20 20 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f      sqlite3Dequo
34a0: 74 65 28 7a 44 62 29 3b 0a 20 20 7d 65 6c 73 65  te(zDb);.  }else
34b0: 7b 0a 20 20 20 20 7a 44 62 20 3d 20 30 3b 0a 20  {.    zDb = 0;. 
34c0: 20 7d 0a 20 20 69 66 28 20 70 54 61 62 6c 65 54   }.  if( pTableT
34d0: 6f 6b 65 6e 20 26 26 20 70 54 61 62 6c 65 54 6f  oken && pTableTo
34e0: 6b 65 6e 2d 3e 7a 20 29 7b 0a 20 20 20 20 7a 54  ken->z ){.    zT
34f0: 61 62 20 3d 20 73 71 6c 69 74 65 53 74 72 4e 44  ab = sqliteStrND
3500: 75 70 28 70 54 61 62 6c 65 54 6f 6b 65 6e 2d 3e  up(pTableToken->
3510: 7a 2c 20 70 54 61 62 6c 65 54 6f 6b 65 6e 2d 3e  z, pTableToken->
3520: 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  n);.    sqlite3D
3530: 65 71 75 6f 74 65 28 7a 54 61 62 29 3b 0a 20 20  equote(zTab);.  
3540: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
3550: 74 28 20 7a 44 62 3d 3d 30 20 29 3b 0a 20 20 20  t( zDb==0 );.   
3560: 20 7a 54 61 62 20 3d 20 30 3b 0a 20 20 7d 0a 20   zTab = 0;.  }. 
3570: 20 7a 43 6f 6c 20 3d 20 73 71 6c 69 74 65 53 74   zCol = sqliteSt
3580: 72 4e 44 75 70 28 70 43 6f 6c 75 6d 6e 54 6f 6b  rNDup(pColumnTok
3590: 65 6e 2d 3e 7a 2c 20 70 43 6f 6c 75 6d 6e 54 6f  en->z, pColumnTo
35a0: 6b 65 6e 2d 3e 6e 29 3b 0a 20 20 73 71 6c 69 74  ken->n);.  sqlit
35b0: 65 33 44 65 71 75 6f 74 65 28 7a 43 6f 6c 29 3b  e3Dequote(zCol);
35c0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 6d  .  if( sqlite3_m
35d0: 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 7b 0a  alloc_failed ){.
35e0: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 20 20 2f      return 1;  /
35f0: 2a 20 4c 65 61 6b 20 6d 65 6d 6f 72 79 20 28 7a  * Leak memory (z
3600: 44 62 20 61 6e 64 20 7a 54 61 62 29 20 69 66 20  Db and zTab) if 
3610: 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20 2a 2f 0a  malloc fails */.
3620: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 7a 54    }.  assert( zT
3630: 61 62 3d 3d 30 20 7c 7c 20 70 45 4c 69 73 74 3d  ab==0 || pEList=
3640: 3d 30 20 29 3b 0a 0a 20 20 70 45 78 70 72 2d 3e  =0 );..  pExpr->
3650: 69 54 61 62 6c 65 20 3d 20 2d 31 3b 0a 20 20 66  iTable = -1;.  f
3660: 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72 63 4c 69  or(i=0; i<pSrcLi
3670: 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a  st->nSrc; i++){.
3680: 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
3690: 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d  st_item *pItem =
36a0: 20 26 70 53 72 63 4c 69 73 74 2d 3e 61 5b 69 5d   &pSrcList->a[i]
36b0: 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  ;.    Table *pTa
36c0: 62 20 3d 20 70 49 74 65 6d 2d 3e 70 54 61 62 3b  b = pItem->pTab;
36d0: 0a 20 20 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f  .    Column *pCo
36e0: 6c 3b 0a 0a 20 20 20 20 69 66 28 20 70 54 61 62  l;..    if( pTab
36f0: 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
3700: 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62      assert( pTab
3710: 2d 3e 6e 43 6f 6c 3e 30 20 29 3b 0a 20 20 20 20  ->nCol>0 );.    
3720: 69 66 28 20 7a 54 61 62 20 29 7b 0a 20 20 20 20  if( zTab ){.    
3730: 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 41 6c    if( pItem->zAl
3740: 69 61 73 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ias ){.        c
3750: 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65 20 3d 20  har *zTabName = 
3760: 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 3b 0a 20  pItem->zAlias;. 
3770: 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
3780: 65 33 53 74 72 49 43 6d 70 28 7a 54 61 62 4e 61  e3StrICmp(zTabNa
3790: 6d 65 2c 20 7a 54 61 62 29 21 3d 30 20 29 20 63  me, zTab)!=0 ) c
37a0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d  ontinue;.      }
37b0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63 68  else{.        ch
37c0: 61 72 20 2a 7a 54 61 62 4e 61 6d 65 20 3d 20 70  ar *zTabName = p
37d0: 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20  Tab->zName;.    
37e0: 20 20 20 20 69 66 28 20 7a 54 61 62 4e 61 6d 65      if( zTabName
37f0: 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 53 74  ==0 || sqlite3St
3800: 72 49 43 6d 70 28 7a 54 61 62 4e 61 6d 65 2c 20  rICmp(zTabName, 
3810: 7a 54 61 62 29 21 3d 30 20 29 20 63 6f 6e 74 69  zTab)!=0 ) conti
3820: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  nue;.        if(
3830: 20 7a 44 62 21 3d 30 20 26 26 20 73 71 6c 69 74   zDb!=0 && sqlit
3840: 65 33 53 74 72 49 43 6d 70 28 64 62 2d 3e 61 44  e3StrICmp(db->aD
3850: 62 5b 70 54 61 62 2d 3e 69 44 62 5d 2e 7a 4e 61  b[pTab->iDb].zNa
3860: 6d 65 2c 20 7a 44 62 29 21 3d 30 20 29 7b 0a 20  me, zDb)!=0 ){. 
3870: 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
3880: 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
3890: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
38a0: 66 28 20 30 3d 3d 28 63 6e 74 54 61 62 2b 2b 29  f( 0==(cntTab++)
38b0: 20 29 7b 0a 20 20 20 20 20 20 70 45 78 70 72 2d   ){.      pExpr-
38c0: 3e 69 54 61 62 6c 65 20 3d 20 70 49 74 65 6d 2d  >iTable = pItem-
38d0: 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20  >iCursor;.      
38e0: 70 45 78 70 72 2d 3e 69 44 62 20 3d 20 70 54 61  pExpr->iDb = pTa
38f0: 62 2d 3e 69 44 62 3b 0a 20 20 20 20 7d 0a 20 20  b->iDb;.    }.  
3900: 20 20 66 6f 72 28 6a 3d 30 2c 20 70 43 6f 6c 3d    for(j=0, pCol=
3910: 70 54 61 62 2d 3e 61 43 6f 6c 3b 20 6a 3c 70 54  pTab->aCol; j<pT
3920: 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 2c 20 70  ab->nCol; j++, p
3930: 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  Col++){.      if
3940: 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
3950: 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a 43  (pCol->zName, zC
3960: 6f 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ol)==0 ){.      
3970: 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20    cnt++;.       
3980: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d   pExpr->iTable =
3990: 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b   pItem->iCursor;
39a0: 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e  .        pExpr->
39b0: 69 44 62 20 3d 20 70 54 61 62 2d 3e 69 44 62 3b  iDb = pTab->iDb;
39c0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 75 62 73  .        /* Subs
39d0: 74 69 74 75 74 65 20 74 68 65 20 72 6f 77 69 64  titute the rowid
39e0: 20 28 63 6f 6c 75 6d 6e 20 2d 31 29 20 66 6f 72   (column -1) for
39f0: 20 74 68 65 20 49 4e 54 45 47 45 52 20 50 52 49   the INTEGER PRI
3a00: 4d 41 52 59 20 4b 45 59 20 2a 2f 0a 20 20 20 20  MARY KEY */.    
3a10: 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75      pExpr->iColu
3a20: 6d 6e 20 3d 20 6a 3d 3d 70 54 61 62 2d 3e 69 50  mn = j==pTab->iP
3a30: 4b 65 79 20 3f 20 2d 31 20 3a 20 6a 3b 0a 20 20  Key ? -1 : j;.  
3a40: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 64 61 74        pExpr->dat
3a50: 61 54 79 70 65 20 3d 20 70 43 6f 6c 2d 3e 73 6f  aType = pCol->so
3a60: 72 74 4f 72 64 65 72 20 26 20 53 51 4c 49 54 45  rtOrder & SQLITE
3a70: 5f 53 4f 5f 54 59 50 45 4d 41 53 4b 3b 0a 20 20  _SO_TYPEMASK;.  
3a80: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
3a90: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
3aa0: 20 20 2f 2a 20 49 66 20 77 65 20 68 61 76 65 20    /* If we have 
3ab0: 6e 6f 74 20 61 6c 72 65 61 64 79 20 72 65 73 6f  not already reso
3ac0: 6c 76 65 64 20 74 68 65 20 6e 61 6d 65 2c 20 74  lved the name, t
3ad0: 68 65 6e 20 6d 61 79 62 65 20 0a 20 20 2a 2a 20  hen maybe .  ** 
3ae0: 69 74 20 69 73 20 61 20 6e 65 77 2e 2a 20 6f 72  it is a new.* or
3af0: 20 6f 6c 64 2e 2a 20 74 72 69 67 67 65 72 20 61   old.* trigger a
3b00: 72 67 75 6d 65 6e 74 20 72 65 66 65 72 65 6e 63  rgument referenc
3b10: 65 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 44 62  e.  */.  if( zDb
3b20: 3d 3d 30 20 26 26 20 7a 54 61 62 21 3d 30 20 26  ==0 && zTab!=0 &
3b30: 26 20 63 6e 74 3d 3d 30 20 26 26 20 70 50 61 72  & cnt==0 && pPar
3b40: 73 65 2d 3e 74 72 69 67 53 74 61 63 6b 21 3d 30  se->trigStack!=0
3b50: 20 29 7b 0a 20 20 20 20 54 72 69 67 67 65 72 53   ){.    TriggerS
3b60: 74 61 63 6b 20 2a 70 54 72 69 67 67 65 72 53 74  tack *pTriggerSt
3b70: 61 63 6b 20 3d 20 70 50 61 72 73 65 2d 3e 74 72  ack = pParse->tr
3b80: 69 67 53 74 61 63 6b 3b 0a 20 20 20 20 54 61 62  igStack;.    Tab
3b90: 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b 0a 20 20  le *pTab = 0;.  
3ba0: 20 20 69 66 28 20 70 54 72 69 67 67 65 72 53 74    if( pTriggerSt
3bb0: 61 63 6b 2d 3e 6e 65 77 49 64 78 20 21 3d 20 2d  ack->newIdx != -
3bc0: 31 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49  1 && sqlite3StrI
3bd0: 43 6d 70 28 22 6e 65 77 22 2c 20 7a 54 61 62 29  Cmp("new", zTab)
3be0: 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20 20 20 70   == 0 ){.      p
3bf0: 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70  Expr->iTable = p
3c00: 54 72 69 67 67 65 72 53 74 61 63 6b 2d 3e 6e 65  TriggerStack->ne
3c10: 77 49 64 78 3b 0a 20 20 20 20 20 20 61 73 73 65  wIdx;.      asse
3c20: 72 74 28 20 70 54 72 69 67 67 65 72 53 74 61 63  rt( pTriggerStac
3c30: 6b 2d 3e 70 54 61 62 20 29 3b 0a 20 20 20 20 20  k->pTab );.     
3c40: 20 70 54 61 62 20 3d 20 70 54 72 69 67 67 65 72   pTab = pTrigger
3c50: 53 74 61 63 6b 2d 3e 70 54 61 62 3b 0a 20 20 20  Stack->pTab;.   
3c60: 20 7d 65 6c 73 65 20 69 66 28 20 70 54 72 69 67   }else if( pTrig
3c70: 67 65 72 53 74 61 63 6b 2d 3e 6f 6c 64 49 64 78  gerStack->oldIdx
3c80: 20 21 3d 20 2d 31 20 26 26 20 73 71 6c 69 74 65   != -1 && sqlite
3c90: 33 53 74 72 49 43 6d 70 28 22 6f 6c 64 22 2c 20  3StrICmp("old", 
3ca0: 7a 54 61 62 29 20 3d 3d 20 30 20 29 7b 0a 20 20  zTab) == 0 ){.  
3cb0: 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c      pExpr->iTabl
3cc0: 65 20 3d 20 70 54 72 69 67 67 65 72 53 74 61 63  e = pTriggerStac
3cd0: 6b 2d 3e 6f 6c 64 49 64 78 3b 0a 20 20 20 20 20  k->oldIdx;.     
3ce0: 20 61 73 73 65 72 74 28 20 70 54 72 69 67 67 65   assert( pTrigge
3cf0: 72 53 74 61 63 6b 2d 3e 70 54 61 62 20 29 3b 0a  rStack->pTab );.
3d00: 20 20 20 20 20 20 70 54 61 62 20 3d 20 70 54 72        pTab = pTr
3d10: 69 67 67 65 72 53 74 61 63 6b 2d 3e 70 54 61 62  iggerStack->pTab
3d20: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
3d30: 20 70 54 61 62 20 29 7b 20 0a 20 20 20 20 20 20   pTab ){ .      
3d40: 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 43 6f 6c  int j;.      Col
3d50: 75 6d 6e 20 2a 70 43 6f 6c 20 3d 20 70 54 61 62  umn *pCol = pTab
3d60: 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 20 20 0a 20  ->aCol;.      . 
3d70: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 44 62 20       pExpr->iDb 
3d80: 3d 20 70 54 61 62 2d 3e 69 44 62 3b 0a 20 20 20  = pTab->iDb;.   
3d90: 20 20 20 63 6e 74 54 61 62 2b 2b 3b 0a 20 20 20     cntTab++;.   
3da0: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 20 3c 20     for(j=0; j < 
3db0: 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 2c  pTab->nCol; j++,
3dc0: 20 70 43 6f 6c 2b 2b 29 20 7b 0a 20 20 20 20 20   pCol++) {.     
3dd0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
3de0: 72 49 43 6d 70 28 70 43 6f 6c 2d 3e 7a 4e 61 6d  rICmp(pCol->zNam
3df0: 65 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 7b 0a 20  e, zCol)==0 ){. 
3e00: 20 20 20 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a           cnt++;.
3e10: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
3e20: 3e 69 43 6f 6c 75 6d 6e 20 3d 20 6a 3d 3d 70 54  >iColumn = j==pT
3e30: 61 62 2d 3e 69 50 4b 65 79 20 3f 20 2d 31 20 3a  ab->iPKey ? -1 :
3e40: 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 70 45   j;.          pE
3e50: 78 70 72 2d 3e 64 61 74 61 54 79 70 65 20 3d 20  xpr->dataType = 
3e60: 70 43 6f 6c 2d 3e 73 6f 72 74 4f 72 64 65 72 20  pCol->sortOrder 
3e70: 26 20 53 51 4c 49 54 45 5f 53 4f 5f 54 59 50 45  & SQLITE_SO_TYPE
3e80: 4d 41 53 4b 3b 0a 20 20 20 20 20 20 20 20 20 20  MASK;.          
3e90: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
3ea0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
3eb0: 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 50 65   }..  /*.  ** Pe
3ec0: 72 68 61 70 73 20 74 68 65 20 6e 61 6d 65 20 69  rhaps the name i
3ed0: 73 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  s a reference to
3ee0: 20 74 68 65 20 52 4f 57 49 44 0a 20 20 2a 2f 0a   the ROWID.  */.
3ef0: 20 20 69 66 28 20 63 6e 74 3d 3d 30 20 26 26 20    if( cnt==0 && 
3f00: 63 6e 74 54 61 62 3d 3d 31 20 26 26 20 73 71 6c  cntTab==1 && sql
3f10: 69 74 65 33 49 73 52 6f 77 69 64 28 7a 43 6f 6c  ite3IsRowid(zCol
3f20: 29 20 29 7b 0a 20 20 20 20 63 6e 74 20 3d 20 31  ) ){.    cnt = 1
3f30: 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f  ;.    pExpr->iCo
3f40: 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 70  lumn = -1;.    p
3f50: 45 78 70 72 2d 3e 64 61 74 61 54 79 70 65 20 3d  Expr->dataType =
3f60: 20 53 51 4c 49 54 45 5f 53 4f 5f 4e 55 4d 3b 0a   SQLITE_SO_NUM;.
3f70: 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49    }..  /*.  ** I
3f80: 66 20 74 68 65 20 69 6e 70 75 74 20 69 73 20 6f  f the input is o
3f90: 66 20 74 68 65 20 66 6f 72 6d 20 5a 20 28 6e 6f  f the form Z (no
3fa0: 74 20 59 2e 5a 20 6f 72 20 58 2e 59 2e 5a 29 20  t Y.Z or X.Y.Z) 
3fb0: 74 68 65 6e 20 74 68 65 20 6e 61 6d 65 20 5a 0a  then the name Z.
3fc0: 20 20 2a 2a 20 6d 69 67 68 74 20 72 65 66 65 72    ** might refer
3fd0: 20 74 6f 20 61 6e 20 72 65 73 75 6c 74 2d 73 65   to an result-se
3fe0: 74 20 61 6c 69 61 73 2e 20 20 54 68 69 73 20 68  t alias.  This h
3ff0: 61 70 70 65 6e 73 2c 20 66 6f 72 20 65 78 61 6d  appens, for exam
4000: 70 6c 65 2c 20 77 68 65 6e 0a 20 20 2a 2a 20 77  ple, when.  ** w
4010: 65 20 61 72 65 20 72 65 73 6f 6c 76 69 6e 67 20  e are resolving 
4020: 6e 61 6d 65 73 20 69 6e 20 74 68 65 20 57 48 45  names in the WHE
4030: 52 45 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  RE clause of the
4040: 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d 6d 61   following comma
4050: 6e 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  nd:.  **.  **   
4060: 20 20 53 45 4c 45 43 54 20 61 2b 62 20 41 53 20    SELECT a+b AS 
4070: 78 20 46 52 4f 4d 20 74 61 62 6c 65 20 57 48 45  x FROM table WHE
4080: 52 45 20 78 3c 31 30 3b 0a 20 20 2a 2a 0a 20 20  RE x<10;.  **.  
4090: 2a 2a 20 49 6e 20 63 61 73 65 73 20 6c 69 6b 65  ** In cases like
40a0: 20 74 68 69 73 2c 20 72 65 70 6c 61 63 65 20 70   this, replace p
40b0: 45 78 70 72 20 77 69 74 68 20 61 20 63 6f 70 79  Expr with a copy
40c0: 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
40d0: 6f 6e 20 74 68 61 74 0a 20 20 2a 2a 20 66 6f 72  on that.  ** for
40e0: 6d 73 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  ms the result se
40f0: 74 20 65 6e 74 72 79 20 28 22 61 2b 62 22 20 69  t entry ("a+b" i
4100: 6e 20 74 68 65 20 65 78 61 6d 70 6c 65 29 20 61  n the example) a
4110: 6e 64 20 72 65 74 75 72 6e 20 69 6d 6d 65 64 69  nd return immedi
4120: 61 74 65 6c 79 2e 0a 20 20 2a 2a 20 4e 6f 74 65  ately..  ** Note
4130: 20 74 68 61 74 20 74 68 65 20 65 78 70 72 65 73   that the expres
4140: 73 69 6f 6e 20 69 6e 20 74 68 65 20 72 65 73 75  sion in the resu
4150: 6c 74 20 73 65 74 20 73 68 6f 75 6c 64 20 68 61  lt set should ha
4160: 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 0a  ve already been.
4170: 20 20 2a 2a 20 72 65 73 6f 6c 76 65 64 20 62 79    ** resolved by
4180: 20 74 68 65 20 74 69 6d 65 20 74 68 65 20 57 48   the time the WH
4190: 45 52 45 20 63 6c 61 75 73 65 20 69 73 20 72 65  ERE clause is re
41a0: 73 6f 6c 76 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  solved..  */.  i
41b0: 66 28 20 63 6e 74 3d 3d 30 20 26 26 20 70 45 4c  f( cnt==0 && pEL
41c0: 69 73 74 21 3d 30 20 29 7b 0a 20 20 20 20 66 6f  ist!=0 ){.    fo
41d0: 72 28 6a 3d 30 3b 20 6a 3c 70 45 4c 69 73 74 2d  r(j=0; j<pEList-
41e0: 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20  >nExpr; j++){.  
41f0: 20 20 20 20 63 68 61 72 20 2a 7a 41 73 20 3d 20      char *zAs = 
4200: 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61  pEList->a[j].zNa
4210: 6d 65 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 41  me;.      if( zA
4220: 73 21 3d 30 20 26 26 20 73 71 6c 69 74 65 33 53  s!=0 && sqlite3S
4230: 74 72 49 43 6d 70 28 7a 41 73 2c 20 7a 43 6f 6c  trICmp(zAs, zCol
4240: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
4250: 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70  assert( pExpr->p
4260: 4c 65 66 74 3d 3d 30 20 26 26 20 70 45 78 70 72  Left==0 && pExpr
4270: 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20  ->pRight==0 );. 
4280: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70         pExpr->op
4290: 20 3d 20 54 4b 5f 41 53 3b 0a 20 20 20 20 20 20   = TK_AS;.      
42a0: 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e    pExpr->iColumn
42b0: 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 70 45   = j;.        pE
42c0: 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20 73 71 6c  xpr->pLeft = sql
42d0: 69 74 65 33 45 78 70 72 44 75 70 28 70 45 4c 69  ite3ExprDup(pELi
42e0: 73 74 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72 29 3b  st->a[j].pExpr);
42f0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 46  .        sqliteF
4300: 72 65 65 28 7a 43 6f 6c 29 3b 0a 20 20 20 20 20  ree(zCol);.     
4310: 20 20 20 61 73 73 65 72 74 28 20 7a 54 61 62 3d     assert( zTab=
4320: 3d 30 20 26 26 20 7a 44 62 3d 3d 30 20 29 3b 0a  =0 && zDb==0 );.
4330: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30          return 0
4340: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20  ;.      }.    } 
4350: 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
4360: 49 66 20 58 20 61 6e 64 20 59 20 61 72 65 20 4e  If X and Y are N
4370: 55 4c 4c 20 28 69 6e 20 6f 74 68 65 72 20 77 6f  ULL (in other wo
4380: 72 64 73 20 69 66 20 6f 6e 6c 79 20 74 68 65 20  rds if only the 
4390: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 5a 20 69 73  column name Z is
43a0: 0a 20 20 2a 2a 20 73 75 70 70 6c 69 65 64 29 20  .  ** supplied) 
43b0: 61 6e 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66  and the value of
43c0: 20 5a 20 69 73 20 65 6e 63 6c 6f 73 65 64 20 69   Z is enclosed i
43d0: 6e 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65 73 2c  n double-quotes,
43e0: 20 74 68 65 6e 0a 20 20 2a 2a 20 5a 20 69 73 20   then.  ** Z is 
43f0: 61 20 73 74 72 69 6e 67 20 6c 69 74 65 72 61 6c  a string literal
4400: 20 69 66 20 69 74 20 64 6f 65 73 6e 27 74 20 6d   if it doesn't m
4410: 61 74 63 68 20 61 6e 79 20 63 6f 6c 75 6d 6e 20  atch any column 
4420: 6e 61 6d 65 73 2e 20 20 49 6e 20 74 68 61 74 0a  names.  In that.
4430: 20 20 2a 2a 20 63 61 73 65 2c 20 77 65 20 6e 65    ** case, we ne
4440: 65 64 20 74 6f 20 72 65 74 75 72 6e 20 72 69 67  ed to return rig
4450: 68 74 20 61 77 61 79 20 61 6e 64 20 6e 6f 74 20  ht away and not 
4460: 6d 61 6b 65 20 61 6e 79 20 63 68 61 6e 67 65 73  make any changes
4470: 20 74 6f 0a 20 20 2a 2a 20 70 45 78 70 72 2e 0a   to.  ** pExpr..
4480: 20 20 2a 2f 0a 20 20 69 66 28 20 63 6e 74 3d 3d    */.  if( cnt==
4490: 30 20 26 26 20 7a 54 61 62 3d 3d 30 20 26 26 20  0 && zTab==0 && 
44a0: 70 43 6f 6c 75 6d 6e 54 6f 6b 65 6e 2d 3e 7a 5b  pColumnToken->z[
44b0: 30 5d 3d 3d 27 22 27 20 29 7b 0a 20 20 20 20 73  0]=='"' ){.    s
44c0: 71 6c 69 74 65 46 72 65 65 28 7a 43 6f 6c 29 3b  qliteFree(zCol);
44d0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
44e0: 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 63 6e   }..  /*.  ** cn
44f0: 74 3d 3d 30 20 6d 65 61 6e 73 20 74 68 65 72 65  t==0 means there
4500: 20 77 61 73 20 6e 6f 74 20 6d 61 74 63 68 2e 20   was not match. 
4510: 20 63 6e 74 3e 31 20 6d 65 61 6e 73 20 74 68 65   cnt>1 means the
4520: 72 65 20 77 65 72 65 20 74 77 6f 20 6f 72 0a 20  re were two or. 
4530: 20 2a 2a 20 6d 6f 72 65 20 6d 61 74 63 68 65 73   ** more matches
4540: 2e 20 20 45 69 74 68 65 72 20 77 61 79 2c 20 77  .  Either way, w
4550: 65 20 68 61 76 65 20 61 6e 20 65 72 72 6f 72 2e  e have an error.
4560: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 6e 74 21  .  */.  if( cnt!
4570: 3d 31 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  =1 ){.    char *
4580: 7a 20 3d 20 30 3b 0a 20 20 20 20 63 68 61 72 20  z = 0;.    char 
4590: 2a 7a 45 72 72 3b 0a 20 20 20 20 7a 45 72 72 20  *zErr;.    zErr 
45a0: 3d 20 63 6e 74 3d 3d 30 20 3f 20 22 6e 6f 20 73  = cnt==0 ? "no s
45b0: 75 63 68 20 63 6f 6c 75 6d 6e 3a 20 25 73 22 20  uch column: %s" 
45c0: 3a 20 22 61 6d 62 69 67 75 6f 75 73 20 63 6f 6c  : "ambiguous col
45d0: 75 6d 6e 20 6e 61 6d 65 3a 20 25 73 22 3b 0a 20  umn name: %s";. 
45e0: 20 20 20 69 66 28 20 7a 44 62 20 29 7b 0a 20 20     if( zDb ){.  
45f0: 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 53 74      sqlite3SetSt
4600: 72 69 6e 67 28 26 7a 2c 20 7a 44 62 2c 20 22 2e  ring(&z, zDb, ".
4610: 22 2c 20 7a 54 61 62 2c 20 22 2e 22 2c 20 7a 43  ", zTab, ".", zC
4620: 6f 6c 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73  ol, 0);.    }els
4630: 65 20 69 66 28 20 7a 54 61 62 20 29 7b 0a 20 20  e if( zTab ){.  
4640: 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 53 74      sqlite3SetSt
4650: 72 69 6e 67 28 26 7a 2c 20 7a 54 61 62 2c 20 22  ring(&z, zTab, "
4660: 2e 22 2c 20 7a 43 6f 6c 2c 20 30 29 3b 0a 20 20  .", zCol, 0);.  
4670: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a    }else{.      z
4680: 20 3d 20 73 71 6c 69 74 65 53 74 72 44 75 70 28   = sqliteStrDup(
4690: 7a 43 6f 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20  zCol);.    }.   
46a0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
46b0: 28 70 50 61 72 73 65 2c 20 7a 45 72 72 2c 20 7a  (pParse, zErr, z
46c0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  );.    sqliteFre
46d0: 65 28 7a 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  e(z);.  }..  /* 
46e0: 43 6c 65 61 6e 20 75 70 20 61 6e 64 20 72 65 74  Clean up and ret
46f0: 75 72 6e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  urn.  */.  sqlit
4700: 65 46 72 65 65 28 7a 44 62 29 3b 0a 20 20 73 71  eFree(zDb);.  sq
4710: 6c 69 74 65 46 72 65 65 28 7a 54 61 62 29 3b 0a  liteFree(zTab);.
4720: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 43 6f    sqliteFree(zCo
4730: 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  l);.  sqlite3Exp
4740: 72 44 65 6c 65 74 65 28 70 45 78 70 72 2d 3e 70  rDelete(pExpr->p
4750: 4c 65 66 74 29 3b 0a 20 20 70 45 78 70 72 2d 3e  Left);.  pExpr->
4760: 70 4c 65 66 74 20 3d 20 30 3b 0a 20 20 73 71 6c  pLeft = 0;.  sql
4770: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70  ite3ExprDelete(p
4780: 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20  Expr->pRight);. 
4790: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20 3d   pExpr->pRight =
47a0: 20 30 3b 0a 20 20 70 45 78 70 72 2d 3e 6f 70 20   0;.  pExpr->op 
47b0: 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 73  = TK_COLUMN;.  s
47c0: 71 6c 69 74 65 33 41 75 74 68 52 65 61 64 28 70  qlite3AuthRead(p
47d0: 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 70 53  Parse, pExpr, pS
47e0: 72 63 4c 69 73 74 29 3b 0a 20 20 72 65 74 75 72  rcList);.  retur
47f0: 6e 20 63 6e 74 21 3d 31 3b 0a 7d 0a 0a 2f 2a 0a  n cnt!=1;.}../*.
4800: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
4810: 77 61 6c 6b 73 20 61 6e 20 65 78 70 72 65 73 73  walks an express
4820: 69 6f 6e 20 74 72 65 65 20 61 6e 64 20 72 65 73  ion tree and res
4830: 6f 6c 76 65 73 20 72 65 66 65 72 65 6e 63 65 73  olves references
4840: 20 74 6f 0a 2a 2a 20 74 61 62 6c 65 20 63 6f 6c   to.** table col
4850: 75 6d 6e 73 2e 20 20 4e 6f 64 65 73 20 6f 66 20  umns.  Nodes of 
4860: 74 68 65 20 66 6f 72 6d 20 49 44 2e 49 44 20 6f  the form ID.ID o
4870: 72 20 49 44 20 72 65 73 6f 6c 76 65 20 69 6e 74  r ID resolve int
4880: 6f 20 61 6e 0a 2a 2a 20 69 6e 64 65 78 20 74 6f  o an.** index to
4890: 20 74 68 65 20 74 61 62 6c 65 20 69 6e 20 74 68   the table in th
48a0: 65 20 74 61 62 6c 65 20 6c 69 73 74 20 61 6e 64  e table list and
48b0: 20 61 20 63 6f 6c 75 6d 6e 20 6f 66 66 73 65 74   a column offset
48c0: 2e 20 20 54 68 65 20 0a 2a 2a 20 45 78 70 72 2e  .  The .** Expr.
48d0: 6f 70 63 6f 64 65 20 66 6f 72 20 73 75 63 68 20  opcode for such 
48e0: 6e 6f 64 65 73 20 69 73 20 63 68 61 6e 67 65 64  nodes is changed
48f0: 20 74 6f 20 54 4b 5f 43 4f 4c 55 4d 4e 2e 20 20   to TK_COLUMN.  
4900: 54 68 65 20 45 78 70 72 2e 69 54 61 62 6c 65 0a  The Expr.iTable.
4910: 2a 2a 20 76 61 6c 75 65 20 69 73 20 63 68 61 6e  ** value is chan
4920: 67 65 64 20 74 6f 20 74 68 65 20 69 6e 64 65 78  ged to the index
4930: 20 6f 66 20 74 68 65 20 72 65 66 65 72 65 6e 63   of the referenc
4940: 65 64 20 74 61 62 6c 65 20 69 6e 20 70 54 61 62  ed table in pTab
4950: 4c 69 73 74 0a 2a 2a 20 70 6c 75 73 20 74 68 65  List.** plus the
4960: 20 22 62 61 73 65 22 20 76 61 6c 75 65 2e 20 20   "base" value.  
4970: 54 68 65 20 62 61 73 65 20 76 61 6c 75 65 20 77  The base value w
4980: 69 6c 6c 20 75 6c 74 69 6d 61 74 65 6c 79 20 62  ill ultimately b
4990: 65 63 6f 6d 65 20 74 68 65 0a 2a 2a 20 56 44 42  ecome the.** VDB
49a0: 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  E cursor number 
49b0: 66 6f 72 20 61 20 63 75 72 73 6f 72 20 74 68 61  for a cursor tha
49c0: 74 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 69 6e  t is pointing in
49d0: 74 6f 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  to the reference
49e0: 64 0a 2a 2a 20 74 61 62 6c 65 2e 20 20 54 68 65  d.** table.  The
49f0: 20 45 78 70 72 2e 69 43 6f 6c 75 6d 6e 20 76 61   Expr.iColumn va
4a00: 6c 75 65 20 69 73 20 63 68 61 6e 67 65 64 20 74  lue is changed t
4a10: 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74  o the index of t
4a20: 68 65 20 63 6f 6c 75 6d 6e 20 0a 2a 2a 20 6f 66  he column .** of
4a30: 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 64 20   the referenced 
4a40: 74 61 62 6c 65 2e 20 20 54 68 65 20 45 78 70 72  table.  The Expr
4a50: 2e 69 43 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 66  .iColumn value f
4a60: 6f 72 20 74 68 65 20 73 70 65 63 69 61 6c 0a 2a  or the special.*
4a70: 2a 20 52 4f 57 49 44 20 63 6f 6c 75 6d 6e 20 69  * ROWID column i
4a80: 73 20 2d 31 2e 20 20 41 6e 79 20 49 4e 54 45 47  s -1.  Any INTEG
4a90: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63  ER PRIMARY KEY c
4aa0: 6f 6c 75 6d 6e 20 69 73 20 74 72 69 65 64 20 61  olumn is tried a
4ab0: 73 20 61 6e 0a 2a 2a 20 61 6c 69 61 73 20 66 6f  s an.** alias fo
4ac0: 72 20 52 4f 57 49 44 2e 0a 2a 2a 0a 2a 2a 20 57  r ROWID..**.** W
4ad0: 65 20 61 6c 73 6f 20 63 68 65 63 6b 20 66 6f 72  e also check for
4ae0: 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68   instances of th
4af0: 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 2e 20 20  e IN operator.  
4b00: 49 4e 20 63 6f 6d 65 73 20 69 6e 20 74 77 6f 0a  IN comes in two.
4b10: 2a 2a 20 66 6f 72 6d 73 3a 0a 2a 2a 0a 2a 2a 20  ** forms:.**.** 
4b20: 20 20 20 20 20 20 20 20 20 20 65 78 70 72 20 49            expr I
4b30: 4e 20 28 65 78 70 72 6c 69 73 74 29 0a 2a 2a 20  N (exprlist).** 
4b40: 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  and.**          
4b50: 20 65 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54   expr IN (SELECT
4b60: 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20   ...).**.** The 
4b70: 66 69 72 73 74 20 66 6f 72 6d 20 69 73 20 68 61  first form is ha
4b80: 6e 64 6c 65 64 20 62 79 20 63 72 65 61 74 69 6e  ndled by creatin
4b90: 67 20 61 20 73 65 74 20 68 6f 6c 64 69 6e 67 20  g a set holding 
4ba0: 74 68 65 20 6c 69 73 74 0a 2a 2a 20 6f 66 20 61  the list.** of a
4bb0: 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73 2e 20 20  llowed values.  
4bc0: 54 68 65 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20  The second form 
4bd0: 63 61 75 73 65 73 20 74 68 65 20 53 45 4c 45 43  causes the SELEC
4be0: 54 20 74 6f 20 67 65 6e 65 72 61 74 65 20 0a 2a  T to generate .*
4bf0: 2a 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61  * a temporary ta
4c00: 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ble..**.** This 
4c10: 72 6f 75 74 69 6e 65 20 61 6c 73 6f 20 6c 6f 6f  routine also loo
4c20: 6b 73 20 66 6f 72 20 73 63 61 6c 61 72 20 53 45  ks for scalar SE
4c30: 4c 45 43 54 73 20 74 68 61 74 20 61 72 65 20 70  LECTs that are p
4c40: 61 72 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73  art of an expres
4c50: 73 69 6f 6e 2e 0a 2a 2a 20 49 66 20 69 74 20 66  sion..** If it f
4c60: 69 6e 64 73 20 61 6e 79 2c 20 69 74 20 67 65 6e  inds any, it gen
4c70: 65 72 61 74 65 73 20 63 6f 64 65 20 74 6f 20 77  erates code to w
4c80: 72 69 74 65 20 74 68 65 20 76 61 6c 75 65 20 6f  rite the value o
4c90: 66 20 74 68 61 74 20 73 65 6c 65 63 74 0a 2a 2a  f that select.**
4ca0: 20 69 6e 74 6f 20 61 20 6d 65 6d 6f 72 79 20 63   into a memory c
4cb0: 65 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 55 6e 6b 6e 6f  ell..**.** Unkno
4cc0: 77 6e 20 63 6f 6c 75 6d 6e 73 20 6f 72 20 74 61  wn columns or ta
4cd0: 62 6c 65 73 20 70 72 6f 76 6f 6b 65 20 61 6e 20  bles provoke an 
4ce0: 65 72 72 6f 72 2e 20 20 54 68 65 20 66 75 6e 63  error.  The func
4cf0: 74 69 6f 6e 20 72 65 74 75 72 6e 73 0a 2a 2a 20  tion returns.** 
4d00: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72  the number of er
4d10: 72 6f 72 73 20 73 65 65 6e 20 61 6e 64 20 6c 65  rors seen and le
4d20: 61 76 65 73 20 61 6e 20 65 72 72 6f 72 20 6d 65  aves an error me
4d30: 73 73 61 67 65 20 6f 6e 20 70 50 61 72 73 65 2d  ssage on pParse-
4d40: 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74  >zErrMsg..*/.int
4d50: 20 73 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f   sqlite3ExprReso
4d60: 6c 76 65 49 64 73 28 0a 20 20 50 61 72 73 65 20  lveIds(.  Parse 
4d70: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20  *pParse,     /* 
4d80: 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65  The parser conte
4d90: 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  xt */.  SrcList 
4da0: 2a 70 53 72 63 4c 69 73 74 2c 20 2f 2a 20 4c 69  *pSrcList, /* Li
4db0: 73 74 20 6f 66 20 74 61 62 6c 65 73 20 75 73 65  st of tables use
4dc0: 64 20 74 6f 20 72 65 73 6f 6c 76 65 20 63 6f 6c  d to resolve col
4dd0: 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 45  umn names */.  E
4de0: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c  xprList *pEList,
4df0: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 65 78 70    /* List of exp
4e00: 72 65 73 73 69 6f 6e 73 20 75 73 65 64 20 74 6f  ressions used to
4e10: 20 72 65 73 6f 6c 76 65 20 22 41 53 22 20 2a 2f   resolve "AS" */
4e20: 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 20  .  Expr *pExpr  
4e30: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70        /* The exp
4e40: 72 65 73 73 69 6f 6e 20 74 6f 20 62 65 20 61 6e  ression to be an
4e50: 61 6c 79 7a 65 64 2e 20 2a 2f 0a 29 7b 0a 20 20  alyzed. */.){.  
4e60: 69 6e 74 20 69 3b 0a 0a 20 20 69 66 28 20 70 45  int i;..  if( pE
4e70: 78 70 72 3d 3d 30 20 7c 7c 20 70 53 72 63 4c 69  xpr==0 || pSrcLi
4e80: 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  st==0 ) return 0
4e90: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
4ea0: 53 72 63 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  SrcList->nSrc; i
4eb0: 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ++){.    assert(
4ec0: 20 70 53 72 63 4c 69 73 74 2d 3e 61 5b 69 5d 2e   pSrcList->a[i].
4ed0: 69 43 75 72 73 6f 72 3e 3d 30 20 26 26 20 70 53  iCursor>=0 && pS
4ee0: 72 63 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75  rcList->a[i].iCu
4ef0: 72 73 6f 72 3c 70 50 61 72 73 65 2d 3e 6e 54 61  rsor<pParse->nTa
4f00: 62 20 29 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63  b );.  }.  switc
4f10: 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a  h( pExpr->op ){.
4f20: 20 20 20 20 2f 2a 20 44 6f 75 62 6c 65 2d 71 75      /* Double-qu
4f30: 6f 74 65 64 20 73 74 72 69 6e 67 73 20 28 65 78  oted strings (ex
4f40: 3a 20 22 61 62 63 22 29 20 61 72 65 20 75 73 65  : "abc") are use
4f50: 64 20 61 73 20 69 64 65 6e 74 69 66 69 65 72 73  d as identifiers
4f60: 20 69 66 0a 20 20 20 20 2a 2a 20 70 6f 73 73 69   if.    ** possi
4f70: 62 6c 65 2e 20 20 4f 74 68 65 72 77 69 73 65 20  ble.  Otherwise 
4f80: 74 68 65 79 20 72 65 6d 61 69 6e 20 61 73 20 73  they remain as s
4f90: 74 72 69 6e 67 73 2e 20 20 53 69 6e 67 6c 65 2d  trings.  Single-
4fa0: 71 75 6f 74 65 64 0a 20 20 20 20 2a 2a 20 73 74  quoted.    ** st
4fb0: 72 69 6e 67 73 20 28 65 78 3a 20 27 61 62 63 27  rings (ex: 'abc'
4fc0: 29 20 61 72 65 20 61 6c 77 61 79 73 20 73 74 72  ) are always str
4fd0: 69 6e 67 20 6c 69 74 65 72 61 6c 73 2e 0a 20 20  ing literals..  
4fe0: 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b    */.    case TK
4ff0: 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20  _STRING: {.     
5000: 20 69 66 28 20 70 45 78 70 72 2d 3e 74 6f 6b 65   if( pExpr->toke
5010: 6e 2e 7a 5b 30 5d 3d 3d 27 5c 27 27 20 29 20 62  n.z[0]=='\'' ) b
5020: 72 65 61 6b 3b 0a 20 20 20 20 20 20 2f 2a 20 46  reak;.      /* F
5030: 61 6c 6c 20 74 68 72 75 20 69 6e 74 6f 20 74 68  all thru into th
5040: 65 20 54 4b 5f 49 44 20 63 61 73 65 20 69 66 20  e TK_ID case if 
5050: 74 68 69 73 20 69 73 20 61 20 64 6f 75 62 6c 65  this is a double
5060: 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20 2a  -quoted string *
5070: 2f 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 41  /.    }.    /* A
5080: 20 6c 6f 6e 65 20 69 64 65 6e 74 69 66 69 65 72   lone identifier
5090: 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
50a0: 61 20 63 6f 6c 75 6d 6e 64 2e 0a 20 20 20 20 2a  a columnd..    *
50b0: 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 44  /.    case TK_ID
50c0: 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 6c 6f  : {.      if( lo
50d0: 6f 6b 75 70 4e 61 6d 65 28 70 50 61 72 73 65 2c  okupName(pParse,
50e0: 20 30 2c 20 30 2c 20 26 70 45 78 70 72 2d 3e 74   0, 0, &pExpr->t
50f0: 6f 6b 65 6e 2c 20 70 53 72 63 4c 69 73 74 2c 20  oken, pSrcList, 
5100: 70 45 4c 69 73 74 2c 20 70 45 78 70 72 29 20 29  pEList, pExpr) )
5110: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
5120: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
5130: 20 20 62 72 65 61 6b 3b 20 0a 20 20 20 20 7d 0a    break; .    }.
5140: 20 20 0a 20 20 20 20 2f 2a 20 41 20 74 61 62 6c    .    /* A tabl
5150: 65 20 6e 61 6d 65 20 61 6e 64 20 63 6f 6c 75 6d  e name and colum
5160: 6e 20 6e 61 6d 65 3a 20 20 20 20 20 49 44 2e 49  n name:     ID.I
5170: 44 0a 20 20 20 20 2a 2a 20 4f 72 20 61 20 64 61  D.    ** Or a da
5180: 74 61 62 61 73 65 2c 20 74 61 62 6c 65 20 61 6e  tabase, table an
5190: 64 20 63 6f 6c 75 6d 6e 3a 20 20 49 44 2e 49 44  d column:  ID.ID
51a0: 2e 49 44 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  .ID.    */.    c
51b0: 61 73 65 20 54 4b 5f 44 4f 54 3a 20 7b 0a 20 20  ase TK_DOT: {.  
51c0: 20 20 20 20 54 6f 6b 65 6e 20 2a 70 43 6f 6c 75      Token *pColu
51d0: 6d 6e 3b 0a 20 20 20 20 20 20 54 6f 6b 65 6e 20  mn;.      Token 
51e0: 2a 70 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 54  *pTable;.      T
51f0: 6f 6b 65 6e 20 2a 70 44 62 3b 0a 20 20 20 20 20  oken *pDb;.     
5200: 20 45 78 70 72 20 2a 70 52 69 67 68 74 3b 0a 0a   Expr *pRight;..
5210: 20 20 20 20 20 20 70 52 69 67 68 74 20 3d 20 70        pRight = p
5220: 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20  Expr->pRight;.  
5230: 20 20 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e      if( pRight->
5240: 6f 70 3d 3d 54 4b 5f 49 44 20 29 7b 0a 20 20 20  op==TK_ID ){.   
5250: 20 20 20 20 20 70 44 62 20 3d 20 30 3b 0a 20 20       pDb = 0;.  
5260: 20 20 20 20 20 20 70 54 61 62 6c 65 20 3d 20 26        pTable = &
5270: 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 74 6f  pExpr->pLeft->to
5280: 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20 70 43 6f  ken;.        pCo
5290: 6c 75 6d 6e 20 3d 20 26 70 52 69 67 68 74 2d 3e  lumn = &pRight->
52a0: 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 7d 65 6c  token;.      }el
52b0: 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  se{.        asse
52c0: 72 74 28 20 70 52 69 67 68 74 2d 3e 6f 70 3d 3d  rt( pRight->op==
52d0: 54 4b 5f 44 4f 54 20 29 3b 0a 20 20 20 20 20 20  TK_DOT );.      
52e0: 20 20 70 44 62 20 3d 20 26 70 45 78 70 72 2d 3e    pDb = &pExpr->
52f0: 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 3b 0a 20 20  pLeft->token;.  
5300: 20 20 20 20 20 20 70 54 61 62 6c 65 20 3d 20 26        pTable = &
5310: 70 52 69 67 68 74 2d 3e 70 4c 65 66 74 2d 3e 74  pRight->pLeft->t
5320: 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20 70 43  oken;.        pC
5330: 6f 6c 75 6d 6e 20 3d 20 26 70 52 69 67 68 74 2d  olumn = &pRight-
5340: 3e 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 3b 0a  >pRight->token;.
5350: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
5360: 28 20 6c 6f 6f 6b 75 70 4e 61 6d 65 28 70 50 61  ( lookupName(pPa
5370: 72 73 65 2c 20 70 44 62 2c 20 70 54 61 62 6c 65  rse, pDb, pTable
5380: 2c 20 70 43 6f 6c 75 6d 6e 2c 20 70 53 72 63 4c  , pColumn, pSrcL
5390: 69 73 74 2c 20 30 2c 20 70 45 78 70 72 29 20 29  ist, 0, pExpr) )
53a0: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
53b0: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
53c0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
53d0: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20      case TK_IN: 
53e0: 7b 0a 20 20 20 20 20 20 56 64 62 65 20 2a 76 20  {.      Vdbe *v 
53f0: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
5400: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
5410: 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72  if( v==0 ) retur
5420: 6e 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20 73  n 1;.      if( s
5430: 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76  qlite3ExprResolv
5440: 65 49 64 73 28 70 50 61 72 73 65 2c 20 70 53 72  eIds(pParse, pSr
5450: 63 4c 69 73 74 2c 20 70 45 4c 69 73 74 2c 20 70  cList, pEList, p
5460: 45 78 70 72 2d 3e 70 4c 65 66 74 29 20 29 7b 0a  Expr->pLeft) ){.
5470: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31          return 1
5480: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
5490: 69 66 28 20 70 45 78 70 72 2d 3e 70 53 65 6c 65  if( pExpr->pSele
54a0: 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  ct ){.        /*
54b0: 20 43 61 73 65 20 31 3a 20 20 20 20 20 65 78 70   Case 1:     exp
54c0: 72 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e  r IN (SELECT ...
54d0: 29 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ).        **.   
54e0: 20 20 20 20 20 2a 2a 20 47 65 6e 65 72 61 74 65       ** Generate
54f0: 20 63 6f 64 65 20 74 6f 20 77 72 69 74 65 20 74   code to write t
5500: 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68  he results of th
5510: 65 20 73 65 6c 65 63 74 20 69 6e 74 6f 20 61 20  e select into a 
5520: 74 65 6d 70 6f 72 61 72 79 0a 20 20 20 20 20 20  temporary.      
5530: 20 20 2a 2a 20 74 61 62 6c 65 2e 20 20 54 68 65    ** table.  The
5540: 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f   cursor number o
5550: 66 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  f the temporary 
5560: 74 61 62 6c 65 20 68 61 73 20 61 6c 72 65 61 64  table has alread
5570: 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 65 65  y.        ** bee
5580: 6e 20 70 75 74 20 69 6e 20 69 54 61 62 6c 65 20  n put in iTable 
5590: 62 79 20 73 71 6c 69 74 65 33 45 78 70 72 52 65  by sqlite3ExprRe
55a0: 73 6f 6c 76 65 49 6e 53 65 6c 65 63 74 28 29 2e  solveInSelect().
55b0: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
55c0: 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c      pExpr->iTabl
55d0: 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  e = pParse->nTab
55e0: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  ++;.        sqli
55f0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
5600: 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c 20 70 45 78  OP_OpenTemp, pEx
5610: 70 72 2d 3e 69 54 61 62 6c 65 2c 20 31 29 3b 0a  pr->iTable, 1);.
5620: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53          sqlite3S
5630: 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 45  elect(pParse, pE
5640: 78 70 72 2d 3e 70 53 65 6c 65 63 74 2c 20 53 52  xpr->pSelect, SR
5650: 54 5f 53 65 74 2c 20 70 45 78 70 72 2d 3e 69 54  T_Set, pExpr->iT
5660: 61 62 6c 65 2c 20 30 2c 30 2c 30 29 3b 0a 20 20  able, 0,0,0);.  
5670: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 45      }else if( pE
5680: 78 70 72 2d 3e 70 4c 69 73 74 20 29 7b 0a 20 20  xpr->pList ){.  
5690: 20 20 20 20 20 20 2f 2a 20 43 61 73 65 20 32 3a        /* Case 2:
56a0: 20 20 20 20 20 65 78 70 72 20 49 4e 20 28 65 78       expr IN (ex
56b0: 70 72 6c 69 73 74 29 0a 20 20 20 20 20 20 20 20  prlist).        
56c0: 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 43 72  **.        ** Cr
56d0: 65 61 74 65 20 61 20 73 65 74 20 74 6f 20 70 75  eate a set to pu
56e0: 74 20 74 68 65 20 65 78 70 72 6c 69 73 74 20 76  t the exprlist v
56f0: 61 6c 75 65 73 20 69 6e 2e 20 20 54 68 65 20 53  alues in.  The S
5700: 65 74 20 69 64 20 69 73 20 73 74 6f 72 65 64 0a  et id is stored.
5710: 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 69 54          ** in iT
5720: 61 62 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f  able..        */
5730: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 2c 20  .        int i, 
5740: 69 53 65 74 3b 0a 20 20 20 20 20 20 20 20 66 6f  iSet;.        fo
5750: 72 28 69 3d 30 3b 20 69 3c 70 45 78 70 72 2d 3e  r(i=0; i<pExpr->
5760: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
5770: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45 78  +){.          Ex
5780: 70 72 20 2a 70 45 32 20 3d 20 70 45 78 70 72 2d  pr *pE2 = pExpr-
5790: 3e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  >pList->a[i].pEx
57a0: 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  pr;.          if
57b0: 28 20 21 73 71 6c 69 74 65 33 45 78 70 72 49 73  ( !sqlite3ExprIs
57c0: 43 6f 6e 73 74 61 6e 74 28 70 45 32 29 20 29 7b  Constant(pE2) ){
57d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
57e0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
57f0: 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rse,.           
5800: 20 20 20 22 72 69 67 68 74 2d 68 61 6e 64 20 73     "right-hand s
5810: 69 64 65 20 6f 66 20 49 4e 20 6f 70 65 72 61 74  ide of IN operat
5820: 6f 72 20 6d 75 73 74 20 62 65 20 63 6f 6e 73 74  or must be const
5830: 61 6e 74 22 29 3b 0a 20 20 20 20 20 20 20 20 20  ant");.         
5840: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
5850: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
5860: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
5870: 70 72 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  prCheck(pParse, 
5880: 70 45 32 2c 20 30 2c 20 30 29 20 29 7b 0a 20 20  pE2, 0, 0) ){.  
5890: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
58a0: 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   1;.          }.
58b0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
58c0: 20 20 69 53 65 74 20 3d 20 70 45 78 70 72 2d 3e    iSet = pExpr->
58d0: 69 54 61 62 6c 65 20 3d 20 70 50 61 72 73 65 2d  iTable = pParse-
58e0: 3e 6e 53 65 74 2b 2b 3b 0a 20 20 20 20 20 20 20  >nSet++;.       
58f0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 78 70   for(i=0; i<pExp
5900: 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  r->pList->nExpr;
5910: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
5920: 20 45 78 70 72 20 2a 70 45 32 20 3d 20 70 45 78   Expr *pE2 = pEx
5930: 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  pr->pList->a[i].
5940: 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20  pExpr;.         
5950: 20 73 77 69 74 63 68 28 20 70 45 32 2d 3e 6f 70   switch( pE2->op
5960: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
5970: 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 0a 20  case TK_FLOAT:. 
5980: 20 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20             case 
5990: 54 4b 5f 49 4e 54 45 47 45 52 3a 0a 20 20 20 20  TK_INTEGER:.    
59a0: 20 20 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f          case TK_
59b0: 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20  STRING: {.      
59c0: 20 20 20 20 20 20 20 20 69 6e 74 20 61 64 64 72          int addr
59d0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
59e0: 61 73 73 65 72 74 28 20 70 45 32 2d 3e 74 6f 6b  assert( pE2->tok
59f0: 65 6e 2e 7a 20 29 3b 0a 20 20 20 20 20 20 20 20  en.z );.        
5a00: 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c        addr = sql
5a10: 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f  ite3VdbeOp3(v, O
5a20: 50 5f 53 65 74 49 6e 73 65 72 74 2c 20 69 53 65  P_SetInsert, iSe
5a30: 74 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  t, 0,.          
5a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a50: 20 20 20 20 20 20 20 20 70 45 32 2d 3e 74 6f 6b          pE2->tok
5a60: 65 6e 2e 7a 2c 20 70 45 32 2d 3e 74 6f 6b 65 6e  en.z, pE2->token
5a70: 2e 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  .n);.           
5a80: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 44 65     sqlite3VdbeDe
5a90: 71 75 6f 74 65 50 33 28 76 2c 20 61 64 64 72 29  quoteP3(v, addr)
5aa0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
5ab0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
5ac0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
5ad0: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
5ae0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
5af0: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
5b00: 2c 20 70 45 32 29 3b 0a 20 20 20 20 20 20 20 20  , pE2);.        
5b10: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
5b20: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74  eAddOp(v, OP_Set
5b30: 49 6e 73 65 72 74 2c 20 69 53 65 74 2c 20 30 29  Insert, iSet, 0)
5b40: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
5b50: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
5b60: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
5b70: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
5b80: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
5b90: 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20      }..    case 
5ba0: 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20  TK_SELECT: {.   
5bb0: 20 20 20 2f 2a 20 54 68 69 73 20 68 61 73 20 74     /* This has t
5bc0: 6f 20 62 65 20 61 20 73 63 61 6c 61 72 20 53 45  o be a scalar SE
5bd0: 4c 45 43 54 2e 20 20 47 65 6e 65 72 61 74 65 20  LECT.  Generate 
5be0: 63 6f 64 65 20 74 6f 20 70 75 74 20 74 68 65 0a  code to put the.
5bf0: 20 20 20 20 20 20 2a 2a 20 76 61 6c 75 65 20 6f        ** value o
5c00: 66 20 74 68 69 73 20 73 65 6c 65 63 74 20 69 6e  f this select in
5c10: 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61   a memory cell a
5c20: 6e 64 20 72 65 63 6f 72 64 20 74 68 65 20 6e 75  nd record the nu
5c30: 6d 62 65 72 0a 20 20 20 20 20 20 2a 2a 20 6f 66  mber.      ** of
5c40: 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c   the memory cell
5c50: 20 69 6e 20 69 43 6f 6c 75 6d 6e 2e 0a 20 20 20   in iColumn..   
5c60: 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 45 78 70     */.      pExp
5c70: 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 70 50 61  r->iColumn = pPa
5c80: 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20  rse->nMem++;.   
5c90: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65     if( sqlite3Se
5ca0: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 45 78  lect(pParse, pEx
5cb0: 70 72 2d 3e 70 53 65 6c 65 63 74 2c 20 53 52 54  pr->pSelect, SRT
5cc0: 5f 4d 65 6d 2c 20 70 45 78 70 72 2d 3e 69 43 6f  _Mem, pExpr->iCo
5cd0: 6c 75 6d 6e 2c 30 2c 30 2c 30 29 20 29 7b 0a 20  lumn,0,0,0) ){. 
5ce0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
5cf0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
5d00: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
5d10: 20 2f 2a 20 46 6f 72 20 61 6c 6c 20 65 6c 73 65   /* For all else
5d20: 2c 20 6a 75 73 74 20 72 65 63 75 72 73 69 76 65  , just recursive
5d30: 6c 79 20 77 61 6c 6b 20 74 68 65 20 74 72 65 65  ly walk the tree
5d40: 20 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c 74 3a   */.    default:
5d50: 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78   {.      if( pEx
5d60: 70 72 2d 3e 70 4c 65 66 74 0a 20 20 20 20 20 20  pr->pLeft.      
5d70: 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 52 65  && sqlite3ExprRe
5d80: 73 6f 6c 76 65 49 64 73 28 70 50 61 72 73 65 2c  solveIds(pParse,
5d90: 20 70 53 72 63 4c 69 73 74 2c 20 70 45 4c 69 73   pSrcList, pELis
5da0: 74 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  t, pExpr->pLeft)
5db0: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
5dc0: 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 1;.      }.  
5dd0: 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70      if( pExpr->p
5de0: 52 69 67 68 74 20 0a 20 20 20 20 20 20 26 26 20  Right .      && 
5df0: 73 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f 6c  sqlite3ExprResol
5e00: 76 65 49 64 73 28 70 50 61 72 73 65 2c 20 70 53  veIds(pParse, pS
5e10: 72 63 4c 69 73 74 2c 20 70 45 4c 69 73 74 2c 20  rcList, pEList, 
5e20: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 20 29  pExpr->pRight) )
5e30: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
5e40: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
5e50: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 4c 69    if( pExpr->pLi
5e60: 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  st ){.        in
5e70: 74 20 69 3b 0a 20 20 20 20 20 20 20 20 45 78 70  t i;.        Exp
5e80: 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70  rList *pList = p
5e90: 45 78 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 20  Expr->pList;.   
5ea0: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
5eb0: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
5ec0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45 78  +){.          Ex
5ed0: 70 72 20 2a 70 41 72 67 20 3d 20 70 4c 69 73 74  pr *pArg = pList
5ee0: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
5ef0: 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
5f00: 74 65 33 45 78 70 72 52 65 73 6f 6c 76 65 49 64  te3ExprResolveId
5f10: 73 28 70 50 61 72 73 65 2c 20 70 53 72 63 4c 69  s(pParse, pSrcLi
5f20: 73 74 2c 20 70 45 4c 69 73 74 2c 20 70 41 72 67  st, pEList, pArg
5f30: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
5f40: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
5f50: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
5f60: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
5f70: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
5f80: 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72 20 69 73  ../*.** pExpr is
5f90: 20 61 20 6e 6f 64 65 20 74 68 61 74 20 64 65 66   a node that def
5fa0: 69 6e 65 73 20 61 20 66 75 6e 63 74 69 6f 6e 20  ines a function 
5fb0: 6f 66 20 73 6f 6d 65 20 6b 69 6e 64 2e 20 20 49  of some kind.  I
5fc0: 74 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20 61 20  t might.** be a 
5fd0: 73 79 6e 74 61 63 74 69 63 20 66 75 6e 63 74 69  syntactic functi
5fe0: 6f 6e 20 6c 69 6b 65 20 22 63 6f 75 6e 74 28 78  on like "count(x
5ff0: 29 22 20 6f 72 20 69 74 20 6d 69 67 68 74 20 62  )" or it might b
6000: 65 20 61 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  e a function.** 
6010: 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20  that implements 
6020: 61 6e 20 6f 70 65 72 61 74 6f 72 2c 20 6c 69 6b  an operator, lik
6030: 65 20 22 61 20 4c 49 4b 45 20 62 22 2e 20 20 0a  e "a LIKE b".  .
6040: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
6050: 6e 65 20 6d 61 6b 65 73 20 2a 70 7a 4e 61 6d 65  ne makes *pzName
6060: 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e 61   point to the na
6070: 6d 65 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69  me of the functi
6080: 6f 6e 20 61 6e 64 20 0a 2a 2a 20 2a 70 6e 4e 61  on and .** *pnNa
6090: 6d 65 20 68 6f 6c 64 20 74 68 65 20 6e 75 6d 62  me hold the numb
60a0: 65 72 20 6f 66 20 63 68 61 72 61 63 74 65 72 73  er of characters
60b0: 20 69 6e 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   in the function
60c0: 20 6e 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   name..*/.static
60d0: 20 76 6f 69 64 20 67 65 74 46 75 6e 63 74 69 6f   void getFunctio
60e0: 6e 4e 61 6d 65 28 45 78 70 72 20 2a 70 45 78 70  nName(Expr *pExp
60f0: 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a  r, const char **
6100: 70 7a 4e 61 6d 65 2c 20 69 6e 74 20 2a 70 6e 4e  pzName, int *pnN
6110: 61 6d 65 29 7b 0a 20 20 73 77 69 74 63 68 28 20  ame){.  switch( 
6120: 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20  pExpr->op ){.   
6130: 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f   case TK_FUNCTIO
6140: 4e 3a 20 7b 0a 20 20 20 20 20 20 2a 70 7a 4e 61  N: {.      *pzNa
6150: 6d 65 20 3d 20 70 45 78 70 72 2d 3e 74 6f 6b 65  me = pExpr->toke
6160: 6e 2e 7a 3b 0a 20 20 20 20 20 20 2a 70 6e 4e 61  n.z;.      *pnNa
6170: 6d 65 20 3d 20 70 45 78 70 72 2d 3e 74 6f 6b 65  me = pExpr->toke
6180: 6e 2e 6e 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  n.n;.      break
6190: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
61a0: 20 54 4b 5f 4c 49 4b 45 3a 20 7b 0a 20 20 20 20   TK_LIKE: {.    
61b0: 20 20 2a 70 7a 4e 61 6d 65 20 3d 20 22 6c 69 6b    *pzName = "lik
61c0: 65 22 3b 0a 20 20 20 20 20 20 2a 70 6e 4e 61 6d  e";.      *pnNam
61d0: 65 20 3d 20 34 3b 0a 20 20 20 20 20 20 62 72 65  e = 4;.      bre
61e0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
61f0: 73 65 20 54 4b 5f 47 4c 4f 42 3a 20 7b 0a 20 20  se TK_GLOB: {.  
6200: 20 20 20 20 2a 70 7a 4e 61 6d 65 20 3d 20 22 67      *pzName = "g
6210: 6c 6f 62 22 3b 0a 20 20 20 20 20 20 2a 70 6e 4e  lob";.      *pnN
6220: 61 6d 65 20 3d 20 34 3b 0a 20 20 20 20 20 20 62  ame = 4;.      b
6230: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
6240: 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
6250: 20 2a 70 7a 4e 61 6d 65 20 3d 20 22 63 61 6e 27   *pzName = "can'
6260: 74 20 68 61 70 70 65 6e 22 3b 0a 20 20 20 20 20  t happen";.     
6270: 20 2a 70 6e 4e 61 6d 65 20 3d 20 31 32 3b 0a 20   *pnName = 12;. 
6280: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
6290: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45  }.  }.}../*.** E
62a0: 72 72 6f 72 20 63 68 65 63 6b 20 74 68 65 20 66  rror check the f
62b0: 75 6e 63 74 69 6f 6e 73 20 69 6e 20 61 6e 20 65  unctions in an e
62c0: 78 70 72 65 73 73 69 6f 6e 2e 20 20 4d 61 6b 65  xpression.  Make
62d0: 20 73 75 72 65 20 61 6c 6c 0a 2a 2a 20 66 75 6e   sure all.** fun
62e0: 63 74 69 6f 6e 20 6e 61 6d 65 73 20 61 72 65 20  ction names are 
62f0: 72 65 63 6f 67 6e 69 7a 65 64 20 61 6e 64 20 61  recognized and a
6300: 6c 6c 20 66 75 6e 63 74 69 6f 6e 73 20 68 61 76  ll functions hav
6310: 65 20 74 68 65 20 63 6f 72 72 65 63 74 0a 2a 2a  e the correct.**
6320: 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   number of argum
6330: 65 6e 74 73 2e 20 20 4c 65 61 76 65 20 61 6e 20  ents.  Leave an 
6340: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e  error message in
6350: 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67   pParse->zErrMsg
6360: 0a 2a 2a 20 69 66 20 61 6e 79 74 68 69 6e 67 20  .** if anything 
6370: 69 73 20 61 6d 69 73 73 2e 20 20 52 65 74 75 72  is amiss.  Retur
6380: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
6390: 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 69 66  errors..**.** if
63a0: 20 70 49 73 41 67 67 20 69 73 20 6e 6f 74 20 6e   pIsAgg is not n
63b0: 75 6c 6c 20 61 6e 64 20 74 68 69 73 20 65 78 70  ull and this exp
63c0: 72 65 73 73 69 6f 6e 20 69 73 20 61 6e 20 61 67  ression is an ag
63d0: 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
63e0: 0a 2a 2a 20 28 6c 69 6b 65 20 63 6f 75 6e 74 28  .** (like count(
63f0: 2a 29 20 6f 72 20 6d 61 78 28 76 61 6c 75 65 29  *) or max(value)
6400: 29 20 74 68 65 6e 20 77 72 69 74 65 20 61 20 31  ) then write a 1
6410: 20 69 6e 74 6f 20 2a 70 49 73 41 67 67 2e 0a 2a   into *pIsAgg..*
6420: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
6430: 72 43 68 65 63 6b 28 50 61 72 73 65 20 2a 70 50  rCheck(Parse *pP
6440: 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
6450: 72 2c 20 69 6e 74 20 61 6c 6c 6f 77 41 67 67 2c  r, int allowAgg,
6460: 20 69 6e 74 20 2a 70 49 73 41 67 67 29 7b 0a 20   int *pIsAgg){. 
6470: 20 69 6e 74 20 6e 45 72 72 20 3d 20 30 3b 0a 20   int nErr = 0;. 
6480: 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20   if( pExpr==0 ) 
6490: 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 77 69 74  return 0;.  swit
64a0: 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b  ch( pExpr->op ){
64b0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 4c 4f  .    case TK_GLO
64c0: 42 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c  B:.    case TK_L
64d0: 49 4b 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  IKE:.    case TK
64e0: 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20  _FUNCTION: {.   
64f0: 20 20 20 69 6e 74 20 6e 20 3d 20 70 45 78 70 72     int n = pExpr
6500: 2d 3e 70 4c 69 73 74 20 3f 20 70 45 78 70 72 2d  ->pList ? pExpr-
6510: 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20  >pList->nExpr : 
6520: 30 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66  0;  /* Number of
6530: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
6540: 20 20 20 20 69 6e 74 20 6e 6f 5f 73 75 63 68 5f      int no_such_
6550: 66 75 6e 63 20 3d 20 30 3b 20 20 20 20 20 20 20  func = 0;       
6560: 2f 2a 20 54 72 75 65 20 69 66 20 6e 6f 20 73 75  /* True if no su
6570: 63 68 20 66 75 6e 63 74 69 6f 6e 20 65 78 69 73  ch function exis
6580: 74 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ts */.      int 
6590: 77 72 6f 6e 67 5f 6e 75 6d 5f 61 72 67 73 20 3d  wrong_num_args =
65a0: 20 30 3b 20 20 20 20 20 2f 2a 20 54 72 75 65 20   0;     /* True 
65b0: 69 66 20 77 72 6f 6e 67 20 6e 75 6d 62 65 72 20  if wrong number 
65c0: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
65d0: 20 20 20 20 20 20 69 6e 74 20 69 73 5f 61 67 67        int is_agg
65e0: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
65f0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 69 73 20    /* True if is 
6600: 61 6e 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  an aggregate fun
6610: 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69  ction */.      i
6620: 6e 74 20 69 3b 0a 20 20 20 20 20 20 69 6e 74 20  nt i;.      int 
6630: 6e 49 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  nId;            
6640: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
6650: 72 20 6f 66 20 63 68 61 72 61 63 74 65 72 73 20  r of characters 
6660: 69 6e 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  in function name
6670: 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   */.      const 
6680: 63 68 61 72 20 2a 7a 49 64 3b 20 20 20 20 20 20  char *zId;      
6690: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 75 6e        /* The fun
66a0: 63 74 69 6f 6e 20 6e 61 6d 65 2e 20 2a 2f 0a 20  ction name. */. 
66b0: 20 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70 44       FuncDef *pD
66c0: 65 66 3b 0a 0a 20 20 20 20 20 20 67 65 74 46 75  ef;..      getFu
66d0: 6e 63 74 69 6f 6e 4e 61 6d 65 28 70 45 78 70 72  nctionName(pExpr
66e0: 2c 20 26 7a 49 64 2c 20 26 6e 49 64 29 3b 0a 20  , &zId, &nId);. 
66f0: 20 20 20 20 20 70 44 65 66 20 3d 20 73 71 6c 69       pDef = sqli
6700: 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28  te3FindFunction(
6710: 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 49 64 2c  pParse->db, zId,
6720: 20 6e 49 64 2c 20 6e 2c 20 30 29 3b 0a 20 20 20   nId, n, 0);.   
6730: 20 20 20 69 66 28 20 70 44 65 66 3d 3d 30 20 29     if( pDef==0 )
6740: 7b 0a 20 20 20 20 20 20 20 20 70 44 65 66 20 3d  {.        pDef =
6750: 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63   sqlite3FindFunc
6760: 74 69 6f 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c  tion(pParse->db,
6770: 20 7a 49 64 2c 20 6e 49 64 2c 20 2d 31 2c 20 30   zId, nId, -1, 0
6780: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
6790: 44 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Def==0 ){.      
67a0: 20 20 20 20 6e 6f 5f 73 75 63 68 5f 66 75 6e 63      no_such_func
67b0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 65   = 1;.        }e
67c0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 77  lse{.          w
67d0: 72 6f 6e 67 5f 6e 75 6d 5f 61 72 67 73 20 3d 20  rong_num_args = 
67e0: 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
67f0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
6800: 20 20 69 73 5f 61 67 67 20 3d 20 70 44 65 66 2d    is_agg = pDef-
6810: 3e 78 46 75 6e 63 3d 3d 30 3b 0a 20 20 20 20 20  >xFunc==0;.     
6820: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 73 5f   }.      if( is_
6830: 61 67 67 20 26 26 20 21 61 6c 6c 6f 77 41 67 67  agg && !allowAgg
6840: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
6850: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
6860: 73 65 2c 20 22 6d 69 73 75 73 65 20 6f 66 20 61  se, "misuse of a
6870: 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
6880: 6e 20 25 2e 2a 73 28 29 22 2c 20 6e 49 64 2c 20  n %.*s()", nId, 
6890: 7a 49 64 29 3b 0a 20 20 20 20 20 20 20 20 6e 45  zId);.        nE
68a0: 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69 73  rr++;.        is
68b0: 5f 61 67 67 20 3d 20 30 3b 0a 20 20 20 20 20 20  _agg = 0;.      
68c0: 7d 65 6c 73 65 20 69 66 28 20 6e 6f 5f 73 75 63  }else if( no_suc
68d0: 68 5f 66 75 6e 63 20 29 7b 0a 20 20 20 20 20 20  h_func ){.      
68e0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
68f0: 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75  g(pParse, "no su
6900: 63 68 20 66 75 6e 63 74 69 6f 6e 3a 20 25 2e 2a  ch function: %.*
6910: 73 22 2c 20 6e 49 64 2c 20 7a 49 64 29 3b 0a 20  s", nId, zId);. 
6920: 20 20 20 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20         nErr++;. 
6930: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 77       }else if( w
6940: 72 6f 6e 67 5f 6e 75 6d 5f 61 72 67 73 20 29 7b  rong_num_args ){
6950: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
6960: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
6970: 22 77 72 6f 6e 67 20 6e 75 6d 62 65 72 20 6f 66  "wrong number of
6980: 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 66 75   arguments to fu
6990: 6e 63 74 69 6f 6e 20 25 2e 2a 73 28 29 22 2c 0a  nction %.*s()",.
69a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 49 64               nId
69b0: 2c 20 7a 49 64 29 3b 0a 20 20 20 20 20 20 20 20  , zId);.        
69c0: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a  nErr++;.      }.
69d0: 20 20 20 20 20 20 69 66 28 20 69 73 5f 61 67 67        if( is_agg
69e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 45 78 70   ){.        pExp
69f0: 72 2d 3e 6f 70 20 3d 20 54 4b 5f 41 47 47 5f 46  r->op = TK_AGG_F
6a00: 55 4e 43 54 49 4f 4e 3b 0a 20 20 20 20 20 20 20  UNCTION;.       
6a10: 20 69 66 28 20 70 49 73 41 67 67 20 29 20 2a 70   if( pIsAgg ) *p
6a20: 49 73 41 67 67 20 3d 20 31 3b 0a 20 20 20 20 20  IsAgg = 1;.     
6a30: 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30   }.      for(i=0
6a40: 3b 20 6e 45 72 72 3d 3d 30 20 26 26 20 69 3c 6e  ; nErr==0 && i<n
6a50: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
6a60: 6e 45 72 72 20 3d 20 73 71 6c 69 74 65 33 45 78  nErr = sqlite3Ex
6a70: 70 72 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  prCheck(pParse, 
6a80: 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b  pExpr->pList->a[
6a90: 69 5d 2e 70 45 78 70 72 2c 0a 20 20 20 20 20 20  i].pExpr,.      
6aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6ab0: 20 20 20 20 20 20 20 20 20 61 6c 6c 6f 77 41 67           allowAg
6ac0: 67 20 26 26 20 21 69 73 5f 61 67 67 2c 20 70 49  g && !is_agg, pI
6ad0: 73 41 67 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20  sAgg);.      }. 
6ae0: 20 20 20 20 20 69 66 28 20 70 44 65 66 3d 3d 30       if( pDef==0
6af0: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41   ){.        /* A
6b00: 6c 72 65 61 64 79 20 72 65 70 6f 72 74 65 64 20  lready reported 
6b10: 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20  an error */.    
6b20: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 44 65 66    }else if( pDef
6b30: 2d 3e 64 61 74 61 54 79 70 65 3e 3d 30 20 29 7b  ->dataType>=0 ){
6b40: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 44 65  .        if( pDe
6b50: 66 2d 3e 64 61 74 61 54 79 70 65 3c 6e 20 29 7b  f->dataType<n ){
6b60: 0a 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72  .          pExpr
6b70: 2d 3e 64 61 74 61 54 79 70 65 20 3d 20 0a 20 20  ->dataType = .  
6b80: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
6b90: 65 33 45 78 70 72 54 79 70 65 28 70 45 78 70 72  e3ExprType(pExpr
6ba0: 2d 3e 70 4c 69 73 74 2d 3e 61 5b 70 44 65 66 2d  ->pList->a[pDef-
6bb0: 3e 64 61 74 61 54 79 70 65 5d 2e 70 45 78 70 72  >dataType].pExpr
6bc0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
6bd0: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 45 78 70  {.          pExp
6be0: 72 2d 3e 64 61 74 61 54 79 70 65 20 3d 20 53 51  r->dataType = SQ
6bf0: 4c 49 54 45 5f 53 4f 5f 4e 55 4d 3b 0a 20 20 20  LITE_SO_NUM;.   
6c00: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
6c10: 73 65 20 69 66 28 20 70 44 65 66 2d 3e 64 61 74  se if( pDef->dat
6c20: 61 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 41 52  aType==SQLITE_AR
6c30: 47 53 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44  GS ){.        pD
6c40: 65 66 2d 3e 64 61 74 61 54 79 70 65 20 3d 20 53  ef->dataType = S
6c50: 51 4c 49 54 45 5f 53 4f 5f 54 45 58 54 3b 0a 20  QLITE_SO_TEXT;. 
6c60: 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
6c70: 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  i<n; i++){.     
6c80: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
6c90: 45 78 70 72 54 79 70 65 28 70 45 78 70 72 2d 3e  ExprType(pExpr->
6ca0: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
6cb0: 72 29 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 4e 55  r)==SQLITE_SO_NU
6cc0: 4d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  M ){.           
6cd0: 20 70 45 78 70 72 2d 3e 64 61 74 61 54 79 70 65   pExpr->dataType
6ce0: 20 3d 20 53 51 4c 49 54 45 5f 53 4f 5f 4e 55 4d   = SQLITE_SO_NUM
6cf0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;.            br
6d00: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  eak;.          }
6d10: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
6d20: 20 7d 65 6c 73 65 20 69 66 28 20 70 44 65 66 2d   }else if( pDef-
6d30: 3e 64 61 74 61 54 79 70 65 3d 3d 53 51 4c 49 54  >dataType==SQLIT
6d40: 45 5f 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20 20  E_NUMERIC ){.   
6d50: 20 20 20 20 20 70 45 78 70 72 2d 3e 64 61 74 61       pExpr->data
6d60: 54 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 53 4f  Type = SQLITE_SO
6d70: 5f 4e 55 4d 3b 0a 20 20 20 20 20 20 7d 65 6c 73  _NUM;.      }els
6d80: 65 7b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72  e{.        pExpr
6d90: 2d 3e 64 61 74 61 54 79 70 65 20 3d 20 53 51 4c  ->dataType = SQL
6da0: 49 54 45 5f 53 4f 5f 54 45 58 54 3b 0a 20 20 20  ITE_SO_TEXT;.   
6db0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 64     }.    }.    d
6dc0: 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
6dd0: 69 66 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  if( pExpr->pLeft
6de0: 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 45 72 72   ){.        nErr
6df0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 68   = sqlite3ExprCh
6e00: 65 63 6b 28 70 50 61 72 73 65 2c 20 70 45 78 70  eck(pParse, pExp
6e10: 72 2d 3e 70 4c 65 66 74 2c 20 61 6c 6c 6f 77 41  r->pLeft, allowA
6e20: 67 67 2c 20 70 49 73 41 67 67 29 3b 0a 20 20 20  gg, pIsAgg);.   
6e30: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e     }.      if( n
6e40: 45 72 72 3d 3d 30 20 26 26 20 70 45 78 70 72 2d  Err==0 && pExpr-
6e50: 3e 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20  >pRight ){.     
6e60: 20 20 20 6e 45 72 72 20 3d 20 73 71 6c 69 74 65     nErr = sqlite
6e70: 33 45 78 70 72 43 68 65 63 6b 28 70 50 61 72 73  3ExprCheck(pPars
6e80: 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  e, pExpr->pRight
6e90: 2c 20 61 6c 6c 6f 77 41 67 67 2c 20 70 49 73 41  , allowAgg, pIsA
6ea0: 67 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  gg);.      }.   
6eb0: 20 20 20 69 66 28 20 6e 45 72 72 3d 3d 30 20 26     if( nErr==0 &
6ec0: 26 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 20 29  & pExpr->pList )
6ed0: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 20  {.        int n 
6ee0: 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e  = pExpr->pList->
6ef0: 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 69  nExpr;.        i
6f00: 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20 66 6f  nt i;.        fo
6f10: 72 28 69 3d 30 3b 20 6e 45 72 72 3d 3d 30 20 26  r(i=0; nErr==0 &
6f20: 26 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  & i<n; i++){.   
6f30: 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 32         Expr *pE2
6f40: 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d   = pExpr->pList-
6f50: 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
6f60: 20 20 20 20 20 20 20 6e 45 72 72 20 3d 20 73 71         nErr = sq
6f70: 6c 69 74 65 33 45 78 70 72 43 68 65 63 6b 28 70  lite3ExprCheck(p
6f80: 50 61 72 73 65 2c 20 70 45 32 2c 20 61 6c 6c 6f  Parse, pE2, allo
6f90: 77 41 67 67 2c 20 70 49 73 41 67 67 29 3b 0a 20  wAgg, pIsAgg);. 
6fa0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
6fb0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
6fc0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
6fd0: 20 6e 45 72 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   nErr;.}../*.** 
6fe0: 52 65 74 75 72 6e 20 65 69 74 68 65 72 20 53 51  Return either SQ
6ff0: 4c 49 54 45 5f 53 4f 5f 4e 55 4d 20 6f 72 20 53  LITE_SO_NUM or S
7000: 51 4c 49 54 45 5f 53 4f 5f 54 45 58 54 20 74 6f  QLITE_SO_TEXT to
7010: 20 69 6e 64 69 63 61 74 65 20 77 68 65 74 68 65   indicate whethe
7020: 72 20 74 68 65 0a 2a 2a 20 67 69 76 65 6e 20 65  r the.** given e
7030: 78 70 72 65 73 73 69 6f 6e 20 73 68 6f 75 6c 64  xpression should
7040: 20 73 6f 72 74 20 61 73 20 6e 75 6d 65 72 69 63   sort as numeric
7050: 20 76 61 6c 75 65 73 20 6f 72 20 61 73 20 74 65   values or as te
7060: 78 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 71  xt..**.** The sq
7070: 6c 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76 65  lite3ExprResolve
7080: 49 64 73 28 29 20 61 6e 64 20 73 71 6c 69 74 65  Ids() and sqlite
7090: 33 45 78 70 72 43 68 65 63 6b 28 29 20 72 6f 75  3ExprCheck() rou
70a0: 74 69 6e 65 73 20 6d 75 73 74 20 68 61 76 65 0a  tines must have.
70b0: 2a 2a 20 62 6f 74 68 20 62 65 65 6e 20 63 61 6c  ** both been cal
70c0: 6c 65 64 20 6f 6e 20 74 68 65 20 65 78 70 72 65  led on the expre
70d0: 73 73 69 6f 6e 20 62 65 66 6f 72 65 20 69 74 20  ssion before it 
70e0: 69 73 20 70 61 73 73 65 64 20 74 6f 20 74 68 69  is passed to thi
70f0: 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 69 6e  s routine..*/.in
7100: 74 20 73 71 6c 69 74 65 33 45 78 70 72 54 79 70  t sqlite3ExprTyp
7110: 65 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66  e(Expr *p){.  if
7120: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( p==0 ) return 
7130: 53 51 4c 49 54 45 5f 53 4f 5f 4e 55 4d 3b 0a 20  SQLITE_SO_NUM;. 
7140: 20 77 68 69 6c 65 28 20 70 20 29 20 73 77 69 74   while( p ) swit
7150: 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20  ch( p->op ){.   
7160: 20 63 61 73 65 20 54 4b 5f 50 4c 55 53 3a 0a 20   case TK_PLUS:. 
7170: 20 20 20 63 61 73 65 20 54 4b 5f 4d 49 4e 55 53     case TK_MINUS
7180: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54  :.    case TK_ST
7190: 41 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  AR:.    case TK_
71a0: 53 4c 41 53 48 3a 0a 20 20 20 20 63 61 73 65 20  SLASH:.    case 
71b0: 54 4b 5f 41 4e 44 3a 0a 20 20 20 20 63 61 73 65  TK_AND:.    case
71c0: 20 54 4b 5f 4f 52 3a 0a 20 20 20 20 63 61 73 65   TK_OR:.    case
71d0: 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20   TK_ISNULL:.    
71e0: 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a  case TK_NOTNULL:
71f0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54  .    case TK_NOT
7200: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4d  :.    case TK_UM
7210: 49 4e 55 53 3a 0a 20 20 20 20 63 61 73 65 20 54  INUS:.    case T
7220: 4b 5f 55 50 4c 55 53 3a 0a 20 20 20 20 63 61 73  K_UPLUS:.    cas
7230: 65 20 54 4b 5f 42 49 54 41 4e 44 3a 0a 20 20 20  e TK_BITAND:.   
7240: 20 63 61 73 65 20 54 4b 5f 42 49 54 4f 52 3a 0a   case TK_BITOR:.
7250: 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4e      case TK_BITN
7260: 4f 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  OT:.    case TK_
7270: 4c 53 48 49 46 54 3a 0a 20 20 20 20 63 61 73 65  LSHIFT:.    case
7280: 20 54 4b 5f 52 53 48 49 46 54 3a 0a 20 20 20 20   TK_RSHIFT:.    
7290: 63 61 73 65 20 54 4b 5f 52 45 4d 3a 0a 20 20 20  case TK_REM:.   
72a0: 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52   case TK_INTEGER
72b0: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 4c  :.    case TK_FL
72c0: 4f 41 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  OAT:.    case TK
72d0: 5f 49 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _IN:.    case TK
72e0: 5f 42 45 54 57 45 45 4e 3a 0a 20 20 20 20 63 61  _BETWEEN:.    ca
72f0: 73 65 20 54 4b 5f 47 4c 4f 42 3a 0a 20 20 20 20  se TK_GLOB:.    
7300: 63 61 73 65 20 54 4b 5f 4c 49 4b 45 3a 0a 20 20  case TK_LIKE:.  
7310: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
7320: 45 5f 53 4f 5f 4e 55 4d 3b 0a 0a 20 20 20 20 63  E_SO_NUM;..    c
7330: 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 0a 20  ase TK_STRING:. 
7340: 20 20 20 63 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a     case TK_NULL:
7350: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4e  .    case TK_CON
7360: 43 41 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  CAT:.    case TK
7370: 5f 56 41 52 49 41 42 4c 45 3a 0a 20 20 20 20 20  _VARIABLE:.     
7380: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 53   return SQLITE_S
7390: 4f 5f 54 45 58 54 3b 0a 0a 20 20 20 20 63 61 73  O_TEXT;..    cas
73a0: 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73  e TK_LT:.    cas
73b0: 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73  e TK_LE:.    cas
73c0: 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73  e TK_GT:.    cas
73d0: 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73  e TK_GE:.    cas
73e0: 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73  e TK_NE:.    cas
73f0: 65 20 54 4b 5f 45 51 3a 0a 20 20 20 20 20 20 69  e TK_EQ:.      i
7400: 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 54 79  f( sqlite3ExprTy
7410: 70 65 28 70 2d 3e 70 4c 65 66 74 29 3d 3d 53 51  pe(p->pLeft)==SQ
7420: 4c 49 54 45 5f 53 4f 5f 4e 55 4d 20 29 7b 0a 20  LITE_SO_NUM ){. 
7430: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
7440: 4c 49 54 45 5f 53 4f 5f 4e 55 4d 3b 0a 20 20 20  LITE_SO_NUM;.   
7450: 20 20 20 7d 0a 20 20 20 20 20 20 70 20 3d 20 70     }.      p = p
7460: 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20  ->pRight;.      
7470: 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65  break;..    case
7480: 20 54 4b 5f 41 53 3a 0a 20 20 20 20 20 20 70 20   TK_AS:.      p 
7490: 3d 20 70 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20  = p->pLeft;.    
74a0: 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61    break;..    ca
74b0: 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20 20  se TK_COLUMN:.  
74c0: 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54 49    case TK_FUNCTI
74d0: 4f 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ON:.    case TK_
74e0: 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20  AGG_FUNCTION:.  
74f0: 20 20 20 20 72 65 74 75 72 6e 20 70 2d 3e 64 61      return p->da
7500: 74 61 54 79 70 65 3b 0a 0a 20 20 20 20 63 61 73  taType;..    cas
7510: 65 20 54 4b 5f 53 45 4c 45 43 54 3a 0a 20 20 20  e TK_SELECT:.   
7520: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 53     assert( p->pS
7530: 65 6c 65 63 74 20 29 3b 0a 20 20 20 20 20 20 61  elect );.      a
7540: 73 73 65 72 74 28 20 70 2d 3e 70 53 65 6c 65 63  ssert( p->pSelec
7550: 74 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20  t->pEList );.   
7560: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 53     assert( p->pS
7570: 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e  elect->pEList->n
7580: 45 78 70 72 3e 30 20 29 3b 0a 20 20 20 20 20 20  Expr>0 );.      
7590: 70 20 3d 20 70 2d 3e 70 53 65 6c 65 63 74 2d 3e  p = p->pSelect->
75a0: 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  pEList->a[0].pEx
75b0: 70 72 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  pr;.      break;
75c0: 0a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 41  ..    case TK_CA
75d0: 53 45 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  SE: {.      if( 
75e0: 70 2d 3e 70 52 69 67 68 74 20 26 26 20 73 71 6c  p->pRight && sql
75f0: 69 74 65 33 45 78 70 72 54 79 70 65 28 70 2d 3e  ite3ExprType(p->
7600: 70 52 69 67 68 74 29 3d 3d 53 51 4c 49 54 45 5f  pRight)==SQLITE_
7610: 53 4f 5f 4e 55 4d 20 29 7b 0a 20 20 20 20 20 20  SO_NUM ){.      
7620: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
7630: 53 4f 5f 4e 55 4d 3b 0a 20 20 20 20 20 20 7d 0a  SO_NUM;.      }.
7640: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4c 69        if( p->pLi
7650: 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  st ){.        in
7660: 74 20 69 3b 0a 20 20 20 20 20 20 20 20 45 78 70  t i;.        Exp
7670: 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70  rList *pList = p
7680: 2d 3e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 20  ->pList;.       
7690: 20 66 6f 72 28 69 3d 31 3b 20 69 3c 70 4c 69 73   for(i=1; i<pLis
76a0: 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 3d 32 29 7b  t->nExpr; i+=2){
76b0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73  .          if( s
76c0: 71 6c 69 74 65 33 45 78 70 72 54 79 70 65 28 70  qlite3ExprType(p
76d0: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
76e0: 29 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 4e 55 4d  )==SQLITE_SO_NUM
76f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
7700: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 53 4f  return SQLITE_SO
7710: 5f 4e 55 4d 3b 0a 20 20 20 20 20 20 20 20 20 20  _NUM;.          
7720: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
7730: 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e    }.      return
7740: 20 53 51 4c 49 54 45 5f 53 4f 5f 54 45 58 54 3b   SQLITE_SO_TEXT;
7750: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 65 66 61  .    }..    defa
7760: 75 6c 74 3a 0a 20 20 20 20 20 20 61 73 73 65 72  ult:.      asser
7770: 74 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 41 42 4f  t( p->op==TK_ABO
7780: 52 54 20 29 3b 20 20 2f 2a 20 43 61 6e 27 74 20  RT );  /* Can't 
7790: 48 61 70 70 65 6e 20 2a 2f 0a 20 20 20 20 20 20  Happen */.      
77a0: 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74  break;.  }.  ret
77b0: 75 72 6e 20 53 51 4c 49 54 45 5f 53 4f 5f 4e 55  urn SQLITE_SO_NU
77c0: 4d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  M;.}../*.** Gene
77d0: 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74  rate code into t
77e0: 68 65 20 63 75 72 72 65 6e 74 20 56 64 62 65 20  he current Vdbe 
77f0: 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65 20  to evaluate the 
7800: 67 69 76 65 6e 0a 2a 2a 20 65 78 70 72 65 73 73  given.** express
7810: 69 6f 6e 20 61 6e 64 20 6c 65 61 76 65 20 74 68  ion and leave th
7820: 65 20 72 65 73 75 6c 74 20 6f 6e 20 74 68 65 20  e result on the 
7830: 74 6f 70 20 6f 66 20 73 74 61 63 6b 2e 0a 2a 2f  top of stack..*/
7840: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
7850: 72 43 6f 64 65 28 50 61 72 73 65 20 2a 70 50 61  rCode(Parse *pPa
7860: 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
7870: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
7880: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
7890: 69 6e 74 20 6f 70 3b 0a 20 20 69 66 28 20 76 3d  int op;.  if( v=
78a0: 3d 30 20 7c 7c 20 70 45 78 70 72 3d 3d 30 20 29  =0 || pExpr==0 )
78b0: 20 72 65 74 75 72 6e 3b 0a 20 20 73 77 69 74 63   return;.  switc
78c0: 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a  h( pExpr->op ){.
78d0: 20 20 20 20 63 61 73 65 20 54 4b 5f 50 4c 55 53      case TK_PLUS
78e0: 3a 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 41 64  :     op = OP_Ad
78f0: 64 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  d;      break;. 
7900: 20 20 20 63 61 73 65 20 54 4b 5f 4d 49 4e 55 53     case TK_MINUS
7910: 3a 20 20 20 20 6f 70 20 3d 20 4f 50 5f 53 75 62  :    op = OP_Sub
7920: 74 72 61 63 74 3b 20 62 72 65 61 6b 3b 0a 20 20  tract; break;.  
7930: 20 20 63 61 73 65 20 54 4b 5f 53 54 41 52 3a 20    case TK_STAR: 
7940: 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4d 75 6c 74      op = OP_Mult
7950: 69 70 6c 79 3b 20 62 72 65 61 6b 3b 0a 20 20 20  iply; break;.   
7960: 20 63 61 73 65 20 54 4b 5f 53 4c 41 53 48 3a 20   case TK_SLASH: 
7970: 20 20 20 6f 70 20 3d 20 4f 50 5f 44 69 76 69 64     op = OP_Divid
7980: 65 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  e;   break;.    
7990: 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20 20 20 20  case TK_AND:    
79a0: 20 20 6f 70 20 3d 20 4f 50 5f 41 6e 64 3b 20 20    op = OP_And;  
79b0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
79c0: 61 73 65 20 54 4b 5f 4f 52 3a 20 20 20 20 20 20  ase TK_OR:      
79d0: 20 6f 70 20 3d 20 4f 50 5f 4f 72 3b 20 20 20 20   op = OP_Or;    
79e0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
79f0: 73 65 20 54 4b 5f 4c 54 3a 20 20 20 20 20 20 20  se TK_LT:       
7a00: 6f 70 20 3d 20 4f 50 5f 4c 74 3b 20 20 20 20 20  op = OP_Lt;     
7a10: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
7a20: 65 20 54 4b 5f 4c 45 3a 20 20 20 20 20 20 20 6f  e TK_LE:       o
7a30: 70 20 3d 20 4f 50 5f 4c 65 3b 20 20 20 20 20 20  p = OP_Le;      
7a40: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
7a50: 20 54 4b 5f 47 54 3a 20 20 20 20 20 20 20 6f 70   TK_GT:       op
7a60: 20 3d 20 4f 50 5f 47 74 3b 20 20 20 20 20 20 20   = OP_Gt;       
7a70: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
7a80: 54 4b 5f 47 45 3a 20 20 20 20 20 20 20 6f 70 20  TK_GE:       op 
7a90: 3d 20 4f 50 5f 47 65 3b 20 20 20 20 20 20 20 62  = OP_Ge;       b
7aa0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
7ab0: 4b 5f 4e 45 3a 20 20 20 20 20 20 20 6f 70 20 3d  K_NE:       op =
7ac0: 20 4f 50 5f 4e 65 3b 20 20 20 20 20 20 20 62 72   OP_Ne;       br
7ad0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
7ae0: 5f 45 51 3a 20 20 20 20 20 20 20 6f 70 20 3d 20  _EQ:       op = 
7af0: 4f 50 5f 45 71 3b 20 20 20 20 20 20 20 62 72 65  OP_Eq;       bre
7b00: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
7b10: 49 53 4e 55 4c 4c 3a 20 20 20 6f 70 20 3d 20 4f  ISNULL:   op = O
7b20: 50 5f 49 73 4e 75 6c 6c 3b 20 20 20 62 72 65 61  P_IsNull;   brea
7b30: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  k;.    case TK_N
7b40: 4f 54 4e 55 4c 4c 3a 20 20 6f 70 20 3d 20 4f 50  OTNULL:  op = OP
7b50: 5f 4e 6f 74 4e 75 6c 6c 3b 20 20 62 72 65 61 6b  _NotNull;  break
7b60: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f  ;.    case TK_NO
7b70: 54 3a 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f  T:      op = OP_
7b80: 4e 6f 74 3b 20 20 20 20 20 20 62 72 65 61 6b 3b  Not;      break;
7b90: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4d 49  .    case TK_UMI
7ba0: 4e 55 53 3a 20 20 20 6f 70 20 3d 20 4f 50 5f 4e  NUS:   op = OP_N
7bb0: 65 67 61 74 69 76 65 3b 20 62 72 65 61 6b 3b 0a  egative; break;.
7bc0: 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54 41      case TK_BITA
7bd0: 4e 44 3a 20 20 20 6f 70 20 3d 20 4f 50 5f 42 69  ND:   op = OP_Bi
7be0: 74 41 6e 64 3b 20 20 20 62 72 65 61 6b 3b 0a 20  tAnd;   break;. 
7bf0: 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4f 52     case TK_BITOR
7c00: 3a 20 20 20 20 6f 70 20 3d 20 4f 50 5f 42 69 74  :    op = OP_Bit
7c10: 4f 72 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  Or;    break;.  
7c20: 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4e 4f 54    case TK_BITNOT
7c30: 3a 20 20 20 6f 70 20 3d 20 4f 50 5f 42 69 74 4e  :   op = OP_BitN
7c40: 6f 74 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ot;   break;.   
7c50: 20 63 61 73 65 20 54 4b 5f 4c 53 48 49 46 54 3a   case TK_LSHIFT:
7c60: 20 20 20 6f 70 20 3d 20 4f 50 5f 53 68 69 66 74     op = OP_Shift
7c70: 4c 65 66 74 3b 20 20 62 72 65 61 6b 3b 0a 20 20  Left;  break;.  
7c80: 20 20 63 61 73 65 20 54 4b 5f 52 53 48 49 46 54    case TK_RSHIFT
7c90: 3a 20 20 20 6f 70 20 3d 20 4f 50 5f 53 68 69 66  :   op = OP_Shif
7ca0: 74 52 69 67 68 74 3b 20 62 72 65 61 6b 3b 0a 20  tRight; break;. 
7cb0: 20 20 20 63 61 73 65 20 54 4b 5f 52 45 4d 3a 20     case TK_REM: 
7cc0: 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 52 65 6d       op = OP_Rem
7cd0: 61 69 6e 64 65 72 3b 20 20 62 72 65 61 6b 3b 0a  ainder;  break;.
7ce0: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 62 72 65      default: bre
7cf0: 61 6b 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63 68  ak;.  }.  switch
7d00: 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20  ( pExpr->op ){. 
7d10: 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d     case TK_COLUM
7d20: 4e 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70  N: {.      if( p
7d30: 50 61 72 73 65 2d 3e 75 73 65 41 67 67 20 29 7b  Parse->useAgg ){
7d40: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
7d50: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
7d60: 41 67 67 47 65 74 2c 20 30 2c 20 70 45 78 70 72  AggGet, 0, pExpr
7d70: 2d 3e 69 41 67 67 29 3b 0a 20 20 20 20 20 20 7d  ->iAgg);.      }
7d80: 65 6c 73 65 20 69 66 28 20 70 45 78 70 72 2d 3e  else if( pExpr->
7d90: 69 43 6f 6c 75 6d 6e 3e 3d 30 20 29 7b 0a 20 20  iColumn>=0 ){.  
7da0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
7db0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c  eAddOp(v, OP_Col
7dc0: 75 6d 6e 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  umn, pExpr->iTab
7dd0: 6c 65 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  le, pExpr->iColu
7de0: 6d 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  mn);.      }else
7df0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
7e00: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
7e10: 5f 52 65 63 6e 6f 2c 20 70 45 78 70 72 2d 3e 69  _Recno, pExpr->i
7e20: 54 61 62 6c 65 2c 20 30 29 3b 0a 20 20 20 20 20  Table, 0);.     
7e30: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
7e40: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
7e50: 4b 5f 53 54 52 49 4e 47 3a 0a 20 20 20 20 63 61  K_STRING:.    ca
7e60: 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 0a 20 20 20  se TK_FLOAT:.   
7e70: 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52   case TK_INTEGER
7e80: 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45  : {.      if( pE
7e90: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45  xpr->op==TK_INTE
7ea0: 47 45 52 20 26 26 20 73 71 6c 69 74 65 33 46 69  GER && sqlite3Fi
7eb0: 74 73 49 6e 33 32 42 69 74 73 28 70 45 78 70 72  tsIn32Bits(pExpr
7ec0: 2d 3e 74 6f 6b 65 6e 2e 7a 29 20 29 7b 0a 20 20  ->token.z) ){.  
7ed0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
7ee0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74  eAddOp(v, OP_Int
7ef0: 65 67 65 72 2c 20 61 74 6f 69 28 70 45 78 70 72  eger, atoi(pExpr
7f00: 2d 3e 74 6f 6b 65 6e 2e 7a 29 2c 20 30 29 3b 0a  ->token.z), 0);.
7f10: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
7f20: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
7f30: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69  AddOp(v, OP_Stri
7f40: 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  ng, 0, 0);.     
7f50: 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
7f60: 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 20   pExpr->token.z 
7f70: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
7f80: 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20  VdbeChangeP3(v, 
7f90: 2d 31 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  -1, pExpr->token
7fa0: 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  .z, pExpr->token
7fb0: 2e 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  .n);.      sqlit
7fc0: 65 33 56 64 62 65 44 65 71 75 6f 74 65 50 33 28  e3VdbeDequoteP3(
7fd0: 76 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 62 72  v, -1);.      br
7fe0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
7ff0: 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a 20 7b 0a 20  ase TK_NULL: {. 
8000: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
8010: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69  AddOp(v, OP_Stri
8020: 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  ng, 0, 0);.     
8030: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
8040: 20 20 63 61 73 65 20 54 4b 5f 56 41 52 49 41 42    case TK_VARIAB
8050: 4c 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  LE: {.      sqli
8060: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
8070: 4f 50 5f 56 61 72 69 61 62 6c 65 2c 20 70 45 78  OP_Variable, pEx
8080: 70 72 2d 3e 69 54 61 62 6c 65 2c 20 30 29 3b 0a  pr->iTable, 0);.
8090: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
80a0: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c   }.    case TK_L
80b0: 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c  T:.    case TK_L
80c0: 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47  E:.    case TK_G
80d0: 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47  T:.    case TK_G
80e0: 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  E:.    case TK_N
80f0: 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45  E:.    case TK_E
8100: 51 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 73  Q: {.      if( s
8110: 71 6c 69 74 65 33 45 78 70 72 54 79 70 65 28 70  qlite3ExprType(p
8120: 45 78 70 72 29 3d 3d 53 51 4c 49 54 45 5f 53 4f  Expr)==SQLITE_SO
8130: 5f 54 45 58 54 20 29 7b 0a 20 20 20 20 20 20 20  _TEXT ){.       
8140: 20 6f 70 20 2b 3d 20 36 3b 20 20 2f 2a 20 43 6f   op += 6;  /* Co
8150: 6e 76 65 72 74 20 6e 75 6d 65 72 69 63 20 6f 70  nvert numeric op
8160: 63 6f 64 65 73 20 74 6f 20 74 65 78 74 20 6f 70  codes to text op
8170: 63 6f 64 65 73 20 2a 2f 0a 20 20 20 20 20 20 7d  codes */.      }
8180: 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74  .      /* Fall t
8190: 68 72 6f 75 67 68 20 69 6e 74 6f 20 74 68 65 20  hrough into the 
81a0: 6e 65 78 74 20 63 61 73 65 20 2a 2f 0a 20 20 20  next case */.   
81b0: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41   }.    case TK_A
81c0: 4e 44 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ND:.    case TK_
81d0: 4f 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  OR:.    case TK_
81e0: 50 4c 55 53 3a 0a 20 20 20 20 63 61 73 65 20 54  PLUS:.    case T
81f0: 4b 5f 53 54 41 52 3a 0a 20 20 20 20 63 61 73 65  K_STAR:.    case
8200: 20 54 4b 5f 4d 49 4e 55 53 3a 0a 20 20 20 20 63   TK_MINUS:.    c
8210: 61 73 65 20 54 4b 5f 52 45 4d 3a 0a 20 20 20 20  ase TK_REM:.    
8220: 63 61 73 65 20 54 4b 5f 42 49 54 41 4e 44 3a 0a  case TK_BITAND:.
8230: 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4f      case TK_BITO
8240: 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53  R:.    case TK_S
8250: 4c 41 53 48 3a 20 7b 0a 20 20 20 20 20 20 73 71  LASH: {.      sq
8260: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
8270: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
8280: 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ft);.      sqlit
8290: 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
82a0: 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  e, pExpr->pRight
82b0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
82c0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c  VdbeAddOp(v, op,
82d0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72   0, 0);.      br
82e0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
82f0: 61 73 65 20 54 4b 5f 4c 53 48 49 46 54 3a 0a 20  ase TK_LSHIFT:. 
8300: 20 20 20 63 61 73 65 20 54 4b 5f 52 53 48 49 46     case TK_RSHIF
8310: 54 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  T: {.      sqlit
8320: 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
8330: 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  e, pExpr->pRight
8340: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
8350: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
8360: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a   pExpr->pLeft);.
8370: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
8380: 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c 20 30 2c  eAddOp(v, op, 0,
8390: 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b   0);.      break
83a0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
83b0: 20 54 4b 5f 43 4f 4e 43 41 54 3a 20 7b 0a 20 20   TK_CONCAT: {.  
83c0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
83d0: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
83e0: 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20  r->pLeft);.     
83f0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
8400: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
8410: 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 73  pRight);.      s
8420: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
8430: 76 2c 20 4f 50 5f 43 6f 6e 63 61 74 2c 20 32 2c  v, OP_Concat, 2,
8440: 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b   0);.      break
8450: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
8460: 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20 20   TK_UMINUS: {.  
8470: 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
8480: 72 2d 3e 70 4c 65 66 74 20 29 3b 0a 20 20 20 20  r->pLeft );.    
8490: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 4c 65    if( pExpr->pLe
84a0: 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54  ft->op==TK_FLOAT
84b0: 20 7c 7c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74   || pExpr->pLeft
84c0: 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47 45 52  ->op==TK_INTEGER
84d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 54 6f 6b 65   ){.        Toke
84e0: 6e 20 2a 70 20 3d 20 26 70 45 78 70 72 2d 3e 70  n *p = &pExpr->p
84f0: 4c 65 66 74 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20  Left->token;.   
8500: 20 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 73       char *z = s
8510: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70 2d 3e  qliteMalloc( p->
8520: 6e 20 2b 20 32 20 29 3b 0a 20 20 20 20 20 20 20  n + 2 );.       
8530: 20 73 70 72 69 6e 74 66 28 7a 2c 20 22 2d 25 2e   sprintf(z, "-%.
8540: 2a 73 22 2c 20 70 2d 3e 6e 2c 20 70 2d 3e 7a 29  *s", p->n, p->z)
8550: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 45  ;.        if( pE
8560: 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d  xpr->pLeft->op==
8570: 54 4b 5f 49 4e 54 45 47 45 52 20 26 26 20 73 71  TK_INTEGER && sq
8580: 6c 69 74 65 33 46 69 74 73 49 6e 33 32 42 69 74  lite3FitsIn32Bit
8590: 73 28 7a 29 20 29 7b 0a 20 20 20 20 20 20 20 20  s(z) ){.        
85a0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
85b0: 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  Op(v, OP_Integer
85c0: 2c 20 61 74 6f 69 28 7a 29 2c 20 30 29 3b 0a 20  , atoi(z), 0);. 
85d0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
85e0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
85f0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53  dbeAddOp(v, OP_S
8600: 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20  tring, 0, 0);.  
8610: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
8620: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
8630: 65 50 33 28 76 2c 20 2d 31 2c 20 7a 2c 20 70 2d  eP3(v, -1, z, p-
8640: 3e 6e 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 73  >n+1);.        s
8650: 71 6c 69 74 65 46 72 65 65 28 7a 29 3b 0a 20 20  qliteFree(z);.  
8660: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
8670: 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 46 61     }.      /* Fa
8680: 6c 6c 20 74 68 72 6f 75 67 68 20 69 6e 74 6f 20  ll through into 
8690: 54 4b 5f 4e 4f 54 20 2a 2f 0a 20 20 20 20 7d 0a  TK_NOT */.    }.
86a0: 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4e      case TK_BITN
86b0: 4f 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  OT:.    case TK_
86c0: 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  NOT: {.      sql
86d0: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
86e0: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
86f0: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
8700: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 6f 70  3VdbeAddOp(v, op
8710: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 62  , 0, 0);.      b
8720: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
8730: 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a  case TK_ISNULL:.
8740: 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e      case TK_NOTN
8750: 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  ULL: {.      int
8760: 20 64 65 73 74 3b 0a 20 20 20 20 20 20 73 71 6c   dest;.      sql
8770: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
8780: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20   OP_Integer, 1, 
8790: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
87a0: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
87b0: 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  , pExpr->pLeft);
87c0: 0a 20 20 20 20 20 20 64 65 73 74 20 3d 20 73 71  .      dest = sq
87d0: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
87e0: 41 64 64 72 28 76 29 20 2b 20 32 3b 0a 20 20 20  Addr(v) + 2;.   
87f0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
8800: 64 4f 70 28 76 2c 20 6f 70 2c 20 31 2c 20 64 65  dOp(v, op, 1, de
8810: 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  st);.      sqlit
8820: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
8830: 50 5f 41 64 64 49 6d 6d 2c 20 2d 31 2c 20 30 29  P_AddImm, -1, 0)
8840: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
8850: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
8860: 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b  _AGG_FUNCTION: {
8870: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
8880: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 67  beAddOp(v, OP_Ag
8890: 67 47 65 74 2c 20 30 2c 20 70 45 78 70 72 2d 3e  gGet, 0, pExpr->
88a0: 69 41 67 67 29 3b 0a 20 20 20 20 20 20 62 72 65  iAgg);.      bre
88b0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
88c0: 73 65 20 54 4b 5f 47 4c 4f 42 3a 0a 20 20 20 20  se TK_GLOB:.    
88d0: 63 61 73 65 20 54 4b 5f 4c 49 4b 45 3a 0a 20 20  case TK_LIKE:.  
88e0: 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54 49    case TK_FUNCTI
88f0: 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72  ON: {.      Expr
8900: 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 45  List *pList = pE
8910: 78 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 20 20  xpr->pList;.    
8920: 20 20 69 6e 74 20 6e 45 78 70 72 20 3d 20 70 4c    int nExpr = pL
8930: 69 73 74 20 3f 20 70 4c 69 73 74 2d 3e 6e 45 78  ist ? pList->nEx
8940: 70 72 20 3a 20 30 3b 0a 20 20 20 20 20 20 46 75  pr : 0;.      Fu
8950: 6e 63 44 65 66 20 2a 70 44 65 66 3b 0a 20 20 20  ncDef *pDef;.   
8960: 20 20 20 69 6e 74 20 6e 49 64 3b 0a 20 20 20 20     int nId;.    
8970: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49    const char *zI
8980: 64 3b 0a 20 20 20 20 20 20 67 65 74 46 75 6e 63  d;.      getFunc
8990: 74 69 6f 6e 4e 61 6d 65 28 70 45 78 70 72 2c 20  tionName(pExpr, 
89a0: 26 7a 49 64 2c 20 26 6e 49 64 29 3b 0a 20 20 20  &zId, &nId);.   
89b0: 20 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65     pDef = sqlite
89c0: 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 70 50  3FindFunction(pP
89d0: 61 72 73 65 2d 3e 64 62 2c 20 7a 49 64 2c 20 6e  arse->db, zId, n
89e0: 49 64 2c 20 6e 45 78 70 72 2c 20 30 29 3b 0a 20  Id, nExpr, 0);. 
89f0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 44 65       assert( pDe
8a00: 66 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 6e 45  f!=0 );.      nE
8a10: 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
8a20: 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50  rCodeExprList(pP
8a30: 61 72 73 65 2c 20 70 4c 69 73 74 2c 20 70 44 65  arse, pList, pDe
8a40: 66 2d 3e 69 6e 63 6c 75 64 65 54 79 70 65 73 29  f->includeTypes)
8a50: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
8a60: 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 46 75 6e  dbeOp3(v, OP_Fun
8a70: 63 74 69 6f 6e 2c 20 6e 45 78 70 72 2c 20 30 2c  ction, nExpr, 0,
8a80: 20 28 63 68 61 72 2a 29 70 44 65 66 2c 20 50 33   (char*)pDef, P3
8a90: 5f 50 4f 49 4e 54 45 52 29 3b 0a 20 20 20 20 20  _POINTER);.     
8aa0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
8ab0: 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54    case TK_SELECT
8ac0: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
8ad0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
8ae0: 5f 4d 65 6d 4c 6f 61 64 2c 20 70 45 78 70 72 2d  _MemLoad, pExpr-
8af0: 3e 69 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20  >iColumn, 0);.  
8b00: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
8b10: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a  .    case TK_IN:
8b20: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64   {.      int add
8b30: 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  r;.      sqlite3
8b40: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
8b50: 49 6e 74 65 67 65 72 2c 20 31 2c 20 30 29 3b 0a  Integer, 1, 0);.
8b60: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
8b70: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
8b80: 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  xpr->pLeft);.   
8b90: 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
8ba0: 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
8bb0: 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (v);.      sqlit
8bc0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
8bd0: 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 2d 31 2c 20 61  P_NotNull, -1, a
8be0: 64 64 72 2b 34 29 3b 0a 20 20 20 20 20 20 73 71  ddr+4);.      sq
8bf0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
8c00: 2c 20 4f 50 5f 50 6f 70 2c 20 32 2c 20 30 29 3b  , OP_Pop, 2, 0);
8c10: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
8c20: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74  beAddOp(v, OP_St
8c30: 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ring, 0, 0);.   
8c40: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
8c50: 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  dOp(v, OP_Goto, 
8c60: 30 2c 20 61 64 64 72 2b 36 29 3b 0a 20 20 20 20  0, addr+6);.    
8c70: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 53 65    if( pExpr->pSe
8c80: 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20  lect ){.        
8c90: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
8ca0: 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 70 45  (v, OP_Found, pE
8cb0: 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 61 64 64  xpr->iTable, add
8cc0: 72 2b 36 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  r+6);.      }els
8cd0: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
8ce0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
8cf0: 50 5f 53 65 74 46 6f 75 6e 64 2c 20 70 45 78 70  P_SetFound, pExp
8d00: 72 2d 3e 69 54 61 62 6c 65 2c 20 61 64 64 72 2b  r->iTable, addr+
8d10: 36 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  6);.      }.    
8d20: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
8d30: 4f 70 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c  Op(v, OP_AddImm,
8d40: 20 2d 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 62   -1, 0);.      b
8d50: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
8d60: 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a  case TK_BETWEEN:
8d70: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
8d80: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
8d90: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a   pExpr->pLeft);.
8da0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
8db0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70  eAddOp(v, OP_Dup
8dc0: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 0, 0);.      s
8dd0: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
8de0: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
8df0: 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29  ist->a[0].pExpr)
8e00: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
8e10: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47  dbeAddOp(v, OP_G
8e20: 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  e, 0, 0);.      
8e30: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
8e40: 28 76 2c 20 4f 50 5f 50 75 6c 6c 2c 20 31 2c 20  (v, OP_Pull, 1, 
8e50: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
8e60: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
8e70: 2c 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e  , pExpr->pList->
8e80: 61 5b 31 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[1].pExpr);.   
8e90: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
8ea0: 64 4f 70 28 76 2c 20 4f 50 5f 4c 65 2c 20 30 2c  dOp(v, OP_Le, 0,
8eb0: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
8ec0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
8ed0: 50 5f 41 6e 64 2c 20 30 2c 20 30 29 3b 0a 20 20  P_And, 0, 0);.  
8ee0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
8ef0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 50 4c  .    case TK_UPL
8f00: 55 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  US:.    case TK_
8f10: 41 53 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  AS: {.      sqli
8f20: 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
8f30: 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
8f40: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
8f50: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
8f60: 4b 5f 43 41 53 45 3a 20 7b 0a 20 20 20 20 20 20  K_CASE: {.      
8f70: 69 6e 74 20 65 78 70 72 5f 65 6e 64 5f 6c 61 62  int expr_end_lab
8f80: 65 6c 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 75  el;.      int ju
8f90: 6d 70 49 6e 73 74 3b 0a 20 20 20 20 20 20 69 6e  mpInst;.      in
8fa0: 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20 69 6e  t addr;.      in
8fb0: 74 20 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 69  t nExpr;.      i
8fc0: 6e 74 20 69 3b 0a 0a 20 20 20 20 20 20 61 73 73  nt i;..      ass
8fd0: 65 72 74 28 70 45 78 70 72 2d 3e 70 4c 69 73 74  ert(pExpr->pList
8fe0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
8ff0: 28 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e  (pExpr->pList->n
9000: 45 78 70 72 20 25 20 32 29 20 3d 3d 20 30 29 3b  Expr % 2) == 0);
9010: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 70 45  .      assert(pE
9020: 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70  xpr->pList->nExp
9030: 72 20 3e 20 30 29 3b 0a 20 20 20 20 20 20 6e 45  r > 0);.      nE
9040: 78 70 72 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69  xpr = pExpr->pLi
9050: 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20  st->nExpr;.     
9060: 20 65 78 70 72 5f 65 6e 64 5f 6c 61 62 65 6c 20   expr_end_label 
9070: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
9080: 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
9090: 20 69 66 28 20 70 45 78 70 72 2d 3e 70 4c 65 66   if( pExpr->pLef
90a0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
90b0: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
90c0: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
90d0: 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
90e0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78    for(i=0; i<nEx
90f0: 70 72 3b 20 69 3d 69 2b 32 29 7b 0a 20 20 20 20  pr; i=i+2){.    
9100: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
9110: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
9120: 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  r->pList->a[i].p
9130: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 69  Expr);.        i
9140: 66 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20  f( pExpr->pLeft 
9150: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
9160: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
9170: 20 4f 50 5f 44 75 70 2c 20 31 2c 20 31 29 3b 0a   OP_Dup, 1, 1);.
9180: 20 20 20 20 20 20 20 20 20 20 6a 75 6d 70 49 6e            jumpIn
9190: 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  st = sqlite3Vdbe
91a0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 2c 20  AddOp(v, OP_Ne, 
91b0: 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  1, 0);.         
91c0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
91d0: 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20  p(v, OP_Pop, 1, 
91e0: 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  0);.        }els
91f0: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 6a 75 6d  e{.          jum
9200: 70 49 6e 73 74 20 3d 20 73 71 6c 69 74 65 33 56  pInst = sqlite3V
9210: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
9220: 66 4e 6f 74 2c 20 31 2c 20 30 29 3b 0a 20 20 20  fNot, 1, 0);.   
9230: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
9240: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
9250: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
9260: 69 73 74 2d 3e 61 5b 69 2b 31 5d 2e 70 45 78 70  ist->a[i+1].pExp
9270: 72 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  r);.        sqli
9280: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
9290: 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 65 78 70 72  OP_Goto, 0, expr
92a0: 5f 65 6e 64 5f 6c 61 62 65 6c 29 3b 0a 20 20 20  _end_label);.   
92b0: 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69       addr = sqli
92c0: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
92d0: 64 72 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73  dr(v);.        s
92e0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
92f0: 50 32 28 76 2c 20 6a 75 6d 70 49 6e 73 74 2c 20  P2(v, jumpInst, 
9300: 61 64 64 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  addr);.      }. 
9310: 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
9320: 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 20 20 20  pLeft ){.       
9330: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
9340: 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20  p(v, OP_Pop, 1, 
9350: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
9360: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 52 69    if( pExpr->pRi
9370: 67 68 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ght ){.        s
9380: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
9390: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
93a0: 69 67 68 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c  ight);.      }el
93b0: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
93c0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
93d0: 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29  OP_String, 0, 0)
93e0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
93f0: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
9400: 76 65 4c 61 62 65 6c 28 76 2c 20 65 78 70 72 5f  veLabel(v, expr_
9410: 65 6e 64 5f 6c 61 62 65 6c 29 3b 0a 20 20 20 20  end_label);.    
9420: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
9430: 20 20 20 63 61 73 65 20 54 4b 5f 52 41 49 53 45     case TK_RAISE
9440: 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 21 70  : {.      if( !p
9450: 50 61 72 73 65 2d 3e 74 72 69 67 53 74 61 63 6b  Parse->trigStack
9460: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
9470: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
9480: 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  se,.            
9490: 20 20 20 20 20 20 20 20 20 20 20 22 52 41 49 53             "RAIS
94a0: 45 28 29 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20  E() may only be 
94b0: 75 73 65 64 20 77 69 74 68 69 6e 20 61 20 74 72  used within a tr
94c0: 69 67 67 65 72 2d 70 72 6f 67 72 61 6d 22 29 3b  igger-program");
94d0: 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d  .        pParse-
94e0: 3e 6e 45 72 72 2b 2b 3b 0a 09 72 65 74 75 72 6e  >nErr++;..return
94f0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
9500: 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  if( pExpr->iColu
9510: 6d 6e 20 3d 3d 20 4f 45 5f 52 6f 6c 6c 62 61 63  mn == OE_Rollbac
9520: 6b 20 7c 7c 0a 09 20 20 70 45 78 70 72 2d 3e 69  k ||..  pExpr->i
9530: 43 6f 6c 75 6d 6e 20 3d 3d 20 4f 45 5f 41 62 6f  Column == OE_Abo
9540: 72 74 20 7c 7c 0a 09 20 20 70 45 78 70 72 2d 3e  rt ||..  pExpr->
9550: 69 43 6f 6c 75 6d 6e 20 3d 3d 20 4f 45 5f 46 61  iColumn == OE_Fa
9560: 69 6c 20 29 7b 0a 09 20 20 73 71 6c 69 74 65 33  il ){..  sqlite3
9570: 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 48 61  VdbeOp3(v, OP_Ha
9580: 6c 74 2c 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  lt, SQLITE_CONST
9590: 52 41 49 4e 54 2c 20 70 45 78 70 72 2d 3e 69 43  RAINT, pExpr->iC
95a0: 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 20 20  olumn,.         
95b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
95c0: 20 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a    pExpr->token.z
95d0: 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e  , pExpr->token.n
95e0: 29 3b 0a 09 20 20 73 71 6c 69 74 65 33 56 64 62  );..  sqlite3Vdb
95f0: 65 44 65 71 75 6f 74 65 50 33 28 76 2c 20 2d 31  eDequoteP3(v, -1
9600: 29 3b 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20  );.      } else 
9610: 7b 0a 09 20 20 61 73 73 65 72 74 28 20 70 45 78  {..  assert( pEx
9620: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 3d 20 4f  pr->iColumn == O
9630: 45 5f 49 67 6e 6f 72 65 20 29 3b 0a 09 20 20 73  E_Ignore );..  s
9640: 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c  qlite3VdbeOp3(v,
9650: 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70 50 61   OP_Goto, 0, pPa
9660: 72 73 65 2d 3e 74 72 69 67 53 74 61 63 6b 2d 3e  rse->trigStack->
9670: 69 67 6e 6f 72 65 4a 75 6d 70 2c 0a 20 20 20 20  ignoreJump,.    
9680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9690: 20 20 20 20 20 20 20 22 28 49 47 4e 4f 52 45 20         "(IGNORE 
96a0: 6a 75 6d 70 29 22 2c 20 30 29 3b 0a 20 20 20 20  jump)", 0);.    
96b0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 62 72    }.    }.    br
96c0: 65 61 6b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  eak;.  }.}../*.*
96d0: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
96e0: 74 68 61 74 20 70 75 73 68 65 73 20 74 68 65 20  that pushes the 
96f0: 76 61 6c 75 65 20 6f 66 20 65 76 65 72 79 20 65  value of every e
9700: 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 67 69  lement of the gi
9710: 76 65 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  ven.** expressio
9720: 6e 20 6c 69 73 74 20 6f 6e 74 6f 20 74 68 65 20  n list onto the 
9730: 73 74 61 63 6b 2e 20 20 49 66 20 74 68 65 20 69  stack.  If the i
9740: 6e 63 6c 75 64 65 54 79 70 65 73 20 66 6c 61 67  ncludeTypes flag
9750: 20 69 73 20 74 72 75 65 2c 0a 2a 2a 20 74 68 65   is true,.** the
9760: 6e 20 61 6c 73 6f 20 70 75 73 68 20 61 20 73 74  n also push a st
9770: 72 69 6e 67 20 74 68 61 74 20 69 73 20 74 68 65  ring that is the
9780: 20 64 61 74 61 74 79 70 65 20 6f 66 20 65 61 63   datatype of eac
9790: 68 20 65 6c 65 6d 65 6e 74 20 6f 6e 74 6f 0a 2a  h element onto.*
97a0: 2a 20 74 68 65 20 73 74 61 63 6b 20 61 66 74 65  * the stack afte
97b0: 72 20 74 68 65 20 76 61 6c 75 65 2e 0a 2a 2a 0a  r the value..**.
97c0: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
97d0: 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73  mber of elements
97e0: 20 70 75 73 68 65 64 20 6f 6e 74 6f 20 74 68 65   pushed onto the
97f0: 20 73 74 61 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73   stack..*/.int s
9800: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78  qlite3ExprCodeEx
9810: 70 72 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20  prList(.  Parse 
9820: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20  *pParse,     /* 
9830: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
9840: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
9850: 4c 69 73 74 2c 20 20 20 2f 2a 20 54 68 65 20 65  List,   /* The e
9860: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 74  xpression list t
9870: 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20  o be coded */.  
9880: 69 6e 74 20 69 6e 63 6c 75 64 65 54 79 70 65 73  int includeTypes
9890: 20 20 20 2f 2a 20 54 52 55 45 20 74 6f 20 70 75     /* TRUE to pu
98a0: 74 20 64 61 74 61 74 79 70 65 73 20 6f 6e 20 74  t datatypes on t
98b0: 68 65 20 73 74 61 63 6b 20 74 6f 6f 20 2a 2f 0a  he stack too */.
98c0: 29 7b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72  ){.  struct Expr
98d0: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
98e0: 3b 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20  ;.  int i, n;.  
98f0: 56 64 62 65 20 2a 76 3b 0a 20 20 69 66 28 20 70  Vdbe *v;.  if( p
9900: 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  List==0 ) return
9910: 20 30 3b 0a 20 20 76 20 3d 20 73 71 6c 69 74 65   0;.  v = sqlite
9920: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
9930: 3b 0a 20 20 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e  ;.  n = pList->n
9940: 45 78 70 72 3b 0a 20 20 66 6f 72 28 70 49 74 65  Expr;.  for(pIte
9950: 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b  m=pList->a, i=0;
9960: 20 69 3c 6e 3b 20 69 2b 2b 2c 20 70 49 74 65 6d   i<n; i++, pItem
9970: 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
9980: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
9990: 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a   pItem->pExpr);.
99a0: 20 20 20 20 69 66 28 20 69 6e 63 6c 75 64 65 54      if( includeT
99b0: 79 70 65 73 20 29 7b 0a 20 20 20 20 20 20 73 71  ypes ){.      sq
99c0: 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
99d0: 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 2c  OP_String, 0, 0,
99e0: 20 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74   .         sqlit
99f0: 65 33 45 78 70 72 54 79 70 65 28 70 49 74 65 6d  e3ExprType(pItem
9a00: 2d 3e 70 45 78 70 72 29 3d 3d 53 51 4c 49 54 45  ->pExpr)==SQLITE
9a10: 5f 53 4f 5f 4e 55 4d 20 3f 20 22 6e 75 6d 65 72  _SO_NUM ? "numer
9a20: 69 63 22 20 3a 20 22 74 65 78 74 22 2c 0a 20 20  ic" : "text",.  
9a30: 20 20 20 20 20 20 20 50 33 5f 53 54 41 54 49 43         P3_STATIC
9a40: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
9a50: 65 74 75 72 6e 20 69 6e 63 6c 75 64 65 54 79 70  eturn includeTyp
9a60: 65 73 20 3f 20 6e 2a 32 20 3a 20 6e 3b 0a 7d 0a  es ? n*2 : n;.}.
9a70: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
9a80: 63 6f 64 65 20 66 6f 72 20 61 20 62 6f 6f 6c 65  code for a boole
9a90: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 73 75  an expression su
9aa0: 63 68 20 74 68 61 74 20 61 20 6a 75 6d 70 20 69  ch that a jump i
9ab0: 73 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 74 68 65  s made.** to the
9ac0: 20 6c 61 62 65 6c 20 22 64 65 73 74 22 20 69 66   label "dest" if
9ad0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
9ae0: 69 73 20 74 72 75 65 20 62 75 74 20 65 78 65 63  is true but exec
9af0: 75 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75  ution.** continu
9b00: 65 73 20 73 74 72 61 69 67 68 74 20 74 68 72 75  es straight thru
9b10: 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
9b20: 6f 6e 20 69 73 20 66 61 6c 73 65 2e 0a 2a 2a 0a  on is false..**.
9b30: 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73  ** If the expres
9b40: 73 69 6f 6e 20 65 76 61 6c 75 61 74 65 73 20 74  sion evaluates t
9b50: 6f 20 4e 55 4c 4c 20 28 6e 65 69 74 68 65 72 20  o NULL (neither 
9b60: 74 72 75 65 20 6e 6f 72 20 66 61 6c 73 65 29 2c  true nor false),
9b70: 20 74 68 65 6e 0a 2a 2a 20 74 61 6b 65 20 74 68   then.** take th
9b80: 65 20 6a 75 6d 70 20 69 66 20 74 68 65 20 6a 75  e jump if the ju
9b90: 6d 70 49 66 4e 75 6c 6c 20 66 6c 61 67 20 69 73  mpIfNull flag is
9ba0: 20 74 72 75 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73   true..*/.void s
9bb0: 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65  qlite3ExprIfTrue
9bc0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
9bd0: 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74  Expr *pExpr, int
9be0: 20 64 65 73 74 2c 20 69 6e 74 20 6a 75 6d 70 49   dest, int jumpI
9bf0: 66 4e 75 6c 6c 29 7b 0a 20 20 56 64 62 65 20 2a  fNull){.  Vdbe *
9c00: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
9c10: 65 3b 0a 20 20 69 6e 74 20 6f 70 20 3d 20 30 3b  e;.  int op = 0;
9c20: 0a 20 20 69 66 28 20 76 3d 3d 30 20 7c 7c 20 70  .  if( v==0 || p
9c30: 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e  Expr==0 ) return
9c40: 3b 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70  ;.  switch( pExp
9c50: 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  r->op ){.    cas
9c60: 65 20 54 4b 5f 4c 54 3a 20 20 20 20 20 20 20 6f  e TK_LT:       o
9c70: 70 20 3d 20 4f 50 5f 4c 74 3b 20 20 20 20 20 20  p = OP_Lt;      
9c80: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
9c90: 20 54 4b 5f 4c 45 3a 20 20 20 20 20 20 20 6f 70   TK_LE:       op
9ca0: 20 3d 20 4f 50 5f 4c 65 3b 20 20 20 20 20 20 20   = OP_Le;       
9cb0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
9cc0: 54 4b 5f 47 54 3a 20 20 20 20 20 20 20 6f 70 20  TK_GT:       op 
9cd0: 3d 20 4f 50 5f 47 74 3b 20 20 20 20 20 20 20 62  = OP_Gt;       b
9ce0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
9cf0: 4b 5f 47 45 3a 20 20 20 20 20 20 20 6f 70 20 3d  K_GE:       op =
9d00: 20 4f 50 5f 47 65 3b 20 20 20 20 20 20 20 62 72   OP_Ge;       br
9d10: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
9d20: 5f 4e 45 3a 20 20 20 20 20 20 20 6f 70 20 3d 20  _NE:       op = 
9d30: 4f 50 5f 4e 65 3b 20 20 20 20 20 20 20 62 72 65  OP_Ne;       bre
9d40: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
9d50: 45 51 3a 20 20 20 20 20 20 20 6f 70 20 3d 20 4f  EQ:       op = O
9d60: 50 5f 45 71 3b 20 20 20 20 20 20 20 62 72 65 61  P_Eq;       brea
9d70: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  k;.    case TK_I
9d80: 53 4e 55 4c 4c 3a 20 20 20 6f 70 20 3d 20 4f 50  SNULL:   op = OP
9d90: 5f 49 73 4e 75 6c 6c 3b 20 20 20 62 72 65 61 6b  _IsNull;   break
9da0: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f  ;.    case TK_NO
9db0: 54 4e 55 4c 4c 3a 20 20 6f 70 20 3d 20 4f 50 5f  TNULL:  op = OP_
9dc0: 4e 6f 74 4e 75 6c 6c 3b 20 20 62 72 65 61 6b 3b  NotNull;  break;
9dd0: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 20 62  .    default:  b
9de0: 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 73 77 69 74  reak;.  }.  swit
9df0: 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b  ch( pExpr->op ){
9e00: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44  .    case TK_AND
9e10: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 32  : {.      int d2
9e20: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
9e30: 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
9e40: 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
9e50: 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 78  alse(pParse, pEx
9e60: 70 72 2d 3e 70 4c 65 66 74 2c 20 64 32 2c 20 21  pr->pLeft, d2, !
9e70: 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
9e80: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
9e90: 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78  True(pParse, pEx
9ea0: 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74  pr->pRight, dest
9eb0: 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
9ec0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
9ed0: 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
9ee0: 64 32 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  d2);.      break
9ef0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
9f00: 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20 20 20   TK_OR: {.      
9f10: 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75  sqlite3ExprIfTru
9f20: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
9f30: 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75  >pLeft, dest, ju
9f40: 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
9f50: 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72   sqlite3ExprIfTr
9f60: 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ue(pParse, pExpr
9f70: 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20  ->pRight, dest, 
9f80: 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
9f90: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
9fa0: 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a      case TK_NOT:
9fb0: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
9fc0: 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
9fd0: 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
9fe0: 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
9ff0: 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ll);.      break
a000: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
a010: 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65   TK_LT:.    case
a020: 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65   TK_LE:.    case
a030: 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65   TK_GT:.    case
a040: 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65   TK_GE:.    case
a050: 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65   TK_NE:.    case
a060: 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20   TK_EQ: {.      
a070: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
a080: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
a090: 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  Left);.      sql
a0a0: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
a0b0: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
a0c0: 68 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73  ht);.      if( s
a0d0: 71 6c 69 74 65 33 45 78 70 72 54 79 70 65 28 70  qlite3ExprType(p
a0e0: 45 78 70 72 29 3d 3d 53 51 4c 49 54 45 5f 53 4f  Expr)==SQLITE_SO
a0f0: 5f 54 45 58 54 20 29 7b 0a 20 20 20 20 20 20 20  _TEXT ){.       
a100: 20 6f 70 20 2b 3d 20 36 3b 20 20 2f 2a 20 43 6f   op += 6;  /* Co
a110: 6e 76 65 72 74 20 6e 75 6d 65 72 69 63 20 6f 70  nvert numeric op
a120: 63 6f 64 65 73 20 74 6f 20 74 65 78 74 20 6f 70  codes to text op
a130: 63 6f 64 65 73 20 2a 2f 0a 20 20 20 20 20 20 7d  codes */.      }
a140: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
a150: 62 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c 20 6a  beAddOp(v, op, j
a160: 75 6d 70 49 66 4e 75 6c 6c 2c 20 64 65 73 74 29  umpIfNull, dest)
a170: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
a180: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
a190: 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73  _ISNULL:.    cas
a1a0: 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a  e TK_NOTNULL: {.
a1b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
a1c0: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
a1d0: 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  xpr->pLeft);.   
a1e0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
a1f0: 64 4f 70 28 76 2c 20 6f 70 2c 20 31 2c 20 64 65  dOp(v, op, 1, de
a200: 73 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  st);.      break
a210: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
a220: 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20   TK_IN: {.      
a230: 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20  int addr;.      
a240: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
a250: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
a260: 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 61 64 64  Left);.      add
a270: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  r = sqlite3VdbeC
a280: 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
a290: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
a2a0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f 74 4e  AddOp(v, OP_NotN
a2b0: 75 6c 6c 2c 20 2d 31 2c 20 61 64 64 72 2b 33 29  ull, -1, addr+3)
a2c0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
a2d0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50  dbeAddOp(v, OP_P
a2e0: 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20  op, 1, 0);.     
a2f0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
a300: 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  p(v, OP_Goto, 0,
a310: 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 3f 20 64 65   jumpIfNull ? de
a320: 73 74 20 3a 20 61 64 64 72 2b 34 29 3b 0a 20 20  st : addr+4);.  
a330: 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70      if( pExpr->p
a340: 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20  Select ){.      
a350: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
a360: 4f 70 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20  Op(v, OP_Found, 
a370: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 64  pExpr->iTable, d
a380: 65 73 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  est);.      }els
a390: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
a3a0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
a3b0: 50 5f 53 65 74 46 6f 75 6e 64 2c 20 70 45 78 70  P_SetFound, pExp
a3c0: 72 2d 3e 69 54 61 62 6c 65 2c 20 64 65 73 74 29  r->iTable, dest)
a3d0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
a3e0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
a3f0: 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e   case TK_BETWEEN
a400: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64  : {.      int ad
a410: 64 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  dr;.      sqlite
a420: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
a430: 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  , pExpr->pLeft);
a440: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
a450: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75  beAddOp(v, OP_Du
a460: 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  p, 0, 0);.      
a470: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
a480: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
a490: 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
a4a0: 29 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20  );.      addr = 
a4b0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
a4c0: 28 76 2c 20 4f 50 5f 4c 74 2c 20 21 6a 75 6d 70  (v, OP_Lt, !jump
a4d0: 49 66 4e 75 6c 6c 2c 20 30 29 3b 0a 20 20 20 20  IfNull, 0);.    
a4e0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
a4f0: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
a500: 3e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78  >pList->a[1].pEx
a510: 70 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  pr);.      sqlit
a520: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
a530: 50 5f 4c 65 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  P_Le, jumpIfNull
a540: 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 73  , dest);.      s
a550: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
a560: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
a570: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
a580: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28  te3VdbeChangeP2(
a590: 76 2c 20 61 64 64 72 2c 20 73 71 6c 69 74 65 33  v, addr, sqlite3
a5a0: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
a5b0: 76 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  v));.      sqlit
a5c0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
a5d0: 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20  P_Pop, 1, 0);.  
a5e0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
a5f0: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
a600: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
a610: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
a620: 78 70 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  xpr);.      sqli
a630: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
a640: 4f 50 5f 49 66 2c 20 6a 75 6d 70 49 66 4e 75 6c  OP_If, jumpIfNul
a650: 6c 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20  l, dest);.      
a660: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
a670: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
a680: 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20 62 6f  te code for a bo
a690: 6f 6c 65 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  olean expression
a6a0: 20 73 75 63 68 20 74 68 61 74 20 61 20 6a 75 6d   such that a jum
a6b0: 70 20 69 73 20 6d 61 64 65 0a 2a 2a 20 74 6f 20  p is made.** to 
a6c0: 74 68 65 20 6c 61 62 65 6c 20 22 64 65 73 74 22  the label "dest"
a6d0: 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
a6e0: 6f 6e 20 69 73 20 66 61 6c 73 65 20 62 75 74 20  on is false but 
a6f0: 65 78 65 63 75 74 69 6f 6e 0a 2a 2a 20 63 6f 6e  execution.** con
a700: 74 69 6e 75 65 73 20 73 74 72 61 69 67 68 74 20  tinues straight 
a710: 74 68 72 75 20 69 66 20 74 68 65 20 65 78 70 72  thru if the expr
a720: 65 73 73 69 6f 6e 20 69 73 20 74 72 75 65 2e 0a  ession is true..
a730: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70  **.** If the exp
a740: 72 65 73 73 69 6f 6e 20 65 76 61 6c 75 61 74 65  ression evaluate
a750: 73 20 74 6f 20 4e 55 4c 4c 20 28 6e 65 69 74 68  s to NULL (neith
a760: 65 72 20 74 72 75 65 20 6e 6f 72 20 66 61 6c 73  er true nor fals
a770: 65 29 20 74 68 65 6e 0a 2a 2a 20 6a 75 6d 70 20  e) then.** jump 
a780: 69 66 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 69 73  if jumpIfNull is
a790: 20 74 72 75 65 20 6f 72 20 66 61 6c 6c 20 74 68   true or fall th
a7a0: 72 6f 75 67 68 20 69 66 20 6a 75 6d 70 49 66 4e  rough if jumpIfN
a7b0: 75 6c 6c 20 69 73 20 66 61 6c 73 65 2e 0a 2a 2f  ull is false..*/
a7c0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
a7d0: 72 49 66 46 61 6c 73 65 28 50 61 72 73 65 20 2a  rIfFalse(Parse *
a7e0: 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
a7f0: 78 70 72 2c 20 69 6e 74 20 64 65 73 74 2c 20 69  xpr, int dest, i
a800: 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a  nt jumpIfNull){.
a810: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
a820: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
a830: 20 6f 70 20 3d 20 30 3b 0a 20 20 69 66 28 20 76   op = 0;.  if( v
a840: 3d 3d 30 20 7c 7c 20 70 45 78 70 72 3d 3d 30 20  ==0 || pExpr==0 
a850: 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 77 69 74  ) return;.  swit
a860: 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b  ch( pExpr->op ){
a870: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a  .    case TK_LT:
a880: 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 47         op = OP_G
a890: 65 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  e;       break;.
a8a0: 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 20      case TK_LE: 
a8b0: 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 47 74        op = OP_Gt
a8c0: 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;       break;. 
a8d0: 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 20 20     case TK_GT:  
a8e0: 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4c 65 3b       op = OP_Le;
a8f0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
a900: 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 20 20 20    case TK_GE:   
a910: 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4c 74 3b 20      op = OP_Lt; 
a920: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
a930: 20 63 61 73 65 20 54 4b 5f 4e 45 3a 20 20 20 20   case TK_NE:    
a940: 20 20 20 6f 70 20 3d 20 4f 50 5f 45 71 3b 20 20     op = OP_Eq;  
a950: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
a960: 63 61 73 65 20 54 4b 5f 45 51 3a 20 20 20 20 20  case TK_EQ:     
a970: 20 20 6f 70 20 3d 20 4f 50 5f 4e 65 3b 20 20 20    op = OP_Ne;   
a980: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
a990: 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 20 20  ase TK_ISNULL:  
a9a0: 20 6f 70 20 3d 20 4f 50 5f 4e 6f 74 4e 75 6c 6c   op = OP_NotNull
a9b0: 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  ;  break;.    ca
a9c0: 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 20  se TK_NOTNULL:  
a9d0: 6f 70 20 3d 20 4f 50 5f 49 73 4e 75 6c 6c 3b 20  op = OP_IsNull; 
a9e0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66    break;.    def
a9f0: 61 75 6c 74 3a 20 20 62 72 65 61 6b 3b 0a 20 20  ault:  break;.  
aa00: 7d 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70  }.  switch( pExp
aa10: 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  r->op ){.    cas
aa20: 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a 20 20 20 20  e TK_AND: {.    
aa30: 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
aa40: 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 78  alse(pParse, pEx
aa50: 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c  pr->pLeft, dest,
aa60: 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
aa70: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
aa80: 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
aa90: 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65  Expr->pRight, de
aaa0: 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
aab0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
aac0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
aad0: 4f 52 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  OR: {.      int 
aae0: 64 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  d2 = sqlite3Vdbe
aaf0: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
ab00: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
ab10: 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45  fTrue(pParse, pE
ab20: 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 32 2c 20  xpr->pLeft, d2, 
ab30: 21 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20  !jumpIfNull);.  
ab40: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
ab50: 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
ab60: 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65  Expr->pRight, de
ab70: 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
ab80: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
ab90: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
aba0: 2c 20 64 32 29 3b 0a 20 20 20 20 20 20 62 72 65  , d2);.      bre
abb0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
abc0: 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20  se TK_NOT: {.   
abd0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
abe0: 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78  True(pParse, pEx
abf0: 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c  pr->pLeft, dest,
ac00: 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
ac10: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
ac20: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a  .    case TK_LT:
ac30: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a  .    case TK_LE:
ac40: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a  .    case TK_GT:
ac50: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a  .    case TK_GE:
ac60: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a  .    case TK_NE:
ac70: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a  .    case TK_EQ:
ac80: 20 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c   {.      if( sql
ac90: 69 74 65 33 45 78 70 72 54 79 70 65 28 70 45 78  ite3ExprType(pEx
aca0: 70 72 29 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 54  pr)==SQLITE_SO_T
acb0: 45 58 54 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  EXT ){.        /
acc0: 2a 20 43 6f 6e 76 65 72 74 20 6e 75 6d 65 72 69  * Convert numeri
acd0: 63 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 63  c comparison opc
ace0: 6f 64 65 73 20 69 6e 74 6f 20 74 65 78 74 20 63  odes into text c
acf0: 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 63 6f 64 65  omparison opcode
ad00: 73 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68  s..        ** Th
ad10: 69 73 20 73 74 65 70 20 64 65 70 65 6e 64 73 20  is step depends 
ad20: 6f 6e 20 74 68 65 20 66 61 63 74 20 74 68 61 74  on the fact that
ad30: 20 74 68 65 20 74 65 78 74 20 63 6f 6d 70 61 72   the text compar
ad40: 69 73 69 6f 6e 20 6f 70 63 6f 64 65 73 20 61 72  ision opcodes ar
ad50: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 77  e.        ** alw
ad60: 61 79 73 20 36 20 67 72 65 61 74 65 72 20 74 68  ays 6 greater th
ad70: 61 6e 20 74 68 65 69 72 20 63 6f 72 72 65 73 70  an their corresp
ad80: 6f 6e 64 69 6e 67 20 6e 75 6d 65 72 69 63 20 63  onding numeric c
ad90: 6f 6d 70 61 72 69 73 6f 6e 0a 20 20 20 20 20 20  omparison.      
ada0: 20 20 2a 2a 20 6f 70 63 6f 64 65 73 2e 0a 20 20    ** opcodes..  
adb0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
adc0: 20 61 73 73 65 72 74 28 20 4f 50 5f 45 71 2b 36   assert( OP_Eq+6
add0: 20 3d 3d 20 4f 50 5f 53 74 72 45 71 20 29 3b 0a   == OP_StrEq );.
ade0: 20 20 20 20 20 20 20 20 6f 70 20 2b 3d 20 36 3b          op += 6;
adf0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
ae00: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
ae10: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
ae20: 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  eft);.      sqli
ae30: 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
ae40: 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
ae50: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
ae60: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 6f 70  3VdbeAddOp(v, op
ae70: 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 2c 20 64 65  , jumpIfNull, de
ae80: 73 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  st);.      break
ae90: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
aea0: 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20   TK_ISNULL:.    
aeb0: 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a  case TK_NOTNULL:
aec0: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
aed0: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
aee0: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a   pExpr->pLeft);.
aef0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
af00: 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c 20 31 2c  eAddOp(v, op, 1,
af10: 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 62 72   dest);.      br
af20: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
af30: 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20  ase TK_IN: {.   
af40: 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20     int addr;.   
af50: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
af60: 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
af70: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20  ->pLeft);.      
af80: 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
af90: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
afa0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
afb0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e  dbeAddOp(v, OP_N
afc0: 6f 74 4e 75 6c 6c 2c 20 2d 31 2c 20 61 64 64 72  otNull, -1, addr
afd0: 2b 33 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  +3);.      sqlit
afe0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
aff0: 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20  P_Pop, 1, 0);.  
b000: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
b010: 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  ddOp(v, OP_Goto,
b020: 20 30 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 3f   0, jumpIfNull ?
b030: 20 64 65 73 74 20 3a 20 61 64 64 72 2b 34 29 3b   dest : addr+4);
b040: 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
b050: 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ->pSelect ){.   
b060: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
b070: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f 74 46  AddOp(v, OP_NotF
b080: 6f 75 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54 61  ound, pExpr->iTa
b090: 62 6c 65 2c 20 64 65 73 74 29 3b 0a 20 20 20 20  ble, dest);.    
b0a0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
b0b0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
b0c0: 70 28 76 2c 20 4f 50 5f 53 65 74 4e 6f 74 46 6f  p(v, OP_SetNotFo
b0d0: 75 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  und, pExpr->iTab
b0e0: 6c 65 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20  le, dest);.     
b0f0: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
b100: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
b110: 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20  K_BETWEEN: {.   
b120: 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20     int addr;.   
b130: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
b140: 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
b150: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20  ->pLeft);.      
b160: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
b170: 28 76 2c 20 4f 50 5f 44 75 70 2c 20 30 2c 20 30  (v, OP_Dup, 0, 0
b180: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
b190: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
b1a0: 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61   pExpr->pList->a
b1b0: 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [0].pExpr);.    
b1c0: 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
b1d0: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
b1e0: 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
b1f0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
b200: 5f 47 65 2c 20 21 6a 75 6d 70 49 66 4e 75 6c 6c  _Ge, !jumpIfNull
b210: 2c 20 61 64 64 72 2b 33 29 3b 0a 20 20 20 20 20  , addr+3);.     
b220: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
b230: 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20  p(v, OP_Pop, 1, 
b240: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
b250: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
b260: 5f 47 6f 74 6f 2c 20 30 2c 20 64 65 73 74 29 3b  _Goto, 0, dest);
b270: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
b280: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
b290: 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 31  Expr->pList->a[1
b2a0: 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
b2b0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
b2c0: 28 76 2c 20 4f 50 5f 47 74 2c 20 6a 75 6d 70 49  (v, OP_Gt, jumpI
b2d0: 66 4e 75 6c 6c 2c 20 64 65 73 74 29 3b 0a 20 20  fNull, dest);.  
b2e0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
b2f0: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
b300: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
b310: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
b320: 78 70 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  xpr);.      sqli
b330: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
b340: 4f 50 5f 49 66 4e 6f 74 2c 20 6a 75 6d 70 49 66  OP_IfNot, jumpIf
b350: 4e 75 6c 6c 2c 20 64 65 73 74 29 3b 0a 20 20 20  Null, dest);.   
b360: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
b370: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20    }.}../*.** Do 
b380: 61 20 64 65 65 70 20 63 6f 6d 70 61 72 69 73 6f  a deep compariso
b390: 6e 20 6f 66 20 74 77 6f 20 65 78 70 72 65 73 73  n of two express
b3a0: 69 6f 6e 20 74 72 65 65 73 2e 20 20 52 65 74 75  ion trees.  Retu
b3b0: 72 6e 20 54 52 55 45 20 28 6e 6f 6e 2d 7a 65 72  rn TRUE (non-zer
b3c0: 6f 29 0a 2a 2a 20 69 66 20 74 68 65 79 20 61 72  o).** if they ar
b3d0: 65 20 69 64 65 6e 74 69 63 61 6c 20 61 6e 64 20  e identical and 
b3e0: 72 65 74 75 72 6e 20 46 41 4c 53 45 20 69 66 20  return FALSE if 
b3f0: 74 68 65 79 20 64 69 66 66 65 72 20 69 6e 20 61  they differ in a
b400: 6e 79 20 77 61 79 2e 0a 2a 2f 0a 69 6e 74 20 73  ny way..*/.int s
b410: 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
b420: 65 28 45 78 70 72 20 2a 70 41 2c 20 45 78 70 72  e(Expr *pA, Expr
b430: 20 2a 70 42 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   *pB){.  int i;.
b440: 20 20 69 66 28 20 70 41 3d 3d 30 20 29 7b 0a 20    if( pA==0 ){. 
b450: 20 20 20 72 65 74 75 72 6e 20 70 42 3d 3d 30 3b     return pB==0;
b460: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 42 3d  .  }else if( pB=
b470: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
b480: 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 41   0;.  }.  if( pA
b490: 2d 3e 6f 70 21 3d 70 42 2d 3e 6f 70 20 29 20 72  ->op!=pB->op ) r
b4a0: 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 21  eturn 0;.  if( !
b4b0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
b4c0: 72 65 28 70 41 2d 3e 70 4c 65 66 74 2c 20 70 42  re(pA->pLeft, pB
b4d0: 2d 3e 70 4c 65 66 74 29 20 29 20 72 65 74 75 72  ->pLeft) ) retur
b4e0: 6e 20 30 3b 0a 20 20 69 66 28 20 21 73 71 6c 69  n 0;.  if( !sqli
b4f0: 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70  te3ExprCompare(p
b500: 41 2d 3e 70 52 69 67 68 74 2c 20 70 42 2d 3e 70  A->pRight, pB->p
b510: 52 69 67 68 74 29 20 29 20 72 65 74 75 72 6e 20  Right) ) return 
b520: 30 3b 0a 20 20 69 66 28 20 70 41 2d 3e 70 4c 69  0;.  if( pA->pLi
b530: 73 74 20 29 7b 0a 20 20 20 20 69 66 28 20 70 42  st ){.    if( pB
b540: 2d 3e 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  ->pList==0 ) ret
b550: 75 72 6e 20 30 3b 0a 20 20 20 20 69 66 28 20 70  urn 0;.    if( p
b560: 41 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 21  A->pList->nExpr!
b570: 3d 70 42 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70  =pB->pList->nExp
b580: 72 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  r ) return 0;.  
b590: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 2d    for(i=0; i<pA-
b5a0: 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  >pList->nExpr; i
b5b0: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21  ++){.      if( !
b5c0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
b5d0: 72 65 28 70 41 2d 3e 70 4c 69 73 74 2d 3e 61 5b  re(pA->pList->a[
b5e0: 69 5d 2e 70 45 78 70 72 2c 20 70 42 2d 3e 70 4c  i].pExpr, pB->pL
b5f0: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  ist->a[i].pExpr)
b600: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
b610: 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 0;.      }.  
b620: 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
b630: 70 42 2d 3e 70 4c 69 73 74 20 29 7b 0a 20 20 20  pB->pList ){.   
b640: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
b650: 20 69 66 28 20 70 41 2d 3e 70 53 65 6c 65 63 74   if( pA->pSelect
b660: 20 7c 7c 20 70 42 2d 3e 70 53 65 6c 65 63 74 20   || pB->pSelect 
b670: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
b680: 28 20 70 41 2d 3e 69 54 61 62 6c 65 21 3d 70 42  ( pA->iTable!=pB
b690: 2d 3e 69 54 61 62 6c 65 20 7c 7c 20 70 41 2d 3e  ->iTable || pA->
b6a0: 69 43 6f 6c 75 6d 6e 21 3d 70 42 2d 3e 69 43 6f  iColumn!=pB->iCo
b6b0: 6c 75 6d 6e 20 29 20 72 65 74 75 72 6e 20 30 3b  lumn ) return 0;
b6c0: 0a 20 20 69 66 28 20 70 41 2d 3e 74 6f 6b 65 6e  .  if( pA->token
b6d0: 2e 7a 20 29 7b 0a 20 20 20 20 69 66 28 20 70 42  .z ){.    if( pB
b6e0: 2d 3e 74 6f 6b 65 6e 2e 7a 3d 3d 30 20 29 20 72  ->token.z==0 ) r
b6f0: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 69 66 28  eturn 0;.    if(
b700: 20 70 42 2d 3e 74 6f 6b 65 6e 2e 6e 21 3d 70 41   pB->token.n!=pA
b710: 2d 3e 74 6f 6b 65 6e 2e 6e 20 29 20 72 65 74 75  ->token.n ) retu
b720: 72 6e 20 30 3b 0a 20 20 20 20 69 66 28 20 73 71  rn 0;.    if( sq
b730: 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 70 41  lite3StrNICmp(pA
b740: 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 42 2d 3e 74  ->token.z, pB->t
b750: 6f 6b 65 6e 2e 7a 2c 20 70 42 2d 3e 74 6f 6b 65  oken.z, pB->toke
b760: 6e 2e 6e 29 21 3d 30 20 29 20 72 65 74 75 72 6e  n.n)!=0 ) return
b770: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
b780: 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64   1;.}../*.** Add
b790: 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74   a new element t
b7a0: 6f 20 74 68 65 20 70 50 61 72 73 65 2d 3e 61 41  o the pParse->aA
b7b0: 67 67 5b 5d 20 61 72 72 61 79 20 61 6e 64 20 72  gg[] array and r
b7c0: 65 74 75 72 6e 20 69 74 73 20 69 6e 64 65 78 2e  eturn its index.
b7d0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
b7e0: 70 70 65 6e 64 41 67 67 49 6e 66 6f 28 50 61 72  ppendAggInfo(Par
b7f0: 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 69  se *pParse){.  i
b800: 66 28 20 28 70 50 61 72 73 65 2d 3e 6e 41 67 67  f( (pParse->nAgg
b810: 20 26 20 30 78 37 29 3d 3d 30 20 29 7b 0a 20 20   & 0x7)==0 ){.  
b820: 20 20 69 6e 74 20 61 6d 74 20 3d 20 70 50 61 72    int amt = pPar
b830: 73 65 2d 3e 6e 41 67 67 20 2b 20 38 3b 0a 20 20  se->nAgg + 8;.  
b840: 20 20 41 67 67 45 78 70 72 20 2a 61 41 67 67 20    AggExpr *aAgg 
b850: 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28  = sqliteRealloc(
b860: 70 50 61 72 73 65 2d 3e 61 41 67 67 2c 20 61 6d  pParse->aAgg, am
b870: 74 2a 73 69 7a 65 6f 66 28 70 50 61 72 73 65 2d  t*sizeof(pParse-
b880: 3e 61 41 67 67 5b 30 5d 29 29 3b 0a 20 20 20 20  >aAgg[0]));.    
b890: 69 66 28 20 61 41 67 67 3d 3d 30 20 29 7b 0a 20  if( aAgg==0 ){. 
b8a0: 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a       return -1;.
b8b0: 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65      }.    pParse
b8c0: 2d 3e 61 41 67 67 20 3d 20 61 41 67 67 3b 0a 20  ->aAgg = aAgg;. 
b8d0: 20 7d 0a 20 20 6d 65 6d 73 65 74 28 26 70 50 61   }.  memset(&pPa
b8e0: 72 73 65 2d 3e 61 41 67 67 5b 70 50 61 72 73 65  rse->aAgg[pParse
b8f0: 2d 3e 6e 41 67 67 5d 2c 20 30 2c 20 73 69 7a 65  ->nAgg], 0, size
b900: 6f 66 28 70 50 61 72 73 65 2d 3e 61 41 67 67 5b  of(pParse->aAgg[
b910: 30 5d 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  0]));.  return p
b920: 50 61 72 73 65 2d 3e 6e 41 67 67 2b 2b 3b 0a 7d  Parse->nAgg++;.}
b930: 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20  ../*.** Analyze 
b940: 74 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73  the given expres
b950: 73 69 6f 6e 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72  sion looking for
b960: 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
b970: 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f 72 20  ions and.** for 
b980: 76 61 72 69 61 62 6c 65 73 20 74 68 61 74 20 6e  variables that n
b990: 65 65 64 20 74 6f 20 62 65 20 61 64 64 65 64 20  eed to be added 
b9a0: 74 6f 20 74 68 65 20 70 50 61 72 73 65 2d 3e 61  to the pParse->a
b9b0: 41 67 67 5b 5d 20 61 72 72 61 79 2e 0a 2a 2a 20  Agg[] array..** 
b9c0: 4d 61 6b 65 20 61 64 64 69 74 69 6f 6e 61 6c 20  Make additional 
b9d0: 65 6e 74 72 69 65 73 20 74 6f 20 74 68 65 20 70  entries to the p
b9e0: 50 61 72 73 65 2d 3e 61 41 67 67 5b 5d 20 61 72  Parse->aAgg[] ar
b9f0: 72 61 79 20 61 73 20 6e 65 63 65 73 73 61 72 79  ray as necessary
ba00: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
ba10: 74 69 6e 65 20 73 68 6f 75 6c 64 20 6f 6e 6c 79  tine should only
ba20: 20 62 65 20 63 61 6c 6c 65 64 20 61 66 74 65 72   be called after
ba30: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
ba40: 68 61 73 20 62 65 65 6e 0a 2a 2a 20 61 6e 61 6c  has been.** anal
ba50: 79 7a 65 64 20 62 79 20 73 71 6c 69 74 65 33 45  yzed by sqlite3E
ba60: 78 70 72 52 65 73 6f 6c 76 65 49 64 73 28 29 20  xprResolveIds() 
ba70: 61 6e 64 20 73 71 6c 69 74 65 33 45 78 70 72 43  and sqlite3ExprC
ba80: 68 65 63 6b 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  heck()..**.** If
ba90: 20 65 72 72 6f 72 73 20 61 72 65 20 73 65 65 6e   errors are seen
baa0: 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72  , leave an error
bab0: 20 6d 65 73 73 61 67 65 20 69 6e 20 7a 45 72 72   message in zErr
bac0: 4d 73 67 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a  Msg and return.*
bad0: 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * the number of 
bae0: 65 72 72 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73  errors..*/.int s
baf0: 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
bb00: 65 41 67 67 72 65 67 61 74 65 73 28 50 61 72 73  eAggregates(Pars
bb10: 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
bb20: 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74 20 69  *pExpr){.  int i
bb30: 3b 0a 20 20 41 67 67 45 78 70 72 20 2a 61 41 67  ;.  AggExpr *aAg
bb40: 67 3b 0a 20 20 69 6e 74 20 6e 45 72 72 20 3d 20  g;.  int nErr = 
bb50: 30 3b 0a 0a 20 20 69 66 28 20 70 45 78 70 72 3d  0;..  if( pExpr=
bb60: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
bb70: 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e   switch( pExpr->
bb80: 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
bb90: 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20  K_COLUMN: {.    
bba0: 20 20 61 41 67 67 20 3d 20 70 50 61 72 73 65 2d    aAgg = pParse-
bbb0: 3e 61 41 67 67 3b 0a 20 20 20 20 20 20 66 6f 72  >aAgg;.      for
bbc0: 28 69 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e  (i=0; i<pParse->
bbd0: 6e 41 67 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nAgg; i++){.    
bbe0: 20 20 20 20 69 66 28 20 61 41 67 67 5b 69 5d 2e      if( aAgg[i].
bbf0: 69 73 41 67 67 20 29 20 63 6f 6e 74 69 6e 75 65  isAgg ) continue
bc00: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 41  ;.        if( aA
bc10: 67 67 5b 69 5d 2e 70 45 78 70 72 2d 3e 69 54 61  gg[i].pExpr->iTa
bc20: 62 6c 65 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62  ble==pExpr->iTab
bc30: 6c 65 0a 20 20 20 20 20 20 20 20 20 26 26 20 61  le.         && a
bc40: 41 67 67 5b 69 5d 2e 70 45 78 70 72 2d 3e 69 43  Agg[i].pExpr->iC
bc50: 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d 3e 69 43  olumn==pExpr->iC
bc60: 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20  olumn ){.       
bc70: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
bc80: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
bc90: 20 20 69 66 28 20 69 3e 3d 70 50 61 72 73 65 2d    if( i>=pParse-
bca0: 3e 6e 41 67 67 20 29 7b 0a 20 20 20 20 20 20 20  >nAgg ){.       
bcb0: 20 69 20 3d 20 61 70 70 65 6e 64 41 67 67 49 6e   i = appendAggIn
bcc0: 66 6f 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  fo(pParse);.    
bcd0: 20 20 20 20 69 66 28 20 69 3c 30 20 29 20 72 65      if( i<0 ) re
bce0: 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20  turn 1;.        
bcf0: 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 69 5d 2e  pParse->aAgg[i].
bd00: 69 73 41 67 67 20 3d 20 30 3b 0a 20 20 20 20 20  isAgg = 0;.     
bd10: 20 20 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b     pParse->aAgg[
bd20: 69 5d 2e 70 45 78 70 72 20 3d 20 70 45 78 70 72  i].pExpr = pExpr
bd30: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
bd40: 70 45 78 70 72 2d 3e 69 41 67 67 20 3d 20 69 3b  pExpr->iAgg = i;
bd50: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
bd60: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
bd70: 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a  AGG_FUNCTION: {.
bd80: 20 20 20 20 20 20 61 41 67 67 20 3d 20 70 50 61        aAgg = pPa
bd90: 72 73 65 2d 3e 61 41 67 67 3b 0a 20 20 20 20 20  rse->aAgg;.     
bda0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72   for(i=0; i<pPar
bdb0: 73 65 2d 3e 6e 41 67 67 3b 20 69 2b 2b 29 7b 0a  se->nAgg; i++){.
bdc0: 20 20 20 20 20 20 20 20 69 66 28 20 21 61 41 67          if( !aAg
bdd0: 67 5b 69 5d 2e 69 73 41 67 67 20 29 20 63 6f 6e  g[i].isAgg ) con
bde0: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69  tinue;.        i
bdf0: 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  f( sqlite3ExprCo
be00: 6d 70 61 72 65 28 61 41 67 67 5b 69 5d 2e 70 45  mpare(aAgg[i].pE
be10: 78 70 72 2c 20 70 45 78 70 72 29 20 29 7b 0a 20  xpr, pExpr) ){. 
be20: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
be30: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
be40: 7d 0a 20 20 20 20 20 20 69 66 28 20 69 3e 3d 70  }.      if( i>=p
be50: 50 61 72 73 65 2d 3e 6e 41 67 67 20 29 7b 0a 20  Parse->nAgg ){. 
be60: 20 20 20 20 20 20 20 69 20 3d 20 61 70 70 65 6e         i = appen
be70: 64 41 67 67 49 6e 66 6f 28 70 50 61 72 73 65 29  dAggInfo(pParse)
be80: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 3c  ;.        if( i<
be90: 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
bea0: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61 41        pParse->aA
beb0: 67 67 5b 69 5d 2e 69 73 41 67 67 20 3d 20 31 3b  gg[i].isAgg = 1;
bec0: 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d  .        pParse-
bed0: 3e 61 41 67 67 5b 69 5d 2e 70 45 78 70 72 20 3d  >aAgg[i].pExpr =
bee0: 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20   pExpr;.        
bef0: 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 69 5d 2e  pParse->aAgg[i].
bf00: 70 46 75 6e 63 20 3d 20 73 71 6c 69 74 65 33 46  pFunc = sqlite3F
bf10: 69 6e 64 46 75 6e 63 74 69 6f 6e 28 70 50 61 72  indFunction(pPar
bf20: 73 65 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20 20  se->db,.        
bf30: 20 20 20 20 20 70 45 78 70 72 2d 3e 74 6f 6b 65       pExpr->toke
bf40: 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65  n.z, pExpr->toke
bf50: 6e 2e 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20  n.n,.           
bf60: 20 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 20 3f    pExpr->pList ?
bf70: 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e   pExpr->pList->n
bf80: 45 78 70 72 20 3a 20 30 2c 20 30 29 3b 0a 20 20  Expr : 0, 0);.  
bf90: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 45 78 70      }.      pExp
bfa0: 72 2d 3e 69 41 67 67 20 3d 20 69 3b 0a 20 20 20  r->iAgg = i;.   
bfb0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
bfc0: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
bfd0: 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
bfe0: 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 20 20 20  pLeft ){.       
bff0: 20 6e 45 72 72 20 3d 20 73 71 6c 69 74 65 33 45   nErr = sqlite3E
c000: 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67  xprAnalyzeAggreg
c010: 61 74 65 73 28 70 50 61 72 73 65 2c 20 70 45 78  ates(pParse, pEx
c020: 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20  pr->pLeft);.    
c030: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 45    }.      if( nE
c040: 72 72 3d 3d 30 20 26 26 20 70 45 78 70 72 2d 3e  rr==0 && pExpr->
c050: 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20  pRight ){.      
c060: 20 20 6e 45 72 72 20 3d 20 73 71 6c 69 74 65 33    nErr = sqlite3
c070: 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65  ExprAnalyzeAggre
c080: 67 61 74 65 73 28 70 50 61 72 73 65 2c 20 70 45  gates(pParse, pE
c090: 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20  xpr->pRight);.  
c0a0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
c0b0: 6e 45 72 72 3d 3d 30 20 26 26 20 70 45 78 70 72  nErr==0 && pExpr
c0c0: 2d 3e 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20  ->pList ){.     
c0d0: 20 20 20 69 6e 74 20 6e 20 3d 20 70 45 78 70 72     int n = pExpr
c0e0: 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a  ->pList->nExpr;.
c0f0: 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20          int i;. 
c100: 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
c110: 6e 45 72 72 3d 3d 30 20 26 26 20 69 3c 6e 3b 20  nErr==0 && i<n; 
c120: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
c130: 6e 45 72 72 20 3d 20 73 71 6c 69 74 65 33 45 78  nErr = sqlite3Ex
c140: 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  prAnalyzeAggrega
c150: 74 65 73 28 70 50 61 72 73 65 2c 20 70 45 78 70  tes(pParse, pExp
c160: 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  r->pList->a[i].p
c170: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 7d  Expr);.        }
c180: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
c190: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
c1a0: 20 20 72 65 74 75 72 6e 20 6e 45 72 72 3b 0a 7d    return nErr;.}
c1b0: 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 61  ../*.** Locate a
c1c0: 20 75 73 65 72 20 66 75 6e 63 74 69 6f 6e 20 67   user function g
c1d0: 69 76 65 6e 20 61 20 6e 61 6d 65 20 61 6e 64 20  iven a name and 
c1e0: 61 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  a number of argu
c1f0: 6d 65 6e 74 73 2e 0a 2a 2a 20 52 65 74 75 72 6e  ments..** Return
c200: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
c210: 65 20 46 75 6e 63 44 65 66 20 73 74 72 75 63 74  e FuncDef struct
c220: 75 72 65 20 74 68 61 74 20 64 65 66 69 6e 65 73  ure that defines
c230: 20 74 68 61 74 0a 2a 2a 20 66 75 6e 63 74 69 6f   that.** functio
c240: 6e 2c 20 6f 72 20 72 65 74 75 72 6e 20 4e 55 4c  n, or return NUL
c250: 4c 20 69 66 20 74 68 65 20 66 75 6e 63 74 69 6f  L if the functio
c260: 6e 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  n does not exist
c270: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63  ..**.** If the c
c280: 72 65 61 74 65 46 6c 61 67 20 61 72 67 75 6d 65  reateFlag argume
c290: 6e 74 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e  nt is true, then
c2a0: 20 61 20 6e 65 77 20 28 62 6c 61 6e 6b 29 20 46   a new (blank) F
c2b0: 75 6e 63 44 65 66 0a 2a 2a 20 73 74 72 75 63 74  uncDef.** struct
c2c0: 75 72 65 20 69 73 20 63 72 65 61 74 65 64 20 61  ure is created a
c2d0: 6e 64 20 6c 69 6b 65 64 20 69 6e 74 6f 20 74 68  nd liked into th
c2e0: 65 20 22 64 62 22 20 73 74 72 75 63 74 75 72 65  e "db" structure
c2f0: 20 69 66 20 61 0a 2a 2a 20 6e 6f 20 6d 61 74 63   if a.** no matc
c300: 68 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 70 72  hing function pr
c310: 65 76 69 6f 75 73 6c 79 20 65 78 69 73 74 65 64  eviously existed
c320: 2e 20 20 57 68 65 6e 20 63 72 65 61 74 65 46 6c  .  When createFl
c330: 61 67 20 69 73 20 74 72 75 65 0a 2a 2a 20 61 6e  ag is true.** an
c340: 64 20 74 68 65 20 6e 41 72 67 20 70 61 72 61 6d  d the nArg param
c350: 65 74 65 72 20 69 73 20 2d 31 2c 20 74 68 65 6e  eter is -1, then
c360: 20 6f 6e 6c 79 20 61 20 66 75 6e 63 74 69 6f 6e   only a function
c370: 20 74 68 61 74 20 61 63 63 65 70 74 73 0a 2a 2a   that accepts.**
c380: 20 61 6e 79 20 6e 75 6d 62 65 72 20 6f 66 20 61   any number of a
c390: 72 67 75 6d 65 6e 74 73 20 77 69 6c 6c 20 62 65  rguments will be
c3a0: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
c3b0: 20 49 66 20 63 72 65 61 74 65 46 6c 61 67 20 69   If createFlag i
c3c0: 73 20 66 61 6c 73 65 20 61 6e 64 20 6e 41 72 67  s false and nArg
c3d0: 20 69 73 20 2d 31 2c 20 74 68 65 6e 20 74 68 65   is -1, then the
c3e0: 20 66 69 72 73 74 20 76 61 6c 69 64 0a 2a 2a 20   first valid.** 
c3f0: 66 75 6e 63 74 69 6f 6e 20 66 6f 75 6e 64 20 69  function found i
c400: 73 20 72 65 74 75 72 6e 65 64 2e 20 20 41 20 66  s returned.  A f
c410: 75 6e 63 74 69 6f 6e 20 69 73 20 76 61 6c 69 64  unction is valid
c420: 20 69 66 20 65 69 74 68 65 72 20 78 46 75 6e 63   if either xFunc
c430: 0a 2a 2a 20 6f 72 20 78 53 74 65 70 20 69 73 20  .** or xStep is 
c440: 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2f 0a 46 75 6e  non-zero..*/.Fun
c450: 63 44 65 66 20 2a 73 71 6c 69 74 65 33 46 69 6e  cDef *sqlite3Fin
c460: 64 46 75 6e 63 74 69 6f 6e 28 0a 20 20 73 71 6c  dFunction(.  sql
c470: 69 74 65 20 2a 64 62 2c 20 20 20 20 20 20 20 20  ite *db,        
c480: 2f 2a 20 41 6e 20 6f 70 65 6e 20 64 61 74 61 62  /* An open datab
c490: 61 73 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ase */.  const c
c4a0: 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 2f 2a 20 4e  har *zName, /* N
c4b0: 61 6d 65 20 6f 66 20 74 68 65 20 66 75 6e 63 74  ame of the funct
c4c0: 69 6f 6e 2e 20 20 4e 6f 74 20 6e 75 6c 6c 2d 74  ion.  Not null-t
c4d0: 65 72 6d 69 6e 61 74 65 64 20 2a 2f 0a 20 20 69  erminated */.  i
c4e0: 6e 74 20 6e 4e 61 6d 65 2c 20 20 20 20 20 20 20  nt nName,       
c4f0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
c500: 68 61 72 61 63 74 65 72 73 20 69 6e 20 74 68 65  haracters in the
c510: 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   name */.  int n
c520: 41 72 67 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  Arg,          /*
c530: 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
c540: 65 6e 74 73 2e 20 20 2d 31 20 6d 65 61 6e 73 20  ents.  -1 means 
c550: 61 6e 79 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  any number */.  
c560: 69 6e 74 20 63 72 65 61 74 65 46 6c 61 67 20 20  int createFlag  
c570: 20 20 20 2f 2a 20 43 72 65 61 74 65 20 6e 65 77     /* Create new
c580: 20 65 6e 74 72 79 20 69 66 20 74 72 75 65 20 61   entry if true a
c590: 6e 64 20 64 6f 65 73 20 6e 6f 74 20 6f 74 68 65  nd does not othe
c5a0: 72 77 69 73 65 20 65 78 69 73 74 20 2a 2f 0a 29  rwise exist */.)
c5b0: 7b 0a 20 20 46 75 6e 63 44 65 66 20 2a 70 46 69  {.  FuncDef *pFi
c5c0: 72 73 74 2c 20 2a 70 2c 20 2a 70 4d 61 79 62 65  rst, *p, *pMaybe
c5d0: 3b 0a 20 20 70 46 69 72 73 74 20 3d 20 70 20 3d  ;.  pFirst = p =
c5e0: 20 28 46 75 6e 63 44 65 66 2a 29 73 71 6c 69 74   (FuncDef*)sqlit
c5f0: 65 33 48 61 73 68 46 69 6e 64 28 26 64 62 2d 3e  e3HashFind(&db->
c600: 61 46 75 6e 63 2c 20 7a 4e 61 6d 65 2c 20 6e 4e  aFunc, zName, nN
c610: 61 6d 65 29 3b 0a 20 20 69 66 28 20 70 20 26 26  ame);.  if( p &&
c620: 20 21 63 72 65 61 74 65 46 6c 61 67 20 26 26 20   !createFlag && 
c630: 6e 41 72 67 3c 30 20 29 7b 0a 20 20 20 20 77 68  nArg<0 ){.    wh
c640: 69 6c 65 28 20 70 20 26 26 20 70 2d 3e 78 46 75  ile( p && p->xFu
c650: 6e 63 3d 3d 30 20 26 26 20 70 2d 3e 78 53 74 65  nc==0 && p->xSte
c660: 70 3d 3d 30 20 29 7b 20 70 20 3d 20 70 2d 3e 70  p==0 ){ p = p->p
c670: 4e 65 78 74 3b 20 7d 0a 20 20 20 20 72 65 74 75  Next; }.    retu
c680: 72 6e 20 70 3b 0a 20 20 7d 0a 20 20 70 4d 61 79  rn p;.  }.  pMay
c690: 62 65 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28  be = 0;.  while(
c6a0: 20 70 20 26 26 20 70 2d 3e 6e 41 72 67 21 3d 6e   p && p->nArg!=n
c6b0: 41 72 67 20 29 7b 0a 20 20 20 20 69 66 28 20 70  Arg ){.    if( p
c6c0: 2d 3e 6e 41 72 67 3c 30 20 26 26 20 21 63 72 65  ->nArg<0 && !cre
c6d0: 61 74 65 46 6c 61 67 20 26 26 20 28 70 2d 3e 78  ateFlag && (p->x
c6e0: 46 75 6e 63 20 7c 7c 20 70 2d 3e 78 53 74 65 70  Func || p->xStep
c6f0: 29 20 29 20 70 4d 61 79 62 65 20 3d 20 70 3b 0a  ) ) pMaybe = p;.
c700: 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74      p = p->pNext
c710: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 20 26 26  ;.  }.  if( p &&
c720: 20 21 63 72 65 61 74 65 46 6c 61 67 20 26 26 20   !createFlag && 
c730: 70 2d 3e 78 46 75 6e 63 3d 3d 30 20 26 26 20 70  p->xFunc==0 && p
c740: 2d 3e 78 53 74 65 70 3d 3d 30 20 29 7b 0a 20 20  ->xStep==0 ){.  
c750: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
c760: 20 20 69 66 28 20 70 3d 3d 30 20 26 26 20 70 4d    if( p==0 && pM
c770: 61 79 62 65 20 29 7b 0a 20 20 20 20 61 73 73 65  aybe ){.    asse
c780: 72 74 28 20 63 72 65 61 74 65 46 6c 61 67 3d 3d  rt( createFlag==
c790: 30 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 );.    return 
c7a0: 70 4d 61 79 62 65 3b 0a 20 20 7d 0a 20 20 69 66  pMaybe;.  }.  if
c7b0: 28 20 70 3d 3d 30 20 26 26 20 63 72 65 61 74 65  ( p==0 && create
c7c0: 46 6c 61 67 20 26 26 20 28 70 20 3d 20 73 71 6c  Flag && (p = sql
c7d0: 69 74 65 4d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66  iteMalloc(sizeof
c7e0: 28 2a 70 29 29 29 21 3d 30 20 29 7b 0a 20 20 20  (*p)))!=0 ){.   
c7f0: 20 70 2d 3e 6e 41 72 67 20 3d 20 6e 41 72 67 3b   p->nArg = nArg;
c800: 0a 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20  .    p->pNext = 
c810: 70 46 69 72 73 74 3b 0a 20 20 20 20 70 2d 3e 64  pFirst;.    p->d
c820: 61 74 61 54 79 70 65 20 3d 20 70 46 69 72 73 74  ataType = pFirst
c830: 20 3f 20 70 46 69 72 73 74 2d 3e 64 61 74 61 54   ? pFirst->dataT
c840: 79 70 65 20 3a 20 53 51 4c 49 54 45 5f 4e 55 4d  ype : SQLITE_NUM
c850: 45 52 49 43 3b 0a 20 20 20 20 73 71 6c 69 74 65  ERIC;.    sqlite
c860: 33 48 61 73 68 49 6e 73 65 72 74 28 26 64 62 2d  3HashInsert(&db-
c870: 3e 61 46 75 6e 63 2c 20 7a 4e 61 6d 65 2c 20 6e  >aFunc, zName, n
c880: 4e 61 6d 65 2c 20 28 76 6f 69 64 2a 29 70 29 3b  Name, (void*)p);
c890: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b  .  }.  return p;
c8a0: 0a 7d 0a 0a 0a 0a                                .}....