/ Hex Artifact Content
Login

Artifact 7667e214b17a100e013005d42c1b91be73d9ecfe:


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 36 20 32 30 30 34 2f 30 35 2f 31 30 20  .116 2004/05/10 
0220: 31 30 3a 33 34 3a 33 37 20 64 61 6e 69 65 6c 6b  10:34:37 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 70  Q: {.      if( p
8110: 50 61 72 73 65 2d 3e 64 62 2d 3e 66 69 6c 65 5f  Parse->db->file_
8120: 66 6f 72 6d 61 74 3e 3d 34 20 26 26 20 73 71 6c  format>=4 && sql
8130: 69 74 65 33 45 78 70 72 54 79 70 65 28 70 45 78  ite3ExprType(pEx
8140: 70 72 29 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 54  pr)==SQLITE_SO_T
8150: 45 58 54 20 29 7b 0a 20 20 20 20 20 20 20 20 6f  EXT ){.        o
8160: 70 20 2b 3d 20 36 3b 20 20 2f 2a 20 43 6f 6e 76  p += 6;  /* Conv
8170: 65 72 74 20 6e 75 6d 65 72 69 63 20 6f 70 63 6f  ert numeric opco
8180: 64 65 73 20 74 6f 20 74 65 78 74 20 6f 70 63 6f  des to text opco
8190: 64 65 73 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20  des */.      }. 
81a0: 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72       /* Fall thr
81b0: 6f 75 67 68 20 69 6e 74 6f 20 74 68 65 20 6e 65  ough into the ne
81c0: 78 74 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 7d  xt case */.    }
81d0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44  .    case TK_AND
81e0: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52  :.    case TK_OR
81f0: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 50 4c  :.    case TK_PL
8200: 55 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  US:.    case TK_
8210: 53 54 41 52 3a 0a 20 20 20 20 63 61 73 65 20 54  STAR:.    case T
8220: 4b 5f 4d 49 4e 55 53 3a 0a 20 20 20 20 63 61 73  K_MINUS:.    cas
8230: 65 20 54 4b 5f 52 45 4d 3a 0a 20 20 20 20 63 61  e TK_REM:.    ca
8240: 73 65 20 54 4b 5f 42 49 54 41 4e 44 3a 0a 20 20  se TK_BITAND:.  
8250: 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4f 52 3a    case TK_BITOR:
8260: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 4c 41  .    case TK_SLA
8270: 53 48 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  SH: {.      sqli
8280: 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
8290: 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
82a0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
82b0: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
82c0: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b   pExpr->pRight);
82d0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
82e0: 62 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c 20 30  beAddOp(v, op, 0
82f0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61  , 0);.      brea
8300: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
8310: 65 20 54 4b 5f 4c 53 48 49 46 54 3a 0a 20 20 20  e TK_LSHIFT:.   
8320: 20 63 61 73 65 20 54 4b 5f 52 53 48 49 46 54 3a   case TK_RSHIFT:
8330: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
8340: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
8350: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b   pExpr->pRight);
8360: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
8370: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
8380: 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
8390: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
83a0: 64 64 4f 70 28 76 2c 20 6f 70 2c 20 30 2c 20 30  ddOp(v, op, 0, 0
83b0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
83c0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
83d0: 4b 5f 43 4f 4e 43 41 54 3a 20 7b 0a 20 20 20 20  K_CONCAT: {.    
83e0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
83f0: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
8400: 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73  >pLeft);.      s
8410: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
8420: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
8430: 69 67 68 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  ight);.      sql
8440: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
8450: 20 4f 50 5f 43 6f 6e 63 61 74 2c 20 32 2c 20 30   OP_Concat, 2, 0
8460: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
8470: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
8480: 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20 20  K_UMINUS: {.    
8490: 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
84a0: 3e 70 4c 65 66 74 20 29 3b 0a 20 20 20 20 20 20  >pLeft );.      
84b0: 69 66 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  if( pExpr->pLeft
84c0: 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20 7c  ->op==TK_FLOAT |
84d0: 7c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e  | pExpr->pLeft->
84e0: 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47 45 52 20 29  op==TK_INTEGER )
84f0: 7b 0a 20 20 20 20 20 20 20 20 54 6f 6b 65 6e 20  {.        Token 
8500: 2a 70 20 3d 20 26 70 45 78 70 72 2d 3e 70 4c 65  *p = &pExpr->pLe
8510: 66 74 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20  ft->token;.     
8520: 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 73 71 6c     char *z = sql
8530: 69 74 65 4d 61 6c 6c 6f 63 28 20 70 2d 3e 6e 20  iteMalloc( p->n 
8540: 2b 20 32 20 29 3b 0a 20 20 20 20 20 20 20 20 73  + 2 );.        s
8550: 70 72 69 6e 74 66 28 7a 2c 20 22 2d 25 2e 2a 73  printf(z, "-%.*s
8560: 22 2c 20 70 2d 3e 6e 2c 20 70 2d 3e 7a 29 3b 0a  ", p->n, p->z);.
8570: 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78 70          if( pExp
8580: 72 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b  r->pLeft->op==TK
8590: 5f 49 4e 54 45 47 45 52 20 26 26 20 73 71 6c 69  _INTEGER && sqli
85a0: 74 65 33 46 69 74 73 49 6e 33 32 42 69 74 73 28  te3FitsIn32Bits(
85b0: 7a 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  z) ){.          
85c0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
85d0: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
85e0: 61 74 6f 69 28 7a 29 2c 20 30 29 3b 0a 20 20 20  atoi(z), 0);.   
85f0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
8600: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
8610: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72  eAddOp(v, OP_Str
8620: 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ing, 0, 0);.    
8630: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
8640: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
8650: 33 28 76 2c 20 2d 31 2c 20 7a 2c 20 70 2d 3e 6e  3(v, -1, z, p->n
8660: 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  +1);.        sql
8670: 69 74 65 46 72 65 65 28 7a 29 3b 0a 20 20 20 20  iteFree(z);.    
8680: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
8690: 20 7d 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c   }.      /* Fall
86a0: 20 74 68 72 6f 75 67 68 20 69 6e 74 6f 20 54 4b   through into TK
86b0: 5f 4e 4f 54 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  _NOT */.    }.  
86c0: 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4e 4f 54    case TK_BITNOT
86d0: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f  :.    case TK_NO
86e0: 54 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  T: {.      sqlit
86f0: 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
8700: 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  e, pExpr->pLeft)
8710: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
8720: 64 62 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c 20  dbeAddOp(v, op, 
8730: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65  0, 0);.      bre
8740: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
8750: 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20  se TK_ISNULL:.  
8760: 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c    case TK_NOTNUL
8770: 4c 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64  L: {.      int d
8780: 65 73 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  est;.      sqlit
8790: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
87a0: 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 30 29  P_Integer, 1, 0)
87b0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
87c0: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
87d0: 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
87e0: 20 20 20 20 20 64 65 73 74 20 3d 20 73 71 6c 69       dest = sqli
87f0: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
8800: 64 72 28 76 29 20 2b 20 32 3b 0a 20 20 20 20 20  dr(v) + 2;.     
8810: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
8820: 70 28 76 2c 20 6f 70 2c 20 31 2c 20 64 65 73 74  p(v, op, 1, dest
8830: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
8840: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
8850: 41 64 64 49 6d 6d 2c 20 2d 31 2c 20 30 29 3b 0a  AddImm, -1, 0);.
8860: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
8870: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41   }.    case TK_A
8880: 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20  GG_FUNCTION: {. 
8890: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
88a0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 67 67 47  AddOp(v, OP_AggG
88b0: 65 74 2c 20 30 2c 20 70 45 78 70 72 2d 3e 69 41  et, 0, pExpr->iA
88c0: 67 67 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  gg);.      break
88d0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
88e0: 20 54 4b 5f 47 4c 4f 42 3a 0a 20 20 20 20 63 61   TK_GLOB:.    ca
88f0: 73 65 20 54 4b 5f 4c 49 4b 45 3a 0a 20 20 20 20  se TK_LIKE:.    
8900: 63 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e  case TK_FUNCTION
8910: 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72 4c 69  : {.      ExprLi
8920: 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 45 78 70  st *pList = pExp
8930: 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20  r->pList;.      
8940: 69 6e 74 20 6e 45 78 70 72 20 3d 20 70 4c 69 73  int nExpr = pLis
8950: 74 20 3f 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  t ? pList->nExpr
8960: 20 3a 20 30 3b 0a 20 20 20 20 20 20 46 75 6e 63   : 0;.      Func
8970: 44 65 66 20 2a 70 44 65 66 3b 0a 20 20 20 20 20  Def *pDef;.     
8980: 20 69 6e 74 20 6e 49 64 3b 0a 20 20 20 20 20 20   int nId;.      
8990: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64 3b  const char *zId;
89a0: 0a 20 20 20 20 20 20 67 65 74 46 75 6e 63 74 69  .      getFuncti
89b0: 6f 6e 4e 61 6d 65 28 70 45 78 70 72 2c 20 26 7a  onName(pExpr, &z
89c0: 49 64 2c 20 26 6e 49 64 29 3b 0a 20 20 20 20 20  Id, &nId);.     
89d0: 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33 46   pDef = sqlite3F
89e0: 69 6e 64 46 75 6e 63 74 69 6f 6e 28 70 50 61 72  indFunction(pPar
89f0: 73 65 2d 3e 64 62 2c 20 7a 49 64 2c 20 6e 49 64  se->db, zId, nId
8a00: 2c 20 6e 45 78 70 72 2c 20 30 29 3b 0a 20 20 20  , nExpr, 0);.   
8a10: 20 20 20 61 73 73 65 72 74 28 20 70 44 65 66 21     assert( pDef!
8a20: 3d 30 20 29 3b 0a 20 20 20 20 20 20 6e 45 78 70  =0 );.      nExp
8a30: 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  r = sqlite3ExprC
8a40: 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50 61 72  odeExprList(pPar
8a50: 73 65 2c 20 70 4c 69 73 74 2c 20 70 44 65 66 2d  se, pList, pDef-
8a60: 3e 69 6e 63 6c 75 64 65 54 79 70 65 73 29 3b 0a  >includeTypes);.
8a70: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
8a80: 65 4f 70 33 28 76 2c 20 4f 50 5f 46 75 6e 63 74  eOp3(v, OP_Funct
8a90: 69 6f 6e 2c 20 6e 45 78 70 72 2c 20 30 2c 20 28  ion, nExpr, 0, (
8aa0: 63 68 61 72 2a 29 70 44 65 66 2c 20 50 33 5f 50  char*)pDef, P3_P
8ab0: 4f 49 4e 54 45 52 29 3b 0a 20 20 20 20 20 20 62  OINTER);.      b
8ac0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
8ad0: 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20  case TK_SELECT: 
8ae0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
8af0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
8b00: 65 6d 4c 6f 61 64 2c 20 70 45 78 70 72 2d 3e 69  emLoad, pExpr->i
8b10: 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20  Column, 0);.    
8b20: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
8b30: 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b     case TK_IN: {
8b40: 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b  .      int addr;
8b50: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
8b60: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e  beAddOp(v, OP_In
8b70: 74 65 67 65 72 2c 20 31 2c 20 30 29 3b 0a 20 20  teger, 1, 0);.  
8b80: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
8b90: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
8ba0: 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20  r->pLeft);.     
8bb0: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
8bc0: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
8bd0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
8be0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
8bf0: 4e 6f 74 4e 75 6c 6c 2c 20 2d 31 2c 20 61 64 64  NotNull, -1, add
8c00: 72 2b 34 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  r+4);.      sqli
8c10: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
8c20: 4f 50 5f 50 6f 70 2c 20 32 2c 20 30 29 3b 0a 20  OP_Pop, 2, 0);. 
8c30: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
8c40: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69  AddOp(v, OP_Stri
8c50: 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  ng, 0, 0);.     
8c60: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
8c70: 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  p(v, OP_Goto, 0,
8c80: 20 61 64 64 72 2b 36 29 3b 0a 20 20 20 20 20 20   addr+6);.      
8c90: 69 66 28 20 70 45 78 70 72 2d 3e 70 53 65 6c 65  if( pExpr->pSele
8ca0: 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ct ){.        sq
8cb0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
8cc0: 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 70 45 78 70  , OP_Found, pExp
8cd0: 72 2d 3e 69 54 61 62 6c 65 2c 20 61 64 64 72 2b  r->iTable, addr+
8ce0: 36 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  6);.      }else{
8cf0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
8d00: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
8d10: 53 65 74 46 6f 75 6e 64 2c 20 70 45 78 70 72 2d  SetFound, pExpr-
8d20: 3e 69 54 61 62 6c 65 2c 20 61 64 64 72 2b 36 29  >iTable, addr+6)
8d30: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
8d40: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
8d50: 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 2d  (v, OP_AddImm, -
8d60: 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65  1, 0);.      bre
8d70: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
8d80: 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b  se TK_BETWEEN: {
8d90: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
8da0: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
8db0: 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
8dc0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
8dd0: 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20  ddOp(v, OP_Dup, 
8de0: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  0, 0);.      sql
8df0: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
8e00: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 69 73  rse, pExpr->pLis
8e10: 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a  t->a[0].pExpr);.
8e20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
8e30: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 65 2c  eAddOp(v, OP_Ge,
8e40: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   0, 0);.      sq
8e50: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
8e60: 2c 20 4f 50 5f 50 75 6c 6c 2c 20 31 2c 20 30 29  , OP_Pull, 1, 0)
8e70: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
8e80: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
8e90: 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b  pExpr->pList->a[
8ea0: 31 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  1].pExpr);.     
8eb0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
8ec0: 70 28 76 2c 20 4f 50 5f 4c 65 2c 20 30 2c 20 30  p(v, OP_Le, 0, 0
8ed0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
8ee0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
8ef0: 41 6e 64 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  And, 0, 0);.    
8f00: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
8f10: 20 20 20 63 61 73 65 20 54 4b 5f 55 50 4c 55 53     case TK_UPLUS
8f20: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 53  :.    case TK_AS
8f30: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
8f40: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
8f50: 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  , pExpr->pLeft);
8f60: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
8f70: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
8f80: 43 41 53 45 3a 20 7b 0a 20 20 20 20 20 20 69 6e  CASE: {.      in
8f90: 74 20 65 78 70 72 5f 65 6e 64 5f 6c 61 62 65 6c  t expr_end_label
8fa0: 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 75 6d 70  ;.      int jump
8fb0: 49 6e 73 74 3b 0a 20 20 20 20 20 20 69 6e 74 20  Inst;.      int 
8fc0: 61 64 64 72 3b 0a 20 20 20 20 20 20 69 6e 74 20  addr;.      int 
8fd0: 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 69 6e 74  nExpr;.      int
8fe0: 20 69 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72   i;..      asser
8ff0: 74 28 70 45 78 70 72 2d 3e 70 4c 69 73 74 29 3b  t(pExpr->pList);
9000: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 28 70  .      assert((p
9010: 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78  Expr->pList->nEx
9020: 70 72 20 25 20 32 29 20 3d 3d 20 30 29 3b 0a 20  pr % 2) == 0);. 
9030: 20 20 20 20 20 61 73 73 65 72 74 28 70 45 78 70       assert(pExp
9040: 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20  r->pList->nExpr 
9050: 3e 20 30 29 3b 0a 20 20 20 20 20 20 6e 45 78 70  > 0);.      nExp
9060: 72 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74  r = pExpr->pList
9070: 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 65  ->nExpr;.      e
9080: 78 70 72 5f 65 6e 64 5f 6c 61 62 65 6c 20 3d 20  xpr_end_label = 
9090: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
90a0: 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69  abel(v);.      i
90b0: 66 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20  f( pExpr->pLeft 
90c0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
90d0: 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
90e0: 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  e, pExpr->pLeft)
90f0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
9100: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72  for(i=0; i<nExpr
9110: 3b 20 69 3d 69 2b 32 29 7b 0a 20 20 20 20 20 20  ; i=i+2){.      
9120: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
9130: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
9140: 3e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  >pList->a[i].pEx
9150: 70 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  pr);.        if(
9160: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 29 7b   pExpr->pLeft ){
9170: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
9180: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
9190: 50 5f 44 75 70 2c 20 31 2c 20 31 29 3b 0a 20 20  P_Dup, 1, 1);.  
91a0: 20 20 20 20 20 20 20 20 6a 75 6d 70 49 6e 73 74          jumpInst
91b0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
91c0: 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 2c 20 31 2c  dOp(v, OP_Ne, 1,
91d0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73   0);.          s
91e0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
91f0: 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30 29  v, OP_Pop, 1, 0)
9200: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
9210: 0a 20 20 20 20 20 20 20 20 20 20 6a 75 6d 70 49  .          jumpI
9220: 6e 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  nst = sqlite3Vdb
9230: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 66 4e  eAddOp(v, OP_IfN
9240: 6f 74 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20  ot, 1, 0);.     
9250: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
9260: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
9270: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 69 73  rse, pExpr->pLis
9280: 74 2d 3e 61 5b 69 2b 31 5d 2e 70 45 78 70 72 29  t->a[i+1].pExpr)
9290: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
92a0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
92b0: 5f 47 6f 74 6f 2c 20 30 2c 20 65 78 70 72 5f 65  _Goto, 0, expr_e
92c0: 6e 64 5f 6c 61 62 65 6c 29 3b 0a 20 20 20 20 20  nd_label);.     
92d0: 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
92e0: 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
92f0: 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  (v);.        sql
9300: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 32  ite3VdbeChangeP2
9310: 28 76 2c 20 6a 75 6d 70 49 6e 73 74 2c 20 61 64  (v, jumpInst, ad
9320: 64 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  dr);.      }.   
9330: 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 4c     if( pExpr->pL
9340: 65 66 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  eft ){.        s
9350: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
9360: 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30 29  v, OP_Pop, 1, 0)
9370: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
9380: 69 66 28 20 70 45 78 70 72 2d 3e 70 52 69 67 68  if( pExpr->pRigh
9390: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
93a0: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
93b0: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
93c0: 68 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ht);.      }else
93d0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
93e0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
93f0: 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a  _String, 0, 0);.
9400: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
9410: 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
9420: 4c 61 62 65 6c 28 76 2c 20 65 78 70 72 5f 65 6e  Label(v, expr_en
9430: 64 5f 6c 61 62 65 6c 29 3b 0a 20 20 20 20 20 20  d_label);.      
9440: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
9450: 20 63 61 73 65 20 54 4b 5f 52 41 49 53 45 3a 20   case TK_RAISE: 
9460: 7b 0a 20 20 20 20 20 20 69 66 28 20 21 70 50 61  {.      if( !pPa
9470: 72 73 65 2d 3e 74 72 69 67 53 74 61 63 6b 20 29  rse->trigStack )
9480: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
9490: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
94a0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
94b0: 20 20 20 20 20 20 20 20 20 22 52 41 49 53 45 28           "RAISE(
94c0: 29 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 75 73  ) may only be us
94d0: 65 64 20 77 69 74 68 69 6e 20 61 20 74 72 69 67  ed within a trig
94e0: 67 65 72 2d 70 72 6f 67 72 61 6d 22 29 3b 0a 20  ger-program");. 
94f0: 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e         pParse->n
9500: 45 72 72 2b 2b 3b 0a 09 72 65 74 75 72 6e 3b 0a  Err++;..return;.
9510: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
9520: 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ( pExpr->iColumn
9530: 20 3d 3d 20 4f 45 5f 52 6f 6c 6c 62 61 63 6b 20   == OE_Rollback 
9540: 7c 7c 0a 09 20 20 70 45 78 70 72 2d 3e 69 43 6f  ||..  pExpr->iCo
9550: 6c 75 6d 6e 20 3d 3d 20 4f 45 5f 41 62 6f 72 74  lumn == OE_Abort
9560: 20 7c 7c 0a 09 20 20 70 45 78 70 72 2d 3e 69 43   ||..  pExpr->iC
9570: 6f 6c 75 6d 6e 20 3d 3d 20 4f 45 5f 46 61 69 6c  olumn == OE_Fail
9580: 20 29 7b 0a 09 20 20 73 71 6c 69 74 65 33 56 64   ){..  sqlite3Vd
9590: 62 65 4f 70 33 28 76 2c 20 4f 50 5f 48 61 6c 74  beOp3(v, OP_Halt
95a0: 2c 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  , SQLITE_CONSTRA
95b0: 49 4e 54 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c  INT, pExpr->iCol
95c0: 75 6d 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20  umn,.           
95d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
95e0: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20  pExpr->token.z, 
95f0: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b  pExpr->token.n);
9600: 0a 09 20 20 73 71 6c 69 74 65 33 56 64 62 65 44  ..  sqlite3VdbeD
9610: 65 71 75 6f 74 65 50 33 28 76 2c 20 2d 31 29 3b  equoteP3(v, -1);
9620: 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  .      } else {.
9630: 09 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
9640: 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 3d 20 4f 45 5f  ->iColumn == OE_
9650: 49 67 6e 6f 72 65 20 29 3b 0a 09 20 20 73 71 6c  Ignore );..  sql
9660: 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f  ite3VdbeOp3(v, O
9670: 50 5f 47 6f 74 6f 2c 20 30 2c 20 70 50 61 72 73  P_Goto, 0, pPars
9680: 65 2d 3e 74 72 69 67 53 74 61 63 6b 2d 3e 69 67  e->trigStack->ig
9690: 6e 6f 72 65 4a 75 6d 70 2c 0a 20 20 20 20 20 20  noreJump,.      
96a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
96b0: 20 20 20 20 20 22 28 49 47 4e 4f 52 45 20 6a 75       "(IGNORE ju
96c0: 6d 70 29 22 2c 20 30 29 3b 0a 20 20 20 20 20 20  mp)", 0);.      
96d0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61  }.    }.    brea
96e0: 6b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  k;.  }.}../*.** 
96f0: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
9700: 61 74 20 70 75 73 68 65 73 20 74 68 65 20 76 61  at pushes the va
9710: 6c 75 65 20 6f 66 20 65 76 65 72 79 20 65 6c 65  lue of every ele
9720: 6d 65 6e 74 20 6f 66 20 74 68 65 20 67 69 76 65  ment of the give
9730: 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20  n.** expression 
9740: 6c 69 73 74 20 6f 6e 74 6f 20 74 68 65 20 73 74  list onto the st
9750: 61 63 6b 2e 20 20 49 66 20 74 68 65 20 69 6e 63  ack.  If the inc
9760: 6c 75 64 65 54 79 70 65 73 20 66 6c 61 67 20 69  ludeTypes flag i
9770: 73 20 74 72 75 65 2c 0a 2a 2a 20 74 68 65 6e 20  s true,.** then 
9780: 61 6c 73 6f 20 70 75 73 68 20 61 20 73 74 72 69  also push a stri
9790: 6e 67 20 74 68 61 74 20 69 73 20 74 68 65 20 64  ng that is the d
97a0: 61 74 61 74 79 70 65 20 6f 66 20 65 61 63 68 20  atatype of each 
97b0: 65 6c 65 6d 65 6e 74 20 6f 6e 74 6f 0a 2a 2a 20  element onto.** 
97c0: 74 68 65 20 73 74 61 63 6b 20 61 66 74 65 72 20  the stack after 
97d0: 74 68 65 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a  the value..**.**
97e0: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
97f0: 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 70  er of elements p
9800: 75 73 68 65 64 20 6f 6e 74 6f 20 74 68 65 20 73  ushed onto the s
9810: 74 61 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tack..*/.int sql
9820: 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72  ite3ExprCodeExpr
9830: 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70  List(.  Parse *p
9840: 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 50 61  Parse,     /* Pa
9850: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
9860: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
9870: 73 74 2c 20 20 20 2f 2a 20 54 68 65 20 65 78 70  st,   /* The exp
9880: 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 74 6f 20  ression list to 
9890: 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e  be coded */.  in
98a0: 74 20 69 6e 63 6c 75 64 65 54 79 70 65 73 20 20  t includeTypes  
98b0: 20 2f 2a 20 54 52 55 45 20 74 6f 20 70 75 74 20   /* TRUE to put 
98c0: 64 61 74 61 74 79 70 65 73 20 6f 6e 20 74 68 65  datatypes on the
98d0: 20 73 74 61 63 6b 20 74 6f 6f 20 2a 2f 0a 29 7b   stack too */.){
98e0: 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69  .  struct ExprLi
98f0: 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
9900: 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 56 64    int i, n;.  Vd
9910: 62 65 20 2a 76 3b 0a 20 20 69 66 28 20 70 4c 69  be *v;.  if( pLi
9920: 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  st==0 ) return 0
9930: 3b 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47  ;.  v = sqlite3G
9940: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
9950: 20 20 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78    n = pList->nEx
9960: 70 72 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d  pr;.  for(pItem=
9970: 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69  pList->a, i=0; i
9980: 3c 6e 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b  <n; i++, pItem++
9990: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  ){.    sqlite3Ex
99a0: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
99b0: 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20  Item->pExpr);.  
99c0: 20 20 69 66 28 20 69 6e 63 6c 75 64 65 54 79 70    if( includeTyp
99d0: 65 73 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  es ){.      sqli
99e0: 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50  te3VdbeOp3(v, OP
99f0: 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 2c 20 0a  _String, 0, 0, .
9a00: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
9a10: 45 78 70 72 54 79 70 65 28 70 49 74 65 6d 2d 3e  ExprType(pItem->
9a20: 70 45 78 70 72 29 3d 3d 53 51 4c 49 54 45 5f 53  pExpr)==SQLITE_S
9a30: 4f 5f 4e 55 4d 20 3f 20 22 6e 75 6d 65 72 69 63  O_NUM ? "numeric
9a40: 22 20 3a 20 22 74 65 78 74 22 2c 0a 20 20 20 20  " : "text",.    
9a50: 20 20 20 20 20 50 33 5f 53 54 41 54 49 43 29 3b       P3_STATIC);
9a60: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
9a70: 75 72 6e 20 69 6e 63 6c 75 64 65 54 79 70 65 73  urn includeTypes
9a80: 20 3f 20 6e 2a 32 20 3a 20 6e 3b 0a 7d 0a 0a 2f   ? n*2 : n;.}../
9a90: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
9aa0: 64 65 20 66 6f 72 20 61 20 62 6f 6f 6c 65 61 6e  de for a boolean
9ab0: 20 65 78 70 72 65 73 73 69 6f 6e 20 73 75 63 68   expression such
9ac0: 20 74 68 61 74 20 61 20 6a 75 6d 70 20 69 73 20   that a jump is 
9ad0: 6d 61 64 65 0a 2a 2a 20 74 6f 20 74 68 65 20 6c  made.** to the l
9ae0: 61 62 65 6c 20 22 64 65 73 74 22 20 69 66 20 74  abel "dest" if t
9af0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
9b00: 20 74 72 75 65 20 62 75 74 20 65 78 65 63 75 74   true but execut
9b10: 69 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 73  ion.** continues
9b20: 20 73 74 72 61 69 67 68 74 20 74 68 72 75 20 69   straight thru i
9b30: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
9b40: 20 69 73 20 66 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a   is false..**.**
9b50: 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69   If the expressi
9b60: 6f 6e 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20  on evaluates to 
9b70: 4e 55 4c 4c 20 28 6e 65 69 74 68 65 72 20 74 72  NULL (neither tr
9b80: 75 65 20 6e 6f 72 20 66 61 6c 73 65 29 2c 20 74  ue nor false), t
9b90: 68 65 6e 0a 2a 2a 20 74 61 6b 65 20 74 68 65 20  hen.** take the 
9ba0: 6a 75 6d 70 20 69 66 20 74 68 65 20 6a 75 6d 70  jump if the jump
9bb0: 49 66 4e 75 6c 6c 20 66 6c 61 67 20 69 73 20 74  IfNull flag is t
9bc0: 72 75 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  rue..*/.void sql
9bd0: 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28 50  ite3ExprIfTrue(P
9be0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
9bf0: 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 64  pr *pExpr, int d
9c00: 65 73 74 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e  est, int jumpIfN
9c10: 75 6c 6c 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  ull){.  Vdbe *v 
9c20: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
9c30: 0a 20 20 69 6e 74 20 6f 70 20 3d 20 30 3b 0a 20  .  int op = 0;. 
9c40: 20 69 66 28 20 76 3d 3d 30 20 7c 7c 20 70 45 78   if( v==0 || pEx
9c50: 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  pr==0 ) return;.
9c60: 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d    switch( pExpr-
9c70: 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20  >op ){.    case 
9c80: 54 4b 5f 4c 54 3a 20 20 20 20 20 20 20 6f 70 20  TK_LT:       op 
9c90: 3d 20 4f 50 5f 4c 74 3b 20 20 20 20 20 20 20 62  = OP_Lt;       b
9ca0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
9cb0: 4b 5f 4c 45 3a 20 20 20 20 20 20 20 6f 70 20 3d  K_LE:       op =
9cc0: 20 4f 50 5f 4c 65 3b 20 20 20 20 20 20 20 62 72   OP_Le;       br
9cd0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
9ce0: 5f 47 54 3a 20 20 20 20 20 20 20 6f 70 20 3d 20  _GT:       op = 
9cf0: 4f 50 5f 47 74 3b 20 20 20 20 20 20 20 62 72 65  OP_Gt;       bre
9d00: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
9d10: 47 45 3a 20 20 20 20 20 20 20 6f 70 20 3d 20 4f  GE:       op = O
9d20: 50 5f 47 65 3b 20 20 20 20 20 20 20 62 72 65 61  P_Ge;       brea
9d30: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  k;.    case TK_N
9d40: 45 3a 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50  E:       op = OP
9d50: 5f 4e 65 3b 20 20 20 20 20 20 20 62 72 65 61 6b  _Ne;       break
9d60: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51  ;.    case TK_EQ
9d70: 3a 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f  :       op = OP_
9d80: 45 71 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b  Eq;       break;
9d90: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e  .    case TK_ISN
9da0: 55 4c 4c 3a 20 20 20 6f 70 20 3d 20 4f 50 5f 49  ULL:   op = OP_I
9db0: 73 4e 75 6c 6c 3b 20 20 20 62 72 65 61 6b 3b 0a  sNull;   break;.
9dc0: 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e      case TK_NOTN
9dd0: 55 4c 4c 3a 20 20 6f 70 20 3d 20 4f 50 5f 4e 6f  ULL:  op = OP_No
9de0: 74 4e 75 6c 6c 3b 20 20 62 72 65 61 6b 3b 0a 20  tNull;  break;. 
9df0: 20 20 20 64 65 66 61 75 6c 74 3a 20 20 62 72 65     default:  bre
9e00: 61 6b 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63 68  ak;.  }.  switch
9e10: 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20  ( pExpr->op ){. 
9e20: 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20     case TK_AND: 
9e30: 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 32 20 3d  {.      int d2 =
9e40: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
9e50: 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
9e60: 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
9e70: 73 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  se(pParse, pExpr
9e80: 2d 3e 70 4c 65 66 74 2c 20 64 32 2c 20 21 6a 75  ->pLeft, d2, !ju
9e90: 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
9ea0: 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72   sqlite3ExprIfTr
9eb0: 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ue(pParse, pExpr
9ec0: 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20  ->pRight, dest, 
9ed0: 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
9ee0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
9ef0: 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 32  solveLabel(v, d2
9f00: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
9f10: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
9f20: 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20 20 20 73 71  K_OR: {.      sq
9f30: 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28  lite3ExprIfTrue(
9f40: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
9f50: 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70  Left, dest, jump
9f60: 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73  IfNull);.      s
9f70: 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65  qlite3ExprIfTrue
9f80: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
9f90: 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75  pRight, dest, ju
9fa0: 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
9fb0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
9fc0: 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b    case TK_NOT: {
9fd0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
9fe0: 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
9ff0: 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
a000: 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
a010: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
a020: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
a030: 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65 20 54  K_LT:.    case T
a040: 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 54  K_LE:.    case T
a050: 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65 20 54  K_GT:.    case T
a060: 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65 20 54  K_GE:.    case T
a070: 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65 20 54  K_NE:.    case T
a080: 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20 73 71  K_EQ: {.      sq
a090: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
a0a0: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
a0b0: 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ft);.      sqlit
a0c0: 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
a0d0: 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  e, pExpr->pRight
a0e0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  );.      if( pPa
a0f0: 72 73 65 2d 3e 64 62 2d 3e 66 69 6c 65 5f 66 6f  rse->db->file_fo
a100: 72 6d 61 74 3e 3d 34 20 26 26 20 73 71 6c 69 74  rmat>=4 && sqlit
a110: 65 33 45 78 70 72 54 79 70 65 28 70 45 78 70 72  e3ExprType(pExpr
a120: 29 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 54 45 58  )==SQLITE_SO_TEX
a130: 54 20 29 7b 0a 20 20 20 20 20 20 20 20 6f 70 20  T ){.        op 
a140: 2b 3d 20 36 3b 20 20 2f 2a 20 43 6f 6e 76 65 72  += 6;  /* Conver
a150: 74 20 6e 75 6d 65 72 69 63 20 6f 70 63 6f 64 65  t numeric opcode
a160: 73 20 74 6f 20 74 65 78 74 20 6f 70 63 6f 64 65  s to text opcode
a170: 73 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20  s */.      }.   
a180: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
a190: 64 4f 70 28 76 2c 20 6f 70 2c 20 6a 75 6d 70 49  dOp(v, op, jumpI
a1a0: 66 4e 75 6c 6c 2c 20 64 65 73 74 29 3b 0a 20 20  fNull, dest);.  
a1b0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
a1c0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e  .    case TK_ISN
a1d0: 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  ULL:.    case TK
a1e0: 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20  _NOTNULL: {.    
a1f0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
a200: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
a210: 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73  >pLeft);.      s
a220: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
a230: 76 2c 20 6f 70 2c 20 31 2c 20 64 65 73 74 29 3b  v, op, 1, dest);
a240: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
a250: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
a260: 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  IN: {.      int 
a270: 61 64 64 72 3b 0a 20 20 20 20 20 20 73 71 6c 69  addr;.      sqli
a280: 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
a290: 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
a2a0: 29 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20  );.      addr = 
a2b0: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
a2c0: 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20  ntAddr(v);.     
a2d0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
a2e0: 70 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c  p(v, OP_NotNull,
a2f0: 20 2d 31 2c 20 61 64 64 72 2b 33 29 3b 0a 20 20   -1, addr+3);.  
a300: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
a310: 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20  ddOp(v, OP_Pop, 
a320: 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  1, 0);.      sql
a330: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
a340: 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 6a 75 6d   OP_Goto, 0, jum
a350: 70 49 66 4e 75 6c 6c 20 3f 20 64 65 73 74 20 3a  pIfNull ? dest :
a360: 20 61 64 64 72 2b 34 29 3b 0a 20 20 20 20 20 20   addr+4);.      
a370: 69 66 28 20 70 45 78 70 72 2d 3e 70 53 65 6c 65  if( pExpr->pSele
a380: 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ct ){.        sq
a390: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
a3a0: 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 70 45 78 70  , OP_Found, pExp
a3b0: 72 2d 3e 69 54 61 62 6c 65 2c 20 64 65 73 74 29  r->iTable, dest)
a3c0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
a3d0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
a3e0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65  beAddOp(v, OP_Se
a3f0: 74 46 6f 75 6e 64 2c 20 70 45 78 70 72 2d 3e 69  tFound, pExpr->i
a400: 54 61 62 6c 65 2c 20 64 65 73 74 29 3b 0a 20 20  Table, dest);.  
a410: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
a420: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
a430: 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a  e TK_BETWEEN: {.
a440: 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a        int addr;.
a450: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
a460: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
a470: 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  xpr->pLeft);.   
a480: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
a490: 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20 30  dOp(v, OP_Dup, 0
a4a0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
a4b0: 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
a4c0: 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 69 73 74  se, pExpr->pList
a4d0: 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[0].pExpr);. 
a4e0: 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69       addr = sqli
a4f0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
a500: 4f 50 5f 4c 74 2c 20 21 6a 75 6d 70 49 66 4e 75  OP_Lt, !jumpIfNu
a510: 6c 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  ll, 0);.      sq
a520: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
a530: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 69  arse, pExpr->pLi
a540: 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 29 3b  st->a[1].pExpr);
a550: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
a560: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4c 65  beAddOp(v, OP_Le
a570: 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 2c 20 64 65  , jumpIfNull, de
a580: 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  st);.      sqlit
a590: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
a5a0: 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 30 29  P_Integer, 0, 0)
a5b0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
a5c0: 64 62 65 43 68 61 6e 67 65 50 32 28 76 2c 20 61  dbeChangeP2(v, a
a5d0: 64 64 72 2c 20 73 71 6c 69 74 65 33 56 64 62 65  ddr, sqlite3Vdbe
a5e0: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 29 3b  CurrentAddr(v));
a5f0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
a600: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f  beAddOp(v, OP_Po
a610: 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  p, 1, 0);.      
a620: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
a630: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
a640: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
a650: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 29  e(pParse, pExpr)
a660: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
a670: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
a680: 66 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 2c 20 64  f, jumpIfNull, d
a690: 65 73 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61  est);.      brea
a6a0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  k;.    }.  }.}..
a6b0: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
a6c0: 6f 64 65 20 66 6f 72 20 61 20 62 6f 6f 6c 65 61  ode for a boolea
a6d0: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 73 75 63  n expression suc
a6e0: 68 20 74 68 61 74 20 61 20 6a 75 6d 70 20 69 73  h that a jump is
a6f0: 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 74 68 65 20   made.** to the 
a700: 6c 61 62 65 6c 20 22 64 65 73 74 22 20 69 66 20  label "dest" if 
a710: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
a720: 73 20 66 61 6c 73 65 20 62 75 74 20 65 78 65 63  s false but exec
a730: 75 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75  ution.** continu
a740: 65 73 20 73 74 72 61 69 67 68 74 20 74 68 72 75  es straight thru
a750: 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
a760: 6f 6e 20 69 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a  on is true..**.*
a770: 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73  * If the express
a780: 69 6f 6e 20 65 76 61 6c 75 61 74 65 73 20 74 6f  ion evaluates to
a790: 20 4e 55 4c 4c 20 28 6e 65 69 74 68 65 72 20 74   NULL (neither t
a7a0: 72 75 65 20 6e 6f 72 20 66 61 6c 73 65 29 20 74  rue nor false) t
a7b0: 68 65 6e 0a 2a 2a 20 6a 75 6d 70 20 69 66 20 6a  hen.** jump if j
a7c0: 75 6d 70 49 66 4e 75 6c 6c 20 69 73 20 74 72 75  umpIfNull is tru
a7d0: 65 20 6f 72 20 66 61 6c 6c 20 74 68 72 6f 75 67  e or fall throug
a7e0: 68 20 69 66 20 6a 75 6d 70 49 66 4e 75 6c 6c 20  h if jumpIfNull 
a7f0: 69 73 20 66 61 6c 73 65 2e 0a 2a 2f 0a 76 6f 69  is false..*/.voi
a800: 64 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46  d sqlite3ExprIfF
a810: 61 6c 73 65 28 50 61 72 73 65 20 2a 70 50 61 72  alse(Parse *pPar
a820: 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c  se, Expr *pExpr,
a830: 20 69 6e 74 20 64 65 73 74 2c 20 69 6e 74 20 6a   int dest, int j
a840: 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 56 64  umpIfNull){.  Vd
a850: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
a860: 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 6f 70 20  pVdbe;.  int op 
a870: 3d 20 30 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20  = 0;.  if( v==0 
a880: 7c 7c 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65  || pExpr==0 ) re
a890: 74 75 72 6e 3b 0a 20 20 73 77 69 74 63 68 28 20  turn;.  switch( 
a8a0: 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20  pExpr->op ){.   
a8b0: 20 63 61 73 65 20 54 4b 5f 4c 54 3a 20 20 20 20   case TK_LT:    
a8c0: 20 20 20 6f 70 20 3d 20 4f 50 5f 47 65 3b 20 20     op = OP_Ge;  
a8d0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
a8e0: 63 61 73 65 20 54 4b 5f 4c 45 3a 20 20 20 20 20  case TK_LE:     
a8f0: 20 20 6f 70 20 3d 20 4f 50 5f 47 74 3b 20 20 20    op = OP_Gt;   
a900: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
a910: 61 73 65 20 54 4b 5f 47 54 3a 20 20 20 20 20 20  ase TK_GT:      
a920: 20 6f 70 20 3d 20 4f 50 5f 4c 65 3b 20 20 20 20   op = OP_Le;    
a930: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
a940: 73 65 20 54 4b 5f 47 45 3a 20 20 20 20 20 20 20  se TK_GE:       
a950: 6f 70 20 3d 20 4f 50 5f 4c 74 3b 20 20 20 20 20  op = OP_Lt;     
a960: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
a970: 65 20 54 4b 5f 4e 45 3a 20 20 20 20 20 20 20 6f  e TK_NE:       o
a980: 70 20 3d 20 4f 50 5f 45 71 3b 20 20 20 20 20 20  p = OP_Eq;      
a990: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
a9a0: 20 54 4b 5f 45 51 3a 20 20 20 20 20 20 20 6f 70   TK_EQ:       op
a9b0: 20 3d 20 4f 50 5f 4e 65 3b 20 20 20 20 20 20 20   = OP_Ne;       
a9c0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
a9d0: 54 4b 5f 49 53 4e 55 4c 4c 3a 20 20 20 6f 70 20  TK_ISNULL:   op 
a9e0: 3d 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 3b 20 20 62  = OP_NotNull;  b
a9f0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
aa00: 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 20 6f 70 20 3d  K_NOTNULL:  op =
aa10: 20 4f 50 5f 49 73 4e 75 6c 6c 3b 20 20 20 62 72   OP_IsNull;   br
aa20: 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74  eak;.    default
aa30: 3a 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20  :  break;.  }.  
aa40: 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f  switch( pExpr->o
aa50: 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
aa60: 5f 41 4e 44 3a 20 7b 0a 20 20 20 20 20 20 73 71  _AND: {.      sq
aa70: 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
aa80: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
aa90: 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d  pLeft, dest, jum
aaa0: 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
aab0: 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
aac0: 73 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  se(pParse, pExpr
aad0: 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20  ->pRight, dest, 
aae0: 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
aaf0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
ab00: 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20      case TK_OR: 
ab10: 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 32 20 3d  {.      int d2 =
ab20: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
ab30: 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
ab40: 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75  sqlite3ExprIfTru
ab50: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
ab60: 3e 70 4c 65 66 74 2c 20 64 32 2c 20 21 6a 75 6d  >pLeft, d2, !jum
ab70: 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
ab80: 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
ab90: 73 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  se(pParse, pExpr
aba0: 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20  ->pRight, dest, 
abb0: 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
abc0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
abd0: 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 32  solveLabel(v, d2
abe0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
abf0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
ac00: 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 73  K_NOT: {.      s
ac10: 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65  qlite3ExprIfTrue
ac20: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
ac30: 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d  pLeft, dest, jum
ac40: 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
ac50: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
ac60: 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20   case TK_LT:.   
ac70: 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20   case TK_LE:.   
ac80: 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20   case TK_GT:.   
ac90: 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20   case TK_GE:.   
aca0: 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20   case TK_NE:.   
acb0: 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20   case TK_EQ: {. 
acc0: 20 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d       if( pParse-
acd0: 3e 64 62 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61 74  >db->file_format
ace0: 3e 3d 34 20 26 26 20 73 71 6c 69 74 65 33 45 78  >=4 && sqlite3Ex
acf0: 70 72 54 79 70 65 28 70 45 78 70 72 29 3d 3d 53  prType(pExpr)==S
ad00: 51 4c 49 54 45 5f 53 4f 5f 54 45 58 54 20 29 7b  QLITE_SO_TEXT ){
ad10: 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 76  .        /* Conv
ad20: 65 72 74 20 6e 75 6d 65 72 69 63 20 63 6f 6d 70  ert numeric comp
ad30: 61 72 69 73 6f 6e 20 6f 70 63 6f 64 65 73 20 69  arison opcodes i
ad40: 6e 74 6f 20 74 65 78 74 20 63 6f 6d 70 61 72 69  nto text compari
ad50: 73 6f 6e 20 6f 70 63 6f 64 65 73 2e 0a 20 20 20  son opcodes..   
ad60: 20 20 20 20 20 2a 2a 20 54 68 69 73 20 73 74 65       ** This ste
ad70: 70 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 68 65  p depends on the
ad80: 20 66 61 63 74 20 74 68 61 74 20 74 68 65 20 74   fact that the t
ad90: 65 78 74 20 63 6f 6d 70 61 72 69 73 69 6f 6e 20  ext comparision 
ada0: 6f 70 63 6f 64 65 73 20 61 72 65 0a 20 20 20 20  opcodes are.    
adb0: 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 36 20      ** always 6 
adc0: 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65  greater than the
add0: 69 72 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  ir corresponding
ade0: 20 6e 75 6d 65 72 69 63 20 63 6f 6d 70 61 72 69   numeric compari
adf0: 73 6f 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  son.        ** o
ae00: 70 63 6f 64 65 73 2e 0a 20 20 20 20 20 20 20 20  pcodes..        
ae10: 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  */.        asser
ae20: 74 28 20 4f 50 5f 45 71 2b 36 20 3d 3d 20 4f 50  t( OP_Eq+6 == OP
ae30: 5f 53 74 72 45 71 20 29 3b 0a 20 20 20 20 20 20  _StrEq );.      
ae40: 20 20 6f 70 20 2b 3d 20 36 3b 0a 20 20 20 20 20    op += 6;.     
ae50: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
ae60: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
ae70: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a   pExpr->pLeft);.
ae80: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
ae90: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
aea0: 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20  xpr->pRight);.  
aeb0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
aec0: 64 64 4f 70 28 76 2c 20 6f 70 2c 20 6a 75 6d 70  ddOp(v, op, jump
aed0: 49 66 4e 75 6c 6c 2c 20 64 65 73 74 29 3b 0a 20  IfNull, dest);. 
aee0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
aef0: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53  }.    case TK_IS
af00: 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54  NULL:.    case T
af10: 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20  K_NOTNULL: {.   
af20: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
af30: 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
af40: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20  ->pLeft);.      
af50: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
af60: 28 76 2c 20 6f 70 2c 20 31 2c 20 64 65 73 74 29  (v, op, 1, dest)
af70: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
af80: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
af90: 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  _IN: {.      int
afa0: 20 61 64 64 72 3b 0a 20 20 20 20 20 20 73 71 6c   addr;.      sql
afb0: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
afc0: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
afd0: 74 29 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d  t);.      addr =
afe0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
aff0: 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
b000: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
b010: 4f 70 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c  Op(v, OP_NotNull
b020: 2c 20 2d 31 2c 20 61 64 64 72 2b 33 29 3b 0a 20  , -1, addr+3);. 
b030: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
b040: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c  AddOp(v, OP_Pop,
b050: 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   1, 0);.      sq
b060: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
b070: 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 6a 75  , OP_Goto, 0, ju
b080: 6d 70 49 66 4e 75 6c 6c 20 3f 20 64 65 73 74 20  mpIfNull ? dest 
b090: 3a 20 61 64 64 72 2b 34 29 3b 0a 20 20 20 20 20  : addr+4);.     
b0a0: 20 69 66 28 20 70 45 78 70 72 2d 3e 70 53 65 6c   if( pExpr->pSel
b0b0: 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ect ){.        s
b0c0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
b0d0: 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20  v, OP_NotFound, 
b0e0: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 64  pExpr->iTable, d
b0f0: 65 73 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  est);.      }els
b100: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
b110: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
b120: 50 5f 53 65 74 4e 6f 74 46 6f 75 6e 64 2c 20 70  P_SetNotFound, p
b130: 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 64 65  Expr->iTable, de
b140: 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  st);.      }.   
b150: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
b160: 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54 57      case TK_BETW
b170: 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  EEN: {.      int
b180: 20 61 64 64 72 3b 0a 20 20 20 20 20 20 73 71 6c   addr;.      sql
b190: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
b1a0: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
b1b0: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
b1c0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
b1d0: 5f 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20  _Dup, 0, 0);.   
b1e0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
b1f0: 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
b200: 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45  ->pList->a[0].pE
b210: 78 70 72 29 3b 0a 20 20 20 20 20 20 61 64 64 72  xpr);.      addr
b220: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
b230: 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
b240: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
b250: 64 64 4f 70 28 76 2c 20 4f 50 5f 47 65 2c 20 21  ddOp(v, OP_Ge, !
b260: 6a 75 6d 70 49 66 4e 75 6c 6c 2c 20 61 64 64 72  jumpIfNull, addr
b270: 2b 33 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  +3);.      sqlit
b280: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
b290: 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20  P_Pop, 1, 0);.  
b2a0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
b2b0: 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  ddOp(v, OP_Goto,
b2c0: 20 30 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20   0, dest);.     
b2d0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
b2e0: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
b2f0: 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70  pList->a[1].pExp
b300: 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  r);.      sqlite
b310: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
b320: 5f 47 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 2c  _Gt, jumpIfNull,
b330: 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 62 72   dest);.      br
b340: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64  eak;.    }.    d
b350: 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
b360: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
b370: 70 50 61 72 73 65 2c 20 70 45 78 70 72 29 3b 0a  pParse, pExpr);.
b380: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
b390: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 66 4e  eAddOp(v, OP_IfN
b3a0: 6f 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 2c 20  ot, jumpIfNull, 
b3b0: 64 65 73 74 29 3b 0a 20 20 20 20 20 20 62 72 65  dest);.      bre
b3c0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  ak;.    }.  }.}.
b3d0: 0a 2f 2a 0a 2a 2a 20 44 6f 20 61 20 64 65 65 70  ./*.** Do a deep
b3e0: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 66 20 74   comparison of t
b3f0: 77 6f 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  wo expression tr
b400: 65 65 73 2e 20 20 52 65 74 75 72 6e 20 54 52 55  ees.  Return TRU
b410: 45 20 28 6e 6f 6e 2d 7a 65 72 6f 29 0a 2a 2a 20  E (non-zero).** 
b420: 69 66 20 74 68 65 79 20 61 72 65 20 69 64 65 6e  if they are iden
b430: 74 69 63 61 6c 20 61 6e 64 20 72 65 74 75 72 6e  tical and return
b440: 20 46 41 4c 53 45 20 69 66 20 74 68 65 79 20 64   FALSE if they d
b450: 69 66 66 65 72 20 69 6e 20 61 6e 79 20 77 61 79  iffer in any way
b460: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
b470: 45 78 70 72 43 6f 6d 70 61 72 65 28 45 78 70 72  ExprCompare(Expr
b480: 20 2a 70 41 2c 20 45 78 70 72 20 2a 70 42 29 7b   *pA, Expr *pB){
b490: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
b4a0: 70 41 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  pA==0 ){.    ret
b4b0: 75 72 6e 20 70 42 3d 3d 30 3b 0a 20 20 7d 65 6c  urn pB==0;.  }el
b4c0: 73 65 20 69 66 28 20 70 42 3d 3d 30 20 29 7b 0a  se if( pB==0 ){.
b4d0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
b4e0: 7d 0a 20 20 69 66 28 20 70 41 2d 3e 6f 70 21 3d  }.  if( pA->op!=
b4f0: 70 42 2d 3e 6f 70 20 29 20 72 65 74 75 72 6e 20  pB->op ) return 
b500: 30 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  0;.  if( !sqlite
b510: 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 41 2d  3ExprCompare(pA-
b520: 3e 70 4c 65 66 74 2c 20 70 42 2d 3e 70 4c 65 66  >pLeft, pB->pLef
b530: 74 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  t) ) return 0;. 
b540: 20 69 66 28 20 21 73 71 6c 69 74 65 33 45 78 70   if( !sqlite3Exp
b550: 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e 70 52 69  rCompare(pA->pRi
b560: 67 68 74 2c 20 70 42 2d 3e 70 52 69 67 68 74 29  ght, pB->pRight)
b570: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
b580: 66 28 20 70 41 2d 3e 70 4c 69 73 74 20 29 7b 0a  f( pA->pList ){.
b590: 20 20 20 20 69 66 28 20 70 42 2d 3e 70 4c 69 73      if( pB->pLis
b5a0: 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  t==0 ) return 0;
b5b0: 0a 20 20 20 20 69 66 28 20 70 41 2d 3e 70 4c 69  .    if( pA->pLi
b5c0: 73 74 2d 3e 6e 45 78 70 72 21 3d 70 42 2d 3e 70  st->nExpr!=pB->p
b5d0: 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 20 72 65  List->nExpr ) re
b5e0: 74 75 72 6e 20 30 3b 0a 20 20 20 20 66 6f 72 28  turn 0;.    for(
b5f0: 69 3d 30 3b 20 69 3c 70 41 2d 3e 70 4c 69 73 74  i=0; i<pA->pList
b600: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
b610: 20 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65       if( !sqlite
b620: 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 41 2d  3ExprCompare(pA-
b630: 3e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  >pList->a[i].pEx
b640: 70 72 2c 20 70 42 2d 3e 70 4c 69 73 74 2d 3e 61  pr, pB->pList->a
b650: 5b 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20  [i].pExpr) ){.  
b660: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
b670: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
b680: 7d 65 6c 73 65 20 69 66 28 20 70 42 2d 3e 70 4c  }else if( pB->pL
b690: 69 73 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ist ){.    retur
b6a0: 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  n 0;.  }.  if( p
b6b0: 41 2d 3e 70 53 65 6c 65 63 74 20 7c 7c 20 70 42  A->pSelect || pB
b6c0: 2d 3e 70 53 65 6c 65 63 74 20 29 20 72 65 74 75  ->pSelect ) retu
b6d0: 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 41 2d 3e  rn 0;.  if( pA->
b6e0: 69 54 61 62 6c 65 21 3d 70 42 2d 3e 69 54 61 62  iTable!=pB->iTab
b6f0: 6c 65 20 7c 7c 20 70 41 2d 3e 69 43 6f 6c 75 6d  le || pA->iColum
b700: 6e 21 3d 70 42 2d 3e 69 43 6f 6c 75 6d 6e 20 29  n!=pB->iColumn )
b710: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
b720: 20 70 41 2d 3e 74 6f 6b 65 6e 2e 7a 20 29 7b 0a   pA->token.z ){.
b730: 20 20 20 20 69 66 28 20 70 42 2d 3e 74 6f 6b 65      if( pB->toke
b740: 6e 2e 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  n.z==0 ) return 
b750: 30 3b 0a 20 20 20 20 69 66 28 20 70 42 2d 3e 74  0;.    if( pB->t
b760: 6f 6b 65 6e 2e 6e 21 3d 70 41 2d 3e 74 6f 6b 65  oken.n!=pA->toke
b770: 6e 2e 6e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  n.n ) return 0;.
b780: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
b790: 74 72 4e 49 43 6d 70 28 70 41 2d 3e 74 6f 6b 65  trNICmp(pA->toke
b7a0: 6e 2e 7a 2c 20 70 42 2d 3e 74 6f 6b 65 6e 2e 7a  n.z, pB->token.z
b7b0: 2c 20 70 42 2d 3e 74 6f 6b 65 6e 2e 6e 29 21 3d  , pB->token.n)!=
b7c0: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
b7d0: 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  }.  return 1;.}.
b7e0: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77  ./*.** Add a new
b7f0: 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20   element to the 
b800: 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 5d 20 61  pParse->aAgg[] a
b810: 72 72 61 79 20 61 6e 64 20 72 65 74 75 72 6e 20  rray and return 
b820: 69 74 73 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74  its index..*/.st
b830: 61 74 69 63 20 69 6e 74 20 61 70 70 65 6e 64 41  atic int appendA
b840: 67 67 49 6e 66 6f 28 50 61 72 73 65 20 2a 70 50  ggInfo(Parse *pP
b850: 61 72 73 65 29 7b 0a 20 20 69 66 28 20 28 70 50  arse){.  if( (pP
b860: 61 72 73 65 2d 3e 6e 41 67 67 20 26 20 30 78 37  arse->nAgg & 0x7
b870: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  )==0 ){.    int 
b880: 61 6d 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 41  amt = pParse->nA
b890: 67 67 20 2b 20 38 3b 0a 20 20 20 20 41 67 67 45  gg + 8;.    AggE
b8a0: 78 70 72 20 2a 61 41 67 67 20 3d 20 73 71 6c 69  xpr *aAgg = sqli
b8b0: 74 65 52 65 61 6c 6c 6f 63 28 70 50 61 72 73 65  teRealloc(pParse
b8c0: 2d 3e 61 41 67 67 2c 20 61 6d 74 2a 73 69 7a 65  ->aAgg, amt*size
b8d0: 6f 66 28 70 50 61 72 73 65 2d 3e 61 41 67 67 5b  of(pParse->aAgg[
b8e0: 30 5d 29 29 3b 0a 20 20 20 20 69 66 28 20 61 41  0]));.    if( aA
b8f0: 67 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  gg==0 ){.      r
b900: 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a  eturn -1;.    }.
b910: 20 20 20 20 70 50 61 72 73 65 2d 3e 61 41 67 67      pParse->aAgg
b920: 20 3d 20 61 41 67 67 3b 0a 20 20 7d 0a 20 20 6d   = aAgg;.  }.  m
b930: 65 6d 73 65 74 28 26 70 50 61 72 73 65 2d 3e 61  emset(&pParse->a
b940: 41 67 67 5b 70 50 61 72 73 65 2d 3e 6e 41 67 67  Agg[pParse->nAgg
b950: 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 50 61  ], 0, sizeof(pPa
b960: 72 73 65 2d 3e 61 41 67 67 5b 30 5d 29 29 3b 0a  rse->aAgg[0]));.
b970: 20 20 72 65 74 75 72 6e 20 70 50 61 72 73 65 2d    return pParse-
b980: 3e 6e 41 67 67 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a  >nAgg++;.}../*.*
b990: 2a 20 41 6e 61 6c 79 7a 65 20 74 68 65 20 67 69  * Analyze the gi
b9a0: 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  ven expression l
b9b0: 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 67 67 72 65  ooking for aggre
b9c0: 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 61  gate functions a
b9d0: 6e 64 0a 2a 2a 20 66 6f 72 20 76 61 72 69 61 62  nd.** for variab
b9e0: 6c 65 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f  les that need to
b9f0: 20 62 65 20 61 64 64 65 64 20 74 6f 20 74 68 65   be added to the
ba00: 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 5d 20   pParse->aAgg[] 
ba10: 61 72 72 61 79 2e 0a 2a 2a 20 4d 61 6b 65 20 61  array..** Make a
ba20: 64 64 69 74 69 6f 6e 61 6c 20 65 6e 74 72 69 65  dditional entrie
ba30: 73 20 74 6f 20 74 68 65 20 70 50 61 72 73 65 2d  s to the pParse-
ba40: 3e 61 41 67 67 5b 5d 20 61 72 72 61 79 20 61 73  >aAgg[] array as
ba50: 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 0a 2a   necessary..**.*
ba60: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * This routine s
ba70: 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61  hould only be ca
ba80: 6c 6c 65 64 20 61 66 74 65 72 20 74 68 65 20 65  lled after the e
ba90: 78 70 72 65 73 73 69 6f 6e 20 68 61 73 20 62 65  xpression has be
baa0: 65 6e 0a 2a 2a 20 61 6e 61 6c 79 7a 65 64 20 62  en.** analyzed b
bab0: 79 20 73 71 6c 69 74 65 33 45 78 70 72 52 65 73  y sqlite3ExprRes
bac0: 6f 6c 76 65 49 64 73 28 29 20 61 6e 64 20 73 71  olveIds() and sq
bad0: 6c 69 74 65 33 45 78 70 72 43 68 65 63 6b 28 29  lite3ExprCheck()
bae0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 72 72 6f 72  ..**.** If error
baf0: 73 20 61 72 65 20 73 65 65 6e 2c 20 6c 65 61 76  s are seen, leav
bb00: 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  e an error messa
bb10: 67 65 20 69 6e 20 7a 45 72 72 4d 73 67 20 61 6e  ge in zErrMsg an
bb20: 64 20 72 65 74 75 72 6e 0a 2a 2a 20 74 68 65 20  d return.** the 
bb30: 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73  number of errors
bb40: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
bb50: 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65  ExprAnalyzeAggre
bb60: 67 61 74 65 73 28 50 61 72 73 65 20 2a 70 50 61  gates(Parse *pPa
bb70: 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
bb80: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 41 67  ){.  int i;.  Ag
bb90: 67 45 78 70 72 20 2a 61 41 67 67 3b 0a 20 20 69  gExpr *aAgg;.  i
bba0: 6e 74 20 6e 45 72 72 20 3d 20 30 3b 0a 0a 20 20  nt nErr = 0;..  
bbb0: 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72  if( pExpr==0 ) r
bbc0: 65 74 75 72 6e 20 30 3b 0a 20 20 73 77 69 74 63  eturn 0;.  switc
bbd0: 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a  h( pExpr->op ){.
bbe0: 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55      case TK_COLU
bbf0: 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 61 41 67 67  MN: {.      aAgg
bc00: 20 3d 20 70 50 61 72 73 65 2d 3e 61 41 67 67 3b   = pParse->aAgg;
bc10: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
bc20: 69 3c 70 50 61 72 73 65 2d 3e 6e 41 67 67 3b 20  i<pParse->nAgg; 
bc30: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  i++){.        if
bc40: 28 20 61 41 67 67 5b 69 5d 2e 69 73 41 67 67 20  ( aAgg[i].isAgg 
bc50: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
bc60: 20 20 20 20 69 66 28 20 61 41 67 67 5b 69 5d 2e      if( aAgg[i].
bc70: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70  pExpr->iTable==p
bc80: 45 78 70 72 2d 3e 69 54 61 62 6c 65 0a 20 20 20  Expr->iTable.   
bc90: 20 20 20 20 20 20 26 26 20 61 41 67 67 5b 69 5d        && aAgg[i]
bca0: 2e 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d  .pExpr->iColumn=
bcb0: 3d 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20  =pExpr->iColumn 
bcc0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  ){.          bre
bcd0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
bce0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
bcf0: 69 3e 3d 70 50 61 72 73 65 2d 3e 6e 41 67 67 20  i>=pParse->nAgg 
bd00: 29 7b 0a 20 20 20 20 20 20 20 20 69 20 3d 20 61  ){.        i = a
bd10: 70 70 65 6e 64 41 67 67 49 6e 66 6f 28 70 50 61  ppendAggInfo(pPa
bd20: 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  rse);.        if
bd30: 28 20 69 3c 30 20 29 20 72 65 74 75 72 6e 20 31  ( i<0 ) return 1
bd40: 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65  ;.        pParse
bd50: 2d 3e 61 41 67 67 5b 69 5d 2e 69 73 41 67 67 20  ->aAgg[i].isAgg 
bd60: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 50 61  = 0;.        pPa
bd70: 72 73 65 2d 3e 61 41 67 67 5b 69 5d 2e 70 45 78  rse->aAgg[i].pEx
bd80: 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20  pr = pExpr;.    
bd90: 20 20 7d 0a 20 20 20 20 20 20 70 45 78 70 72 2d    }.      pExpr-
bda0: 3e 69 41 67 67 20 3d 20 69 3b 0a 20 20 20 20 20  >iAgg = i;.     
bdb0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
bdc0: 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55    case TK_AGG_FU
bdd0: 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20  NCTION: {.      
bde0: 61 41 67 67 20 3d 20 70 50 61 72 73 65 2d 3e 61  aAgg = pParse->a
bdf0: 41 67 67 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  Agg;.      for(i
be00: 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 41  =0; i<pParse->nA
be10: 67 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  gg; i++){.      
be20: 20 20 69 66 28 20 21 61 41 67 67 5b 69 5d 2e 69    if( !aAgg[i].i
be30: 73 41 67 67 20 29 20 63 6f 6e 74 69 6e 75 65 3b  sAgg ) continue;
be40: 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
be50: 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28  ite3ExprCompare(
be60: 61 41 67 67 5b 69 5d 2e 70 45 78 70 72 2c 20 70  aAgg[i].pExpr, p
be70: 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20  Expr) ){.       
be80: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
be90: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
bea0: 20 20 69 66 28 20 69 3e 3d 70 50 61 72 73 65 2d    if( i>=pParse-
beb0: 3e 6e 41 67 67 20 29 7b 0a 20 20 20 20 20 20 20  >nAgg ){.       
bec0: 20 69 20 3d 20 61 70 70 65 6e 64 41 67 67 49 6e   i = appendAggIn
bed0: 66 6f 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  fo(pParse);.    
bee0: 20 20 20 20 69 66 28 20 69 3c 30 20 29 20 72 65      if( i<0 ) re
bef0: 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20  turn 1;.        
bf00: 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 69 5d 2e  pParse->aAgg[i].
bf10: 69 73 41 67 67 20 3d 20 31 3b 0a 20 20 20 20 20  isAgg = 1;.     
bf20: 20 20 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b     pParse->aAgg[
bf30: 69 5d 2e 70 45 78 70 72 20 3d 20 70 45 78 70 72  i].pExpr = pExpr
bf40: 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65  ;.        pParse
bf50: 2d 3e 61 41 67 67 5b 69 5d 2e 70 46 75 6e 63 20  ->aAgg[i].pFunc 
bf60: 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e  = sqlite3FindFun
bf70: 63 74 69 6f 6e 28 70 50 61 72 73 65 2d 3e 64 62  ction(pParse->db
bf80: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 70  ,.             p
bf90: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70  Expr->token.z, p
bfa0: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 2c 0a 20  Expr->token.n,. 
bfb0: 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
bfc0: 72 2d 3e 70 4c 69 73 74 20 3f 20 70 45 78 70 72  r->pList ? pExpr
bfd0: 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a  ->pList->nExpr :
bfe0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a   0, 0);.      }.
bff0: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 41 67        pExpr->iAg
c000: 67 20 3d 20 69 3b 0a 20 20 20 20 20 20 62 72 65  g = i;.      bre
c010: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65  ak;.    }.    de
c020: 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 69  fault: {.      i
c030: 66 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20  f( pExpr->pLeft 
c040: 29 7b 0a 20 20 20 20 20 20 20 20 6e 45 72 72 20  ){.        nErr 
c050: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61  = sqlite3ExprAna
c060: 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 70  lyzeAggregates(p
c070: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
c080: 65 66 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  eft);.      }.  
c090: 20 20 20 20 69 66 28 20 6e 45 72 72 3d 3d 30 20      if( nErr==0 
c0a0: 26 26 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  && pExpr->pRight
c0b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 45 72 72   ){.        nErr
c0c0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e   = sqlite3ExprAn
c0d0: 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28  alyzeAggregates(
c0e0: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
c0f0: 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 7d 0a  Right);.      }.
c100: 20 20 20 20 20 20 69 66 28 20 6e 45 72 72 3d 3d        if( nErr==
c110: 30 20 26 26 20 70 45 78 70 72 2d 3e 70 4c 69 73  0 && pExpr->pLis
c120: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  t ){.        int
c130: 20 6e 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73   n = pExpr->pLis
c140: 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20  t->nExpr;.      
c150: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20    int i;.       
c160: 20 66 6f 72 28 69 3d 30 3b 20 6e 45 72 72 3d 3d   for(i=0; nErr==
c170: 30 20 26 26 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a  0 && i<n; i++){.
c180: 20 20 20 20 20 20 20 20 20 20 6e 45 72 72 20 3d            nErr =
c190: 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
c1a0: 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 70 50  yzeAggregates(pP
c1b0: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 69  arse, pExpr->pLi
c1c0: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b  st->a[i].pExpr);
c1d0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
c1e0: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
c1f0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
c200: 72 6e 20 6e 45 72 72 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn nErr;.}../*.*
c210: 2a 20 4c 6f 63 61 74 65 20 61 20 75 73 65 72 20  * Locate a user 
c220: 66 75 6e 63 74 69 6f 6e 20 67 69 76 65 6e 20 61  function given a
c230: 20 6e 61 6d 65 20 61 6e 64 20 61 20 6e 75 6d 62   name and a numb
c240: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 2e  er of arguments.
c250: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .** Return a poi
c260: 6e 74 65 72 20 74 6f 20 74 68 65 20 46 75 6e 63  nter to the Func
c270: 44 65 66 20 73 74 72 75 63 74 75 72 65 20 74 68  Def structure th
c280: 61 74 20 64 65 66 69 6e 65 73 20 74 68 61 74 0a  at defines that.
c290: 2a 2a 20 66 75 6e 63 74 69 6f 6e 2c 20 6f 72 20  ** function, or 
c2a0: 72 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 74  return NULL if t
c2b0: 68 65 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73  he function does
c2c0: 20 6e 6f 74 20 65 78 69 73 74 2e 0a 2a 2a 0a 2a   not exist..**.*
c2d0: 2a 20 49 66 20 74 68 65 20 63 72 65 61 74 65 46  * If the createF
c2e0: 6c 61 67 20 61 72 67 75 6d 65 6e 74 20 69 73 20  lag argument is 
c2f0: 74 72 75 65 2c 20 74 68 65 6e 20 61 20 6e 65 77  true, then a new
c300: 20 28 62 6c 61 6e 6b 29 20 46 75 6e 63 44 65 66   (blank) FuncDef
c310: 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 69 73  .** structure is
c320: 20 63 72 65 61 74 65 64 20 61 6e 64 20 6c 69 6b   created and lik
c330: 65 64 20 69 6e 74 6f 20 74 68 65 20 22 64 62 22  ed into the "db"
c340: 20 73 74 72 75 63 74 75 72 65 20 69 66 20 61 0a   structure if a.
c350: 2a 2a 20 6e 6f 20 6d 61 74 63 68 69 6e 67 20 66  ** no matching f
c360: 75 6e 63 74 69 6f 6e 20 70 72 65 76 69 6f 75 73  unction previous
c370: 6c 79 20 65 78 69 73 74 65 64 2e 20 20 57 68 65  ly existed.  Whe
c380: 6e 20 63 72 65 61 74 65 46 6c 61 67 20 69 73 20  n createFlag is 
c390: 74 72 75 65 0a 2a 2a 20 61 6e 64 20 74 68 65 20  true.** and the 
c3a0: 6e 41 72 67 20 70 61 72 61 6d 65 74 65 72 20 69  nArg parameter i
c3b0: 73 20 2d 31 2c 20 74 68 65 6e 20 6f 6e 6c 79 20  s -1, then only 
c3c0: 61 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20  a function that 
c3d0: 61 63 63 65 70 74 73 0a 2a 2a 20 61 6e 79 20 6e  accepts.** any n
c3e0: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
c3f0: 74 73 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72  ts will be retur
c400: 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 63 72  ned..**.** If cr
c410: 65 61 74 65 46 6c 61 67 20 69 73 20 66 61 6c 73  eateFlag is fals
c420: 65 20 61 6e 64 20 6e 41 72 67 20 69 73 20 2d 31  e and nArg is -1
c430: 2c 20 74 68 65 6e 20 74 68 65 20 66 69 72 73 74  , then the first
c440: 20 76 61 6c 69 64 0a 2a 2a 20 66 75 6e 63 74 69   valid.** functi
c450: 6f 6e 20 66 6f 75 6e 64 20 69 73 20 72 65 74 75  on found is retu
c460: 72 6e 65 64 2e 20 20 41 20 66 75 6e 63 74 69 6f  rned.  A functio
c470: 6e 20 69 73 20 76 61 6c 69 64 20 69 66 20 65 69  n is valid if ei
c480: 74 68 65 72 20 78 46 75 6e 63 0a 2a 2a 20 6f 72  ther xFunc.** or
c490: 20 78 53 74 65 70 20 69 73 20 6e 6f 6e 2d 7a 65   xStep is non-ze
c4a0: 72 6f 2e 0a 2a 2f 0a 46 75 6e 63 44 65 66 20 2a  ro..*/.FuncDef *
c4b0: 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74  sqlite3FindFunct
c4c0: 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 20 2a 64  ion(.  sqlite *d
c4d0: 62 2c 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20  b,        /* An 
c4e0: 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 2a 2f  open database */
c4f0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
c500: 4e 61 6d 65 2c 20 2f 2a 20 4e 61 6d 65 20 6f 66  Name, /* Name of
c510: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 2e 20 20   the function.  
c520: 4e 6f 74 20 6e 75 6c 6c 2d 74 65 72 6d 69 6e 61  Not null-termina
c530: 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61  ted */.  int nNa
c540: 6d 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  me,         /* N
c550: 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63 74  umber of charact
c560: 65 72 73 20 69 6e 20 74 68 65 20 6e 61 6d 65 20  ers in the name 
c570: 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67 2c 20 20  */.  int nArg,  
c580: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
c590: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 2e 20  r of arguments. 
c5a0: 20 2d 31 20 6d 65 61 6e 73 20 61 6e 79 20 6e 75   -1 means any nu
c5b0: 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20 63 72  mber */.  int cr
c5c0: 65 61 74 65 46 6c 61 67 20 20 20 20 20 2f 2a 20  eateFlag     /* 
c5d0: 43 72 65 61 74 65 20 6e 65 77 20 65 6e 74 72 79  Create new entry
c5e0: 20 69 66 20 74 72 75 65 20 61 6e 64 20 64 6f 65   if true and doe
c5f0: 73 20 6e 6f 74 20 6f 74 68 65 72 77 69 73 65 20  s not otherwise 
c600: 65 78 69 73 74 20 2a 2f 0a 29 7b 0a 20 20 46 75  exist */.){.  Fu
c610: 6e 63 44 65 66 20 2a 70 46 69 72 73 74 2c 20 2a  ncDef *pFirst, *
c620: 70 2c 20 2a 70 4d 61 79 62 65 3b 0a 20 20 70 46  p, *pMaybe;.  pF
c630: 69 72 73 74 20 3d 20 70 20 3d 20 28 46 75 6e 63  irst = p = (Func
c640: 44 65 66 2a 29 73 71 6c 69 74 65 33 48 61 73 68  Def*)sqlite3Hash
c650: 46 69 6e 64 28 26 64 62 2d 3e 61 46 75 6e 63 2c  Find(&db->aFunc,
c660: 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a   zName, nName);.
c670: 20 20 69 66 28 20 70 20 26 26 20 21 63 72 65 61    if( p && !crea
c680: 74 65 46 6c 61 67 20 26 26 20 6e 41 72 67 3c 30  teFlag && nArg<0
c690: 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 70   ){.    while( p
c6a0: 20 26 26 20 70 2d 3e 78 46 75 6e 63 3d 3d 30 20   && p->xFunc==0 
c6b0: 26 26 20 70 2d 3e 78 53 74 65 70 3d 3d 30 20 29  && p->xStep==0 )
c6c0: 7b 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 20  { p = p->pNext; 
c6d0: 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 70 3b 0a  }.    return p;.
c6e0: 20 20 7d 0a 20 20 70 4d 61 79 62 65 20 3d 20 30    }.  pMaybe = 0
c6f0: 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 26 26 20  ;.  while( p && 
c700: 70 2d 3e 6e 41 72 67 21 3d 6e 41 72 67 20 29 7b  p->nArg!=nArg ){
c710: 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 41 72 67  .    if( p->nArg
c720: 3c 30 20 26 26 20 21 63 72 65 61 74 65 46 6c 61  <0 && !createFla
c730: 67 20 26 26 20 28 70 2d 3e 78 46 75 6e 63 20 7c  g && (p->xFunc |
c740: 7c 20 70 2d 3e 78 53 74 65 70 29 20 29 20 70 4d  | p->xStep) ) pM
c750: 61 79 62 65 20 3d 20 70 3b 0a 20 20 20 20 70 20  aybe = p;.    p 
c760: 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a  = p->pNext;.  }.
c770: 20 20 69 66 28 20 70 20 26 26 20 21 63 72 65 61    if( p && !crea
c780: 74 65 46 6c 61 67 20 26 26 20 70 2d 3e 78 46 75  teFlag && p->xFu
c790: 6e 63 3d 3d 30 20 26 26 20 70 2d 3e 78 53 74 65  nc==0 && p->xSte
c7a0: 70 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  p==0 ){.    retu
c7b0: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 0;.  }.  if( 
c7c0: 70 3d 3d 30 20 26 26 20 70 4d 61 79 62 65 20 29  p==0 && pMaybe )
c7d0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 63 72  {.    assert( cr
c7e0: 65 61 74 65 46 6c 61 67 3d 3d 30 20 29 3b 0a 20  eateFlag==0 );. 
c7f0: 20 20 20 72 65 74 75 72 6e 20 70 4d 61 79 62 65     return pMaybe
c800: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 3d 3d 30  ;.  }.  if( p==0
c810: 20 26 26 20 63 72 65 61 74 65 46 6c 61 67 20 26   && createFlag &
c820: 26 20 28 70 20 3d 20 73 71 6c 69 74 65 4d 61 6c  & (p = sqliteMal
c830: 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 70 29 29 29  loc(sizeof(*p)))
c840: 21 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 41  !=0 ){.    p->nA
c850: 72 67 20 3d 20 6e 41 72 67 3b 0a 20 20 20 20 70  rg = nArg;.    p
c860: 2d 3e 70 4e 65 78 74 20 3d 20 70 46 69 72 73 74  ->pNext = pFirst
c870: 3b 0a 20 20 20 20 70 2d 3e 64 61 74 61 54 79 70  ;.    p->dataTyp
c880: 65 20 3d 20 70 46 69 72 73 74 20 3f 20 70 46 69  e = pFirst ? pFi
c890: 72 73 74 2d 3e 64 61 74 61 54 79 70 65 20 3a 20  rst->dataType : 
c8a0: 53 51 4c 49 54 45 5f 4e 55 4d 45 52 49 43 3b 0a  SQLITE_NUMERIC;.
c8b0: 20 20 20 20 73 71 6c 69 74 65 33 48 61 73 68 49      sqlite3HashI
c8c0: 6e 73 65 72 74 28 26 64 62 2d 3e 61 46 75 6e 63  nsert(&db->aFunc
c8d0: 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20  , zName, nName, 
c8e0: 28 76 6f 69 64 2a 29 70 29 3b 0a 20 20 7d 0a 20  (void*)p);.  }. 
c8f0: 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 0a 0a   return p;.}....