/ Hex Artifact Content
Login

Artifact f32119248996680aa73c5c37bfdd42820804dc17:


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 2f 0a 23 69  in SQLite..*/.#i
0200: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
0210: 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  t.h"../*.** Retu
0220: 72 6e 20 74 68 65 20 27 61 66 66 69 6e 69 74 79  rn the 'affinity
0230: 27 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73  ' of the express
0240: 69 6f 6e 20 70 45 78 70 72 20 69 66 20 61 6e 79  ion pExpr if any
0250: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78 70 72  ..**.** If pExpr
0260: 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 61 20   is a column, a 
0270: 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61 20 63  reference to a c
0280: 6f 6c 75 6d 6e 20 76 69 61 20 61 6e 20 27 41 53  olumn via an 'AS
0290: 27 20 61 6c 69 61 73 2c 0a 2a 2a 20 6f 72 20 61  ' alias,.** or a
02a0: 20 73 75 62 2d 73 65 6c 65 63 74 20 77 69 74 68   sub-select with
02b0: 20 61 20 63 6f 6c 75 6d 6e 20 61 73 20 74 68 65   a column as the
02c0: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 2c 20 74   return value, t
02d0: 68 65 6e 20 74 68 65 20 0a 2a 2a 20 61 66 66 69  hen the .** affi
02e0: 6e 69 74 79 20 6f 66 20 74 68 61 74 20 63 6f 6c  nity of that col
02f0: 75 6d 6e 20 69 73 20 72 65 74 75 72 6e 65 64 2e  umn is returned.
0300: 20 4f 74 68 65 72 77 69 73 65 2c 20 30 78 30 30   Otherwise, 0x00
0310: 20 69 73 20 72 65 74 75 72 6e 65 64 2c 0a 2a 2a   is returned,.**
0320: 20 69 6e 64 69 63 61 74 69 6e 67 20 6e 6f 20 61   indicating no a
0330: 66 66 69 6e 69 74 79 20 66 6f 72 20 74 68 65 20  ffinity for the 
0340: 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a  expression..**.*
0350: 2a 20 69 2e 65 2e 20 74 68 65 20 57 48 45 52 45  * i.e. the WHERE
0360: 20 63 6c 61 75 73 65 20 65 78 70 72 65 73 73 69   clause expressi
0370: 6f 6e 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f  ons in the follo
0380: 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 73 20  wing statements 
0390: 61 6c 6c 0a 2a 2a 20 68 61 76 65 20 61 6e 20 61  all.** have an a
03a0: 66 66 69 6e 69 74 79 3a 0a 2a 2a 0a 2a 2a 20 43  ffinity:.**.** C
03b0: 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61  REATE TABLE t1(a
03c0: 29 3b 0a 2a 2a 20 53 45 4c 45 43 54 20 2a 20 46  );.** SELECT * F
03d0: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3b 0a  ROM t1 WHERE a;.
03e0: 2a 2a 20 53 45 4c 45 43 54 20 61 20 41 53 20 62  ** SELECT a AS b
03f0: 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 62   FROM t1 WHERE b
0400: 3b 0a 2a 2a 20 53 45 4c 45 43 54 20 2a 20 46 52  ;.** SELECT * FR
0410: 4f 4d 20 74 31 20 57 48 45 52 45 20 28 73 65 6c  OM t1 WHERE (sel
0420: 65 63 74 20 61 20 66 72 6f 6d 20 74 31 29 3b 0a  ect a from t1);.
0430: 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33 45  */.char sqlite3E
0440: 78 70 72 41 66 66 69 6e 69 74 79 28 45 78 70 72  xprAffinity(Expr
0450: 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74 20   *pExpr){.  int 
0460: 6f 70 3b 0a 20 20 70 45 78 70 72 20 3d 20 73 71  op;.  pExpr = sq
0470: 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c  lite3ExprSkipCol
0480: 6c 61 74 65 28 70 45 78 70 72 29 3b 0a 20 20 69  late(pExpr);.  i
0490: 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 20  f( pExpr->flags 
04a0: 26 20 45 50 5f 47 65 6e 65 72 69 63 20 29 20 72  & EP_Generic ) r
04b0: 65 74 75 72 6e 20 30 3b 0a 20 20 6f 70 20 3d 20  eturn 0;.  op = 
04c0: 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 69 66 28  pExpr->op;.  if(
04d0: 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29   op==TK_SELECT )
04e0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45  {.    assert( pE
04f0: 78 70 72 2d 3e 66 6c 61 67 73 26 45 50 5f 78 49  xpr->flags&EP_xI
0500: 73 53 65 6c 65 63 74 20 29 3b 0a 20 20 20 20 72  sSelect );.    r
0510: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70  eturn sqlite3Exp
0520: 72 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 2d  rAffinity(pExpr-
0530: 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69  >x.pSelect->pELi
0540: 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b  st->a[0].pExpr);
0550: 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c  .  }.#ifndef SQL
0560: 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54 0a 20 20  ITE_OMIT_CAST.  
0570: 69 66 28 20 6f 70 3d 3d 54 4b 5f 43 41 53 54 20  if( op==TK_CAST 
0580: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  ){.    assert( !
0590: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
05a0: 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c  pExpr, EP_IntVal
05b0: 75 65 29 20 29 3b 0a 20 20 20 20 72 65 74 75 72  ue) );.    retur
05c0: 6e 20 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74  n sqlite3Affinit
05d0: 79 54 79 70 65 28 70 45 78 70 72 2d 3e 75 2e 7a  yType(pExpr->u.z
05e0: 54 6f 6b 65 6e 2c 20 30 29 3b 0a 20 20 7d 0a 23  Token, 0);.  }.#
05f0: 65 6e 64 69 66 0a 20 20 69 66 28 20 28 6f 70 3d  endif.  if( (op=
0600: 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 7c  =TK_AGG_COLUMN |
0610: 7c 20 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  | op==TK_COLUMN 
0620: 7c 7c 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54  || op==TK_REGIST
0630: 45 52 29 20 0a 20 20 20 26 26 20 70 45 78 70 72  ER) .   && pExpr
0640: 2d 3e 70 54 61 62 21 3d 30 0a 20 20 29 7b 0a 20  ->pTab!=0.  ){. 
0650: 20 20 20 2f 2a 20 6f 70 3d 3d 54 4b 5f 52 45 47     /* op==TK_REG
0660: 49 53 54 45 52 20 26 26 20 70 45 78 70 72 2d 3e  ISTER && pExpr->
0670: 70 54 61 62 21 3d 30 20 68 61 70 70 65 6e 73 20  pTab!=0 happens 
0680: 77 68 65 6e 20 70 45 78 70 72 20 77 61 73 20 6f  when pExpr was o
0690: 72 69 67 69 6e 61 6c 6c 79 0a 20 20 20 20 2a 2a  riginally.    **
06a0: 20 61 20 54 4b 5f 43 4f 4c 55 4d 4e 20 62 75 74   a TK_COLUMN but
06b0: 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20   was previously 
06c0: 65 76 61 6c 75 61 74 65 64 20 61 6e 64 20 63 61  evaluated and ca
06d0: 63 68 65 64 20 69 6e 20 61 20 72 65 67 69 73 74  ched in a regist
06e0: 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6a 20  er */.    int j 
06f0: 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  = pExpr->iColumn
0700: 3b 0a 20 20 20 20 69 66 28 20 6a 3c 30 20 29 20  ;.    if( j<0 ) 
0710: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46  return SQLITE_AF
0720: 46 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 61  F_INTEGER;.    a
0730: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 54  ssert( pExpr->pT
0740: 61 62 20 26 26 20 6a 3c 70 45 78 70 72 2d 3e 70  ab && j<pExpr->p
0750: 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20  Tab->nCol );.   
0760: 20 72 65 74 75 72 6e 20 70 45 78 70 72 2d 3e 70   return pExpr->p
0770: 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 61 66 66  Tab->aCol[j].aff
0780: 69 6e 69 74 79 3b 0a 20 20 7d 0a 20 20 72 65 74  inity;.  }.  ret
0790: 75 72 6e 20 70 45 78 70 72 2d 3e 61 66 66 69 6e  urn pExpr->affin
07a0: 69 74 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  ity;.}../*.** Se
07b0: 74 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20  t the collating 
07c0: 73 65 71 75 65 6e 63 65 20 66 6f 72 20 65 78 70  sequence for exp
07d0: 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20 74 6f  ression pExpr to
07e0: 20 62 65 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e   be the collatin
07f0: 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65 20 6e 61  g.** sequence na
0800: 6d 65 64 20 62 79 20 70 54 6f 6b 65 6e 2e 20 20  med by pToken.  
0810: 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
0820: 72 20 74 6f 20 61 20 6e 65 77 20 45 78 70 72 20  r to a new Expr 
0830: 6e 6f 64 65 20 74 68 61 74 0a 2a 2a 20 69 6d 70  node that.** imp
0840: 6c 65 6d 65 6e 74 73 20 74 68 65 20 43 4f 4c 4c  lements the COLL
0850: 41 54 45 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a  ATE operator..**
0860: 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79 20  .** If a memory 
0870: 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72  allocation error
0880: 20 6f 63 63 75 72 73 2c 20 74 68 61 74 20 66 61   occurs, that fa
0890: 63 74 20 69 73 20 72 65 63 6f 72 64 65 64 20 69  ct is recorded i
08a0: 6e 20 70 50 61 72 73 65 2d 3e 64 62 0a 2a 2a 20  n pParse->db.** 
08b0: 61 6e 64 20 74 68 65 20 70 45 78 70 72 20 70 61  and the pExpr pa
08c0: 72 61 6d 65 74 65 72 20 69 73 20 72 65 74 75 72  rameter is retur
08d0: 6e 65 64 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a  ned unchanged..*
08e0: 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45  /.Expr *sqlite3E
08f0: 78 70 72 41 64 64 43 6f 6c 6c 61 74 65 54 6f 6b  xprAddCollateTok
0900: 65 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  en(.  Parse *pPa
0910: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f  rse,           /
0920: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
0930: 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78  t */.  Expr *pEx
0940: 70 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  pr,             
0950: 2f 2a 20 41 64 64 20 74 68 65 20 22 43 4f 4c 4c  /* Add the "COLL
0960: 41 54 45 22 20 63 6c 61 75 73 65 20 74 6f 20 74  ATE" clause to t
0970: 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20 2a  his expression *
0980: 2f 0a 20 20 63 6f 6e 73 74 20 54 6f 6b 65 6e 20  /.  const Token 
0990: 2a 70 43 6f 6c 6c 4e 61 6d 65 20 20 20 2f 2a 20  *pCollName   /* 
09a0: 4e 61 6d 65 20 6f 66 20 63 6f 6c 6c 61 74 69 6e  Name of collatin
09b0: 67 20 73 65 71 75 65 6e 63 65 20 2a 2f 0a 29 7b  g sequence */.){
09c0: 0a 20 20 69 66 28 20 70 43 6f 6c 6c 4e 61 6d 65  .  if( pCollName
09d0: 2d 3e 6e 3e 30 20 29 7b 0a 20 20 20 20 45 78 70  ->n>0 ){.    Exp
09e0: 72 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  r *pNew = sqlite
09f0: 33 45 78 70 72 41 6c 6c 6f 63 28 70 50 61 72 73  3ExprAlloc(pPars
0a00: 65 2d 3e 64 62 2c 20 54 4b 5f 43 4f 4c 4c 41 54  e->db, TK_COLLAT
0a10: 45 2c 20 70 43 6f 6c 6c 4e 61 6d 65 2c 20 31 29  E, pCollName, 1)
0a20: 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 20 29  ;.    if( pNew )
0a30: 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 4c  {.      pNew->pL
0a40: 65 66 74 20 3d 20 70 45 78 70 72 3b 0a 20 20 20  eft = pExpr;.   
0a50: 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c     pNew->flags |
0a60: 3d 20 45 50 5f 43 6f 6c 6c 61 74 65 7c 45 50 5f  = EP_Collate|EP_
0a70: 53 6b 69 70 3b 0a 20 20 20 20 20 20 70 45 78 70  Skip;.      pExp
0a80: 72 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 7d 0a  r = pNew;.    }.
0a90: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 45 78    }.  return pEx
0aa0: 70 72 3b 0a 7d 0a 45 78 70 72 20 2a 73 71 6c 69  pr;.}.Expr *sqli
0ab0: 74 65 33 45 78 70 72 41 64 64 43 6f 6c 6c 61 74  te3ExprAddCollat
0ac0: 65 53 74 72 69 6e 67 28 50 61 72 73 65 20 2a 70  eString(Parse *p
0ad0: 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
0ae0: 70 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  pr, const char *
0af0: 7a 43 29 7b 0a 20 20 54 6f 6b 65 6e 20 73 3b 0a  zC){.  Token s;.
0b00: 20 20 61 73 73 65 72 74 28 20 7a 43 21 3d 30 20    assert( zC!=0 
0b10: 29 3b 0a 20 20 73 2e 7a 20 3d 20 7a 43 3b 0a 20  );.  s.z = zC;. 
0b20: 20 73 2e 6e 20 3d 20 73 71 6c 69 74 65 33 53 74   s.n = sqlite3St
0b30: 72 6c 65 6e 33 30 28 73 2e 7a 29 3b 0a 20 20 72  rlen30(s.z);.  r
0b40: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70  eturn sqlite3Exp
0b50: 72 41 64 64 43 6f 6c 6c 61 74 65 54 6f 6b 65 6e  rAddCollateToken
0b60: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
0b70: 26 73 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6b  &s);.}../*.** Sk
0b80: 69 70 20 6f 76 65 72 20 61 6e 79 20 54 4b 5f 43  ip over any TK_C
0b90: 4f 4c 4c 41 54 45 20 6f 72 20 54 4b 5f 41 53 20  OLLATE or TK_AS 
0ba0: 6f 70 65 72 61 74 6f 72 73 20 61 6e 64 20 61 6e  operators and an
0bb0: 79 20 75 6e 6c 69 6b 65 6c 79 28 29 0a 2a 2a 20  y unlikely().** 
0bc0: 6f 72 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 29 20  or likelihood() 
0bd0: 66 75 6e 63 74 69 6f 6e 20 61 74 20 74 68 65 20  function at the 
0be0: 72 6f 6f 74 20 6f 66 20 61 6e 20 65 78 70 72 65  root of an expre
0bf0: 73 73 69 6f 6e 2e 0a 2a 2f 0a 45 78 70 72 20 2a  ssion..*/.Expr *
0c00: 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43  sqlite3ExprSkipC
0c10: 6f 6c 6c 61 74 65 28 45 78 70 72 20 2a 70 45 78  ollate(Expr *pEx
0c20: 70 72 29 7b 0a 20 20 77 68 69 6c 65 28 20 70 45  pr){.  while( pE
0c30: 78 70 72 20 26 26 20 45 78 70 72 48 61 73 50 72  xpr && ExprHasPr
0c40: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
0c50: 5f 53 6b 69 70 29 20 29 7b 0a 20 20 20 20 69 66  _Skip) ){.    if
0c60: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
0c70: 79 28 70 45 78 70 72 2c 20 45 50 5f 55 6e 6c 69  y(pExpr, EP_Unli
0c80: 6b 65 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 61  kely) ){.      a
0c90: 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
0ca0: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
0cb0: 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a  P_xIsSelect) );.
0cc0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
0cd0: 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45  xpr->x.pList->nE
0ce0: 78 70 72 3e 30 20 29 3b 0a 20 20 20 20 20 20 61  xpr>0 );.      a
0cf0: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
0d00: 3d 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 29 3b  ==TK_FUNCTION );
0d10: 0a 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 70  .      pExpr = p
0d20: 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61  Expr->x.pList->a
0d30: 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 7d  [0].pExpr;.    }
0d40: 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
0d50: 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  rt( pExpr->op==T
0d60: 4b 5f 43 4f 4c 4c 41 54 45 20 7c 7c 20 70 45 78  K_COLLATE || pEx
0d70: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 53 20 29 3b  pr->op==TK_AS );
0d80: 0a 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 70  .      pExpr = p
0d90: 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20  Expr->pLeft;.   
0da0: 20 7d 0a 20 20 7d 20 20 20 0a 20 20 72 65 74 75   }.  }   .  retu
0db0: 72 6e 20 70 45 78 70 72 3b 0a 7d 0a 0a 2f 2a 0a  rn pExpr;.}../*.
0dc0: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 6f  ** Return the co
0dd0: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
0de0: 20 66 6f 72 20 74 68 65 20 65 78 70 72 65 73 73   for the express
0df0: 69 6f 6e 20 70 45 78 70 72 2e 20 49 66 0a 2a 2a  ion pExpr. If.**
0e00: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 64 65 66   there is no def
0e10: 69 6e 65 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73  ined collating s
0e20: 65 71 75 65 6e 63 65 2c 20 72 65 74 75 72 6e 20  equence, return 
0e30: 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  NULL..**.** The 
0e40: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
0e50: 63 65 20 6d 69 67 68 74 20 62 65 20 64 65 74 65  ce might be dete
0e60: 72 6d 69 6e 65 64 20 62 79 20 61 20 43 4f 4c 4c  rmined by a COLL
0e70: 41 54 45 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20  ATE operator.** 
0e80: 6f 72 20 62 79 20 74 68 65 20 70 72 65 73 65 6e  or by the presen
0e90: 63 65 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20 77  ce of a column w
0ea0: 69 74 68 20 61 20 64 65 66 69 6e 65 64 20 63 6f  ith a defined co
0eb0: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
0ec0: 2e 0a 2a 2a 20 43 4f 4c 4c 41 54 45 20 6f 70 65  ..** COLLATE ope
0ed0: 72 61 74 6f 72 73 20 74 61 6b 65 20 66 69 72 73  rators take firs
0ee0: 74 20 70 72 65 63 65 64 65 6e 63 65 2e 20 20 4c  t precedence.  L
0ef0: 65 66 74 20 6f 70 65 72 61 6e 64 73 20 74 61 6b  eft operands tak
0f00: 65 0a 2a 2a 20 70 72 65 63 65 64 65 6e 63 65 20  e.** precedence 
0f10: 6f 76 65 72 20 72 69 67 68 74 20 6f 70 65 72 61  over right opera
0f20: 6e 64 73 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20  nds..*/.CollSeq 
0f30: 2a 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c  *sqlite3ExprColl
0f40: 53 65 71 28 50 61 72 73 65 20 2a 70 50 61 72 73  Seq(Parse *pPars
0f50: 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  e, Expr *pExpr){
0f60: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
0f70: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 43   pParse->db;.  C
0f80: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20  ollSeq *pColl = 
0f90: 30 3b 0a 20 20 45 78 70 72 20 2a 70 20 3d 20 70  0;.  Expr *p = p
0fa0: 45 78 70 72 3b 0a 20 20 77 68 69 6c 65 28 20 70  Expr;.  while( p
0fb0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 6f 70 20 3d   ){.    int op =
0fc0: 20 70 2d 3e 6f 70 3b 0a 20 20 20 20 69 66 28 20   p->op;.    if( 
0fd0: 70 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 47 65  p->flags & EP_Ge
0fe0: 6e 65 72 69 63 20 29 20 62 72 65 61 6b 3b 0a 20  neric ) break;. 
0ff0: 20 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 43 41     if( op==TK_CA
1000: 53 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 50 4c  ST || op==TK_UPL
1010: 55 53 20 29 7b 0a 20 20 20 20 20 20 70 20 3d 20  US ){.      p = 
1020: 70 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20  p->pLeft;.      
1030: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a  continue;.    }.
1040: 20 20 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 43      if( op==TK_C
1050: 4f 4c 4c 41 54 45 20 7c 7c 20 28 6f 70 3d 3d 54  OLLATE || (op==T
1060: 4b 5f 52 45 47 49 53 54 45 52 20 26 26 20 70 2d  K_REGISTER && p-
1070: 3e 6f 70 32 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45  >op2==TK_COLLATE
1080: 29 20 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c 6c  ) ){.      pColl
1090: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 43 6f 6c   = sqlite3GetCol
10a0: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 45 4e 43  lSeq(pParse, ENC
10b0: 28 64 62 29 2c 20 30 2c 20 70 2d 3e 75 2e 7a 54  (db), 0, p->u.zT
10c0: 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 62 72 65  oken);.      bre
10d0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ak;.    }.    if
10e0: 28 20 70 2d 3e 70 54 61 62 21 3d 30 0a 20 20 20  ( p->pTab!=0.   
10f0: 20 20 26 26 20 28 6f 70 3d 3d 54 4b 5f 41 47 47    && (op==TK_AGG
1100: 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 6f 70 3d 3d 54  _COLUMN || op==T
1110: 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20 20 20 20 20  K_COLUMN.       
1120: 20 20 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 52 45 47     || op==TK_REG
1130: 49 53 54 45 52 20 7c 7c 20 6f 70 3d 3d 54 4b 5f  ISTER || op==TK_
1140: 54 52 49 47 47 45 52 29 0a 20 20 20 20 29 7b 0a  TRIGGER).    ){.
1150: 20 20 20 20 20 20 2f 2a 20 6f 70 3d 3d 54 4b 5f        /* op==TK_
1160: 52 45 47 49 53 54 45 52 20 26 26 20 70 2d 3e 70  REGISTER && p->p
1170: 54 61 62 21 3d 30 20 68 61 70 70 65 6e 73 20 77  Tab!=0 happens w
1180: 68 65 6e 20 70 45 78 70 72 20 77 61 73 20 6f 72  hen pExpr was or
1190: 69 67 69 6e 61 6c 6c 79 0a 20 20 20 20 20 20 2a  iginally.      *
11a0: 2a 20 61 20 54 4b 5f 43 4f 4c 55 4d 4e 20 62 75  * a TK_COLUMN bu
11b0: 74 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79  t was previously
11c0: 20 65 76 61 6c 75 61 74 65 64 20 61 6e 64 20 63   evaluated and c
11d0: 61 63 68 65 64 20 69 6e 20 61 20 72 65 67 69 73  ached in a regis
11e0: 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  ter */.      int
11f0: 20 6a 20 3d 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3b   j = p->iColumn;
1200: 0a 20 20 20 20 20 20 69 66 28 20 6a 3e 3d 30 20  .      if( j>=0 
1210: 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  ){.        const
1220: 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70   char *zColl = p
1230: 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e  ->pTab->aCol[j].
1240: 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70  zColl;.        p
1250: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69  Coll = sqlite3Fi
1260: 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 45 4e  ndCollSeq(db, EN
1270: 43 28 64 62 29 2c 20 7a 43 6f 6c 6c 2c 20 30 29  C(db), zColl, 0)
1280: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1290: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
12a0: 20 69 66 28 20 70 2d 3e 66 6c 61 67 73 20 26 20   if( p->flags & 
12b0: 45 50 5f 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20  EP_Collate ){.  
12c0: 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 70      if( ALWAYS(p
12d0: 2d 3e 70 4c 65 66 74 29 20 26 26 20 28 70 2d 3e  ->pLeft) && (p->
12e0: 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20 26 20 45  pLeft->flags & E
12f0: 50 5f 43 6f 6c 6c 61 74 65 29 21 3d 30 20 29 7b  P_Collate)!=0 ){
1300: 0a 20 20 20 20 20 20 20 20 70 20 3d 20 70 2d 3e  .        p = p->
1310: 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 7d 65 6c  pLeft;.      }el
1320: 73 65 7b 0a 20 20 20 20 20 20 20 20 70 20 3d 20  se{.        p = 
1330: 70 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20  p->pRight;.     
1340: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
1350: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1360: 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74  .  }.  if( sqlit
1370: 65 33 43 68 65 63 6b 43 6f 6c 6c 53 65 71 28 70  e3CheckCollSeq(p
1380: 50 61 72 73 65 2c 20 70 43 6f 6c 6c 29 20 29 7b  Parse, pColl) ){
1390: 20 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 30 3b   .    pColl = 0;
13a0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 43  .  }.  return pC
13b0: 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45  oll;.}../*.** pE
13c0: 78 70 72 20 69 73 20 61 6e 20 6f 70 65 72 61 6e  xpr is an operan
13d0: 64 20 6f 66 20 61 20 63 6f 6d 70 61 72 69 73 6f  d of a compariso
13e0: 6e 20 6f 70 65 72 61 74 6f 72 2e 20 20 61 66 66  n operator.  aff
13f0: 32 20 69 73 20 74 68 65 0a 2a 2a 20 74 79 70 65  2 is the.** type
1400: 20 61 66 66 69 6e 69 74 79 20 6f 66 20 74 68 65   affinity of the
1410: 20 6f 74 68 65 72 20 6f 70 65 72 61 6e 64 2e 20   other operand. 
1420: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
1430: 74 75 72 6e 73 20 74 68 65 0a 2a 2a 20 74 79 70  turns the.** typ
1440: 65 20 61 66 66 69 6e 69 74 79 20 74 68 61 74 20  e affinity that 
1450: 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20 66  should be used f
1460: 6f 72 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  or the compariso
1470: 6e 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2f 0a 63  n operator..*/.c
1480: 68 61 72 20 73 71 6c 69 74 65 33 43 6f 6d 70 61  har sqlite3Compa
1490: 72 65 41 66 66 69 6e 69 74 79 28 45 78 70 72 20  reAffinity(Expr 
14a0: 2a 70 45 78 70 72 2c 20 63 68 61 72 20 61 66 66  *pExpr, char aff
14b0: 32 29 7b 0a 20 20 63 68 61 72 20 61 66 66 31 20  2){.  char aff1 
14c0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66  = sqlite3ExprAff
14d0: 69 6e 69 74 79 28 70 45 78 70 72 29 3b 0a 20 20  inity(pExpr);.  
14e0: 69 66 28 20 61 66 66 31 20 26 26 20 61 66 66 32  if( aff1 && aff2
14f0: 20 29 7b 0a 20 20 20 20 2f 2a 20 42 6f 74 68 20   ){.    /* Both 
1500: 73 69 64 65 73 20 6f 66 20 74 68 65 20 63 6f 6d  sides of the com
1510: 70 61 72 69 73 6f 6e 20 61 72 65 20 63 6f 6c 75  parison are colu
1520: 6d 6e 73 2e 20 49 66 20 6f 6e 65 20 68 61 73 20  mns. If one has 
1530: 6e 75 6d 65 72 69 63 0a 20 20 20 20 2a 2a 20 61  numeric.    ** a
1540: 66 66 69 6e 69 74 79 2c 20 75 73 65 20 74 68 61  ffinity, use tha
1550: 74 2e 20 4f 74 68 65 72 77 69 73 65 20 75 73 65  t. Otherwise use
1560: 20 6e 6f 20 61 66 66 69 6e 69 74 79 2e 0a 20 20   no affinity..  
1570: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c    */.    if( sql
1580: 69 74 65 33 49 73 4e 75 6d 65 72 69 63 41 66 66  ite3IsNumericAff
1590: 69 6e 69 74 79 28 61 66 66 31 29 20 7c 7c 20 73  inity(aff1) || s
15a0: 71 6c 69 74 65 33 49 73 4e 75 6d 65 72 69 63 41  qlite3IsNumericA
15b0: 66 66 69 6e 69 74 79 28 61 66 66 32 29 20 29 7b  ffinity(aff2) ){
15c0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
15d0: 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43  LITE_AFF_NUMERIC
15e0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
15f0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1600: 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 7d  _AFF_NONE;.    }
1610: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 61 66  .  }else if( !af
1620: 66 31 20 26 26 20 21 61 66 66 32 20 29 7b 0a 20  f1 && !aff2 ){. 
1630: 20 20 20 2f 2a 20 4e 65 69 74 68 65 72 20 73 69     /* Neither si
1640: 64 65 20 6f 66 20 74 68 65 20 63 6f 6d 70 61 72  de of the compar
1650: 69 73 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e  ison is a column
1660: 2e 20 20 43 6f 6d 70 61 72 65 20 74 68 65 0a 20  .  Compare the. 
1670: 20 20 20 2a 2a 20 72 65 73 75 6c 74 73 20 64 69     ** results di
1680: 72 65 63 74 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20  rectly..    */. 
1690: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
16a0: 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 7d 65 6c  _AFF_NONE;.  }el
16b0: 73 65 7b 0a 20 20 20 20 2f 2a 20 4f 6e 65 20 73  se{.    /* One s
16c0: 69 64 65 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c  ide is a column,
16d0: 20 74 68 65 20 6f 74 68 65 72 20 69 73 20 6e 6f   the other is no
16e0: 74 2e 20 55 73 65 20 74 68 65 20 63 6f 6c 75 6d  t. Use the colum
16f0: 6e 73 20 61 66 66 69 6e 69 74 79 2e 20 2a 2f 0a  ns affinity. */.
1700: 20 20 20 20 61 73 73 65 72 74 28 20 61 66 66 31      assert( aff1
1710: 3d 3d 30 20 7c 7c 20 61 66 66 32 3d 3d 30 20 29  ==0 || aff2==0 )
1720: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 61 66  ;.    return (af
1730: 66 31 20 2b 20 61 66 66 32 29 3b 0a 20 20 7d 0a  f1 + aff2);.  }.
1740: 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72 20 69  }../*.** pExpr i
1750: 73 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f  s a comparison o
1760: 70 65 72 61 74 6f 72 2e 20 20 52 65 74 75 72 6e  perator.  Return
1770: 20 74 68 65 20 74 79 70 65 20 61 66 66 69 6e 69   the type affini
1780: 74 79 20 74 68 61 74 20 73 68 6f 75 6c 64 0a 2a  ty that should.*
1790: 2a 20 62 65 20 61 70 70 6c 69 65 64 20 74 6f 20  * be applied to 
17a0: 62 6f 74 68 20 6f 70 65 72 61 6e 64 73 20 70 72  both operands pr
17b0: 69 6f 72 20 74 6f 20 64 6f 69 6e 67 20 74 68 65  ior to doing the
17c0: 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 0a 2a 2f 0a   comparison..*/.
17d0: 73 74 61 74 69 63 20 63 68 61 72 20 63 6f 6d 70  static char comp
17e0: 61 72 69 73 6f 6e 41 66 66 69 6e 69 74 79 28 45  arisonAffinity(E
17f0: 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 63  xpr *pExpr){.  c
1800: 68 61 72 20 61 66 66 3b 0a 20 20 61 73 73 65 72  har aff;.  asser
1810: 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  t( pExpr->op==TK
1820: 5f 45 51 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70  _EQ || pExpr->op
1830: 3d 3d 54 4b 5f 49 4e 20 7c 7c 20 70 45 78 70 72  ==TK_IN || pExpr
1840: 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54 20 7c 7c 0a 20  ->op==TK_LT ||. 
1850: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
1860: 6f 70 3d 3d 54 4b 5f 47 54 20 7c 7c 20 70 45 78  op==TK_GT || pEx
1870: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 47 45 20 7c 7c  pr->op==TK_GE ||
1880: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c   pExpr->op==TK_L
1890: 45 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 70  E ||.          p
18a0: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4e 45 20  Expr->op==TK_NE 
18b0: 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  || pExpr->op==TK
18c0: 5f 49 53 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70  _IS || pExpr->op
18d0: 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20 20  ==TK_ISNOT );.  
18e0: 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70  assert( pExpr->p
18f0: 4c 65 66 74 20 29 3b 0a 20 20 61 66 66 20 3d 20  Left );.  aff = 
1900: 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e  sqlite3ExprAffin
1910: 69 74 79 28 70 45 78 70 72 2d 3e 70 4c 65 66 74  ity(pExpr->pLeft
1920: 29 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  );.  if( pExpr->
1930: 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20 61 66  pRight ){.    af
1940: 66 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70 61  f = sqlite3Compa
1950: 72 65 41 66 66 69 6e 69 74 79 28 70 45 78 70 72  reAffinity(pExpr
1960: 2d 3e 70 52 69 67 68 74 2c 20 61 66 66 29 3b 0a  ->pRight, aff);.
1970: 20 20 7d 65 6c 73 65 20 69 66 28 20 45 78 70 72    }else if( Expr
1980: 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
1990: 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
19a0: 20 29 7b 0a 20 20 20 20 61 66 66 20 3d 20 73 71   ){.    aff = sq
19b0: 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69  lite3CompareAffi
19c0: 6e 69 74 79 28 70 45 78 70 72 2d 3e 78 2e 70 53  nity(pExpr->x.pS
19d0: 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61  elect->pEList->a
19e0: 5b 30 5d 2e 70 45 78 70 72 2c 20 61 66 66 29 3b  [0].pExpr, aff);
19f0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 61 66  .  }else if( !af
1a00: 66 20 29 7b 0a 20 20 20 20 61 66 66 20 3d 20 53  f ){.    aff = S
1a10: 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a  QLITE_AFF_NONE;.
1a20: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 61 66 66    }.  return aff
1a30: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72  ;.}../*.** pExpr
1a40: 20 69 73 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e   is a comparison
1a50: 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 65 67 2e   expression, eg.
1a60: 20 27 3d 27 2c 20 27 3c 27 2c 20 49 4e 28 2e 2e   '=', '<', IN(..
1a70: 2e 29 20 65 74 63 2e 0a 2a 2a 20 69 64 78 5f 61  .) etc..** idx_a
1a80: 66 66 69 6e 69 74 79 20 69 73 20 74 68 65 20 61  ffinity is the a
1a90: 66 66 69 6e 69 74 79 20 6f 66 20 61 6e 20 69 6e  ffinity of an in
1aa0: 64 65 78 65 64 20 63 6f 6c 75 6d 6e 2e 20 52 65  dexed column. Re
1ab0: 74 75 72 6e 20 74 72 75 65 0a 2a 2a 20 69 66 20  turn true.** if 
1ac0: 74 68 65 20 69 6e 64 65 78 20 77 69 74 68 20 61  the index with a
1ad0: 66 66 69 6e 69 74 79 20 69 64 78 5f 61 66 66 69  ffinity idx_affi
1ae0: 6e 69 74 79 20 6d 61 79 20 62 65 20 75 73 65 64  nity may be used
1af0: 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 0a 2a 2a   to implement.**
1b00: 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20   the comparison 
1b10: 69 6e 20 70 45 78 70 72 2e 0a 2a 2f 0a 69 6e 74  in pExpr..*/.int
1b20: 20 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66 66   sqlite3IndexAff
1b30: 69 6e 69 74 79 4f 6b 28 45 78 70 72 20 2a 70 45  inityOk(Expr *pE
1b40: 78 70 72 2c 20 63 68 61 72 20 69 64 78 5f 61 66  xpr, char idx_af
1b50: 66 69 6e 69 74 79 29 7b 0a 20 20 63 68 61 72 20  finity){.  char 
1b60: 61 66 66 20 3d 20 63 6f 6d 70 61 72 69 73 6f 6e  aff = comparison
1b70: 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 29 3b  Affinity(pExpr);
1b80: 0a 20 20 73 77 69 74 63 68 28 20 61 66 66 20 29  .  switch( aff )
1b90: 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  {.    case SQLIT
1ba0: 45 5f 41 46 46 5f 4e 4f 4e 45 3a 0a 20 20 20 20  E_AFF_NONE:.    
1bb0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
1bc0: 63 61 73 65 20 53 51 4c 49 54 45 5f 41 46 46 5f  case SQLITE_AFF_
1bd0: 54 45 58 54 3a 0a 20 20 20 20 20 20 72 65 74 75  TEXT:.      retu
1be0: 72 6e 20 69 64 78 5f 61 66 66 69 6e 69 74 79 3d  rn idx_affinity=
1bf0: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54  =SQLITE_AFF_TEXT
1c00: 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20  ;.    default:. 
1c10: 20 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69       return sqli
1c20: 74 65 33 49 73 4e 75 6d 65 72 69 63 41 66 66 69  te3IsNumericAffi
1c30: 6e 69 74 79 28 69 64 78 5f 61 66 66 69 6e 69 74  nity(idx_affinit
1c40: 79 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  y);.  }.}../*.**
1c50: 20 52 65 74 75 72 6e 20 74 68 65 20 50 35 20 76   Return the P5 v
1c60: 61 6c 75 65 20 74 68 61 74 20 73 68 6f 75 6c 64  alue that should
1c70: 20 62 65 20 75 73 65 64 20 66 6f 72 20 61 20 62   be used for a b
1c80: 69 6e 61 72 79 20 63 6f 6d 70 61 72 69 73 6f 6e  inary comparison
1c90: 0a 2a 2a 20 6f 70 63 6f 64 65 20 28 4f 50 5f 45  .** opcode (OP_E
1ca0: 71 2c 20 4f 50 5f 47 65 20 65 74 63 2e 29 20 75  q, OP_Ge etc.) u
1cb0: 73 65 64 20 74 6f 20 63 6f 6d 70 61 72 65 20 70  sed to compare p
1cc0: 45 78 70 72 31 20 61 6e 64 20 70 45 78 70 72 32  Expr1 and pExpr2
1cd0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 38 20 62  ..*/.static u8 b
1ce0: 69 6e 61 72 79 43 6f 6d 70 61 72 65 50 35 28 45  inaryCompareP5(E
1cf0: 78 70 72 20 2a 70 45 78 70 72 31 2c 20 45 78 70  xpr *pExpr1, Exp
1d00: 72 20 2a 70 45 78 70 72 32 2c 20 69 6e 74 20 6a  r *pExpr2, int j
1d10: 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 75 38  umpIfNull){.  u8
1d20: 20 61 66 66 20 3d 20 28 63 68 61 72 29 73 71 6c   aff = (char)sql
1d30: 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79  ite3ExprAffinity
1d40: 28 70 45 78 70 72 32 29 3b 0a 20 20 61 66 66 20  (pExpr2);.  aff 
1d50: 3d 20 28 75 38 29 73 71 6c 69 74 65 33 43 6f 6d  = (u8)sqlite3Com
1d60: 70 61 72 65 41 66 66 69 6e 69 74 79 28 70 45 78  pareAffinity(pEx
1d70: 70 72 31 2c 20 61 66 66 29 20 7c 20 28 75 38 29  pr1, aff) | (u8)
1d80: 6a 75 6d 70 49 66 4e 75 6c 6c 3b 0a 20 20 72 65  jumpIfNull;.  re
1d90: 74 75 72 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a  turn aff;.}../*.
1da0: 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
1db0: 74 65 72 20 74 6f 20 74 68 65 20 63 6f 6c 6c 61  ter to the colla
1dc0: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 74 68  tion sequence th
1dd0: 61 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65  at should be use
1de0: 64 20 62 79 0a 2a 2a 20 61 20 62 69 6e 61 72 79  d by.** a binary
1df0: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72   comparison oper
1e00: 61 74 6f 72 20 63 6f 6d 70 61 72 69 6e 67 20 70  ator comparing p
1e10: 4c 65 66 74 20 61 6e 64 20 70 52 69 67 68 74 2e  Left and pRight.
1e20: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 65  .**.** If the le
1e30: 66 74 20 68 61 6e 64 20 65 78 70 72 65 73 73 69  ft hand expressi
1e40: 6f 6e 20 68 61 73 20 61 20 63 6f 6c 6c 61 74 69  on has a collati
1e50: 6e 67 20 73 65 71 75 65 6e 63 65 20 74 79 70 65  ng sequence type
1e60: 2c 20 74 68 65 6e 20 69 74 20 69 73 0a 2a 2a 20  , then it is.** 
1e70: 75 73 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20  used. Otherwise 
1e80: 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  the collation se
1e90: 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20 72  quence for the r
1ea0: 69 67 68 74 20 68 61 6e 64 20 65 78 70 72 65 73  ight hand expres
1eb0: 73 69 6f 6e 0a 2a 2a 20 69 73 20 75 73 65 64 2c  sion.** is used,
1ec0: 20 6f 72 20 74 68 65 20 64 65 66 61 75 6c 74 20   or the default 
1ed0: 28 42 49 4e 41 52 59 29 20 69 66 20 6e 65 69 74  (BINARY) if neit
1ee0: 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e 20 68  her expression h
1ef0: 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a  as a collating.*
1f00: 2a 20 74 79 70 65 2e 0a 2a 2a 0a 2a 2a 20 41 72  * type..**.** Ar
1f10: 67 75 6d 65 6e 74 20 70 52 69 67 68 74 20 28 62  gument pRight (b
1f20: 75 74 20 6e 6f 74 20 70 4c 65 66 74 29 20 6d 61  ut not pLeft) ma
1f30: 79 20 62 65 20 61 20 6e 75 6c 6c 20 70 6f 69 6e  y be a null poin
1f40: 74 65 72 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ter. In this cas
1f50: 65 2c 0a 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20  e,.** it is not 
1f60: 63 6f 6e 73 69 64 65 72 65 64 2e 0a 2a 2f 0a 43  considered..*/.C
1f70: 6f 6c 6c 53 65 71 20 2a 73 71 6c 69 74 65 33 42  ollSeq *sqlite3B
1f80: 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c  inaryCompareColl
1f90: 53 65 71 28 0a 20 20 50 61 72 73 65 20 2a 70 50  Seq(.  Parse *pP
1fa0: 61 72 73 65 2c 20 0a 20 20 45 78 70 72 20 2a 70  arse, .  Expr *p
1fb0: 4c 65 66 74 2c 20 0a 20 20 45 78 70 72 20 2a 70  Left, .  Expr *p
1fc0: 52 69 67 68 74 0a 29 7b 0a 20 20 43 6f 6c 6c 53  Right.){.  CollS
1fd0: 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 61 73 73  eq *pColl;.  ass
1fe0: 65 72 74 28 20 70 4c 65 66 74 20 29 3b 0a 20 20  ert( pLeft );.  
1ff0: 69 66 28 20 70 4c 65 66 74 2d 3e 66 6c 61 67 73  if( pLeft->flags
2000: 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 20 29 7b   & EP_Collate ){
2010: 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c  .    pColl = sql
2020: 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
2030: 70 50 61 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a  pParse, pLeft);.
2040: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 52 69 67    }else if( pRig
2050: 68 74 20 26 26 20 28 70 52 69 67 68 74 2d 3e 66  ht && (pRight->f
2060: 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74  lags & EP_Collat
2070: 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 70 43 6f  e)!=0 ){.    pCo
2080: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
2090: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
20a0: 70 52 69 67 68 74 29 3b 0a 20 20 7d 65 6c 73 65  pRight);.  }else
20b0: 7b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71  {.    pColl = sq
20c0: 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
20d0: 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 29 3b  (pParse, pLeft);
20e0: 0a 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20  .    if( !pColl 
20f0: 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d  ){.      pColl =
2100: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
2110: 53 65 71 28 70 50 61 72 73 65 2c 20 70 52 69 67  Seq(pParse, pRig
2120: 68 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ht);.    }.  }. 
2130: 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d   return pColl;.}
2140: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
2150: 20 63 6f 64 65 20 66 6f 72 20 61 20 63 6f 6d 70   code for a comp
2160: 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e  arison operator.
2170: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
2180: 6f 64 65 43 6f 6d 70 61 72 65 28 0a 20 20 50 61  odeCompare(.  Pa
2190: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
21a0: 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 28  /* The parsing (
21b0: 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74  and code generat
21c0: 69 6e 67 29 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  ing) context */.
21d0: 20 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 20    Expr *pLeft,  
21e0: 20 20 20 20 2f 2a 20 54 68 65 20 6c 65 66 74 20      /* The left 
21f0: 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 45 78 70  operand */.  Exp
2200: 72 20 2a 70 52 69 67 68 74 2c 20 20 20 20 20 2f  r *pRight,     /
2210: 2a 20 54 68 65 20 72 69 67 68 74 20 6f 70 65 72  * The right oper
2220: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 63  and */.  int opc
2230: 6f 64 65 2c 20 20 20 20 20 20 20 2f 2a 20 54 68  ode,       /* Th
2240: 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 63  e comparison opc
2250: 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 31  ode */.  int in1
2260: 2c 20 69 6e 74 20 69 6e 32 2c 20 2f 2a 20 52 65  , int in2, /* Re
2270: 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 6f  gister holding o
2280: 70 65 72 61 6e 64 73 20 2a 2f 0a 20 20 69 6e 74  perands */.  int
2290: 20 64 65 73 74 2c 20 20 20 20 20 20 20 20 20 2f   dest,         /
22a0: 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 74  * Jump here if t
22b0: 72 75 65 2e 20 20 2a 2f 0a 20 20 69 6e 74 20 6a  rue.  */.  int j
22c0: 75 6d 70 49 66 4e 75 6c 6c 20 20 20 20 2f 2a 20  umpIfNull    /* 
22d0: 49 66 20 74 72 75 65 2c 20 6a 75 6d 70 20 69 66  If true, jump if
22e0: 20 65 69 74 68 65 72 20 6f 70 65 72 61 6e 64 20   either operand 
22f0: 69 73 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20  is NULL */.){.  
2300: 69 6e 74 20 70 35 3b 0a 20 20 69 6e 74 20 61 64  int p5;.  int ad
2310: 64 72 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70  dr;.  CollSeq *p
2320: 34 3b 0a 0a 20 20 70 34 20 3d 20 73 71 6c 69 74  4;..  p4 = sqlit
2330: 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43  e3BinaryCompareC
2340: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
2350: 4c 65 66 74 2c 20 70 52 69 67 68 74 29 3b 0a 20  Left, pRight);. 
2360: 20 70 35 20 3d 20 62 69 6e 61 72 79 43 6f 6d 70   p5 = binaryComp
2370: 61 72 65 50 35 28 70 4c 65 66 74 2c 20 70 52 69  areP5(pLeft, pRi
2380: 67 68 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  ght, jumpIfNull)
2390: 3b 0a 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74  ;.  addr = sqlit
23a0: 65 33 56 64 62 65 41 64 64 4f 70 34 28 70 50 61  e3VdbeAddOp4(pPa
23b0: 72 73 65 2d 3e 70 56 64 62 65 2c 20 6f 70 63 6f  rse->pVdbe, opco
23c0: 64 65 2c 20 69 6e 32 2c 20 64 65 73 74 2c 20 69  de, in2, dest, i
23d0: 6e 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n1,.            
23e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
23f0: 76 6f 69 64 2a 29 70 34 2c 20 50 34 5f 43 4f 4c  void*)p4, P4_COL
2400: 4c 53 45 51 29 3b 0a 20 20 73 71 6c 69 74 65 33  LSEQ);.  sqlite3
2410: 56 64 62 65 43 68 61 6e 67 65 50 35 28 70 50 61  VdbeChangeP5(pPa
2420: 72 73 65 2d 3e 70 56 64 62 65 2c 20 28 75 38 29  rse->pVdbe, (u8)
2430: 70 35 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 64  p5);.  return ad
2440: 64 72 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54  dr;.}..#if SQLIT
2450: 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48  E_MAX_EXPR_DEPTH
2460: 3e 30 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74  >0./*.** Check t
2470: 68 61 74 20 61 72 67 75 6d 65 6e 74 20 6e 48 65  hat argument nHe
2480: 69 67 68 74 20 69 73 20 6c 65 73 73 20 74 68 61  ight is less tha
2490: 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68  n or equal to th
24a0: 65 20 6d 61 78 69 6d 75 6d 0a 2a 2a 20 65 78 70  e maximum.** exp
24b0: 72 65 73 73 69 6f 6e 20 64 65 70 74 68 20 61 6c  ression depth al
24c0: 6c 6f 77 65 64 2e 20 49 66 20 69 74 20 69 73 20  lowed. If it is 
24d0: 6e 6f 74 2c 20 6c 65 61 76 65 20 61 6e 20 65 72  not, leave an er
24e0: 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 0a 2a  ror message in.*
24f0: 2a 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 69 6e 74  * pParse..*/.int
2500: 20 73 71 6c 69 74 65 33 45 78 70 72 43 68 65 63   sqlite3ExprChec
2510: 6b 48 65 69 67 68 74 28 50 61 72 73 65 20 2a 70  kHeight(Parse *p
2520: 50 61 72 73 65 2c 20 69 6e 74 20 6e 48 65 69 67  Parse, int nHeig
2530: 68 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ht){.  int rc = 
2540: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74  SQLITE_OK;.  int
2550: 20 6d 78 48 65 69 67 68 74 20 3d 20 70 50 61 72   mxHeight = pPar
2560: 73 65 2d 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53  se->db->aLimit[S
2570: 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 45 58 50 52  QLITE_LIMIT_EXPR
2580: 5f 44 45 50 54 48 5d 3b 0a 20 20 69 66 28 20 6e  _DEPTH];.  if( n
2590: 48 65 69 67 68 74 3e 6d 78 48 65 69 67 68 74 20  Height>mxHeight 
25a0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
25b0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a  rorMsg(pParse, .
25c0: 20 20 20 20 20 20 20 22 45 78 70 72 65 73 73 69         "Expressi
25d0: 6f 6e 20 74 72 65 65 20 69 73 20 74 6f 6f 20 6c  on tree is too l
25e0: 61 72 67 65 20 28 6d 61 78 69 6d 75 6d 20 64 65  arge (maximum de
25f0: 70 74 68 20 25 64 29 22 2c 20 6d 78 48 65 69 67  pth %d)", mxHeig
2600: 68 74 0a 20 20 20 20 29 3b 0a 20 20 20 20 72 63  ht.    );.    rc
2610: 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
2620: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
2630: 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 66 6f 6c 6c  ;.}../* The foll
2640: 6f 77 69 6e 67 20 74 68 72 65 65 20 66 75 6e 63  owing three func
2650: 74 69 6f 6e 73 2c 20 68 65 69 67 68 74 4f 66 45  tions, heightOfE
2660: 78 70 72 28 29 2c 20 68 65 69 67 68 74 4f 66 45  xpr(), heightOfE
2670: 78 70 72 4c 69 73 74 28 29 0a 2a 2a 20 61 6e 64  xprList().** and
2680: 20 68 65 69 67 68 74 4f 66 53 65 6c 65 63 74 28   heightOfSelect(
2690: 29 2c 20 61 72 65 20 75 73 65 64 20 74 6f 20 64  ), are used to d
26a0: 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6d 61 78  etermine the max
26b0: 69 6d 75 6d 20 68 65 69 67 68 74 0a 2a 2a 20 6f  imum height.** o
26c0: 66 20 61 6e 79 20 65 78 70 72 65 73 73 69 6f 6e  f any expression
26d0: 20 74 72 65 65 20 72 65 66 65 72 65 6e 63 65 64   tree referenced
26e0: 20 62 79 20 74 68 65 20 73 74 72 75 63 74 75 72   by the structur
26f0: 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65 0a  e passed as the.
2700: 2a 2a 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  ** first argumen
2710: 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73  t..**.** If this
2720: 20 6d 61 78 69 6d 75 6d 20 68 65 69 67 68 74 20   maximum height 
2730: 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
2740: 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75  the current valu
2750: 65 20 70 6f 69 6e 74 65 64 0a 2a 2a 20 74 6f 20  e pointed.** to 
2760: 62 79 20 70 6e 48 65 69 67 68 74 2c 20 74 68 65  by pnHeight, the
2770: 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65   second paramete
2780: 72 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 6e 48  r, then set *pnH
2790: 65 69 67 68 74 20 74 6f 20 74 68 61 74 0a 2a 2a  eight to that.**
27a0: 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69   value..*/.stati
27b0: 63 20 76 6f 69 64 20 68 65 69 67 68 74 4f 66 45  c void heightOfE
27c0: 78 70 72 28 45 78 70 72 20 2a 70 2c 20 69 6e 74  xpr(Expr *p, int
27d0: 20 2a 70 6e 48 65 69 67 68 74 29 7b 0a 20 20 69   *pnHeight){.  i
27e0: 66 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28 20  f( p ){.    if( 
27f0: 70 2d 3e 6e 48 65 69 67 68 74 3e 2a 70 6e 48 65  p->nHeight>*pnHe
2800: 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 2a 70  ight ){.      *p
2810: 6e 48 65 69 67 68 74 20 3d 20 70 2d 3e 6e 48 65  nHeight = p->nHe
2820: 69 67 68 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ight;.    }.  }.
2830: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68 65  }.static void he
2840: 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28 45  ightOfExprList(E
2850: 78 70 72 4c 69 73 74 20 2a 70 2c 20 69 6e 74 20  xprList *p, int 
2860: 2a 70 6e 48 65 69 67 68 74 29 7b 0a 20 20 69 66  *pnHeight){.  if
2870: 28 20 70 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ( p ){.    int i
2880: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
2890: 3c 70 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  <p->nExpr; i++){
28a0: 0a 20 20 20 20 20 20 68 65 69 67 68 74 4f 66 45  .      heightOfE
28b0: 78 70 72 28 70 2d 3e 61 5b 69 5d 2e 70 45 78 70  xpr(p->a[i].pExp
28c0: 72 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20  r, pnHeight);.  
28d0: 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63    }.  }.}.static
28e0: 20 76 6f 69 64 20 68 65 69 67 68 74 4f 66 53 65   void heightOfSe
28f0: 6c 65 63 74 28 53 65 6c 65 63 74 20 2a 70 2c 20  lect(Select *p, 
2900: 69 6e 74 20 2a 70 6e 48 65 69 67 68 74 29 7b 0a  int *pnHeight){.
2910: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 68    if( p ){.    h
2920: 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70  eightOfExpr(p->p
2930: 57 68 65 72 65 2c 20 70 6e 48 65 69 67 68 74 29  Where, pnHeight)
2940: 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78  ;.    heightOfEx
2950: 70 72 28 70 2d 3e 70 48 61 76 69 6e 67 2c 20 70  pr(p->pHaving, p
2960: 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65  nHeight);.    he
2970: 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 4c  ightOfExpr(p->pL
2980: 69 6d 69 74 2c 20 70 6e 48 65 69 67 68 74 29 3b  imit, pnHeight);
2990: 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70  .    heightOfExp
29a0: 72 28 70 2d 3e 70 4f 66 66 73 65 74 2c 20 70 6e  r(p->pOffset, pn
29b0: 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69  Height);.    hei
29c0: 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28 70 2d  ghtOfExprList(p-
29d0: 3e 70 45 4c 69 73 74 2c 20 70 6e 48 65 69 67 68  >pEList, pnHeigh
29e0: 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66  t);.    heightOf
29f0: 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 47 72 6f  ExprList(p->pGro
2a00: 75 70 42 79 2c 20 70 6e 48 65 69 67 68 74 29 3b  upBy, pnHeight);
2a10: 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70  .    heightOfExp
2a20: 72 4c 69 73 74 28 70 2d 3e 70 4f 72 64 65 72 42  rList(p->pOrderB
2a30: 79 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20  y, pnHeight);.  
2a40: 20 20 68 65 69 67 68 74 4f 66 53 65 6c 65 63 74    heightOfSelect
2a50: 28 70 2d 3e 70 50 72 69 6f 72 2c 20 70 6e 48 65  (p->pPrior, pnHe
2a60: 69 67 68 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ight);.  }.}../*
2a70: 0a 2a 2a 20 53 65 74 20 74 68 65 20 45 78 70 72  .** Set the Expr
2a80: 2e 6e 48 65 69 67 68 74 20 76 61 72 69 61 62 6c  .nHeight variabl
2a90: 65 20 69 6e 20 74 68 65 20 73 74 72 75 63 74 75  e in the structu
2aa0: 72 65 20 70 61 73 73 65 64 20 61 73 20 61 6e 20  re passed as an 
2ab0: 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 20 41 6e  .** argument. An
2ac0: 20 65 78 70 72 65 73 73 69 6f 6e 20 77 69 74 68   expression with
2ad0: 20 6e 6f 20 63 68 69 6c 64 72 65 6e 2c 20 45 78   no children, Ex
2ae0: 70 72 2e 70 4c 69 73 74 20 6f 72 20 0a 2a 2a 20  pr.pList or .** 
2af0: 45 78 70 72 2e 70 53 65 6c 65 63 74 20 6d 65 6d  Expr.pSelect mem
2b00: 62 65 72 20 68 61 73 20 61 20 68 65 69 67 68 74  ber has a height
2b10: 20 6f 66 20 31 2e 20 41 6e 79 20 6f 74 68 65 72   of 1. Any other
2b20: 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 68   expression.** h
2b30: 61 73 20 61 20 68 65 69 67 68 74 20 65 71 75 61  as a height equa
2b40: 6c 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d  l to the maximum
2b50: 20 68 65 69 67 68 74 20 6f 66 20 61 6e 79 20 6f   height of any o
2b60: 74 68 65 72 20 0a 2a 2a 20 72 65 66 65 72 65 6e  ther .** referen
2b70: 63 65 64 20 45 78 70 72 20 70 6c 75 73 20 6f 6e  ced Expr plus on
2b80: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
2b90: 64 20 65 78 70 72 53 65 74 48 65 69 67 68 74 28  d exprSetHeight(
2ba0: 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20  Expr *p){.  int 
2bb0: 6e 48 65 69 67 68 74 20 3d 20 30 3b 0a 20 20 68  nHeight = 0;.  h
2bc0: 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70  eightOfExpr(p->p
2bd0: 4c 65 66 74 2c 20 26 6e 48 65 69 67 68 74 29 3b  Left, &nHeight);
2be0: 0a 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 28  .  heightOfExpr(
2bf0: 70 2d 3e 70 52 69 67 68 74 2c 20 26 6e 48 65 69  p->pRight, &nHei
2c00: 67 68 74 29 3b 0a 20 20 69 66 28 20 45 78 70 72  ght);.  if( Expr
2c10: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
2c20: 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a  P_xIsSelect) ){.
2c30: 20 20 20 20 68 65 69 67 68 74 4f 66 53 65 6c 65      heightOfSele
2c40: 63 74 28 70 2d 3e 78 2e 70 53 65 6c 65 63 74 2c  ct(p->x.pSelect,
2c50: 20 26 6e 48 65 69 67 68 74 29 3b 0a 20 20 7d 65   &nHeight);.  }e
2c60: 6c 73 65 7b 0a 20 20 20 20 68 65 69 67 68 74 4f  lse{.    heightO
2c70: 66 45 78 70 72 4c 69 73 74 28 70 2d 3e 78 2e 70  fExprList(p->x.p
2c80: 4c 69 73 74 2c 20 26 6e 48 65 69 67 68 74 29 3b  List, &nHeight);
2c90: 0a 20 20 7d 0a 20 20 70 2d 3e 6e 48 65 69 67 68  .  }.  p->nHeigh
2ca0: 74 20 3d 20 6e 48 65 69 67 68 74 20 2b 20 31 3b  t = nHeight + 1;
2cb0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
2cc0: 65 20 45 78 70 72 2e 6e 48 65 69 67 68 74 20 76  e Expr.nHeight v
2cd0: 61 72 69 61 62 6c 65 20 75 73 69 6e 67 20 74 68  ariable using th
2ce0: 65 20 65 78 70 72 53 65 74 48 65 69 67 68 74 28  e exprSetHeight(
2cf0: 29 20 66 75 6e 63 74 69 6f 6e 2e 20 49 66 0a 2a  ) function. If.*
2d00: 2a 20 74 68 65 20 68 65 69 67 68 74 20 69 73 20  * the height is 
2d10: 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65  greater than the
2d20: 20 6d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64   maximum allowed
2d30: 20 65 78 70 72 65 73 73 69 6f 6e 20 64 65 70 74   expression dept
2d40: 68 2c 0a 2a 2a 20 6c 65 61 76 65 20 61 6e 20 65  h,.** leave an e
2d50: 72 72 6f 72 20 69 6e 20 70 50 61 72 73 65 2e 0a  rror in pParse..
2d60: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
2d70: 78 70 72 53 65 74 48 65 69 67 68 74 28 50 61 72  xprSetHeight(Par
2d80: 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
2d90: 20 2a 70 29 7b 0a 20 20 65 78 70 72 53 65 74 48   *p){.  exprSetH
2da0: 65 69 67 68 74 28 70 29 3b 0a 20 20 73 71 6c 69  eight(p);.  sqli
2db0: 74 65 33 45 78 70 72 43 68 65 63 6b 48 65 69 67  te3ExprCheckHeig
2dc0: 68 74 28 70 50 61 72 73 65 2c 20 70 2d 3e 6e 48  ht(pParse, p->nH
2dd0: 65 69 67 68 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  eight);.}../*.**
2de0: 20 52 65 74 75 72 6e 20 74 68 65 20 6d 61 78 69   Return the maxi
2df0: 6d 75 6d 20 68 65 69 67 68 74 20 6f 66 20 61 6e  mum height of an
2e00: 79 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  y expression tre
2e10: 65 20 72 65 66 65 72 65 6e 63 65 64 0a 2a 2a 20  e referenced.** 
2e20: 62 79 20 74 68 65 20 73 65 6c 65 63 74 20 73 74  by the select st
2e30: 61 74 65 6d 65 6e 74 20 70 61 73 73 65 64 20 61  atement passed a
2e40: 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  s an argument..*
2e50: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 65 6c  /.int sqlite3Sel
2e60: 65 63 74 45 78 70 72 48 65 69 67 68 74 28 53 65  ectExprHeight(Se
2e70: 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69 6e 74 20  lect *p){.  int 
2e80: 6e 48 65 69 67 68 74 20 3d 20 30 3b 0a 20 20 68  nHeight = 0;.  h
2e90: 65 69 67 68 74 4f 66 53 65 6c 65 63 74 28 70 2c  eightOfSelect(p,
2ea0: 20 26 6e 48 65 69 67 68 74 29 3b 0a 20 20 72 65   &nHeight);.  re
2eb0: 74 75 72 6e 20 6e 48 65 69 67 68 74 3b 0a 7d 0a  turn nHeight;.}.
2ec0: 23 65 6c 73 65 0a 20 20 23 64 65 66 69 6e 65 20  #else.  #define 
2ed0: 65 78 70 72 53 65 74 48 65 69 67 68 74 28 79 29  exprSetHeight(y)
2ee0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
2ef0: 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48  E_MAX_EXPR_DEPTH
2f00: 3e 30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  >0 */../*.** Thi
2f10: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65  s routine is the
2f20: 20 63 6f 72 65 20 61 6c 6c 6f 63 61 74 6f 72 20   core allocator 
2f30: 66 6f 72 20 45 78 70 72 20 6e 6f 64 65 73 2e 0a  for Expr nodes..
2f40: 2a 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20  **.** Construct 
2f50: 61 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e  a new expression
2f60: 20 6e 6f 64 65 20 61 6e 64 20 72 65 74 75 72 6e   node and return
2f70: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69 74   a pointer to it
2f80: 2e 20 20 4d 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72  .  Memory.** for
2f90: 20 74 68 69 73 20 6e 6f 64 65 20 61 6e 64 20 66   this node and f
2fa0: 6f 72 20 74 68 65 20 70 54 6f 6b 65 6e 20 61 72  or the pToken ar
2fb0: 67 75 6d 65 6e 74 20 69 73 20 61 20 73 69 6e 67  gument is a sing
2fc0: 6c 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a  le allocation.**
2fd0: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73   obtained from s
2fe0: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 28 29  qlite3DbMalloc()
2ff0: 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66  .  The calling f
3000: 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 72 65  unction.** is re
3010: 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 6d 61  sponsible for ma
3020: 6b 69 6e 67 20 73 75 72 65 20 74 68 65 20 6e 6f  king sure the no
3030: 64 65 20 65 76 65 6e 74 75 61 6c 6c 79 20 67 65  de eventually ge
3040: 74 73 20 66 72 65 65 64 2e 0a 2a 2a 0a 2a 2a 20  ts freed..**.** 
3050: 49 66 20 64 65 71 75 6f 74 65 20 69 73 20 74 72  If dequote is tr
3060: 75 65 2c 20 74 68 65 6e 20 74 68 65 20 74 6f 6b  ue, then the tok
3070: 65 6e 20 28 69 66 20 69 74 20 65 78 69 73 74 73  en (if it exists
3080: 29 20 69 73 20 64 65 71 75 6f 74 65 64 2e 0a 2a  ) is dequoted..*
3090: 2a 20 49 66 20 64 65 71 75 6f 74 65 20 69 73 20  * If dequote is 
30a0: 66 61 6c 73 65 2c 20 6e 6f 20 64 65 71 75 6f 74  false, no dequot
30b0: 69 6e 67 20 69 73 20 70 65 72 66 6f 72 6d 61 6e  ing is performan
30c0: 63 65 2e 20 20 54 68 65 20 64 65 51 75 6f 74 65  ce.  The deQuote
30d0: 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73  .** parameter is
30e0: 20 69 67 6e 6f 72 65 64 20 69 66 20 70 54 6f 6b   ignored if pTok
30f0: 65 6e 20 69 73 20 4e 55 4c 4c 20 6f 72 20 69 66  en is NULL or if
3100: 20 74 68 65 20 74 6f 6b 65 6e 20 64 6f 65 73 20   the token does 
3110: 6e 6f 74 0a 2a 2a 20 61 70 70 65 61 72 20 74 6f  not.** appear to
3120: 20 62 65 20 71 75 6f 74 65 64 2e 20 20 49 66 20   be quoted.  If 
3130: 74 68 65 20 71 75 6f 74 65 73 20 77 65 72 65 20  the quotes were 
3140: 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 2e 2e 2e  of the form "...
3150: 22 20 28 64 6f 75 62 6c 65 2d 71 75 6f 74 65 73  " (double-quotes
3160: 29 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 45 50  ).** then the EP
3170: 5f 44 62 6c 51 75 6f 74 65 64 20 66 6c 61 67 20  _DblQuoted flag 
3180: 69 73 20 73 65 74 20 6f 6e 20 74 68 65 20 65 78  is set on the ex
3190: 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 2e 0a 2a  pression node..*
31a0: 2a 0a 2a 2a 20 53 70 65 63 69 61 6c 20 63 61 73  *.** Special cas
31b0: 65 3a 20 20 49 66 20 6f 70 3d 3d 54 4b 5f 49 4e  e:  If op==TK_IN
31c0: 54 45 47 45 52 20 61 6e 64 20 70 54 6f 6b 65 6e  TEGER and pToken
31d0: 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 73 74 72   points to a str
31e0: 69 6e 67 20 74 68 61 74 0a 2a 2a 20 63 61 6e 20  ing that.** can 
31f0: 62 65 20 74 72 61 6e 73 6c 61 74 65 64 20 69 6e  be translated in
3200: 74 6f 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65  to a 32-bit inte
3210: 67 65 72 2c 20 74 68 65 6e 20 74 68 65 20 74 6f  ger, then the to
3220: 6b 65 6e 20 69 73 20 6e 6f 74 0a 2a 2a 20 73 74  ken is not.** st
3230: 6f 72 65 64 20 69 6e 20 75 2e 7a 54 6f 6b 65 6e  ored in u.zToken
3240: 2e 20 20 49 6e 73 74 65 61 64 2c 20 74 68 65 20  .  Instead, the 
3250: 69 6e 74 65 67 65 72 20 76 61 6c 75 65 73 20 69  integer values i
3260: 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74  s written.** int
3270: 6f 20 75 2e 69 56 61 6c 75 65 20 61 6e 64 20 74  o u.iValue and t
3280: 68 65 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 66  he EP_IntValue f
3290: 6c 61 67 20 69 73 20 73 65 74 2e 20 20 4e 6f 20  lag is set.  No 
32a0: 65 78 74 72 61 20 73 74 6f 72 61 67 65 0a 2a 2a  extra storage.**
32b0: 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 74 6f   is allocated to
32c0: 20 68 6f 6c 64 20 74 68 65 20 69 6e 74 65 67 65   hold the intege
32d0: 72 20 74 65 78 74 20 61 6e 64 20 74 68 65 20 64  r text and the d
32e0: 65 71 75 6f 74 65 20 66 6c 61 67 20 69 73 20 69  equote flag is i
32f0: 67 6e 6f 72 65 64 2e 0a 2a 2f 0a 45 78 70 72 20  gnored..*/.Expr 
3300: 2a 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f  *sqlite3ExprAllo
3310: 63 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  c(.  sqlite3 *db
3320: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
3330: 48 61 6e 64 6c 65 20 66 6f 72 20 73 71 6c 69 74  Handle for sqlit
3340: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 29  e3DbMallocZero()
3350: 20 28 6d 61 79 20 62 65 20 6e 75 6c 6c 29 20 2a   (may be null) *
3360: 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20  /.  int op,     
3370: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
3380: 78 70 72 65 73 73 69 6f 6e 20 6f 70 63 6f 64 65  xpression opcode
3390: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 54 6f 6b 65   */.  const Toke
33a0: 6e 20 2a 70 54 6f 6b 65 6e 2c 20 20 20 20 2f 2a  n *pToken,    /*
33b0: 20 54 6f 6b 65 6e 20 61 72 67 75 6d 65 6e 74 2e   Token argument.
33c0: 20 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20    Might be NULL 
33d0: 2a 2f 0a 20 20 69 6e 74 20 64 65 71 75 6f 74 65  */.  int dequote
33e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
33f0: 54 72 75 65 20 74 6f 20 64 65 71 75 6f 74 65 20  True to dequote 
3400: 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e  */.){.  Expr *pN
3410: 65 77 3b 0a 20 20 69 6e 74 20 6e 45 78 74 72 61  ew;.  int nExtra
3420: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 56 61 6c   = 0;.  int iVal
3430: 75 65 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70  ue = 0;..  if( p
3440: 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 69 66 28  Token ){.    if(
3450: 20 6f 70 21 3d 54 4b 5f 49 4e 54 45 47 45 52 20   op!=TK_INTEGER 
3460: 7c 7c 20 70 54 6f 6b 65 6e 2d 3e 7a 3d 3d 30 0a  || pToken->z==0.
3470: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c            || sql
3480: 69 74 65 33 47 65 74 49 6e 74 33 32 28 70 54 6f  ite3GetInt32(pTo
3490: 6b 65 6e 2d 3e 7a 2c 20 26 69 56 61 6c 75 65 29  ken->z, &iValue)
34a0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 45 78  ==0 ){.      nEx
34b0: 74 72 61 20 3d 20 70 54 6f 6b 65 6e 2d 3e 6e 2b  tra = pToken->n+
34c0: 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  1;.      assert(
34d0: 20 69 56 61 6c 75 65 3e 3d 30 20 29 3b 0a 20 20   iValue>=0 );.  
34e0: 20 20 7d 0a 20 20 7d 0a 20 20 70 4e 65 77 20 3d    }.  }.  pNew =
34f0: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
3500: 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28  Zero(db, sizeof(
3510: 45 78 70 72 29 2b 6e 45 78 74 72 61 29 3b 0a 20  Expr)+nExtra);. 
3520: 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20   if( pNew ){.   
3530: 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 28 75 38 29   pNew->op = (u8)
3540: 6f 70 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69 41  op;.    pNew->iA
3550: 67 67 20 3d 20 2d 31 3b 0a 20 20 20 20 69 66 28  gg = -1;.    if(
3560: 20 70 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 20   pToken ){.     
3570: 20 69 66 28 20 6e 45 78 74 72 61 3d 3d 30 20 29   if( nExtra==0 )
3580: 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  {.        pNew->
3590: 66 6c 61 67 73 20 7c 3d 20 45 50 5f 49 6e 74 56  flags |= EP_IntV
35a0: 61 6c 75 65 3b 0a 20 20 20 20 20 20 20 20 70 4e  alue;.        pN
35b0: 65 77 2d 3e 75 2e 69 56 61 6c 75 65 20 3d 20 69  ew->u.iValue = i
35c0: 56 61 6c 75 65 3b 0a 20 20 20 20 20 20 7d 65 6c  Value;.      }el
35d0: 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  se{.        int 
35e0: 63 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  c;.        pNew-
35f0: 3e 75 2e 7a 54 6f 6b 65 6e 20 3d 20 28 63 68 61  >u.zToken = (cha
3600: 72 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a 20 20 20  r*)&pNew[1];.   
3610: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 6f       assert( pTo
3620: 6b 65 6e 2d 3e 7a 21 3d 30 20 7c 7c 20 70 54 6f  ken->z!=0 || pTo
3630: 6b 65 6e 2d 3e 6e 3d 3d 30 20 29 3b 0a 20 20 20  ken->n==0 );.   
3640: 20 20 20 20 20 69 66 28 20 70 54 6f 6b 65 6e 2d       if( pToken-
3650: 3e 6e 20 29 20 6d 65 6d 63 70 79 28 70 4e 65 77  >n ) memcpy(pNew
3660: 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 70 54 6f 6b  ->u.zToken, pTok
3670: 65 6e 2d 3e 7a 2c 20 70 54 6f 6b 65 6e 2d 3e 6e  en->z, pToken->n
3680: 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  );.        pNew-
3690: 3e 75 2e 7a 54 6f 6b 65 6e 5b 70 54 6f 6b 65 6e  >u.zToken[pToken
36a0: 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  ->n] = 0;.      
36b0: 20 20 69 66 28 20 64 65 71 75 6f 74 65 20 26 26    if( dequote &&
36c0: 20 6e 45 78 74 72 61 3e 3d 33 20 0a 20 20 20 20   nExtra>=3 .    
36d0: 20 20 20 20 20 20 20 20 20 26 26 20 28 28 63 20           && ((c 
36e0: 3d 20 70 54 6f 6b 65 6e 2d 3e 7a 5b 30 5d 29 3d  = pToken->z[0])=
36f0: 3d 27 5c 27 27 20 7c 7c 20 63 3d 3d 27 22 27 20  ='\'' || c=='"' 
3700: 7c 7c 20 63 3d 3d 27 5b 27 20 7c 7c 20 63 3d 3d  || c=='[' || c==
3710: 27 60 27 29 20 29 7b 0a 20 20 20 20 20 20 20 20  '`') ){.        
3720: 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65    sqlite3Dequote
3730: 28 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 29  (pNew->u.zToken)
3740: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
3750: 63 3d 3d 27 22 27 20 29 20 70 4e 65 77 2d 3e 66  c=='"' ) pNew->f
3760: 6c 61 67 73 20 7c 3d 20 45 50 5f 44 62 6c 51 75  lags |= EP_DblQu
3770: 6f 74 65 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a  oted;.        }.
3780: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69        }.    }.#i
3790: 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50  f SQLITE_MAX_EXP
37a0: 52 5f 44 45 50 54 48 3e 30 0a 20 20 20 20 70 4e  R_DEPTH>0.    pN
37b0: 65 77 2d 3e 6e 48 65 69 67 68 74 20 3d 20 31 3b  ew->nHeight = 1;
37c0: 0a 23 65 6e 64 69 66 20 20 0a 20 20 7d 0a 20 20  .#endif  .  }.  
37d0: 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a  return pNew;.}..
37e0: 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61  /*.** Allocate a
37f0: 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20   new expression 
3800: 6e 6f 64 65 20 66 72 6f 6d 20 61 20 7a 65 72 6f  node from a zero
3810: 2d 74 65 72 6d 69 6e 61 74 65 64 20 74 6f 6b 65  -terminated toke
3820: 6e 20 74 68 61 74 20 68 61 73 0a 2a 2a 20 61 6c  n that has.** al
3830: 72 65 61 64 79 20 62 65 65 6e 20 64 65 71 75 6f  ready been dequo
3840: 74 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71  ted..*/.Expr *sq
3850: 6c 69 74 65 33 45 78 70 72 28 0a 20 20 73 71 6c  lite3Expr(.  sql
3860: 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
3870: 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 66       /* Handle f
3880: 6f 72 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c  or sqlite3DbMall
3890: 6f 63 5a 65 72 6f 28 29 20 28 6d 61 79 20 62 65  ocZero() (may be
38a0: 20 6e 75 6c 6c 29 20 2a 2f 0a 20 20 69 6e 74 20   null) */.  int 
38b0: 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  op,             
38c0: 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
38d0: 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 63 6f  n opcode */.  co
38e0: 6e 73 74 20 63 68 61 72 20 2a 7a 54 6f 6b 65 6e  nst char *zToken
38f0: 20 20 20 20 20 20 2f 2a 20 54 6f 6b 65 6e 20 61        /* Token a
3900: 72 67 75 6d 65 6e 74 2e 20 20 4d 69 67 68 74 20  rgument.  Might 
3910: 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20  be NULL */.){.  
3920: 54 6f 6b 65 6e 20 78 3b 0a 20 20 78 2e 7a 20 3d  Token x;.  x.z =
3930: 20 7a 54 6f 6b 65 6e 3b 0a 20 20 78 2e 6e 20 3d   zToken;.  x.n =
3940: 20 7a 54 6f 6b 65 6e 20 3f 20 73 71 6c 69 74 65   zToken ? sqlite
3950: 33 53 74 72 6c 65 6e 33 30 28 7a 54 6f 6b 65 6e  3Strlen30(zToken
3960: 29 20 3a 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  ) : 0;.  return 
3970: 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63  sqlite3ExprAlloc
3980: 28 64 62 2c 20 6f 70 2c 20 26 78 2c 20 30 29 3b  (db, op, &x, 0);
3990: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 61 63 68  .}../*.** Attach
39a0: 20 73 75 62 74 72 65 65 73 20 70 4c 65 66 74 20   subtrees pLeft 
39b0: 61 6e 64 20 70 52 69 67 68 74 20 74 6f 20 74 68  and pRight to th
39c0: 65 20 45 78 70 72 20 6e 6f 64 65 20 70 52 6f 6f  e Expr node pRoo
39d0: 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 52 6f 6f  t..**.** If pRoo
39e0: 74 3d 3d 4e 55 4c 4c 20 74 68 61 74 20 6d 65 61  t==NULL that mea
39f0: 6e 73 20 74 68 61 74 20 61 20 6d 65 6d 6f 72 79  ns that a memory
3a00: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f   allocation erro
3a10: 72 20 68 61 73 20 6f 63 63 75 72 72 65 64 2e 0a  r has occurred..
3a20: 2a 2a 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c  ** In that case,
3a30: 20 64 65 6c 65 74 65 20 74 68 65 20 73 75 62 74   delete the subt
3a40: 72 65 65 73 20 70 4c 65 66 74 20 61 6e 64 20 70  rees pLeft and p
3a50: 52 69 67 68 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  Right..*/.void s
3a60: 71 6c 69 74 65 33 45 78 70 72 41 74 74 61 63 68  qlite3ExprAttach
3a70: 53 75 62 74 72 65 65 73 28 0a 20 20 73 71 6c 69  Subtrees(.  sqli
3a80: 74 65 33 20 2a 64 62 2c 0a 20 20 45 78 70 72 20  te3 *db,.  Expr 
3a90: 2a 70 52 6f 6f 74 2c 0a 20 20 45 78 70 72 20 2a  *pRoot,.  Expr *
3aa0: 70 4c 65 66 74 2c 0a 20 20 45 78 70 72 20 2a 70  pLeft,.  Expr *p
3ab0: 52 69 67 68 74 0a 29 7b 0a 20 20 69 66 28 20 70  Right.){.  if( p
3ac0: 52 6f 6f 74 3d 3d 30 20 29 7b 0a 20 20 20 20 61  Root==0 ){.    a
3ad0: 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f  ssert( db->mallo
3ae0: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 73  cFailed );.    s
3af0: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
3b00: 28 64 62 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20  (db, pLeft);.   
3b10: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
3b20: 74 65 28 64 62 2c 20 70 52 69 67 68 74 29 3b 0a  te(db, pRight);.
3b30: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28    }else{.    if(
3b40: 20 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20   pRight ){.     
3b50: 20 70 52 6f 6f 74 2d 3e 70 52 69 67 68 74 20 3d   pRoot->pRight =
3b60: 20 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 70   pRight;.      p
3b70: 52 6f 6f 74 2d 3e 66 6c 61 67 73 20 7c 3d 20 45  Root->flags |= E
3b80: 50 5f 43 6f 6c 6c 61 74 65 20 26 20 70 52 69 67  P_Collate & pRig
3b90: 68 74 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 7d  ht->flags;.    }
3ba0: 0a 20 20 20 20 69 66 28 20 70 4c 65 66 74 20 29  .    if( pLeft )
3bb0: 7b 0a 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e 70  {.      pRoot->p
3bc0: 4c 65 66 74 20 3d 20 70 4c 65 66 74 3b 0a 20 20  Left = pLeft;.  
3bd0: 20 20 20 20 70 52 6f 6f 74 2d 3e 66 6c 61 67 73      pRoot->flags
3be0: 20 7c 3d 20 45 50 5f 43 6f 6c 6c 61 74 65 20 26   |= EP_Collate &
3bf0: 20 70 4c 65 66 74 2d 3e 66 6c 61 67 73 3b 0a 20   pLeft->flags;. 
3c00: 20 20 20 7d 0a 20 20 20 20 65 78 70 72 53 65 74     }.    exprSet
3c10: 48 65 69 67 68 74 28 70 52 6f 6f 74 29 3b 0a 20  Height(pRoot);. 
3c20: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f   }.}../*.** Allo
3c30: 63 61 74 65 20 61 6e 20 45 78 70 72 20 6e 6f 64  cate an Expr nod
3c40: 65 20 77 68 69 63 68 20 6a 6f 69 6e 73 20 61 73  e which joins as
3c50: 20 6d 61 6e 79 20 61 73 20 74 77 6f 20 73 75 62   many as two sub
3c60: 74 72 65 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 65  trees..**.** One
3c70: 20 6f 72 20 62 6f 74 68 20 6f 66 20 74 68 65 20   or both of the 
3c80: 73 75 62 74 72 65 65 73 20 63 61 6e 20 62 65 20  subtrees can be 
3c90: 4e 55 4c 4c 2e 20 20 52 65 74 75 72 6e 20 61 20  NULL.  Return a 
3ca0: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6e  pointer to the n
3cb0: 65 77 0a 2a 2a 20 45 78 70 72 20 6e 6f 64 65 2e  ew.** Expr node.
3cc0: 20 20 4f 72 2c 20 69 66 20 61 6e 20 4f 4f 4d 20    Or, if an OOM 
3cd0: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 65  error occurs, se
3ce0: 74 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  t pParse->db->ma
3cf0: 6c 6c 6f 63 46 61 69 6c 65 64 2c 0a 2a 2a 20 66  llocFailed,.** f
3d00: 72 65 65 20 74 68 65 20 73 75 62 74 72 65 65 73  ree the subtrees
3d10: 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c   and return NULL
3d20: 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74  ..*/.Expr *sqlit
3d30: 65 33 50 45 78 70 72 28 0a 20 20 50 61 72 73 65  e3PExpr(.  Parse
3d40: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
3d50: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
3d60: 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6f  ntext */.  int o
3d70: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
3d80: 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e     /* Expression
3d90: 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 45 78 70   opcode */.  Exp
3da0: 72 20 2a 70 4c 65 66 74 2c 20 20 20 20 20 20 20  r *pLeft,       
3db0: 20 20 20 20 20 2f 2a 20 4c 65 66 74 20 6f 70 65       /* Left ope
3dc0: 72 61 6e 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a  rand */.  Expr *
3dd0: 70 52 69 67 68 74 2c 20 20 20 20 20 20 20 20 20  pRight,         
3de0: 20 20 2f 2a 20 52 69 67 68 74 20 6f 70 65 72 61    /* Right opera
3df0: 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 54 6f  nd */.  const To
3e00: 6b 65 6e 20 2a 70 54 6f 6b 65 6e 20 20 20 20 20  ken *pToken     
3e10: 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f 6b 65  /* Argument toke
3e20: 6e 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a  n */.){.  Expr *
3e30: 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  p;.  if( op==TK_
3e40: 41 4e 44 20 26 26 20 70 4c 65 66 74 20 26 26 20  AND && pLeft && 
3e50: 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20 2f 2a  pRight ){.    /*
3e60: 20 54 61 6b 65 20 61 64 76 61 6e 74 61 67 65 20   Take advantage 
3e70: 6f 66 20 73 68 6f 72 74 2d 63 69 72 63 75 69 74  of short-circuit
3e80: 20 66 61 6c 73 65 20 6f 70 74 69 6d 69 7a 61 74   false optimizat
3e90: 69 6f 6e 20 66 6f 72 20 41 4e 44 20 2a 2f 0a 20  ion for AND */. 
3ea0: 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 45 78     p = sqlite3Ex
3eb0: 70 72 41 6e 64 28 70 50 61 72 73 65 2d 3e 64 62  prAnd(pParse->db
3ec0: 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 29  , pLeft, pRight)
3ed0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
3ee0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c   = sqlite3ExprAl
3ef0: 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  loc(pParse->db, 
3f00: 6f 70 2c 20 70 54 6f 6b 65 6e 2c 20 31 29 3b 0a  op, pToken, 1);.
3f10: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41      sqlite3ExprA
3f20: 74 74 61 63 68 53 75 62 74 72 65 65 73 28 70 50  ttachSubtrees(pP
3f30: 61 72 73 65 2d 3e 64 62 2c 20 70 2c 20 70 4c 65  arse->db, p, pLe
3f40: 66 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 7d  ft, pRight);.  }
3f50: 0a 20 20 69 66 28 20 70 20 29 20 7b 0a 20 20 20  .  if( p ) {.   
3f60: 20 73 71 6c 69 74 65 33 45 78 70 72 43 68 65 63   sqlite3ExprChec
3f70: 6b 48 65 69 67 68 74 28 70 50 61 72 73 65 2c 20  kHeight(pParse, 
3f80: 70 2d 3e 6e 48 65 69 67 68 74 29 3b 0a 20 20 7d  p->nHeight);.  }
3f90: 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a  .  return p;.}..
3fa0: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70  /*.** If the exp
3fb0: 72 65 73 73 69 6f 6e 20 69 73 20 61 6c 77 61 79  ression is alway
3fc0: 73 20 65 69 74 68 65 72 20 54 52 55 45 20 6f 72  s either TRUE or
3fd0: 20 46 41 4c 53 45 20 28 72 65 73 70 65 63 74 69   FALSE (respecti
3fe0: 76 65 6c 79 29 2c 0a 2a 2a 20 74 68 65 6e 20 72  vely),.** then r
3ff0: 65 74 75 72 6e 20 31 2e 20 20 49 66 20 6f 6e 65  eturn 1.  If one
4000: 20 63 61 6e 6e 6f 74 20 64 65 74 65 72 6d 69 6e   cannot determin
4010: 65 20 74 68 65 20 74 72 75 74 68 20 76 61 6c 75  e the truth valu
4020: 65 20 6f 66 20 74 68 65 0a 2a 2a 20 65 78 70 72  e of the.** expr
4030: 65 73 73 69 6f 6e 20 61 74 20 63 6f 6d 70 69 6c  ession at compil
4040: 65 2d 74 69 6d 65 20 72 65 74 75 72 6e 20 30 2e  e-time return 0.
4050: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61  .**.** This is a
4060: 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20  n optimization. 
4070: 20 49 66 20 69 73 20 4f 4b 20 74 6f 20 72 65 74   If is OK to ret
4080: 75 72 6e 20 30 20 68 65 72 65 20 65 76 65 6e 20  urn 0 here even 
4090: 69 66 0a 2a 2a 20 74 68 65 20 65 78 70 72 65 73  if.** the expres
40a0: 73 69 6f 6e 20 72 65 61 6c 6c 79 20 69 73 20 61  sion really is a
40b0: 6c 77 61 79 73 20 66 61 6c 73 65 20 6f 72 20 66  lways false or f
40c0: 61 6c 73 65 20 28 61 20 66 61 6c 73 65 20 6e 65  alse (a false ne
40d0: 67 61 74 69 76 65 29 2e 0a 2a 2a 20 42 75 74 20  gative)..** But 
40e0: 69 74 20 69 73 20 61 20 62 75 67 20 74 6f 20 72  it is a bug to r
40f0: 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 65  eturn 1 if the e
4100: 78 70 72 65 73 73 69 6f 6e 20 6d 69 67 68 74 20  xpression might 
4110: 68 61 76 65 20 64 69 66 66 65 72 65 6e 74 0a 2a  have different.*
4120: 2a 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 73  * boolean values
4130: 20 69 6e 20 64 69 66 66 65 72 65 6e 74 20 63 69   in different ci
4140: 72 63 75 6d 73 74 61 6e 63 65 73 20 28 61 20 66  rcumstances (a f
4150: 61 6c 73 65 20 70 6f 73 69 74 69 76 65 2e 29 0a  alse positive.).
4160: 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
4170: 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
4180: 6e 20 69 73 20 70 61 72 74 20 6f 66 20 63 6f 6e  n is part of con
4190: 64 69 74 69 6f 6e 61 6c 20 66 6f 72 20 61 0a 2a  ditional for a.*
41a0: 2a 20 4c 45 46 54 20 4a 4f 49 4e 2c 20 74 68 65  * LEFT JOIN, the
41b0: 6e 20 77 65 20 63 61 6e 6e 6f 74 20 64 65 74 65  n we cannot dete
41c0: 72 6d 69 6e 65 20 61 74 20 63 6f 6d 70 69 6c 65  rmine at compile
41d0: 2d 74 69 6d 65 20 77 68 65 74 68 65 72 20 6f 72  -time whether or
41e0: 20 6e 6f 74 0a 2a 2a 20 69 73 20 69 74 20 74 72   not.** is it tr
41f0: 75 65 20 6f 72 20 66 61 6c 73 65 2c 20 73 6f 20  ue or false, so 
4200: 61 6c 77 61 79 73 20 72 65 74 75 72 6e 20 30 2e  always return 0.
4210: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65  .*/.static int e
4220: 78 70 72 41 6c 77 61 79 73 54 72 75 65 28 45 78  xprAlwaysTrue(Ex
4230: 70 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20 76 20  pr *p){.  int v 
4240: 3d 20 30 3b 0a 20 20 69 66 28 20 45 78 70 72 48  = 0;.  if( ExprH
4250: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
4260: 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 20 72 65 74  _FromJoin) ) ret
4270: 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 21 73 71  urn 0;.  if( !sq
4280: 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67  lite3ExprIsInteg
4290: 65 72 28 70 2c 20 26 76 29 20 29 20 72 65 74 75  er(p, &v) ) retu
42a0: 72 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 76  rn 0;.  return v
42b0: 21 3d 30 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e  !=0;.}.static in
42c0: 74 20 65 78 70 72 41 6c 77 61 79 73 46 61 6c 73  t exprAlwaysFals
42d0: 65 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 6e  e(Expr *p){.  in
42e0: 74 20 76 20 3d 20 30 3b 0a 20 20 69 66 28 20 45  t v = 0;.  if( E
42f0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
4300: 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29  , EP_FromJoin) )
4310: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
4320: 20 21 73 71 6c 69 74 65 33 45 78 70 72 49 73 49   !sqlite3ExprIsI
4330: 6e 74 65 67 65 72 28 70 2c 20 26 76 29 20 29 20  nteger(p, &v) ) 
4340: 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75  return 0;.  retu
4350: 72 6e 20 76 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn v==0;.}../*.*
4360: 2a 20 4a 6f 69 6e 20 74 77 6f 20 65 78 70 72 65  * Join two expre
4370: 73 73 69 6f 6e 73 20 75 73 69 6e 67 20 61 6e 20  ssions using an 
4380: 41 4e 44 20 6f 70 65 72 61 74 6f 72 2e 20 20 49  AND operator.  I
4390: 66 20 65 69 74 68 65 72 20 65 78 70 72 65 73 73  f either express
43a0: 69 6f 6e 20 69 73 0a 2a 2a 20 4e 55 4c 4c 2c 20  ion is.** NULL, 
43b0: 74 68 65 6e 20 6a 75 73 74 20 72 65 74 75 72 6e  then just return
43c0: 20 74 68 65 20 6f 74 68 65 72 20 65 78 70 72 65   the other expre
43d0: 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ssion..**.** If 
43e0: 6f 6e 65 20 73 69 64 65 20 6f 72 20 74 68 65 20  one side or the 
43f0: 6f 74 68 65 72 20 6f 66 20 74 68 65 20 41 4e 44  other of the AND
4400: 20 69 73 20 6b 6e 6f 77 6e 20 74 6f 20 62 65 20   is known to be 
4410: 66 61 6c 73 65 2c 20 74 68 65 6e 20 69 6e 73 74  false, then inst
4420: 65 61 64 0a 2a 2a 20 6f 66 20 72 65 74 75 72 6e  ead.** of return
4430: 69 6e 67 20 61 6e 20 41 4e 44 20 65 78 70 72 65  ing an AND expre
4440: 73 73 69 6f 6e 2c 20 6a 75 73 74 20 72 65 74 75  ssion, just retu
4450: 72 6e 20 61 20 63 6f 6e 73 74 61 6e 74 20 65 78  rn a constant ex
4460: 70 72 65 73 73 69 6f 6e 20 77 69 74 68 0a 2a 2a  pression with.**
4470: 20 61 20 76 61 6c 75 65 20 6f 66 20 66 61 6c 73   a value of fals
4480: 65 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69  e..*/.Expr *sqli
4490: 74 65 33 45 78 70 72 41 6e 64 28 73 71 6c 69 74  te3ExprAnd(sqlit
44a0: 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 4c  e3 *db, Expr *pL
44b0: 65 66 74 2c 20 45 78 70 72 20 2a 70 52 69 67 68  eft, Expr *pRigh
44c0: 74 29 7b 0a 20 20 69 66 28 20 70 4c 65 66 74 3d  t){.  if( pLeft=
44d0: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
44e0: 20 70 52 69 67 68 74 3b 0a 20 20 7d 65 6c 73 65   pRight;.  }else
44f0: 20 69 66 28 20 70 52 69 67 68 74 3d 3d 30 20 29   if( pRight==0 )
4500: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 4c 65  {.    return pLe
4510: 66 74 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ft;.  }else if( 
4520: 65 78 70 72 41 6c 77 61 79 73 46 61 6c 73 65 28  exprAlwaysFalse(
4530: 70 4c 65 66 74 29 20 7c 7c 20 65 78 70 72 41 6c  pLeft) || exprAl
4540: 77 61 79 73 46 61 6c 73 65 28 70 52 69 67 68 74  waysFalse(pRight
4550: 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
4560: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
4570: 4c 65 66 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  Left);.    sqlit
4580: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
4590: 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20 72 65   pRight);.    re
45a0: 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72  turn sqlite3Expr
45b0: 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f 49 4e 54  Alloc(db, TK_INT
45c0: 45 47 45 52 2c 20 26 73 71 6c 69 74 65 33 49 6e  EGER, &sqlite3In
45d0: 74 54 6f 6b 65 6e 73 5b 30 5d 2c 20 30 29 3b 0a  tTokens[0], 0);.
45e0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 45 78 70    }else{.    Exp
45f0: 72 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  r *pNew = sqlite
4600: 33 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54  3ExprAlloc(db, T
4610: 4b 5f 41 4e 44 2c 20 30 2c 20 30 29 3b 0a 20 20  K_AND, 0, 0);.  
4620: 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 74 74    sqlite3ExprAtt
4630: 61 63 68 53 75 62 74 72 65 65 73 28 64 62 2c 20  achSubtrees(db, 
4640: 70 4e 65 77 2c 20 70 4c 65 66 74 2c 20 70 52 69  pNew, pLeft, pRi
4650: 67 68 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ght);.    return
4660: 20 70 4e 65 77 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a   pNew;.  }.}../*
4670: 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20  .** Construct a 
4680: 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6e  new expression n
4690: 6f 64 65 20 66 6f 72 20 61 20 66 75 6e 63 74 69  ode for a functi
46a0: 6f 6e 20 77 69 74 68 20 6d 75 6c 74 69 70 6c 65  on with multiple
46b0: 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 73 2e 0a 2a  .** arguments..*
46c0: 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45  /.Expr *sqlite3E
46d0: 78 70 72 46 75 6e 63 74 69 6f 6e 28 50 61 72 73  xprFunction(Pars
46e0: 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 4c  e *pParse, ExprL
46f0: 69 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65  ist *pList, Toke
4700: 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 45 78  n *pToken){.  Ex
4710: 70 72 20 2a 70 4e 65 77 3b 0a 20 20 73 71 6c 69  pr *pNew;.  sqli
4720: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
4730: 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20  ->db;.  assert( 
4740: 70 54 6f 6b 65 6e 20 29 3b 0a 20 20 70 4e 65 77  pToken );.  pNew
4750: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c   = sqlite3ExprAl
4760: 6c 6f 63 28 64 62 2c 20 54 4b 5f 46 55 4e 43 54  loc(db, TK_FUNCT
4770: 49 4f 4e 2c 20 70 54 6f 6b 65 6e 2c 20 31 29 3b  ION, pToken, 1);
4780: 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29  .  if( pNew==0 )
4790: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
47a0: 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
47b0: 70 4c 69 73 74 29 3b 20 2f 2a 20 41 76 6f 69 64  pList); /* Avoid
47c0: 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 20 77 68 65   memory leak whe
47d0: 6e 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20 2a  n malloc fails *
47e0: 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  /.    return 0;.
47f0: 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 78 2e 70 4c    }.  pNew->x.pL
4800: 69 73 74 20 3d 20 70 4c 69 73 74 3b 0a 20 20 61  ist = pList;.  a
4810: 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
4820: 72 6f 70 65 72 74 79 28 70 4e 65 77 2c 20 45 50  roperty(pNew, EP
4830: 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20  _xIsSelect) );. 
4840: 20 73 71 6c 69 74 65 33 45 78 70 72 53 65 74 48   sqlite3ExprSetH
4850: 65 69 67 68 74 28 70 50 61 72 73 65 2c 20 70 4e  eight(pParse, pN
4860: 65 77 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e  ew);.  return pN
4870: 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73  ew;.}../*.** Ass
4880: 69 67 6e 20 61 20 76 61 72 69 61 62 6c 65 20 6e  ign a variable n
4890: 75 6d 62 65 72 20 74 6f 20 61 6e 20 65 78 70 72  umber to an expr
48a0: 65 73 73 69 6f 6e 20 74 68 61 74 20 65 6e 63 6f  ession that enco
48b0: 64 65 73 20 61 20 77 69 6c 64 63 61 72 64 0a 2a  des a wildcard.*
48c0: 2a 20 69 6e 20 74 68 65 20 6f 72 69 67 69 6e 61  * in the origina
48d0: 6c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e  l SQL statement.
48e0: 20 20 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72    .**.** Wildcar
48f0: 64 73 20 63 6f 6e 73 69 73 74 69 6e 67 20 6f 66  ds consisting of
4900: 20 61 20 73 69 6e 67 6c 65 20 22 3f 22 20 61 72   a single "?" ar
4910: 65 20 61 73 73 69 67 6e 65 64 20 74 68 65 20 6e  e assigned the n
4920: 65 78 74 20 73 65 71 75 65 6e 74 69 61 6c 0a 2a  ext sequential.*
4930: 2a 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65  * variable numbe
4940: 72 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72  r..**.** Wildcar
4950: 64 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  ds of the form "
4960: 3f 6e 6e 6e 22 20 61 72 65 20 61 73 73 69 67 6e  ?nnn" are assign
4970: 65 64 20 74 68 65 20 6e 75 6d 62 65 72 20 22 6e  ed the number "n
4980: 6e 6e 22 2e 20 20 57 65 20 6d 61 6b 65 0a 2a 2a  nn".  We make.**
4990: 20 73 75 72 65 20 22 6e 6e 6e 22 20 69 73 20 6e   sure "nnn" is n
49a0: 6f 74 20 74 6f 6f 20 62 65 20 74 6f 20 61 76 6f  ot too be to avo
49b0: 69 64 20 61 20 64 65 6e 69 61 6c 20 6f 66 20 73  id a denial of s
49c0: 65 72 76 69 63 65 20 61 74 74 61 63 6b 20 77 68  ervice attack wh
49d0: 65 6e 0a 2a 2a 20 74 68 65 20 53 51 4c 20 73 74  en.** the SQL st
49e0: 61 74 65 6d 65 6e 74 20 63 6f 6d 65 73 20 66 72  atement comes fr
49f0: 6f 6d 20 61 6e 20 65 78 74 65 72 6e 61 6c 20 73  om an external s
4a00: 6f 75 72 63 65 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c  ource..**.** Wil
4a10: 64 63 61 72 64 73 20 6f 66 20 74 68 65 20 66 6f  dcards of the fo
4a20: 72 6d 20 22 3a 61 61 61 22 2c 20 22 40 61 61 61  rm ":aaa", "@aaa
4a30: 22 2c 20 6f 72 20 22 24 61 61 61 22 20 61 72 65  ", or "$aaa" are
4a40: 20 61 73 73 69 67 6e 65 64 20 74 68 65 20 73 61   assigned the sa
4a50: 6d 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 61 73 20  me number.** as 
4a60: 74 68 65 20 70 72 65 76 69 6f 75 73 20 69 6e 73  the previous ins
4a70: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 73 61 6d  tance of the sam
4a80: 65 20 77 69 6c 64 63 61 72 64 2e 20 20 4f 72 20  e wildcard.  Or 
4a90: 69 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66  if this is the f
4aa0: 69 72 73 74 0a 2a 2a 20 69 6e 73 74 61 6e 63 65  irst.** instance
4ab0: 20 6f 66 20 74 68 65 20 77 69 6c 64 63 61 72 64   of the wildcard
4ac0: 2c 20 74 68 65 20 6e 65 78 74 20 73 65 71 75 65  , the next seque
4ad0: 6e 74 69 61 6c 20 76 61 72 69 61 62 6c 65 20 6e  ntial variable n
4ae0: 75 6d 62 65 72 20 69 73 0a 2a 2a 20 61 73 73 69  umber is.** assi
4af0: 67 6e 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  gned..*/.void sq
4b00: 6c 69 74 65 33 45 78 70 72 41 73 73 69 67 6e 56  lite3ExprAssignV
4b10: 61 72 4e 75 6d 62 65 72 28 50 61 72 73 65 20 2a  arNumber(Parse *
4b20: 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
4b30: 78 70 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  xpr){.  sqlite3 
4b40: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
4b50: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
4b60: 7a 3b 0a 0a 20 20 69 66 28 20 70 45 78 70 72 3d  z;..  if( pExpr=
4b70: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61  =0 ) return;.  a
4b80: 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
4b90: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
4ba0: 50 5f 49 6e 74 56 61 6c 75 65 7c 45 50 5f 52 65  P_IntValue|EP_Re
4bb0: 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e  duced|EP_TokenOn
4bc0: 6c 79 29 20 29 3b 0a 20 20 7a 20 3d 20 70 45 78  ly) );.  z = pEx
4bd0: 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20  pr->u.zToken;.  
4be0: 61 73 73 65 72 74 28 20 7a 21 3d 30 20 29 3b 0a  assert( z!=0 );.
4bf0: 20 20 61 73 73 65 72 74 28 20 7a 5b 30 5d 21 3d    assert( z[0]!=
4c00: 30 20 29 3b 0a 20 20 69 66 28 20 7a 5b 31 5d 3d  0 );.  if( z[1]=
4c10: 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 57 69 6c  =0 ){.    /* Wil
4c20: 64 63 61 72 64 20 6f 66 20 74 68 65 20 66 6f 72  dcard of the for
4c30: 6d 20 22 3f 22 2e 20 20 41 73 73 69 67 6e 20 74  m "?".  Assign t
4c40: 68 65 20 6e 65 78 74 20 76 61 72 69 61 62 6c 65  he next variable
4c50: 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20 61   number */.    a
4c60: 73 73 65 72 74 28 20 7a 5b 30 5d 3d 3d 27 3f 27  ssert( z[0]=='?'
4c70: 20 29 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 69   );.    pExpr->i
4c80: 43 6f 6c 75 6d 6e 20 3d 20 28 79 6e 56 61 72 29  Column = (ynVar)
4c90: 28 2b 2b 70 50 61 72 73 65 2d 3e 6e 56 61 72 29  (++pParse->nVar)
4ca0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 79  ;.  }else{.    y
4cb0: 6e 56 61 72 20 78 20 3d 20 30 3b 0a 20 20 20 20  nVar x = 0;.    
4cc0: 75 33 32 20 6e 20 3d 20 73 71 6c 69 74 65 33 53  u32 n = sqlite3S
4cd0: 74 72 6c 65 6e 33 30 28 7a 29 3b 0a 20 20 20 20  trlen30(z);.    
4ce0: 69 66 28 20 7a 5b 30 5d 3d 3d 27 3f 27 20 29 7b  if( z[0]=='?' ){
4cf0: 0a 20 20 20 20 20 20 2f 2a 20 57 69 6c 64 63 61  .      /* Wildca
4d00: 72 64 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  rd of the form "
4d10: 3f 6e 6e 6e 22 2e 20 20 43 6f 6e 76 65 72 74 20  ?nnn".  Convert 
4d20: 22 6e 6e 6e 22 20 74 6f 20 61 6e 20 69 6e 74 65  "nnn" to an inte
4d30: 67 65 72 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a  ger and.      **
4d40: 20 75 73 65 20 69 74 20 61 73 20 74 68 65 20 76   use it as the v
4d50: 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 2a  ariable number *
4d60: 2f 0a 20 20 20 20 20 20 69 36 34 20 69 3b 0a 20  /.      i64 i;. 
4d70: 20 20 20 20 20 69 6e 74 20 62 4f 6b 20 3d 20 30       int bOk = 0
4d80: 3d 3d 73 71 6c 69 74 65 33 41 74 6f 69 36 34 28  ==sqlite3Atoi64(
4d90: 26 7a 5b 31 5d 2c 20 26 69 2c 20 6e 2d 31 2c 20  &z[1], &i, n-1, 
4da0: 53 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 20  SQLITE_UTF8);.  
4db0: 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75      pExpr->iColu
4dc0: 6d 6e 20 3d 20 78 20 3d 20 28 79 6e 56 61 72 29  mn = x = (ynVar)
4dd0: 69 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  i;.      testcas
4de0: 65 28 20 69 3d 3d 30 20 29 3b 0a 20 20 20 20 20  e( i==0 );.     
4df0: 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d 31 20   testcase( i==1 
4e00: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
4e10: 65 28 20 69 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74  e( i==db->aLimit
4e20: 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41  [SQLITE_LIMIT_VA
4e30: 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 2d 31  RIABLE_NUMBER]-1
4e40: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
4e50: 73 65 28 20 69 3d 3d 64 62 2d 3e 61 4c 69 6d 69  se( i==db->aLimi
4e60: 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56  t[SQLITE_LIMIT_V
4e70: 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 20  ARIABLE_NUMBER] 
4e80: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 62 4f 6b  );.      if( bOk
4e90: 3d 3d 30 20 7c 7c 20 69 3c 31 20 7c 7c 20 69 3e  ==0 || i<1 || i>
4ea0: 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54  db->aLimit[SQLIT
4eb0: 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45  E_LIMIT_VARIABLE
4ec0: 5f 4e 55 4d 42 45 52 5d 20 29 7b 0a 20 20 20 20  _NUMBER] ){.    
4ed0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
4ee0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 76 61 72  Msg(pParse, "var
4ef0: 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 6d 75 73  iable number mus
4f00: 74 20 62 65 20 62 65 74 77 65 65 6e 20 3f 31 20  t be between ?1 
4f10: 61 6e 64 20 3f 25 64 22 2c 0a 20 20 20 20 20 20  and ?%d",.      
4f20: 20 20 20 20 20 20 64 62 2d 3e 61 4c 69 6d 69 74        db->aLimit
4f30: 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41  [SQLITE_LIMIT_VA
4f40: 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 29 3b  RIABLE_NUMBER]);
4f50: 0a 20 20 20 20 20 20 20 20 78 20 3d 20 30 3b 0a  .        x = 0;.
4f60: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
4f70: 28 20 69 3e 70 50 61 72 73 65 2d 3e 6e 56 61 72  ( i>pParse->nVar
4f80: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 72   ){.        pPar
4f90: 73 65 2d 3e 6e 56 61 72 20 3d 20 28 69 6e 74 29  se->nVar = (int)
4fa0: 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  i;.      }.    }
4fb0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 57  else{.      /* W
4fc0: 69 6c 64 63 61 72 64 73 20 6c 69 6b 65 20 22 3a  ildcards like ":
4fd0: 61 61 61 22 2c 20 22 24 61 61 61 22 20 6f 72 20  aaa", "$aaa" or 
4fe0: 22 40 61 61 61 22 2e 20 20 52 65 75 73 65 20 74  "@aaa".  Reuse t
4ff0: 68 65 20 73 61 6d 65 20 76 61 72 69 61 62 6c 65  he same variable
5000: 0a 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72  .      ** number
5010: 20 61 73 20 74 68 65 20 70 72 69 6f 72 20 61 70   as the prior ap
5020: 70 65 61 72 61 6e 63 65 20 6f 66 20 74 68 65 20  pearance of the 
5030: 73 61 6d 65 20 6e 61 6d 65 2c 20 6f 72 20 69 66  same name, or if
5040: 20 74 68 65 20 6e 61 6d 65 0a 20 20 20 20 20 20   the name.      
5050: 2a 2a 20 68 61 73 20 6e 65 76 65 72 20 61 70 70  ** has never app
5060: 65 61 72 65 64 20 62 65 66 6f 72 65 2c 20 72 65  eared before, re
5070: 75 73 65 20 74 68 65 20 73 61 6d 65 20 76 61 72  use the same var
5080: 69 61 62 6c 65 20 6e 75 6d 62 65 72 0a 20 20 20  iable number.   
5090: 20 20 20 2a 2f 0a 20 20 20 20 20 20 79 6e 56 61     */.      ynVa
50a0: 72 20 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  r i;.      for(i
50b0: 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 7a  =0; i<pParse->nz
50c0: 56 61 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Var; i++){.     
50d0: 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 61     if( pParse->a
50e0: 7a 56 61 72 5b 69 5d 20 26 26 20 73 74 72 63 6d  zVar[i] && strcm
50f0: 70 28 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 5b  p(pParse->azVar[
5100: 69 5d 2c 7a 29 3d 3d 30 20 29 7b 0a 20 20 20 20  i],z)==0 ){.    
5110: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f        pExpr->iCo
5120: 6c 75 6d 6e 20 3d 20 78 20 3d 20 28 79 6e 56 61  lumn = x = (ynVa
5130: 72 29 69 2b 31 3b 0a 20 20 20 20 20 20 20 20 20  r)i+1;.         
5140: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
5150: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
5160: 69 66 28 20 78 3d 3d 30 20 29 20 78 20 3d 20 70  if( x==0 ) x = p
5170: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20  Expr->iColumn = 
5180: 28 79 6e 56 61 72 29 28 2b 2b 70 50 61 72 73 65  (ynVar)(++pParse
5190: 2d 3e 6e 56 61 72 29 3b 0a 20 20 20 20 7d 0a 20  ->nVar);.    }. 
51a0: 20 20 20 69 66 28 20 78 3e 30 20 29 7b 0a 20 20     if( x>0 ){.  
51b0: 20 20 20 20 69 66 28 20 78 3e 70 50 61 72 73 65      if( x>pParse
51c0: 2d 3e 6e 7a 56 61 72 20 29 7b 0a 20 20 20 20 20  ->nzVar ){.     
51d0: 20 20 20 63 68 61 72 20 2a 2a 61 3b 0a 20 20 20     char **a;.   
51e0: 20 20 20 20 20 61 20 3d 20 73 71 6c 69 74 65 33       a = sqlite3
51f0: 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70 50  DbRealloc(db, pP
5200: 61 72 73 65 2d 3e 61 7a 56 61 72 2c 20 78 2a 73  arse->azVar, x*s
5210: 69 7a 65 6f 66 28 61 5b 30 5d 29 29 3b 0a 20 20  izeof(a[0]));.  
5220: 20 20 20 20 20 20 69 66 28 20 61 3d 3d 30 20 29        if( a==0 )
5230: 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 45 72 72   return;  /* Err
5240: 6f 72 20 72 65 70 6f 72 74 65 64 20 74 68 72 6f  or reported thro
5250: 75 67 68 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  ugh db->mallocFa
5260: 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20  iled */.        
5270: 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 20 3d 20  pParse->azVar = 
5280: 61 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65  a;.        memse
5290: 74 28 26 61 5b 70 50 61 72 73 65 2d 3e 6e 7a 56  t(&a[pParse->nzV
52a0: 61 72 5d 2c 20 30 2c 20 28 78 2d 70 50 61 72 73  ar], 0, (x-pPars
52b0: 65 2d 3e 6e 7a 56 61 72 29 2a 73 69 7a 65 6f 66  e->nzVar)*sizeof
52c0: 28 61 5b 30 5d 29 29 3b 0a 20 20 20 20 20 20 20  (a[0]));.       
52d0: 20 70 50 61 72 73 65 2d 3e 6e 7a 56 61 72 20 3d   pParse->nzVar =
52e0: 20 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   x;.      }.    
52f0: 20 20 69 66 28 20 7a 5b 30 5d 21 3d 27 3f 27 20    if( z[0]!='?' 
5300: 7c 7c 20 70 50 61 72 73 65 2d 3e 61 7a 56 61 72  || pParse->azVar
5310: 5b 78 2d 31 5d 3d 3d 30 20 29 7b 0a 20 20 20 20  [x-1]==0 ){.    
5320: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
5330: 65 28 64 62 2c 20 70 50 61 72 73 65 2d 3e 61 7a  e(db, pParse->az
5340: 56 61 72 5b 78 2d 31 5d 29 3b 0a 20 20 20 20 20  Var[x-1]);.     
5350: 20 20 20 70 50 61 72 73 65 2d 3e 61 7a 56 61 72     pParse->azVar
5360: 5b 78 2d 31 5d 20 3d 20 73 71 6c 69 74 65 33 44  [x-1] = sqlite3D
5370: 62 53 74 72 4e 44 75 70 28 64 62 2c 20 7a 2c 20  bStrNDup(db, z, 
5380: 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  n);.      }.    
5390: 7d 0a 20 20 7d 20 0a 20 20 69 66 28 20 21 70 50  }.  } .  if( !pP
53a0: 61 72 73 65 2d 3e 6e 45 72 72 20 26 26 20 70 50  arse->nErr && pP
53b0: 61 72 73 65 2d 3e 6e 56 61 72 3e 64 62 2d 3e 61  arse->nVar>db->a
53c0: 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
53d0: 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42  IT_VARIABLE_NUMB
53e0: 45 52 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ER] ){.    sqlit
53f0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
5400: 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 53 51 4c  e, "too many SQL
5410: 20 76 61 72 69 61 62 6c 65 73 22 29 3b 0a 20 20   variables");.  
5420: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 75 72  }.}../*.** Recur
5430: 73 69 76 65 6c 79 20 64 65 6c 65 74 65 20 61 6e  sively delete an
5440: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
5450: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
5460: 33 45 78 70 72 44 65 6c 65 74 65 28 73 71 6c 69  3ExprDelete(sqli
5470: 74 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70  te3 *db, Expr *p
5480: 29 7b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  ){.  if( p==0 ) 
5490: 72 65 74 75 72 6e 3b 0a 20 20 2f 2a 20 53 61 6e  return;.  /* San
54a0: 69 74 79 20 63 68 65 63 6b 3a 20 41 73 73 65 72  ity check: Asser
54b0: 74 20 74 68 61 74 20 74 68 65 20 49 6e 74 56 61  t that the IntVa
54c0: 6c 75 65 20 69 73 20 6e 6f 6e 2d 6e 65 67 61 74  lue is non-negat
54d0: 69 76 65 20 69 66 20 69 74 20 65 78 69 73 74 73  ive if it exists
54e0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21 45   */.  assert( !E
54f0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
5500: 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 7c  , EP_IntValue) |
5510: 7c 20 70 2d 3e 75 2e 69 56 61 6c 75 65 3e 3d 30  | p->u.iValue>=0
5520: 20 29 3b 0a 20 20 69 66 28 20 21 45 78 70 72 48   );.  if( !ExprH
5530: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
5540: 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20  _TokenOnly) ){. 
5550: 20 20 20 2f 2a 20 54 68 65 20 45 78 70 72 2e 78     /* The Expr.x
5560: 20 75 6e 69 6f 6e 20 69 73 20 6e 65 76 65 72 20   union is never 
5570: 75 73 65 64 20 61 74 20 74 68 65 20 73 61 6d 65  used at the same
5580: 20 74 69 6d 65 20 61 73 20 45 78 70 72 2e 70 52   time as Expr.pR
5590: 69 67 68 74 20 2a 2f 0a 20 20 20 20 61 73 73 65  ight */.    asse
55a0: 72 74 28 20 70 2d 3e 78 2e 70 4c 69 73 74 3d 3d  rt( p->x.pList==
55b0: 30 20 7c 7c 20 70 2d 3e 70 52 69 67 68 74 3d 3d  0 || p->pRight==
55c0: 30 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 );.    sqlite3
55d0: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
55e0: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 73 71  ->pLeft);.    sq
55f0: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
5600: 64 62 2c 20 70 2d 3e 70 52 69 67 68 74 29 3b 0a  db, p->pRight);.
5610: 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50      if( ExprHasP
5620: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 4d 65  roperty(p, EP_Me
5630: 6d 54 6f 6b 65 6e 29 20 29 20 73 71 6c 69 74 65  mToken) ) sqlite
5640: 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 75  3DbFree(db, p->u
5650: 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 69 66  .zToken);.    if
5660: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
5670: 79 28 70 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  y(p, EP_xIsSelec
5680: 74 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  t) ){.      sqli
5690: 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
56a0: 64 62 2c 20 70 2d 3e 78 2e 70 53 65 6c 65 63 74  db, p->x.pSelect
56b0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
56c0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
56d0: 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  istDelete(db, p-
56e0: 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20 7d  >x.pList);.    }
56f0: 0a 20 20 7d 0a 20 20 69 66 28 20 21 45 78 70 72  .  }.  if( !Expr
5700: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
5710: 50 5f 53 74 61 74 69 63 29 20 29 7b 0a 20 20 20  P_Static) ){.   
5720: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
5730: 62 2c 20 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  b, p);.  }.}../*
5740: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
5750: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 61  umber of bytes a
5760: 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 74 68 65  llocated for the
5770: 20 65 78 70 72 65 73 73 69 6f 6e 20 73 74 72 75   expression stru
5780: 63 74 75 72 65 20 0a 2a 2a 20 70 61 73 73 65 64  cture .** passed
5790: 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
57a0: 67 75 6d 65 6e 74 2e 20 54 68 69 73 20 69 73 20  gument. This is 
57b0: 61 6c 77 61 79 73 20 6f 6e 65 20 6f 66 20 45 58  always one of EX
57c0: 50 52 5f 46 55 4c 4c 53 49 5a 45 2c 0a 2a 2a 20  PR_FULLSIZE,.** 
57d0: 45 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45  EXPR_REDUCEDSIZE
57e0: 20 6f 72 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e   or EXPR_TOKENON
57f0: 4c 59 53 49 5a 45 2e 0a 2a 2f 0a 73 74 61 74 69  LYSIZE..*/.stati
5800: 63 20 69 6e 74 20 65 78 70 72 53 74 72 75 63 74  c int exprStruct
5810: 53 69 7a 65 28 45 78 70 72 20 2a 70 29 7b 0a 20  Size(Expr *p){. 
5820: 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
5830: 65 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e  erty(p, EP_Token
5840: 4f 6e 6c 79 29 20 29 20 72 65 74 75 72 6e 20 45  Only) ) return E
5850: 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a  XPR_TOKENONLYSIZ
5860: 45 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73  E;.  if( ExprHas
5870: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 52  Property(p, EP_R
5880: 65 64 75 63 65 64 29 20 29 20 72 65 74 75 72 6e  educed) ) return
5890: 20 45 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a   EXPR_REDUCEDSIZ
58a0: 45 3b 0a 20 20 72 65 74 75 72 6e 20 45 58 50 52  E;.  return EXPR
58b0: 5f 46 55 4c 4c 53 49 5a 45 3b 0a 7d 0a 0a 2f 2a  _FULLSIZE;.}../*
58c0: 0a 2a 2a 20 54 68 65 20 64 75 70 65 64 45 78 70  .** The dupedExp
58d0: 72 2a 53 69 7a 65 28 29 20 72 6f 75 74 69 6e 65  r*Size() routine
58e0: 73 20 65 61 63 68 20 72 65 74 75 72 6e 20 74 68  s each return th
58f0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
5900: 73 20 72 65 71 75 69 72 65 64 0a 2a 2a 20 74 6f  s required.** to
5910: 20 73 74 6f 72 65 20 61 20 63 6f 70 79 20 6f 66   store a copy of
5920: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6f   an expression o
5930: 72 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  r expression tre
5940: 65 2e 20 20 54 68 65 79 20 64 69 66 66 65 72 20  e.  They differ 
5950: 69 6e 0a 2a 2a 20 68 6f 77 20 6d 75 63 68 20 6f  in.** how much o
5960: 66 20 74 68 65 20 74 72 65 65 20 69 73 20 6d 65  f the tree is me
5970: 61 73 75 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20  asured..**.**   
5980: 20 20 64 75 70 65 64 45 78 70 72 53 74 72 75 63    dupedExprStruc
5990: 74 53 69 7a 65 28 29 20 20 20 20 20 53 69 7a 65  tSize()     Size
59a0: 20 6f 66 20 6f 6e 6c 79 20 74 68 65 20 45 78 70   of only the Exp
59b0: 72 20 73 74 72 75 63 74 75 72 65 20 0a 2a 2a 20  r structure .** 
59c0: 20 20 20 20 64 75 70 65 64 45 78 70 72 4e 6f 64      dupedExprNod
59d0: 65 53 69 7a 65 28 29 20 20 20 20 20 20 20 53 69  eSize()       Si
59e0: 7a 65 20 6f 66 20 45 78 70 72 20 2b 20 73 70 61  ze of Expr + spa
59f0: 63 65 20 66 6f 72 20 74 6f 6b 65 6e 0a 2a 2a 20  ce for token.** 
5a00: 20 20 20 20 64 75 70 65 64 45 78 70 72 53 69 7a      dupedExprSiz
5a10: 65 28 29 20 20 20 20 20 20 20 20 20 20 20 45 78  e()           Ex
5a20: 70 72 20 2b 20 74 6f 6b 65 6e 20 2b 20 73 75 62  pr + token + sub
5a30: 74 72 65 65 20 63 6f 6d 70 6f 6e 65 6e 74 73 0a  tree components.
5a40: 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
5a50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5a60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5a70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5a80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
5a90: 2a 0a 2a 2a 20 54 68 65 20 64 75 70 65 64 45 78  *.** The dupedEx
5aa0: 70 72 53 74 72 75 63 74 53 69 7a 65 28 29 20 66  prStructSize() f
5ab0: 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
5ac0: 74 77 6f 20 76 61 6c 75 65 73 20 4f 52 2d 65 64  two values OR-ed
5ad0: 20 74 6f 67 65 74 68 65 72 3a 20 20 0a 2a 2a 20   together:  .** 
5ae0: 28 31 29 20 74 68 65 20 73 70 61 63 65 20 72 65  (1) the space re
5af0: 71 75 69 72 65 64 20 66 6f 72 20 61 20 63 6f 70  quired for a cop
5b00: 79 20 6f 66 20 74 68 65 20 45 78 70 72 20 73 74  y of the Expr st
5b10: 72 75 63 74 75 72 65 20 6f 6e 6c 79 20 61 6e 64  ructure only and
5b20: 20 0a 2a 2a 20 28 32 29 20 74 68 65 20 45 50 5f   .** (2) the EP_
5b30: 78 78 78 20 66 6c 61 67 73 20 74 68 61 74 20 69  xxx flags that i
5b40: 6e 64 69 63 61 74 65 20 77 68 61 74 20 74 68 65  ndicate what the
5b50: 20 73 74 72 75 63 74 75 72 65 20 73 69 7a 65 20   structure size 
5b60: 73 68 6f 75 6c 64 20 62 65 2e 0a 2a 2a 20 54 68  should be..** Th
5b70: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 73 20  e return values 
5b80: 69 73 20 61 6c 77 61 79 73 20 6f 6e 65 20 6f 66  is always one of
5b90: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 45 58 50  :.**.**      EXP
5ba0: 52 5f 46 55 4c 4c 53 49 5a 45 0a 2a 2a 20 20 20  R_FULLSIZE.**   
5bb0: 20 20 20 45 58 50 52 5f 52 45 44 55 43 45 44 53     EXPR_REDUCEDS
5bc0: 49 5a 45 20 20 20 7c 20 45 50 5f 52 65 64 75 63  IZE   | EP_Reduc
5bd0: 65 64 0a 2a 2a 20 20 20 20 20 20 45 58 50 52 5f  ed.**      EXPR_
5be0: 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 20 7c 20  TOKENONLYSIZE | 
5bf0: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 0a 2a 2a 0a  EP_TokenOnly.**.
5c00: 2a 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74  ** The size of t
5c10: 68 65 20 73 74 72 75 63 74 75 72 65 20 63 61 6e  he structure can
5c20: 20 62 65 20 66 6f 75 6e 64 20 62 79 20 6d 61 73   be found by mas
5c30: 6b 69 6e 67 20 74 68 65 20 72 65 74 75 72 6e 20  king the return 
5c40: 76 61 6c 75 65 0a 2a 2a 20 6f 66 20 74 68 69 73  value.** of this
5c50: 20 72 6f 75 74 69 6e 65 20 77 69 74 68 20 30 78   routine with 0x
5c60: 66 66 66 2e 20 20 54 68 65 20 66 6c 61 67 73 20  fff.  The flags 
5c70: 63 61 6e 20 62 65 20 66 6f 75 6e 64 20 62 79 20  can be found by 
5c80: 6d 61 73 6b 69 6e 67 20 74 68 65 0a 2a 2a 20 72  masking the.** r
5c90: 65 74 75 72 6e 20 76 61 6c 75 65 20 77 69 74 68  eturn value with
5ca0: 20 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f 54   EP_Reduced|EP_T
5cb0: 6f 6b 65 6e 4f 6e 6c 79 2e 0a 2a 2a 0a 2a 2a 20  okenOnly..**.** 
5cc0: 4e 6f 74 65 20 74 68 61 74 20 77 69 74 68 20 66  Note that with f
5cd0: 6c 61 67 73 3d 3d 45 58 50 52 44 55 50 5f 52 45  lags==EXPRDUP_RE
5ce0: 44 55 43 45 2c 20 74 68 69 73 20 72 6f 75 74 69  DUCE, this routi
5cf0: 6e 65 73 20 77 6f 72 6b 73 20 6f 6e 20 66 75 6c  nes works on ful
5d00: 6c 2d 73 69 7a 65 0a 2a 2a 20 28 75 6e 72 65 64  l-size.** (unred
5d10: 75 63 65 64 29 20 45 78 70 72 20 6f 62 6a 65 63  uced) Expr objec
5d20: 74 73 20 61 73 20 74 68 65 79 20 6f 72 20 6f 72  ts as they or or
5d30: 69 67 69 6e 61 6c 6c 79 20 63 6f 6e 73 74 72 75  iginally constru
5d40: 63 74 65 64 20 62 79 20 74 68 65 20 70 61 72 73  cted by the pars
5d50: 65 72 2e 0a 2a 2a 20 44 75 72 69 6e 67 20 65 78  er..** During ex
5d60: 70 72 65 73 73 69 6f 6e 20 61 6e 61 6c 79 73 69  pression analysi
5d70: 73 2c 20 65 78 74 72 61 20 69 6e 66 6f 72 6d 61  s, extra informa
5d80: 74 69 6f 6e 20 69 73 20 63 6f 6d 70 75 74 65 64  tion is computed
5d90: 20 61 6e 64 20 6d 6f 76 65 64 20 69 6e 74 6f 0a   and moved into.
5da0: 2a 2a 20 6c 61 74 65 72 20 70 61 72 74 73 20 6f  ** later parts o
5db0: 66 20 74 65 68 20 45 78 70 72 20 6f 62 6a 65 63  f teh Expr objec
5dc0: 74 20 61 6e 64 20 74 68 61 74 20 65 78 74 72 61  t and that extra
5dd0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6d 69 67   information mig
5de0: 68 74 20 67 65 74 20 63 68 6f 70 70 65 64 0a 2a  ht get chopped.*
5df0: 2a 20 6f 66 66 20 69 66 20 74 68 65 20 65 78 70  * off if the exp
5e00: 72 65 73 73 69 6f 6e 20 69 73 20 72 65 64 75 63  ression is reduc
5e10: 65 64 2e 20 20 4e 6f 74 65 20 61 6c 73 6f 20 74  ed.  Note also t
5e20: 68 61 74 20 69 74 20 64 6f 65 73 20 6e 6f 74 20  hat it does not 
5e30: 77 6f 72 6b 20 74 6f 0a 2a 2a 20 6d 61 6b 65 20  work to.** make 
5e40: 61 6e 20 45 58 50 52 44 55 50 5f 52 45 44 55 43  an EXPRDUP_REDUC
5e50: 45 20 63 6f 70 79 20 6f 66 20 61 20 72 65 64 75  E copy of a redu
5e60: 63 65 64 20 65 78 70 72 65 73 73 69 6f 6e 2e 20  ced expression. 
5e70: 20 49 74 20 69 73 20 6f 6e 6c 79 20 6c 65 67 61   It is only lega
5e80: 6c 0a 2a 2a 20 74 6f 20 72 65 64 75 63 65 20 61  l.** to reduce a
5e90: 20 70 72 69 73 74 69 6e 65 20 65 78 70 72 65 73   pristine expres
5ea0: 73 69 6f 6e 20 74 72 65 65 20 66 72 6f 6d 20 74  sion tree from t
5eb0: 68 65 20 70 61 72 73 65 72 2e 20 20 54 68 65 20  he parser.  The 
5ec0: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 0a 2a  implementation.*
5ed0: 2a 20 6f 66 20 64 75 70 65 64 45 78 70 72 53 74  * of dupedExprSt
5ee0: 72 75 63 74 53 69 7a 65 28 29 20 63 6f 6e 74 61  ructSize() conta
5ef0: 69 6e 20 6d 75 6c 74 69 70 6c 65 20 61 73 73 65  in multiple asse
5f00: 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20  rt() statements 
5f10: 74 68 61 74 20 61 74 74 65 6d 70 74 0a 2a 2a 20  that attempt.** 
5f20: 74 6f 20 65 6e 66 6f 72 63 65 20 74 68 69 73 20  to enforce this 
5f30: 63 6f 6e 73 74 72 61 69 6e 74 2e 0a 2a 2f 0a 73  constraint..*/.s
5f40: 74 61 74 69 63 20 69 6e 74 20 64 75 70 65 64 45  tatic int dupedE
5f50: 78 70 72 53 74 72 75 63 74 53 69 7a 65 28 45 78  xprStructSize(Ex
5f60: 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73  pr *p, int flags
5f70: 29 7b 0a 20 20 69 6e 74 20 6e 53 69 7a 65 3b 0a  ){.  int nSize;.
5f80: 20 20 61 73 73 65 72 74 28 20 66 6c 61 67 73 3d    assert( flags=
5f90: 3d 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 20  =EXPRDUP_REDUCE 
5fa0: 7c 7c 20 66 6c 61 67 73 3d 3d 30 20 29 3b 20 2f  || flags==0 ); /
5fb0: 2a 20 4f 6e 6c 79 20 6f 6e 65 20 66 6c 61 67 20  * Only one flag 
5fc0: 76 61 6c 75 65 20 61 6c 6c 6f 77 65 64 20 2a 2f  value allowed */
5fd0: 0a 20 20 61 73 73 65 72 74 28 20 45 58 50 52 5f  .  assert( EXPR_
5fe0: 46 55 4c 4c 53 49 5a 45 3c 3d 30 78 66 66 66 20  FULLSIZE<=0xfff 
5ff0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 30 78  );.  assert( (0x
6000: 66 66 66 20 26 20 28 45 50 5f 52 65 64 75 63 65  fff & (EP_Reduce
6010: 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 29  d|EP_TokenOnly))
6020: 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 30 3d 3d  ==0 );.  if( 0==
6030: 28 66 6c 61 67 73 26 45 58 50 52 44 55 50 5f 52  (flags&EXPRDUP_R
6040: 45 44 55 43 45 29 20 29 7b 0a 20 20 20 20 6e 53  EDUCE) ){.    nS
6050: 69 7a 65 20 3d 20 45 58 50 52 5f 46 55 4c 4c 53  ize = EXPR_FULLS
6060: 49 5a 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  IZE;.  }else{.  
6070: 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
6080: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
6090: 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65  _TokenOnly|EP_Re
60a0: 64 75 63 65 64 29 20 29 3b 0a 20 20 20 20 61 73  duced) );.    as
60b0: 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
60c0: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 46 72 6f  operty(p, EP_Fro
60d0: 6d 4a 6f 69 6e 29 20 29 3b 20 0a 20 20 20 20 61  mJoin) ); .    a
60e0: 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
60f0: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 4d 65  roperty(p, EP_Me
6100: 6d 54 6f 6b 65 6e 29 20 29 3b 0a 20 20 20 20 61  mToken) );.    a
6110: 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
6120: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 4e 6f  roperty(p, EP_No
6130: 52 65 64 75 63 65 29 20 29 3b 0a 20 20 20 20 69  Reduce) );.    i
6140: 66 28 20 70 2d 3e 70 4c 65 66 74 20 7c 7c 20 70  f( p->pLeft || p
6150: 2d 3e 78 2e 70 4c 69 73 74 20 29 7b 0a 20 20 20  ->x.pList ){.   
6160: 20 20 20 6e 53 69 7a 65 20 3d 20 45 58 50 52 5f     nSize = EXPR_
6170: 52 45 44 55 43 45 44 53 49 5a 45 20 7c 20 45 50  REDUCEDSIZE | EP
6180: 5f 52 65 64 75 63 65 64 3b 0a 20 20 20 20 7d 65  _Reduced;.    }e
6190: 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
61a0: 74 28 20 70 2d 3e 70 52 69 67 68 74 3d 3d 30 20  t( p->pRight==0 
61b0: 29 3b 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d  );.      nSize =
61c0: 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53   EXPR_TOKENONLYS
61d0: 49 5a 45 20 7c 20 45 50 5f 54 6f 6b 65 6e 4f 6e  IZE | EP_TokenOn
61e0: 6c 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ly;.    }.  }.  
61f0: 72 65 74 75 72 6e 20 6e 53 69 7a 65 3b 0a 7d 0a  return nSize;.}.
6200: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
6210: 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65  tion returns the
6220: 20 73 70 61 63 65 20 69 6e 20 62 79 74 65 73 20   space in bytes 
6230: 72 65 71 75 69 72 65 64 20 74 6f 20 73 74 6f 72  required to stor
6240: 65 20 74 68 65 20 63 6f 70 79 20 0a 2a 2a 20 6f  e the copy .** o
6250: 66 20 74 68 65 20 45 78 70 72 20 73 74 72 75 63  f the Expr struc
6260: 74 75 72 65 20 61 6e 64 20 61 20 63 6f 70 79 20  ture and a copy 
6270: 6f 66 20 74 68 65 20 45 78 70 72 2e 75 2e 7a 54  of the Expr.u.zT
6280: 6f 6b 65 6e 20 73 74 72 69 6e 67 20 28 69 66 20  oken string (if 
6290: 74 68 61 74 0a 2a 2a 20 73 74 72 69 6e 67 20 69  that.** string i
62a0: 73 20 64 65 66 69 6e 65 64 2e 29 0a 2a 2f 0a 73  s defined.).*/.s
62b0: 74 61 74 69 63 20 69 6e 74 20 64 75 70 65 64 45  tatic int dupedE
62c0: 78 70 72 4e 6f 64 65 53 69 7a 65 28 45 78 70 72  xprNodeSize(Expr
62d0: 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b   *p, int flags){
62e0: 0a 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 64  .  int nByte = d
62f0: 75 70 65 64 45 78 70 72 53 74 72 75 63 74 53 69  upedExprStructSi
6300: 7a 65 28 70 2c 20 66 6c 61 67 73 29 20 26 20 30  ze(p, flags) & 0
6310: 78 66 66 66 3b 0a 20 20 69 66 28 20 21 45 78 70  xfff;.  if( !Exp
6320: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
6330: 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 26 26 20  EP_IntValue) && 
6340: 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 29 7b 0a 20  p->u.zToken ){. 
6350: 20 20 20 6e 42 79 74 65 20 2b 3d 20 73 71 6c 69     nByte += sqli
6360: 74 65 33 53 74 72 6c 65 6e 33 30 28 70 2d 3e 75  te3Strlen30(p->u
6370: 2e 7a 54 6f 6b 65 6e 29 2b 31 3b 0a 20 20 7d 0a  .zToken)+1;.  }.
6380: 20 20 72 65 74 75 72 6e 20 52 4f 55 4e 44 38 28    return ROUND8(
6390: 6e 42 79 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  nByte);.}../*.**
63a0: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
63b0: 65 72 20 6f 66 20 62 79 74 65 73 20 72 65 71 75  er of bytes requ
63c0: 69 72 65 64 20 74 6f 20 63 72 65 61 74 65 20 61  ired to create a
63d0: 20 64 75 70 6c 69 63 61 74 65 20 6f 66 20 74 68   duplicate of th
63e0: 65 20 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  e .** expression
63f0: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66   passed as the f
6400: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 54  irst argument. T
6410: 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
6420: 6e 74 20 69 73 20 61 0a 2a 2a 20 6d 61 73 6b 20  nt is a.** mask 
6430: 63 6f 6e 74 61 69 6e 69 6e 67 20 45 58 50 52 44  containing EXPRD
6440: 55 50 5f 58 58 58 20 66 6c 61 67 73 2e 0a 2a 2a  UP_XXX flags..**
6450: 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65  .** The value re
6460: 74 75 72 6e 65 64 20 69 6e 63 6c 75 64 65 73 20  turned includes 
6470: 73 70 61 63 65 20 74 6f 20 63 72 65 61 74 65 20  space to create 
6480: 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 45 78  a copy of the Ex
6490: 70 72 20 73 74 72 75 63 74 0a 2a 2a 20 69 74 73  pr struct.** its
64a0: 65 6c 66 20 61 6e 64 20 74 68 65 20 62 75 66 66  elf and the buff
64b0: 65 72 20 72 65 66 65 72 72 65 64 20 74 6f 20 62  er referred to b
64c0: 79 20 45 78 70 72 2e 75 2e 7a 54 6f 6b 65 6e 2c  y Expr.u.zToken,
64d0: 20 69 66 20 61 6e 79 2e 0a 2a 2a 0a 2a 2a 20 49   if any..**.** I
64e0: 66 20 74 68 65 20 45 58 50 52 44 55 50 5f 52 45  f the EXPRDUP_RE
64f0: 44 55 43 45 20 66 6c 61 67 20 69 73 20 73 65 74  DUCE flag is set
6500: 2c 20 74 68 65 6e 20 74 68 65 20 72 65 74 75 72  , then the retur
6510: 6e 20 76 61 6c 75 65 20 69 6e 63 6c 75 64 65 73  n value includes
6520: 20 0a 2a 2a 20 73 70 61 63 65 20 74 6f 20 64 75   .** space to du
6530: 70 6c 69 63 61 74 65 20 61 6c 6c 20 45 78 70 72  plicate all Expr
6540: 20 6e 6f 64 65 73 20 69 6e 20 74 68 65 20 74 72   nodes in the tr
6550: 65 65 20 66 6f 72 6d 65 64 20 62 79 20 45 78 70  ee formed by Exp
6560: 72 2e 70 4c 65 66 74 20 0a 2a 2a 20 61 6e 64 20  r.pLeft .** and 
6570: 45 78 70 72 2e 70 52 69 67 68 74 20 76 61 72 69  Expr.pRight vari
6580: 61 62 6c 65 73 20 28 62 75 74 20 6e 6f 74 20 66  ables (but not f
6590: 6f 72 20 61 6e 79 20 73 74 72 75 63 74 75 72 65  or any structure
65a0: 73 20 70 6f 69 6e 74 65 64 20 74 6f 20 6f 72 20  s pointed to or 
65b0: 0a 2a 2a 20 64 65 73 63 65 6e 64 65 64 20 66 72  .** descended fr
65c0: 6f 6d 20 74 68 65 20 45 78 70 72 2e 78 2e 70 4c  om the Expr.x.pL
65d0: 69 73 74 20 6f 72 20 45 78 70 72 2e 78 2e 70 53  ist or Expr.x.pS
65e0: 65 6c 65 63 74 20 76 61 72 69 61 62 6c 65 73 29  elect variables)
65f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
6600: 64 75 70 65 64 45 78 70 72 53 69 7a 65 28 45 78  dupedExprSize(Ex
6610: 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73  pr *p, int flags
6620: 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 20 3d  ){.  int nByte =
6630: 20 30 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20   0;.  if( p ){. 
6640: 20 20 20 6e 42 79 74 65 20 3d 20 64 75 70 65 64     nByte = duped
6650: 45 78 70 72 4e 6f 64 65 53 69 7a 65 28 70 2c 20  ExprNodeSize(p, 
6660: 66 6c 61 67 73 29 3b 0a 20 20 20 20 69 66 28 20  flags);.    if( 
6670: 66 6c 61 67 73 26 45 58 50 52 44 55 50 5f 52 45  flags&EXPRDUP_RE
6680: 44 55 43 45 20 29 7b 0a 20 20 20 20 20 20 6e 42  DUCE ){.      nB
6690: 79 74 65 20 2b 3d 20 64 75 70 65 64 45 78 70 72  yte += dupedExpr
66a0: 53 69 7a 65 28 70 2d 3e 70 4c 65 66 74 2c 20 66  Size(p->pLeft, f
66b0: 6c 61 67 73 29 20 2b 20 64 75 70 65 64 45 78 70  lags) + dupedExp
66c0: 72 53 69 7a 65 28 70 2d 3e 70 52 69 67 68 74 2c  rSize(p->pRight,
66d0: 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 7d 0a 20   flags);.    }. 
66e0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 42 79 74   }.  return nByt
66f0: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  e;.}../*.** This
6700: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 73 69 6d   function is sim
6710: 69 6c 61 72 20 74 6f 20 73 71 6c 69 74 65 33 45  ilar to sqlite3E
6720: 78 70 72 44 75 70 28 29 2c 20 65 78 63 65 70 74  xprDup(), except
6730: 20 74 68 61 74 20 69 66 20 70 7a 42 75 66 66 65   that if pzBuffe
6740: 72 20 0a 2a 2a 20 69 73 20 6e 6f 74 20 4e 55 4c  r .** is not NUL
6750: 4c 20 74 68 65 6e 20 2a 70 7a 42 75 66 66 65 72  L then *pzBuffer
6760: 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20 70   is assumed to p
6770: 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72  oint to a buffer
6780: 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 0a 2a   large enough .*
6790: 2a 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 63  * to store the c
67a0: 6f 70 79 20 6f 66 20 65 78 70 72 65 73 73 69 6f  opy of expressio
67b0: 6e 20 70 2c 20 74 68 65 20 63 6f 70 69 65 73 20  n p, the copies 
67c0: 6f 66 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 0a 2a  of p->u.zToken.*
67d0: 2a 20 28 69 66 20 61 70 70 6c 69 63 61 62 6c 65  * (if applicable
67e0: 29 2c 20 61 6e 64 20 74 68 65 20 63 6f 70 69 65  ), and the copie
67f0: 73 20 6f 66 20 74 68 65 20 70 2d 3e 70 4c 65 66  s of the p->pLef
6800: 74 20 61 6e 64 20 70 2d 3e 70 52 69 67 68 74 20  t and p->pRight 
6810: 65 78 70 72 65 73 73 69 6f 6e 73 2c 0a 2a 2a 20  expressions,.** 
6820: 69 66 20 61 6e 79 2e 20 42 65 66 6f 72 65 20 72  if any. Before r
6830: 65 74 75 72 6e 69 6e 67 2c 20 2a 70 7a 42 75 66  eturning, *pzBuf
6840: 66 65 72 20 69 73 20 73 65 74 20 74 6f 20 74 68  fer is set to th
6850: 65 20 66 69 72 73 74 20 62 79 74 65 20 70 61 73  e first byte pas
6860: 74 20 74 68 65 0a 2a 2a 20 70 6f 72 74 69 6f 6e  t the.** portion
6870: 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 63   of the buffer c
6880: 6f 70 69 65 64 20 69 6e 74 6f 20 62 79 20 74 68  opied into by th
6890: 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  is function..*/.
68a0: 73 74 61 74 69 63 20 45 78 70 72 20 2a 65 78 70  static Expr *exp
68b0: 72 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62  rDup(sqlite3 *db
68c0: 2c 20 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66  , Expr *p, int f
68d0: 6c 61 67 73 2c 20 75 38 20 2a 2a 70 7a 42 75 66  lags, u8 **pzBuf
68e0: 66 65 72 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e  fer){.  Expr *pN
68f0: 65 77 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ew = 0;         
6900: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6910: 56 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20  Value to return 
6920: 2a 2f 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  */.  if( p ){.  
6930: 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 52 65    const int isRe
6940: 64 75 63 65 64 20 3d 20 28 66 6c 61 67 73 26 45  duced = (flags&E
6950: 58 50 52 44 55 50 5f 52 45 44 55 43 45 29 3b 0a  XPRDUP_REDUCE);.
6960: 20 20 20 20 75 38 20 2a 7a 41 6c 6c 6f 63 3b 0a      u8 *zAlloc;.
6970: 20 20 20 20 75 33 32 20 73 74 61 74 69 63 46 6c      u32 staticFl
6980: 61 67 20 3d 20 30 3b 0a 0a 20 20 20 20 61 73 73  ag = 0;..    ass
6990: 65 72 74 28 20 70 7a 42 75 66 66 65 72 3d 3d 30  ert( pzBuffer==0
69a0: 20 7c 7c 20 69 73 52 65 64 75 63 65 64 20 29 3b   || isReduced );
69b0: 0a 0a 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20  ..    /* Figure 
69c0: 6f 75 74 20 77 68 65 72 65 20 74 6f 20 77 72 69  out where to wri
69d0: 74 65 20 74 68 65 20 6e 65 77 20 45 78 70 72 20  te the new Expr 
69e0: 73 74 72 75 63 74 75 72 65 2e 20 2a 2f 0a 20 20  structure. */.  
69f0: 20 20 69 66 28 20 70 7a 42 75 66 66 65 72 20 29    if( pzBuffer )
6a00: 7b 0a 20 20 20 20 20 20 7a 41 6c 6c 6f 63 20 3d  {.      zAlloc =
6a10: 20 2a 70 7a 42 75 66 66 65 72 3b 0a 20 20 20 20   *pzBuffer;.    
6a20: 20 20 73 74 61 74 69 63 46 6c 61 67 20 3d 20 45    staticFlag = E
6a30: 50 5f 53 74 61 74 69 63 3b 0a 20 20 20 20 7d 65  P_Static;.    }e
6a40: 6c 73 65 7b 0a 20 20 20 20 20 20 7a 41 6c 6c 6f  lse{.      zAllo
6a50: 63 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  c = sqlite3DbMal
6a60: 6c 6f 63 52 61 77 28 64 62 2c 20 64 75 70 65 64  locRaw(db, duped
6a70: 45 78 70 72 53 69 7a 65 28 70 2c 20 66 6c 61 67  ExprSize(p, flag
6a80: 73 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  s));.    }.    p
6a90: 4e 65 77 20 3d 20 28 45 78 70 72 20 2a 29 7a 41  New = (Expr *)zA
6aa0: 6c 6c 6f 63 3b 0a 0a 20 20 20 20 69 66 28 20 70  lloc;..    if( p
6ab0: 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  New ){.      /* 
6ac0: 53 65 74 20 6e 4e 65 77 53 69 7a 65 20 74 6f 20  Set nNewSize to 
6ad0: 74 68 65 20 73 69 7a 65 20 61 6c 6c 6f 63 61 74  the size allocat
6ae0: 65 64 20 66 6f 72 20 74 68 65 20 73 74 72 75 63  ed for the struc
6af0: 74 75 72 65 20 70 6f 69 6e 74 65 64 20 74 6f 0a  ture pointed to.
6b00: 20 20 20 20 20 20 2a 2a 20 62 79 20 70 4e 65 77        ** by pNew
6b10: 2e 20 54 68 69 73 20 69 73 20 65 69 74 68 65 72  . This is either
6b20: 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 2c 20   EXPR_FULLSIZE, 
6b30: 45 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45  EXPR_REDUCEDSIZE
6b40: 20 6f 72 0a 20 20 20 20 20 20 2a 2a 20 45 58 50   or.      ** EXP
6b50: 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 2e  R_TOKENONLYSIZE.
6b60: 20 6e 54 6f 6b 65 6e 20 69 73 20 73 65 74 20 74   nToken is set t
6b70: 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  o the number of 
6b80: 62 79 74 65 73 20 63 6f 6e 73 75 6d 65 64 0a 20  bytes consumed. 
6b90: 20 20 20 20 20 2a 2a 20 62 79 20 74 68 65 20 63       ** by the c
6ba0: 6f 70 79 20 6f 66 20 74 68 65 20 70 2d 3e 75 2e  opy of the p->u.
6bb0: 7a 54 6f 6b 65 6e 20 73 74 72 69 6e 67 20 28 69  zToken string (i
6bc0: 66 20 61 6e 79 29 2e 0a 20 20 20 20 20 20 2a 2f  f any)..      */
6bd0: 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 75 6e 73  .      const uns
6be0: 69 67 6e 65 64 20 6e 53 74 72 75 63 74 53 69 7a  igned nStructSiz
6bf0: 65 20 3d 20 64 75 70 65 64 45 78 70 72 53 74 72  e = dupedExprStr
6c00: 75 63 74 53 69 7a 65 28 70 2c 20 66 6c 61 67 73  uctSize(p, flags
6c10: 29 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 69  );.      const i
6c20: 6e 74 20 6e 4e 65 77 53 69 7a 65 20 3d 20 6e 53  nt nNewSize = nS
6c30: 74 72 75 63 74 53 69 7a 65 20 26 20 30 78 66 66  tructSize & 0xff
6c40: 66 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 54 6f  f;.      int nTo
6c50: 6b 65 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 21  ken;.      if( !
6c60: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
6c70: 70 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20  p, EP_IntValue) 
6c80: 26 26 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 29  && p->u.zToken )
6c90: 7b 0a 20 20 20 20 20 20 20 20 6e 54 6f 6b 65 6e  {.        nToken
6ca0: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
6cb0: 33 30 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 20  30(p->u.zToken) 
6cc0: 2b 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  + 1;.      }else
6cd0: 7b 0a 20 20 20 20 20 20 20 20 6e 54 6f 6b 65 6e  {.        nToken
6ce0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
6cf0: 20 20 20 20 69 66 28 20 69 73 52 65 64 75 63 65      if( isReduce
6d00: 64 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  d ){.        ass
6d10: 65 72 74 28 20 45 78 70 72 48 61 73 50 72 6f 70  ert( ExprHasProp
6d20: 65 72 74 79 28 70 2c 20 45 50 5f 52 65 64 75 63  erty(p, EP_Reduc
6d30: 65 64 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ed)==0 );.      
6d40: 20 20 6d 65 6d 63 70 79 28 7a 41 6c 6c 6f 63 2c    memcpy(zAlloc,
6d50: 20 70 2c 20 6e 4e 65 77 53 69 7a 65 29 3b 0a 20   p, nNewSize);. 
6d60: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
6d70: 20 20 20 20 69 6e 74 20 6e 53 69 7a 65 20 3d 20      int nSize = 
6d80: 65 78 70 72 53 74 72 75 63 74 53 69 7a 65 28 70  exprStructSize(p
6d90: 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  );.        memcp
6da0: 79 28 7a 41 6c 6c 6f 63 2c 20 70 2c 20 6e 53 69  y(zAlloc, p, nSi
6db0: 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  ze);.        mem
6dc0: 73 65 74 28 26 7a 41 6c 6c 6f 63 5b 6e 53 69 7a  set(&zAlloc[nSiz
6dd0: 65 5d 2c 20 30 2c 20 45 58 50 52 5f 46 55 4c 4c  e], 0, EXPR_FULL
6de0: 53 49 5a 45 2d 6e 53 69 7a 65 29 3b 0a 20 20 20  SIZE-nSize);.   
6df0: 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 53     }..      /* S
6e00: 65 74 20 74 68 65 20 45 50 5f 52 65 64 75 63 65  et the EP_Reduce
6e10: 64 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 2c  d, EP_TokenOnly,
6e20: 20 61 6e 64 20 45 50 5f 53 74 61 74 69 63 20 66   and EP_Static f
6e30: 6c 61 67 73 20 61 70 70 72 6f 70 72 69 61 74 65  lags appropriate
6e40: 6c 79 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65  ly. */.      pNe
6e50: 77 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 28 45 50  w->flags &= ~(EP
6e60: 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65  _Reduced|EP_Toke
6e70: 6e 4f 6e 6c 79 7c 45 50 5f 53 74 61 74 69 63 7c  nOnly|EP_Static|
6e80: 45 50 5f 4d 65 6d 54 6f 6b 65 6e 29 3b 0a 20 20  EP_MemToken);.  
6e90: 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20      pNew->flags 
6ea0: 7c 3d 20 6e 53 74 72 75 63 74 53 69 7a 65 20 26  |= nStructSize &
6eb0: 20 28 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f   (EP_Reduced|EP_
6ec0: 54 6f 6b 65 6e 4f 6e 6c 79 29 3b 0a 20 20 20 20  TokenOnly);.    
6ed0: 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d    pNew->flags |=
6ee0: 20 73 74 61 74 69 63 46 6c 61 67 3b 0a 0a 20 20   staticFlag;..  
6ef0: 20 20 20 20 2f 2a 20 43 6f 70 79 20 74 68 65 20      /* Copy the 
6f00: 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 73 74 72 69  p->u.zToken stri
6f10: 6e 67 2c 20 69 66 20 61 6e 79 2e 20 2a 2f 0a 20  ng, if any. */. 
6f20: 20 20 20 20 20 69 66 28 20 6e 54 6f 6b 65 6e 20       if( nToken 
6f30: 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
6f40: 2a 7a 54 6f 6b 65 6e 20 3d 20 70 4e 65 77 2d 3e  *zToken = pNew->
6f50: 75 2e 7a 54 6f 6b 65 6e 20 3d 20 28 63 68 61 72  u.zToken = (char
6f60: 2a 29 26 7a 41 6c 6c 6f 63 5b 6e 4e 65 77 53 69  *)&zAlloc[nNewSi
6f70: 7a 65 5d 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  ze];.        mem
6f80: 63 70 79 28 7a 54 6f 6b 65 6e 2c 20 70 2d 3e 75  cpy(zToken, p->u
6f90: 2e 7a 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 29  .zToken, nToken)
6fa0: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
6fb0: 20 69 66 28 20 30 3d 3d 28 28 70 2d 3e 66 6c 61   if( 0==((p->fla
6fc0: 67 73 7c 70 4e 65 77 2d 3e 66 6c 61 67 73 29 20  gs|pNew->flags) 
6fd0: 26 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20  & EP_TokenOnly) 
6fe0: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 69  ){.        /* Fi
6ff0: 6c 6c 20 69 6e 20 74 68 65 20 70 4e 65 77 2d 3e  ll in the pNew->
7000: 78 2e 70 53 65 6c 65 63 74 20 6f 72 20 70 4e 65  x.pSelect or pNe
7010: 77 2d 3e 78 2e 70 4c 69 73 74 20 6d 65 6d 62 65  w->x.pList membe
7020: 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66  r. */.        if
7030: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
7040: 79 28 70 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  y(p, EP_xIsSelec
7050: 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  t) ){.          
7060: 70 4e 65 77 2d 3e 78 2e 70 53 65 6c 65 63 74 20  pNew->x.pSelect 
7070: 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  = sqlite3SelectD
7080: 75 70 28 64 62 2c 20 70 2d 3e 78 2e 70 53 65 6c  up(db, p->x.pSel
7090: 65 63 74 2c 20 69 73 52 65 64 75 63 65 64 29 3b  ect, isReduced);
70a0: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
70b0: 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
70c0: 78 2e 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65  x.pList = sqlite
70d0: 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c  3ExprListDup(db,
70e0: 20 70 2d 3e 78 2e 70 4c 69 73 74 2c 20 69 73 52   p->x.pList, isR
70f0: 65 64 75 63 65 64 29 3b 0a 20 20 20 20 20 20 20  educed);.       
7100: 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20   }.      }..    
7110: 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 70 4e 65    /* Fill in pNe
7120: 77 2d 3e 70 4c 65 66 74 20 61 6e 64 20 70 4e 65  w->pLeft and pNe
7130: 77 2d 3e 70 52 69 67 68 74 2e 20 2a 2f 0a 20 20  w->pRight. */.  
7140: 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50      if( ExprHasP
7150: 72 6f 70 65 72 74 79 28 70 4e 65 77 2c 20 45 50  roperty(pNew, EP
7160: 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65  _Reduced|EP_Toke
7170: 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20  nOnly) ){.      
7180: 20 20 7a 41 6c 6c 6f 63 20 2b 3d 20 64 75 70 65    zAlloc += dupe
7190: 64 45 78 70 72 4e 6f 64 65 53 69 7a 65 28 70 2c  dExprNodeSize(p,
71a0: 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 20   flags);.       
71b0: 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
71c0: 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 52 65  erty(pNew, EP_Re
71d0: 64 75 63 65 64 29 20 29 7b 0a 20 20 20 20 20 20  duced) ){.      
71e0: 20 20 20 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20      pNew->pLeft 
71f0: 3d 20 65 78 70 72 44 75 70 28 64 62 2c 20 70 2d  = exprDup(db, p-
7200: 3e 70 4c 65 66 74 2c 20 45 58 50 52 44 55 50 5f  >pLeft, EXPRDUP_
7210: 52 45 44 55 43 45 2c 20 26 7a 41 6c 6c 6f 63 29  REDUCE, &zAlloc)
7220: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77  ;.          pNew
7230: 2d 3e 70 52 69 67 68 74 20 3d 20 65 78 70 72 44  ->pRight = exprD
7240: 75 70 28 64 62 2c 20 70 2d 3e 70 52 69 67 68 74  up(db, p->pRight
7250: 2c 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 45  , EXPRDUP_REDUCE
7260: 2c 20 26 7a 41 6c 6c 6f 63 29 3b 0a 20 20 20 20  , &zAlloc);.    
7270: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
7280: 28 20 70 7a 42 75 66 66 65 72 20 29 7b 0a 20 20  ( pzBuffer ){.  
7290: 20 20 20 20 20 20 20 20 2a 70 7a 42 75 66 66 65          *pzBuffe
72a0: 72 20 3d 20 7a 41 6c 6c 6f 63 3b 0a 20 20 20 20  r = zAlloc;.    
72b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
72c0: 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  e{.        if( !
72d0: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
72e0: 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29  p, EP_TokenOnly)
72f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e   ){.          pN
7300: 65 77 2d 3e 70 4c 65 66 74 20 3d 20 73 71 6c 69  ew->pLeft = sqli
7310: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
7320: 2d 3e 70 4c 65 66 74 2c 20 30 29 3b 0a 20 20 20  ->pLeft, 0);.   
7330: 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 52 69         pNew->pRi
7340: 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ght = sqlite3Exp
7350: 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 52 69 67  rDup(db, p->pRig
7360: 68 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ht, 0);.        
7370: 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 7d  }.      }..    }
7380: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e  .  }.  return pN
7390: 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65  ew;.}../*.** Cre
73a0: 61 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61  ate and return a
73b0: 20 64 65 65 70 20 63 6f 70 79 20 6f 66 20 74 68   deep copy of th
73c0: 65 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20  e object passed 
73d0: 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 0a 2a  as the second .*
73e0: 2a 20 61 72 67 75 6d 65 6e 74 2e 20 49 66 20 61  * argument. If a
73f0: 6e 20 4f 4f 4d 20 63 6f 6e 64 69 74 69 6f 6e 20  n OOM condition 
7400: 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20  is encountered, 
7410: 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64  NULL is returned
7420: 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 62 2d 3e  .** and the db->
7430: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61  mallocFailed fla
7440: 67 20 73 65 74 2e 0a 2a 2f 0a 23 69 66 6e 64 65  g set..*/.#ifnde
7450: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54  f SQLITE_OMIT_CT
7460: 45 0a 73 74 61 74 69 63 20 57 69 74 68 20 2a 77  E.static With *w
7470: 69 74 68 44 75 70 28 73 71 6c 69 74 65 33 20 2a  ithDup(sqlite3 *
7480: 64 62 2c 20 57 69 74 68 20 2a 70 29 7b 0a 20 20  db, With *p){.  
7490: 57 69 74 68 20 2a 70 52 65 74 20 3d 20 30 3b 0a  With *pRet = 0;.
74a0: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69    if( p ){.    i
74b0: 6e 74 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f  nt nByte = sizeo
74c0: 66 28 2a 70 29 20 2b 20 73 69 7a 65 6f 66 28 70  f(*p) + sizeof(p
74d0: 2d 3e 61 5b 30 5d 29 20 2a 20 28 70 2d 3e 6e 43  ->a[0]) * (p->nC
74e0: 74 65 2d 31 29 3b 0a 20 20 20 20 70 52 65 74 20  te-1);.    pRet 
74f0: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
7500: 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74 65 29  cZero(db, nByte)
7510: 3b 0a 20 20 20 20 69 66 28 20 70 52 65 74 20 29  ;.    if( pRet )
7520: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  {.      int i;. 
7530: 20 20 20 20 20 70 52 65 74 2d 3e 6e 43 74 65 20       pRet->nCte 
7540: 3d 20 70 2d 3e 6e 43 74 65 3b 0a 20 20 20 20 20  = p->nCte;.     
7550: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
7560: 43 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Cte; i++){.     
7570: 20 20 20 70 52 65 74 2d 3e 61 5b 69 5d 2e 70 53     pRet->a[i].pS
7580: 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53  elect = sqlite3S
7590: 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 2d 3e  electDup(db, p->
75a0: 61 5b 69 5d 2e 70 53 65 6c 65 63 74 2c 20 30 29  a[i].pSelect, 0)
75b0: 3b 0a 20 20 20 20 20 20 20 20 70 52 65 74 2d 3e  ;.        pRet->
75c0: 61 5b 69 5d 2e 70 43 6f 6c 73 20 3d 20 73 71 6c  a[i].pCols = sql
75d0: 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
75e0: 64 62 2c 20 70 2d 3e 61 5b 69 5d 2e 70 43 6f 6c  db, p->a[i].pCol
75f0: 73 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70  s, 0);.        p
7600: 52 65 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20  Ret->a[i].zName 
7610: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
7620: 70 28 64 62 2c 20 70 2d 3e 61 5b 69 5d 2e 7a 4e  p(db, p->a[i].zN
7630: 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ame);.      }.  
7640: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
7650: 20 70 52 65 74 3b 0a 7d 0a 23 65 6c 73 65 0a 23   pRet;.}.#else.#
7660: 20 64 65 66 69 6e 65 20 77 69 74 68 44 75 70 28   define withDup(
7670: 78 2c 79 29 20 30 0a 23 65 6e 64 69 66 0a 0a 2f  x,y) 0.#endif../
7680: 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
7690: 6e 67 20 67 72 6f 75 70 20 6f 66 20 72 6f 75 74  ng group of rout
76a0: 69 6e 65 73 20 6d 61 6b 65 20 64 65 65 70 20 63  ines make deep c
76b0: 6f 70 69 65 73 20 6f 66 20 65 78 70 72 65 73 73  opies of express
76c0: 69 6f 6e 73 2c 0a 2a 2a 20 65 78 70 72 65 73 73  ions,.** express
76d0: 69 6f 6e 20 6c 69 73 74 73 2c 20 49 44 20 6c 69  ion lists, ID li
76e0: 73 74 73 2c 20 61 6e 64 20 73 65 6c 65 63 74 20  sts, and select 
76f0: 73 74 61 74 65 6d 65 6e 74 73 2e 20 20 54 68 65  statements.  The
7700: 20 63 6f 70 69 65 73 20 63 61 6e 0a 2a 2a 20 62   copies can.** b
7710: 65 20 64 65 6c 65 74 65 64 20 28 62 79 20 62 65  e deleted (by be
7720: 69 6e 67 20 70 61 73 73 65 64 20 74 6f 20 74 68  ing passed to th
7730: 65 69 72 20 72 65 73 70 65 63 74 69 76 65 20 2e  eir respective .
7740: 2e 2e 44 65 6c 65 74 65 28 29 20 72 6f 75 74 69  ..Delete() routi
7750: 6e 65 73 29 0a 2a 2a 20 77 69 74 68 6f 75 74 20  nes).** without 
7760: 65 66 66 65 63 74 69 6e 67 20 74 68 65 20 6f 72  effecting the or
7770: 69 67 69 6e 61 6c 73 2e 0a 2a 2a 0a 2a 2a 20 54  iginals..**.** T
7780: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  he expression li
7790: 73 74 2c 20 49 44 2c 20 61 6e 64 20 73 6f 75 72  st, ID, and sour
77a0: 63 65 20 6c 69 73 74 73 20 72 65 74 75 72 6e 20  ce lists return 
77b0: 62 79 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  by sqlite3ExprLi
77c0: 73 74 44 75 70 28 29 2c 0a 2a 2a 20 73 71 6c 69  stDup(),.** sqli
77d0: 74 65 33 49 64 4c 69 73 74 44 75 70 28 29 2c 20  te3IdListDup(), 
77e0: 61 6e 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69  and sqlite3SrcLi
77f0: 73 74 44 75 70 28 29 20 63 61 6e 20 6e 6f 74 20  stDup() can not 
7800: 62 65 20 66 75 72 74 68 65 72 20 65 78 70 61 6e  be further expan
7810: 64 65 64 20 0a 2a 2a 20 62 79 20 73 75 62 73 65  ded .** by subse
7820: 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20 73  quent calls to s
7830: 71 6c 69 74 65 2a 4c 69 73 74 41 70 70 65 6e 64  qlite*ListAppend
7840: 28 29 20 72 6f 75 74 69 6e 65 73 2e 0a 2a 2a 0a  () routines..**.
7850: 2a 2a 20 41 6e 79 20 74 61 62 6c 65 73 20 74 68  ** Any tables th
7860: 61 74 20 74 68 65 20 53 72 63 4c 69 73 74 20 6d  at the SrcList m
7870: 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 61 72  ight point to ar
7880: 65 20 6e 6f 74 20 64 75 70 6c 69 63 61 74 65 64  e not duplicated
7890: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c 61 67  ..**.** The flag
78a0: 73 20 70 61 72 61 6d 65 74 65 72 20 63 6f 6e 74  s parameter cont
78b0: 61 69 6e 73 20 61 20 63 6f 6d 62 69 6e 61 74 69  ains a combinati
78c0: 6f 6e 20 6f 66 20 74 68 65 20 45 58 50 52 44 55  on of the EXPRDU
78d0: 50 5f 58 58 58 20 66 6c 61 67 73 2e 0a 2a 2a 20  P_XXX flags..** 
78e0: 49 66 20 74 68 65 20 45 58 50 52 44 55 50 5f 52  If the EXPRDUP_R
78f0: 45 44 55 43 45 20 66 6c 61 67 20 69 73 20 73 65  EDUCE flag is se
7900: 74 2c 20 74 68 65 6e 20 74 68 65 20 73 74 72 75  t, then the stru
7910: 63 74 75 72 65 20 72 65 74 75 72 6e 65 64 20 69  cture returned i
7920: 73 20 61 0a 2a 2a 20 74 72 75 6e 63 61 74 65 64  s a.** truncated
7930: 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20   version of the 
7940: 75 73 75 61 6c 20 45 78 70 72 20 73 74 72 75 63  usual Expr struc
7950: 74 75 72 65 20 74 68 61 74 20 77 69 6c 6c 20 62  ture that will b
7960: 65 20 73 74 6f 72 65 64 20 61 73 0a 2a 2a 20 70  e stored as.** p
7970: 61 72 74 20 6f 66 20 74 68 65 20 69 6e 2d 6d 65  art of the in-me
7980: 6d 6f 72 79 20 72 65 70 72 65 73 65 6e 74 61 74  mory representat
7990: 69 6f 6e 20 6f 66 20 74 68 65 20 64 61 74 61 62  ion of the datab
79a0: 61 73 65 20 73 63 68 65 6d 61 2e 0a 2a 2f 0a 45  ase schema..*/.E
79b0: 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72  xpr *sqlite3Expr
79c0: 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  Dup(sqlite3 *db,
79d0: 20 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c   Expr *p, int fl
79e0: 61 67 73 29 7b 0a 20 20 72 65 74 75 72 6e 20 65  ags){.  return e
79f0: 78 70 72 44 75 70 28 64 62 2c 20 70 2c 20 66 6c  xprDup(db, p, fl
7a00: 61 67 73 2c 20 30 29 3b 0a 7d 0a 45 78 70 72 4c  ags, 0);.}.ExprL
7a10: 69 73 74 20 2a 73 71 6c 69 74 65 33 45 78 70 72  ist *sqlite3Expr
7a20: 4c 69 73 74 44 75 70 28 73 71 6c 69 74 65 33 20  ListDup(sqlite3 
7a30: 2a 64 62 2c 20 45 78 70 72 4c 69 73 74 20 2a 70  *db, ExprList *p
7a40: 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20  , int flags){.  
7a50: 45 78 70 72 4c 69 73 74 20 2a 70 4e 65 77 3b 0a  ExprList *pNew;.
7a60: 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
7a70: 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 2c 20 2a  t_item *pItem, *
7a80: 70 4f 6c 64 49 74 65 6d 3b 0a 20 20 69 6e 74 20  pOldItem;.  int 
7a90: 69 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  i;.  if( p==0 ) 
7aa0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77  return 0;.  pNew
7ab0: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
7ac0: 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66  ocRaw(db, sizeof
7ad0: 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20 69 66 28  (*pNew) );.  if(
7ae0: 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72   pNew==0 ) retur
7af0: 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e 45 78  n 0;.  pNew->nEx
7b00: 70 72 20 3d 20 69 20 3d 20 70 2d 3e 6e 45 78 70  pr = i = p->nExp
7b10: 72 3b 0a 20 20 69 66 28 20 28 66 6c 61 67 73 20  r;.  if( (flags 
7b20: 26 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 45  & EXPRDUP_REDUCE
7b30: 29 3d 3d 30 20 29 20 66 6f 72 28 69 3d 31 3b 20  )==0 ) for(i=1; 
7b40: 69 3c 70 2d 3e 6e 45 78 70 72 3b 20 69 2b 3d 69  i<p->nExpr; i+=i
7b50: 29 7b 7d 0a 20 20 70 4e 65 77 2d 3e 61 20 3d 20  ){}.  pNew->a = 
7b60: 70 49 74 65 6d 20 3d 20 73 71 6c 69 74 65 33 44  pItem = sqlite3D
7b70: 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 20  bMallocRaw(db,  
7b80: 69 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d  i*sizeof(p->a[0]
7b90: 29 20 29 3b 0a 20 20 69 66 28 20 70 49 74 65 6d  ) );.  if( pItem
7ba0: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
7bb0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4e 65  e3DbFree(db, pNe
7bc0: 77 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  w);.    return 0
7bd0: 3b 0a 20 20 7d 20 0a 20 20 70 4f 6c 64 49 74 65  ;.  } .  pOldIte
7be0: 6d 20 3d 20 70 2d 3e 61 3b 0a 20 20 66 6f 72 28  m = p->a;.  for(
7bf0: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 45 78 70 72 3b  i=0; i<p->nExpr;
7c00: 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 2c 20 70   i++, pItem++, p
7c10: 4f 6c 64 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  OldItem++){.    
7c20: 45 78 70 72 20 2a 70 4f 6c 64 45 78 70 72 20 3d  Expr *pOldExpr =
7c30: 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 45 78 70 72   pOldItem->pExpr
7c40: 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 70 45 78  ;.    pItem->pEx
7c50: 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pr = sqlite3Expr
7c60: 44 75 70 28 64 62 2c 20 70 4f 6c 64 45 78 70 72  Dup(db, pOldExpr
7c70: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 49  , flags);.    pI
7c80: 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c  tem->zName = sql
7c90: 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
7ca0: 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65   pOldItem->zName
7cb0: 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 53  );.    pItem->zS
7cc0: 70 61 6e 20 3d 20 73 71 6c 69 74 65 33 44 62 53  pan = sqlite3DbS
7cd0: 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74  trDup(db, pOldIt
7ce0: 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a 20 20 20 20  em->zSpan);.    
7cf0: 70 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72  pItem->sortOrder
7d00: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 73 6f 72   = pOldItem->sor
7d10: 74 4f 72 64 65 72 3b 0a 20 20 20 20 70 49 74 65  tOrder;.    pIte
7d20: 6d 2d 3e 64 6f 6e 65 20 3d 20 30 3b 0a 20 20 20  m->done = 0;.   
7d30: 20 70 49 74 65 6d 2d 3e 62 53 70 61 6e 49 73 54   pItem->bSpanIsT
7d40: 61 62 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 62  ab = pOldItem->b
7d50: 53 70 61 6e 49 73 54 61 62 3b 0a 20 20 20 20 70  SpanIsTab;.    p
7d60: 49 74 65 6d 2d 3e 75 20 3d 20 70 4f 6c 64 49 74  Item->u = pOldIt
7d70: 65 6d 2d 3e 75 3b 0a 20 20 7d 0a 20 20 72 65 74  em->u;.  }.  ret
7d80: 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a  urn pNew;.}../*.
7d90: 2a 2a 20 49 66 20 63 75 72 73 6f 72 73 2c 20 74  ** If cursors, t
7da0: 72 69 67 67 65 72 73 2c 20 76 69 65 77 73 20 61  riggers, views a
7db0: 6e 64 20 73 75 62 71 75 65 72 69 65 73 20 61 72  nd subqueries ar
7dc0: 65 20 61 6c 6c 20 6f 6d 69 74 74 65 64 20 66 72  e all omitted fr
7dd0: 6f 6d 0a 2a 2a 20 74 68 65 20 62 75 69 6c 64 2c  om.** the build,
7de0: 20 74 68 65 6e 20 6e 6f 6e 65 20 6f 66 20 74 68   then none of th
7df0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74  e following rout
7e00: 69 6e 65 73 2c 20 65 78 63 65 70 74 20 66 6f 72  ines, except for
7e10: 20 0a 2a 2a 20 73 71 6c 69 74 65 33 53 65 6c 65   .** sqlite3Sele
7e20: 63 74 44 75 70 28 29 2c 20 63 61 6e 20 62 65 20  ctDup(), can be 
7e30: 63 61 6c 6c 65 64 2e 20 73 71 6c 69 74 65 33 53  called. sqlite3S
7e40: 65 6c 65 63 74 44 75 70 28 29 20 69 73 20 73 6f  electDup() is so
7e50: 6d 65 74 69 6d 65 73 0a 2a 2a 20 63 61 6c 6c 65  metimes.** calle
7e60: 64 20 77 69 74 68 20 61 20 4e 55 4c 4c 20 61 72  d with a NULL ar
7e70: 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 23 69 66 20 21  gument..*/.#if !
7e80: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
7e90: 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65  MIT_VIEW) || !de
7ea0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
7eb0: 54 5f 54 52 49 47 47 45 52 29 20 5c 0a 20 7c 7c  T_TRIGGER) \. ||
7ec0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
7ed0: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 0a  _OMIT_SUBQUERY).
7ee0: 53 72 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 33  SrcList *sqlite3
7ef0: 53 72 63 4c 69 73 74 44 75 70 28 73 71 6c 69 74  SrcListDup(sqlit
7f00: 65 33 20 2a 64 62 2c 20 53 72 63 4c 69 73 74 20  e3 *db, SrcList 
7f10: 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a  *p, int flags){.
7f20: 20 20 53 72 63 4c 69 73 74 20 2a 70 4e 65 77 3b    SrcList *pNew;
7f30: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
7f40: 6e 42 79 74 65 3b 0a 20 20 69 66 28 20 70 3d 3d  nByte;.  if( p==
7f50: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
7f60: 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a  nByte = sizeof(*
7f70: 70 29 20 2b 20 28 70 2d 3e 6e 53 72 63 3e 30 20  p) + (p->nSrc>0 
7f80: 3f 20 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d  ? sizeof(p->a[0]
7f90: 29 20 2a 20 28 70 2d 3e 6e 53 72 63 2d 31 29 20  ) * (p->nSrc-1) 
7fa0: 3a 20 30 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73  : 0);.  pNew = s
7fb0: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
7fc0: 77 28 64 62 2c 20 6e 42 79 74 65 20 29 3b 0a 20  w(db, nByte );. 
7fd0: 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72   if( pNew==0 ) r
7fe0: 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d  eturn 0;.  pNew-
7ff0: 3e 6e 53 72 63 20 3d 20 70 4e 65 77 2d 3e 6e 41  >nSrc = pNew->nA
8000: 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 53 72 63 3b 0a  lloc = p->nSrc;.
8010: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
8020: 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nSrc; i++){.    
8030: 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
8040: 74 65 6d 20 2a 70 4e 65 77 49 74 65 6d 20 3d 20  tem *pNewItem = 
8050: 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b 0a 20 20 20  &pNew->a[i];.   
8060: 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
8070: 69 74 65 6d 20 2a 70 4f 6c 64 49 74 65 6d 20 3d  item *pOldItem =
8080: 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 54   &p->a[i];.    T
8090: 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20  able *pTab;.    
80a0: 70 4e 65 77 49 74 65 6d 2d 3e 70 53 63 68 65 6d  pNewItem->pSchem
80b0: 61 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 53  a = pOldItem->pS
80c0: 63 68 65 6d 61 3b 0a 20 20 20 20 70 4e 65 77 49  chema;.    pNewI
80d0: 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d  tem->zDatabase =
80e0: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
80f0: 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a  (db, pOldItem->z
8100: 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20 70  Database);.    p
8110: 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d  NewItem->zName =
8120: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
8130: 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a  (db, pOldItem->z
8140: 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77 49  Name);.    pNewI
8150: 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 73 71  tem->zAlias = sq
8160: 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
8170: 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 41 6c 69  , pOldItem->zAli
8180: 61 73 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  as);.    pNewIte
8190: 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20 3d 20 70 4f  m->jointype = pO
81a0: 6c 64 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65  ldItem->jointype
81b0: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
81c0: 69 43 75 72 73 6f 72 20 3d 20 70 4f 6c 64 49 74  iCursor = pOldIt
81d0: 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20  em->iCursor;.   
81e0: 20 70 4e 65 77 49 74 65 6d 2d 3e 61 64 64 72 46   pNewItem->addrF
81f0: 69 6c 6c 53 75 62 20 3d 20 70 4f 6c 64 49 74 65  illSub = pOldIte
8200: 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 3b 0a  m->addrFillSub;.
8210: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 72 65      pNewItem->re
8220: 67 52 65 74 75 72 6e 20 3d 20 70 4f 6c 64 49 74  gReturn = pOldIt
8230: 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 3b 0a 20  em->regReturn;. 
8240: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 69 73 43     pNewItem->isC
8250: 6f 72 72 65 6c 61 74 65 64 20 3d 20 70 4f 6c 64  orrelated = pOld
8260: 49 74 65 6d 2d 3e 69 73 43 6f 72 72 65 6c 61 74  Item->isCorrelat
8270: 65 64 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  ed;.    pNewItem
8280: 2d 3e 76 69 61 43 6f 72 6f 75 74 69 6e 65 20 3d  ->viaCoroutine =
8290: 20 70 4f 6c 64 49 74 65 6d 2d 3e 76 69 61 43 6f   pOldItem->viaCo
82a0: 72 6f 75 74 69 6e 65 3b 0a 20 20 20 20 70 4e 65  routine;.    pNe
82b0: 77 49 74 65 6d 2d 3e 69 73 52 65 63 75 72 73 69  wItem->isRecursi
82c0: 76 65 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69  ve = pOldItem->i
82d0: 73 52 65 63 75 72 73 69 76 65 3b 0a 20 20 20 20  sRecursive;.    
82e0: 70 4e 65 77 49 74 65 6d 2d 3e 7a 49 6e 64 65 78  pNewItem->zIndex
82f0: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
8300: 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d  up(db, pOldItem-
8310: 3e 7a 49 6e 64 65 78 29 3b 0a 20 20 20 20 70 4e  >zIndex);.    pN
8320: 65 77 49 74 65 6d 2d 3e 6e 6f 74 49 6e 64 65 78  ewItem->notIndex
8330: 65 64 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 6e  ed = pOldItem->n
8340: 6f 74 49 6e 64 65 78 65 64 3b 0a 20 20 20 20 70  otIndexed;.    p
8350: 4e 65 77 49 74 65 6d 2d 3e 70 49 6e 64 65 78 20  NewItem->pIndex 
8360: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 49 6e 64  = pOldItem->pInd
8370: 65 78 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 70  ex;.    pTab = p
8380: 4e 65 77 49 74 65 6d 2d 3e 70 54 61 62 20 3d 20  NewItem->pTab = 
8390: 70 4f 6c 64 49 74 65 6d 2d 3e 70 54 61 62 3b 0a  pOldItem->pTab;.
83a0: 20 20 20 20 69 66 28 20 70 54 61 62 20 29 7b 0a      if( pTab ){.
83b0: 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 52 65 66        pTab->nRef
83c0: 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e  ++;.    }.    pN
83d0: 65 77 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20  ewItem->pSelect 
83e0: 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  = sqlite3SelectD
83f0: 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d  up(db, pOldItem-
8400: 3e 70 53 65 6c 65 63 74 2c 20 66 6c 61 67 73 29  >pSelect, flags)
8410: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
8420: 70 4f 6e 20 3d 20 73 71 6c 69 74 65 33 45 78 70  pOn = sqlite3Exp
8430: 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65  rDup(db, pOldIte
8440: 6d 2d 3e 70 4f 6e 2c 20 66 6c 61 67 73 29 3b 0a  m->pOn, flags);.
8450: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 55      pNewItem->pU
8460: 73 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 49 64  sing = sqlite3Id
8470: 4c 69 73 74 44 75 70 28 64 62 2c 20 70 4f 6c 64  ListDup(db, pOld
8480: 49 74 65 6d 2d 3e 70 55 73 69 6e 67 29 3b 0a 20  Item->pUsing);. 
8490: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 63 6f 6c     pNewItem->col
84a0: 55 73 65 64 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  Used = pOldItem-
84b0: 3e 63 6f 6c 55 73 65 64 3b 0a 20 20 7d 0a 20 20  >colUsed;.  }.  
84c0: 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 49  return pNew;.}.I
84d0: 64 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 49 64  dList *sqlite3Id
84e0: 4c 69 73 74 44 75 70 28 73 71 6c 69 74 65 33 20  ListDup(sqlite3 
84f0: 2a 64 62 2c 20 49 64 4c 69 73 74 20 2a 70 29 7b  *db, IdList *p){
8500: 0a 20 20 49 64 4c 69 73 74 20 2a 70 4e 65 77 3b  .  IdList *pNew;
8510: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
8520: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  p==0 ) return 0;
8530: 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  .  pNew = sqlite
8540: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c  3DbMallocRaw(db,
8550: 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29   sizeof(*pNew) )
8560: 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20  ;.  if( pNew==0 
8570: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e  ) return 0;.  pN
8580: 65 77 2d 3e 6e 49 64 20 3d 20 70 2d 3e 6e 49 64  ew->nId = p->nId
8590: 3b 0a 20 20 70 4e 65 77 2d 3e 61 20 3d 20 73 71  ;.  pNew->a = sq
85a0: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
85b0: 28 64 62 2c 20 70 2d 3e 6e 49 64 2a 73 69 7a 65  (db, p->nId*size
85c0: 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20  of(p->a[0]) );. 
85d0: 20 69 66 28 20 70 4e 65 77 2d 3e 61 3d 3d 30 20   if( pNew->a==0 
85e0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  ){.    sqlite3Db
85f0: 46 72 65 65 28 64 62 2c 20 70 4e 65 77 29 3b 0a  Free(db, pNew);.
8600: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
8610: 7d 0a 20 20 2f 2a 20 4e 6f 74 65 20 74 68 61 74  }.  /* Note that
8620: 20 62 65 63 61 75 73 65 20 74 68 65 20 73 69 7a   because the siz
8630: 65 20 6f 66 20 74 68 65 20 61 6c 6c 6f 63 61 74  e of the allocat
8640: 69 6f 6e 20 66 6f 72 20 70 2d 3e 61 5b 5d 20 69  ion for p->a[] i
8650: 73 20 6e 6f 74 0a 20 20 2a 2a 20 6e 65 63 65 73  s not.  ** neces
8660: 73 61 72 69 6c 79 20 61 20 70 6f 77 65 72 20 6f  sarily a power o
8670: 66 20 74 77 6f 2c 20 73 71 6c 69 74 65 33 49 64  f two, sqlite3Id
8680: 4c 69 73 74 41 70 70 65 6e 64 28 29 20 6d 61 79  ListAppend() may
8690: 20 6e 6f 74 20 62 65 20 63 61 6c 6c 65 64 0a 20   not be called. 
86a0: 20 2a 2a 20 6f 6e 20 74 68 65 20 64 75 70 6c 69   ** on the dupli
86b0: 63 61 74 65 20 63 72 65 61 74 65 64 20 62 79 20  cate created by 
86c0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 2a  this function. *
86d0: 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  /.  for(i=0; i<p
86e0: 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nId; i++){.   
86f0: 20 73 74 72 75 63 74 20 49 64 4c 69 73 74 5f 69   struct IdList_i
8700: 74 65 6d 20 2a 70 4e 65 77 49 74 65 6d 20 3d 20  tem *pNewItem = 
8710: 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b 0a 20 20 20  &pNew->a[i];.   
8720: 20 73 74 72 75 63 74 20 49 64 4c 69 73 74 5f 69   struct IdList_i
8730: 74 65 6d 20 2a 70 4f 6c 64 49 74 65 6d 20 3d 20  tem *pOldItem = 
8740: 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 70 4e  &p->a[i];.    pN
8750: 65 77 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20  ewItem->zName = 
8760: 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
8770: 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e  db, pOldItem->zN
8780: 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77 49 74  ame);.    pNewIt
8790: 65 6d 2d 3e 69 64 78 20 3d 20 70 4f 6c 64 49 74  em->idx = pOldIt
87a0: 65 6d 2d 3e 69 64 78 3b 0a 20 20 7d 0a 20 20 72  em->idx;.  }.  r
87b0: 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 53 65  eturn pNew;.}.Se
87c0: 6c 65 63 74 20 2a 73 71 6c 69 74 65 33 53 65 6c  lect *sqlite3Sel
87d0: 65 63 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a  ectDup(sqlite3 *
87e0: 64 62 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69  db, Select *p, i
87f0: 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 53 65 6c  nt flags){.  Sel
8800: 65 63 74 20 2a 70 4e 65 77 2c 20 2a 70 50 72 69  ect *pNew, *pPri
8810: 6f 72 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29  or;.  if( p==0 )
8820: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65   return 0;.  pNe
8830: 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  w = sqlite3DbMal
8840: 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f  locRaw(db, sizeo
8850: 66 28 2a 70 29 20 29 3b 0a 20 20 69 66 28 20 70  f(*p) );.  if( p
8860: 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  New==0 ) return 
8870: 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 45 4c 69 73  0;.  pNew->pELis
8880: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  t = sqlite3ExprL
8890: 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 45  istDup(db, p->pE
88a0: 4c 69 73 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20  List, flags);.  
88b0: 70 4e 65 77 2d 3e 70 53 72 63 20 3d 20 73 71 6c  pNew->pSrc = sql
88c0: 69 74 65 33 53 72 63 4c 69 73 74 44 75 70 28 64  ite3SrcListDup(d
88d0: 62 2c 20 70 2d 3e 70 53 72 63 2c 20 66 6c 61 67  b, p->pSrc, flag
88e0: 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 57 68 65  s);.  pNew->pWhe
88f0: 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  re = sqlite3Expr
8900: 44 75 70 28 64 62 2c 20 70 2d 3e 70 57 68 65 72  Dup(db, p->pWher
8910: 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65  e, flags);.  pNe
8920: 77 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71  w->pGroupBy = sq
8930: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
8940: 28 64 62 2c 20 70 2d 3e 70 47 72 6f 75 70 42 79  (db, p->pGroupBy
8950: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77  , flags);.  pNew
8960: 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 71 6c 69  ->pHaving = sqli
8970: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
8980: 2d 3e 70 48 61 76 69 6e 67 2c 20 66 6c 61 67 73  ->pHaving, flags
8990: 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65  );.  pNew->pOrde
89a0: 72 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70  rBy = sqlite3Exp
89b0: 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e  rListDup(db, p->
89c0: 70 4f 72 64 65 72 42 79 2c 20 66 6c 61 67 73 29  pOrderBy, flags)
89d0: 3b 0a 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 70  ;.  pNew->op = p
89e0: 2d 3e 6f 70 3b 0a 20 20 70 4e 65 77 2d 3e 70 50  ->op;.  pNew->pP
89f0: 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 20 3d 20  rior = pPrior = 
8a00: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70  sqlite3SelectDup
8a10: 28 64 62 2c 20 70 2d 3e 70 50 72 69 6f 72 2c 20  (db, p->pPrior, 
8a20: 66 6c 61 67 73 29 3b 0a 20 20 69 66 28 20 70 50  flags);.  if( pP
8a30: 72 69 6f 72 20 29 20 70 50 72 69 6f 72 2d 3e 70  rior ) pPrior->p
8a40: 4e 65 78 74 20 3d 20 70 4e 65 77 3b 0a 20 20 70  Next = pNew;.  p
8a50: 4e 65 77 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a  New->pNext = 0;.
8a60: 20 20 70 4e 65 77 2d 3e 70 4c 69 6d 69 74 20 3d    pNew->pLimit =
8a70: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
8a80: 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 2c 20 66  db, p->pLimit, f
8a90: 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 70  lags);.  pNew->p
8aa0: 4f 66 66 73 65 74 20 3d 20 73 71 6c 69 74 65 33  Offset = sqlite3
8ab0: 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70  ExprDup(db, p->p
8ac0: 4f 66 66 73 65 74 2c 20 66 6c 61 67 73 29 3b 0a  Offset, flags);.
8ad0: 20 20 70 4e 65 77 2d 3e 69 4c 69 6d 69 74 20 3d    pNew->iLimit =
8ae0: 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 69 4f 66 66   0;.  pNew->iOff
8af0: 73 65 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d  set = 0;.  pNew-
8b00: 3e 73 65 6c 46 6c 61 67 73 20 3d 20 70 2d 3e 73  >selFlags = p->s
8b10: 65 6c 46 6c 61 67 73 20 26 20 7e 53 46 5f 55 73  elFlags & ~SF_Us
8b20: 65 73 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20 70  esEphemeral;.  p
8b30: 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68  New->addrOpenEph
8b40: 6d 5b 30 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e 65  m[0] = -1;.  pNe
8b50: 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  w->addrOpenEphm[
8b60: 31 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d  1] = -1;.  pNew-
8b70: 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 70 2d  >nSelectRow = p-
8b80: 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 70  >nSelectRow;.  p
8b90: 4e 65 77 2d 3e 70 57 69 74 68 20 3d 20 77 69 74  New->pWith = wit
8ba0: 68 44 75 70 28 64 62 2c 20 70 2d 3e 70 57 69 74  hDup(db, p->pWit
8bb0: 68 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c  h);.  sqlite3Sel
8bc0: 65 63 74 53 65 74 4e 61 6d 65 28 70 4e 65 77 2c  ectSetName(pNew,
8bd0: 20 70 2d 3e 7a 53 65 6c 4e 61 6d 65 29 3b 0a 20   p->zSelName);. 
8be0: 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a   return pNew;.}.
8bf0: 23 65 6c 73 65 0a 53 65 6c 65 63 74 20 2a 73 71  #else.Select *sq
8c00: 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 73  lite3SelectDup(s
8c10: 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 65 6c 65  qlite3 *db, Sele
8c20: 63 74 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73  ct *p, int flags
8c30: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 3d 3d  ){.  assert( p==
8c40: 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b  0 );.  return 0;
8c50: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  .}.#endif.../*.*
8c60: 2a 20 41 64 64 20 61 20 6e 65 77 20 65 6c 65 6d  * Add a new elem
8c70: 65 6e 74 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  ent to the end o
8c80: 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  f an expression 
8c90: 6c 69 73 74 2e 20 20 49 66 20 70 4c 69 73 74 20  list.  If pList 
8ca0: 69 73 0a 2a 2a 20 69 6e 69 74 69 61 6c 6c 79 20  is.** initially 
8cb0: 4e 55 4c 4c 2c 20 74 68 65 6e 20 63 72 65 61 74  NULL, then creat
8cc0: 65 20 61 20 6e 65 77 20 65 78 70 72 65 73 73 69  e a new expressi
8cd0: 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49  on list..**.** I
8ce0: 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  f a memory alloc
8cf0: 61 74 69 6f 6e 20 65 72 72 6f 72 20 6f 63 63 75  ation error occu
8d00: 72 73 2c 20 74 68 65 20 65 6e 74 69 72 65 20 6c  rs, the entire l
8d10: 69 73 74 20 69 73 20 66 72 65 65 64 20 61 6e 64  ist is freed and
8d20: 0a 2a 2a 20 4e 55 4c 4c 20 69 73 20 72 65 74 75  .** NULL is retu
8d30: 72 6e 65 64 2e 20 20 49 66 20 6e 6f 6e 2d 4e 55  rned.  If non-NU
8d40: 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20  LL is returned, 
8d50: 74 68 65 6e 20 69 74 20 69 73 20 67 75 61 72 61  then it is guara
8d60: 6e 74 65 65 64 0a 2a 2a 20 74 68 61 74 20 74 68  nteed.** that th
8d70: 65 20 6e 65 77 20 65 6e 74 72 79 20 77 61 73 20  e new entry was 
8d80: 73 75 63 63 65 73 73 66 75 6c 6c 79 20 61 70 70  successfully app
8d90: 65 6e 64 65 64 2e 0a 2a 2f 0a 45 78 70 72 4c 69  ended..*/.ExprLi
8da0: 73 74 20 2a 73 71 6c 69 74 65 33 45 78 70 72 4c  st *sqlite3ExprL
8db0: 69 73 74 41 70 70 65 6e 64 28 0a 20 20 50 61 72  istAppend(.  Par
8dc0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
8dd0: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
8de0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
8df0: 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20  rList *pList,   
8e00: 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20       /* List to 
8e10: 77 68 69 63 68 20 74 6f 20 61 70 70 65 6e 64 2e  which to append.
8e20: 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a   Might be NULL *
8e30: 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 20  /.  Expr *pExpr 
8e40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
8e50: 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 62 65 20  xpression to be 
8e60: 61 70 70 65 6e 64 65 64 2e 20 4d 69 67 68 74 20  appended. Might 
8e70: 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20  be NULL */.){.  
8e80: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
8e90: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20  arse->db;.  if( 
8ea0: 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pList==0 ){.    
8eb0: 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 44  pList = sqlite3D
8ec0: 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
8ed0: 73 69 7a 65 6f 66 28 45 78 70 72 4c 69 73 74 29  sizeof(ExprList)
8ee0: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73   );.    if( pLis
8ef0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f  t==0 ){.      go
8f00: 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 7d  to no_mem;.    }
8f10: 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 20 3d 20  .    pList->a = 
8f20: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
8f30: 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 70 4c  aw(db, sizeof(pL
8f40: 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 20  ist->a[0]));.   
8f50: 20 69 66 28 20 70 4c 69 73 74 2d 3e 61 3d 3d 30   if( pList->a==0
8f60: 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a   ) goto no_mem;.
8f70: 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 4c 69    }else if( (pLi
8f80: 73 74 2d 3e 6e 45 78 70 72 20 26 20 28 70 4c 69  st->nExpr & (pLi
8f90: 73 74 2d 3e 6e 45 78 70 72 2d 31 29 29 3d 3d 30  st->nExpr-1))==0
8fa0: 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45   ){.    struct E
8fb0: 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 3b  xprList_item *a;
8fc0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69  .    assert( pLi
8fd0: 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20  st->nExpr>0 );. 
8fe0: 20 20 20 61 20 3d 20 73 71 6c 69 74 65 33 44 62     a = sqlite3Db
8ff0: 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70 4c 69 73  Realloc(db, pLis
9000: 74 2d 3e 61 2c 20 70 4c 69 73 74 2d 3e 6e 45 78  t->a, pList->nEx
9010: 70 72 2a 32 2a 73 69 7a 65 6f 66 28 70 4c 69 73  pr*2*sizeof(pLis
9020: 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 20 20 69  t->a[0]));.    i
9030: 66 28 20 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( a==0 ){.     
9040: 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20   goto no_mem;.  
9050: 20 20 7d 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61    }.    pList->a
9060: 20 3d 20 61 3b 0a 20 20 7d 0a 20 20 61 73 73 65   = a;.  }.  asse
9070: 72 74 28 20 70 4c 69 73 74 2d 3e 61 21 3d 30 20  rt( pList->a!=0 
9080: 29 3b 0a 20 20 69 66 28 20 31 20 29 7b 0a 20 20  );.  if( 1 ){.  
9090: 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
90a0: 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20  t_item *pItem = 
90b0: 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d  &pList->a[pList-
90c0: 3e 6e 45 78 70 72 2b 2b 5d 3b 0a 20 20 20 20 6d  >nExpr++];.    m
90d0: 65 6d 73 65 74 28 70 49 74 65 6d 2c 20 30 2c 20  emset(pItem, 0, 
90e0: 73 69 7a 65 6f 66 28 2a 70 49 74 65 6d 29 29 3b  sizeof(*pItem));
90f0: 0a 20 20 20 20 70 49 74 65 6d 2d 3e 70 45 78 70  .    pItem->pExp
9100: 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 7d 0a 20  r = pExpr;.  }. 
9110: 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 0a   return pList;..
9120: 6e 6f 5f 6d 65 6d 3a 20 20 20 20 20 0a 20 20 2f  no_mem:     .  /
9130: 2a 20 41 76 6f 69 64 20 6c 65 61 6b 69 6e 67 20  * Avoid leaking 
9140: 6d 65 6d 6f 72 79 20 69 66 20 6d 61 6c 6c 6f 63  memory if malloc
9150: 20 68 61 73 20 66 61 69 6c 65 64 2e 20 2a 2f 0a   has failed. */.
9160: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
9170: 65 74 65 28 64 62 2c 20 70 45 78 70 72 29 3b 0a  ete(db, pExpr);.
9180: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
9190: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69 73  tDelete(db, pLis
91a0: 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a  t);.  return 0;.
91b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
91c0: 20 45 78 70 72 4c 69 73 74 2e 61 5b 5d 2e 7a 4e   ExprList.a[].zN
91d0: 61 6d 65 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74  ame element of t
91e0: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
91f0: 20 61 64 64 65 64 20 69 74 65 6d 0a 2a 2a 20 6f   added item.** o
9200: 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  n the expression
9210: 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69   list..**.** pLi
9220: 73 74 20 6d 69 67 68 74 20 62 65 20 4e 55 4c 4c  st might be NULL
9230: 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 6e 20 4f 4f   following an OO
9240: 4d 20 65 72 72 6f 72 2e 20 20 42 75 74 20 70 4e  M error.  But pN
9250: 61 6d 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72  ame should never
9260: 20 62 65 0a 2a 2a 20 4e 55 4c 4c 2e 20 20 49 66   be.** NULL.  If
9270: 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61   a memory alloca
9280: 74 69 6f 6e 20 66 61 69 6c 73 2c 20 74 68 65 20  tion fails, the 
9290: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
92a0: 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 0a 2a 2a  ocFailed flag.**
92b0: 20 69 73 20 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64   is set..*/.void
92c0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
92d0: 53 65 74 4e 61 6d 65 28 0a 20 20 50 61 72 73 65  SetName(.  Parse
92e0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
92f0: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
9300: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c  ntext */.  ExprL
9310: 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20  ist *pList,     
9320: 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 77 68     /* List to wh
9330: 69 63 68 20 74 6f 20 61 64 64 20 74 68 65 20 73  ich to add the s
9340: 70 61 6e 2e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  pan. */.  Token 
9350: 2a 70 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 20  *pName,         
9360: 20 20 2f 2a 20 4e 61 6d 65 20 74 6f 20 62 65 20    /* Name to be 
9370: 61 64 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 64  added */.  int d
9380: 65 71 75 6f 74 65 20 20 20 20 20 20 20 20 20 20  equote          
9390: 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 63 61     /* True to ca
93a0: 75 73 65 20 74 68 65 20 6e 61 6d 65 20 74 6f 20  use the name to 
93b0: 62 65 20 64 65 71 75 6f 74 65 64 20 2a 2f 0a 29  be dequoted */.)
93c0: 7b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73  {.  assert( pLis
93d0: 74 21 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e  t!=0 || pParse->
93e0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
93f0: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 4c 69  !=0 );.  if( pLi
9400: 73 74 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74  st ){.    struct
9410: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
9420: 70 49 74 65 6d 3b 0a 20 20 20 20 61 73 73 65 72  pItem;.    asser
9430: 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3e  t( pList->nExpr>
9440: 30 20 29 3b 0a 20 20 20 20 70 49 74 65 6d 20 3d  0 );.    pItem =
9450: 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74   &pList->a[pList
9460: 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20 20 20 20  ->nExpr-1];.    
9470: 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 7a  assert( pItem->z
9480: 4e 61 6d 65 3d 3d 30 20 29 3b 0a 20 20 20 20 70  Name==0 );.    p
9490: 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71  Item->zName = sq
94a0: 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70 28 70  lite3DbStrNDup(p
94b0: 50 61 72 73 65 2d 3e 64 62 2c 20 70 4e 61 6d 65  Parse->db, pName
94c0: 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a  ->z, pName->n);.
94d0: 20 20 20 20 69 66 28 20 64 65 71 75 6f 74 65 20      if( dequote 
94e0: 26 26 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20  && pItem->zName 
94f0: 29 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65  ) sqlite3Dequote
9500: 28 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a  (pItem->zName);.
9510: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74    }.}../*.** Set
9520: 20 74 68 65 20 45 78 70 72 4c 69 73 74 2e 61 5b   the ExprList.a[
9530: 5d 2e 7a 53 70 61 6e 20 65 6c 65 6d 65 6e 74 20  ].zSpan element 
9540: 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  of the most rece
9550: 6e 74 6c 79 20 61 64 64 65 64 20 69 74 65 6d 0a  ntly added item.
9560: 2a 2a 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73  ** on the expres
9570: 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a  sion list..**.**
9580: 20 70 4c 69 73 74 20 6d 69 67 68 74 20 62 65 20   pList might be 
9590: 4e 55 4c 4c 20 66 6f 6c 6c 6f 77 69 6e 67 20 61  NULL following a
95a0: 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e 20 20 42 75  n OOM error.  Bu
95b0: 74 20 70 53 70 61 6e 20 73 68 6f 75 6c 64 20 6e  t pSpan should n
95c0: 65 76 65 72 20 62 65 0a 2a 2a 20 4e 55 4c 4c 2e  ever be.** NULL.
95d0: 20 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c    If a memory al
95e0: 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c 20  location fails, 
95f0: 74 68 65 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  the pParse->db->
9600: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61  mallocFailed fla
9610: 67 0a 2a 2a 20 69 73 20 73 65 74 2e 0a 2a 2f 0a  g.** is set..*/.
9620: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
9630: 4c 69 73 74 53 65 74 53 70 61 6e 28 0a 20 20 50  ListSetSpan(.  P
9640: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
9650: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
9660: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
9670: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
9680: 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74         /* List t
9690: 6f 20 77 68 69 63 68 20 74 6f 20 61 64 64 20 74  o which to add t
96a0: 68 65 20 73 70 61 6e 2e 20 2a 2f 0a 20 20 45 78  he span. */.  Ex
96b0: 70 72 53 70 61 6e 20 2a 70 53 70 61 6e 20 20 20  prSpan *pSpan   
96c0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 70 61        /* The spa
96d0: 6e 20 74 6f 20 62 65 20 61 64 64 65 64 20 2a 2f  n to be added */
96e0: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
96f0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
9700: 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 21    assert( pList!
9710: 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  =0 || db->malloc
9720: 46 61 69 6c 65 64 21 3d 30 20 29 3b 0a 20 20 69  Failed!=0 );.  i
9730: 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  f( pList ){.    
9740: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
9750: 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70  item *pItem = &p
9760: 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e  List->a[pList->n
9770: 45 78 70 72 2d 31 5d 3b 0a 20 20 20 20 61 73 73  Expr-1];.    ass
9780: 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70  ert( pList->nExp
9790: 72 3e 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  r>0 );.    asser
97a0: 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  t( db->mallocFai
97b0: 6c 65 64 20 7c 7c 20 70 49 74 65 6d 2d 3e 70 45  led || pItem->pE
97c0: 78 70 72 3d 3d 70 53 70 61 6e 2d 3e 70 45 78 70  xpr==pSpan->pExp
97d0: 72 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  r );.    sqlite3
97e0: 44 62 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d  DbFree(db, pItem
97f0: 2d 3e 7a 53 70 61 6e 29 3b 0a 20 20 20 20 70 49  ->zSpan);.    pI
9800: 74 65 6d 2d 3e 7a 53 70 61 6e 20 3d 20 73 71 6c  tem->zSpan = sql
9810: 69 74 65 33 44 62 53 74 72 4e 44 75 70 28 64 62  ite3DbStrNDup(db
9820: 2c 20 28 63 68 61 72 2a 29 70 53 70 61 6e 2d 3e  , (char*)pSpan->
9830: 7a 53 74 61 72 74 2c 0a 20 20 20 20 20 20 20 20  zStart,.        
9840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9850: 20 20 20 20 20 20 20 20 20 20 20 20 28 69 6e 74              (int
9860: 29 28 70 53 70 61 6e 2d 3e 7a 45 6e 64 20 2d 20  )(pSpan->zEnd - 
9870: 70 53 70 61 6e 2d 3e 7a 53 74 61 72 74 29 29 3b  pSpan->zStart));
9880: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  .  }.}../*.** If
9890: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
98a0: 6c 69 73 74 20 70 45 4c 69 73 74 20 63 6f 6e 74  list pEList cont
98b0: 61 69 6e 73 20 6d 6f 72 65 20 74 68 61 6e 20 69  ains more than i
98c0: 4c 69 6d 69 74 20 65 6c 65 6d 65 6e 74 73 2c 0a  Limit elements,.
98d0: 2a 2a 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f  ** leave an erro
98e0: 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61  r message in pPa
98f0: 72 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  rse..*/.void sql
9900: 69 74 65 33 45 78 70 72 4c 69 73 74 43 68 65 63  ite3ExprListChec
9910: 6b 4c 65 6e 67 74 68 28 0a 20 20 50 61 72 73 65  kLength(.  Parse
9920: 20 2a 70 50 61 72 73 65 2c 0a 20 20 45 78 70 72   *pParse,.  Expr
9930: 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 0a 20 20  List *pEList,.  
9940: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 62 6a  const char *zObj
9950: 65 63 74 0a 29 7b 0a 20 20 69 6e 74 20 6d 78 20  ect.){.  int mx 
9960: 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 4c  = pParse->db->aL
9970: 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
9980: 54 5f 43 4f 4c 55 4d 4e 5d 3b 0a 20 20 74 65 73  T_COLUMN];.  tes
9990: 74 63 61 73 65 28 20 70 45 4c 69 73 74 20 26 26  tcase( pEList &&
99a0: 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d   pEList->nExpr==
99b0: 6d 78 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  mx );.  testcase
99c0: 28 20 70 45 4c 69 73 74 20 26 26 20 70 45 4c 69  ( pEList && pELi
99d0: 73 74 2d 3e 6e 45 78 70 72 3d 3d 6d 78 2b 31 20  st->nExpr==mx+1 
99e0: 29 3b 0a 20 20 69 66 28 20 70 45 4c 69 73 74 20  );.  if( pEList 
99f0: 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  && pEList->nExpr
9a00: 3e 6d 78 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  >mx ){.    sqlit
9a10: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
9a20: 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c  e, "too many col
9a30: 75 6d 6e 73 20 69 6e 20 25 73 22 2c 20 7a 4f 62  umns in %s", zOb
9a40: 6a 65 63 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ject);.  }.}../*
9a50: 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e  .** Delete an en
9a60: 74 69 72 65 20 65 78 70 72 65 73 73 69 6f 6e 20  tire expression 
9a70: 6c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  list..*/.void sq
9a80: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
9a90: 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ete(sqlite3 *db,
9aa0: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
9ab0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74  ){.  int i;.  st
9ac0: 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
9ad0: 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 66 28  em *pItem;.  if(
9ae0: 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75   pList==0 ) retu
9af0: 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c  rn;.  assert( pL
9b00: 69 73 74 2d 3e 61 21 3d 30 20 7c 7c 20 70 4c 69  ist->a!=0 || pLi
9b10: 73 74 2d 3e 6e 45 78 70 72 3d 3d 30 20 29 3b 0a  st->nExpr==0 );.
9b20: 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73    for(pItem=pLis
9b30: 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70 4c 69  t->a, i=0; i<pLi
9b40: 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20  st->nExpr; i++, 
9b50: 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 73 71  pItem++){.    sq
9b60: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
9b70: 64 62 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72  db, pItem->pExpr
9b80: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
9b90: 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e  Free(db, pItem->
9ba0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69  zName);.    sqli
9bb0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49  te3DbFree(db, pI
9bc0: 74 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a 20 20 7d  tem->zSpan);.  }
9bd0: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
9be0: 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61 29 3b 0a  (db, pList->a);.
9bf0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
9c00: 64 62 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f  db, pList);.}../
9c10: 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69  *.** These routi
9c20: 6e 65 73 20 61 72 65 20 57 61 6c 6b 65 72 20 63  nes are Walker c
9c30: 61 6c 6c 62 61 63 6b 73 2e 20 20 57 61 6c 6b 65  allbacks.  Walke
9c40: 72 2e 75 2e 70 69 20 69 73 20 61 20 70 6f 69 6e  r.u.pi is a poin
9c50: 74 65 72 0a 2a 2a 20 74 6f 20 61 6e 20 69 6e 74  ter.** to an int
9c60: 65 67 65 72 2e 20 20 54 68 65 73 65 20 72 6f 75  eger.  These rou
9c70: 74 69 6e 65 73 20 61 72 65 20 63 68 65 63 6b 69  tines are checki
9c80: 6e 67 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  ng an expression
9c90: 20 74 6f 20 73 65 65 0a 2a 2a 20 69 66 20 69 74   to see.** if it
9ca0: 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74 2e 20   is a constant. 
9cb0: 20 53 65 74 20 2a 57 61 6c 6b 65 72 2e 75 2e 69   Set *Walker.u.i
9cc0: 20 74 6f 20 30 20 69 66 20 74 68 65 20 65 78 70   to 0 if the exp
9cd0: 72 65 73 73 69 6f 6e 20 69 73 0a 2a 2a 20 6e 6f  ression is.** no
9ce0: 74 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2a 0a 2a  t constant..**.*
9cf0: 2a 20 54 68 65 73 65 20 63 61 6c 6c 62 61 63 6b  * These callback
9d00: 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73   routines are us
9d10: 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  ed to implement 
9d20: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a  the following:.*
9d30: 2a 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33  *.**     sqlite3
9d40: 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 29  ExprIsConstant()
9d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d60: 20 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 3d 3d    pWalker->u.i==
9d70: 31 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33  1.**     sqlite3
9d80: 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f  ExprIsConstantNo
9d90: 74 4a 6f 69 6e 28 29 20 20 20 20 20 20 20 20 20  tJoin()         
9da0: 20 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 3d 3d    pWalker->u.i==
9db0: 32 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33  2.**     sqlite3
9dc0: 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72  ExprIsConstantOr
9dd0: 46 75 6e 63 74 69 6f 6e 28 29 20 20 20 20 20 20  Function()      
9de0: 20 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 3d 3d    pWalker->u.i==
9df0: 33 20 6f 72 20 34 0a 2a 2a 0a 2a 2a 20 54 68 65  3 or 4.**.** The
9e00: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
9e10: 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f 6e  nstantOrFunction
9e20: 28 29 20 69 73 20 75 73 65 64 20 66 6f 72 20 65  () is used for e
9e30: 76 61 6c 75 61 74 69 6e 67 20 65 78 70 72 65 73  valuating expres
9e40: 73 69 6f 6e 73 0a 2a 2a 20 69 6e 20 61 20 43 52  sions.** in a CR
9e50: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
9e60: 6d 65 6e 74 2e 20 20 54 68 65 20 57 61 6c 6b 65  ment.  The Walke
9e70: 72 2e 75 2e 69 20 76 61 6c 75 65 20 69 73 20 34  r.u.i value is 4
9e80: 20 77 68 65 6e 20 70 61 72 73 69 6e 67 0a 2a 2a   when parsing.**
9e90: 20 61 6e 20 65 78 69 73 74 69 6e 67 20 73 63 68   an existing sch
9ea0: 65 6d 61 20 61 6e 64 20 33 20 77 68 65 6e 20 70  ema and 3 when p
9eb0: 72 6f 63 65 73 73 69 6e 67 20 61 20 6e 65 77 20  rocessing a new 
9ec0: 73 74 61 74 65 6d 65 6e 74 2e 20 20 41 20 62 6f  statement.  A bo
9ed0: 75 6e 64 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72  und.** parameter
9ee0: 20 72 61 69 73 65 73 20 61 6e 20 65 72 72 6f 72   raises an error
9ef0: 20 66 6f 72 20 6e 65 77 20 73 74 61 74 65 6d 65   for new stateme
9f00: 6e 74 73 2c 20 62 75 74 20 69 73 20 73 69 6c 65  nts, but is sile
9f10: 6e 74 6c 79 20 63 6f 6e 76 65 72 74 65 64 0a 2a  ntly converted.*
9f20: 2a 20 74 6f 20 4e 55 4c 4c 20 66 6f 72 20 65 78  * to NULL for ex
9f30: 69 73 74 69 6e 67 20 73 63 68 65 6d 61 73 2e 20  isting schemas. 
9f40: 20 54 68 69 73 20 61 6c 6c 6f 77 73 20 73 71 6c   This allows sql
9f50: 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
9f60: 73 20 74 68 61 74 20 0a 2a 2a 20 63 6f 6e 74 61  s that .** conta
9f70: 69 6e 20 61 20 62 6f 75 6e 64 20 70 61 72 61 6d  in a bound param
9f80: 65 74 65 72 20 62 65 63 61 75 73 65 20 74 68 65  eter because the
9f90: 79 20 77 65 72 65 20 67 65 6e 65 72 61 74 65 64  y were generated
9fa0: 20 62 79 20 6f 6c 64 65 72 20 76 65 72 73 69 6f   by older versio
9fb0: 6e 73 0a 2a 2a 20 6f 66 20 53 51 4c 69 74 65 20  ns.** of SQLite 
9fc0: 74 6f 20 62 65 20 70 61 72 73 65 64 20 62 79 20  to be parsed by 
9fd0: 6e 65 77 65 72 20 76 65 72 73 69 6f 6e 73 20 6f  newer versions o
9fe0: 66 20 53 51 4c 69 74 65 20 77 69 74 68 6f 75 74  f SQLite without
9ff0: 20 72 61 69 73 69 6e 67 20 61 0a 2a 2a 20 6d 61   raising a.** ma
a000: 6c 66 6f 72 6d 65 64 20 73 63 68 65 6d 61 20 65  lformed schema e
a010: 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rror..*/.static 
a020: 69 6e 74 20 65 78 70 72 4e 6f 64 65 49 73 43 6f  int exprNodeIsCo
a030: 6e 73 74 61 6e 74 28 57 61 6c 6b 65 72 20 2a 70  nstant(Walker *p
a040: 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45  Walker, Expr *pE
a050: 78 70 72 29 7b 0a 0a 20 20 2f 2a 20 49 66 20 70  xpr){..  /* If p
a060: 57 61 6c 6b 65 72 2d 3e 75 2e 69 20 69 73 20 32  Walker->u.i is 2
a070: 20 74 68 65 6e 20 61 6e 79 20 74 65 72 6d 20 6f   then any term o
a080: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
a090: 20 74 68 61 74 20 63 6f 6d 65 73 20 66 72 6f 6d   that comes from
a0a0: 0a 20 20 2a 2a 20 74 68 65 20 4f 4e 20 6f 72 20  .  ** the ON or 
a0b0: 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20 6f 66  USING clauses of
a0c0: 20 61 20 6a 6f 69 6e 20 64 69 73 71 75 61 6c 69   a join disquali
a0d0: 66 69 65 73 20 74 68 65 20 65 78 70 72 65 73 73  fies the express
a0e0: 69 6f 6e 0a 20 20 2a 2a 20 66 72 6f 6d 20 62 65  ion.  ** from be
a0f0: 69 6e 67 20 63 6f 6e 73 69 64 65 72 65 64 20 63  ing considered c
a100: 6f 6e 73 74 61 6e 74 2e 20 2a 2f 0a 20 20 69 66  onstant. */.  if
a110: 28 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 3d 3d  ( pWalker->u.i==
a120: 32 20 26 26 20 45 78 70 72 48 61 73 50 72 6f 70  2 && ExprHasProp
a130: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46  erty(pExpr, EP_F
a140: 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20  romJoin) ){.    
a150: 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 20 3d 20 30  pWalker->u.i = 0
a160: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43  ;.    return WRC
a170: 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 0a 20 20 73  _Abort;.  }..  s
a180: 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70  witch( pExpr->op
a190: 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 6e 73 69   ){.    /* Consi
a1a0: 64 65 72 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f  der functions to
a1b0: 20 62 65 20 63 6f 6e 73 74 61 6e 74 20 69 66 20   be constant if 
a1c0: 61 6c 6c 20 74 68 65 69 72 20 61 72 67 75 6d 65  all their argume
a1d0: 6e 74 73 20 61 72 65 20 63 6f 6e 73 74 61 6e 74  nts are constant
a1e0: 0a 20 20 20 20 2a 2a 20 61 6e 64 20 65 69 74 68  .    ** and eith
a1f0: 65 72 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 3d  er pWalker->u.i=
a200: 3d 33 20 6f 72 20 34 20 6f 72 20 74 68 65 20 66  =3 or 4 or the f
a210: 75 6e 63 74 69 6f 6e 20 61 73 20 74 68 65 20 53  unction as the S
a220: 51 4c 49 54 45 5f 46 55 4e 43 5f 43 4f 4e 53 54  QLITE_FUNC_CONST
a230: 0a 20 20 20 20 2a 2a 20 66 6c 61 67 2e 20 2a 2f  .    ** flag. */
a240: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e  .    case TK_FUN
a250: 43 54 49 4f 4e 3a 0a 20 20 20 20 20 20 69 66 28  CTION:.      if(
a260: 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 3e 3d 33   pWalker->u.i>=3
a270: 20 7c 7c 20 45 78 70 72 48 61 73 50 72 6f 70 65   || ExprHasPrope
a280: 72 74 79 28 70 45 78 70 72 2c 45 50 5f 43 6f 6e  rty(pExpr,EP_Con
a290: 73 74 61 6e 74 29 20 29 7b 0a 20 20 20 20 20 20  stant) ){.      
a2a0: 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e    return WRC_Con
a2b0: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20  tinue;.      }. 
a2c0: 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72       /* Fall thr
a2d0: 6f 75 67 68 20 2a 2f 0a 20 20 20 20 63 61 73 65  ough */.    case
a2e0: 20 54 4b 5f 49 44 3a 0a 20 20 20 20 63 61 73 65   TK_ID:.    case
a2f0: 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20   TK_COLUMN:.    
a300: 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43  case TK_AGG_FUNC
a310: 54 49 4f 4e 3a 0a 20 20 20 20 63 61 73 65 20 54  TION:.    case T
a320: 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20  K_AGG_COLUMN:.  
a330: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
a340: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29  xpr->op==TK_ID )
a350: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
a360: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
a370: 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20  COLUMN );.      
a380: 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
a390: 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43  >op==TK_AGG_FUNC
a3a0: 54 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 74 65  TION );.      te
a3b0: 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
a3c0: 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  p==TK_AGG_COLUMN
a3d0: 20 29 3b 0a 20 20 20 20 20 20 70 57 61 6c 6b 65   );.      pWalke
a3e0: 72 2d 3e 75 2e 69 20 3d 20 30 3b 0a 20 20 20 20  r->u.i = 0;.    
a3f0: 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f    return WRC_Abo
a400: 72 74 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  rt;.    case TK_
a410: 56 41 52 49 41 42 4c 45 3a 0a 20 20 20 20 20 20  VARIABLE:.      
a420: 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 69  if( pWalker->u.i
a430: 3d 3d 34 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ==4 ){.        /
a440: 2a 20 53 69 6c 65 6e 74 6c 79 20 63 6f 6e 76 65  * Silently conve
a450: 72 74 20 62 6f 75 6e 64 20 70 61 72 61 6d 65 74  rt bound paramet
a460: 65 72 73 20 74 68 61 74 20 61 70 70 65 61 72 20  ers that appear 
a470: 69 6e 73 69 64 65 20 6f 66 20 43 52 45 41 54 45  inside of CREATE
a480: 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 74 61 74  .        ** stat
a490: 65 6d 65 6e 74 73 20 69 6e 74 6f 20 61 20 4e 55  ements into a NU
a4a0: 4c 4c 20 77 68 65 6e 20 70 61 72 73 69 6e 67 20  LL when parsing 
a4b0: 74 68 65 20 43 52 45 41 54 45 20 73 74 61 74 65  the CREATE state
a4c0: 6d 65 6e 74 20 74 65 78 74 20 6f 75 74 0a 20 20  ment text out.  
a4d0: 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20        ** of the 
a4e0: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
a4f0: 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 70  ble */.        p
a500: 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 4e 55  Expr->op = TK_NU
a510: 4c 4c 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  LL;.      }else 
a520: 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 69  if( pWalker->u.i
a530: 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ==3 ){.        /
a540: 2a 20 41 20 62 6f 75 6e 64 20 70 61 72 61 6d 65  * A bound parame
a550: 74 65 72 20 69 6e 20 61 20 43 52 45 41 54 45 20  ter in a CREATE 
a560: 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 6f  statement that o
a570: 72 69 67 69 6e 61 74 65 73 20 66 72 6f 6d 0a 20  riginates from. 
a580: 20 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65         ** sqlite
a590: 33 5f 70 72 65 70 61 72 65 28 29 20 63 61 75 73  3_prepare() caus
a5a0: 65 73 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 20  es an error */. 
a5b0: 20 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e         pWalker->
a5c0: 75 2e 69 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  u.i = 0;.       
a5d0: 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
a5e0: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
a5f0: 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67 68   /* Fall through
a600: 20 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c 74 3a   */.    default:
a610: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
a620: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53   pExpr->op==TK_S
a630: 45 4c 45 43 54 20 29 3b 20 2f 2a 20 73 65 6c 65  ELECT ); /* sele
a640: 63 74 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74  ctNodeIsConstant
a650: 20 77 69 6c 6c 20 64 69 73 61 6c 6c 6f 77 20 2a   will disallow *
a660: 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  /.      testcase
a670: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
a680: 45 58 49 53 54 53 20 29 3b 20 2f 2a 20 73 65 6c  EXISTS ); /* sel
a690: 65 63 74 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e  ectNodeIsConstan
a6a0: 74 20 77 69 6c 6c 20 64 69 73 61 6c 6c 6f 77 20  t will disallow 
a6b0: 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
a6c0: 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20  WRC_Continue;.  
a6d0: 7d 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 73  }.}.static int s
a6e0: 65 6c 65 63 74 4e 6f 64 65 49 73 43 6f 6e 73 74  electNodeIsConst
a6f0: 61 6e 74 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c  ant(Walker *pWal
a700: 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 4e 6f 74  ker, Select *Not
a710: 55 73 65 64 29 7b 0a 20 20 55 4e 55 53 45 44 5f  Used){.  UNUSED_
a720: 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
a730: 64 29 3b 0a 20 20 70 57 61 6c 6b 65 72 2d 3e 75  d);.  pWalker->u
a740: 2e 69 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  .i = 0;.  return
a750: 20 57 52 43 5f 41 62 6f 72 74 3b 0a 7d 0a 73 74   WRC_Abort;.}.st
a760: 61 74 69 63 20 69 6e 74 20 65 78 70 72 49 73 43  atic int exprIsC
a770: 6f 6e 73 74 28 45 78 70 72 20 2a 70 2c 20 69 6e  onst(Expr *p, in
a780: 74 20 69 6e 69 74 46 6c 61 67 29 7b 0a 20 20 57  t initFlag){.  W
a790: 61 6c 6b 65 72 20 77 3b 0a 20 20 6d 65 6d 73 65  alker w;.  memse
a7a0: 74 28 26 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28  t(&w, 0, sizeof(
a7b0: 77 29 29 3b 0a 20 20 77 2e 75 2e 69 20 3d 20 69  w));.  w.u.i = i
a7c0: 6e 69 74 46 6c 61 67 3b 0a 20 20 77 2e 78 45 78  nitFlag;.  w.xEx
a7d0: 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70  prCallback = exp
a7e0: 72 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 3b  rNodeIsConstant;
a7f0: 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c  .  w.xSelectCall
a800: 62 61 63 6b 20 3d 20 73 65 6c 65 63 74 4e 6f 64  back = selectNod
a810: 65 49 73 43 6f 6e 73 74 61 6e 74 3b 0a 20 20 73  eIsConstant;.  s
a820: 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26  qlite3WalkExpr(&
a830: 77 2c 20 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  w, p);.  return 
a840: 77 2e 75 2e 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  w.u.i;.}../*.** 
a850: 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69  Walk an expressi
a860: 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e  on tree.  Return
a870: 20 31 20 69 66 20 74 68 65 20 65 78 70 72 65 73   1 if the expres
a880: 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74  sion is constant
a890: 0a 2a 2a 20 61 6e 64 20 30 20 69 66 20 69 74 20  .** and 0 if it 
a8a0: 69 6e 76 6f 6c 76 65 73 20 76 61 72 69 61 62 6c  involves variabl
a8b0: 65 73 20 6f 72 20 66 75 6e 63 74 69 6f 6e 20 63  es or function c
a8c0: 61 6c 6c 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  alls..**.** For 
a8d0: 74 68 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20  the purposes of 
a8e0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61  this function, a
a8f0: 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65 64 20 73   double-quoted s
a900: 74 72 69 6e 67 20 28 65 78 3a 20 22 61 62 63 22  tring (ex: "abc"
a910: 29 0a 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65 72  ).** is consider
a920: 65 64 20 61 20 76 61 72 69 61 62 6c 65 20 62 75  ed a variable bu
a930: 74 20 61 20 73 69 6e 67 6c 65 2d 71 75 6f 74 65  t a single-quote
a940: 64 20 73 74 72 69 6e 67 20 28 65 78 3a 20 27 61  d string (ex: 'a
a950: 62 63 27 29 20 69 73 0a 2a 2a 20 61 20 63 6f 6e  bc') is.** a con
a960: 73 74 61 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  stant..*/.int sq
a970: 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
a980: 61 6e 74 28 45 78 70 72 20 2a 70 29 7b 0a 20 20  ant(Expr *p){.  
a990: 72 65 74 75 72 6e 20 65 78 70 72 49 73 43 6f 6e  return exprIsCon
a9a0: 73 74 28 70 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a  st(p, 1);.}../*.
a9b0: 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65  ** Walk an expre
a9c0: 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74  ssion tree.  Ret
a9d0: 75 72 6e 20 31 20 69 66 20 74 68 65 20 65 78 70  urn 1 if the exp
a9e0: 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74  ression is const
a9f0: 61 6e 74 0a 2a 2a 20 74 68 61 74 20 64 6f 65 73  ant.** that does
aa00: 20 6e 6f 20 6f 72 69 67 69 6e 61 74 65 20 66 72   no originate fr
aa10: 6f 6d 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49  om the ON or USI
aa20: 4e 47 20 63 6c 61 75 73 65 73 20 6f 66 20 61 20  NG clauses of a 
aa30: 6a 6f 69 6e 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  join..** Return 
aa40: 30 20 69 66 20 69 74 20 69 6e 76 6f 6c 76 65 73  0 if it involves
aa50: 20 76 61 72 69 61 62 6c 65 73 20 6f 72 20 66 75   variables or fu
aa60: 6e 63 74 69 6f 6e 20 63 61 6c 6c 73 20 6f 72 20  nction calls or 
aa70: 74 65 72 6d 73 20 66 72 6f 6d 0a 2a 2a 20 61 6e  terms from.** an
aa80: 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61   ON or USING cla
aa90: 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  use..*/.int sqli
aaa0: 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
aab0: 74 4e 6f 74 4a 6f 69 6e 28 45 78 70 72 20 2a 70  tNotJoin(Expr *p
aac0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72  ){.  return expr
aad0: 49 73 43 6f 6e 73 74 28 70 2c 20 32 29 3b 0a 7d  IsConst(p, 2);.}
aae0: 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20  ../*.** Walk an 
aaf0: 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e  expression tree.
ab00: 20 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68    Return 1 if th
ab10: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
ab20: 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 6f 72 20 61  constant.** or a
ab30: 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 77   function call w
ab40: 69 74 68 20 63 6f 6e 73 74 61 6e 74 20 61 72 67  ith constant arg
ab50: 75 6d 65 6e 74 73 2e 20 20 52 65 74 75 72 6e 20  uments.  Return 
ab60: 61 6e 64 20 30 20 69 66 20 74 68 65 72 65 0a 2a  and 0 if there.*
ab70: 2a 20 61 72 65 20 61 6e 79 20 76 61 72 69 61 62  * are any variab
ab80: 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74  les..**.** For t
ab90: 68 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74  he purposes of t
aba0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20  his function, a 
abb0: 64 6f 75 62 6c 65 2d 71 75 6f 74 65 64 20 73 74  double-quoted st
abc0: 72 69 6e 67 20 28 65 78 3a 20 22 61 62 63 22 29  ring (ex: "abc")
abd0: 0a 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65 72 65  .** is considere
abe0: 64 20 61 20 76 61 72 69 61 62 6c 65 20 62 75 74  d a variable but
abf0: 20 61 20 73 69 6e 67 6c 65 2d 71 75 6f 74 65 64   a single-quoted
ac00: 20 73 74 72 69 6e 67 20 28 65 78 3a 20 27 61 62   string (ex: 'ab
ac10: 63 27 29 20 69 73 0a 2a 2a 20 61 20 63 6f 6e 73  c') is.** a cons
ac20: 74 61 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tant..*/.int sql
ac30: 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
ac40: 6e 74 4f 72 46 75 6e 63 74 69 6f 6e 28 45 78 70  ntOrFunction(Exp
ac50: 72 20 2a 70 2c 20 75 38 20 69 73 49 6e 69 74 29  r *p, u8 isInit)
ac60: 7b 0a 20 20 61 73 73 65 72 74 28 20 69 73 49 6e  {.  assert( isIn
ac70: 69 74 3d 3d 30 20 7c 7c 20 69 73 49 6e 69 74 3d  it==0 || isInit=
ac80: 3d 31 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 65  =1 );.  return e
ac90: 78 70 72 49 73 43 6f 6e 73 74 28 70 2c 20 33 2b  xprIsConst(p, 3+
aca0: 69 73 49 6e 69 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  isInit);.}../*.*
acb0: 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73  * If the express
acc0: 69 6f 6e 20 70 20 63 6f 64 65 73 20 61 20 63 6f  ion p codes a co
acd0: 6e 73 74 61 6e 74 20 69 6e 74 65 67 65 72 20 74  nstant integer t
ace0: 68 61 74 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f  hat is small eno
acf0: 75 67 68 0a 2a 2a 20 74 6f 20 66 69 74 20 69 6e  ugh.** to fit in
ad00: 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65   a 32-bit intege
ad10: 72 2c 20 72 65 74 75 72 6e 20 31 20 61 6e 64 20  r, return 1 and 
ad20: 70 75 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66  put the value of
ad30: 20 74 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20   the integer.** 
ad40: 69 6e 20 2a 70 56 61 6c 75 65 2e 20 20 49 66 20  in *pValue.  If 
ad50: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
ad60: 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65 72  s not an integer
ad70: 20 6f 72 20 69 66 20 69 74 20 69 73 20 74 6f 6f   or if it is too
ad80: 20 62 69 67 0a 2a 2a 20 74 6f 20 66 69 74 20 69   big.** to fit i
ad90: 6e 20 61 20 73 69 67 6e 65 64 20 33 32 2d 62 69  n a signed 32-bi
ada0: 74 20 69 6e 74 65 67 65 72 2c 20 72 65 74 75 72  t integer, retur
adb0: 6e 20 30 20 61 6e 64 20 6c 65 61 76 65 20 2a 70  n 0 and leave *p
adc0: 56 61 6c 75 65 20 75 6e 63 68 61 6e 67 65 64 2e  Value unchanged.
add0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
ade0: 78 70 72 49 73 49 6e 74 65 67 65 72 28 45 78 70  xprIsInteger(Exp
adf0: 72 20 2a 70 2c 20 69 6e 74 20 2a 70 56 61 6c 75  r *p, int *pValu
ae00: 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30  e){.  int rc = 0
ae10: 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 78  ;..  /* If an ex
ae20: 70 72 65 73 73 69 6f 6e 20 69 73 20 61 6e 20 69  pression is an i
ae30: 6e 74 65 67 65 72 20 6c 69 74 65 72 61 6c 20 74  nteger literal t
ae40: 68 61 74 20 66 69 74 73 20 69 6e 20 61 20 73 69  hat fits in a si
ae50: 67 6e 65 64 20 33 32 2d 62 69 74 0a 20 20 2a 2a  gned 32-bit.  **
ae60: 20 69 6e 74 65 67 65 72 2c 20 74 68 65 6e 20 74   integer, then t
ae70: 68 65 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 66  he EP_IntValue f
ae80: 6c 61 67 20 77 69 6c 6c 20 68 61 76 65 20 61 6c  lag will have al
ae90: 72 65 61 64 79 20 62 65 65 6e 20 73 65 74 20 2a  ready been set *
aea0: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f  /.  assert( p->o
aeb0: 70 21 3d 54 4b 5f 49 4e 54 45 47 45 52 20 7c 7c  p!=TK_INTEGER ||
aec0: 20 28 70 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f   (p->flags & EP_
aed0: 49 6e 74 56 61 6c 75 65 29 21 3d 30 0a 20 20 20  IntValue)!=0.   
aee0: 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74          || sqlit
aef0: 65 33 47 65 74 49 6e 74 33 32 28 70 2d 3e 75 2e  e3GetInt32(p->u.
af00: 7a 54 6f 6b 65 6e 2c 20 26 72 63 29 3d 3d 30 20  zToken, &rc)==0 
af10: 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 66 6c 61  );..  if( p->fla
af20: 67 73 20 26 20 45 50 5f 49 6e 74 56 61 6c 75 65  gs & EP_IntValue
af30: 20 29 7b 0a 20 20 20 20 2a 70 56 61 6c 75 65 20   ){.    *pValue 
af40: 3d 20 70 2d 3e 75 2e 69 56 61 6c 75 65 3b 0a 20  = p->u.iValue;. 
af50: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
af60: 0a 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70  .  switch( p->op
af70: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
af80: 55 50 4c 55 53 3a 20 7b 0a 20 20 20 20 20 20 72  UPLUS: {.      r
af90: 63 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 49  c = sqlite3ExprI
afa0: 73 49 6e 74 65 67 65 72 28 70 2d 3e 70 4c 65 66  sInteger(p->pLef
afb0: 74 2c 20 70 56 61 6c 75 65 29 3b 0a 20 20 20 20  t, pValue);.    
afc0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
afd0: 20 20 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55     case TK_UMINU
afe0: 53 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 76  S: {.      int v
aff0: 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  ;.      if( sqli
b000: 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72  te3ExprIsInteger
b010: 28 70 2d 3e 70 4c 65 66 74 2c 20 26 76 29 20 29  (p->pLeft, &v) )
b020: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
b030: 28 20 76 21 3d 28 2d 32 31 34 37 34 38 33 36 34  ( v!=(-214748364
b040: 37 2d 31 29 20 29 3b 0a 20 20 20 20 20 20 20 20  7-1) );.        
b050: 2a 70 56 61 6c 75 65 20 3d 20 2d 76 3b 0a 20 20  *pValue = -v;.  
b060: 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
b070: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
b080: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66  k;.    }.    def
b090: 61 75 6c 74 3a 20 62 72 65 61 6b 3b 0a 20 20 7d  ault: break;.  }
b0a0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
b0b0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 46 41  ./*.** Return FA
b0c0: 4c 53 45 20 69 66 20 74 68 65 72 65 20 69 73 20  LSE if there is 
b0d0: 6e 6f 20 63 68 61 6e 63 65 20 74 68 61 74 20 74  no chance that t
b0e0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 63 61  he expression ca
b0f0: 6e 20 62 65 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  n be NULL..**.**
b100: 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69   If the expressi
b110: 6f 6e 20 6d 69 67 68 74 20 62 65 20 4e 55 4c 4c  on might be NULL
b120: 20 6f 72 20 69 66 20 74 68 65 20 65 78 70 72 65   or if the expre
b130: 73 73 69 6f 6e 20 69 73 20 74 6f 6f 20 63 6f 6d  ssion is too com
b140: 70 6c 65 78 0a 2a 2a 20 74 6f 20 74 65 6c 6c 20  plex.** to tell 
b150: 72 65 74 75 72 6e 20 54 52 55 45 2e 20 20 0a 2a  return TRUE.  .*
b160: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
b170: 65 20 69 73 20 75 73 65 64 20 61 73 20 61 6e 20  e is used as an 
b180: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 74 6f  optimization, to
b190: 20 73 6b 69 70 20 4f 50 5f 49 73 4e 75 6c 6c 20   skip OP_IsNull 
b1a0: 6f 70 63 6f 64 65 73 0a 2a 2a 20 77 68 65 6e 20  opcodes.** when 
b1b0: 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 61 20 76  we know that a v
b1c0: 61 6c 75 65 20 63 61 6e 6e 6f 74 20 62 65 20 4e  alue cannot be N
b1d0: 55 4c 4c 2e 20 20 48 65 6e 63 65 2c 20 61 20 66  ULL.  Hence, a f
b1e0: 61 6c 73 65 20 70 6f 73 69 74 69 76 65 0a 2a 2a  alse positive.**
b1f0: 20 28 72 65 74 75 72 6e 69 6e 67 20 54 52 55 45   (returning TRUE
b200: 20 77 68 65 6e 20 69 6e 20 66 61 63 74 20 74 68   when in fact th
b210: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 63 61 6e  e expression can
b220: 20 6e 65 76 65 72 20 62 65 20 4e 55 4c 4c 29 20   never be NULL) 
b230: 6d 69 67 68 74 0a 2a 2a 20 62 65 20 61 20 73 6d  might.** be a sm
b240: 61 6c 6c 20 70 65 72 66 6f 72 6d 61 6e 63 65 20  all performance 
b250: 68 69 74 20 62 75 74 20 69 73 20 6f 74 68 65 72  hit but is other
b260: 77 69 73 65 20 68 61 72 6d 6c 65 73 73 2e 20 20  wise harmless.  
b270: 4f 6e 20 74 68 65 20 6f 74 68 65 72 0a 2a 2a 20  On the other.** 
b280: 68 61 6e 64 2c 20 61 20 66 61 6c 73 65 20 6e 65  hand, a false ne
b290: 67 61 74 69 76 65 20 28 72 65 74 75 72 6e 69 6e  gative (returnin
b2a0: 67 20 46 41 4c 53 45 20 77 68 65 6e 20 74 68 65  g FALSE when the
b2b0: 20 72 65 73 75 6c 74 20 63 6f 75 6c 64 20 62 65   result could be
b2c0: 20 4e 55 4c 4c 29 0a 2a 2a 20 77 69 6c 6c 20 6c   NULL).** will l
b2d0: 69 6b 65 6c 79 20 72 65 73 75 6c 74 20 69 6e 20  ikely result in 
b2e0: 61 6e 20 69 6e 63 6f 72 72 65 63 74 20 61 6e 73  an incorrect ans
b2f0: 77 65 72 2e 20 20 53 6f 20 77 68 65 6e 20 69 6e  wer.  So when in
b300: 20 64 6f 75 62 74 2c 20 72 65 74 75 72 6e 0a 2a   doubt, return.*
b310: 2a 20 54 52 55 45 2e 0a 2a 2f 0a 69 6e 74 20 73  * TRUE..*/.int s
b320: 71 6c 69 74 65 33 45 78 70 72 43 61 6e 42 65 4e  qlite3ExprCanBeN
b330: 75 6c 6c 28 63 6f 6e 73 74 20 45 78 70 72 20 2a  ull(const Expr *
b340: 70 29 7b 0a 20 20 75 38 20 6f 70 3b 0a 20 20 77  p){.  u8 op;.  w
b350: 68 69 6c 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  hile( p->op==TK_
b360: 55 50 4c 55 53 20 7c 7c 20 70 2d 3e 6f 70 3d 3d  UPLUS || p->op==
b370: 54 4b 5f 55 4d 49 4e 55 53 20 29 7b 20 70 20 3d  TK_UMINUS ){ p =
b380: 20 70 2d 3e 70 4c 65 66 74 3b 20 7d 0a 20 20 6f   p->pLeft; }.  o
b390: 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 69 66 28  p = p->op;.  if(
b3a0: 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52   op==TK_REGISTER
b3b0: 20 29 20 6f 70 20 3d 20 70 2d 3e 6f 70 32 3b 0a   ) op = p->op2;.
b3c0: 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a    switch( op ){.
b3d0: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45      case TK_INTE
b3e0: 47 45 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  GER:.    case TK
b3f0: 5f 53 54 52 49 4e 47 3a 0a 20 20 20 20 63 61 73  _STRING:.    cas
b400: 65 20 54 4b 5f 46 4c 4f 41 54 3a 0a 20 20 20 20  e TK_FLOAT:.    
b410: 63 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 0a 20 20  case TK_BLOB:.  
b420: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
b430: 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e    case TK_COLUMN
b440: 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  :.      assert( 
b450: 70 2d 3e 70 54 61 62 21 3d 30 20 29 3b 0a 20 20  p->pTab!=0 );.  
b460: 20 20 20 20 72 65 74 75 72 6e 20 70 2d 3e 69 43      return p->iC
b470: 6f 6c 75 6d 6e 3e 3d 30 20 26 26 20 70 2d 3e 70  olumn>=0 && p->p
b480: 54 61 62 2d 3e 61 43 6f 6c 5b 70 2d 3e 69 43 6f  Tab->aCol[p->iCo
b490: 6c 75 6d 6e 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30  lumn].notNull==0
b4a0: 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20  ;.    default:. 
b4b0: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
b4c0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75   }.}../*.** Retu
b4d0: 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 67  rn TRUE if the g
b4e0: 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  iven expression 
b4f0: 69 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 77 68  is a constant wh
b500: 69 63 68 20 77 6f 75 6c 64 20 62 65 0a 2a 2a 20  ich would be.** 
b510: 75 6e 63 68 61 6e 67 65 64 20 62 79 20 4f 50 5f  unchanged by OP_
b520: 41 66 66 69 6e 69 74 79 20 77 69 74 68 20 74 68  Affinity with th
b530: 65 20 61 66 66 69 6e 69 74 79 20 67 69 76 65 6e  e affinity given
b540: 20 69 6e 20 74 68 65 20 73 65 63 6f 6e 64 0a 2a   in the second.*
b550: 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a  * argument..**.*
b560: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
b570: 73 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d  s used to determ
b580: 69 6e 65 20 69 66 20 74 68 65 20 4f 50 5f 41 66  ine if the OP_Af
b590: 66 69 6e 69 74 79 20 6f 70 65 72 61 74 69 6f 6e  finity operation
b5a0: 0a 2a 2a 20 63 61 6e 20 62 65 20 6f 6d 69 74 74  .** can be omitt
b5b0: 65 64 2e 20 20 57 68 65 6e 20 69 6e 20 64 6f 75  ed.  When in dou
b5c0: 62 74 20 72 65 74 75 72 6e 20 46 41 4c 53 45 2e  bt return FALSE.
b5d0: 20 20 41 20 66 61 6c 73 65 20 6e 65 67 61 74 69    A false negati
b5e0: 76 65 0a 2a 2a 20 69 73 20 68 61 72 6d 6c 65 73  ve.** is harmles
b5f0: 73 2e 20 20 41 20 66 61 6c 73 65 20 70 6f 73 69  s.  A false posi
b600: 74 69 76 65 2c 20 68 6f 77 65 76 65 72 2c 20 63  tive, however, c
b610: 61 6e 20 72 65 73 75 6c 74 20 69 6e 20 74 68 65  an result in the
b620: 20 77 72 6f 6e 67 0a 2a 2a 20 61 6e 73 77 65 72   wrong.** answer
b630: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
b640: 45 78 70 72 4e 65 65 64 73 4e 6f 41 66 66 69 6e  ExprNeedsNoAffin
b650: 69 74 79 43 68 61 6e 67 65 28 63 6f 6e 73 74 20  ityChange(const 
b660: 45 78 70 72 20 2a 70 2c 20 63 68 61 72 20 61 66  Expr *p, char af
b670: 66 29 7b 0a 20 20 75 38 20 6f 70 3b 0a 20 20 69  f){.  u8 op;.  i
b680: 66 28 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41  f( aff==SQLITE_A
b690: 46 46 5f 4e 4f 4e 45 20 29 20 72 65 74 75 72 6e  FF_NONE ) return
b6a0: 20 31 3b 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e   1;.  while( p->
b6b0: 6f 70 3d 3d 54 4b 5f 55 50 4c 55 53 20 7c 7c 20  op==TK_UPLUS || 
b6c0: 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4d 49 4e 55 53  p->op==TK_UMINUS
b6d0: 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4c 65 66 74   ){ p = p->pLeft
b6e0: 3b 20 7d 0a 20 20 6f 70 20 3d 20 70 2d 3e 6f 70  ; }.  op = p->op
b6f0: 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 52  ;.  if( op==TK_R
b700: 45 47 49 53 54 45 52 20 29 20 6f 70 20 3d 20 70  EGISTER ) op = p
b710: 2d 3e 6f 70 32 3b 0a 20 20 73 77 69 74 63 68 28  ->op2;.  switch(
b720: 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20   op ){.    case 
b730: 54 4b 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20  TK_INTEGER: {.  
b740: 20 20 20 20 72 65 74 75 72 6e 20 61 66 66 3d 3d      return aff==
b750: 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47  SQLITE_AFF_INTEG
b760: 45 52 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54  ER || aff==SQLIT
b770: 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20  E_AFF_NUMERIC;. 
b780: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
b790: 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20  _FLOAT: {.      
b7a0: 72 65 74 75 72 6e 20 61 66 66 3d 3d 53 51 4c 49  return aff==SQLI
b7b0: 54 45 5f 41 46 46 5f 52 45 41 4c 20 7c 7c 20 61  TE_AFF_REAL || a
b7c0: 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ff==SQLITE_AFF_N
b7d0: 55 4d 45 52 49 43 3b 0a 20 20 20 20 7d 0a 20 20  UMERIC;.    }.  
b7e0: 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47    case TK_STRING
b7f0: 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  : {.      return
b800: 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46   aff==SQLITE_AFF
b810: 5f 54 45 58 54 3b 0a 20 20 20 20 7d 0a 20 20 20  _TEXT;.    }.   
b820: 20 63 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 20 7b   case TK_BLOB: {
b830: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
b840: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
b850: 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20  TK_COLUMN: {.   
b860: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 54     assert( p->iT
b870: 61 62 6c 65 3e 3d 30 20 29 3b 20 20 2f 2a 20 70  able>=0 );  /* p
b880: 20 63 61 6e 6e 6f 74 20 62 65 20 70 61 72 74 20   cannot be part 
b890: 6f 66 20 61 20 43 48 45 43 4b 20 63 6f 6e 73 74  of a CHECK const
b8a0: 72 61 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20 72  raint */.      r
b8b0: 65 74 75 72 6e 20 70 2d 3e 69 43 6f 6c 75 6d 6e  eturn p->iColumn
b8c0: 3c 30 0a 20 20 20 20 20 20 20 20 20 20 26 26 20  <0.          && 
b8d0: 28 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46  (aff==SQLITE_AFF
b8e0: 5f 49 4e 54 45 47 45 52 20 7c 7c 20 61 66 66 3d  _INTEGER || aff=
b8f0: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45  =SQLITE_AFF_NUME
b900: 52 49 43 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RIC);.    }.    
b910: 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
b920: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
b930: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
b940: 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
b950: 20 67 69 76 65 6e 20 73 74 72 69 6e 67 20 69 73   given string is
b960: 20 61 20 72 6f 77 2d 69 64 20 63 6f 6c 75 6d 6e   a row-id column
b970: 20 6e 61 6d 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71   name..*/.int sq
b980: 6c 69 74 65 33 49 73 52 6f 77 69 64 28 63 6f 6e  lite3IsRowid(con
b990: 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69  st char *z){.  i
b9a0: 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
b9b0: 70 28 7a 2c 20 22 5f 52 4f 57 49 44 5f 22 29 3d  p(z, "_ROWID_")=
b9c0: 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  =0 ) return 1;. 
b9d0: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
b9e0: 43 6d 70 28 7a 2c 20 22 52 4f 57 49 44 22 29 3d  Cmp(z, "ROWID")=
b9f0: 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  =0 ) return 1;. 
ba00: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
ba10: 43 6d 70 28 7a 2c 20 22 4f 49 44 22 29 3d 3d 30  Cmp(z, "OID")==0
ba20: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 72   ) return 1;.  r
ba30: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
ba40: 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
ba50: 20 77 65 20 61 72 65 20 61 62 6c 65 20 74 6f 20   we are able to 
ba60: 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20  the IN operator 
ba70: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6f 6e 20  optimization on 
ba80: 61 0a 2a 2a 20 71 75 65 72 79 20 6f 66 20 74 68  a.** query of th
ba90: 65 20 66 6f 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20  e form.**.**    
baa0: 20 20 20 78 20 49 4e 20 28 53 45 4c 45 43 54 20     x IN (SELECT 
bab0: 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 57 68 65 72 65  ...).**.** Where
bac0: 20 74 68 65 20 53 45 4c 45 43 54 2e 2e 2e 20 63   the SELECT... c
bad0: 6c 61 75 73 65 20 69 73 20 61 73 20 73 70 65 63  lause is as spec
bae0: 69 66 69 65 64 20 62 79 20 74 68 65 20 70 61 72  ified by the par
baf0: 61 6d 65 74 65 72 20 74 6f 20 74 68 69 73 0a 2a  ameter to this.*
bb00: 2a 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a  * routine..**.**
bb10: 20 54 68 65 20 53 65 6c 65 63 74 20 6f 62 6a 65   The Select obje
bb20: 63 74 20 70 61 73 73 65 64 20 69 6e 20 68 61 73  ct passed in has
bb30: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 70 72   already been pr
bb40: 65 70 72 6f 63 65 73 73 65 64 20 61 6e 64 20 6e  eprocessed and n
bb50: 6f 0a 2a 2a 20 65 72 72 6f 72 73 20 68 61 76 65  o.** errors have
bb60: 20 62 65 65 6e 20 66 6f 75 6e 64 2e 0a 2a 2f 0a   been found..*/.
bb70: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
bb80: 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 73 74 61  MIT_SUBQUERY.sta
bb90: 74 69 63 20 69 6e 74 20 69 73 43 61 6e 64 69 64  tic int isCandid
bba0: 61 74 65 46 6f 72 49 6e 4f 70 74 28 53 65 6c 65  ateForInOpt(Sele
bbb0: 63 74 20 2a 70 29 7b 0a 20 20 53 72 63 4c 69 73  ct *p){.  SrcLis
bbc0: 74 20 2a 70 53 72 63 3b 0a 20 20 45 78 70 72 4c  t *pSrc;.  ExprL
bbd0: 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 54  ist *pEList;.  T
bbe0: 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 69 66  able *pTab;.  if
bbf0: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( p==0 ) return 
bc00: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
bc10: 20 20 20 20 20 2f 2a 20 72 69 67 68 74 2d 68 61       /* right-ha
bc20: 6e 64 20 73 69 64 65 20 6f 66 20 49 4e 20 69 73  nd side of IN is
bc30: 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 69 66 28   SELECT */.  if(
bc40: 20 70 2d 3e 70 50 72 69 6f 72 20 29 20 72 65 74   p->pPrior ) ret
bc50: 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
bc60: 20 20 20 20 2f 2a 20 4e 6f 74 20 61 20 63 6f 6d      /* Not a com
bc70: 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 2a 2f 0a  pound SELECT */.
bc80: 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67    if( p->selFlag
bc90: 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74  s & (SF_Distinct
bca0: 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29 20 29  |SF_Aggregate) )
bcb0: 7b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  {.    testcase( 
bcc0: 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28  (p->selFlags & (
bcd0: 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41  SF_Distinct|SF_A
bce0: 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 44  ggregate))==SF_D
bcf0: 69 73 74 69 6e 63 74 20 29 3b 0a 20 20 20 20 74  istinct );.    t
bd00: 65 73 74 63 61 73 65 28 20 28 70 2d 3e 73 65 6c  estcase( (p->sel
bd10: 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74  Flags & (SF_Dist
bd20: 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74  inct|SF_Aggregat
bd30: 65 29 29 3d 3d 53 46 5f 41 67 67 72 65 67 61 74  e))==SF_Aggregat
bd40: 65 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  e );.    return 
bd50: 30 3b 20 2f 2a 20 4e 6f 20 44 49 53 54 49 4e 43  0; /* No DISTINC
bd60: 54 20 6b 65 79 77 6f 72 64 20 61 6e 64 20 6e 6f  T keyword and no
bd70: 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
bd80: 69 6f 6e 73 20 2a 2f 0a 20 20 7d 0a 20 20 61 73  ions */.  }.  as
bd90: 73 65 72 74 28 20 70 2d 3e 70 47 72 6f 75 70 42  sert( p->pGroupB
bda0: 79 3d 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20  y==0 );         
bdb0: 20 20 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20 47       /* Has no G
bdc0: 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 2a  ROUP BY clause *
bdd0: 2f 0a 20 20 69 66 28 20 70 2d 3e 70 4c 69 6d 69  /.  if( p->pLimi
bde0: 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  t ) return 0;   
bdf0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61             /* Ha
be00: 73 20 6e 6f 20 4c 49 4d 49 54 20 63 6c 61 75 73  s no LIMIT claus
be10: 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  e */.  assert( p
be20: 2d 3e 70 4f 66 66 73 65 74 3d 3d 30 20 29 3b 20  ->pOffset==0 ); 
be30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
be40: 20 4e 6f 20 4c 49 4d 49 54 20 6d 65 61 6e 73 20   No LIMIT means 
be50: 6e 6f 20 4f 46 46 53 45 54 20 2a 2f 0a 20 20 69  no OFFSET */.  i
be60: 66 28 20 70 2d 3e 70 57 68 65 72 65 20 29 20 72  f( p->pWhere ) r
be70: 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
be80: 20 20 20 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20        /* Has no 
be90: 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
bea0: 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63    pSrc = p->pSrc
beb0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 72 63  ;.  assert( pSrc
bec0: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 53 72  !=0 );.  if( pSr
bed0: 63 2d 3e 6e 53 72 63 21 3d 31 20 29 20 72 65 74  c->nSrc!=1 ) ret
bee0: 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
bef0: 2f 2a 20 53 69 6e 67 6c 65 20 74 65 72 6d 20 69  /* Single term i
bf00: 6e 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f  n FROM clause */
bf10: 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 61 5b 30  .  if( pSrc->a[0
bf20: 5d 2e 70 53 65 6c 65 63 74 20 29 20 72 65 74 75  ].pSelect ) retu
bf30: 72 6e 20 30 3b 20 20 20 20 20 2f 2a 20 46 52 4f  rn 0;     /* FRO
bf40: 4d 20 69 73 20 6e 6f 74 20 61 20 73 75 62 71 75  M is not a subqu
bf50: 65 72 79 20 6f 72 20 76 69 65 77 20 2a 2f 0a 20  ery or view */. 
bf60: 20 70 54 61 62 20 3d 20 70 53 72 63 2d 3e 61 5b   pTab = pSrc->a[
bf70: 30 5d 2e 70 54 61 62 3b 0a 20 20 69 66 28 20 4e  0].pTab;.  if( N
bf80: 45 56 45 52 28 70 54 61 62 3d 3d 30 29 20 29 20  EVER(pTab==0) ) 
bf90: 72 65 74 75 72 6e 20 30 3b 0a 20 20 61 73 73 65  return 0;.  asse
bfa0: 72 74 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63  rt( pTab->pSelec
bfb0: 74 3d 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20  t==0 );         
bfc0: 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73     /* FROM claus
bfd0: 65 20 69 73 20 6e 6f 74 20 61 20 76 69 65 77 20  e is not a view 
bfe0: 2a 2f 0a 20 20 69 66 28 20 49 73 56 69 72 74 75  */.  if( IsVirtu
bff0: 61 6c 28 70 54 61 62 29 20 29 20 72 65 74 75 72  al(pTab) ) retur
c000: 6e 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 46  n 0;        /* F
c010: 52 4f 4d 20 63 6c 61 75 73 65 20 6e 6f 74 20 61  ROM clause not a
c020: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 2a   virtual table *
c030: 2f 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e  /.  pEList = p->
c040: 70 45 4c 69 73 74 3b 0a 20 20 69 66 28 20 70 45  pEList;.  if( pE
c050: 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29  List->nExpr!=1 )
c060: 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
c070: 20 2f 2a 20 4f 6e 65 20 63 6f 6c 75 6d 6e 20 69   /* One column i
c080: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
c090: 20 2a 2f 0a 20 20 69 66 28 20 70 45 4c 69 73 74   */.  if( pEList
c0a0: 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70  ->a[0].pExpr->op
c0b0: 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 72 65  !=TK_COLUMN ) re
c0c0: 74 75 72 6e 20 30 3b 20 2f 2a 20 52 65 73 75 6c  turn 0; /* Resul
c0d0: 74 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 2a 2f  t is a column */
c0e0: 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23  .  return 1;.}.#
c0f0: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
c100: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f  OMIT_SUBQUERY */
c110: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20  ../*.** Code an 
c120: 4f 50 5f 4f 6e 63 65 20 69 6e 73 74 72 75 63 74  OP_Once instruct
c130: 69 6f 6e 20 61 6e 64 20 61 6c 6c 6f 63 61 74 65  ion and allocate
c140: 20 73 70 61 63 65 20 66 6f 72 20 69 74 73 20 66   space for its f
c150: 6c 61 67 2e 20 52 65 74 75 72 6e 20 74 68 65 20  lag. Return the 
c160: 0a 2a 2a 20 61 64 64 72 65 73 73 20 6f 66 20 74  .** address of t
c170: 68 65 20 6e 65 77 20 69 6e 73 74 72 75 63 74 69  he new instructi
c180: 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  on..*/.int sqlit
c190: 65 33 43 6f 64 65 4f 6e 63 65 28 50 61 72 73 65  e3CodeOnce(Parse
c1a0: 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 56 64 62   *pParse){.  Vdb
c1b0: 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65  e *v = sqlite3Ge
c1c0: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 20 20  tVdbe(pParse);  
c1d0: 20 20 20 20 2f 2a 20 56 69 72 74 75 61 6c 20 6d      /* Virtual m
c1e0: 61 63 68 69 6e 65 20 62 65 69 6e 67 20 63 6f 64  achine being cod
c1f0: 65 64 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 73  ed */.  return s
c200: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
c210: 28 76 2c 20 4f 50 5f 4f 6e 63 65 2c 20 70 50 61  (v, OP_Once, pPa
c220: 72 73 65 2d 3e 6e 4f 6e 63 65 2b 2b 29 3b 0a 7d  rse->nOnce++);.}
c230: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
c240: 20 63 6f 64 65 20 74 68 61 74 20 63 68 65 63 6b   code that check
c250: 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20  s the left-most 
c260: 63 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78 20  column of index 
c270: 74 61 62 6c 65 20 69 43 75 72 20 74 6f 20 73 65  table iCur to se
c280: 65 20 69 66 0a 2a 2a 20 69 74 20 63 6f 6e 74 61  e if.** it conta
c290: 69 6e 73 20 61 6e 79 20 4e 55 4c 4c 20 65 6e 74  ins any NULL ent
c2a0: 72 69 65 73 2e 20 20 43 61 75 73 65 20 74 68 65  ries.  Cause the
c2b0: 20 72 65 67 69 73 74 65 72 20 61 74 20 72 65 67   register at reg
c2c0: 48 61 73 4e 75 6c 6c 20 74 6f 20 62 65 20 73 65  HasNull to be se
c2d0: 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 4e 55  t.** to a non-NU
c2e0: 4c 4c 20 76 61 6c 75 65 20 69 66 20 69 43 75 72  LL value if iCur
c2f0: 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 4e 55 4c   contains no NUL
c300: 4c 73 2e 20 20 43 61 75 73 65 20 72 65 67 69 73  Ls.  Cause regis
c310: 74 65 72 20 72 65 67 48 61 73 4e 75 6c 6c 0a 2a  ter regHasNull.*
c320: 2a 20 74 6f 20 62 65 20 73 65 74 20 74 6f 20 4e  * to be set to N
c330: 55 4c 4c 20 69 66 20 69 43 75 72 20 63 6f 6e 74  ULL if iCur cont
c340: 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  ains one or more
c350: 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2e 0a 2a 2f   NULL values..*/
c360: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c  .static void sql
c370: 69 74 65 33 53 65 74 48 61 73 4e 75 6c 6c 46 6c  ite3SetHasNullFl
c380: 61 67 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20  ag(Vdbe *v, int 
c390: 69 43 75 72 2c 20 69 6e 74 20 72 65 67 48 61 73  iCur, int regHas
c3a0: 4e 75 6c 6c 29 7b 0a 20 20 69 6e 74 20 6a 31 3b  Null){.  int j1;
c3b0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
c3c0: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
c3d0: 65 72 2c 20 30 2c 20 72 65 67 48 61 73 4e 75 6c  er, 0, regHasNul
c3e0: 6c 29 3b 0a 20 20 6a 31 20 3d 20 73 71 6c 69 74  l);.  j1 = sqlit
c3f0: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
c400: 4f 50 5f 52 65 77 69 6e 64 2c 20 69 43 75 72 29  OP_Rewind, iCur)
c410: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
c420: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
c430: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
c440: 75 6d 6e 2c 20 69 43 75 72 2c 20 30 2c 20 72 65  umn, iCur, 0, re
c450: 67 48 61 73 4e 75 6c 6c 29 3b 0a 20 20 73 71 6c  gHasNull);.  sql
c460: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
c470: 28 76 2c 20 4f 50 46 4c 41 47 5f 54 59 50 45 4f  (v, OPFLAG_TYPEO
c480: 46 41 52 47 29 3b 0a 20 20 56 64 62 65 43 6f 6d  FARG);.  VdbeCom
c490: 6d 65 6e 74 28 28 76 2c 20 22 66 69 72 73 74 5f  ment((v, "first_
c4a0: 65 6e 74 72 79 5f 69 6e 28 25 64 29 22 2c 20 69  entry_in(%d)", i
c4b0: 43 75 72 29 29 3b 0a 20 20 73 71 6c 69 74 65 33  Cur));.  sqlite3
c4c0: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
c4d0: 6a 31 29 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66  j1);.}...#ifndef
c4e0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
c4f0: 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 54 68 65 20  QUERY./*.** The 
c500: 61 72 67 75 6d 65 6e 74 20 69 73 20 61 6e 20 49  argument is an I
c510: 4e 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68 20  N operator with 
c520: 61 20 6c 69 73 74 20 28 6e 6f 74 20 61 20 73 75  a list (not a su
c530: 62 71 75 65 72 79 29 20 6f 6e 20 74 68 65 20 0a  bquery) on the .
c540: 2a 2a 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69  ** right-hand si
c550: 64 65 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45  de.  Return TRUE
c560: 20 69 66 20 74 68 61 74 20 6c 69 73 74 20 69 73   if that list is
c570: 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a 73 74   constant..*/.st
c580: 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33  atic int sqlite3
c590: 49 6e 52 68 73 49 73 43 6f 6e 73 74 61 6e 74 28  InRhsIsConstant(
c5a0: 45 78 70 72 20 2a 70 49 6e 29 7b 0a 20 20 45 78  Expr *pIn){.  Ex
c5b0: 70 72 20 2a 70 4c 48 53 3b 0a 20 20 69 6e 74 20  pr *pLHS;.  int 
c5c0: 72 65 73 3b 0a 20 20 61 73 73 65 72 74 28 20 21  res;.  assert( !
c5d0: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
c5e0: 70 49 6e 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  pIn, EP_xIsSelec
c5f0: 74 29 20 29 3b 0a 20 20 70 4c 48 53 20 3d 20 70  t) );.  pLHS = p
c600: 49 6e 2d 3e 70 4c 65 66 74 3b 0a 20 20 70 49 6e  In->pLeft;.  pIn
c610: 2d 3e 70 4c 65 66 74 20 3d 20 30 3b 0a 20 20 72  ->pLeft = 0;.  r
c620: 65 73 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  es = sqlite3Expr
c630: 49 73 43 6f 6e 73 74 61 6e 74 28 70 49 6e 29 3b  IsConstant(pIn);
c640: 0a 20 20 70 49 6e 2d 3e 70 4c 65 66 74 20 3d 20  .  pIn->pLeft = 
c650: 70 4c 48 53 3b 0a 20 20 72 65 74 75 72 6e 20 72  pLHS;.  return r
c660: 65 73 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  es;.}.#endif../*
c670: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
c680: 6e 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65  n is used by the
c690: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
c6a0: 6f 66 20 74 68 65 20 49 4e 20 28 2e 2e 2e 29 20  of the IN (...) 
c6b0: 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 20 54 68 65  operator..** The
c6c0: 20 70 58 20 70 61 72 61 6d 65 74 65 72 20 69 73   pX parameter is
c6d0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
c6e0: 6f 6e 20 74 68 65 20 52 48 53 20 6f 66 20 74 68  on the RHS of th
c6f0: 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 2c 20 77  e IN operator, w
c700: 68 69 63 68 0a 2a 2a 20 6d 69 67 68 74 20 62 65  hich.** might be
c710: 20 65 69 74 68 65 72 20 61 20 6c 69 73 74 20 6f   either a list o
c720: 66 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6f 72  f expressions or
c730: 20 61 20 73 75 62 71 75 65 72 79 2e 0a 2a 2a 0a   a subquery..**.
c740: 2a 2a 20 54 68 65 20 6a 6f 62 20 6f 66 20 74 68  ** The job of th
c750: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 6f  is routine is to
c760: 20 66 69 6e 64 20 6f 72 20 63 72 65 61 74 65 20   find or create 
c770: 61 20 62 2d 74 72 65 65 20 6f 62 6a 65 63 74 20  a b-tree object 
c780: 74 68 61 74 20 63 61 6e 0a 2a 2a 20 62 65 20 75  that can.** be u
c790: 73 65 64 20 65 69 74 68 65 72 20 74 6f 20 74 65  sed either to te
c7a0: 73 74 20 66 6f 72 20 6d 65 6d 62 65 72 73 68 69  st for membershi
c7b0: 70 20 69 6e 20 74 68 65 20 52 48 53 20 73 65 74  p in the RHS set
c7c0: 20 6f 72 20 74 6f 20 69 74 65 72 61 74 65 20 74   or to iterate t
c7d0: 68 72 6f 75 67 68 0a 2a 2a 20 61 6c 6c 20 6d 65  hrough.** all me
c7e0: 6d 62 65 72 73 20 6f 66 20 74 68 65 20 52 48 53  mbers of the RHS
c7f0: 20 73 65 74 2c 20 73 6b 69 70 70 69 6e 67 20 64   set, skipping d
c800: 75 70 6c 69 63 61 74 65 73 2e 0a 2a 2a 0a 2a 2a  uplicates..**.**
c810: 20 41 20 63 75 72 73 6f 72 20 69 73 20 6f 70 65   A cursor is ope
c820: 6e 65 64 20 6f 6e 20 74 68 65 20 62 2d 74 72 65  ned on the b-tre
c830: 65 20 6f 62 6a 65 63 74 20 74 68 61 74 20 69 73  e object that is
c840: 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 65 20   the RHS of the 
c850: 49 4e 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 61  IN operator.** a
c860: 6e 64 20 70 58 2d 3e 69 54 61 62 6c 65 20 69 73  nd pX->iTable is
c870: 20 73 65 74 20 74 6f 20 74 68 65 20 69 6e 64 65   set to the inde
c880: 78 20 6f 66 20 74 68 61 74 20 63 75 72 73 6f 72  x of that cursor
c890: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75  ..**.** The retu
c8a0: 72 6e 65 64 20 76 61 6c 75 65 20 6f 66 20 74 68  rned value of th
c8b0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 6e 64 69  is function indi
c8c0: 63 61 74 65 73 20 74 68 65 20 62 2d 74 72 65 65  cates the b-tree
c8d0: 20 74 79 70 65 2c 20 61 73 20 66 6f 6c 6c 6f 77   type, as follow
c8e0: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 49 4e 5f 49 4e  s:.**.**   IN_IN
c8f0: 44 45 58 5f 52 4f 57 49 44 20 20 20 20 20 20 2d  DEX_ROWID      -
c900: 20 54 68 65 20 63 75 72 73 6f 72 20 77 61 73 20   The cursor was 
c910: 6f 70 65 6e 65 64 20 6f 6e 20 61 20 64 61 74 61  opened on a data
c920: 62 61 73 65 20 74 61 62 6c 65 2e 0a 2a 2a 20 20  base table..**  
c930: 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f   IN_INDEX_INDEX_
c940: 41 53 43 20 20 2d 20 54 68 65 20 63 75 72 73 6f  ASC  - The curso
c950: 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20  r was opened on 
c960: 61 6e 20 61 73 63 65 6e 64 69 6e 67 20 69 6e 64  an ascending ind
c970: 65 78 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45  ex..**   IN_INDE
c980: 58 5f 49 4e 44 45 58 5f 44 45 53 43 20 2d 20 54  X_INDEX_DESC - T
c990: 68 65 20 63 75 72 73 6f 72 20 77 61 73 20 6f 70  he cursor was op
c9a0: 65 6e 65 64 20 6f 6e 20 61 20 64 65 73 63 65 6e  ened on a descen
c9b0: 64 69 6e 67 20 69 6e 64 65 78 2e 0a 2a 2a 20 20  ding index..**  
c9c0: 20 49 4e 5f 49 4e 44 45 58 5f 45 50 48 20 20 20   IN_INDEX_EPH   
c9d0: 20 20 20 20 20 2d 20 54 68 65 20 63 75 72 73 6f       - The curso
c9e0: 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20  r was opened on 
c9f0: 61 20 73 70 65 63 69 61 6c 6c 79 20 63 72 65 61  a specially crea
ca00: 74 65 64 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20  ted and.**      
ca10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca20: 20 20 20 70 6f 70 75 6c 61 74 65 64 20 65 70 68     populated eph
ca30: 65 72 65 6d 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a  eremal table..**
ca40: 20 20 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50     IN_INDEX_NOOP
ca50: 20 20 20 20 20 20 20 2d 20 4e 6f 20 63 75 72 73         - No curs
ca60: 6f 72 20 77 61 73 20 61 6c 6c 6f 63 61 74 65 64  or was allocated
ca70: 2e 20 20 54 68 65 20 49 4e 20 6f 70 65 72 61 74  .  The IN operat
ca80: 6f 72 20 6d 75 73 74 20 62 65 0a 2a 2a 20 20 20  or must be.**   
ca90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
caa0: 20 20 20 20 20 20 69 6d 70 6c 65 6d 65 6e 74 65        implemente
cab0: 64 20 61 73 20 61 20 73 65 71 75 65 6e 63 65 20  d as a sequence 
cac0: 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e 73 2e 0a  of comparisons..
cad0: 2a 2a 0a 2a 2a 20 41 6e 20 65 78 69 73 74 69 6e  **.** An existin
cae0: 67 20 62 2d 74 72 65 65 20 6d 69 67 68 74 20 62  g b-tree might b
caf0: 65 20 75 73 65 64 20 69 66 20 74 68 65 20 52 48  e used if the RH
cb00: 53 20 65 78 70 72 65 73 73 69 6f 6e 20 70 58 20  S expression pX 
cb10: 69 73 20 61 20 73 69 6d 70 6c 65 0a 2a 2a 20 73  is a simple.** s
cb20: 75 62 71 75 65 72 79 20 73 75 63 68 20 61 73 3a  ubquery such as:
cb30: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43  .**.**     SELEC
cb40: 54 20 3c 63 6f 6c 75 6d 6e 3e 20 46 52 4f 4d 20  T <column> FROM 
cb50: 3c 74 61 62 6c 65 3e 0a 2a 2a 0a 2a 2a 20 49 66  <table>.**.** If
cb60: 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 65 20   the RHS of the 
cb70: 49 4e 20 6f 70 65 72 61 74 6f 72 20 69 73 20 61  IN operator is a
cb80: 20 6c 69 73 74 20 6f 72 20 61 20 6d 6f 72 65 20   list or a more 
cb90: 63 6f 6d 70 6c 65 78 20 73 75 62 71 75 65 72 79  complex subquery
cba0: 2c 20 74 68 65 6e 0a 2a 2a 20 61 6e 20 65 70 68  , then.** an eph
cbb0: 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 6d 69 67  emeral table mig
cbc0: 68 74 20 6e 65 65 64 20 74 6f 20 62 65 20 67 65  ht need to be ge
cbd0: 6e 65 72 61 74 65 64 20 66 72 6f 6d 20 74 68 65  nerated from the
cbe0: 20 52 48 53 20 61 6e 64 20 74 68 65 6e 0a 2a 2a   RHS and then.**
cbf0: 20 70 58 2d 3e 69 54 61 62 6c 65 20 6d 61 64 65   pX->iTable made
cc00: 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   to point to the
cc10: 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65   ephemeral table
cc20: 20 69 6e 73 74 65 61 64 20 6f 66 20 61 6e 0a 2a   instead of an.*
cc30: 2a 20 65 78 69 73 74 69 6e 67 20 74 61 62 6c 65  * existing table
cc40: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 46 6c  ..**.** The inFl
cc50: 61 67 73 20 70 61 72 61 6d 65 74 65 72 20 6d 75  ags parameter mu
cc60: 73 74 20 63 6f 6e 74 61 69 6e 20 65 78 61 63 74  st contain exact
cc70: 6c 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 62 69  ly one of the bi
cc80: 74 73 0a 2a 2a 20 49 4e 5f 49 4e 44 45 58 5f 4d  ts.** IN_INDEX_M
cc90: 45 4d 42 45 52 53 48 49 50 20 6f 72 20 49 4e 5f  EMBERSHIP or IN_
cca0: 49 4e 44 45 58 5f 4c 4f 4f 50 2e 20 20 49 66 20  INDEX_LOOP.  If 
ccb0: 69 6e 46 6c 61 67 73 20 63 6f 6e 74 61 69 6e 73  inFlags contains
ccc0: 0a 2a 2a 20 49 4e 5f 49 4e 44 45 58 5f 4d 45 4d  .** IN_INDEX_MEM
ccd0: 42 45 52 53 48 49 50 2c 20 74 68 65 6e 20 74 68  BERSHIP, then th
cce0: 65 20 67 65 6e 65 72 61 74 65 64 20 74 61 62 6c  e generated tabl
ccf0: 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 66  e will be used f
cd00: 6f 72 20 61 0a 2a 2a 20 66 61 73 74 20 6d 65 6d  or a.** fast mem
cd10: 62 65 72 73 68 69 70 20 74 65 73 74 2e 20 20 57  bership test.  W
cd20: 68 65 6e 20 74 68 65 20 49 4e 5f 49 4e 44 45 58  hen the IN_INDEX
cd30: 5f 4c 4f 4f 50 20 62 69 74 20 69 73 20 73 65 74  _LOOP bit is set
cd40: 2c 20 74 68 65 0a 2a 2a 20 49 4e 20 69 6e 64 65  , the.** IN inde
cd50: 78 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74  x will be used t
cd60: 6f 20 6c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20  o loop over all 
cd70: 76 61 6c 75 65 73 20 6f 66 20 74 68 65 20 52 48  values of the RH
cd80: 53 20 6f 66 20 74 68 65 0a 2a 2a 20 49 4e 20 6f  S of the.** IN o
cd90: 70 65 72 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 57  perator..**.** W
cda0: 68 65 6e 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f  hen IN_INDEX_LOO
cdb0: 50 20 69 73 20 75 73 65 64 20 28 61 6e 64 20 74  P is used (and t
cdc0: 68 65 20 62 2d 74 72 65 65 20 77 69 6c 6c 20 62  he b-tree will b
cdd0: 65 20 75 73 65 64 20 74 6f 20 69 74 65 72 61 74  e used to iterat
cde0: 65 0a 2a 2a 20 74 68 72 6f 75 67 68 20 74 68 65  e.** through the
cdf0: 20 73 65 74 20 6d 65 6d 62 65 72 73 29 20 74 68   set members) th
ce00: 65 6e 20 74 68 65 20 62 2d 74 72 65 65 20 6d 75  en the b-tree mu
ce10: 73 74 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 64  st not contain d
ce20: 75 70 6c 69 63 61 74 65 73 2e 0a 2a 2a 20 41 6e  uplicates..** An
ce30: 20 65 70 68 65 72 65 6d 61 6c 20 74 61 62 6c 65   epheremal table
ce40: 20 6d 75 73 74 20 62 65 20 75 73 65 64 20 75 6e   must be used un
ce50: 6c 65 73 73 20 74 68 65 20 73 65 6c 65 63 74 65  less the selecte
ce60: 64 20 3c 63 6f 6c 75 6d 6e 3e 20 69 73 20 67 75  d <column> is gu
ce70: 61 72 61 6e 74 65 65 64 0a 2a 2a 20 74 6f 20 62  aranteed.** to b
ce80: 65 20 75 6e 69 71 75 65 20 2d 20 65 69 74 68 65  e unique - eithe
ce90: 72 20 62 65 63 61 75 73 65 20 69 74 20 69 73 20  r because it is 
cea0: 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  an INTEGER PRIMA
ceb0: 52 59 20 4b 45 59 20 6f 72 20 69 74 0a 2a 2a 20  RY KEY or it.** 
cec0: 68 61 73 20 61 20 55 4e 49 51 55 45 20 63 6f 6e  has a UNIQUE con
ced0: 73 74 72 61 69 6e 74 20 6f 72 20 55 4e 49 51 55  straint or UNIQU
cee0: 45 20 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 57  E index..**.** W
cef0: 68 65 6e 20 49 4e 5f 49 4e 44 45 58 5f 4d 45 4d  hen IN_INDEX_MEM
cf00: 42 45 52 53 48 49 50 20 69 73 20 75 73 65 64 20  BERSHIP is used 
cf10: 28 61 6e 64 20 74 68 65 20 62 2d 74 72 65 65 20  (and the b-tree 
cf20: 77 69 6c 6c 20 62 65 20 75 73 65 64 20 0a 2a 2a  will be used .**
cf30: 20 66 6f 72 20 66 61 73 74 20 73 65 74 20 6d 65   for fast set me
cf40: 6d 62 65 72 73 68 69 70 20 74 65 73 74 73 29 20  mbership tests) 
cf50: 74 68 65 6e 20 61 6e 20 65 70 68 65 72 65 6d 61  then an epherema
cf60: 6c 20 74 61 62 6c 65 20 6d 75 73 74 20 0a 2a 2a  l table must .**
cf70: 20 62 65 20 75 73 65 64 20 75 6e 6c 65 73 73 20   be used unless 
cf80: 3c 63 6f 6c 75 6d 6e 3e 20 69 73 20 61 6e 20 49  <column> is an I
cf90: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
cfa0: 45 59 20 6f 72 20 61 6e 20 69 6e 64 65 78 20 63  EY or an index c
cfb0: 61 6e 20 0a 2a 2a 20 62 65 20 66 6f 75 6e 64 20  an .** be found 
cfc0: 77 69 74 68 20 3c 63 6f 6c 75 6d 6e 3e 20 61 73  with <column> as
cfd0: 20 69 74 73 20 6c 65 66 74 2d 6d 6f 73 74 20 63   its left-most c
cfe0: 6f 6c 75 6d 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  olumn..**.** If 
cff0: 74 68 65 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f  the IN_INDEX_NOO
d000: 50 5f 4f 4b 20 61 6e 64 20 49 4e 5f 49 4e 44 45  P_OK and IN_INDE
d010: 58 5f 4d 45 4d 42 45 52 53 48 49 50 20 61 72 65  X_MEMBERSHIP are
d020: 20 62 6f 74 68 20 73 65 74 20 61 6e 64 0a 2a 2a   both set and.**
d030: 20 69 66 20 74 68 65 20 52 48 53 20 6f 66 20 74   if the RHS of t
d040: 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 69  he IN operator i
d050: 73 20 61 20 6c 69 73 74 20 28 6e 6f 74 20 61 20  s a list (not a 
d060: 73 75 62 71 75 65 72 79 29 20 74 68 65 6e 20 74  subquery) then t
d070: 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 6d  his.** routine m
d080: 69 67 68 74 20 64 65 63 69 64 65 20 74 68 61 74  ight decide that
d090: 20 63 72 65 61 74 69 6e 67 20 61 6e 20 65 70 68   creating an eph
d0a0: 65 6d 65 72 61 6c 20 62 2d 74 72 65 65 20 66 6f  emeral b-tree fo
d0b0: 72 20 6d 65 6d 62 65 72 73 68 69 70 0a 2a 2a 20  r membership.** 
d0c0: 74 65 73 74 69 6e 67 20 69 73 20 74 6f 6f 20 65  testing is too e
d0d0: 78 70 65 6e 73 69 76 65 20 61 6e 64 20 72 65 74  xpensive and ret
d0e0: 75 72 6e 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f  urn IN_INDEX_NOO
d0f0: 50 2e 20 20 49 6e 20 74 68 61 74 20 63 61 73 65  P.  In that case
d100: 2c 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67  , the.** calling
d110: 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20   routine should 
d120: 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 49 4e  implement the IN
d130: 20 6f 70 65 72 61 74 6f 72 20 75 73 69 6e 67 20   operator using 
d140: 61 20 73 65 71 75 65 6e 63 65 0a 2a 2a 20 6f 66  a sequence.** of
d150: 20 45 71 20 6f 72 20 4e 65 20 63 6f 6d 70 61 72   Eq or Ne compar
d160: 69 73 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 73 2e  ison operations.
d170: 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 65 20  .**.** When the 
d180: 62 2d 74 72 65 65 20 69 73 20 62 65 69 6e 67 20  b-tree is being 
d190: 75 73 65 64 20 66 6f 72 20 6d 65 6d 62 65 72 73  used for members
d1a0: 68 69 70 20 74 65 73 74 73 2c 20 74 68 65 20 63  hip tests, the c
d1b0: 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a  alling function.
d1c0: 2a 2a 20 6d 69 67 68 74 20 6e 65 65 64 20 74 6f  ** might need to
d1d0: 20 6b 6e 6f 77 20 77 68 65 74 68 65 72 20 6f 72   know whether or
d1e0: 20 6e 6f 74 20 74 68 65 20 52 48 53 20 73 69 64   not the RHS sid
d1f0: 65 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72  e of the IN oper
d200: 61 74 6f 72 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73  ator.** contains
d210: 20 61 20 4e 55 4c 4c 2e 20 20 49 66 20 70 72 52   a NULL.  If prR
d220: 68 73 48 61 73 4e 75 6c 6c 20 69 73 20 6e 6f 74  hsHasNull is not
d230: 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20   a NULL pointer 
d240: 61 6e 64 20 0a 2a 2a 20 69 66 20 74 68 65 72 65  and .** if there
d250: 20 69 73 20 61 6e 79 20 63 68 61 6e 63 65 20 74   is any chance t
d260: 68 61 74 20 74 68 65 20 28 2e 2e 2e 29 20 6d 69  hat the (...) mi
d270: 67 68 74 20 63 6f 6e 74 61 69 6e 20 61 20 4e 55  ght contain a NU
d280: 4c 4c 20 76 61 6c 75 65 20 61 74 0a 2a 2a 20 72  LL value at.** r
d290: 75 6e 74 69 6d 65 2c 20 74 68 65 6e 20 61 20 72  untime, then a r
d2a0: 65 67 69 73 74 65 72 20 69 73 20 61 6c 6c 6f 63  egister is alloc
d2b0: 61 74 65 64 20 61 6e 64 20 74 68 65 20 72 65 67  ated and the reg
d2c0: 69 73 74 65 72 20 6e 75 6d 62 65 72 20 77 72 69  ister number wri
d2d0: 74 74 65 6e 0a 2a 2a 20 74 6f 20 2a 70 72 52 68  tten.** to *prRh
d2e0: 73 48 61 73 4e 75 6c 6c 2e 20 49 66 20 74 68 65  sHasNull. If the
d2f0: 72 65 20 69 73 20 6e 6f 20 63 68 61 6e 63 65 20  re is no chance 
d300: 74 68 61 74 20 74 68 65 20 28 2e 2e 2e 29 20 63  that the (...) c
d310: 6f 6e 74 61 69 6e 73 20 61 0a 2a 2a 20 4e 55 4c  ontains a.** NUL
d320: 4c 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 2a 70  L value, then *p
d330: 72 52 68 73 48 61 73 4e 75 6c 6c 20 69 73 20 6c  rRhsHasNull is l
d340: 65 66 74 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a  eft unchanged..*
d350: 2a 0a 2a 2a 20 49 66 20 61 20 72 65 67 69 73 74  *.** If a regist
d360: 65 72 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20  er is allocated 
d370: 61 6e 64 20 69 74 73 20 6c 6f 63 61 74 69 6f 6e  and its location
d380: 20 73 74 6f 72 65 64 20 69 6e 20 2a 70 72 52 68   stored in *prRh
d390: 73 48 61 73 4e 75 6c 6c 2c 20 74 68 65 6e 0a 2a  sHasNull, then.*
d3a0: 2a 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 74  * the value in t
d3b0: 68 61 74 20 72 65 67 69 73 74 65 72 20 77 69 6c  hat register wil
d3c0: 6c 20 62 65 20 4e 55 4c 4c 20 69 66 20 74 68 65  l be NULL if the
d3d0: 20 62 2d 74 72 65 65 20 63 6f 6e 74 61 69 6e 73   b-tree contains
d3e0: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20   one or more.** 
d3f0: 4e 55 4c 4c 20 76 61 6c 75 65 73 2c 20 61 6e 64  NULL values, and
d400: 20 69 74 20 77 69 6c 6c 20 62 65 20 73 6f 6d 65   it will be some
d410: 20 6e 6f 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65 20   non-NULL value 
d420: 69 66 20 74 68 65 20 62 2d 74 72 65 65 20 63 6f  if the b-tree co
d430: 6e 74 61 69 6e 73 20 6e 6f 0a 2a 2a 20 4e 55 4c  ntains no.** NUL
d440: 4c 20 76 61 6c 75 65 73 2e 0a 2a 2f 0a 23 69 66  L values..*/.#if
d450: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
d460: 5f 53 55 42 51 55 45 52 59 0a 69 6e 74 20 73 71  _SUBQUERY.int sq
d470: 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e 64 65 78  lite3FindInIndex
d480: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
d490: 45 78 70 72 20 2a 70 58 2c 20 75 33 32 20 69 6e  Expr *pX, u32 in
d4a0: 46 6c 61 67 73 2c 20 69 6e 74 20 2a 70 72 52 68  Flags, int *prRh
d4b0: 73 48 61 73 4e 75 6c 6c 29 7b 0a 20 20 53 65 6c  sHasNull){.  Sel
d4c0: 65 63 74 20 2a 70 3b 20 20 20 20 20 20 20 20 20  ect *p;         
d4d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d4e0: 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 74 6f 20     /* SELECT to 
d4f0: 74 68 65 20 72 69 67 68 74 20 6f 66 20 49 4e 20  the right of IN 
d500: 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e  operator */.  in
d510: 74 20 65 54 79 70 65 20 3d 20 30 3b 20 20 20 20  t eType = 0;    
d520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d530: 20 20 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 52      /* Type of R
d540: 48 53 20 74 61 62 6c 65 2e 20 49 4e 5f 49 4e 44  HS table. IN_IND
d550: 45 58 5f 2a 20 2a 2f 0a 20 20 69 6e 74 20 69 54  EX_* */.  int iT
d560: 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  ab = pParse->nTa
d570: 62 2b 2b 3b 20 20 20 20 20 20 20 20 20 20 20 20  b++;            
d580: 2f 2a 20 43 75 72 73 6f 72 20 6f 66 20 74 68 65  /* Cursor of the
d590: 20 52 48 53 20 74 61 62 6c 65 20 2a 2f 0a 20 20   RHS table */.  
d5a0: 69 6e 74 20 6d 75 73 74 42 65 55 6e 69 71 75 65  int mustBeUnique
d5b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
d5c0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
d5d0: 20 52 48 53 20 6d 75 73 74 20 62 65 20 75 6e 69   RHS must be uni
d5e0: 71 75 65 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  que */.  Vdbe *v
d5f0: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
d600: 65 28 70 50 61 72 73 65 29 3b 20 20 20 20 20 2f  e(pParse);     /
d610: 2a 20 56 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  * Virtual machin
d620: 65 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f  e being coded */
d630: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 58 2d 3e  ..  assert( pX->
d640: 6f 70 3d 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20 6d  op==TK_IN );.  m
d650: 75 73 74 42 65 55 6e 69 71 75 65 20 3d 20 28 69  ustBeUnique = (i
d660: 6e 46 6c 61 67 73 20 26 20 49 4e 5f 49 4e 44 45  nFlags & IN_INDE
d670: 58 5f 4c 4f 4f 50 29 21 3d 30 3b 0a 0a 20 20 2f  X_LOOP)!=0;..  /
d680: 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
d690: 66 20 61 6e 20 65 78 69 73 74 69 6e 67 20 74 61  f an existing ta
d6a0: 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 63 61 6e  ble or index can
d6b0: 20 62 65 20 75 73 65 64 20 74 6f 0a 20 20 2a 2a   be used to.  **
d6c0: 20 73 61 74 69 73 66 79 20 74 68 65 20 71 75 65   satisfy the que
d6d0: 72 79 2e 20 20 54 68 69 73 20 69 73 20 70 72 65  ry.  This is pre
d6e0: 66 65 72 61 62 6c 65 20 74 6f 20 67 65 6e 65 72  ferable to gener
d6f0: 61 74 69 6e 67 20 61 20 6e 65 77 20 0a 20 20 2a  ating a new .  *
d700: 2a 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c  * ephemeral tabl
d710: 65 2e 0a 20 20 2a 2f 0a 20 20 70 20 3d 20 28 45  e..  */.  p = (E
d720: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
d730: 58 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  X, EP_xIsSelect)
d740: 20 3f 20 70 58 2d 3e 78 2e 70 53 65 6c 65 63 74   ? pX->x.pSelect
d750: 20 3a 20 30 29 3b 0a 20 20 69 66 28 20 41 4c 57   : 0);.  if( ALW
d760: 41 59 53 28 70 50 61 72 73 65 2d 3e 6e 45 72 72  AYS(pParse->nErr
d770: 3d 3d 30 29 20 26 26 20 69 73 43 61 6e 64 69 64  ==0) && isCandid
d780: 61 74 65 46 6f 72 49 6e 4f 70 74 28 70 29 20 29  ateForInOpt(p) )
d790: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64  {.    sqlite3 *d
d7a0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20  b = pParse->db; 
d7b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d7c0: 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
d7d0: 69 6f 6e 20 2a 2f 0a 20 20 20 20 54 61 62 6c 65  ion */.    Table
d7e0: 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20 20   *pTab;         
d7f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d800: 20 20 2f 2a 20 54 61 62 6c 65 20 3c 74 61 62 6c    /* Table <tabl
d810: 65 3e 2e 20 2a 2f 0a 20 20 20 20 45 78 70 72 20  e>. */.    Expr 
d820: 2a 70 45 78 70 72 3b 20 20 20 20 20 20 20 20 20  *pExpr;         
d830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d840: 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20    /* Expression 
d850: 3c 63 6f 6c 75 6d 6e 3e 20 2a 2f 0a 20 20 20 20  <column> */.    
d860: 69 31 36 20 69 43 6f 6c 3b 20 20 20 20 20 20 20  i16 iCol;       
d870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d880: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
d890: 6f 66 20 63 6f 6c 75 6d 6e 20 3c 63 6f 6c 75 6d  of column <colum
d8a0: 6e 3e 20 2a 2f 0a 20 20 20 20 69 31 36 20 69 44  n> */.    i16 iD
d8b0: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
d8c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d8d0: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 69 64 78   /* Database idx
d8e0: 20 66 6f 72 20 70 54 61 62 20 2a 2f 0a 0a 20 20   for pTab */..  
d8f0: 20 20 61 73 73 65 72 74 28 20 70 20 29 3b 20 20    assert( p );  
d900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d910: 20 20 20 20 20 20 2f 2a 20 42 65 63 61 75 73 65        /* Because
d920: 20 6f 66 20 69 73 43 61 6e 64 69 64 61 74 65 46   of isCandidateF
d930: 6f 72 49 6e 4f 70 74 28 70 29 20 2a 2f 0a 20 20  orInOpt(p) */.  
d940: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c    assert( p->pEL
d950: 69 73 74 21 3d 30 20 29 3b 20 20 20 20 20 20 20  ist!=0 );       
d960: 20 20 20 20 20 20 2f 2a 20 42 65 63 61 75 73 65        /* Because
d970: 20 6f 66 20 69 73 43 61 6e 64 69 64 61 74 65 46   of isCandidateF
d980: 6f 72 49 6e 4f 70 74 28 70 29 20 2a 2f 0a 20 20  orInOpt(p) */.  
d990: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c    assert( p->pEL
d9a0: 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 21  ist->a[0].pExpr!
d9b0: 3d 30 20 29 3b 20 2f 2a 20 42 65 63 61 75 73 65  =0 ); /* Because
d9c0: 20 6f 66 20 69 73 43 61 6e 64 69 64 61 74 65 46   of isCandidateF
d9d0: 6f 72 49 6e 4f 70 74 28 70 29 20 2a 2f 0a 20 20  orInOpt(p) */.  
d9e0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 53 72    assert( p->pSr
d9f0: 63 21 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20  c!=0 );         
da00: 20 20 20 20 20 20 2f 2a 20 42 65 63 61 75 73 65        /* Because
da10: 20 6f 66 20 69 73 43 61 6e 64 69 64 61 74 65 46   of isCandidateF
da20: 6f 72 49 6e 4f 70 74 28 70 29 20 2a 2f 0a 20 20  orInOpt(p) */.  
da30: 20 20 70 54 61 62 20 3d 20 70 2d 3e 70 53 72 63    pTab = p->pSrc
da40: 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 20 20 20  ->a[0].pTab;.   
da50: 20 70 45 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69   pExpr = p->pELi
da60: 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a  st->a[0].pExpr;.
da70: 20 20 20 20 69 43 6f 6c 20 3d 20 28 69 31 36 29      iCol = (i16)
da80: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a  pExpr->iColumn;.
da90: 20 20 20 0a 20 20 20 20 2f 2a 20 43 6f 64 65 20     .    /* Code 
daa0: 61 6e 20 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f  an OP_Transactio
dab0: 6e 20 61 6e 64 20 4f 50 5f 54 61 62 6c 65 4c 6f  n and OP_TableLo
dac0: 63 6b 20 66 6f 72 20 3c 74 61 62 6c 65 3e 2e 20  ck for <table>. 
dad0: 2a 2f 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c  */.    iDb = sql
dae0: 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
daf0: 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68  x(db, pTab->pSch
db00: 65 6d 61 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ema);.    sqlite
db10: 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d  3CodeVerifySchem
db20: 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a  a(pParse, iDb);.
db30: 20 20 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65      sqlite3Table
db40: 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69 44 62  Lock(pParse, iDb
db50: 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c  , pTab->tnum, 0,
db60: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a   pTab->zName);..
db70: 20 20 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63      /* This func
db80: 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 63 61 6c  tion is only cal
db90: 6c 65 64 20 66 72 6f 6d 20 74 77 6f 20 70 6c 61  led from two pla
dba0: 63 65 73 2e 20 49 6e 20 62 6f 74 68 20 63 61 73  ces. In both cas
dbb0: 65 73 20 74 68 65 20 76 64 62 65 0a 20 20 20 20  es the vdbe.    
dbc0: 2a 2a 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  ** has already b
dbd0: 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2e 20 53  een allocated. S
dbe0: 6f 20 61 73 73 75 6d 65 20 73 71 6c 69 74 65 33  o assume sqlite3
dbf0: 47 65 74 56 64 62 65 28 29 20 69 73 20 61 6c 77  GetVdbe() is alw
dc00: 61 79 73 0a 20 20 20 20 2a 2a 20 73 75 63 63 65  ays.    ** succe
dc10: 73 73 66 75 6c 20 68 65 72 65 2e 0a 20 20 20 20  ssful here..    
dc20: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 76 29  */.    assert(v)
dc30: 3b 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30  ;.    if( iCol<0
dc40: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 41   ){.      int iA
dc50: 64 64 72 20 3d 20 73 71 6c 69 74 65 33 43 6f 64  ddr = sqlite3Cod
dc60: 65 4f 6e 63 65 28 70 50 61 72 73 65 29 3b 0a 20  eOnce(pParse);. 
dc70: 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
dc80: 65 28 76 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c  e(v);..      sql
dc90: 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50  ite3OpenTable(pP
dca0: 61 72 73 65 2c 20 69 54 61 62 2c 20 69 44 62 2c  arse, iTab, iDb,
dcb0: 20 70 54 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65   pTab, OP_OpenRe
dcc0: 61 64 29 3b 0a 20 20 20 20 20 20 65 54 79 70 65  ad);.      eType
dcd0: 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49   = IN_INDEX_ROWI
dce0: 44 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65  D;..      sqlite
dcf0: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
dd00: 20 69 41 64 64 72 29 3b 0a 20 20 20 20 7d 65 6c   iAddr);.    }el
dd10: 73 65 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20  se{.      Index 
dd20: 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20 20 20  *pIdx;          
dd30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
dd40: 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72 69 61  * Iterator varia
dd50: 62 6c 65 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a  ble */..      /*
dd60: 20 54 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   The collation s
dd70: 65 71 75 65 6e 63 65 20 75 73 65 64 20 62 79 20  equence used by 
dd80: 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20  the comparison. 
dd90: 49 66 20 61 6e 20 69 6e 64 65 78 20 69 73 20 74  If an index is t
dda0: 6f 0a 20 20 20 20 20 20 2a 2a 20 62 65 20 75 73  o.      ** be us
ddb0: 65 64 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 61  ed in place of a
ddc0: 20 74 65 6d 70 2d 74 61 62 6c 65 2c 20 69 74 20   temp-table, it 
ddd0: 6d 75 73 74 20 62 65 20 6f 72 64 65 72 65 64 20  must be ordered 
dde0: 61 63 63 6f 72 64 69 6e 67 0a 20 20 20 20 20 20  according.      
ddf0: 2a 2a 20 74 6f 20 74 68 69 73 20 63 6f 6c 6c 61  ** to this colla
de00: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 2e 20 20  tion sequence.  
de10: 2a 2f 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71  */.      CollSeq
de20: 20 2a 70 52 65 71 20 3d 20 73 71 6c 69 74 65 33   *pReq = sqlite3
de30: 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c  BinaryCompareCol
de40: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 58 2d  lSeq(pParse, pX-
de50: 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 29 3b 0a  >pLeft, pExpr);.
de60: 0a 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  .      /* Check 
de70: 74 68 61 74 20 74 68 65 20 61 66 66 69 6e 69 74  that the affinit
de80: 79 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 75  y that will be u
de90: 73 65 64 20 74 6f 20 70 65 72 66 6f 72 6d 20 74  sed to perform t
dea0: 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6d  he .      ** com
deb0: 70 61 72 69 73 6f 6e 20 69 73 20 74 68 65 20 73  parison is the s
dec0: 61 6d 65 20 61 73 20 74 68 65 20 61 66 66 69 6e  ame as the affin
ded0: 69 74 79 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  ity of the colum
dee0: 6e 2e 20 49 66 0a 20 20 20 20 20 20 2a 2a 20 69  n. If.      ** i
def0: 74 20 69 73 20 6e 6f 74 2c 20 69 74 20 69 73 20  t is not, it is 
df00: 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20  not possible to 
df10: 75 73 65 20 61 6e 79 20 69 6e 64 65 78 2e 0a 20  use any index.. 
df20: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e       */.      in
df30: 74 20 61 66 66 69 6e 69 74 79 5f 6f 6b 20 3d 20  t affinity_ok = 
df40: 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69  sqlite3IndexAffi
df50: 6e 69 74 79 4f 6b 28 70 58 2c 20 70 54 61 62 2d  nityOk(pX, pTab-
df60: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 61 66 66 69  >aCol[iCol].affi
df70: 6e 69 74 79 29 3b 0a 0a 20 20 20 20 20 20 66 6f  nity);..      fo
df80: 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  r(pIdx=pTab->pIn
df90: 64 65 78 3b 20 70 49 64 78 20 26 26 20 65 54 79  dex; pIdx && eTy
dfa0: 70 65 3d 3d 30 20 26 26 20 61 66 66 69 6e 69 74  pe==0 && affinit
dfb0: 79 5f 6f 6b 3b 20 70 49 64 78 3d 70 49 64 78 2d  y_ok; pIdx=pIdx-
dfc0: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20  >pNext){.       
dfd0: 20 69 66 28 20 28 70 49 64 78 2d 3e 61 69 43 6f   if( (pIdx->aiCo
dfe0: 6c 75 6d 6e 5b 30 5d 3d 3d 69 43 6f 6c 29 0a 20  lumn[0]==iCol). 
dff0: 20 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74          && sqlit
e000: 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62  e3FindCollSeq(db
e010: 2c 20 45 4e 43 28 64 62 29 2c 20 70 49 64 78 2d  , ENC(db), pIdx-
e020: 3e 61 7a 43 6f 6c 6c 5b 30 5d 2c 20 30 29 3d 3d  >azColl[0], 0)==
e030: 70 52 65 71 0a 20 20 20 20 20 20 20 20 20 26 26  pReq.         &&
e040: 20 28 21 6d 75 73 74 42 65 55 6e 69 71 75 65 20   (!mustBeUnique 
e050: 7c 7c 20 28 70 49 64 78 2d 3e 6e 4b 65 79 43 6f  || (pIdx->nKeyCo
e060: 6c 3d 3d 31 20 26 26 20 49 73 55 6e 69 71 75 65  l==1 && IsUnique
e070: 49 6e 64 65 78 28 70 49 64 78 29 29 29 0a 20 20  Index(pIdx))).  
e080: 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
e090: 20 20 20 69 6e 74 20 69 41 64 64 72 20 3d 20 73     int iAddr = s
e0a0: 71 6c 69 74 65 33 43 6f 64 65 4f 6e 63 65 28 70  qlite3CodeOnce(p
e0b0: 50 61 72 73 65 29 3b 20 56 64 62 65 43 6f 76 65  Parse); VdbeCove
e0c0: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
e0d0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
e0e0: 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 52  dOp3(v, OP_OpenR
e0f0: 65 61 64 2c 20 69 54 61 62 2c 20 70 49 64 78 2d  ead, iTab, pIdx-
e100: 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20 20  >tnum, iDb);.   
e110: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
e120: 62 65 53 65 74 50 34 4b 65 79 49 6e 66 6f 28 70  beSetP4KeyInfo(p
e130: 50 61 72 73 65 2c 20 70 49 64 78 29 3b 0a 20 20  Parse, pIdx);.  
e140: 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d          VdbeComm
e150: 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70 49  ent((v, "%s", pI
e160: 64 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20  dx->zName));.   
e170: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 49         assert( I
e180: 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 44 45  N_INDEX_INDEX_DE
e190: 53 43 20 3d 3d 20 49 4e 5f 49 4e 44 45 58 5f 49  SC == IN_INDEX_I
e1a0: 4e 44 45 58 5f 41 53 43 2b 31 20 29 3b 0a 20 20  NDEX_ASC+1 );.  
e1b0: 20 20 20 20 20 20 20 20 65 54 79 70 65 20 3d 20          eType = 
e1c0: 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 41  IN_INDEX_INDEX_A
e1d0: 53 43 20 2b 20 70 49 64 78 2d 3e 61 53 6f 72 74  SC + pIdx->aSort
e1e0: 4f 72 64 65 72 5b 30 5d 3b 0a 0a 20 20 20 20 20  Order[0];..     
e1f0: 20 20 20 20 20 69 66 28 20 70 72 52 68 73 48 61       if( prRhsHa
e200: 73 4e 75 6c 6c 20 26 26 20 21 70 54 61 62 2d 3e  sNull && !pTab->
e210: 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 6e 6f 74 4e 75  aCol[iCol].notNu
e220: 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ll ){.          
e230: 20 20 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c 20    *prRhsHasNull 
e240: 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
e250: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
e260: 6c 69 74 65 33 53 65 74 48 61 73 4e 75 6c 6c 46  lite3SetHasNullF
e270: 6c 61 67 28 76 2c 20 69 54 61 62 2c 20 2a 70 72  lag(v, iTab, *pr
e280: 52 68 73 48 61 73 4e 75 6c 6c 29 3b 0a 20 20 20  RhsHasNull);.   
e290: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
e2a0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
e2b0: 6d 70 48 65 72 65 28 76 2c 20 69 41 64 64 72 29  mpHere(v, iAddr)
e2c0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
e2d0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
e2e0: 20 2f 2a 20 49 66 20 6e 6f 20 70 72 65 65 78 69   /* If no preexi
e2f0: 73 74 69 6e 67 20 69 6e 64 65 78 20 69 73 20 61  sting index is a
e300: 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 74 68 65  vailable for the
e310: 20 49 4e 20 63 6c 61 75 73 65 0a 20 20 2a 2a 20   IN clause.  ** 
e320: 61 6e 64 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f  and IN_INDEX_NOO
e330: 50 20 69 73 20 61 6e 20 61 6c 6c 6f 77 65 64 20  P is an allowed 
e340: 72 65 70 6c 79 0a 20 20 2a 2a 20 61 6e 64 20 74  reply.  ** and t
e350: 68 65 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e  he RHS of the IN
e360: 20 6f 70 65 72 61 74 6f 72 20 69 73 20 61 20 6c   operator is a l
e370: 69 73 74 2c 20 6e 6f 74 20 61 20 73 75 62 71 75  ist, not a subqu
e380: 65 72 79 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65  ery.  ** and the
e390: 20 52 48 53 20 69 73 20 6e 6f 74 20 63 6f 6e 74   RHS is not cont
e3a0: 61 6e 74 20 6f 72 20 68 61 73 20 74 77 6f 20 6f  ant or has two o
e3b0: 72 20 66 65 77 65 72 20 74 65 72 6d 73 2c 0a 20  r fewer terms,. 
e3c0: 20 2a 2a 20 74 68 65 6e 20 69 74 20 69 73 20 6e   ** then it is n
e3d0: 6f 74 20 77 6f 72 74 68 20 63 72 65 61 74 69 6e  ot worth creatin
e3e0: 67 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 74  g an ephemeral t
e3f0: 61 62 6c 65 20 74 6f 20 65 76 61 6c 75 61 74 65  able to evaluate
e400: 0a 20 20 2a 2a 20 74 68 65 20 49 4e 20 6f 70 65  .  ** the IN ope
e410: 72 61 74 6f 72 20 73 6f 20 72 65 74 75 72 6e 20  rator so return 
e420: 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 2e 0a 20  IN_INDEX_NOOP.. 
e430: 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65 3d   */.  if( eType=
e440: 3d 30 0a 20 20 20 26 26 20 28 69 6e 46 6c 61 67  =0.   && (inFlag
e450: 73 20 26 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f  s & IN_INDEX_NOO
e460: 50 5f 4f 4b 29 0a 20 20 20 26 26 20 21 45 78 70  P_OK).   && !Exp
e470: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 58 2c  rHasProperty(pX,
e480: 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 0a 20   EP_xIsSelect). 
e490: 20 20 26 26 20 28 21 73 71 6c 69 74 65 33 49 6e    && (!sqlite3In
e4a0: 52 68 73 49 73 43 6f 6e 73 74 61 6e 74 28 70 58  RhsIsConstant(pX
e4b0: 29 20 7c 7c 20 70 58 2d 3e 78 2e 70 4c 69 73 74  ) || pX->x.pList
e4c0: 2d 3e 6e 45 78 70 72 3c 3d 32 29 0a 20 20 29 7b  ->nExpr<=2).  ){
e4d0: 0a 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f  .    eType = IN_
e4e0: 49 4e 44 45 58 5f 4e 4f 4f 50 3b 0a 20 20 7d 0a  INDEX_NOOP;.  }.
e4f0: 20 20 20 20 20 0a 0a 20 20 69 66 28 20 65 54 79       ..  if( eTy
e500: 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  pe==0 ){.    /* 
e510: 43 6f 75 6c 64 20 6e 6f 74 20 66 69 6e 64 20 61  Could not find a
e520: 6e 20 65 78 69 73 74 69 6e 67 20 74 61 62 6c 65  n existing table
e530: 20 6f 72 20 69 6e 64 65 78 20 74 6f 20 75 73 65   or index to use
e540: 20 61 73 20 74 68 65 20 52 48 53 20 62 2d 74 72   as the RHS b-tr
e550: 65 65 2e 0a 20 20 20 20 2a 2a 20 57 65 20 77 69  ee..    ** We wi
e560: 6c 6c 20 68 61 76 65 20 74 6f 20 67 65 6e 65 72  ll have to gener
e570: 61 74 65 20 61 6e 20 65 70 68 65 6d 65 72 61 6c  ate an ephemeral
e580: 20 74 61 62 6c 65 20 74 6f 20 64 6f 20 74 68 65   table to do the
e590: 20 6a 6f 62 2e 0a 20 20 20 20 2a 2f 0a 20 20 20   job..    */.   
e5a0: 20 75 33 32 20 73 61 76 65 64 4e 51 75 65 72 79   u32 savedNQuery
e5b0: 4c 6f 6f 70 20 3d 20 70 50 61 72 73 65 2d 3e 6e  Loop = pParse->n
e5c0: 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 20 20 69  QueryLoop;.    i
e5d0: 6e 74 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20  nt rMayHaveNull 
e5e0: 3d 20 30 3b 0a 20 20 20 20 65 54 79 70 65 20 3d  = 0;.    eType =
e5f0: 20 49 4e 5f 49 4e 44 45 58 5f 45 50 48 3b 0a 20   IN_INDEX_EPH;. 
e600: 20 20 20 69 66 28 20 69 6e 46 6c 61 67 73 20 26     if( inFlags &
e610: 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 20 29   IN_INDEX_LOOP )
e620: 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  {.      pParse->
e630: 6e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 30 3b 0a  nQueryLoop = 0;.
e640: 20 20 20 20 20 20 69 66 28 20 70 58 2d 3e 70 4c        if( pX->pL
e650: 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 26  eft->iColumn<0 &
e660: 26 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  & !ExprHasProper
e670: 74 79 28 70 58 2c 20 45 50 5f 78 49 73 53 65 6c  ty(pX, EP_xIsSel
e680: 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ect) ){.        
e690: 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58  eType = IN_INDEX
e6a0: 5f 52 4f 57 49 44 3b 0a 20 20 20 20 20 20 7d 0a  _ROWID;.      }.
e6b0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 72      }else if( pr
e6c0: 52 68 73 48 61 73 4e 75 6c 6c 20 29 7b 0a 20 20  RhsHasNull ){.  
e6d0: 20 20 20 20 2a 70 72 52 68 73 48 61 73 4e 75 6c      *prRhsHasNul
e6e0: 6c 20 3d 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c  l = rMayHaveNull
e6f0: 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
e700: 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  m;.    }.    sql
e710: 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63  ite3CodeSubselec
e720: 74 28 70 50 61 72 73 65 2c 20 70 58 2c 20 72 4d  t(pParse, pX, rM
e730: 61 79 48 61 76 65 4e 75 6c 6c 2c 20 65 54 79 70  ayHaveNull, eTyp
e740: 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49  e==IN_INDEX_ROWI
e750: 44 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  D);.    pParse->
e760: 6e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 73 61 76  nQueryLoop = sav
e770: 65 64 4e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20  edNQueryLoop;.  
e780: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 58 2d 3e 69  }else{.    pX->i
e790: 54 61 62 6c 65 20 3d 20 69 54 61 62 3b 0a 20 20  Table = iTab;.  
e7a0: 7d 0a 20 20 72 65 74 75 72 6e 20 65 54 79 70 65  }.  return eType
e7b0: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
e7c0: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
e7d0: 66 6f 72 20 73 63 61 6c 61 72 20 73 75 62 71 75  for scalar subqu
e7e0: 65 72 69 65 73 20 75 73 65 64 20 61 73 20 61 20  eries used as a 
e7f0: 73 75 62 71 75 65 72 79 20 65 78 70 72 65 73 73  subquery express
e800: 69 6f 6e 2c 20 45 58 49 53 54 53 2c 0a 2a 2a 20  ion, EXISTS,.** 
e810: 6f 72 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 2e  or IN operators.
e820: 20 20 45 78 61 6d 70 6c 65 73 3a 0a 2a 2a 0a 2a    Examples:.**.*
e830: 2a 20 20 20 20 20 28 53 45 4c 45 43 54 20 61 20  *     (SELECT a 
e840: 46 52 4f 4d 20 62 29 20 20 20 20 20 20 20 20 20  FROM b)         
e850: 20 2d 2d 20 73 75 62 71 75 65 72 79 0a 2a 2a 20   -- subquery.** 
e860: 20 20 20 20 45 58 49 53 54 53 20 28 53 45 4c 45      EXISTS (SELE
e870: 43 54 20 61 20 46 52 4f 4d 20 62 29 20 20 20 2d  CT a FROM b)   -
e880: 2d 20 45 58 49 53 54 53 20 73 75 62 71 75 65 72  - EXISTS subquer
e890: 79 0a 2a 2a 20 20 20 20 20 78 20 49 4e 20 28 34  y.**     x IN (4
e8a0: 2c 35 2c 31 31 29 20 20 20 20 20 20 20 20 20 20  ,5,11)          
e8b0: 20 20 20 20 2d 2d 20 49 4e 20 6f 70 65 72 61 74      -- IN operat
e8c0: 6f 72 20 77 69 74 68 20 6c 69 73 74 20 6f 6e 20  or with list on 
e8d0: 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 0a  right-hand side.
e8e0: 2a 2a 20 20 20 20 20 78 20 49 4e 20 28 53 45 4c  **     x IN (SEL
e8f0: 45 43 54 20 61 20 46 52 4f 4d 20 62 29 20 20 20  ECT a FROM b)   
e900: 20 20 2d 2d 20 49 4e 20 6f 70 65 72 61 74 6f 72    -- IN operator
e910: 20 77 69 74 68 20 73 75 62 71 75 65 72 79 20 6f   with subquery o
e920: 6e 20 74 68 65 20 72 69 67 68 74 0a 2a 2a 0a 2a  n the right.**.*
e930: 2a 20 54 68 65 20 70 45 78 70 72 20 70 61 72 61  * The pExpr para
e940: 6d 65 74 65 72 20 64 65 73 63 72 69 62 65 73 20  meter describes 
e950: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74  the expression t
e960: 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
e970: 20 49 4e 0a 2a 2a 20 6f 70 65 72 61 74 6f 72 20   IN.** operator 
e980: 6f 72 20 73 75 62 71 75 65 72 79 2e 0a 2a 2a 0a  or subquery..**.
e990: 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72 20  ** If parameter 
e9a0: 69 73 52 6f 77 69 64 20 69 73 20 6e 6f 6e 2d 7a  isRowid is non-z
e9b0: 65 72 6f 2c 20 74 68 65 6e 20 65 78 70 72 65 73  ero, then expres
e9c0: 73 69 6f 6e 20 70 45 78 70 72 20 69 73 20 67 75  sion pExpr is gu
e9d0: 61 72 61 6e 74 65 65 64 0a 2a 2a 20 74 6f 20 62  aranteed.** to b
e9e0: 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3c  e of the form "<
e9f0: 72 6f 77 69 64 3e 20 49 4e 20 28 3f 2c 20 3f 2c  rowid> IN (?, ?,
ea00: 20 3f 29 22 2c 20 77 68 65 72 65 20 3c 72 6f 77   ?)", where <row
ea10: 69 64 3e 20 69 73 20 61 20 72 65 66 65 72 65 6e  id> is a referen
ea20: 63 65 0a 2a 2a 20 74 6f 20 73 6f 6d 65 20 69 6e  ce.** to some in
ea30: 74 65 67 65 72 20 6b 65 79 20 63 6f 6c 75 6d 6e  teger key column
ea40: 20 6f 66 20 61 20 74 61 62 6c 65 20 42 2d 54 72   of a table B-Tr
ea50: 65 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ee. In this case
ea60: 2c 20 75 73 65 20 61 6e 0a 2a 2a 20 69 6e 74 6b  , use an.** intk
ea70: 65 79 20 42 2d 54 72 65 65 20 74 6f 20 73 74 6f  ey B-Tree to sto
ea80: 72 65 20 74 68 65 20 73 65 74 20 6f 66 20 49 4e  re the set of IN
ea90: 28 2e 2e 2e 29 20 76 61 6c 75 65 73 20 69 6e 73  (...) values ins
eaa0: 74 65 61 64 20 6f 66 20 74 68 65 20 75 73 75 61  tead of the usua
eab0: 6c 0a 2a 2a 20 28 73 6c 6f 77 65 72 29 20 76 61  l.** (slower) va
eac0: 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 6b 65  riable length ke
ead0: 79 73 20 42 2d 54 72 65 65 2e 0a 2a 2a 0a 2a 2a  ys B-Tree..**.**
eae0: 20 49 66 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c   If rMayHaveNull
eaf0: 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
eb00: 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  at means that th
eb10: 65 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 61  e operation is a
eb20: 6e 20 49 4e 0a 2a 2a 20 28 6e 6f 74 20 61 20 53  n IN.** (not a S
eb30: 45 4c 45 43 54 20 6f 72 20 45 58 49 53 54 53 29  ELECT or EXISTS)
eb40: 20 61 6e 64 20 74 68 61 74 20 74 68 65 20 52 48   and that the RH
eb50: 53 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 73  S might contains
eb60: 20 4e 55 4c 4c 73 2e 0a 2a 2a 20 41 6c 6c 20 74   NULLs..** All t
eb70: 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73  his routine does
eb80: 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 20 74   is initialize t
eb90: 68 65 20 72 65 67 69 73 74 65 72 20 67 69 76 65  he register give
eba0: 6e 20 62 79 20 72 4d 61 79 48 61 76 65 4e 75 6c  n by rMayHaveNul
ebb0: 6c 0a 2a 2a 20 74 6f 20 4e 55 4c 4c 2e 20 20 43  l.** to NULL.  C
ebc0: 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 73 20  alling routines 
ebd0: 77 69 6c 6c 20 74 61 6b 65 20 63 61 72 65 20 6f  will take care o
ebe0: 66 20 63 68 61 6e 67 69 6e 67 20 74 68 69 73 20  f changing this 
ebf0: 72 65 67 69 73 74 65 72 0a 2a 2a 20 76 61 6c 75  register.** valu
ec00: 65 20 74 6f 20 6e 6f 6e 2d 4e 55 4c 4c 20 69 66  e to non-NULL if
ec10: 20 74 68 65 20 52 48 53 20 69 73 20 4e 55 4c 4c   the RHS is NULL
ec20: 2d 66 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  -free..**.** For
ec30: 20 61 20 53 45 4c 45 43 54 20 6f 72 20 45 58 49   a SELECT or EXI
ec40: 53 54 53 20 6f 70 65 72 61 74 6f 72 2c 20 72 65  STS operator, re
ec50: 74 75 72 6e 20 74 68 65 20 72 65 67 69 73 74 65  turn the registe
ec60: 72 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65  r that holds the
ec70: 0a 2a 2a 20 72 65 73 75 6c 74 2e 20 20 46 6f 72  .** result.  For
ec80: 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 20 6f 72   IN operators or
ec90: 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   if an error occ
eca0: 75 72 73 2c 20 74 68 65 20 72 65 74 75 72 6e 20  urs, the return 
ecb0: 76 61 6c 75 65 20 69 73 20 30 2e 0a 2a 2f 0a 23  value is 0..*/.#
ecc0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
ecd0: 49 54 5f 53 55 42 51 55 45 52 59 0a 69 6e 74 20  IT_SUBQUERY.int 
ece0: 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65  sqlite3CodeSubse
ecf0: 6c 65 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70  lect(.  Parse *p
ed00: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
ed10: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
ed20: 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45  xt */.  Expr *pE
ed30: 78 70 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  xpr,            
ed40: 2f 2a 20 54 68 65 20 49 4e 2c 20 53 45 4c 45 43  /* The IN, SELEC
ed50: 54 2c 20 6f 72 20 45 58 49 53 54 53 20 6f 70 65  T, or EXISTS ope
ed60: 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 72  rator */.  int r
ed70: 48 61 73 4e 75 6c 6c 46 6c 61 67 2c 20 20 20 20  HasNullFlag,    
ed80: 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 74     /* Register t
ed90: 68 61 74 20 72 65 63 6f 72 64 73 20 77 68 65 74  hat records whet
eda0: 68 65 72 20 4e 55 4c 4c 73 20 65 78 69 73 74 20  her NULLs exist 
edb0: 69 6e 20 52 48 53 20 2a 2f 0a 20 20 69 6e 74 20  in RHS */.  int 
edc0: 69 73 52 6f 77 69 64 20 20 20 20 20 20 20 20 20  isRowid         
edd0: 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20      /* If true, 
ede0: 4c 48 53 20 6f 66 20 49 4e 20 6f 70 65 72 61 74  LHS of IN operat
edf0: 6f 72 20 69 73 20 61 20 72 6f 77 69 64 20 2a 2f  or is a rowid */
ee00: 0a 29 7b 0a 20 20 69 6e 74 20 6a 6d 70 49 66 44  .){.  int jmpIfD
ee10: 79 6e 61 6d 69 63 20 3d 20 2d 31 3b 20 20 20 20  ynamic = -1;    
ee20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ee30: 20 20 2f 2a 20 4f 6e 65 2d 74 69 6d 65 20 74 65    /* One-time te
ee40: 73 74 20 61 64 64 72 65 73 73 20 2a 2f 0a 20 20  st address */.  
ee50: 69 6e 74 20 72 52 65 67 20 3d 20 30 3b 20 20 20  int rReg = 0;   
ee60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ee70: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73          /* Regis
ee80: 74 65 72 20 73 74 6f 72 69 6e 67 20 72 65 73 75  ter storing resu
ee90: 6c 74 69 6e 67 20 2a 2f 0a 20 20 56 64 62 65 20  lting */.  Vdbe 
eea0: 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  *v = sqlite3GetV
eeb0: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
eec0: 66 28 20 4e 45 56 45 52 28 76 3d 3d 30 29 20 29  f( NEVER(v==0) )
eed0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 71 6c   return 0;.  sql
eee0: 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73  ite3ExprCachePus
eef0: 68 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 2f 2a  h(pParse);..  /*
ef00: 20 54 68 69 73 20 63 6f 64 65 20 6d 75 73 74 20   This code must 
ef10: 62 65 20 72 75 6e 20 69 6e 20 69 74 73 20 65 6e  be run in its en
ef20: 74 69 72 65 74 79 20 65 76 65 72 79 20 74 69 6d  tirety every tim
ef30: 65 20 69 74 20 69 73 20 65 6e 63 6f 75 6e 74 65  e it is encounte
ef40: 72 65 64 0a 20 20 2a 2a 20 69 66 20 61 6e 79 20  red.  ** if any 
ef50: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
ef60: 20 69 73 20 74 72 75 65 3a 0a 20 20 2a 2a 0a 20   is true:.  **. 
ef70: 20 2a 2a 20 20 20 20 2a 20 20 54 68 65 20 72 69   **    *  The ri
ef80: 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 69 73  ght-hand side is
ef90: 20 61 20 63 6f 72 72 65 6c 61 74 65 64 20 73 75   a correlated su
efa0: 62 71 75 65 72 79 0a 20 20 2a 2a 20 20 20 20 2a  bquery.  **    *
efb0: 20 20 54 68 65 20 72 69 67 68 74 2d 68 61 6e 64    The right-hand
efc0: 20 73 69 64 65 20 69 73 20 61 6e 20 65 78 70 72   side is an expr
efd0: 65 73 73 69 6f 6e 20 6c 69 73 74 20 63 6f 6e 74  ession list cont
efe0: 61 69 6e 69 6e 67 20 76 61 72 69 61 62 6c 65 73  aining variables
eff0: 0a 20 20 2a 2a 20 20 20 20 2a 20 20 57 65 20 61  .  **    *  We a
f000: 72 65 20 69 6e 73 69 64 65 20 61 20 74 72 69 67  re inside a trig
f010: 67 65 72 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  ger.  **.  ** If
f020: 20 61 6c 6c 20 6f 66 20 74 68 65 20 61 62 6f 76   all of the abov
f030: 65 20 61 72 65 20 66 61 6c 73 65 2c 20 74 68 65  e are false, the
f040: 6e 20 77 65 20 63 61 6e 20 72 75 6e 20 74 68 69  n we can run thi
f050: 73 20 63 6f 64 65 20 6a 75 73 74 20 6f 6e 63 65  s code just once
f060: 0a 20 20 2a 2a 20 73 61 76 65 20 74 68 65 20 72  .  ** save the r
f070: 65 73 75 6c 74 73 2c 20 61 6e 64 20 72 65 75 73  esults, and reus
f080: 65 20 74 68 65 20 73 61 6d 65 20 72 65 73 75 6c  e the same resul
f090: 74 20 6f 6e 20 73 75 62 73 65 71 75 65 6e 74 20  t on subsequent 
f0a0: 69 6e 76 6f 63 61 74 69 6f 6e 73 2e 0a 20 20 2a  invocations..  *
f0b0: 2f 0a 20 20 69 66 28 20 21 45 78 70 72 48 61 73  /.  if( !ExprHas
f0c0: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
f0d0: 45 50 5f 56 61 72 53 65 6c 65 63 74 29 20 29 7b  EP_VarSelect) ){
f0e0: 0a 20 20 20 20 6a 6d 70 49 66 44 79 6e 61 6d 69  .    jmpIfDynami
f0f0: 63 20 3d 20 73 71 6c 69 74 65 33 43 6f 64 65 4f  c = sqlite3CodeO
f100: 6e 63 65 28 70 50 61 72 73 65 29 3b 20 56 64 62  nce(pParse); Vdb
f110: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
f120: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
f130: 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20  E_OMIT_EXPLAIN. 
f140: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70   if( pParse->exp
f150: 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 63  lain==2 ){.    c
f160: 68 61 72 20 2a 7a 4d 73 67 20 3d 20 73 71 6c 69  har *zMsg = sqli
f170: 74 65 33 4d 50 72 69 6e 74 66 28 0a 20 20 20 20  te3MPrintf(.    
f180: 20 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2c 20      pParse->db, 
f190: 22 45 58 45 43 55 54 45 20 25 73 25 73 20 53 55  "EXECUTE %s%s SU
f1a0: 42 51 55 45 52 59 20 25 64 22 2c 20 6a 6d 70 49  BQUERY %d", jmpI
f1b0: 66 44 79 6e 61 6d 69 63 3e 3d 30 3f 22 22 3a 22  fDynamic>=0?"":"
f1c0: 43 4f 52 52 45 4c 41 54 45 44 20 22 2c 0a 20 20  CORRELATED ",.  
f1d0: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 3d        pExpr->op=
f1e0: 3d 54 4b 5f 49 4e 3f 22 4c 49 53 54 22 3a 22 53  =TK_IN?"LIST":"S
f1f0: 43 41 4c 41 52 22 2c 20 70 50 61 72 73 65 2d 3e  CALAR", pParse->
f200: 69 4e 65 78 74 53 65 6c 65 63 74 49 64 0a 20 20  iNextSelectId.  
f210: 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33    );.    sqlite3
f220: 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
f230: 5f 45 78 70 6c 61 69 6e 2c 20 70 50 61 72 73 65  _Explain, pParse
f240: 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 30 2c 20  ->iSelectId, 0, 
f250: 30 2c 20 7a 4d 73 67 2c 20 50 34 5f 44 59 4e 41  0, zMsg, P4_DYNA
f260: 4d 49 43 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  MIC);.  }.#endif
f270: 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70  ..  switch( pExp
f280: 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  r->op ){.    cas
f290: 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20  e TK_IN: {.     
f2a0: 20 63 68 61 72 20 61 66 66 69 6e 69 74 79 3b 20   char affinity; 
f2b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f2c0: 41 66 66 69 6e 69 74 79 20 6f 66 20 74 68 65 20  Affinity of the 
f2d0: 4c 48 53 20 6f 66 20 74 68 65 20 49 4e 20 2a 2f  LHS of the IN */
f2e0: 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b  .      int addr;
f2f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f300: 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
f310: 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
f320: 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f  l instruction */
f330: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65  .      Expr *pLe
f340: 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66  ft = pExpr->pLef
f350: 74 3b 20 2f 2a 20 74 68 65 20 4c 48 53 20 6f 66  t; /* the LHS of
f360: 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   the IN operator
f370: 20 2a 2f 0a 20 20 20 20 20 20 4b 65 79 49 6e 66   */.      KeyInf
f380: 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 30 3b  o *pKeyInfo = 0;
f390: 20 20 20 20 20 20 2f 2a 20 4b 65 79 20 69 6e 66        /* Key inf
f3a0: 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 0a 20 20 20  ormation */..   
f3b0: 20 20 20 61 66 66 69 6e 69 74 79 20 3d 20 73 71     affinity = sq
f3c0: 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74  lite3ExprAffinit
f3d0: 79 28 70 4c 65 66 74 29 3b 0a 0a 20 20 20 20 20  y(pLeft);..     
f3e0: 20 2f 2a 20 57 68 65 74 68 65 72 20 74 68 69 73   /* Whether this
f3f0: 20 69 73 20 61 6e 20 27 78 20 49 4e 28 53 45 4c   is an 'x IN(SEL
f400: 45 43 54 2e 2e 2e 29 27 20 6f 72 20 61 6e 20 27  ECT...)' or an '
f410: 78 20 49 4e 28 3c 65 78 70 72 6c 69 73 74 3e 29  x IN(<exprlist>)
f420: 27 0a 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65  '.      ** expre
f430: 73 73 69 6f 6e 20 69 74 20 69 73 20 68 61 6e 64  ssion it is hand
f440: 6c 65 64 20 74 68 65 20 73 61 6d 65 20 77 61 79  led the same way
f450: 2e 20 20 41 6e 20 65 70 68 65 6d 65 72 61 6c 20  .  An ephemeral 
f460: 74 61 62 6c 65 20 69 73 20 0a 20 20 20 20 20 20  table is .      
f470: 2a 2a 20 66 69 6c 6c 65 64 20 77 69 74 68 20 73  ** filled with s
f480: 69 6e 67 6c 65 2d 66 69 65 6c 64 20 69 6e 64 65  ingle-field inde
f490: 78 20 6b 65 79 73 20 72 65 70 72 65 73 65 6e 74  x keys represent
f4a0: 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74 73 0a  ing the results.
f4b0: 20 20 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68        ** from th
f4c0: 65 20 53 45 4c 45 43 54 20 6f 72 20 74 68 65 20  e SELECT or the 
f4d0: 3c 65 78 70 72 6c 69 73 74 3e 2e 0a 20 20 20 20  <exprlist>..    
f4e0: 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66    **.      ** If
f4f0: 20 74 68 65 20 27 78 27 20 65 78 70 72 65 73 73   the 'x' express
f500: 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20  ion is a column 
f510: 76 61 6c 75 65 2c 20 6f 72 20 74 68 65 20 53 45  value, or the SE
f520: 4c 45 43 54 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a  LECT....      **
f530: 20 73 74 61 74 65 6d 65 6e 74 20 72 65 74 75 72   statement retur
f540: 6e 73 20 61 20 63 6f 6c 75 6d 6e 20 76 61 6c 75  ns a column valu
f550: 65 2c 20 74 68 65 6e 20 74 68 65 20 61 66 66 69  e, then the affi
f560: 6e 69 74 79 20 6f 66 20 74 68 61 74 0a 20 20 20  nity of that.   
f570: 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 69 73 20     ** column is 
f580: 75 73 65 64 20 74 6f 20 62 75 69 6c 64 20 74 68  used to build th
f590: 65 20 69 6e 64 65 78 20 6b 65 79 73 2e 20 49 66  e index keys. If
f5a0: 20 62 6f 74 68 20 27 78 27 20 61 6e 64 20 74 68   both 'x' and th
f5b0: 65 0a 20 20 20 20 20 20 2a 2a 20 53 45 4c 45 43  e.      ** SELEC
f5c0: 54 2e 2e 2e 20 73 74 61 74 65 6d 65 6e 74 20 61  T... statement a
f5d0: 72 65 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e  re columns, then
f5e0: 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e 69 74   numeric affinit
f5f0: 79 20 69 73 20 75 73 65 64 0a 20 20 20 20 20 20  y is used.      
f600: 2a 2a 20 69 66 20 65 69 74 68 65 72 20 63 6f 6c  ** if either col
f610: 75 6d 6e 20 68 61 73 20 4e 55 4d 45 52 49 43 20  umn has NUMERIC 
f620: 6f 72 20 49 4e 54 45 47 45 52 20 61 66 66 69 6e  or INTEGER affin
f630: 69 74 79 2e 20 49 66 20 6e 65 69 74 68 65 72 0a  ity. If neither.
f640: 20 20 20 20 20 20 2a 2a 20 27 78 27 20 6e 6f 72        ** 'x' nor
f650: 20 74 68 65 20 53 45 4c 45 43 54 2e 2e 2e 20 73   the SELECT... s
f660: 74 61 74 65 6d 65 6e 74 20 61 72 65 20 63 6f 6c  tatement are col
f670: 75 6d 6e 73 2c 20 74 68 65 6e 20 6e 75 6d 65 72  umns, then numer
f680: 69 63 20 61 66 66 69 6e 69 74 79 0a 20 20 20 20  ic affinity.    
f690: 20 20 2a 2a 20 69 73 20 75 73 65 64 2e 0a 20 20    ** is used..  
f6a0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 45 78      */.      pEx
f6b0: 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 50 61  pr->iTable = pPa
f6c0: 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
f6d0: 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
f6e0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
f6f0: 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
f700: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
f710: 21 69 73 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  !isRowid);.     
f720: 20 70 4b 65 79 49 6e 66 6f 20 3d 20 69 73 52 6f   pKeyInfo = isRo
f730: 77 69 64 20 3f 20 30 20 3a 20 73 71 6c 69 74 65  wid ? 0 : sqlite
f740: 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 70 50  3KeyInfoAlloc(pP
f750: 61 72 73 65 2d 3e 64 62 2c 20 31 2c 20 31 29 3b  arse->db, 1, 1);
f760: 0a 0a 20 20 20 20 20 20 69 66 28 20 45 78 70 72  ..      if( Expr
f770: 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
f780: 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
f790: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43   ){.        /* C
f7a0: 61 73 65 20 31 3a 20 20 20 20 20 65 78 70 72 20  ase 1:     expr 
f7b0: 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 0a  IN (SELECT ...).
f7c0: 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
f7d0: 20 20 20 2a 2a 20 47 65 6e 65 72 61 74 65 20 63     ** Generate c
f7e0: 6f 64 65 20 74 6f 20 77 72 69 74 65 20 74 68 65  ode to write the
f7f0: 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20   results of the 
f800: 73 65 6c 65 63 74 20 69 6e 74 6f 20 74 68 65 20  select into the 
f810: 74 65 6d 70 6f 72 61 72 79 0a 20 20 20 20 20 20  temporary.      
f820: 20 20 2a 2a 20 74 61 62 6c 65 20 61 6c 6c 6f 63    ** table alloc
f830: 61 74 65 64 20 61 6e 64 20 6f 70 65 6e 65 64 20  ated and opened 
f840: 61 62 6f 76 65 2e 0a 20 20 20 20 20 20 20 20 2a  above..        *
f850: 2f 0a 20 20 20 20 20 20 20 20 53 65 6c 65 63 74  /.        Select
f860: 20 2a 70 53 65 6c 65 63 74 20 3d 20 70 45 78 70   *pSelect = pExp
f870: 72 2d 3e 78 2e 70 53 65 6c 65 63 74 3b 0a 20 20  r->x.pSelect;.  
f880: 20 20 20 20 20 20 53 65 6c 65 63 74 44 65 73 74        SelectDest
f890: 20 64 65 73 74 3b 0a 20 20 20 20 20 20 20 20 45   dest;.        E
f8a0: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b  xprList *pEList;
f8b0: 0a 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ..        assert
f8c0: 28 20 21 69 73 52 6f 77 69 64 20 29 3b 0a 20 20  ( !isRowid );.  
f8d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
f8e0: 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73  ectDestInit(&des
f8f0: 74 2c 20 53 52 54 5f 53 65 74 2c 20 70 45 78 70  t, SRT_Set, pExp
f900: 72 2d 3e 69 54 61 62 6c 65 29 3b 0a 20 20 20 20  r->iTable);.    
f910: 20 20 20 20 64 65 73 74 2e 61 66 66 53 64 73 74      dest.affSdst
f920: 20 3d 20 28 75 38 29 61 66 66 69 6e 69 74 79 3b   = (u8)affinity;
f930: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
f940: 20 28 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 26   (pExpr->iTable&
f950: 30 78 30 30 30 30 46 46 46 46 29 3d 3d 70 45 78  0x0000FFFF)==pEx
f960: 70 72 2d 3e 69 54 61 62 6c 65 20 29 3b 0a 20 20  pr->iTable );.  
f970: 20 20 20 20 20 20 70 53 65 6c 65 63 74 2d 3e 69        pSelect->i
f980: 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20  Limit = 0;.     
f990: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 53 65     testcase( pSe
f9a0: 6c 65 63 74 2d 3e 73 65 6c 46 6c 61 67 73 20 26  lect->selFlags &
f9b0: 20 53 46 5f 44 69 73 74 69 6e 63 74 20 29 3b 0a   SF_Distinct );.
f9c0: 20 20 20 20 20 20 20 20 70 53 65 6c 65 63 74 2d          pSelect-
f9d0: 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46  >selFlags &= ~SF
f9e0: 5f 44 69 73 74 69 6e 63 74 3b 0a 20 20 20 20 20  _Distinct;.     
f9f0: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4b 65     testcase( pKe
fa00: 79 49 6e 66 6f 3d 3d 30 20 29 3b 20 2f 2a 20 43  yInfo==0 ); /* C
fa10: 61 75 73 65 64 20 62 79 20 4f 4f 4d 20 69 6e 20  aused by OOM in 
fa20: 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c  sqlite3KeyInfoAl
fa30: 6c 6f 63 28 29 20 2a 2f 0a 20 20 20 20 20 20 20  loc() */.       
fa40: 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65   if( sqlite3Sele
fa50: 63 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65  ct(pParse, pSele
fa60: 63 74 2c 20 26 64 65 73 74 29 20 29 7b 0a 20 20  ct, &dest) ){.  
fa70: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4b          sqlite3K
fa80: 65 79 49 6e 66 6f 55 6e 72 65 66 28 70 4b 65 79  eyInfoUnref(pKey
fa90: 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 20  Info);.         
faa0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
fab0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 45 4c     }.        pEL
fac0: 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70  ist = pSelect->p
fad0: 45 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 61  EList;.        a
fae0: 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 21  ssert( pKeyInfo!
faf0: 3d 30 20 29 3b 20 2f 2a 20 4f 4f 4d 20 77 69 6c  =0 ); /* OOM wil
fb00: 6c 20 63 61 75 73 65 20 65 78 69 74 20 61 66 74  l cause exit aft
fb10: 65 72 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  er sqlite3Select
fb20: 28 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73  () */.        as
fb30: 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20  sert( pEList!=0 
fb40: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
fb50: 74 28 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  t( pEList->nExpr
fb60: 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  >0 );.        as
fb70: 73 65 72 74 28 20 73 71 6c 69 74 65 33 4b 65 79  sert( sqlite3Key
fb80: 49 6e 66 6f 49 73 57 72 69 74 65 61 62 6c 65 28  InfoIsWriteable(
fb90: 70 4b 65 79 49 6e 66 6f 29 20 29 3b 0a 20 20 20  pKeyInfo) );.   
fba0: 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 61       pKeyInfo->a
fbb0: 43 6f 6c 6c 5b 30 5d 20 3d 20 73 71 6c 69 74 65  Coll[0] = sqlite
fbc0: 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f  3BinaryCompareCo
fbd0: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 45  llSeq(pParse, pE
fbe0: 78 70 72 2d 3e 70 4c 65 66 74 2c 0a 20 20 20 20  xpr->pLeft,.    
fbf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc20: 20 20 20 20 20 70 45 4c 69 73 74 2d 3e 61 5b 30       pEList->a[0
fc30: 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
fc40: 7d 65 6c 73 65 20 69 66 28 20 41 4c 57 41 59 53  }else if( ALWAYS
fc50: 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 21  (pExpr->x.pList!
fc60: 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  =0) ){.        /
fc70: 2a 20 43 61 73 65 20 32 3a 20 20 20 20 20 65 78  * Case 2:     ex
fc80: 70 72 20 49 4e 20 28 65 78 70 72 6c 69 73 74 29  pr IN (exprlist)
fc90: 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
fca0: 20 20 20 20 2a 2a 20 46 6f 72 20 65 61 63 68 20      ** For each 
fcb0: 65 78 70 72 65 73 73 69 6f 6e 2c 20 62 75 69 6c  expression, buil
fcc0: 64 20 61 6e 20 69 6e 64 65 78 20 6b 65 79 20 66  d an index key f
fcd0: 72 6f 6d 20 74 68 65 20 65 76 61 6c 75 61 74 69  rom the evaluati
fce0: 6f 6e 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a  on and.        *
fcf0: 2a 20 73 74 6f 72 65 20 69 74 20 69 6e 20 74 68  * store it in th
fd00: 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  e temporary tabl
fd10: 65 2e 20 49 66 20 3c 65 78 70 72 3e 20 69 73 20  e. If <expr> is 
fd20: 61 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e 20 75  a column, then u
fd30: 73 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  se.        ** th
fd40: 61 74 20 63 6f 6c 75 6d 6e 73 20 61 66 66 69 6e  at columns affin
fd50: 69 74 79 20 77 68 65 6e 20 62 75 69 6c 64 69 6e  ity when buildin
fd60: 67 20 69 6e 64 65 78 20 6b 65 79 73 2e 20 49 66  g index keys. If
fd70: 20 3c 65 78 70 72 3e 20 69 73 20 6e 6f 74 0a 20   <expr> is not. 
fd80: 20 20 20 20 20 20 20 2a 2a 20 61 20 63 6f 6c 75         ** a colu
fd90: 6d 6e 2c 20 75 73 65 20 6e 75 6d 65 72 69 63 20  mn, use numeric 
fda0: 61 66 66 69 6e 69 74 79 2e 0a 20 20 20 20 20 20  affinity..      
fdb0: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74    */.        int
fdc0: 20 69 3b 0a 20 20 20 20 20 20 20 20 45 78 70 72   i;.        Expr
fdd0: 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 45  List *pList = pE
fde0: 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20  xpr->x.pList;.  
fdf0: 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70        struct Exp
fe00: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
fe10: 6d 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  m;.        int r
fe20: 31 2c 20 72 32 2c 20 72 33 3b 0a 0a 20 20 20 20  1, r2, r3;..    
fe30: 20 20 20 20 69 66 28 20 21 61 66 66 69 6e 69 74      if( !affinit
fe40: 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  y ){.          a
fe50: 66 66 69 6e 69 74 79 20 3d 20 53 51 4c 49 54 45  ffinity = SQLITE
fe60: 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20  _AFF_NONE;.     
fe70: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
fe80: 20 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20   pKeyInfo ){.   
fe90: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73         assert( s
fea0: 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49 73 57  qlite3KeyInfoIsW
feb0: 72 69 74 65 61 62 6c 65 28 70 4b 65 79 49 6e 66  riteable(pKeyInf
fec0: 6f 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  o) );.          
fed0: 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b  pKeyInfo->aColl[
fee0: 30 5d 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  0] = sqlite3Expr
fef0: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
ff00: 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
ff10: 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
ff20: 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67    /* Loop throug
ff30: 68 20 65 61 63 68 20 65 78 70 72 65 73 73 69 6f  h each expressio
ff40: 6e 20 69 6e 20 3c 65 78 70 72 6c 69 73 74 3e 2e  n in <exprlist>.
ff50: 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 31 20 3d   */.        r1 =
ff60: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
ff70: 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
ff80: 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33      r2 = sqlite3
ff90: 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
ffa0: 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
ffb0: 69 73 52 6f 77 69 64 20 29 20 73 71 6c 69 74 65  isRowid ) sqlite
ffc0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
ffd0: 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 32 29 3b 0a  P_Null, 0, r2);.
ffe0: 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 70 4c          for(i=pL
fff0: 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65  ist->nExpr, pIte
10000 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3e 30 3b  m=pList->a; i>0;
10010 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i--, pItem++){.
10020 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a            Expr *
10030 70 45 32 20 3d 20 70 49 74 65 6d 2d 3e 70 45 78  pE2 = pItem->pEx
10040 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  pr;.          in
10050 74 20 69 56 61 6c 54 6f 49 6e 73 3b 0a 0a 20 20  t iValToIns;..  
10060 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
10070 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
10080 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 20 74 68 65  not constant the
10090 6e 20 77 65 20 77 69 6c 6c 20 6e 65 65 64 20 74  n we will need t
100a0 6f 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 64  o.          ** d
100b0 69 73 61 62 6c 65 20 74 68 65 20 74 65 73 74 20  isable the test 
100c0 74 68 61 74 20 77 61 73 20 67 65 6e 65 72 61 74  that was generat
100d0 65 64 20 61 62 6f 76 65 20 74 68 61 74 20 6d 61  ed above that ma
100e0 6b 65 73 20 73 75 72 65 0a 20 20 20 20 20 20 20  kes sure.       
100f0 20 20 20 2a 2a 20 74 68 69 73 20 63 6f 64 65 20     ** this code 
10100 6f 6e 6c 79 20 65 78 65 63 75 74 65 73 20 6f 6e  only executes on
10110 63 65 2e 20 20 42 65 63 61 75 73 65 20 66 6f 72  ce.  Because for
10120 20 61 20 6e 6f 6e 2d 63 6f 6e 73 74 61 6e 74 0a   a non-constant.
10130 20 20 20 20 20 20 20 20 20 20 2a 2a 20 65 78 70            ** exp
10140 72 65 73 73 69 6f 6e 20 77 65 20 6e 65 65 64 20  ression we need 
10150 74 6f 20 72 65 72 75 6e 20 74 68 69 73 20 63 6f  to rerun this co
10160 64 65 20 65 61 63 68 20 74 69 6d 65 2e 0a 20 20  de each time..  
10170 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
10180 20 20 20 20 20 69 66 28 20 6a 6d 70 49 66 44 79       if( jmpIfDy
10190 6e 61 6d 69 63 3e 3d 30 20 26 26 20 21 73 71 6c  namic>=0 && !sql
101a0 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
101b0 6e 74 28 70 45 32 29 20 29 7b 0a 20 20 20 20 20  nt(pE2) ){.     
101c0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
101d0 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76  beChangeToNoop(v
101e0 2c 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63 29 3b  , jmpIfDynamic);
101f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a 6d 70  .            jmp
10200 49 66 44 79 6e 61 6d 69 63 20 3d 20 2d 31 3b 0a  IfDynamic = -1;.
10210 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20            }..   
10220 20 20 20 20 20 20 20 2f 2a 20 45 76 61 6c 75 61         /* Evalua
10230 74 65 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  te the expressio
10240 6e 20 61 6e 64 20 69 6e 73 65 72 74 20 69 74 20  n and insert it 
10250 69 6e 74 6f 20 74 68 65 20 74 65 6d 70 20 74 61  into the temp ta
10260 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ble */.         
10270 20 69 66 28 20 69 73 52 6f 77 69 64 20 26 26 20   if( isRowid && 
10280 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74  sqlite3ExprIsInt
10290 65 67 65 72 28 70 45 32 2c 20 26 69 56 61 6c 54  eger(pE2, &iValT
102a0 6f 49 6e 73 29 20 29 7b 0a 20 20 20 20 20 20 20  oIns) ){.       
102b0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
102c0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73  AddOp3(v, OP_Ins
102d0 65 72 74 49 6e 74 2c 20 70 45 78 70 72 2d 3e 69  ertInt, pExpr->i
102e0 54 61 62 6c 65 2c 20 72 32 2c 20 69 56 61 6c 54  Table, r2, iValT
102f0 6f 49 6e 73 29 3b 0a 20 20 20 20 20 20 20 20 20  oIns);.         
10300 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
10310 20 20 20 20 72 33 20 3d 20 73 71 6c 69 74 65 33      r3 = sqlite3
10320 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70  ExprCodeTarget(p
10330 50 61 72 73 65 2c 20 70 45 32 2c 20 72 31 29 3b  Parse, pE2, r1);
10340 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
10350 20 69 73 52 6f 77 69 64 20 29 7b 0a 20 20 20 20   isRowid ){.    
10360 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
10370 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
10380 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 72 33 2c  P_MustBeInt, r3,
10390 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
103a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
103b0 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
103c0 65 6e 74 41 64 64 72 28 76 29 2b 32 29 3b 0a 20  entAddr(v)+2);. 
103d0 20 20 20 20 20 20 20 20 20 20 20 20 20 56 64 62               Vdb
103e0 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
103f0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
10400 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
10410 20 4f 50 5f 49 6e 73 65 72 74 2c 20 70 45 78 70   OP_Insert, pExp
10420 72 2d 3e 69 54 61 62 6c 65 2c 20 72 32 2c 20 72  r->iTable, r2, r
10430 33 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  3);.            
10440 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
10450 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
10460 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b  AddOp4(v, OP_Mak
10470 65 52 65 63 6f 72 64 2c 20 72 33 2c 20 31 2c 20  eRecord, r3, 1, 
10480 72 32 2c 20 26 61 66 66 69 6e 69 74 79 2c 20 31  r2, &affinity, 1
10490 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
104a0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
104b0 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  eAffinityChange(
104c0 70 50 61 72 73 65 2c 20 72 33 2c 20 31 29 3b 0a  pParse, r3, 1);.
104d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
104e0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
104f0 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c  v, OP_IdxInsert,
10500 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
10510 72 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  r2);.           
10520 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
10530 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
10540 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
10550 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
10560 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  1);.        sqli
10570 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
10580 67 28 70 50 61 72 73 65 2c 20 72 32 29 3b 0a 20  g(pParse, r2);. 
10590 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
105a0 20 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20   pKeyInfo ){.   
105b0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
105c0 43 68 61 6e 67 65 50 34 28 76 2c 20 61 64 64 72  ChangeP4(v, addr
105d0 2c 20 28 76 6f 69 64 20 2a 29 70 4b 65 79 49 6e  , (void *)pKeyIn
105e0 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b  fo, P4_KEYINFO);
105f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
10600 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
10610 20 63 61 73 65 20 54 4b 5f 45 58 49 53 54 53 3a   case TK_EXISTS:
10620 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c  .    case TK_SEL
10630 45 43 54 3a 0a 20 20 20 20 64 65 66 61 75 6c 74  ECT:.    default
10640 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  : {.      /* If 
10650 74 68 69 73 20 68 61 73 20 74 6f 20 62 65 20 61  this has to be a
10660 20 73 63 61 6c 61 72 20 53 45 4c 45 43 54 2e 20   scalar SELECT. 
10670 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
10680 6f 20 70 75 74 20 74 68 65 0a 20 20 20 20 20 20  o put the.      
10690 2a 2a 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73  ** value of this
106a0 20 73 65 6c 65 63 74 20 69 6e 20 61 20 6d 65 6d   select in a mem
106b0 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20 72 65 63  ory cell and rec
106c0 6f 72 64 20 74 68 65 20 6e 75 6d 62 65 72 0a 20  ord the number. 
106d0 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 6d       ** of the m
106e0 65 6d 6f 72 79 20 63 65 6c 6c 20 69 6e 20 69 43  emory cell in iC
106f0 6f 6c 75 6d 6e 2e 20 20 49 66 20 74 68 69 73 20  olumn.  If this 
10700 69 73 20 61 6e 20 45 58 49 53 54 53 2c 20 77 72  is an EXISTS, wr
10710 69 74 65 0a 20 20 20 20 20 20 2a 2a 20 61 6e 20  ite.      ** an 
10720 69 6e 74 65 67 65 72 20 30 20 28 6e 6f 74 20 65  integer 0 (not e
10730 78 69 73 74 73 29 20 6f 72 20 31 20 28 65 78 69  xists) or 1 (exi
10740 73 74 73 29 20 69 6e 74 6f 20 61 20 6d 65 6d 6f  sts) into a memo
10750 72 79 20 63 65 6c 6c 0a 20 20 20 20 20 20 2a 2a  ry cell.      **
10760 20 61 6e 64 20 72 65 63 6f 72 64 20 74 68 61 74   and record that
10770 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 69 6e 20   memory cell in 
10780 69 43 6f 6c 75 6d 6e 2e 0a 20 20 20 20 20 20 2a  iColumn..      *
10790 2f 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a  /.      Select *
107a0 70 53 65 6c 3b 20 20 20 20 20 20 20 20 20 20 20  pSel;           
107b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
107c0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
107d0 74 20 74 6f 20 65 6e 63 6f 64 65 20 2a 2f 0a 20  t to encode */. 
107e0 20 20 20 20 20 53 65 6c 65 63 74 44 65 73 74 20       SelectDest 
107f0 64 65 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  dest;           
10800 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f             /* Ho
10810 77 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 53  w to deal with S
10820 45 4c 45 43 74 20 72 65 73 75 6c 74 20 2a 2f 0a  ELECt result */.
10830 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
10840 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45   pExpr->op==TK_E
10850 58 49 53 54 53 20 29 3b 0a 20 20 20 20 20 20 74  XISTS );.      t
10860 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
10870 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b  op==TK_SELECT );
10880 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
10890 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 49  Expr->op==TK_EXI
108a0 53 54 53 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70  STS || pExpr->op
108b0 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 0a  ==TK_SELECT );..
108c0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 45 78        assert( Ex
108d0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
108e0 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  xpr, EP_xIsSelec
108f0 74 29 20 29 3b 0a 20 20 20 20 20 20 70 53 65 6c  t) );.      pSel
10900 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c   = pExpr->x.pSel
10910 65 63 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ect;.      sqlit
10920 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74  e3SelectDestInit
10930 28 26 64 65 73 74 2c 20 30 2c 20 2b 2b 70 50 61  (&dest, 0, ++pPa
10940 72 73 65 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 20 20  rse->nMem);.    
10950 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d    if( pExpr->op=
10960 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a 20 20  =TK_SELECT ){.  
10970 20 20 20 20 20 20 64 65 73 74 2e 65 44 65 73 74        dest.eDest
10980 20 3d 20 53 52 54 5f 4d 65 6d 3b 0a 20 20 20 20   = SRT_Mem;.    
10990 20 20 20 20 64 65 73 74 2e 69 53 64 73 74 20 3d      dest.iSdst =
109a0 20 64 65 73 74 2e 69 53 44 50 61 72 6d 3b 0a 20   dest.iSDParm;. 
109b0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
109c0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
109d0 75 6c 6c 2c 20 30 2c 20 64 65 73 74 2e 69 53 44  ull, 0, dest.iSD
109e0 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 20 20 56  Parm);.        V
109f0 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
10a00 49 6e 69 74 20 73 75 62 71 75 65 72 79 20 72 65  Init subquery re
10a10 73 75 6c 74 22 29 29 3b 0a 20 20 20 20 20 20 7d  sult"));.      }
10a20 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 64 65  else{.        de
10a30 73 74 2e 65 44 65 73 74 20 3d 20 53 52 54 5f 45  st.eDest = SRT_E
10a40 78 69 73 74 73 3b 0a 20 20 20 20 20 20 20 20 73  xists;.        s
10a50 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
10a60 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
10a70 30 2c 20 64 65 73 74 2e 69 53 44 50 61 72 6d 29  0, dest.iSDParm)
10a80 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
10a90 6d 6d 65 6e 74 28 28 76 2c 20 22 49 6e 69 74 20  mment((v, "Init 
10aa0 45 58 49 53 54 53 20 72 65 73 75 6c 74 22 29 29  EXISTS result"))
10ab0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
10ac0 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
10ad0 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 53  e(pParse->db, pS
10ae0 65 6c 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20  el->pLimit);.   
10af0 20 20 20 70 53 65 6c 2d 3e 70 4c 69 6d 69 74 20     pSel->pLimit 
10b00 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
10b10 50 61 72 73 65 2c 20 54 4b 5f 49 4e 54 45 47 45  Parse, TK_INTEGE
10b20 52 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20  R, 0, 0,.       
10b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10b40 20 20 20 20 20 20 20 20 20 20 20 26 73 71 6c 69             &sqli
10b50 74 65 33 49 6e 74 54 6f 6b 65 6e 73 5b 31 5d 29  te3IntTokens[1])
10b60 3b 0a 20 20 20 20 20 20 70 53 65 6c 2d 3e 69 4c  ;.      pSel->iL
10b70 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  imit = 0;.      
10b80 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63  if( sqlite3Selec
10b90 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 2c 20  t(pParse, pSel, 
10ba0 26 64 65 73 74 29 20 29 7b 0a 20 20 20 20 20 20  &dest) ){.      
10bb0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
10bc0 20 20 7d 0a 20 20 20 20 20 20 72 52 65 67 20 3d    }.      rReg =
10bd0 20 64 65 73 74 2e 69 53 44 50 61 72 6d 3b 0a 20   dest.iSDParm;. 
10be0 20 20 20 20 20 45 78 70 72 53 65 74 56 56 41 50       ExprSetVVAP
10bf0 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
10c00 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a 20 20 20  P_NoReduce);.   
10c10 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
10c20 20 20 7d 0a 0a 20 20 69 66 28 20 72 48 61 73 4e    }..  if( rHasN
10c30 75 6c 6c 46 6c 61 67 20 29 7b 0a 20 20 20 20 73  ullFlag ){.    s
10c40 71 6c 69 74 65 33 53 65 74 48 61 73 4e 75 6c 6c  qlite3SetHasNull
10c50 46 6c 61 67 28 76 2c 20 70 45 78 70 72 2d 3e 69  Flag(v, pExpr->i
10c60 54 61 62 6c 65 2c 20 72 48 61 73 4e 75 6c 6c 46  Table, rHasNullF
10c70 6c 61 67 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  lag);.  }..  if(
10c80 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63 3e 3d 30   jmpIfDynamic>=0
10c90 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
10ca0 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a  dbeJumpHere(v, j
10cb0 6d 70 49 66 44 79 6e 61 6d 69 63 29 3b 0a 20 20  mpIfDynamic);.  
10cc0 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43  }.  sqlite3ExprC
10cd0 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b  achePop(pParse);
10ce0 0a 0a 20 20 72 65 74 75 72 6e 20 72 52 65 67 3b  ..  return rReg;
10cf0 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
10d00 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
10d10 59 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  Y */..#ifndef SQ
10d20 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
10d30 52 59 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  RY./*.** Generat
10d40 65 20 63 6f 64 65 20 66 6f 72 20 61 6e 20 49 4e  e code for an IN
10d50 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a   expression..**.
10d60 2a 2a 20 20 20 20 20 20 78 20 49 4e 20 28 53 45  **      x IN (SE
10d70 4c 45 43 54 20 2e 2e 2e 29 0a 2a 2a 20 20 20 20  LECT ...).**    
10d80 20 20 78 20 49 4e 20 28 76 61 6c 75 65 2c 20 76    x IN (value, v
10d90 61 6c 75 65 2c 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a  alue, ...).**.**
10da0 20 54 68 65 20 6c 65 66 74 2d 68 61 6e 64 20 73   The left-hand s
10db0 69 64 65 20 28 4c 48 53 29 20 69 73 20 61 20 73  ide (LHS) is a s
10dc0 63 61 6c 61 72 20 65 78 70 72 65 73 73 69 6f 6e  calar expression
10dd0 2e 20 20 54 68 65 20 72 69 67 68 74 2d 68 61 6e  .  The right-han
10de0 64 20 73 69 64 65 20 28 52 48 53 29 0a 2a 2a 20  d side (RHS).** 
10df0 69 73 20 61 6e 20 61 72 72 61 79 20 6f 66 20 7a  is an array of z
10e00 65 72 6f 20 6f 72 20 6d 6f 72 65 20 76 61 6c 75  ero or more valu
10e10 65 73 2e 20 20 54 68 65 20 65 78 70 72 65 73 73  es.  The express
10e20 69 6f 6e 20 69 73 20 74 72 75 65 20 69 66 20 74  ion is true if t
10e30 68 65 20 4c 48 53 20 69 73 0a 2a 2a 20 63 6f 6e  he LHS is.** con
10e40 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20 74 68  tained within th
10e50 65 20 52 48 53 2e 20 20 54 68 65 20 76 61 6c 75  e RHS.  The valu
10e60 65 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73  e of the express
10e70 69 6f 6e 20 69 73 20 75 6e 6b 6e 6f 77 6e 20 28  ion is unknown (
10e80 4e 55 4c 4c 29 0a 2a 2a 20 69 66 20 74 68 65 20  NULL).** if the 
10e90 4c 48 53 20 69 73 20 4e 55 4c 4c 20 6f 72 20 69  LHS is NULL or i
10ea0 66 20 74 68 65 20 4c 48 53 20 69 73 20 6e 6f 74  f the LHS is not
10eb0 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69   contained withi
10ec0 6e 20 74 68 65 20 52 48 53 20 61 6e 64 20 74 68  n the RHS and th
10ed0 65 0a 2a 2a 20 52 48 53 20 63 6f 6e 74 61 69 6e  e.** RHS contain
10ee0 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 4e 55  s one or more NU
10ef0 4c 4c 20 76 61 6c 75 65 73 2e 0a 2a 2a 0a 2a 2a  LL values..**.**
10f00 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65   This routine ge
10f10 6e 65 72 61 74 65 73 20 63 6f 64 65 20 74 68 61  nerates code tha
10f20 74 20 6a 75 6d 70 73 20 74 6f 20 64 65 73 74 49  t jumps to destI
10f30 66 46 61 6c 73 65 20 69 66 20 74 68 65 20 4c 48  fFalse if the LH
10f40 53 20 69 73 20 6e 6f 74 20 0a 2a 2a 20 63 6f 6e  S is not .** con
10f50 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20 74 68  tained within th
10f60 65 20 52 48 53 2e 20 20 49 66 20 64 75 65 20 74  e RHS.  If due t
10f70 6f 20 4e 55 4c 4c 73 20 77 65 20 63 61 6e 6e 6f  o NULLs we canno
10f80 74 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74  t determine if t
10f90 68 65 20 4c 48 53 0a 2a 2a 20 69 73 20 63 6f 6e  he LHS.** is con
10fa0 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 52 48  tained in the RH
10fb0 53 20 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20 64  S then jump to d
10fc0 65 73 74 49 66 4e 75 6c 6c 2e 20 20 49 66 20 74  estIfNull.  If t
10fd0 68 65 20 4c 48 53 20 69 73 20 63 6f 6e 74 61 69  he LHS is contai
10fe0 6e 65 64 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68  ned.** within th
10ff0 65 20 52 48 53 20 74 68 65 6e 20 66 61 6c 6c 20  e RHS then fall 
11000 74 68 72 6f 75 67 68 2e 0a 2a 2f 0a 73 74 61 74  through..*/.stat
11010 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 45  ic void sqlite3E
11020 78 70 72 43 6f 64 65 49 4e 28 0a 20 20 50 61 72  xprCodeIN(.  Par
11030 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
11040 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e     /* Parsing an
11050 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e  d code generatin
11060 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
11070 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20  xpr *pExpr,     
11080 20 20 20 20 20 2f 2a 20 54 68 65 20 49 4e 20 65       /* The IN e
11090 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69  xpression */.  i
110a0 6e 74 20 64 65 73 74 49 66 46 61 6c 73 65 2c 20  nt destIfFalse, 
110b0 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72       /* Jump her
110c0 65 20 69 66 20 4c 48 53 20 69 73 20 6e 6f 74 20  e if LHS is not 
110d0 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65  contained in the
110e0 20 52 48 53 20 2a 2f 0a 20 20 69 6e 74 20 64 65   RHS */.  int de
110f0 73 74 49 66 4e 75 6c 6c 20 20 20 20 20 20 20 20  stIfNull        
11100 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20  /* Jump here if 
11110 74 68 65 20 72 65 73 75 6c 74 73 20 61 72 65 20  the results are 
11120 75 6e 6b 6e 6f 77 6e 20 64 75 65 20 74 6f 20 4e  unknown due to N
11130 55 4c 4c 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ULLs */.){.  int
11140 20 72 52 68 73 48 61 73 4e 75 6c 6c 20 3d 20 30   rRhsHasNull = 0
11150 3b 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 74  ;  /* Register t
11160 68 61 74 20 69 73 20 74 72 75 65 20 69 66 20 52  hat is true if R
11170 48 53 20 63 6f 6e 74 61 69 6e 73 20 4e 55 4c 4c  HS contains NULL
11180 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 63 68 61   values */.  cha
11190 72 20 61 66 66 69 6e 69 74 79 3b 20 20 20 20 20  r affinity;     
111a0 20 20 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e     /* Comparison
111b0 20 61 66 66 69 6e 69 74 79 20 74 6f 20 75 73 65   affinity to use
111c0 20 2a 2f 0a 20 20 69 6e 74 20 65 54 79 70 65 3b   */.  int eType;
111d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
111e0 79 70 65 20 6f 66 20 74 68 65 20 52 48 53 20 2a  ype of the RHS *
111f0 2f 0a 20 20 69 6e 74 20 72 31 3b 20 20 20 20 20  /.  int r1;     
11200 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d            /* Tem
11210 70 6f 72 61 72 79 20 75 73 65 20 72 65 67 69 73  porary use regis
11220 74 65 72 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  ter */.  Vdbe *v
11230 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
11240 2a 20 53 74 61 74 65 6d 65 6e 74 20 75 6e 64 65  * Statement unde
11250 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a  r construction *
11260 2f 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20  /..  /* Compute 
11270 74 68 65 20 52 48 53 2e 20 20 20 41 66 74 65 72  the RHS.   After
11280 20 74 68 69 73 20 73 74 65 70 2c 20 74 68 65 20   this step, the 
11290 74 61 62 6c 65 20 77 69 74 68 20 63 75 72 73 6f  table with curso
112a0 72 0a 20 20 2a 2a 20 70 45 78 70 72 2d 3e 69 54  r.  ** pExpr->iT
112b0 61 62 6c 65 20 77 69 6c 6c 20 63 6f 6e 74 61 69  able will contai
112c0 6e 73 20 74 68 65 20 76 61 6c 75 65 73 20 74 68  ns the values th
112d0 61 74 20 6d 61 6b 65 20 75 70 20 74 68 65 20 52  at make up the R
112e0 48 53 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 70  HS..  */.  v = p
112f0 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
11300 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 20  assert( v!=0 ); 
11310 20 20 20 20 20 20 2f 2a 20 4f 4f 4d 20 64 65 74        /* OOM det
11320 65 63 74 65 64 20 70 72 69 6f 72 20 74 6f 20 74  ected prior to t
11330 68 69 73 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 20  his routine */. 
11340 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74   VdbeNoopComment
11350 28 28 76 2c 20 22 62 65 67 69 6e 20 49 4e 20 65  ((v, "begin IN e
11360 78 70 72 22 29 29 3b 0a 20 20 65 54 79 70 65 20  xpr"));.  eType 
11370 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 49  = sqlite3FindInI
11380 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 45 78  ndex(pParse, pEx
11390 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  pr,.            
113a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
113b0 20 49 4e 5f 49 4e 44 45 58 5f 4d 45 4d 42 45 52   IN_INDEX_MEMBER
113c0 53 48 49 50 20 7c 20 49 4e 5f 49 4e 44 45 58 5f  SHIP | IN_INDEX_
113d0 4e 4f 4f 50 5f 4f 4b 2c 0a 20 20 20 20 20 20 20  NOOP_OK,.       
113e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
113f0 20 20 20 20 20 20 64 65 73 74 49 66 46 61 6c 73        destIfFals
11400 65 3d 3d 64 65 73 74 49 66 4e 75 6c 6c 20 3f 20  e==destIfNull ? 
11410 30 20 3a 20 26 72 52 68 73 48 61 73 4e 75 6c 6c  0 : &rRhsHasNull
11420 29 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20  );..  /* Figure 
11430 6f 75 74 20 74 68 65 20 61 66 66 69 6e 69 74 79  out the affinity
11440 20 74 6f 20 75 73 65 20 74 6f 20 63 72 65 61 74   to use to creat
11450 65 20 61 20 6b 65 79 20 66 72 6f 6d 20 74 68 65  e a key from the
11460 20 72 65 73 75 6c 74 73 0a 20 20 2a 2a 20 6f 66   results.  ** of
11470 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 2e   the expression.
11480 20 61 66 66 69 6e 69 74 79 53 74 72 20 73 74 6f   affinityStr sto
11490 72 65 73 20 61 20 73 74 61 74 69 63 20 73 74 72  res a static str
114a0 69 6e 67 20 73 75 69 74 61 62 6c 65 20 66 6f 72  ing suitable for
114b0 0a 20 20 2a 2a 20 50 34 20 6f 66 20 4f 50 5f 4d  .  ** P4 of OP_M
114c0 61 6b 65 52 65 63 6f 72 64 2e 0a 20 20 2a 2f 0a  akeRecord..  */.
114d0 20 20 61 66 66 69 6e 69 74 79 20 3d 20 63 6f 6d    affinity = com
114e0 70 61 72 69 73 6f 6e 41 66 66 69 6e 69 74 79 28  parisonAffinity(
114f0 70 45 78 70 72 29 3b 0a 0a 20 20 2f 2a 20 43 6f  pExpr);..  /* Co
11500 64 65 20 74 68 65 20 4c 48 53 2c 20 74 68 65 20  de the LHS, the 
11510 3c 65 78 70 72 3e 20 66 72 6f 6d 20 22 3c 65 78  <expr> from "<ex
11520 70 72 3e 20 49 4e 20 28 2e 2e 2e 29 22 2e 0a 20  pr> IN (...)".. 
11530 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 78 70   */.  sqlite3Exp
11540 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73  rCachePush(pPars
11550 65 29 3b 0a 20 20 72 31 20 3d 20 73 71 6c 69 74  e);.  r1 = sqlit
11560 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
11570 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  rse);.  sqlite3E
11580 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
11590 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 72 31  pExpr->pLeft, r1
115a0 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 73 71 6c 69  );..  /* If sqli
115b0 74 65 33 46 69 6e 64 49 6e 49 6e 64 65 78 28 29  te3FindInIndex()
115c0 20 64 69 64 20 6e 6f 74 20 66 69 6e 64 20 6f 72   did not find or
115d0 20 63 72 65 61 74 65 20 61 6e 20 69 6e 64 65 78   create an index
115e0 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 73 75   that is.  ** su
115f0 69 74 61 62 6c 65 20 66 6f 72 20 65 76 61 6c 75  itable for evalu
11600 61 74 69 6e 67 20 74 68 65 20 49 4e 20 6f 70 65  ating the IN ope
11610 72 61 74 6f 72 2c 20 74 68 65 6e 20 65 76 61 6c  rator, then eval
11620 75 61 74 65 20 75 73 69 6e 67 20 61 0a 20 20 2a  uate using a.  *
11630 2a 20 73 65 71 75 65 6e 63 65 20 6f 66 20 63 6f  * sequence of co
11640 6d 70 61 72 69 73 6f 6e 73 2e 0a 20 20 2a 2f 0a  mparisons..  */.
11650 20 20 69 66 28 20 65 54 79 70 65 3d 3d 49 4e 5f    if( eType==IN_
11660 49 4e 44 45 58 5f 4e 4f 4f 50 20 29 7b 0a 20 20  INDEX_NOOP ){.  
11670 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
11680 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  t = pExpr->x.pLi
11690 73 74 3b 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20  st;.    CollSeq 
116a0 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33  *pColl = sqlite3
116b0 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
116c0 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
116d0 29 3b 0a 20 20 20 20 69 6e 74 20 6c 61 62 65 6c  );.    int label
116e0 4f 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  Ok = sqlite3Vdbe
116f0 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
11700 20 20 69 6e 74 20 72 32 2c 20 72 65 67 54 6f 46    int r2, regToF
11710 72 65 65 3b 0a 20 20 20 20 69 6e 74 20 72 65 67  ree;.    int reg
11720 43 6b 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20  CkNull = 0;.    
11730 69 6e 74 20 69 69 3b 0a 20 20 20 20 61 73 73 65  int ii;.    asse
11740 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
11750 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78  erty(pExpr, EP_x
11760 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20  IsSelect) );.   
11770 20 69 66 28 20 64 65 73 74 49 66 4e 75 6c 6c 21   if( destIfNull!
11780 3d 64 65 73 74 49 66 46 61 6c 73 65 20 29 7b 0a  =destIfFalse ){.
11790 20 20 20 20 20 20 72 65 67 43 6b 4e 75 6c 6c 20        regCkNull 
117a0 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
117b0 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
117c0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
117d0 64 4f 70 33 28 76 2c 20 4f 50 5f 42 69 74 41 6e  dOp3(v, OP_BitAn
117e0 64 2c 20 72 31 2c 20 72 31 2c 20 72 65 67 43 6b  d, r1, r1, regCk
117f0 4e 75 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Null);.    }.   
11800 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 4c   for(ii=0; ii<pL
11810 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 69 2b 2b  ist->nExpr; ii++
11820 29 7b 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71  ){.      r2 = sq
11830 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
11840 70 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2d  p(pParse, pList-
11850 3e 61 5b 69 69 5d 2e 70 45 78 70 72 2c 20 26 72  >a[ii].pExpr, &r
11860 65 67 54 6f 46 72 65 65 29 3b 0a 20 20 20 20 20  egToFree);.     
11870 20 69 66 28 20 72 65 67 43 6b 4e 75 6c 6c 20 26   if( regCkNull &
11880 26 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 6e  & sqlite3ExprCan
11890 42 65 4e 75 6c 6c 28 70 4c 69 73 74 2d 3e 61 5b  BeNull(pList->a[
118a0 69 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20  ii].pExpr) ){.  
118b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
118c0 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 42 69  eAddOp3(v, OP_Bi
118d0 74 41 6e 64 2c 20 72 65 67 43 6b 4e 75 6c 6c 2c  tAnd, regCkNull,
118e0 20 72 32 2c 20 72 65 67 43 6b 4e 75 6c 6c 29 3b   r2, regCkNull);
118f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
11900 66 28 20 69 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  f( ii<pList->nEx
11910 70 72 2d 31 20 7c 7c 20 64 65 73 74 49 66 4e 75  pr-1 || destIfNu
11920 6c 6c 21 3d 64 65 73 74 49 66 46 61 6c 73 65 20  ll!=destIfFalse 
11930 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
11940 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
11950 4f 50 5f 45 71 2c 20 72 31 2c 20 6c 61 62 65 6c  OP_Eq, r1, label
11960 4f 6b 2c 20 72 32 2c 0a 20 20 20 20 20 20 20 20  Ok, r2,.        
11970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11980 20 20 28 76 6f 69 64 2a 29 70 43 6f 6c 6c 2c 20    (void*)pColl, 
11990 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20  P4_COLLSEQ);.   
119a0 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
119b0 65 49 66 28 76 2c 20 69 69 3c 70 4c 69 73 74 2d  eIf(v, ii<pList-
119c0 3e 6e 45 78 70 72 2d 31 29 3b 0a 20 20 20 20 20  >nExpr-1);.     
119d0 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
119e0 66 28 76 2c 20 69 69 3d 3d 70 4c 69 73 74 2d 3e  f(v, ii==pList->
119f0 6e 45 78 70 72 2d 31 29 3b 0a 20 20 20 20 20 20  nExpr-1);.      
11a00 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
11a10 6e 67 65 50 35 28 76 2c 20 61 66 66 69 6e 69 74  ngeP5(v, affinit
11a20 79 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  y);.      }else{
11a30 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
11a40 20 64 65 73 74 49 66 4e 75 6c 6c 3d 3d 64 65 73   destIfNull==des
11a50 74 49 66 46 61 6c 73 65 20 29 3b 0a 20 20 20 20  tIfFalse );.    
11a60 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
11a70 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4e 65 2c 20  ddOp4(v, OP_Ne, 
11a80 72 31 2c 20 64 65 73 74 49 66 46 61 6c 73 65 2c  r1, destIfFalse,
11a90 20 72 32 2c 0a 20 20 20 20 20 20 20 20 20 20 20   r2,.           
11aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
11ab0 76 6f 69 64 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f  void*)pColl, P4_
11ac0 43 4f 4c 4c 53 45 51 29 3b 20 56 64 62 65 43 6f  COLLSEQ); VdbeCo
11ad0 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
11ae0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
11af0 61 6e 67 65 50 35 28 76 2c 20 61 66 66 69 6e 69  angeP5(v, affini
11b00 74 79 20 7c 20 53 51 4c 49 54 45 5f 4a 55 4d 50  ty | SQLITE_JUMP
11b10 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 7d  IFNULL);.      }
11b20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
11b30 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
11b40 72 73 65 2c 20 72 65 67 54 6f 46 72 65 65 29 3b  rse, regToFree);
11b50 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
11b60 65 67 43 6b 4e 75 6c 6c 20 29 7b 0a 20 20 20 20  egCkNull ){.    
11b70 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
11b80 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c  Op2(v, OP_IsNull
11b90 2c 20 72 65 67 43 6b 4e 75 6c 6c 2c 20 64 65 73  , regCkNull, des
11ba0 74 49 66 4e 75 6c 6c 29 3b 20 56 64 62 65 43 6f  tIfNull); VdbeCo
11bb0 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
11bc0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
11bd0 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
11be0 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a  , destIfFalse);.
11bf0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
11c00 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
11c10 6c 28 76 2c 20 6c 61 62 65 6c 4f 6b 29 3b 0a 20  l(v, labelOk);. 
11c20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
11c30 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
11c40 20 72 65 67 43 6b 4e 75 6c 6c 29 3b 0a 20 20 7d   regCkNull);.  }
11c50 65 6c 73 65 7b 0a 20 20 0a 20 20 20 20 2f 2a 20  else{.  .    /* 
11c60 49 66 20 74 68 65 20 4c 48 53 20 69 73 20 4e 55  If the LHS is NU
11c70 4c 4c 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73  LL, then the res
11c80 75 6c 74 20 69 73 20 65 69 74 68 65 72 20 66 61  ult is either fa
11c90 6c 73 65 20 6f 72 20 4e 55 4c 4c 20 64 65 70 65  lse or NULL depe
11ca0 6e 64 69 6e 67 0a 20 20 20 20 2a 2a 20 6f 6e 20  nding.    ** on 
11cb0 77 68 65 74 68 65 72 20 74 68 65 20 52 48 53 20  whether the RHS 
11cc0 69 73 20 65 6d 70 74 79 20 6f 72 20 6e 6f 74 2c  is empty or not,
11cd0 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 0a 20   respectively.. 
11ce0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71     */.    if( sq
11cf0 6c 69 74 65 33 45 78 70 72 43 61 6e 42 65 4e 75  lite3ExprCanBeNu
11d00 6c 6c 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  ll(pExpr->pLeft)
11d10 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 64 65   ){.      if( de
11d20 73 74 49 66 4e 75 6c 6c 3d 3d 64 65 73 74 49 66  stIfNull==destIf
11d30 46 61 6c 73 65 20 29 7b 0a 20 20 20 20 20 20 20  False ){.       
11d40 20 2f 2a 20 53 68 6f 72 74 63 75 74 20 66 6f 72   /* Shortcut for
11d50 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65   the common case
11d60 20 77 68 65 72 65 20 74 68 65 20 66 61 6c 73 65   where the false
11d70 20 61 6e 64 20 4e 55 4c 4c 20 6f 75 74 63 6f 6d   and NULL outcom
11d80 65 73 20 61 72 65 0a 20 20 20 20 20 20 20 20 2a  es are.        *
11d90 2a 20 74 68 65 20 73 61 6d 65 2e 20 2a 2f 0a 20  * the same. */. 
11da0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
11db0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
11dc0 73 4e 75 6c 6c 2c 20 72 31 2c 20 64 65 73 74 49  sNull, r1, destI
11dd0 66 4e 75 6c 6c 29 3b 20 56 64 62 65 43 6f 76 65  fNull); VdbeCove
11de0 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 7d  rage(v);.      }
11df0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e  else{.        in
11e00 74 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65  t addr1 = sqlite
11e10 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
11e20 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 72 31 29 3b 20  P_NotNull, r1); 
11e30 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
11e40 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
11e50 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
11e60 5f 52 65 77 69 6e 64 2c 20 70 45 78 70 72 2d 3e  _Rewind, pExpr->
11e70 69 54 61 62 6c 65 2c 20 64 65 73 74 49 66 46 61  iTable, destIfFa
11e80 6c 73 65 29 3b 0a 20 20 20 20 20 20 20 20 56 64  lse);.        Vd
11e90 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
11ea0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
11eb0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
11ec0 6f 74 6f 2c 20 30 2c 20 64 65 73 74 49 66 4e 75  oto, 0, destIfNu
11ed0 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ll);.        sql
11ee0 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
11ef0 28 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 20 20  (v, addr1);.    
11f00 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20    }.    }.  .   
11f10 20 69 66 28 20 65 54 79 70 65 3d 3d 49 4e 5f 49   if( eType==IN_I
11f20 4e 44 45 58 5f 52 4f 57 49 44 20 29 7b 0a 20 20  NDEX_ROWID ){.  
11f30 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 63      /* In this c
11f40 61 73 65 2c 20 74 68 65 20 52 48 53 20 69 73 20  ase, the RHS is 
11f50 74 68 65 20 52 4f 57 49 44 20 6f 66 20 74 61 62  the ROWID of tab
11f60 6c 65 20 62 2d 74 72 65 65 0a 20 20 20 20 20 20  le b-tree.      
11f70 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
11f80 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
11f90 5f 4d 75 73 74 42 65 49 6e 74 2c 20 72 31 2c 20  _MustBeInt, r1, 
11fa0 64 65 73 74 49 66 46 61 6c 73 65 29 3b 20 56 64  destIfFalse); Vd
11fb0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
11fc0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
11fd0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 6f 74  AddOp3(v, OP_Not
11fe0 45 78 69 73 74 73 2c 20 70 45 78 70 72 2d 3e 69  Exists, pExpr->i
11ff0 54 61 62 6c 65 2c 20 64 65 73 74 49 66 46 61 6c  Table, destIfFal
12000 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 56  se, r1);.      V
12010 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
12020 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
12030 20 2f 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65   /* In this case
12040 2c 20 74 68 65 20 52 48 53 20 69 73 20 61 6e 20  , the RHS is an 
12050 69 6e 64 65 78 20 62 2d 74 72 65 65 2e 0a 20 20  index b-tree..  
12060 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c      */.      sql
12070 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
12080 2c 20 4f 50 5f 41 66 66 69 6e 69 74 79 2c 20 72  , OP_Affinity, r
12090 31 2c 20 31 2c 20 30 2c 20 26 61 66 66 69 6e 69  1, 1, 0, &affini
120a0 74 79 2c 20 31 29 3b 0a 20 20 0a 20 20 20 20 20  ty, 1);.  .     
120b0 20 2f 2a 20 49 66 20 74 68 65 20 73 65 74 20 6d   /* If the set m
120c0 65 6d 62 65 72 73 68 69 70 20 74 65 73 74 20 66  embership test f
120d0 61 69 6c 73 2c 20 74 68 65 6e 20 74 68 65 20 72  ails, then the r
120e0 65 73 75 6c 74 20 6f 66 20 74 68 65 20 0a 20 20  esult of the .  
120f0 20 20 20 20 2a 2a 20 22 78 20 49 4e 20 28 2e 2e      ** "x IN (..
12100 2e 29 22 20 65 78 70 72 65 73 73 69 6f 6e 20 6d  .)" expression m
12110 75 73 74 20 62 65 20 65 69 74 68 65 72 20 30 20  ust be either 0 
12120 6f 72 20 4e 55 4c 4c 2e 20 49 66 20 74 68 65 20  or NULL. If the 
12130 73 65 74 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e  set.      ** con
12140 74 61 69 6e 73 20 6e 6f 20 4e 55 4c 4c 20 76 61  tains no NULL va
12150 6c 75 65 73 2c 20 74 68 65 6e 20 74 68 65 20 72  lues, then the r
12160 65 73 75 6c 74 20 69 73 20 30 2e 20 49 66 20 74  esult is 0. If t
12170 68 65 20 73 65 74 20 0a 20 20 20 20 20 20 2a 2a  he set .      **
12180 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72   contains one or
12190 20 6d 6f 72 65 20 4e 55 4c 4c 20 76 61 6c 75 65   more NULL value
121a0 73 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73 75  s, then the resu
121b0 6c 74 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20  lt of the.      
121c0 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  ** expression is
121d0 20 61 6c 73 6f 20 4e 55 4c 4c 2e 0a 20 20 20 20   also NULL..    
121e0 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72    */.      asser
121f0 74 28 20 64 65 73 74 49 66 46 61 6c 73 65 21 3d  t( destIfFalse!=
12200 64 65 73 74 49 66 4e 75 6c 6c 20 7c 7c 20 72 52  destIfNull || rR
12210 68 73 48 61 73 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  hsHasNull==0 );.
12220 20 20 20 20 20 20 69 66 28 20 72 52 68 73 48 61        if( rRhsHa
12230 73 4e 75 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  sNull==0 ){.    
12240 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e      /* This bran
12250 63 68 20 72 75 6e 73 20 69 66 20 69 74 20 69 73  ch runs if it is
12260 20 6b 6e 6f 77 6e 20 61 74 20 63 6f 6d 70 69 6c   known at compil
12270 65 20 74 69 6d 65 20 74 68 61 74 20 74 68 65 20  e time that the 
12280 52 48 53 0a 20 20 20 20 20 20 20 20 2a 2a 20 63  RHS.        ** c
12290 61 6e 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 4e 55  annot contain NU
122a0 4c 4c 20 76 61 6c 75 65 73 2e 20 54 68 69 73 20  LL values. This 
122b0 68 61 70 70 65 6e 73 20 61 73 20 74 68 65 20 72  happens as the r
122c0 65 73 75 6c 74 0a 20 20 20 20 20 20 20 20 2a 2a  esult.        **
122d0 20 6f 66 20 61 20 22 4e 4f 54 20 4e 55 4c 4c 22   of a "NOT NULL"
122e0 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 6e 20 74   constraint in t
122f0 68 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65  he database sche
12300 6d 61 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  ma..        **. 
12310 20 20 20 20 20 20 20 2a 2a 20 41 6c 73 6f 20 72         ** Also r
12320 75 6e 20 74 68 69 73 20 62 72 61 6e 63 68 20 69  un this branch i
12330 66 20 4e 55 4c 4c 20 69 73 20 65 71 75 69 76 61  f NULL is equiva
12340 6c 65 6e 74 20 74 6f 20 46 41 4c 53 45 0a 20 20  lent to FALSE.  
12350 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 69        ** for thi
12360 73 20 70 61 72 74 69 63 75 6c 61 72 20 49 4e 20  s particular IN 
12370 6f 70 65 72 61 74 6f 72 2e 0a 20 20 20 20 20 20  operator..      
12380 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c    */.        sql
12390 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
123a0 74 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64  t(v, OP_NotFound
123b0 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
123c0 20 64 65 73 74 49 66 46 61 6c 73 65 2c 20 72 31   destIfFalse, r1
123d0 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 56 64  , 1);.        Vd
123e0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
123f0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
12400 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 62      /* In this b
12410 72 61 6e 63 68 2c 20 74 68 65 20 52 48 53 20 6f  ranch, the RHS o
12420 66 20 74 68 65 20 49 4e 20 6d 69 67 68 74 20 63  f the IN might c
12430 6f 6e 74 61 69 6e 20 61 20 4e 55 4c 4c 20 61 6e  ontain a NULL an
12440 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  d.        ** the
12450 20 70 72 65 73 65 6e 63 65 20 6f 66 20 61 20 4e   presence of a N
12460 55 4c 4c 20 6f 6e 20 74 68 65 20 52 48 53 20 6d  ULL on the RHS m
12470 61 6b 65 73 20 61 20 64 69 66 66 65 72 65 6e 63  akes a differenc
12480 65 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20 20  e in the.       
12490 20 2a 2a 20 6f 75 74 63 6f 6d 65 2e 0a 20 20 20   ** outcome..   
124a0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
124b0 69 6e 74 20 6a 31 3b 0a 20 20 0a 20 20 20 20 20  int j1;.  .     
124c0 20 20 20 2f 2a 20 46 69 72 73 74 20 63 68 65 63     /* First chec
124d0 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20  k to see if the 
124e0 4c 48 53 20 69 73 20 63 6f 6e 74 61 69 6e 65 64  LHS is contained
124f0 20 69 6e 20 74 68 65 20 52 48 53 2e 20 20 49 66   in the RHS.  If
12500 20 73 6f 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20   so,.        ** 
12510 74 68 65 6e 20 74 68 65 20 61 6e 73 77 65 72 20  then the answer 
12520 69 73 20 54 52 55 45 20 74 68 65 20 70 72 65 73  is TRUE the pres
12530 65 6e 63 65 20 6f 66 20 4e 55 4c 4c 73 20 69 6e  ence of NULLs in
12540 20 74 68 65 20 52 48 53 20 64 6f 65 73 0a 20 20   the RHS does.  
12550 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20 6d 61 74        ** not mat
12560 74 65 72 2e 20 20 49 66 20 74 68 65 20 4c 48 53  ter.  If the LHS
12570 20 69 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65   is not containe
12580 64 20 69 6e 20 74 68 65 20 52 48 53 2c 20 74 68  d in the RHS, th
12590 65 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  en the.        *
125a0 2a 20 61 6e 73 77 65 72 20 69 73 20 4e 55 4c 4c  * answer is NULL
125b0 20 69 66 20 74 68 65 20 52 48 53 20 63 6f 6e 74   if the RHS cont
125c0 61 69 6e 73 20 4e 55 4c 4c 73 20 61 6e 64 20 74  ains NULLs and t
125d0 68 65 20 61 6e 73 77 65 72 20 69 73 0a 20 20 20  he answer is.   
125e0 20 20 20 20 20 2a 2a 20 46 41 4c 53 45 20 69 66       ** FALSE if
125f0 20 74 68 65 20 52 48 53 20 69 73 20 4e 55 4c 4c   the RHS is NULL
12600 2d 66 72 65 65 2e 0a 20 20 20 20 20 20 20 20 2a  -free..        *
12610 2f 0a 20 20 20 20 20 20 20 20 6a 31 20 3d 20 73  /.        j1 = s
12620 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
12630 49 6e 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c  Int(v, OP_Found,
12640 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
12650 30 2c 20 72 31 2c 20 31 29 3b 0a 20 20 20 20 20  0, r1, 1);.     
12660 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
12670 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  v);.        sqli
12680 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
12690 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 52 68 73   OP_IsNull, rRhs
126a0 48 61 73 4e 75 6c 6c 2c 20 64 65 73 74 49 66 4e  HasNull, destIfN
126b0 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 56 64  ull);.        Vd
126c0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
126d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
126e0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
126f0 6f 74 6f 2c 20 30 2c 20 64 65 73 74 49 66 46 61  oto, 0, destIfFa
12700 6c 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71  lse);.        sq
12710 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
12720 65 28 76 2c 20 6a 31 29 3b 0a 20 20 20 20 20 20  e(v, j1);.      
12730 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  }.    }.  }.  sq
12740 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
12750 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b  Reg(pParse, r1);
12760 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  .  sqlite3ExprCa
12770 63 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a  chePop(pParse);.
12780 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
12790 2c 20 22 65 6e 64 20 49 4e 20 65 78 70 72 22 29  , "end IN expr")
127a0 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  );.}.#endif /* S
127b0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
127c0 45 52 59 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 44 75  ERY */../*.** Du
127d0 70 6c 69 63 61 74 65 20 61 6e 20 38 2d 62 79 74  plicate an 8-byt
127e0 65 20 76 61 6c 75 65 0a 2a 2f 0a 73 74 61 74 69  e value.*/.stati
127f0 63 20 63 68 61 72 20 2a 64 75 70 38 62 79 74 65  c char *dup8byte
12800 73 28 56 64 62 65 20 2a 76 2c 20 63 6f 6e 73 74  s(Vdbe *v, const
12810 20 63 68 61 72 20 2a 69 6e 29 7b 0a 20 20 63 68   char *in){.  ch
12820 61 72 20 2a 6f 75 74 20 3d 20 73 71 6c 69 74 65  ar *out = sqlite
12830 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 73 71 6c  3DbMallocRaw(sql
12840 69 74 65 33 56 64 62 65 44 62 28 76 29 2c 20 38  ite3VdbeDb(v), 8
12850 29 3b 0a 20 20 69 66 28 20 6f 75 74 20 29 7b 0a  );.  if( out ){.
12860 20 20 20 20 6d 65 6d 63 70 79 28 6f 75 74 2c 20      memcpy(out, 
12870 69 6e 2c 20 38 29 3b 0a 20 20 7d 0a 20 20 72 65  in, 8);.  }.  re
12880 74 75 72 6e 20 6f 75 74 3b 0a 7d 0a 0a 23 69 66  turn out;.}..#if
12890 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
128a0 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a  _FLOATING_POINT.
128b0 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61  /*.** Generate a
128c0 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 68  n instruction th
128d0 61 74 20 77 69 6c 6c 20 70 75 74 20 74 68 65 20  at will put the 
128e0 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 0a 2a  floating point.*
128f0 2a 20 76 61 6c 75 65 20 64 65 73 63 72 69 62 65  * value describe
12900 64 20 62 79 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 69  d by z[0..n-1] i
12910 6e 74 6f 20 72 65 67 69 73 74 65 72 20 69 4d 65  nto register iMe
12920 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 5b 5d  m..**.** The z[]
12930 20 73 74 72 69 6e 67 20 77 69 6c 6c 20 70 72 6f   string will pro
12940 62 61 62 6c 79 20 6e 6f 74 20 62 65 20 7a 65 72  bably not be zer
12950 6f 2d 74 65 72 6d 69 6e 61 74 65 64 2e 20 20 42  o-terminated.  B
12960 75 74 20 74 68 65 20 0a 2a 2a 20 7a 5b 6e 5d 20  ut the .** z[n] 
12970 63 68 61 72 61 63 74 65 72 20 69 73 20 67 75 61  character is gua
12980 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 73 6f  ranteed to be so
12990 6d 65 74 68 69 6e 67 20 74 68 61 74 20 64 6f 65  mething that doe
129a0 73 20 6e 6f 74 20 6c 6f 6f 6b 0a 2a 2a 20 6c 69  s not look.** li
129b0 6b 65 20 74 68 65 20 63 6f 6e 74 69 6e 75 61 74  ke the continuat
129c0 69 6f 6e 20 6f 66 20 74 68 65 20 6e 75 6d 62 65  ion of the numbe
129d0 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  r..*/.static voi
129e0 64 20 63 6f 64 65 52 65 61 6c 28 56 64 62 65 20  d codeReal(Vdbe 
129f0 2a 76 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  *v, const char *
12a00 7a 2c 20 69 6e 74 20 6e 65 67 61 74 65 46 6c 61  z, int negateFla
12a10 67 2c 20 69 6e 74 20 69 4d 65 6d 29 7b 0a 20 20  g, int iMem){.  
12a20 69 66 28 20 41 4c 57 41 59 53 28 7a 21 3d 30 29  if( ALWAYS(z!=0)
12a30 20 29 7b 0a 20 20 20 20 64 6f 75 62 6c 65 20 76   ){.    double v
12a40 61 6c 75 65 3b 0a 20 20 20 20 63 68 61 72 20 2a  alue;.    char *
12a50 7a 56 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 41  zV;.    sqlite3A
12a60 74 6f 46 28 7a 2c 20 26 76 61 6c 75 65 2c 20 73  toF(z, &value, s
12a70 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
12a80 29 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3b  ), SQLITE_UTF8);
12a90 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 73 71  .    assert( !sq
12aa0 6c 69 74 65 33 49 73 4e 61 4e 28 76 61 6c 75 65  lite3IsNaN(value
12ab0 29 20 29 3b 20 2f 2a 20 54 68 65 20 6e 65 77 20  ) ); /* The new 
12ac0 41 74 6f 46 20 6e 65 76 65 72 20 72 65 74 75 72  AtoF never retur
12ad0 6e 73 20 4e 61 4e 20 2a 2f 0a 20 20 20 20 69 66  ns NaN */.    if
12ae0 28 20 6e 65 67 61 74 65 46 6c 61 67 20 29 20 76  ( negateFlag ) v
12af0 61 6c 75 65 20 3d 20 2d 76 61 6c 75 65 3b 0a 20  alue = -value;. 
12b00 20 20 20 7a 56 20 3d 20 64 75 70 38 62 79 74 65     zV = dup8byte
12b10 73 28 76 2c 20 28 63 68 61 72 2a 29 26 76 61 6c  s(v, (char*)&val
12b20 75 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ue);.    sqlite3
12b30 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
12b40 5f 52 65 61 6c 2c 20 30 2c 20 69 4d 65 6d 2c 20  _Real, 0, iMem, 
12b50 30 2c 20 7a 56 2c 20 50 34 5f 52 45 41 4c 29 3b  0, zV, P4_REAL);
12b60 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a  .  }.}.#endif...
12b70 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61  /*.** Generate a
12b80 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 68  n instruction th
12b90 61 74 20 77 69 6c 6c 20 70 75 74 20 74 68 65 20  at will put the 
12ba0 69 6e 74 65 67 65 72 20 64 65 73 63 72 69 62 65  integer describe
12bb0 20 62 79 0a 2a 2a 20 74 65 78 74 20 7a 5b 30 2e   by.** text z[0.
12bc0 2e 6e 2d 31 5d 20 69 6e 74 6f 20 72 65 67 69 73  .n-1] into regis
12bd0 74 65 72 20 69 4d 65 6d 2e 0a 2a 2a 0a 2a 2a 20  ter iMem..**.** 
12be0 45 78 70 72 2e 75 2e 7a 54 6f 6b 65 6e 20 69 73  Expr.u.zToken is
12bf0 20 61 6c 77 61 79 73 20 55 54 46 38 20 61 6e 64   always UTF8 and
12c00 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74 65 64   zero-terminated
12c10 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
12c20 20 63 6f 64 65 49 6e 74 65 67 65 72 28 50 61 72   codeInteger(Par
12c30 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
12c40 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 6e 65 67   *pExpr, int neg
12c50 46 6c 61 67 2c 20 69 6e 74 20 69 4d 65 6d 29 7b  Flag, int iMem){
12c60 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
12c70 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 66  rse->pVdbe;.  if
12c80 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26  ( pExpr->flags &
12c90 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 29 7b 0a   EP_IntValue ){.
12ca0 20 20 20 20 69 6e 74 20 69 20 3d 20 70 45 78 70      int i = pExp
12cb0 72 2d 3e 75 2e 69 56 61 6c 75 65 3b 0a 20 20 20  r->u.iValue;.   
12cc0 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20 29 3b   assert( i>=0 );
12cd0 0a 20 20 20 20 69 66 28 20 6e 65 67 46 6c 61 67  .    if( negFlag
12ce0 20 29 20 69 20 3d 20 2d 69 3b 0a 20 20 20 20 73   ) i = -i;.    s
12cf0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
12d00 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
12d10 69 2c 20 69 4d 65 6d 29 3b 0a 20 20 7d 65 6c 73  i, iMem);.  }els
12d20 65 7b 0a 20 20 20 20 69 6e 74 20 63 3b 0a 20 20  e{.    int c;.  
12d30 20 20 69 36 34 20 76 61 6c 75 65 3b 0a 20 20 20    i64 value;.   
12d40 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d   const char *z =
12d50 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
12d60 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 7a 21  ;.    assert( z!
12d70 3d 30 20 29 3b 0a 20 20 20 20 63 20 3d 20 73 71  =0 );.    c = sq
12d80 6c 69 74 65 33 44 65 63 4f 72 48 65 78 54 6f 49  lite3DecOrHexToI
12d90 36 34 28 7a 2c 20 26 76 61 6c 75 65 29 3b 0a 20  64(z, &value);. 
12da0 20 20 20 69 66 28 20 63 3d 3d 30 20 7c 7c 20 28     if( c==0 || (
12db0 63 3d 3d 32 20 26 26 20 6e 65 67 46 6c 61 67 29  c==2 && negFlag)
12dc0 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a   ){.      char *
12dd0 7a 56 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 65  zV;.      if( ne
12de0 67 46 6c 61 67 20 29 7b 20 76 61 6c 75 65 20 3d  gFlag ){ value =
12df0 20 63 3d 3d 32 20 3f 20 53 4d 41 4c 4c 45 53 54   c==2 ? SMALLEST
12e00 5f 49 4e 54 36 34 20 3a 20 2d 76 61 6c 75 65 3b  _INT64 : -value;
12e10 20 7d 0a 20 20 20 20 20 20 7a 56 20 3d 20 64 75   }.      zV = du
12e20 70 38 62 79 74 65 73 28 76 2c 20 28 63 68 61 72  p8bytes(v, (char
12e30 2a 29 26 76 61 6c 75 65 29 3b 0a 20 20 20 20 20  *)&value);.     
12e40 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12e50 70 34 28 76 2c 20 4f 50 5f 49 6e 74 36 34 2c 20  p4(v, OP_Int64, 
12e60 30 2c 20 69 4d 65 6d 2c 20 30 2c 20 7a 56 2c 20  0, iMem, 0, zV, 
12e70 50 34 5f 49 4e 54 36 34 29 3b 0a 20 20 20 20 7d  P4_INT64);.    }
12e80 65 6c 73 65 7b 0a 23 69 66 64 65 66 20 53 51 4c  else{.#ifdef SQL
12e90 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e  ITE_OMIT_FLOATIN
12ea0 47 5f 50 4f 49 4e 54 0a 20 20 20 20 20 20 73 71  G_POINT.      sq
12eb0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
12ec0 61 72 73 65 2c 20 22 6f 76 65 72 73 69 7a 65 64  arse, "oversized
12ed0 20 69 6e 74 65 67 65 72 3a 20 25 73 25 73 22 2c   integer: %s%s",
12ee0 20 6e 65 67 46 6c 61 67 20 3f 20 22 2d 22 20 3a   negFlag ? "-" :
12ef0 20 22 22 2c 20 7a 29 3b 0a 23 65 6c 73 65 0a 23   "", z);.#else.#
12f00 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
12f10 49 54 5f 48 45 58 5f 49 4e 54 45 47 45 52 0a 20  IT_HEX_INTEGER. 
12f20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
12f30 5f 73 74 72 6e 69 63 6d 70 28 7a 2c 22 30 78 22  _strnicmp(z,"0x"
12f40 2c 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ,2)==0 ){.      
12f50 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
12f60 67 28 70 50 61 72 73 65 2c 20 22 68 65 78 20 6c  g(pParse, "hex l
12f70 69 74 65 72 61 6c 20 74 6f 6f 20 62 69 67 3a 20  iteral too big: 
12f80 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 7d  %s", z);.      }
12f90 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20  else.#endif.    
12fa0 20 20 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65    {.        code
12fb0 52 65 61 6c 28 76 2c 20 7a 2c 20 6e 65 67 46 6c  Real(v, z, negFl
12fc0 61 67 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20 20  ag, iMem);.     
12fd0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a   }.#endif.    }.
12fe0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65    }.}../*.** Cle
12ff0 61 72 20 61 20 63 61 63 68 65 20 65 6e 74 72 79  ar a cache entry
13000 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
13010 20 63 61 63 68 65 45 6e 74 72 79 43 6c 65 61 72   cacheEntryClear
13020 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
13030 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65  struct yColCache
13040 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 74   *p){.  if( p->t
13050 65 6d 70 52 65 67 20 29 7b 0a 20 20 20 20 69 66  empReg ){.    if
13060 28 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52  ( pParse->nTempR
13070 65 67 3c 41 72 72 61 79 53 69 7a 65 28 70 50 61  eg<ArraySize(pPa
13080 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 29 20 29  rse->aTempReg) )
13090 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  {.      pParse->
130a0 61 54 65 6d 70 52 65 67 5b 70 50 61 72 73 65 2d  aTempReg[pParse-
130b0 3e 6e 54 65 6d 70 52 65 67 2b 2b 5d 20 3d 20 70  >nTempReg++] = p
130c0 2d 3e 69 52 65 67 3b 0a 20 20 20 20 7d 0a 20 20  ->iReg;.    }.  
130d0 20 20 70 2d 3e 74 65 6d 70 52 65 67 20 3d 20 30    p->tempReg = 0
130e0 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  ;.  }.}.../*.** 
130f0 52 65 63 6f 72 64 20 69 6e 20 74 68 65 20 63 6f  Record in the co
13100 6c 75 6d 6e 20 63 61 63 68 65 20 74 68 61 74 20  lumn cache that 
13110 61 20 70 61 72 74 69 63 75 6c 61 72 20 63 6f 6c  a particular col
13120 75 6d 6e 20 66 72 6f 6d 20 61 0a 2a 2a 20 70 61  umn from a.** pa
13130 72 74 69 63 75 6c 61 72 20 74 61 62 6c 65 20 69  rticular table i
13140 73 20 73 74 6f 72 65 64 20 69 6e 20 61 20 70 61  s stored in a pa
13150 72 74 69 63 75 6c 61 72 20 72 65 67 69 73 74 65  rticular registe
13160 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  r..*/.void sqlit
13170 65 33 45 78 70 72 43 61 63 68 65 53 74 6f 72 65  e3ExprCacheStore
13180 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
13190 69 6e 74 20 69 54 61 62 2c 20 69 6e 74 20 69 43  int iTab, int iC
131a0 6f 6c 2c 20 69 6e 74 20 69 52 65 67 29 7b 0a 20  ol, int iReg){. 
131b0 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6d 69   int i;.  int mi
131c0 6e 4c 72 75 3b 0a 20 20 69 6e 74 20 69 64 78 4c  nLru;.  int idxL
131d0 72 75 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f  ru;.  struct yCo
131e0 6c 43 61 63 68 65 20 2a 70 3b 0a 0a 20 20 61 73  lCache *p;..  as
131f0 73 65 72 74 28 20 69 52 65 67 3e 30 20 29 3b 20  sert( iReg>0 ); 
13200 20 2f 2a 20 52 65 67 69 73 74 65 72 20 6e 75 6d   /* Register num
13210 62 65 72 73 20 61 72 65 20 61 6c 77 61 79 73 20  bers are always 
13220 70 6f 73 69 74 69 76 65 20 2a 2f 0a 20 20 61 73  positive */.  as
13230 73 65 72 74 28 20 69 43 6f 6c 3e 3d 2d 31 20 26  sert( iCol>=-1 &
13240 26 20 69 43 6f 6c 3c 33 32 37 36 38 20 29 3b 20  & iCol<32768 ); 
13250 20 2f 2a 20 46 69 6e 69 74 65 20 63 6f 6c 75 6d   /* Finite colum
13260 6e 20 6e 75 6d 62 65 72 73 20 2a 2f 0a 0a 20 20  n numbers */..  
13270 2f 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 43 6f  /* The SQLITE_Co
13280 6c 75 6d 6e 43 61 63 68 65 20 66 6c 61 67 20 64  lumnCache flag d
13290 69 73 61 62 6c 65 73 20 74 68 65 20 63 6f 6c 75  isables the colu
132a0 6d 6e 20 63 61 63 68 65 2e 20 20 54 68 69 73 20  mn cache.  This 
132b0 69 73 20 75 73 65 64 0a 20 20 2a 2a 20 66 6f 72  is used.  ** for
132c0 20 74 65 73 74 69 6e 67 20 6f 6e 6c 79 20 2d 20   testing only - 
132d0 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20 53  to verify that S
132e0 51 4c 69 74 65 20 61 6c 77 61 79 73 20 67 65 74  QLite always get
132f0 73 20 74 68 65 20 73 61 6d 65 20 61 6e 73 77 65  s the same answe
13300 72 0a 20 20 2a 2a 20 77 69 74 68 20 61 6e 64 20  r.  ** with and 
13310 77 69 74 68 6f 75 74 20 74 68 65 20 63 6f 6c 75  without the colu
13320 6d 6e 20 63 61 63 68 65 2e 0a 20 20 2a 2f 0a 20  mn cache..  */. 
13330 20 69 66 28 20 4f 70 74 69 6d 69 7a 61 74 69 6f   if( Optimizatio
13340 6e 44 69 73 61 62 6c 65 64 28 70 50 61 72 73 65  nDisabled(pParse
13350 2d 3e 64 62 2c 20 53 51 4c 49 54 45 5f 43 6f 6c  ->db, SQLITE_Col
13360 75 6d 6e 43 61 63 68 65 29 20 29 20 72 65 74 75  umnCache) ) retu
13370 72 6e 3b 0a 0a 20 20 2f 2a 20 46 69 72 73 74 20  rn;..  /* First 
13380 72 65 70 6c 61 63 65 20 61 6e 79 20 65 78 69 73  replace any exis
13390 74 69 6e 67 20 65 6e 74 72 79 2e 0a 20 20 2a 2a  ting entry..  **
133a0 0a 20 20 2a 2a 20 41 63 74 75 61 6c 6c 79 2c 20  .  ** Actually, 
133b0 74 68 65 20 77 61 79 20 74 68 65 20 63 6f 6c 75  the way the colu
133c0 6d 6e 20 63 61 63 68 65 20 69 73 20 63 75 72 72  mn cache is curr
133d0 65 6e 74 6c 79 20 75 73 65 64 2c 20 77 65 20 61  ently used, we a
133e0 72 65 20 67 75 61 72 61 6e 74 65 65 64 0a 20 20  re guaranteed.  
133f0 2a 2a 20 74 68 61 74 20 74 68 65 20 6f 62 6a 65  ** that the obje
13400 63 74 20 77 69 6c 6c 20 6e 65 76 65 72 20 61 6c  ct will never al
13410 72 65 61 64 79 20 62 65 20 69 6e 20 63 61 63 68  ready be in cach
13420 65 2e 20 20 56 65 72 69 66 79 20 74 68 69 73 20  e.  Verify this 
13430 67 75 61 72 61 6e 74 65 65 2e 0a 20 20 2a 2f 0a  guarantee..  */.
13440 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
13450 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72   for(i=0, p=pPar
13460 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69  se->aColCache; i
13470 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43  <SQLITE_N_COLCAC
13480 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20  HE; i++, p++){. 
13490 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 52     assert( p->iR
134a0 65 67 3d 3d 30 20 7c 7c 20 70 2d 3e 69 54 61 62  eg==0 || p->iTab
134b0 6c 65 21 3d 69 54 61 62 20 7c 7c 20 70 2d 3e 69  le!=iTab || p->i
134c0 43 6f 6c 75 6d 6e 21 3d 69 43 6f 6c 20 29 3b 0a  Column!=iCol );.
134d0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
134e0 20 46 69 6e 64 20 61 6e 20 65 6d 70 74 79 20 73   Find an empty s
134f0 6c 6f 74 20 61 6e 64 20 72 65 70 6c 61 63 65 20  lot and replace 
13500 69 74 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c  it */.  for(i=0,
13510 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43   p=pParse->aColC
13520 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e  ache; i<SQLITE_N
13530 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20  _COLCACHE; i++, 
13540 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  p++){.    if( p-
13550 3e 69 52 65 67 3d 3d 30 20 29 7b 0a 20 20 20 20  >iReg==0 ){.    
13560 20 20 70 2d 3e 69 4c 65 76 65 6c 20 3d 20 70 50    p->iLevel = pP
13570 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65  arse->iCacheLeve
13580 6c 3b 0a 20 20 20 20 20 20 70 2d 3e 69 54 61 62  l;.      p->iTab
13590 6c 65 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 20  le = iTab;.     
135a0 20 70 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69 43   p->iColumn = iC
135b0 6f 6c 3b 0a 20 20 20 20 20 20 70 2d 3e 69 52 65  ol;.      p->iRe
135c0 67 20 3d 20 69 52 65 67 3b 0a 20 20 20 20 20 20  g = iReg;.      
135d0 70 2d 3e 74 65 6d 70 52 65 67 20 3d 20 30 3b 0a  p->tempReg = 0;.
135e0 20 20 20 20 20 20 70 2d 3e 6c 72 75 20 3d 20 70        p->lru = p
135f0 50 61 72 73 65 2d 3e 69 43 61 63 68 65 43 6e 74  Parse->iCacheCnt
13600 2b 2b 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ++;.      return
13610 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
13620 2a 20 52 65 70 6c 61 63 65 20 74 68 65 20 6c 61  * Replace the la
13630 73 74 20 72 65 63 65 6e 74 6c 79 20 75 73 65 64  st recently used
13640 20 2a 2f 0a 20 20 6d 69 6e 4c 72 75 20 3d 20 30   */.  minLru = 0
13650 78 37 66 66 66 66 66 66 66 3b 0a 20 20 69 64 78  x7fffffff;.  idx
13660 4c 72 75 20 3d 20 2d 31 3b 0a 20 20 66 6f 72 28  Lru = -1;.  for(
13670 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61  i=0, p=pParse->a
13680 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49  ColCache; i<SQLI
13690 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69  TE_N_COLCACHE; i
136a0 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66  ++, p++){.    if
136b0 28 20 70 2d 3e 6c 72 75 3c 6d 69 6e 4c 72 75 20  ( p->lru<minLru 
136c0 29 7b 0a 20 20 20 20 20 20 69 64 78 4c 72 75 20  ){.      idxLru 
136d0 3d 20 69 3b 0a 20 20 20 20 20 20 6d 69 6e 4c 72  = i;.      minLr
136e0 75 20 3d 20 70 2d 3e 6c 72 75 3b 0a 20 20 20 20  u = p->lru;.    
136f0 7d 0a 20 20 7d 0a 20 20 69 66 28 20 41 4c 57 41  }.  }.  if( ALWA
13700 59 53 28 69 64 78 4c 72 75 3e 3d 30 29 20 29 7b  YS(idxLru>=0) ){
13710 0a 20 20 20 20 70 20 3d 20 26 70 50 61 72 73 65  .    p = &pParse
13720 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 69 64 78 4c  ->aColCache[idxL
13730 72 75 5d 3b 0a 20 20 20 20 70 2d 3e 69 4c 65 76  ru];.    p->iLev
13740 65 6c 20 3d 20 70 50 61 72 73 65 2d 3e 69 43 61  el = pParse->iCa
13750 63 68 65 4c 65 76 65 6c 3b 0a 20 20 20 20 70 2d  cheLevel;.    p-
13760 3e 69 54 61 62 6c 65 20 3d 20 69 54 61 62 3b 0a  >iTable = iTab;.
13770 20 20 20 20 70 2d 3e 69 43 6f 6c 75 6d 6e 20 3d      p->iColumn =
13780 20 69 43 6f 6c 3b 0a 20 20 20 20 70 2d 3e 69 52   iCol;.    p->iR
13790 65 67 20 3d 20 69 52 65 67 3b 0a 20 20 20 20 70  eg = iReg;.    p
137a0 2d 3e 74 65 6d 70 52 65 67 20 3d 20 30 3b 0a 20  ->tempReg = 0;. 
137b0 20 20 20 70 2d 3e 6c 72 75 20 3d 20 70 50 61 72     p->lru = pPar
137c0 73 65 2d 3e 69 43 61 63 68 65 43 6e 74 2b 2b 3b  se->iCacheCnt++;
137d0 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
137e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64 69 63 61  .}../*.** Indica
137f0 74 65 20 74 68 61 74 20 72 65 67 69 73 74 65 72  te that register
13800 73 20 62 65 74 77 65 65 6e 20 69 52 65 67 2e 2e  s between iReg..
13810 69 52 65 67 2b 6e 52 65 67 2d 31 20 61 72 65 20  iReg+nReg-1 are 
13820 62 65 69 6e 67 20 6f 76 65 72 77 72 69 74 74 65  being overwritte
13830 6e 2e 0a 2a 2a 20 50 75 72 67 65 20 74 68 65 20  n..** Purge the 
13840 72 61 6e 67 65 20 6f 66 20 72 65 67 69 73 74 65  range of registe
13850 72 73 20 66 72 6f 6d 20 74 68 65 20 63 6f 6c 75  rs from the colu
13860 6d 6e 20 63 61 63 68 65 2e 0a 2a 2f 0a 76 6f 69  mn cache..*/.voi
13870 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63  d sqlite3ExprCac
13880 68 65 52 65 6d 6f 76 65 28 50 61 72 73 65 20 2a  heRemove(Parse *
13890 70 50 61 72 73 65 2c 20 69 6e 74 20 69 52 65 67  pParse, int iReg
138a0 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20 69  , int nReg){.  i
138b0 6e 74 20 69 3b 0a 20 20 69 6e 74 20 69 4c 61 73  nt i;.  int iLas
138c0 74 20 3d 20 69 52 65 67 20 2b 20 6e 52 65 67 20  t = iReg + nReg 
138d0 2d 20 31 3b 0a 20 20 73 74 72 75 63 74 20 79 43  - 1;.  struct yC
138e0 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20 66 6f  olCache *p;.  fo
138f0 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d  r(i=0, p=pParse-
13900 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51  >aColCache; i<SQ
13910 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b  LITE_N_COLCACHE;
13920 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20   i++, p++){.    
13930 69 6e 74 20 72 20 3d 20 70 2d 3e 69 52 65 67 3b  int r = p->iReg;
13940 0a 20 20 20 20 69 66 28 20 72 3e 3d 69 52 65 67  .    if( r>=iReg
13950 20 26 26 20 72 3c 3d 69 4c 61 73 74 20 29 7b 0a   && r<=iLast ){.
13960 20 20 20 20 20 20 63 61 63 68 65 45 6e 74 72 79        cacheEntry
13970 43 6c 65 61 72 28 70 50 61 72 73 65 2c 20 70 29  Clear(pParse, p)
13980 3b 0a 20 20 20 20 20 20 70 2d 3e 69 52 65 67 20  ;.      p->iReg 
13990 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  = 0;.    }.  }.}
139a0 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 65 6d 62 65 72  ../*.** Remember
139b0 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6c   the current col
139c0 75 6d 6e 20 63 61 63 68 65 20 63 6f 6e 74 65 78  umn cache contex
139d0 74 2e 20 20 41 6e 79 20 6e 65 77 20 65 6e 74 72  t.  Any new entr
139e0 69 65 73 20 61 64 64 65 64 0a 2a 2a 20 61 64 64  ies added.** add
139f0 65 64 20 74 6f 20 74 68 65 20 63 6f 6c 75 6d 6e  ed to the column
13a00 20 63 61 63 68 65 20 61 66 74 65 72 20 74 68 69   cache after thi
13a10 73 20 63 61 6c 6c 20 61 72 65 20 72 65 6d 6f 76  s call are remov
13a20 65 64 20 77 68 65 6e 20 74 68 65 0a 2a 2a 20 63  ed when the.** c
13a30 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 70 6f 70  orresponding pop
13a40 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 76 6f 69 64   occurs..*/.void
13a50 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
13a60 65 50 75 73 68 28 50 61 72 73 65 20 2a 70 50 61  ePush(Parse *pPa
13a70 72 73 65 29 7b 0a 20 20 70 50 61 72 73 65 2d 3e  rse){.  pParse->
13a80 69 43 61 63 68 65 4c 65 76 65 6c 2b 2b 3b 0a 23  iCacheLevel++;.#
13a90 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
13aa0 55 47 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  UG.  if( pParse-
13ab0 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  >db->flags & SQL
13ac0 49 54 45 5f 56 64 62 65 41 64 64 6f 70 54 72 61  ITE_VdbeAddopTra
13ad0 63 65 20 29 7b 0a 20 20 20 20 70 72 69 6e 74 66  ce ){.    printf
13ae0 28 22 50 55 53 48 20 74 6f 20 25 64 5c 6e 22 2c  ("PUSH to %d\n",
13af0 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c   pParse->iCacheL
13b00 65 76 65 6c 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  evel);.  }.#endi
13b10 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76  f.}../*.** Remov
13b20 65 20 66 72 6f 6d 20 74 68 65 20 63 6f 6c 75 6d  e from the colum
13b30 6e 20 63 61 63 68 65 20 61 6e 79 20 65 6e 74 72  n cache any entr
13b40 69 65 73 20 74 68 61 74 20 77 65 72 65 20 61 64  ies that were ad
13b50 64 65 64 20 73 69 6e 63 65 20 74 68 65 0a 2a 2a  ded since the.**
13b60 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 73 71   the previous sq
13b70 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75  lite3ExprCachePu
13b80 73 68 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 49  sh operation.  I
13b90 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 72  n other words, r
13ba0 65 73 74 6f 72 65 0a 2a 2a 20 74 68 65 20 63 61  estore.** the ca
13bb0 63 68 65 20 74 6f 20 74 68 65 20 73 74 61 74 65  che to the state
13bc0 20 69 74 20 77 61 73 20 69 6e 20 70 72 69 6f 72   it was in prior
13bd0 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
13be0 20 50 75 73 68 2e 0a 2a 2f 0a 76 6f 69 64 20 73   Push..*/.void s
13bf0 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
13c00 6f 70 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  op(Parse *pParse
13c10 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74  ){.  int i;.  st
13c20 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a  ruct yColCache *
13c30 70 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  p;.  assert( pPa
13c40 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c  rse->iCacheLevel
13c50 3e 3d 31 20 29 3b 0a 20 20 70 50 61 72 73 65 2d  >=1 );.  pParse-
13c60 3e 69 43 61 63 68 65 4c 65 76 65 6c 2d 2d 3b 0a  >iCacheLevel--;.
13c70 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
13c80 42 55 47 0a 20 20 69 66 28 20 70 50 61 72 73 65  BUG.  if( pParse
13c90 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ->db->flags & SQ
13ca0 4c 49 54 45 5f 56 64 62 65 41 64 64 6f 70 54 72  LITE_VdbeAddopTr
13cb0 61 63 65 20 29 7b 0a 20 20 20 20 70 72 69 6e 74  ace ){.    print
13cc0 66 28 22 50 4f 50 20 20 74 6f 20 25 64 5c 6e 22  f("POP  to %d\n"
13cd0 2c 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65  , pParse->iCache
13ce0 4c 65 76 65 6c 29 3b 0a 20 20 7d 0a 23 65 6e 64  Level);.  }.#end
13cf0 69 66 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d  if.  for(i=0, p=
13d00 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68  pParse->aColCach
13d10 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f  e; i<SQLITE_N_CO
13d20 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b  LCACHE; i++, p++
13d30 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 52  ){.    if( p->iR
13d40 65 67 20 26 26 20 70 2d 3e 69 4c 65 76 65 6c 3e  eg && p->iLevel>
13d50 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65  pParse->iCacheLe
13d60 76 65 6c 20 29 7b 0a 20 20 20 20 20 20 63 61 63  vel ){.      cac
13d70 68 65 45 6e 74 72 79 43 6c 65 61 72 28 70 50 61  heEntryClear(pPa
13d80 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 20 20 70  rse, p);.      p
13d90 2d 3e 69 52 65 67 20 3d 20 30 3b 0a 20 20 20 20  ->iReg = 0;.    
13da0 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  }.  }.}../*.** W
13db0 68 65 6e 20 61 20 63 61 63 68 65 64 20 63 6f 6c  hen a cached col
13dc0 75 6d 6e 20 69 73 20 72 65 75 73 65 64 2c 20 6d  umn is reused, m
13dd0 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 69 74  ake sure that it
13de0 73 20 72 65 67 69 73 74 65 72 20 69 73 0a 2a 2a  s register is.**
13df0 20 6e 6f 20 6c 6f 6e 67 65 72 20 61 76 61 69 6c   no longer avail
13e00 61 62 6c 65 20 61 73 20 61 20 74 65 6d 70 20 72  able as a temp r
13e10 65 67 69 73 74 65 72 2e 20 20 74 69 63 6b 65 74  egister.  ticket
13e20 20 23 33 38 37 39 3a 20 20 74 68 61 74 20 73 61   #3879:  that sa
13e30 6d 65 0a 2a 2a 20 72 65 67 69 73 74 65 72 20 6d  me.** register m
13e40 69 67 68 74 20 62 65 20 69 6e 20 74 68 65 20 63  ight be in the c
13e50 61 63 68 65 20 69 6e 20 6d 75 6c 74 69 70 6c 65  ache in multiple
13e60 20 70 6c 61 63 65 73 2c 20 73 6f 20 62 65 20 73   places, so be s
13e70 75 72 65 20 74 6f 0a 2a 2a 20 67 65 74 20 74 68  ure to.** get th
13e80 65 6d 20 61 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69  em all..*/.stati
13e90 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  c void sqlite3Ex
13ea0 70 72 43 61 63 68 65 50 69 6e 52 65 67 69 73 74  prCachePinRegist
13eb0 65 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  er(Parse *pParse
13ec0 2c 20 69 6e 74 20 69 52 65 67 29 7b 0a 20 20 69  , int iReg){.  i
13ed0 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 79  nt i;.  struct y
13ee0 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20 66  ColCache *p;.  f
13ef0 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65  or(i=0, p=pParse
13f00 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53  ->aColCache; i<S
13f10 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45  QLITE_N_COLCACHE
13f20 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20  ; i++, p++){.   
13f30 20 69 66 28 20 70 2d 3e 69 52 65 67 3d 3d 69 52   if( p->iReg==iR
13f40 65 67 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 74  eg ){.      p->t
13f50 65 6d 70 52 65 67 20 3d 20 30 3b 0a 20 20 20 20  empReg = 0;.    
13f60 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  }.  }.}../*.** G
13f70 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
13f80 65 78 74 72 61 63 74 20 74 68 65 20 76 61 6c 75  extract the valu
13f90 65 20 6f 66 20 74 68 65 20 69 43 6f 6c 2d 74 68  e of the iCol-th
13fa0 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 20 74 61 62   column of a tab
13fb0 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  le..*/.void sqli
13fc0 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f  te3ExprCodeGetCo
13fd0 6c 75 6d 6e 4f 66 54 61 62 6c 65 28 0a 20 20 56  lumnOfTable(.  V
13fe0 64 62 65 20 2a 76 2c 20 20 20 20 20 20 20 20 2f  dbe *v,        /
13ff0 2a 20 54 68 65 20 56 44 42 45 20 75 6e 64 65 72  * The VDBE under
14000 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f   construction */
14010 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20  .  Table *pTab, 
14020 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20     /* The table 
14030 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 76  containing the v
14040 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54  alue */.  int iT
14050 61 62 43 75 72 2c 20 20 20 20 2f 2a 20 54 68 65  abCur,    /* The
14060 20 74 61 62 6c 65 20 63 75 72 73 6f 72 2e 20 20   table cursor.  
14070 4f 72 20 74 68 65 20 50 4b 20 63 75 72 73 6f 72  Or the PK cursor
14080 20 66 6f 72 20 57 49 54 48 4f 55 54 20 52 4f 57   for WITHOUT ROW
14090 49 44 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c  ID */.  int iCol
140a0 2c 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78  ,       /* Index
140b0 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74   of the column t
140c0 6f 20 65 78 74 72 61 63 74 20 2a 2f 0a 20 20 69  o extract */.  i
140d0 6e 74 20 72 65 67 4f 75 74 20 20 20 20 20 20 2f  nt regOut      /
140e0 2a 20 45 78 74 72 61 63 74 20 74 68 65 20 76 61  * Extract the va
140f0 6c 75 65 20 69 6e 74 6f 20 74 68 69 73 20 72 65  lue into this re
14100 67 69 73 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 69  gister */.){.  i
14110 66 28 20 69 43 6f 6c 3c 30 20 7c 7c 20 69 43 6f  f( iCol<0 || iCo
14120 6c 3d 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20 29  l==pTab->iPKey )
14130 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
14140 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f  eAddOp2(v, OP_Ro
14150 77 69 64 2c 20 69 54 61 62 43 75 72 2c 20 72 65  wid, iTabCur, re
14160 67 4f 75 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  gOut);.  }else{.
14170 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 49 73 56      int op = IsV
14180 69 72 74 75 61 6c 28 70 54 61 62 29 20 3f 20 4f  irtual(pTab) ? O
14190 50 5f 56 43 6f 6c 75 6d 6e 20 3a 20 4f 50 5f 43  P_VColumn : OP_C
141a0 6f 6c 75 6d 6e 3b 0a 20 20 20 20 69 6e 74 20 78  olumn;.    int x
141b0 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 69 66 28   = iCol;.    if(
141c0 20 21 48 61 73 52 6f 77 69 64 28 70 54 61 62 29   !HasRowid(pTab)
141d0 20 29 7b 0a 20 20 20 20 20 20 78 20 3d 20 73 71   ){.      x = sq
141e0 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64  lite3ColumnOfInd
141f0 65 78 28 73 71 6c 69 74 65 33 50 72 69 6d 61 72  ex(sqlite3Primar
14200 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29 2c  yKeyIndex(pTab),
14210 20 69 43 6f 6c 29 3b 0a 20 20 20 20 7d 0a 20 20   iCol);.    }.  
14220 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
14230 4f 70 33 28 76 2c 20 6f 70 2c 20 69 54 61 62 43  Op3(v, op, iTabC
14240 75 72 2c 20 78 2c 20 72 65 67 4f 75 74 29 3b 0a  ur, x, regOut);.
14250 20 20 7d 0a 20 20 69 66 28 20 69 43 6f 6c 3e 3d    }.  if( iCol>=
14260 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
14270 43 6f 6c 75 6d 6e 44 65 66 61 75 6c 74 28 76 2c  ColumnDefault(v,
14280 20 70 54 61 62 2c 20 69 43 6f 6c 2c 20 72 65 67   pTab, iCol, reg
14290 4f 75 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  Out);.  }.}../*.
142a0 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
142b0 20 74 68 61 74 20 77 69 6c 6c 20 65 78 74 72 61   that will extra
142c0 63 74 20 74 68 65 20 69 43 6f 6c 75 6d 6e 2d 74  ct the iColumn-t
142d0 68 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d 0a 2a 2a  h column from.**
142e0 20 74 61 62 6c 65 20 70 54 61 62 20 61 6e 64 20   table pTab and 
142f0 73 74 6f 72 65 20 74 68 65 20 63 6f 6c 75 6d 6e  store the column
14300 20 76 61 6c 75 65 20 69 6e 20 61 20 72 65 67 69   value in a regi
14310 73 74 65 72 2e 20 20 41 6e 20 65 66 66 6f 72 74  ster.  An effort
14320 0a 2a 2a 20 69 73 20 6d 61 64 65 20 74 6f 20 73  .** is made to s
14330 74 6f 72 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20  tore the column 
14340 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65  value in registe
14350 72 20 69 52 65 67 2c 20 62 75 74 20 74 68 69 73  r iReg, but this
14360 20 69 73 0a 2a 2a 20 6e 6f 74 20 67 75 61 72 61   is.** not guara
14370 6e 74 65 65 64 2e 20 20 54 68 65 20 6c 6f 63 61  nteed.  The loca
14380 74 69 6f 6e 20 6f 66 20 74 68 65 20 63 6f 6c 75  tion of the colu
14390 6d 6e 20 76 61 6c 75 65 20 69 73 20 72 65 74 75  mn value is retu
143a0 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72  rned..**.** Ther
143b0 65 20 6d 75 73 74 20 62 65 20 61 6e 20 6f 70 65  e must be an ope
143c0 6e 20 63 75 72 73 6f 72 20 74 6f 20 70 54 61 62  n cursor to pTab
143d0 20 69 6e 20 69 54 61 62 6c 65 20 77 68 65 6e 20   in iTable when 
143e0 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
143f0 69 73 20 63 61 6c 6c 65 64 2e 20 20 49 66 20 69  is called.  If i
14400 43 6f 6c 75 6d 6e 3c 30 20 74 68 65 6e 20 63 6f  Column<0 then co
14410 64 65 20 69 73 20 67 65 6e 65 72 61 74 65 64 20  de is generated 
14420 74 68 61 74 20 65 78 74 72 61 63 74 73 20 74 68  that extracts th
14430 65 20 72 6f 77 69 64 2e 0a 2a 2f 0a 69 6e 74 20  e rowid..*/.int 
14440 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47  sqlite3ExprCodeG
14450 65 74 43 6f 6c 75 6d 6e 28 0a 20 20 50 61 72 73  etColumn(.  Pars
14460 65 20 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a 20  e *pParse,   /* 
14470 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65  Parsing and code
14480 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74   generating cont
14490 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a  ext */.  Table *
144a0 70 54 61 62 2c 20 20 20 20 20 2f 2a 20 44 65 73  pTab,     /* Des
144b0 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20  cription of the 
144c0 74 61 62 6c 65 20 77 65 20 61 72 65 20 72 65 61  table we are rea
144d0 64 69 6e 67 20 66 72 6f 6d 20 2a 2f 0a 20 20 69  ding from */.  i
144e0 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20 20 20  nt iColumn,     
144f0 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20  /* Index of the 
14500 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 2a 2f 0a  table column */.
14510 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20    int iTable,   
14520 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72     /* The cursor
14530 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65   pointing to the
14540 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
14550 69 52 65 67 2c 20 20 20 20 20 20 20 20 2f 2a 20  iReg,        /* 
14560 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20 68 65  Store results he
14570 72 65 20 2a 2f 0a 20 20 75 38 20 70 35 20 20 20  re */.  u8 p5   
14580 20 20 20 20 20 20 20 20 20 2f 2a 20 50 35 20 76           /* P5 v
14590 61 6c 75 65 20 66 6f 72 20 4f 50 5f 43 6f 6c 75  alue for OP_Colu
145a0 6d 6e 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20  mn */.){.  Vdbe 
145b0 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
145c0 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  be;.  int i;.  s
145d0 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20  truct yColCache 
145e0 2a 70 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 2c 20  *p;..  for(i=0, 
145f0 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61  p=pParse->aColCa
14600 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f  che; i<SQLITE_N_
14610 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70  COLCACHE; i++, p
14620 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  ++){.    if( p->
14630 69 52 65 67 3e 30 20 26 26 20 70 2d 3e 69 54 61  iReg>0 && p->iTa
14640 62 6c 65 3d 3d 69 54 61 62 6c 65 20 26 26 20 70  ble==iTable && p
14650 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 75  ->iColumn==iColu
14660 6d 6e 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6c  mn ){.      p->l
14670 72 75 20 3d 20 70 50 61 72 73 65 2d 3e 69 43 61  ru = pParse->iCa
14680 63 68 65 43 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  cheCnt++;.      
14690 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
146a0 50 69 6e 52 65 67 69 73 74 65 72 28 70 50 61 72  PinRegister(pPar
146b0 73 65 2c 20 70 2d 3e 69 52 65 67 29 3b 0a 20 20  se, p->iReg);.  
146c0 20 20 20 20 72 65 74 75 72 6e 20 70 2d 3e 69 52      return p->iR
146d0 65 67 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 20 0a  eg;.    }.  }  .
146e0 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29    assert( v!=0 )
146f0 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43  ;.  sqlite3ExprC
14700 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 4f 66 54 61  odeGetColumnOfTa
14710 62 6c 65 28 76 2c 20 70 54 61 62 2c 20 69 54 61  ble(v, pTab, iTa
14720 62 6c 65 2c 20 69 43 6f 6c 75 6d 6e 2c 20 69 52  ble, iColumn, iR
14730 65 67 29 3b 0a 20 20 69 66 28 20 70 35 20 29 7b  eg);.  if( p5 ){
14740 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
14750 43 68 61 6e 67 65 50 35 28 76 2c 20 70 35 29 3b  ChangeP5(v, p5);
14760 0a 20 20 7d 65 6c 73 65 7b 20 20 20 0a 20 20 20  .  }else{   .   
14770 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
14780 65 53 74 6f 72 65 28 70 50 61 72 73 65 2c 20 69  eStore(pParse, i
14790 54 61 62 6c 65 2c 20 69 43 6f 6c 75 6d 6e 2c 20  Table, iColumn, 
147a0 69 52 65 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74  iReg);.  }.  ret
147b0 75 72 6e 20 69 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a  urn iReg;.}../*.
147c0 2a 2a 20 43 6c 65 61 72 20 61 6c 6c 20 63 6f 6c  ** Clear all col
147d0 75 6d 6e 20 63 61 63 68 65 20 65 6e 74 72 69 65  umn cache entrie
147e0 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
147f0 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72  e3ExprCacheClear
14800 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b  (Parse *pParse){
14810 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75  .  int i;.  stru
14820 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b  ct yColCache *p;
14830 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 44 45 42  ..#if SQLITE_DEB
14840 55 47 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  UG.  if( pParse-
14850 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  >db->flags & SQL
14860 49 54 45 5f 56 64 62 65 41 64 64 6f 70 54 72 61  ITE_VdbeAddopTra
14870 63 65 20 29 7b 0a 20 20 20 20 70 72 69 6e 74 66  ce ){.    printf
14880 28 22 43 4c 45 41 52 5c 6e 22 29 3b 0a 20 20 7d  ("CLEAR\n");.  }
14890 0a 23 65 6e 64 69 66 0a 20 20 66 6f 72 28 69 3d  .#endif.  for(i=
148a0 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f  0, p=pParse->aCo
148b0 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45  lCache; i<SQLITE
148c0 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b  _N_COLCACHE; i++
148d0 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  , p++){.    if( 
148e0 70 2d 3e 69 52 65 67 20 29 7b 0a 20 20 20 20 20  p->iReg ){.     
148f0 20 63 61 63 68 65 45 6e 74 72 79 43 6c 65 61 72   cacheEntryClear
14900 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20  (pParse, p);.   
14910 20 20 20 70 2d 3e 69 52 65 67 20 3d 20 30 3b 0a     p->iReg = 0;.
14920 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
14930 2a 2a 20 52 65 63 6f 72 64 20 74 68 65 20 66 61  ** Record the fa
14940 63 74 20 74 68 61 74 20 61 6e 20 61 66 66 69 6e  ct that an affin
14950 69 74 79 20 63 68 61 6e 67 65 20 68 61 73 20 6f  ity change has o
14960 63 63 75 72 72 65 64 20 6f 6e 20 69 43 6f 75 6e  ccurred on iCoun
14970 74 0a 2a 2a 20 72 65 67 69 73 74 65 72 73 20 73  t.** registers s
14980 74 61 72 74 69 6e 67 20 77 69 74 68 20 69 53 74  tarting with iSt
14990 61 72 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  art..*/.void sql
149a0 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66  ite3ExprCacheAff
149b0 69 6e 69 74 79 43 68 61 6e 67 65 28 50 61 72 73  inityChange(Pars
149c0 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
149d0 53 74 61 72 74 2c 20 69 6e 74 20 69 43 6f 75 6e  Start, int iCoun
149e0 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  t){.  sqlite3Exp
149f0 72 43 61 63 68 65 52 65 6d 6f 76 65 28 70 50 61  rCacheRemove(pPa
14a00 72 73 65 2c 20 69 53 74 61 72 74 2c 20 69 43 6f  rse, iStart, iCo
14a10 75 6e 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  unt);.}../*.** G
14a20 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
14a30 6d 6f 76 65 20 63 6f 6e 74 65 6e 74 20 66 72 6f  move content fro
14a40 6d 20 72 65 67 69 73 74 65 72 73 20 69 46 72 6f  m registers iFro
14a50 6d 2e 2e 2e 69 46 72 6f 6d 2b 6e 52 65 67 2d 31  m...iFrom+nReg-1
14a60 0a 2a 2a 20 6f 76 65 72 20 74 6f 20 69 54 6f 2e  .** over to iTo.
14a70 2e 69 54 6f 2b 6e 52 65 67 2d 31 2e 20 4b 65 65  .iTo+nReg-1. Kee
14a80 70 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63  p the column cac
14a90 68 65 20 75 70 2d 74 6f 2d 64 61 74 65 2e 0a 2a  he up-to-date..*
14aa0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
14ab0 70 72 43 6f 64 65 4d 6f 76 65 28 50 61 72 73 65  prCodeMove(Parse
14ac0 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 46   *pParse, int iF
14ad0 72 6f 6d 2c 20 69 6e 74 20 69 54 6f 2c 20 69 6e  rom, int iTo, in
14ae0 74 20 6e 52 65 67 29 7b 0a 20 20 61 73 73 65 72  t nReg){.  asser
14af0 74 28 20 69 46 72 6f 6d 3e 3d 69 54 6f 2b 6e 52  t( iFrom>=iTo+nR
14b00 65 67 20 7c 7c 20 69 46 72 6f 6d 2b 6e 52 65 67  eg || iFrom+nReg
14b10 3c 3d 69 54 6f 20 29 3b 0a 20 20 73 71 6c 69 74  <=iTo );.  sqlit
14b20 65 33 56 64 62 65 41 64 64 4f 70 33 28 70 50 61  e3VdbeAddOp3(pPa
14b30 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 4d  rse->pVdbe, OP_M
14b40 6f 76 65 2c 20 69 46 72 6f 6d 2c 20 69 54 6f 2c  ove, iFrom, iTo,
14b50 20 6e 52 65 67 29 3b 0a 20 20 73 71 6c 69 74 65   nReg);.  sqlite
14b60 33 45 78 70 72 43 61 63 68 65 52 65 6d 6f 76 65  3ExprCacheRemove
14b70 28 70 50 61 72 73 65 2c 20 69 46 72 6f 6d 2c 20  (pParse, iFrom, 
14b80 6e 52 65 67 29 3b 0a 7d 0a 0a 23 69 66 20 64 65  nReg);.}..#if de
14b90 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42  fined(SQLITE_DEB
14ba0 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53  UG) || defined(S
14bb0 51 4c 49 54 45 5f 43 4f 56 45 52 41 47 45 5f 54  QLITE_COVERAGE_T
14bc0 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  EST)./*.** Retur
14bd0 6e 20 74 72 75 65 20 69 66 20 61 6e 79 20 72 65  n true if any re
14be0 67 69 73 74 65 72 20 69 6e 20 74 68 65 20 72 61  gister in the ra
14bf0 6e 67 65 20 69 46 72 6f 6d 2e 2e 69 54 6f 20 28  nge iFrom..iTo (
14c00 69 6e 63 6c 75 73 69 76 65 29 0a 2a 2a 20 69 73  inclusive).** is
14c10 20 75 73 65 64 20 61 73 20 70 61 72 74 20 6f 66   used as part of
14c20 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68   the column cach
14c30 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
14c40 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 77 69  utine is used wi
14c50 74 68 69 6e 20 61 73 73 65 72 74 28 29 20 61 6e  thin assert() an
14c60 64 20 74 65 73 74 63 61 73 65 28 29 20 6d 61 63  d testcase() mac
14c70 72 6f 73 20 6f 6e 6c 79 0a 2a 2a 20 61 6e 64 20  ros only.** and 
14c80 64 6f 65 73 20 6e 6f 74 20 61 70 70 65 61 72 20  does not appear 
14c90 69 6e 20 61 20 6e 6f 72 6d 61 6c 20 62 75 69 6c  in a normal buil
14ca0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
14cb0 20 75 73 65 64 41 73 43 6f 6c 75 6d 6e 43 61 63   usedAsColumnCac
14cc0 68 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  he(Parse *pParse
14cd0 2c 20 69 6e 74 20 69 46 72 6f 6d 2c 20 69 6e 74  , int iFrom, int
14ce0 20 69 54 6f 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   iTo){.  int i;.
14cf0 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63    struct yColCac
14d00 68 65 20 2a 70 3b 0a 20 20 66 6f 72 28 69 3d 30  he *p;.  for(i=0
14d10 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c  , p=pParse->aCol
14d20 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f  Cache; i<SQLITE_
14d30 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c  N_COLCACHE; i++,
14d40 20 70 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 72   p++){.    int r
14d50 20 3d 20 70 2d 3e 69 52 65 67 3b 0a 20 20 20 20   = p->iReg;.    
14d60 69 66 28 20 72 3e 3d 69 46 72 6f 6d 20 26 26 20  if( r>=iFrom && 
14d70 72 3c 3d 69 54 6f 20 29 20 72 65 74 75 72 6e 20  r<=iTo ) return 
14d80 31 3b 20 20 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a  1;    /*NO_TEST*
14d90 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  /.  }.  return 0
14da0 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
14db0 4c 49 54 45 5f 44 45 42 55 47 20 7c 7c 20 53 51  LITE_DEBUG || SQ
14dc0 4c 49 54 45 5f 43 4f 56 45 52 41 47 45 5f 54 45  LITE_COVERAGE_TE
14dd0 53 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  ST */../*.** Con
14de0 76 65 72 74 20 61 6e 20 65 78 70 72 65 73 73 69  vert an expressi
14df0 6f 6e 20 6e 6f 64 65 20 74 6f 20 61 20 54 4b 5f  on node to a TK_
14e00 52 45 47 49 53 54 45 52 0a 2a 2f 0a 73 74 61 74  REGISTER.*/.stat
14e10 69 63 20 76 6f 69 64 20 65 78 70 72 54 6f 52 65  ic void exprToRe
14e20 67 69 73 74 65 72 28 45 78 70 72 20 2a 70 2c 20  gister(Expr *p, 
14e30 69 6e 74 20 69 52 65 67 29 7b 0a 20 20 70 2d 3e  int iReg){.  p->
14e40 6f 70 32 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 70  op2 = p->op;.  p
14e50 2d 3e 6f 70 20 3d 20 54 4b 5f 52 45 47 49 53 54  ->op = TK_REGIST
14e60 45 52 3b 0a 20 20 70 2d 3e 69 54 61 62 6c 65 20  ER;.  p->iTable 
14e70 3d 20 69 52 65 67 3b 0a 20 20 45 78 70 72 43 6c  = iReg;.  ExprCl
14e80 65 61 72 50 72 6f 70 65 72 74 79 28 70 2c 20 45  earProperty(p, E
14e90 50 5f 53 6b 69 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  P_Skip);.}../*.*
14ea0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
14eb0 69 6e 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74  into the current
14ec0 20 56 64 62 65 20 74 6f 20 65 76 61 6c 75 61 74   Vdbe to evaluat
14ed0 65 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 65  e the given.** e
14ee0 78 70 72 65 73 73 69 6f 6e 2e 20 20 41 74 74 65  xpression.  Atte
14ef0 6d 70 74 20 74 6f 20 73 74 6f 72 65 20 74 68 65  mpt to store the
14f00 20 72 65 73 75 6c 74 73 20 69 6e 20 72 65 67 69   results in regi
14f10 73 74 65 72 20 22 74 61 72 67 65 74 22 2e 0a 2a  ster "target"..*
14f20 2a 20 52 65 74 75 72 6e 20 74 68 65 20 72 65 67  * Return the reg
14f30 69 73 74 65 72 20 77 68 65 72 65 20 72 65 73 75  ister where resu
14f40 6c 74 73 20 61 72 65 20 73 74 6f 72 65 64 2e 0a  lts are stored..
14f50 2a 2a 0a 2a 2a 20 57 69 74 68 20 74 68 69 73 20  **.** With this 
14f60 72 6f 75 74 69 6e 65 2c 20 74 68 65 72 65 20 69  routine, there i
14f70 73 20 6e 6f 20 67 75 61 72 61 6e 74 65 65 20 74  s no guarantee t
14f80 68 61 74 20 72 65 73 75 6c 74 73 20 77 69 6c 6c  hat results will
14f90 0a 2a 2a 20 62 65 20 73 74 6f 72 65 64 20 69 6e  .** be stored in
14fa0 20 74 61 72 67 65 74 2e 20 20 54 68 65 20 72 65   target.  The re
14fb0 73 75 6c 74 20 6d 69 67 68 74 20 62 65 20 73 74  sult might be st
14fc0 6f 72 65 64 20 69 6e 20 73 6f 6d 65 20 6f 74 68  ored in some oth
14fd0 65 72 0a 2a 2a 20 72 65 67 69 73 74 65 72 20 69  er.** register i
14fe0 66 20 69 74 20 69 73 20 63 6f 6e 76 65 6e 69 65  f it is convenie
14ff0 6e 74 20 74 6f 20 64 6f 20 73 6f 2e 20 20 54 68  nt to do so.  Th
15000 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  e calling functi
15010 6f 6e 0a 2a 2a 20 6d 75 73 74 20 63 68 65 63 6b  on.** must check
15020 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65   the return code
15030 20 61 6e 64 20 6d 6f 76 65 20 74 68 65 20 72 65   and move the re
15040 73 75 6c 74 73 20 74 6f 20 74 68 65 20 64 65 73  sults to the des
15050 69 72 65 64 0a 2a 2a 20 72 65 67 69 73 74 65 72  ired.** register
15060 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
15070 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 50  ExprCodeTarget(P
15080 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
15090 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 74  pr *pExpr, int t
150a0 61 72 67 65 74 29 7b 0a 20 20 56 64 62 65 20 2a  arget){.  Vdbe *
150b0 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
150c0 65 3b 20 20 2f 2a 20 54 68 65 20 56 4d 20 75 6e  e;  /* The VM un
150d0 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
150e0 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20   */.  int op;   
150f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15100 2f 2a 20 54 68 65 20 6f 70 63 6f 64 65 20 62 65  /* The opcode be
15110 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69  ing coded */.  i
15120 6e 74 20 69 6e 52 65 67 20 3d 20 74 61 72 67 65  nt inReg = targe
15130 74 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75  t;       /* Resu
15140 6c 74 73 20 73 74 6f 72 65 64 20 69 6e 20 72 65  lts stored in re
15150 67 69 73 74 65 72 20 69 6e 52 65 67 20 2a 2f 0a  gister inReg */.
15160 20 20 69 6e 74 20 72 65 67 46 72 65 65 31 20 3d    int regFree1 =
15170 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49   0;         /* I
15180 66 20 6e 6f 6e 2d 7a 65 72 6f 20 66 72 65 65 20  f non-zero free 
15190 74 68 69 73 20 74 65 6d 70 6f 72 61 72 79 20 72  this temporary r
151a0 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74  egister */.  int
151b0 20 72 65 67 46 72 65 65 32 20 3d 20 30 3b 20 20   regFree2 = 0;  
151c0 20 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e         /* If non
151d0 2d 7a 65 72 6f 20 66 72 65 65 20 74 68 69 73 20  -zero free this 
151e0 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74  temporary regist
151f0 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 31 2c 20  er */.  int r1, 
15200 72 32 2c 20 72 33 2c 20 72 34 3b 20 20 20 20 20  r2, r3, r4;     
15210 20 20 2f 2a 20 56 61 72 69 6f 75 73 20 72 65 67    /* Various reg
15220 69 73 74 65 72 20 6e 75 6d 62 65 72 73 20 2a 2f  ister numbers */
15230 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
15240 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 2f 2a 20   pParse->db; /* 
15250 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  The database con
15260 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70  nection */.  Exp
15270 72 20 74 65 6d 70 58 3b 20 20 20 20 20 20 20 20  r tempX;        
15280 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72         /* Tempor
15290 61 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20 6e  ary expression n
152a0 6f 64 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ode */..  assert
152b0 28 20 74 61 72 67 65 74 3e 30 20 26 26 20 74 61  ( target>0 && ta
152c0 72 67 65 74 3c 3d 70 50 61 72 73 65 2d 3e 6e 4d  rget<=pParse->nM
152d0 65 6d 20 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30  em );.  if( v==0
152e0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
152f0 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
15300 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
15310 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20  return 0;.  }.. 
15320 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 7b   if( pExpr==0 ){
15330 0a 20 20 20 20 6f 70 20 3d 20 54 4b 5f 4e 55 4c  .    op = TK_NUL
15340 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  L;.  }else{.    
15350 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a  op = pExpr->op;.
15360 20 20 7d 0a 20 20 73 77 69 74 63 68 28 20 6f 70    }.  switch( op
15370 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
15380 41 47 47 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20  AGG_COLUMN: {.  
15390 20 20 20 20 41 67 67 49 6e 66 6f 20 2a 70 41 67      AggInfo *pAg
153a0 67 49 6e 66 6f 20 3d 20 70 45 78 70 72 2d 3e 70  gInfo = pExpr->p
153b0 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 73  AggInfo;.      s
153c0 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f  truct AggInfo_co
153d0 6c 20 2a 70 43 6f 6c 20 3d 20 26 70 41 67 67 49  l *pCol = &pAggI
153e0 6e 66 6f 2d 3e 61 43 6f 6c 5b 70 45 78 70 72 2d  nfo->aCol[pExpr-
153f0 3e 69 41 67 67 5d 3b 0a 20 20 20 20 20 20 69 66  >iAgg];.      if
15400 28 20 21 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72  ( !pAggInfo->dir
15410 65 63 74 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20  ectMode ){.     
15420 20 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c 2d     assert( pCol-
15430 3e 69 4d 65 6d 3e 30 20 29 3b 0a 20 20 20 20 20  >iMem>0 );.     
15440 20 20 20 69 6e 52 65 67 20 3d 20 70 43 6f 6c 2d     inReg = pCol-
15450 3e 69 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 62  >iMem;.        b
15460 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73  reak;.      }els
15470 65 20 69 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e  e if( pAggInfo->
15480 75 73 65 53 6f 72 74 69 6e 67 49 64 78 20 29 7b  useSortingIdx ){
15490 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
154a0 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
154b0 5f 43 6f 6c 75 6d 6e 2c 20 70 41 67 67 49 6e 66  _Column, pAggInf
154c0 6f 2d 3e 73 6f 72 74 69 6e 67 49 64 78 50 54 61  o->sortingIdxPTa
154d0 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  b,.             
154e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
154f0 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f   pCol->iSorterCo
15500 6c 75 6d 6e 2c 20 74 61 72 67 65 74 29 3b 0a 20  lumn, target);. 
15510 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
15520 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 4f      }.      /* O
15530 74 68 65 72 77 69 73 65 2c 20 66 61 6c 6c 20 74  therwise, fall t
15540 68 72 75 20 69 6e 74 6f 20 74 68 65 20 54 4b 5f  hru into the TK_
15550 43 4f 4c 55 4d 4e 20 63 61 73 65 20 2a 2f 0a 20  COLUMN case */. 
15560 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
15570 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20  _COLUMN: {.     
15580 20 69 6e 74 20 69 54 61 62 20 3d 20 70 45 78 70   int iTab = pExp
15590 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20  r->iTable;.     
155a0 20 69 66 28 20 69 54 61 62 3c 30 20 29 7b 0a 20   if( iTab<0 ){. 
155b0 20 20 20 20 20 20 20 69 66 28 20 70 50 61 72 73         if( pPars
155c0 65 2d 3e 63 6b 42 61 73 65 3e 30 20 29 7b 0a 20  e->ckBase>0 ){. 
155d0 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65           /* Gene
155e0 72 61 74 69 6e 67 20 43 48 45 43 4b 20 63 6f 6e  rating CHECK con
155f0 73 74 72 61 69 6e 74 73 20 6f 72 20 69 6e 73 65  straints or inse
15600 72 74 69 6e 67 20 69 6e 74 6f 20 70 61 72 74 69  rting into parti
15610 61 6c 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20  al index */.    
15620 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 70 45        inReg = pE
15630 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 2b 20 70  xpr->iColumn + p
15640 50 61 72 73 65 2d 3e 63 6b 42 61 73 65 3b 0a 20  Parse->ckBase;. 
15650 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
15660 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
15670 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 6c 65           /* Dele
15680 74 69 6e 67 20 66 72 6f 6d 20 61 20 70 61 72 74  ting from a part
15690 69 61 6c 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20  ial index */.   
156a0 20 20 20 20 20 20 20 69 54 61 62 20 3d 20 70 50         iTab = pP
156b0 61 72 73 65 2d 3e 69 50 61 72 74 49 64 78 54 61  arse->iPartIdxTa
156c0 62 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  b;.        }.   
156d0 20 20 20 7d 0a 20 20 20 20 20 20 69 6e 52 65 67     }.      inReg
156e0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
156f0 64 65 47 65 74 43 6f 6c 75 6d 6e 28 70 50 61 72  deGetColumn(pPar
15700 73 65 2c 20 70 45 78 70 72 2d 3e 70 54 61 62 2c  se, pExpr->pTab,
15710 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
15720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15730 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20  pExpr->iColumn, 
15740 69 54 61 62 2c 20 74 61 72 67 65 74 2c 0a 20 20  iTab, target,.  
15750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15760 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
15770 70 72 2d 3e 6f 70 32 29 3b 0a 20 20 20 20 20 20  pr->op2);.      
15780 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
15790 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52   case TK_INTEGER
157a0 3a 20 7b 0a 20 20 20 20 20 20 63 6f 64 65 49 6e  : {.      codeIn
157b0 74 65 67 65 72 28 70 50 61 72 73 65 2c 20 70 45  teger(pParse, pE
157c0 78 70 72 2c 20 30 2c 20 74 61 72 67 65 74 29 3b  xpr, 0, target);
157d0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
157e0 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
157f0 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47  TE_OMIT_FLOATING
15800 5f 50 4f 49 4e 54 0a 20 20 20 20 63 61 73 65 20  _POINT.    case 
15810 54 4b 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20  TK_FLOAT: {.    
15820 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
15830 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
15840 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29  , EP_IntValue) )
15850 3b 0a 20 20 20 20 20 20 63 6f 64 65 52 65 61 6c  ;.      codeReal
15860 28 76 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  (v, pExpr->u.zTo
15870 6b 65 6e 2c 20 30 2c 20 74 61 72 67 65 74 29 3b  ken, 0, target);
15880 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
15890 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63    }.#endif.    c
158a0 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 20 7b  ase TK_STRING: {
158b0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
158c0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
158d0 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c  pExpr, EP_IntVal
158e0 75 65 29 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ue) );.      sql
158f0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
15900 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c  , OP_String8, 0,
15910 20 74 61 72 67 65 74 2c 20 30 2c 20 70 45 78 70   target, 0, pExp
15920 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30 29 3b  r->u.zToken, 0);
15930 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
15940 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
15950 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71  NULL: {.      sq
15960 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
15970 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74  v, OP_Null, 0, t
15980 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 62 72  arget);.      br
15990 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  eak;.    }.#ifnd
159a0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42  ef SQLITE_OMIT_B
159b0 4c 4f 42 5f 4c 49 54 45 52 41 4c 0a 20 20 20 20  LOB_LITERAL.    
159c0 63 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 20 7b 0a  case TK_BLOB: {.
159d0 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20        int n;.   
159e0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
159f0 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 42  ;.      char *zB
15a00 6c 6f 62 3b 0a 20 20 20 20 20 20 61 73 73 65 72  lob;.      asser
15a10 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
15a20 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e  rty(pExpr, EP_In
15a30 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20  tValue) );.     
15a40 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
15a50 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 78 27  u.zToken[0]=='x'
15a60 20 7c 7c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f   || pExpr->u.zTo
15a70 6b 65 6e 5b 30 5d 3d 3d 27 58 27 20 29 3b 0a 20  ken[0]=='X' );. 
15a80 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
15a90 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 31 5d 3d  pr->u.zToken[1]=
15aa0 3d 27 5c 27 27 20 29 3b 0a 20 20 20 20 20 20 7a  ='\'' );.      z
15ab0 20 3d 20 26 70 45 78 70 72 2d 3e 75 2e 7a 54 6f   = &pExpr->u.zTo
15ac0 6b 65 6e 5b 32 5d 3b 0a 20 20 20 20 20 20 6e 20  ken[2];.      n 
15ad0 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
15ae0 30 28 7a 29 20 2d 20 31 3b 0a 20 20 20 20 20 20  0(z) - 1;.      
15af0 61 73 73 65 72 74 28 20 7a 5b 6e 5d 3d 3d 27 5c  assert( z[n]=='\
15b00 27 27 20 29 3b 0a 20 20 20 20 20 20 7a 42 6c 6f  '' );.      zBlo
15b10 62 20 3d 20 73 71 6c 69 74 65 33 48 65 78 54 6f  b = sqlite3HexTo
15b20 42 6c 6f 62 28 73 71 6c 69 74 65 33 56 64 62 65  Blob(sqlite3Vdbe
15b30 44 62 28 76 29 2c 20 7a 2c 20 6e 29 3b 0a 20 20  Db(v), z, n);.  
15b40 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
15b50 64 64 4f 70 34 28 76 2c 20 4f 50 5f 42 6c 6f 62  ddOp4(v, OP_Blob
15b60 2c 20 6e 2f 32 2c 20 74 61 72 67 65 74 2c 20 30  , n/2, target, 0
15b70 2c 20 7a 42 6c 6f 62 2c 20 50 34 5f 44 59 4e 41  , zBlob, P4_DYNA
15b80 4d 49 43 29 3b 0a 20 20 20 20 20 20 62 72 65 61  MIC);.      brea
15b90 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
15ba0 20 20 20 20 63 61 73 65 20 54 4b 5f 56 41 52 49      case TK_VARI
15bb0 41 42 4c 45 3a 20 7b 0a 20 20 20 20 20 20 61 73  ABLE: {.      as
15bc0 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
15bd0 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
15be0 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20  _IntValue) );.  
15bf0 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
15c00 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 21 3d 30 20 29  r->u.zToken!=0 )
15c10 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
15c20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b  pExpr->u.zToken[
15c30 30 5d 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 73  0]!=0 );.      s
15c40 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
15c50 28 76 2c 20 4f 50 5f 56 61 72 69 61 62 6c 65 2c  (v, OP_Variable,
15c60 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c   pExpr->iColumn,
15c70 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
15c80 69 66 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  if( pExpr->u.zTo
15c90 6b 65 6e 5b 31 5d 21 3d 30 20 29 7b 0a 20 20 20  ken[1]!=0 ){.   
15ca0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
15cb0 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d  pr->u.zToken[0]=
15cc0 3d 27 3f 27 20 0a 20 20 20 20 20 20 20 20 20 20  ='?' .          
15cd0 20 20 20 7c 7c 20 73 74 72 63 6d 70 28 70 45 78     || strcmp(pEx
15ce0 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 70 50  pr->u.zToken, pP
15cf0 61 72 73 65 2d 3e 61 7a 56 61 72 5b 70 45 78 70  arse->azVar[pExp
15d00 72 2d 3e 69 43 6f 6c 75 6d 6e 2d 31 5d 29 3d 3d  r->iColumn-1])==
15d10 30 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 );.        sql
15d20 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34  ite3VdbeChangeP4
15d30 28 76 2c 20 2d 31 2c 20 70 50 61 72 73 65 2d 3e  (v, -1, pParse->
15d40 61 7a 56 61 72 5b 70 45 78 70 72 2d 3e 69 43 6f  azVar[pExpr->iCo
15d50 6c 75 6d 6e 2d 31 5d 2c 20 50 34 5f 53 54 41 54  lumn-1], P4_STAT
15d60 49 43 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  IC);.      }.   
15d70 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
15d80 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45 47 49      case TK_REGI
15d90 53 54 45 52 3a 20 7b 0a 20 20 20 20 20 20 69 6e  STER: {.      in
15da0 52 65 67 20 3d 20 70 45 78 70 72 2d 3e 69 54 61  Reg = pExpr->iTa
15db0 62 6c 65 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ble;.      break
15dc0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
15dd0 20 54 4b 5f 41 53 3a 20 7b 0a 20 20 20 20 20 20   TK_AS: {.      
15de0 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45  inReg = sqlite3E
15df0 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50  xprCodeTarget(pP
15e00 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
15e10 66 74 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  ft, target);.   
15e20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
15e30 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
15e40 4d 49 54 5f 43 41 53 54 0a 20 20 20 20 63 61 73  MIT_CAST.    cas
15e50 65 20 54 4b 5f 43 41 53 54 3a 20 7b 0a 20 20 20  e TK_CAST: {.   
15e60 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e     /* Expression
15e70 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 20 20  s of the form:  
15e80 20 43 41 53 54 28 70 4c 65 66 74 20 41 53 20 74   CAST(pLeft AS t
15e90 6f 6b 65 6e 29 20 2a 2f 0a 20 20 20 20 20 20 69  oken) */.      i
15ea0 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78  nReg = sqlite3Ex
15eb0 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61  prCodeTarget(pPa
15ec0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
15ed0 74 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  t, target);.    
15ee0 20 20 69 66 28 20 69 6e 52 65 67 21 3d 74 61 72    if( inReg!=tar
15ef0 67 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  get ){.        s
15f00 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
15f10 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 69 6e  (v, OP_SCopy, in
15f20 52 65 67 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  Reg, target);.  
15f30 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 74 61        inReg = ta
15f40 72 67 65 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rget;.      }.  
15f50 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
15f60 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 61 73 74  ddOp2(v, OP_Cast
15f70 2c 20 74 61 72 67 65 74 2c 0a 20 20 20 20 20 20  , target,.      
15f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15f90 20 20 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74    sqlite3Affinit
15fa0 79 54 79 70 65 28 70 45 78 70 72 2d 3e 75 2e 7a  yType(pExpr->u.z
15fb0 54 6f 6b 65 6e 2c 20 30 29 29 3b 0a 20 20 20 20  Token, 0));.    
15fc0 20 20 74 65 73 74 63 61 73 65 28 20 75 73 65 64    testcase( used
15fd0 41 73 43 6f 6c 75 6d 6e 43 61 63 68 65 28 70 50  AsColumnCache(pP
15fe0 61 72 73 65 2c 20 69 6e 52 65 67 2c 20 69 6e 52  arse, inReg, inR
15ff0 65 67 29 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  eg) );.      sql
16000 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66  ite3ExprCacheAff
16010 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72  inityChange(pPar
16020 73 65 2c 20 69 6e 52 65 67 2c 20 31 29 3b 0a 20  se, inReg, 1);. 
16030 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
16040 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
16050 54 45 5f 4f 4d 49 54 5f 43 41 53 54 20 2a 2f 0a  TE_OMIT_CAST */.
16060 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a      case TK_LT:.
16070 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a      case TK_LE:.
16080 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a      case TK_GT:.
16090 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a      case TK_GE:.
160a0 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a      case TK_NE:.
160b0 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20      case TK_EQ: 
160c0 7b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  {.      r1 = sql
160d0 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
160e0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
160f0 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31  pLeft, &regFree1
16100 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71  );.      r2 = sq
16110 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
16120 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
16130 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46 72 65  >pRight, &regFre
16140 65 32 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43  e2);.      codeC
16150 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70  ompare(pParse, p
16160 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78  Expr->pLeft, pEx
16170 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a  pr->pRight, op,.
16180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16190 20 20 72 31 2c 20 72 32 2c 20 69 6e 52 65 67 2c    r1, r2, inReg,
161a0 20 53 51 4c 49 54 45 5f 53 54 4f 52 45 50 32 29   SQLITE_STOREP2)
161b0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54  ;.      assert(T
161c0 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 29 3b 20 74 65  K_LT==OP_Lt); te
161d0 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 74  stcase(op==OP_Lt
161e0 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49  ); VdbeCoverageI
161f0 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a  f(v,op==OP_Lt);.
16200 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f        assert(TK_
16210 4c 45 3d 3d 4f 50 5f 4c 65 29 3b 20 74 65 73 74  LE==OP_Le); test
16220 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 65 29 3b  case(op==OP_Le);
16230 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
16240 76 2c 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 0a 20 20  v,op==OP_Le);.  
16250 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 47 54      assert(TK_GT
16260 3d 3d 4f 50 5f 47 74 29 3b 20 74 65 73 74 63 61  ==OP_Gt); testca
16270 73 65 28 6f 70 3d 3d 4f 50 5f 47 74 29 3b 20 56  se(op==OP_Gt); V
16280 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
16290 6f 70 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20 20 20  op==OP_Gt);.    
162a0 20 20 61 73 73 65 72 74 28 54 4b 5f 47 45 3d 3d    assert(TK_GE==
162b0 4f 50 5f 47 65 29 3b 20 74 65 73 74 63 61 73 65  OP_Ge); testcase
162c0 28 6f 70 3d 3d 4f 50 5f 47 65 29 3b 20 56 64 62  (op==OP_Ge); Vdb
162d0 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70  eCoverageIf(v,op
162e0 3d 3d 4f 50 5f 47 65 29 3b 0a 20 20 20 20 20 20  ==OP_Ge);.      
162f0 61 73 73 65 72 74 28 54 4b 5f 45 51 3d 3d 4f 50  assert(TK_EQ==OP
16300 5f 45 71 29 3b 20 74 65 73 74 63 61 73 65 28 6f  _Eq); testcase(o
16310 70 3d 3d 4f 50 5f 45 71 29 3b 20 56 64 62 65 43  p==OP_Eq); VdbeC
16320 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d  overageIf(v,op==
16330 4f 50 5f 45 71 29 3b 0a 20 20 20 20 20 20 61 73  OP_Eq);.      as
16340 73 65 72 74 28 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e  sert(TK_NE==OP_N
16350 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d  e); testcase(op=
16360 3d 4f 50 5f 4e 65 29 3b 20 56 64 62 65 43 6f 76  =OP_Ne); VdbeCov
16370 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50  erageIf(v,op==OP
16380 5f 4e 65 29 3b 0a 20 20 20 20 20 20 74 65 73 74  _Ne);.      test
16390 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d  case( regFree1==
163a0 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  0 );.      testc
163b0 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30  ase( regFree2==0
163c0 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
163d0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
163e0 54 4b 5f 49 53 3a 0a 20 20 20 20 63 61 73 65 20  TK_IS:.    case 
163f0 54 4b 5f 49 53 4e 4f 54 3a 20 7b 0a 20 20 20 20  TK_ISNOT: {.    
16400 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
16410 54 4b 5f 49 53 20 29 3b 0a 20 20 20 20 20 20 74  TK_IS );.      t
16420 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
16430 49 53 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20 72  ISNOT );.      r
16440 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  1 = sqlite3ExprC
16450 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
16460 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72  pExpr->pLeft, &r
16470 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20  egFree1);.      
16480 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r2 = sqlite3Expr
16490 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
164a0 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
164b0 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20  &regFree2);.    
164c0 20 20 6f 70 20 3d 20 28 6f 70 3d 3d 54 4b 5f 49    op = (op==TK_I
164d0 53 29 20 3f 20 54 4b 5f 45 51 20 3a 20 54 4b 5f  S) ? TK_EQ : TK_
164e0 4e 45 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f  NE;.      codeCo
164f0 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 45  mpare(pParse, pE
16500 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70  xpr->pLeft, pExp
16510 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20  r->pRight, op,. 
16520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16530 20 72 31 2c 20 72 32 2c 20 69 6e 52 65 67 2c 20   r1, r2, inReg, 
16540 53 51 4c 49 54 45 5f 53 54 4f 52 45 50 32 20 7c  SQLITE_STOREP2 |
16550 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b   SQLITE_NULLEQ);
16560 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
16570 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f  ageIf(v, op==TK_
16580 45 51 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  EQ);.      VdbeC
16590 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d  overageIf(v, op=
165a0 3d 54 4b 5f 4e 45 29 3b 0a 20 20 20 20 20 20 74  =TK_NE);.      t
165b0 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
165c0 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65  1==0 );.      te
165d0 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 32  stcase( regFree2
165e0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  ==0 );.      bre
165f0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
16600 73 65 20 54 4b 5f 41 4e 44 3a 0a 20 20 20 20 63  se TK_AND:.    c
16610 61 73 65 20 54 4b 5f 4f 52 3a 0a 20 20 20 20 63  ase TK_OR:.    c
16620 61 73 65 20 54 4b 5f 50 4c 55 53 3a 0a 20 20 20  ase TK_PLUS:.   
16630 20 63 61 73 65 20 54 4b 5f 53 54 41 52 3a 0a 20   case TK_STAR:. 
16640 20 20 20 63 61 73 65 20 54 4b 5f 4d 49 4e 55 53     case TK_MINUS
16650 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45  :.    case TK_RE
16660 4d 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42  M:.    case TK_B
16670 49 54 41 4e 44 3a 0a 20 20 20 20 63 61 73 65 20  ITAND:.    case 
16680 54 4b 5f 42 49 54 4f 52 3a 0a 20 20 20 20 63 61  TK_BITOR:.    ca
16690 73 65 20 54 4b 5f 53 4c 41 53 48 3a 0a 20 20 20  se TK_SLASH:.   
166a0 20 63 61 73 65 20 54 4b 5f 4c 53 48 49 46 54 3a   case TK_LSHIFT:
166b0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 53 48  .    case TK_RSH
166c0 49 46 54 3a 20 0a 20 20 20 20 63 61 73 65 20 54  IFT: .    case T
166d0 4b 5f 43 4f 4e 43 41 54 3a 20 7b 0a 20 20 20 20  K_CONCAT: {.    
166e0 20 20 61 73 73 65 72 74 28 20 54 4b 5f 41 4e 44    assert( TK_AND
166f0 3d 3d 4f 50 5f 41 6e 64 20 29 3b 20 20 20 20 20  ==OP_And );     
16700 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
16710 20 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 3b 0a 20   op==TK_AND );. 
16720 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
16730 4f 52 3d 3d 4f 50 5f 4f 72 20 29 3b 20 20 20 20  OR==OP_Or );    
16740 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
16750 73 65 28 20 6f 70 3d 3d 54 4b 5f 4f 52 20 29 3b  se( op==TK_OR );
16760 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
16770 4b 5f 50 4c 55 53 3d 3d 4f 50 5f 41 64 64 20 29  K_PLUS==OP_Add )
16780 3b 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74  ;           test
16790 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 50 4c 55  case( op==TK_PLU
167a0 53 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  S );.      asser
167b0 74 28 20 54 4b 5f 4d 49 4e 55 53 3d 3d 4f 50 5f  t( TK_MINUS==OP_
167c0 53 75 62 74 72 61 63 74 20 29 3b 20 20 20 20 20  Subtract );     
167d0 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
167e0 5f 4d 49 4e 55 53 20 29 3b 0a 20 20 20 20 20 20  _MINUS );.      
167f0 61 73 73 65 72 74 28 20 54 4b 5f 52 45 4d 3d 3d  assert( TK_REM==
16800 4f 50 5f 52 65 6d 61 69 6e 64 65 72 20 29 3b 20  OP_Remainder ); 
16810 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
16820 70 3d 3d 54 4b 5f 52 45 4d 20 29 3b 0a 20 20 20  p==TK_REM );.   
16830 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 42 49     assert( TK_BI
16840 54 41 4e 44 3d 3d 4f 50 5f 42 69 74 41 6e 64 20  TAND==OP_BitAnd 
16850 29 3b 20 20 20 20 20 20 74 65 73 74 63 61 73 65  );      testcase
16860 28 20 6f 70 3d 3d 54 4b 5f 42 49 54 41 4e 44 20  ( op==TK_BITAND 
16870 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
16880 20 54 4b 5f 42 49 54 4f 52 3d 3d 4f 50 5f 42 69   TK_BITOR==OP_Bi
16890 74 4f 72 20 29 3b 20 20 20 20 20 20 20 20 74 65  tOr );        te
168a0 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 42  stcase( op==TK_B
168b0 49 54 4f 52 20 29 3b 0a 20 20 20 20 20 20 61 73  ITOR );.      as
168c0 73 65 72 74 28 20 54 4b 5f 53 4c 41 53 48 3d 3d  sert( TK_SLASH==
168d0 4f 50 5f 44 69 76 69 64 65 20 29 3b 20 20 20 20  OP_Divide );    
168e0 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
168f0 3d 54 4b 5f 53 4c 41 53 48 20 29 3b 0a 20 20 20  =TK_SLASH );.   
16900 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 53     assert( TK_LS
16910 48 49 46 54 3d 3d 4f 50 5f 53 68 69 66 74 4c 65  HIFT==OP_ShiftLe
16920 66 74 20 29 3b 20 20 20 74 65 73 74 63 61 73 65  ft );   testcase
16930 28 20 6f 70 3d 3d 54 4b 5f 4c 53 48 49 46 54 20  ( op==TK_LSHIFT 
16940 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
16950 20 54 4b 5f 52 53 48 49 46 54 3d 3d 4f 50 5f 53   TK_RSHIFT==OP_S
16960 68 69 66 74 52 69 67 68 74 20 29 3b 20 20 74 65  hiftRight );  te
16970 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 52  stcase( op==TK_R
16980 53 48 49 46 54 20 29 3b 0a 20 20 20 20 20 20 61  SHIFT );.      a
16990 73 73 65 72 74 28 20 54 4b 5f 43 4f 4e 43 41 54  ssert( TK_CONCAT
169a0 3d 3d 4f 50 5f 43 6f 6e 63 61 74 20 29 3b 20 20  ==OP_Concat );  
169b0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
169c0 3d 3d 54 4b 5f 43 4f 4e 43 41 54 20 29 3b 0a 20  ==TK_CONCAT );. 
169d0 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
169e0 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
169f0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
16a00 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  ft, &regFree1);.
16a10 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74        r2 = sqlit
16a20 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
16a30 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
16a40 69 67 68 74 2c 20 26 72 65 67 46 72 65 65 32 29  ight, &regFree2)
16a50 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
16a60 64 62 65 41 64 64 4f 70 33 28 76 2c 20 6f 70 2c  dbeAddOp3(v, op,
16a70 20 72 32 2c 20 72 31 2c 20 74 61 72 67 65 74 29   r2, r1, target)
16a80 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
16a90 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  ( regFree1==0 );
16aa0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
16ab0 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a   regFree2==0 );.
16ac0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
16ad0 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55   }.    case TK_U
16ae0 4d 49 4e 55 53 3a 20 7b 0a 20 20 20 20 20 20 45  MINUS: {.      E
16af0 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78  xpr *pLeft = pEx
16b00 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20  pr->pLeft;.     
16b10 20 61 73 73 65 72 74 28 20 70 4c 65 66 74 20 29   assert( pLeft )
16b20 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65 66  ;.      if( pLef
16b30 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47 45  t->op==TK_INTEGE
16b40 52 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64  R ){.        cod
16b50 65 49 6e 74 65 67 65 72 28 70 50 61 72 73 65 2c  eInteger(pParse,
16b60 20 70 4c 65 66 74 2c 20 31 2c 20 74 61 72 67 65   pLeft, 1, targe
16b70 74 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  t);.#ifndef SQLI
16b80 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47  TE_OMIT_FLOATING
16b90 5f 50 4f 49 4e 54 0a 20 20 20 20 20 20 7d 65 6c  _POINT.      }el
16ba0 73 65 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70  se if( pLeft->op
16bb0 3d 3d 54 4b 5f 46 4c 4f 41 54 20 29 7b 0a 20 20  ==TK_FLOAT ){.  
16bc0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
16bd0 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
16be0 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75  Expr, EP_IntValu
16bf0 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 63 6f  e) );.        co
16c00 64 65 52 65 61 6c 28 76 2c 20 70 4c 65 66 74 2d  deReal(v, pLeft-
16c10 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 31 2c 20 74 61  >u.zToken, 1, ta
16c20 72 67 65 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20  rget);.#endif.  
16c30 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
16c40 20 20 20 74 65 6d 70 58 2e 6f 70 20 3d 20 54 4b     tempX.op = TK
16c50 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 20 20  _INTEGER;.      
16c60 20 20 74 65 6d 70 58 2e 66 6c 61 67 73 20 3d 20    tempX.flags = 
16c70 45 50 5f 49 6e 74 56 61 6c 75 65 7c 45 50 5f 54  EP_IntValue|EP_T
16c80 6f 6b 65 6e 4f 6e 6c 79 3b 0a 20 20 20 20 20 20  okenOnly;.      
16c90 20 20 74 65 6d 70 58 2e 75 2e 69 56 61 6c 75 65    tempX.u.iValue
16ca0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 31   = 0;.        r1
16cb0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
16cc0 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 26  deTemp(pParse, &
16cd0 74 65 6d 70 58 2c 20 26 72 65 67 46 72 65 65 31  tempX, &regFree1
16ce0 29 3b 0a 20 20 20 20 20 20 20 20 72 32 20 3d 20  );.        r2 = 
16cf0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
16d00 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
16d10 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72  r->pLeft, &regFr
16d20 65 65 32 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ee2);.        sq
16d30 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
16d40 76 2c 20 4f 50 5f 53 75 62 74 72 61 63 74 2c 20  v, OP_Subtract, 
16d50 72 32 2c 20 72 31 2c 20 74 61 72 67 65 74 29 3b  r2, r1, target);
16d60 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
16d70 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29  e( regFree2==0 )
16d80 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
16d90 69 6e 52 65 67 20 3d 20 74 61 72 67 65 74 3b 0a  inReg = target;.
16da0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
16db0 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42   }.    case TK_B
16dc0 49 54 4e 4f 54 3a 0a 20 20 20 20 63 61 73 65 20  ITNOT:.    case 
16dd0 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20  TK_NOT: {.      
16de0 61 73 73 65 72 74 28 20 54 4b 5f 42 49 54 4e 4f  assert( TK_BITNO
16df0 54 3d 3d 4f 50 5f 42 69 74 4e 6f 74 20 29 3b 20  T==OP_BitNot ); 
16e00 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
16e10 54 4b 5f 42 49 54 4e 4f 54 20 29 3b 0a 20 20 20  TK_BITNOT );.   
16e20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f     assert( TK_NO
16e30 54 3d 3d 4f 50 5f 4e 6f 74 20 29 3b 20 20 20 20  T==OP_Not );    
16e40 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
16e50 70 3d 3d 54 4b 5f 4e 4f 54 20 29 3b 0a 20 20 20  p==TK_NOT );.   
16e60 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
16e70 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
16e80 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
16e90 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20  , &regFree1);.  
16ea0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
16eb0 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20  gFree1==0 );.   
16ec0 20 20 20 69 6e 52 65 67 20 3d 20 74 61 72 67 65     inReg = targe
16ed0 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  t;.      sqlite3
16ee0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 6f 70  VdbeAddOp2(v, op
16ef0 2c 20 72 31 2c 20 69 6e 52 65 67 29 3b 0a 20 20  , r1, inReg);.  
16f00 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
16f10 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e  .    case TK_ISN
16f20 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  ULL:.    case TK
16f30 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20  _NOTNULL: {.    
16f40 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20    int addr;.    
16f50 20 20 61 73 73 65 72 74 28 20 54 4b 5f 49 53 4e    assert( TK_ISN
16f60 55 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29  ULL==OP_IsNull )
16f70 3b 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70  ;   testcase( op
16f80 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20  ==TK_ISNULL );. 
16f90 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
16fa0 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e  NOTNULL==OP_NotN
16fb0 75 6c 6c 20 29 3b 20 74 65 73 74 63 61 73 65 28  ull ); testcase(
16fc0 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20   op==TK_NOTNULL 
16fd0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
16fe0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
16ff0 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 74 61 72  _Integer, 1, tar
17000 67 65 74 29 3b 0a 20 20 20 20 20 20 72 31 20 3d  get);.      r1 =
17010 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
17020 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
17030 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46  pr->pLeft, &regF
17040 72 65 65 31 29 3b 0a 20 20 20 20 20 20 74 65 73  ree1);.      tes
17050 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
17060 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 64 64 72  =0 );.      addr
17070 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
17080 64 4f 70 31 28 76 2c 20 6f 70 2c 20 72 31 29 3b  dOp1(v, op, r1);
17090 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
170a0 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f  ageIf(v, op==TK_
170b0 49 53 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 56  ISNULL);.      V
170c0 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
170d0 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 29   op==TK_NOTNULL)
170e0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
170f0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
17100 49 6e 74 65 67 65 72 2c 20 30 2c 20 74 61 72 67  Integer, 0, targ
17110 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  et);.      sqlit
17120 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
17130 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 20 20 62  , addr);.      b
17140 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
17150 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43  case TK_AGG_FUNC
17160 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 41 67  TION: {.      Ag
17170 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 3d 20 70  gInfo *pInfo = p
17180 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a  Expr->pAggInfo;.
17190 20 20 20 20 20 20 69 66 28 20 70 49 6e 66 6f 3d        if( pInfo=
171a0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  =0 ){.        as
171b0 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
171c0 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
171d0 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20  _IntValue) );.  
171e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
171f0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6d  orMsg(pParse, "m
17200 69 73 75 73 65 20 6f 66 20 61 67 67 72 65 67 61  isuse of aggrega
17210 74 65 3a 20 25 73 28 29 22 2c 20 70 45 78 70 72  te: %s()", pExpr
17220 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20  ->u.zToken);.   
17230 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
17240 20 20 69 6e 52 65 67 20 3d 20 70 49 6e 66 6f 2d    inReg = pInfo-
17250 3e 61 46 75 6e 63 5b 70 45 78 70 72 2d 3e 69 41  >aFunc[pExpr->iA
17260 67 67 5d 2e 69 4d 65 6d 3b 0a 20 20 20 20 20 20  gg].iMem;.      
17270 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
17280 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
17290 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20  _FUNCTION: {.   
172a0 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 46 61     ExprList *pFa
172b0 72 67 3b 20 20 20 20 20 20 20 2f 2a 20 4c 69 73  rg;       /* Lis
172c0 74 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20 61 72  t of function ar
172d0 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20  guments */.     
172e0 20 69 6e 74 20 6e 46 61 72 67 3b 20 20 20 20 20   int nFarg;     
172f0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
17300 72 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20 61 72  r of function ar
17310 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20  guments */.     
17320 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66 3b 20   FuncDef *pDef; 
17330 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66          /* The f
17340 75 6e 63 74 69 6f 6e 20 64 65 66 69 6e 69 74 69  unction definiti
17350 6f 6e 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20  on object */.   
17360 20 20 20 69 6e 74 20 6e 49 64 3b 20 20 20 20 20     int nId;     
17370 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e            /* Len
17380 67 74 68 20 6f 66 20 74 68 65 20 66 75 6e 63 74  gth of the funct
17390 69 6f 6e 20 6e 61 6d 65 20 69 6e 20 62 79 74 65  ion name in byte
173a0 73 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74  s */.      const
173b0 20 63 68 61 72 20 2a 7a 49 64 3b 20 20 20 20 20   char *zId;     
173c0 20 20 2f 2a 20 54 68 65 20 66 75 6e 63 74 69 6f    /* The functio
173d0 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20  n name */.      
173e0 75 33 32 20 63 6f 6e 73 74 4d 61 73 6b 20 3d 20  u32 constMask = 
173f0 30 3b 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f  0;     /* Mask o
17400 66 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d  f function argum
17410 65 6e 74 73 20 74 68 61 74 20 61 72 65 20 63 6f  ents that are co
17420 6e 73 74 61 6e 74 20 2a 2f 0a 20 20 20 20 20 20  nstant */.      
17430 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
17440 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
17450 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20  ounter */.      
17460 75 38 20 65 6e 63 20 3d 20 45 4e 43 28 64 62 29  u8 enc = ENC(db)
17470 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 65  ;      /* The te
17480 78 74 20 65 6e 63 6f 64 69 6e 67 20 75 73 65 64  xt encoding used
17490 20 62 79 20 74 68 69 73 20 64 61 74 61 62 61 73   by this databas
174a0 65 20 2a 2f 0a 20 20 20 20 20 20 43 6f 6c 6c 53  e */.      CollS
174b0 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 20 20  eq *pColl = 0;  
174c0 20 20 2f 2a 20 41 20 63 6f 6c 6c 61 74 69 6e 67    /* A collating
174d0 20 73 65 71 75 65 6e 63 65 20 2a 2f 0a 0a 20 20   sequence */..  
174e0 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
174f0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
17500 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
17510 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 45  ) );.      if( E
17520 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
17530 45 78 70 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e  Expr, EP_TokenOn
17540 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ly) ){.        p
17550 46 61 72 67 20 3d 20 30 3b 0a 20 20 20 20 20 20  Farg = 0;.      
17560 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
17570 46 61 72 67 20 3d 20 70 45 78 70 72 2d 3e 78 2e  Farg = pExpr->x.
17580 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20  pList;.      }. 
17590 20 20 20 20 20 6e 46 61 72 67 20 3d 20 70 46 61       nFarg = pFa
175a0 72 67 20 3f 20 70 46 61 72 67 2d 3e 6e 45 78 70  rg ? pFarg->nExp
175b0 72 20 3a 20 30 3b 0a 20 20 20 20 20 20 61 73 73  r : 0;.      ass
175c0 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
175d0 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
175e0 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20  IntValue) );.   
175f0 20 20 20 7a 49 64 20 3d 20 70 45 78 70 72 2d 3e     zId = pExpr->
17600 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20  u.zToken;.      
17610 6e 49 64 20 3d 20 73 71 6c 69 74 65 33 53 74 72  nId = sqlite3Str
17620 6c 65 6e 33 30 28 7a 49 64 29 3b 0a 20 20 20 20  len30(zId);.    
17630 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33    pDef = sqlite3
17640 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c  FindFunction(db,
17650 20 7a 49 64 2c 20 6e 49 64 2c 20 6e 46 61 72 67   zId, nId, nFarg
17660 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20  , enc, 0);.     
17670 20 69 66 28 20 70 44 65 66 3d 3d 30 20 7c 7c 20   if( pDef==0 || 
17680 70 44 65 66 2d 3e 78 46 75 6e 63 3d 3d 30 20 29  pDef->xFunc==0 )
17690 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
176a0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
176b0 2c 20 22 75 6e 6b 6e 6f 77 6e 20 66 75 6e 63 74  , "unknown funct
176c0 69 6f 6e 3a 20 25 2e 2a 73 28 29 22 2c 20 6e 49  ion: %.*s()", nI
176d0 64 2c 20 7a 49 64 29 3b 0a 20 20 20 20 20 20 20  d, zId);.       
176e0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
176f0 0a 20 20 20 20 20 20 2f 2a 20 41 74 74 65 6d 70  .      /* Attemp
17700 74 20 61 20 64 69 72 65 63 74 20 69 6d 70 6c 65  t a direct imple
17710 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
17720 20 62 75 69 6c 74 2d 69 6e 20 43 4f 41 4c 45 53   built-in COALES
17730 43 45 28 29 20 61 6e 64 0a 20 20 20 20 20 20 2a  CE() and.      *
17740 2a 20 49 46 4e 55 4c 4c 28 29 20 66 75 6e 63 74  * IFNULL() funct
17750 69 6f 6e 73 2e 20 20 54 68 69 73 20 61 76 6f 69  ions.  This avoi
17760 64 73 20 75 6e 6e 65 63 65 73 73 61 72 79 20 65  ds unnecessary e
17770 76 61 6c 75 61 74 69 6f 6e 20 6f 66 0a 20 20 20  valuation of.   
17780 20 20 20 2a 2a 20 61 72 67 75 6d 65 6e 74 73 20     ** arguments 
17790 70 61 73 74 20 74 68 65 20 66 69 72 73 74 20 6e  past the first n
177a0 6f 6e 2d 4e 55 4c 4c 20 61 72 67 75 6d 65 6e 74  on-NULL argument
177b0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
177c0 20 69 66 28 20 70 44 65 66 2d 3e 66 75 6e 63 46   if( pDef->funcF
177d0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55  lags & SQLITE_FU
177e0 4e 43 5f 43 4f 41 4c 45 53 43 45 20 29 7b 0a 20  NC_COALESCE ){. 
177f0 20 20 20 20 20 20 20 69 6e 74 20 65 6e 64 43 6f         int endCo
17800 61 6c 65 73 63 65 20 3d 20 73 71 6c 69 74 65 33  alesce = sqlite3
17810 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
17820 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
17830 28 20 6e 46 61 72 67 3e 3d 32 20 29 3b 0a 20 20  ( nFarg>=2 );.  
17840 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
17850 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 46  rCode(pParse, pF
17860 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c  arg->a[0].pExpr,
17870 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
17880 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 46 61    for(i=1; i<nFa
17890 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rg; i++){.      
178a0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
178b0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 6f 74 4e  ddOp2(v, OP_NotN
178c0 75 6c 6c 2c 20 74 61 72 67 65 74 2c 20 65 6e 64  ull, target, end
178d0 43 6f 61 6c 65 73 63 65 29 3b 0a 20 20 20 20 20  Coalesce);.     
178e0 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
178f0 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(v);.          
17900 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
17910 52 65 6d 6f 76 65 28 70 50 61 72 73 65 2c 20 74  Remove(pParse, t
17920 61 72 67 65 74 2c 20 31 29 3b 0a 20 20 20 20 20  arget, 1);.     
17930 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
17940 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65  CachePush(pParse
17950 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
17960 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
17970 72 73 65 2c 20 70 46 61 72 67 2d 3e 61 5b 69 5d  rse, pFarg->a[i]
17980 2e 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b  .pExpr, target);
17990 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
179a0 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70  e3ExprCachePop(p
179b0 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
179c0 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
179d0 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
179e0 6c 28 76 2c 20 65 6e 64 43 6f 61 6c 65 73 63 65  l(v, endCoalesce
179f0 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
17a00 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
17a10 20 2f 2a 20 54 68 65 20 55 4e 4c 49 4b 45 4c 59   /* The UNLIKELY
17a20 28 29 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  () function is a
17a30 20 6e 6f 2d 6f 70 2e 20 20 54 68 65 20 72 65 73   no-op.  The res
17a40 75 6c 74 20 69 73 20 74 68 65 20 76 61 6c 75 65  ult is the value
17a50 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  .      ** of the
17a60 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e   first argument.
17a70 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
17a80 69 66 28 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c  if( pDef->funcFl
17a90 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e  ags & SQLITE_FUN
17aa0 43 5f 55 4e 4c 49 4b 45 4c 59 20 29 7b 0a 20 20  C_UNLIKELY ){.  
17ab0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 46        assert( nF
17ac0 61 72 67 3e 3d 31 20 29 3b 0a 20 20 20 20 20 20  arg>=1 );.      
17ad0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
17ae0 65 28 70 50 61 72 73 65 2c 20 70 46 61 72 67 2d  e(pParse, pFarg-
17af0 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20 74 61 72  >a[0].pExpr, tar
17b00 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 62 72  get);.        br
17b10 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  eak;.      }..  
17b20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
17b30 46 61 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Farg; i++){.    
17b40 20 20 20 20 69 66 28 20 69 3c 33 32 20 26 26 20      if( i<32 && 
17b50 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
17b60 73 74 61 6e 74 28 70 46 61 72 67 2d 3e 61 5b 69  stant(pFarg->a[i
17b70 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20  ].pExpr) ){.    
17b80 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
17b90 69 3d 3d 33 31 20 29 3b 0a 20 20 20 20 20 20 20  i==31 );.       
17ba0 20 20 20 63 6f 6e 73 74 4d 61 73 6b 20 7c 3d 20     constMask |= 
17bb0 4d 41 53 4b 42 49 54 33 32 28 69 29 3b 0a 20 20  MASKBIT32(i);.  
17bc0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
17bd0 69 66 28 20 28 70 44 65 66 2d 3e 66 75 6e 63 46  if( (pDef->funcF
17be0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55  lags & SQLITE_FU
17bf0 4e 43 5f 4e 45 45 44 43 4f 4c 4c 29 21 3d 30 20  NC_NEEDCOLL)!=0 
17c00 26 26 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20  && !pColl ){.   
17c10 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73         pColl = s
17c20 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
17c30 71 28 70 50 61 72 73 65 2c 20 70 46 61 72 67 2d  q(pParse, pFarg-
17c40 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[i].pExpr);.  
17c50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
17c60 20 20 20 20 20 20 69 66 28 20 70 46 61 72 67 20        if( pFarg 
17c70 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63  ){.        if( c
17c80 6f 6e 73 74 4d 61 73 6b 20 29 7b 0a 20 20 20 20  onstMask ){.    
17c90 20 20 20 20 20 20 72 31 20 3d 20 70 50 61 72 73        r1 = pPars
17ca0 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 20  e->nMem+1;.     
17cb0 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65       pParse->nMe
17cc0 6d 20 2b 3d 20 6e 46 61 72 67 3b 0a 20 20 20 20  m += nFarg;.    
17cd0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
17ce0 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
17cf0 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50  3GetTempRange(pP
17d00 61 72 73 65 2c 20 6e 46 61 72 67 29 3b 0a 20 20  arse, nFarg);.  
17d10 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
17d20 20 2f 2a 20 46 6f 72 20 6c 65 6e 67 74 68 28 29   /* For length()
17d30 20 61 6e 64 20 74 79 70 65 6f 66 28 29 20 66 75   and typeof() fu
17d40 6e 63 74 69 6f 6e 73 20 77 69 74 68 20 61 20 63  nctions with a c
17d50 6f 6c 75 6d 6e 20 61 72 67 75 6d 65 6e 74 2c 0a  olumn argument,.
17d60 20 20 20 20 20 20 20 20 2a 2a 20 73 65 74 20 74          ** set t
17d70 68 65 20 50 35 20 70 61 72 61 6d 65 74 65 72 20  he P5 parameter 
17d80 74 6f 20 74 68 65 20 4f 50 5f 43 6f 6c 75 6d 6e  to the OP_Column
17d90 20 6f 70 63 6f 64 65 20 74 6f 20 4f 50 46 4c 41   opcode to OPFLA
17da0 47 5f 4c 45 4e 47 54 48 41 52 47 0a 20 20 20 20  G_LENGTHARG.    
17db0 20 20 20 20 2a 2a 20 6f 72 20 4f 50 46 4c 41 47      ** or OPFLAG
17dc0 5f 54 59 50 45 4f 46 41 52 47 20 72 65 73 70 65  _TYPEOFARG respe
17dd0 63 74 69 76 65 6c 79 2c 20 74 6f 20 61 76 6f 69  ctively, to avoi
17de0 64 20 75 6e 6e 65 63 65 73 73 61 72 79 20 64 61  d unnecessary da
17df0 74 61 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c 6f  ta.        ** lo
17e00 61 64 69 6e 67 2e 0a 20 20 20 20 20 20 20 20 2a  ading..        *
17e10 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70  /.        if( (p
17e20 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26  Def->funcFlags &
17e30 20 28 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4c 45   (SQLITE_FUNC_LE
17e40 4e 47 54 48 7c 53 51 4c 49 54 45 5f 46 55 4e 43  NGTH|SQLITE_FUNC
17e50 5f 54 59 50 45 4f 46 29 29 21 3d 30 20 29 7b 0a  _TYPEOF))!=0 ){.
17e60 20 20 20 20 20 20 20 20 20 20 75 38 20 65 78 70            u8 exp
17e70 72 4f 70 3b 0a 20 20 20 20 20 20 20 20 20 20 61  rOp;.          a
17e80 73 73 65 72 74 28 20 6e 46 61 72 67 3d 3d 31 20  ssert( nFarg==1 
17e90 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  );.          ass
17ea0 65 72 74 28 20 70 46 61 72 67 2d 3e 61 5b 30 5d  ert( pFarg->a[0]
17eb0 2e 70 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 20  .pExpr!=0 );.   
17ec0 20 20 20 20 20 20 20 65 78 70 72 4f 70 20 3d 20         exprOp = 
17ed0 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70  pFarg->a[0].pExp
17ee0 72 2d 3e 6f 70 3b 0a 20 20 20 20 20 20 20 20 20  r->op;.         
17ef0 20 69 66 28 20 65 78 70 72 4f 70 3d 3d 54 4b 5f   if( exprOp==TK_
17f00 43 4f 4c 55 4d 4e 20 7c 7c 20 65 78 70 72 4f 70  COLUMN || exprOp
17f10 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20  ==TK_AGG_COLUMN 
17f20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  ){.            a
17f30 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 46 55  ssert( SQLITE_FU
17f40 4e 43 5f 4c 45 4e 47 54 48 3d 3d 4f 50 46 4c 41  NC_LENGTH==OPFLA
17f50 47 5f 4c 45 4e 47 54 48 41 52 47 20 29 3b 0a 20  G_LENGTHARG );. 
17f60 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
17f70 74 28 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 54  t( SQLITE_FUNC_T
17f80 59 50 45 4f 46 3d 3d 4f 50 46 4c 41 47 5f 54 59  YPEOF==OPFLAG_TY
17f90 50 45 4f 46 41 52 47 20 29 3b 0a 20 20 20 20 20  PEOFARG );.     
17fa0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
17fb0 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73   pDef->funcFlags
17fc0 20 26 20 4f 50 46 4c 41 47 5f 4c 45 4e 47 54 48   & OPFLAG_LENGTH
17fd0 41 52 47 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ARG );.         
17fe0 20 20 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70     pFarg->a[0].p
17ff0 45 78 70 72 2d 3e 6f 70 32 20 3d 20 0a 20 20 20  Expr->op2 = .   
18000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
18010 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26  Def->funcFlags &
18020 20 28 4f 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41   (OPFLAG_LENGTHA
18030 52 47 7c 4f 50 46 4c 41 47 5f 54 59 50 45 4f 46  RG|OPFLAG_TYPEOF
18040 41 52 47 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ARG);.          
18050 7d 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  }.        }..   
18060 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
18070 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65  CachePush(pParse
18080 29 3b 20 20 20 20 20 2f 2a 20 54 69 63 6b 65 74  );     /* Ticket
18090 20 32 65 61 32 34 32 35 64 33 34 62 65 20 2a 2f   2ea2425d34be */
180a0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
180b0 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74  ExprCodeExprList
180c0 28 70 50 61 72 73 65 2c 20 70 46 61 72 67 2c 20  (pParse, pFarg, 
180d0 72 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  r1,.            
180e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
180f0 20 20 20 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f      SQLITE_ECEL_
18100 44 55 50 7c 53 51 4c 49 54 45 5f 45 43 45 4c 5f  DUP|SQLITE_ECEL_
18110 46 41 43 54 4f 52 29 3b 0a 20 20 20 20 20 20 20  FACTOR);.       
18120 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
18130 65 50 6f 70 28 70 50 61 72 73 65 29 3b 20 20 20  ePop(pParse);   
18140 20 20 20 2f 2a 20 54 69 63 6b 65 74 20 32 65 61     /* Ticket 2ea
18150 32 34 32 35 64 33 34 62 65 20 2a 2f 0a 20 20 20  2425d34be */.   
18160 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
18170 20 20 72 31 20 3d 20 30 3b 0a 20 20 20 20 20 20    r1 = 0;.      
18180 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
18190 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
181a0 4c 45 0a 20 20 20 20 20 20 2f 2a 20 50 6f 73 73  LE.      /* Poss
181b0 69 62 6c 79 20 6f 76 65 72 6c 6f 61 64 20 74 68  ibly overload th
181c0 65 20 66 75 6e 63 74 69 6f 6e 20 69 66 20 74 68  e function if th
181d0 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
181e0 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 20 76   is.      ** a v
181f0 69 72 74 75 61 6c 20 74 61 62 6c 65 20 63 6f 6c  irtual table col
18200 75 6d 6e 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  umn..      **.  
18210 20 20 20 20 2a 2a 20 46 6f 72 20 69 6e 66 69 78      ** For infix
18220 20 66 75 6e 63 74 69 6f 6e 73 20 28 4c 49 4b 45   functions (LIKE
18230 2c 20 47 4c 4f 42 2c 20 52 45 47 45 58 50 2c 20  , GLOB, REGEXP, 
18240 61 6e 64 20 4d 41 54 43 48 29 20 75 73 65 20 74  and MATCH) use t
18250 68 65 0a 20 20 20 20 20 20 2a 2a 20 73 65 63 6f  he.      ** seco
18260 6e 64 20 61 72 67 75 6d 65 6e 74 2c 20 6e 6f 74  nd argument, not
18270 20 74 68 65 20 66 69 72 73 74 2c 20 61 73 20 74   the first, as t
18280 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  he argument to t
18290 65 73 74 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  est to.      ** 
182a0 73 65 65 20 69 66 20 69 74 20 69 73 20 61 20 63  see if it is a c
182b0 6f 6c 75 6d 6e 20 69 6e 20 61 20 76 69 72 74 75  olumn in a virtu
182c0 61 6c 20 74 61 62 6c 65 2e 20 20 54 68 69 73 20  al table.  This 
182d0 69 73 20 64 6f 6e 65 20 62 65 63 61 75 73 65 0a  is done because.
182e0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6c 65 66        ** the lef
182f0 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 69 6e 66  t operand of inf
18300 69 78 20 66 75 6e 63 74 69 6f 6e 73 20 28 74 68  ix functions (th
18310 65 20 6f 70 65 72 61 6e 64 20 77 65 20 77 61 6e  e operand we wan
18320 74 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 63 6f  t to.      ** co
18330 6e 74 72 6f 6c 20 6f 76 65 72 6c 6f 61 64 69 6e  ntrol overloadin
18340 67 29 20 65 6e 64 73 20 75 70 20 61 73 20 74 68  g) ends up as th
18350 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
18360 74 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a  t to the.      *
18370 2a 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65  * function.  The
18380 20 65 78 70 72 65 73 73 69 6f 6e 20 22 41 20 67   expression "A g
18390 6c 6f 62 20 42 22 20 69 73 20 65 71 75 69 76 61  lob B" is equiva
183a0 6c 65 6e 74 20 74 6f 20 0a 20 20 20 20 20 20 2a  lent to .      *
183b0 2a 20 22 67 6c 6f 62 28 42 2c 41 29 2e 20 20 57  * "glob(B,A).  W
183c0 65 20 77 61 6e 74 20 74 6f 20 75 73 65 20 74 68  e want to use th
183d0 65 20 41 20 69 6e 20 22 41 20 67 6c 6f 62 20 42  e A in "A glob B
183e0 22 20 74 6f 20 74 65 73 74 0a 20 20 20 20 20 20  " to test.      
183f0 2a 2a 20 66 6f 72 20 66 75 6e 63 74 69 6f 6e 20  ** for function 
18400 6f 76 65 72 6c 6f 61 64 69 6e 67 2e 20 20 42 75  overloading.  Bu
18410 74 20 77 65 20 75 73 65 20 74 68 65 20 42 20 74  t we use the B t
18420 65 72 6d 20 69 6e 20 22 67 6c 6f 62 28 42 2c 41  erm in "glob(B,A
18430 29 22 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  )"..      */.   
18440 20 20 20 69 66 28 20 6e 46 61 72 67 3e 3d 32 20     if( nFarg>=2 
18450 26 26 20 28 70 45 78 70 72 2d 3e 66 6c 61 67 73  && (pExpr->flags
18460 20 26 20 45 50 5f 49 6e 66 69 78 46 75 6e 63 29   & EP_InfixFunc)
18470 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65 66   ){.        pDef
18480 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62 4f 76   = sqlite3VtabOv
18490 65 72 6c 6f 61 64 46 75 6e 63 74 69 6f 6e 28 64  erloadFunction(d
184a0 62 2c 20 70 44 65 66 2c 20 6e 46 61 72 67 2c 20  b, pDef, nFarg, 
184b0 70 46 61 72 67 2d 3e 61 5b 31 5d 2e 70 45 78 70  pFarg->a[1].pExp
184c0 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  r);.      }else 
184d0 69 66 28 20 6e 46 61 72 67 3e 30 20 29 7b 0a 20  if( nFarg>0 ){. 
184e0 20 20 20 20 20 20 20 70 44 65 66 20 3d 20 73 71         pDef = sq
184f0 6c 69 74 65 33 56 74 61 62 4f 76 65 72 6c 6f 61  lite3VtabOverloa
18500 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 70 44  dFunction(db, pD
18510 65 66 2c 20 6e 46 61 72 67 2c 20 70 46 61 72 67  ef, nFarg, pFarg
18520 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[0].pExpr);. 
18530 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
18540 20 20 20 20 69 66 28 20 70 44 65 66 2d 3e 66 75      if( pDef->fu
18550 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ncFlags & SQLITE
18560 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 20 29  _FUNC_NEEDCOLL )
18570 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70  {.        if( !p
18580 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 64  Coll ) pColl = d
18590 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 20 0a 20  b->pDfltColl; . 
185a0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
185b0 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43  beAddOp4(v, OP_C
185c0 6f 6c 6c 53 65 71 2c 20 30 2c 20 30 2c 20 30 2c  ollSeq, 0, 0, 0,
185d0 20 28 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20   (char *)pColl, 
185e0 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20  P4_COLLSEQ);.   
185f0 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
18600 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
18610 4f 50 5f 46 75 6e 63 74 69 6f 6e 2c 20 63 6f 6e  OP_Function, con
18620 73 74 4d 61 73 6b 2c 20 72 31 2c 20 74 61 72 67  stMask, r1, targ
18630 65 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  et,.            
18640 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
18650 72 2a 29 70 44 65 66 2c 20 50 34 5f 46 55 4e 43  r*)pDef, P4_FUNC
18660 44 45 46 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  DEF);.      sqli
18670 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
18680 76 2c 20 28 75 38 29 6e 46 61 72 67 29 3b 0a 20  v, (u8)nFarg);. 
18690 20 20 20 20 20 69 66 28 20 6e 46 61 72 67 20 26       if( nFarg &
186a0 26 20 63 6f 6e 73 74 4d 61 73 6b 3d 3d 30 20 29  & constMask==0 )
186b0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
186c0 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67  3ReleaseTempRang
186d0 65 28 70 50 61 72 73 65 2c 20 72 31 2c 20 6e 46  e(pParse, r1, nF
186e0 61 72 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  arg);.      }.  
186f0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
18700 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
18710 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
18720 20 20 63 61 73 65 20 54 4b 5f 45 58 49 53 54 53    case TK_EXISTS
18730 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45  :.    case TK_SE
18740 4c 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 74 65  LECT: {.      te
18750 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 45  stcase( op==TK_E
18760 58 49 53 54 53 20 29 3b 0a 20 20 20 20 20 20 74  XISTS );.      t
18770 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
18780 53 45 4c 45 43 54 20 29 3b 0a 20 20 20 20 20 20  SELECT );.      
18790 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33 43  inReg = sqlite3C
187a0 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70 50 61  odeSubselect(pPa
187b0 72 73 65 2c 20 70 45 78 70 72 2c 20 30 2c 20 30  rse, pExpr, 0, 0
187c0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
187d0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
187e0 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e  K_IN: {.      in
187f0 74 20 64 65 73 74 49 66 46 61 6c 73 65 20 3d 20  t destIfFalse = 
18800 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
18810 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69  abel(v);.      i
18820 6e 74 20 64 65 73 74 49 66 4e 75 6c 6c 20 3d 20  nt destIfNull = 
18830 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
18840 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 73  abel(v);.      s
18850 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
18860 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20  (v, OP_Null, 0, 
18870 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 73  target);.      s
18880 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e  qlite3ExprCodeIN
18890 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
188a0 64 65 73 74 49 66 46 61 6c 73 65 2c 20 64 65 73  destIfFalse, des
188b0 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  tIfNull);.      
188c0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
188d0 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
188e0 20 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20   1, target);.   
188f0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
18900 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 65  solveLabel(v, de
18910 73 74 49 66 46 61 6c 73 65 29 3b 0a 20 20 20 20  stIfFalse);.    
18920 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
18930 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d  Op2(v, OP_AddImm
18940 2c 20 74 61 72 67 65 74 2c 20 30 29 3b 0a 20 20  , target, 0);.  
18950 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
18960 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64  esolveLabel(v, d
18970 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  estIfNull);.    
18980 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
18990 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
189a0 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f  OMIT_SUBQUERY */
189b0 0a 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  ...    /*.    **
189c0 20 20 20 20 78 20 42 45 54 57 45 45 4e 20 79 20      x BETWEEN y 
189d0 41 4e 44 20 7a 0a 20 20 20 20 2a 2a 0a 20 20 20  AND z.    **.   
189e0 20 2a 2a 20 54 68 69 73 20 69 73 20 65 71 75 69   ** This is equi
189f0 76 61 6c 65 6e 74 20 74 6f 0a 20 20 20 20 2a 2a  valent to.    **
18a00 0a 20 20 20 20 2a 2a 20 20 20 20 78 3e 3d 79 20  .    **    x>=y 
18a10 41 4e 44 20 78 3c 3d 7a 0a 20 20 20 20 2a 2a 0a  AND x<=z.    **.
18a20 20 20 20 20 2a 2a 20 58 20 69 73 20 73 74 6f 72      ** X is stor
18a30 65 64 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 65  ed in pExpr->pLe
18a40 66 74 2e 0a 20 20 20 20 2a 2a 20 59 20 69 73 20  ft..    ** Y is 
18a50 73 74 6f 72 65 64 20 69 6e 20 70 45 78 70 72 2d  stored in pExpr-
18a60 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  >pList->a[0].pEx
18a70 70 72 2e 0a 20 20 20 20 2a 2a 20 5a 20 69 73 20  pr..    ** Z is 
18a80 73 74 6f 72 65 64 20 69 6e 20 70 45 78 70 72 2d  stored in pExpr-
18a90 3e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78  >pList->a[1].pEx
18aa0 70 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  pr..    */.    c
18ab0 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20  ase TK_BETWEEN: 
18ac0 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c  {.      Expr *pL
18ad0 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65  eft = pExpr->pLe
18ae0 66 74 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74  ft;.      struct
18af0 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
18b00 70 4c 49 74 65 6d 20 3d 20 70 45 78 70 72 2d 3e  pLItem = pExpr->
18b10 78 2e 70 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20  x.pList->a;.    
18b20 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d    Expr *pRight =
18b30 20 70 4c 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a   pLItem->pExpr;.
18b40 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69  .      r1 = sqli
18b50 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
18b60 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 26  pParse, pLeft, &
18b70 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
18b80 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r2 = sqlite3Exp
18b90 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
18ba0 2c 20 70 52 69 67 68 74 2c 20 26 72 65 67 46 72  , pRight, &regFr
18bb0 65 65 32 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ee2);.      test
18bc0 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d  case( regFree1==
18bd0 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  0 );.      testc
18be0 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30  ase( regFree2==0
18bf0 20 29 3b 0a 20 20 20 20 20 20 72 33 20 3d 20 73   );.      r3 = s
18c00 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
18c10 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
18c20 72 34 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r4 = sqlite3GetT
18c30 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
18c40 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72        codeCompar
18c50 65 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c  e(pParse, pLeft,
18c60 20 70 52 69 67 68 74 2c 20 4f 50 5f 47 65 2c 0a   pRight, OP_Ge,.
18c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18c80 20 20 72 31 2c 20 72 32 2c 20 72 33 2c 20 53 51    r1, r2, r3, SQ
18c90 4c 49 54 45 5f 53 54 4f 52 45 50 32 29 3b 20 20  LITE_STOREP2);  
18ca0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
18cb0 0a 20 20 20 20 20 20 70 4c 49 74 65 6d 2b 2b 3b  .      pLItem++;
18cc0 0a 20 20 20 20 20 20 70 52 69 67 68 74 20 3d 20  .      pRight = 
18cd0 70 4c 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20  pLItem->pExpr;. 
18ce0 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
18cf0 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
18d00 65 2c 20 72 65 67 46 72 65 65 32 29 3b 0a 20 20  e, regFree2);.  
18d10 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33      r2 = sqlite3
18d20 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
18d30 72 73 65 2c 20 70 52 69 67 68 74 2c 20 26 72 65  rse, pRight, &re
18d40 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 74  gFree2);.      t
18d50 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
18d60 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 63 6f  2==0 );.      co
18d70 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65  deCompare(pParse
18d80 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c  , pLeft, pRight,
18d90 20 4f 50 5f 4c 65 2c 20 72 31 2c 20 72 32 2c 20   OP_Le, r1, r2, 
18da0 72 34 2c 20 53 51 4c 49 54 45 5f 53 54 4f 52 45  r4, SQLITE_STORE
18db0 50 32 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  P2);.      VdbeC
18dc0 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
18dd0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
18de0 4f 70 33 28 76 2c 20 4f 50 5f 41 6e 64 2c 20 72  Op3(v, OP_And, r
18df0 33 2c 20 72 34 2c 20 74 61 72 67 65 74 29 3b 0a  3, r4, target);.
18e00 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
18e10 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
18e20 73 65 2c 20 72 33 29 3b 0a 20 20 20 20 20 20 73  se, r3);.      s
18e30 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
18e40 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 34 29  pReg(pParse, r4)
18e50 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
18e60 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
18e70 5f 43 4f 4c 4c 41 54 45 3a 20 0a 20 20 20 20 63  _COLLATE: .    c
18e80 61 73 65 20 54 4b 5f 55 50 4c 55 53 3a 20 7b 0a  ase TK_UPLUS: {.
18e90 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71        inReg = sq
18ea0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72  lite3ExprCodeTar
18eb0 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 78 70  get(pParse, pExp
18ec0 72 2d 3e 70 4c 65 66 74 2c 20 74 61 72 67 65 74  r->pLeft, target
18ed0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
18ee0 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20      }..    case 
18ef0 54 4b 5f 54 52 49 47 47 45 52 3a 20 7b 0a 20 20  TK_TRIGGER: {.  
18f00 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 70      /* If the op
18f10 63 6f 64 65 20 69 73 20 54 4b 5f 54 52 49 47 47  code is TK_TRIGG
18f20 45 52 2c 20 74 68 65 6e 20 74 68 65 20 65 78 70  ER, then the exp
18f30 72 65 73 73 69 6f 6e 20 69 73 20 61 20 72 65 66  ression is a ref
18f40 65 72 65 6e 63 65 0a 20 20 20 20 20 20 2a 2a 20  erence.      ** 
18f50 74 6f 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74  to a column in t
18f60 68 65 20 6e 65 77 2e 2a 20 6f 72 20 6f 6c 64 2e  he new.* or old.
18f70 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 73 20  * pseudo-tables 
18f80 61 76 61 69 6c 61 62 6c 65 20 74 6f 0a 20 20 20  available to.   
18f90 20 20 20 2a 2a 20 74 72 69 67 67 65 72 20 70 72     ** trigger pr
18fa0 6f 67 72 61 6d 73 2e 20 49 6e 20 74 68 69 73 20  ograms. In this 
18fb0 63 61 73 65 20 45 78 70 72 2e 69 54 61 62 6c 65  case Expr.iTable
18fc0 20 69 73 20 73 65 74 20 74 6f 20 31 20 66 6f 72   is set to 1 for
18fd0 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6e 65   the.      ** ne
18fe0 77 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65  w.* pseudo-table
18ff0 2c 20 6f 72 20 30 20 66 6f 72 20 74 68 65 20 6f  , or 0 for the o
19000 6c 64 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c  ld.* pseudo-tabl
19010 65 2e 20 45 78 70 72 2e 69 43 6f 6c 75 6d 6e 0a  e. Expr.iColumn.
19020 20 20 20 20 20 20 2a 2a 20 69 73 20 73 65 74 20        ** is set 
19030 74 6f 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6f 66  to the column of
19040 20 74 68 65 20 70 73 65 75 64 6f 2d 74 61 62 6c   the pseudo-tabl
19050 65 20 74 6f 20 72 65 61 64 2c 20 6f 72 20 74 6f  e to read, or to
19060 20 2d 31 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20   -1 to.      ** 
19070 72 65 61 64 20 74 68 65 20 72 6f 77 69 64 20 66  read the rowid f
19080 69 65 6c 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  ield..      **. 
19090 20 20 20 20 20 2a 2a 20 54 68 65 20 65 78 70 72       ** The expr
190a0 65 73 73 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d  ession is implem
190b0 65 6e 74 65 64 20 75 73 69 6e 67 20 61 6e 20 4f  ented using an O
190c0 50 5f 50 61 72 61 6d 20 6f 70 63 6f 64 65 2e 20  P_Param opcode. 
190d0 54 68 65 20 70 31 0a 20 20 20 20 20 20 2a 2a 20  The p1.      ** 
190e0 70 61 72 61 6d 65 74 65 72 20 69 73 20 73 65 74  parameter is set
190f0 20 74 6f 20 30 20 66 6f 72 20 61 6e 20 6f 6c 64   to 0 for an old
19100 2e 72 6f 77 69 64 20 72 65 66 65 72 65 6e 63 65  .rowid reference
19110 2c 20 6f 72 20 74 6f 20 28 69 2b 31 29 0a 20 20  , or to (i+1).  
19120 20 20 20 20 2a 2a 20 74 6f 20 72 65 66 65 72 65      ** to refere
19130 6e 63 65 20 61 6e 6f 74 68 65 72 20 63 6f 6c 75  nce another colu
19140 6d 6e 20 6f 66 20 74 68 65 20 6f 6c 64 2e 2a 20  mn of the old.* 
19150 70 73 65 75 64 6f 2d 74 61 62 6c 65 2c 20 77 68  pseudo-table, wh
19160 65 72 65 20 0a 20 20 20 20 20 20 2a 2a 20 69 20  ere .      ** i 
19170 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  is the index of 
19180 74 68 65 20 63 6f 6c 75 6d 6e 2e 20 46 6f 72 20  the column. For 
19190 61 20 6e 65 77 2e 72 6f 77 69 64 20 72 65 66 65  a new.rowid refe
191a0 72 65 6e 63 65 2c 20 70 31 20 69 73 0a 20 20 20  rence, p1 is.   
191b0 20 20 20 2a 2a 20 73 65 74 20 74 6f 20 28 6e 2b     ** set to (n+
191c0 31 29 2c 20 77 68 65 72 65 20 6e 20 69 73 20 74  1), where n is t
191d0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  he number of col
191e0 75 6d 6e 73 20 69 6e 20 65 61 63 68 20 70 73 65  umns in each pse
191f0 75 64 6f 2d 74 61 62 6c 65 2e 0a 20 20 20 20 20  udo-table..     
19200 20 2a 2a 20 46 6f 72 20 61 20 72 65 66 65 72 65   ** For a refere
19210 6e 63 65 20 74 6f 20 61 6e 79 20 6f 74 68 65 72  nce to any other
19220 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 6e   column in the n
19230 65 77 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c  ew.* pseudo-tabl
19240 65 2c 20 70 31 0a 20 20 20 20 20 20 2a 2a 20 69  e, p1.      ** i
19250 73 20 73 65 74 20 74 6f 20 28 6e 2b 32 2b 69 29  s set to (n+2+i)
19260 2c 20 77 68 65 72 65 20 6e 20 61 6e 64 20 69 20  , where n and i 
19270 61 72 65 20 61 73 20 64 65 66 69 6e 65 64 20 70  are as defined p
19280 72 65 76 69 6f 75 73 6c 79 2e 20 46 6f 72 0a 20  reviously. For. 
19290 20 20 20 20 20 2a 2a 20 65 78 61 6d 70 6c 65 2c       ** example,
192a0 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 6f 6e   if the table on
192b0 20 77 68 69 63 68 20 74 72 69 67 67 65 72 73 20   which triggers 
192c0 61 72 65 20 62 65 69 6e 67 20 66 69 72 65 64 20  are being fired 
192d0 69 73 0a 20 20 20 20 20 20 2a 2a 20 64 65 63 6c  is.      ** decl
192e0 61 72 65 64 20 61 73 3a 0a 20 20 20 20 20 20 2a  ared as:.      *
192f0 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 43 52 45  *.      **   CRE
19300 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20  ATE TABLE t1(a, 
19310 62 29 3b 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  b);.      **.   
19320 20 20 20 2a 2a 20 54 68 65 6e 20 70 31 20 69 73     ** Then p1 is
19330 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20   interpreted as 
19340 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20 20 20 2a  follows:.      *
19350 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 70 31 3d  *.      **   p1=
19360 3d 30 20 20 20 2d 3e 20 20 20 20 6f 6c 64 2e 72  =0   ->    old.r
19370 6f 77 69 64 20 20 20 20 20 70 31 3d 3d 33 20 20  owid     p1==3  
19380 20 2d 3e 20 20 20 20 6e 65 77 2e 72 6f 77 69 64   ->    new.rowid
19390 0a 20 20 20 20 20 20 2a 2a 20 20 20 70 31 3d 3d  .      **   p1==
193a0 31 20 20 20 2d 3e 20 20 20 20 6f 6c 64 2e 61 20  1   ->    old.a 
193b0 20 20 20 20 20 20 20 20 70 31 3d 3d 34 20 20 20          p1==4   
193c0 2d 3e 20 20 20 20 6e 65 77 2e 61 0a 20 20 20 20  ->    new.a.    
193d0 20 20 2a 2a 20 20 20 70 31 3d 3d 32 20 20 20 2d    **   p1==2   -
193e0 3e 20 20 20 20 6f 6c 64 2e 62 20 20 20 20 20 20  >    old.b      
193f0 20 20 20 70 31 3d 3d 35 20 20 20 2d 3e 20 20 20     p1==5   ->   
19400 20 6e 65 77 2e 62 20 20 20 20 20 20 20 0a 20 20   new.b       .  
19410 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 54 61 62      */.      Tab
19420 6c 65 20 2a 70 54 61 62 20 3d 20 70 45 78 70 72  le *pTab = pExpr
19430 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 69 6e  ->pTab;.      in
19440 74 20 70 31 20 3d 20 70 45 78 70 72 2d 3e 69 54  t p1 = pExpr->iT
19450 61 62 6c 65 20 2a 20 28 70 54 61 62 2d 3e 6e 43  able * (pTab->nC
19460 6f 6c 2b 31 29 20 2b 20 31 20 2b 20 70 45 78 70  ol+1) + 1 + pExp
19470 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 0a 20 20 20  r->iColumn;..   
19480 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
19490 2d 3e 69 54 61 62 6c 65 3d 3d 30 20 7c 7c 20 70  ->iTable==0 || p
194a0 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 31 20  Expr->iTable==1 
194b0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
194c0 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e   pExpr->iColumn>
194d0 3d 2d 31 20 26 26 20 70 45 78 70 72 2d 3e 69 43  =-1 && pExpr->iC
194e0 6f 6c 75 6d 6e 3c 70 54 61 62 2d 3e 6e 43 6f 6c  olumn<pTab->nCol
194f0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
19500 28 20 70 54 61 62 2d 3e 69 50 4b 65 79 3c 30 20  ( pTab->iPKey<0 
19510 7c 7c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  || pExpr->iColum
19520 6e 21 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20 29  n!=pTab->iPKey )
19530 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
19540 70 31 3e 3d 30 20 26 26 20 70 31 3c 28 70 54 61  p1>=0 && p1<(pTa
19550 62 2d 3e 6e 43 6f 6c 2a 32 2b 32 29 20 29 3b 0a  b->nCol*2+2) );.
19560 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
19570 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 50  beAddOp2(v, OP_P
19580 61 72 61 6d 2c 20 70 31 2c 20 74 61 72 67 65 74  aram, p1, target
19590 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
195a0 6d 65 6e 74 28 28 76 2c 20 22 25 73 2e 25 73 20  ment((v, "%s.%s 
195b0 2d 3e 20 24 25 64 22 2c 0a 20 20 20 20 20 20 20  -> $%d",.       
195c0 20 28 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20   (pExpr->iTable 
195d0 3f 20 22 6e 65 77 22 20 3a 20 22 6f 6c 64 22 29  ? "new" : "old")
195e0 2c 0a 20 20 20 20 20 20 20 20 28 70 45 78 70 72  ,.        (pExpr
195f0 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 3f 20 22 72  ->iColumn<0 ? "r
19600 6f 77 69 64 22 20 3a 20 70 45 78 70 72 2d 3e 70  owid" : pExpr->p
19610 54 61 62 2d 3e 61 43 6f 6c 5b 70 45 78 70 72 2d  Tab->aCol[pExpr-
19620 3e 69 43 6f 6c 75 6d 6e 5d 2e 7a 4e 61 6d 65 29  >iColumn].zName)
19630 2c 0a 20 20 20 20 20 20 20 20 74 61 72 67 65 74  ,.        target
19640 0a 20 20 20 20 20 20 29 29 3b 0a 0a 23 69 66 6e  .      ));..#ifn
19650 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
19660 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20  FLOATING_POINT. 
19670 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63       /* If the c
19680 6f 6c 75 6d 6e 20 68 61 73 20 52 45 41 4c 20 61  olumn has REAL a
19690 66 66 69 6e 69 74 79 2c 20 69 74 20 6d 61 79 20  ffinity, it may 
196a0 63 75 72 72 65 6e 74 6c 79 20 62 65 20 73 74 6f  currently be sto
196b0 72 65 64 20 61 73 20 61 6e 0a 20 20 20 20 20 20  red as an.      
196c0 2a 2a 20 69 6e 74 65 67 65 72 2e 20 55 73 65 20  ** integer. Use 
196d0 4f 50 5f 52 65 61 6c 41 66 66 69 6e 69 74 79 20  OP_RealAffinity 
196e0 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 69 74 20  to make sure it 
196f0 69 73 20 72 65 61 6c 6c 79 20 72 65 61 6c 2e 20  is really real. 
19700 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 45   */.      if( pE
19710 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20  xpr->iColumn>=0 
19720 0a 20 20 20 20 20 20 20 26 26 20 70 54 61 62 2d  .       && pTab-
19730 3e 61 43 6f 6c 5b 70 45 78 70 72 2d 3e 69 43 6f  >aCol[pExpr->iCo
19740 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69 74 79 3d 3d  lumn].affinity==
19750 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 0a  SQLITE_AFF_REAL.
19760 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
19770 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
19780 70 31 28 76 2c 20 4f 50 5f 52 65 61 6c 41 66 66  p1(v, OP_RealAff
19790 69 6e 69 74 79 2c 20 74 61 72 67 65 74 29 3b 0a  inity, target);.
197a0 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
197b0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
197c0 7d 0a 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a  }...    /*.    *
197d0 2a 20 46 6f 72 6d 20 41 3a 0a 20 20 20 20 2a 2a  * Form A:.    **
197e0 20 20 20 43 41 53 45 20 78 20 57 48 45 4e 20 65     CASE x WHEN e
197f0 31 20 54 48 45 4e 20 72 31 20 57 48 45 4e 20 65  1 THEN r1 WHEN e
19800 32 20 54 48 45 4e 20 72 32 20 2e 2e 2e 20 57 48  2 THEN r2 ... WH
19810 45 4e 20 65 4e 20 54 48 45 4e 20 72 4e 20 45 4c  EN eN THEN rN EL
19820 53 45 20 79 20 45 4e 44 0a 20 20 20 20 2a 2a 0a  SE y END.    **.
19830 20 20 20 20 2a 2a 20 46 6f 72 6d 20 42 3a 0a 20      ** Form B:. 
19840 20 20 20 2a 2a 20 20 20 43 41 53 45 20 57 48 45     **   CASE WHE
19850 4e 20 65 31 20 54 48 45 4e 20 72 31 20 57 48 45  N e1 THEN r1 WHE
19860 4e 20 65 32 20 54 48 45 4e 20 72 32 20 2e 2e 2e  N e2 THEN r2 ...
19870 20 57 48 45 4e 20 65 4e 20 54 48 45 4e 20 72 4e   WHEN eN THEN rN
19880 20 45 4c 53 45 20 79 20 45 4e 44 0a 20 20 20 20   ELSE y END.    
19890 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 6d 20 41  **.    ** Form A
198a0 20 69 73 20 63 61 6e 20 62 65 20 74 72 61 6e 73   is can be trans
198b0 66 6f 72 6d 65 64 20 69 6e 74 6f 20 74 68 65 20  formed into the 
198c0 65 71 75 69 76 61 6c 65 6e 74 20 66 6f 72 6d 20  equivalent form 
198d0 42 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20  B as follows:.  
198e0 20 20 2a 2a 20 20 20 43 41 53 45 20 57 48 45 4e    **   CASE WHEN
198f0 20 78 3d 65 31 20 54 48 45 4e 20 72 31 20 57 48   x=e1 THEN r1 WH
19900 45 4e 20 78 3d 65 32 20 54 48 45 4e 20 72 32 20  EN x=e2 THEN r2 
19910 2e 2e 2e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  ....    **      
19920 20 20 57 48 45 4e 20 78 3d 65 4e 20 54 48 45 4e    WHEN x=eN THEN
19930 20 72 4e 20 45 4c 53 45 20 79 20 45 4e 44 0a 20   rN ELSE y END. 
19940 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 58 20 28     **.    ** X (
19950 69 66 20 69 74 20 65 78 69 73 74 73 29 20 69 73  if it exists) is
19960 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 65 66 74   in pExpr->pLeft
19970 2e 0a 20 20 20 20 2a 2a 20 59 20 69 73 20 69 6e  ..    ** Y is in
19980 20 74 68 65 20 6c 61 73 74 20 65 6c 65 6d 65 6e   the last elemen
19990 74 20 6f 66 20 70 45 78 70 72 2d 3e 78 2e 70 4c  t of pExpr->x.pL
199a0 69 73 74 20 69 66 20 70 45 78 70 72 2d 3e 78 2e  ist if pExpr->x.
199b0 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 69 73 0a  pList->nExpr is.
199c0 20 20 20 20 2a 2a 20 6f 64 64 2e 20 20 54 68 65      ** odd.  The
199d0 20 59 20 69 73 20 61 6c 73 6f 20 6f 70 74 69 6f   Y is also optio
199e0 6e 61 6c 2e 20 20 49 66 20 74 68 65 20 6e 75 6d  nal.  If the num
199f0 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20  ber of elements 
19a00 69 6e 20 78 2e 70 4c 69 73 74 0a 20 20 20 20 2a  in x.pList.    *
19a10 2a 20 69 73 20 65 76 65 6e 2c 20 74 68 65 6e 20  * is even, then 
19a20 59 20 69 73 20 6f 6d 69 74 74 65 64 20 61 6e 64  Y is omitted and
19a30 20 74 68 65 20 22 6f 74 68 65 72 77 69 73 65 22   the "otherwise"
19a40 20 72 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c 2e   result is NULL.
19a50 0a 20 20 20 20 2a 2a 20 45 69 20 69 73 20 69 6e  .    ** Ei is in
19a60 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61   pExpr->pList->a
19a70 5b 69 2a 32 5d 20 61 6e 64 20 52 69 20 69 73 20  [i*2] and Ri is 
19a80 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b  pExpr->pList->a[
19a90 69 2a 32 2b 31 5d 2e 0a 20 20 20 20 2a 2a 0a 20  i*2+1]..    **. 
19aa0 20 20 20 2a 2a 20 54 68 65 20 72 65 73 75 6c 74     ** The result
19ab0 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
19ac0 6f 6e 20 69 73 20 74 68 65 20 52 69 20 66 6f 72  on is the Ri for
19ad0 20 74 68 65 20 66 69 72 73 74 20 6d 61 74 63 68   the first match
19ae0 69 6e 67 20 45 69 2c 0a 20 20 20 20 2a 2a 20 6f  ing Ei,.    ** o
19af0 72 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f  r if there is no
19b00 20 6d 61 74 63 68 69 6e 67 20 45 69 2c 20 74 68   matching Ei, th
19b10 65 20 45 4c 53 45 20 74 65 72 6d 20 59 2c 20 6f  e ELSE term Y, o
19b20 72 20 69 66 20 74 68 65 72 65 20 69 73 0a 20 20  r if there is.  
19b30 20 20 2a 2a 20 6e 6f 20 45 4c 53 45 20 74 65 72    ** no ELSE ter
19b40 6d 2c 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2f 0a  m, NULL..    */.
19b50 20 20 20 20 64 65 66 61 75 6c 74 3a 20 61 73 73      default: ass
19b60 65 72 74 28 20 6f 70 3d 3d 54 4b 5f 43 41 53 45  ert( op==TK_CASE
19b70 20 29 3b 20 7b 0a 20 20 20 20 20 20 69 6e 74 20   ); {.      int 
19b80 65 6e 64 4c 61 62 65 6c 3b 20 20 20 20 20 20 20  endLabel;       
19b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
19ba0 20 47 4f 54 4f 20 6c 61 62 65 6c 20 66 6f 72 20   GOTO label for 
19bb0 65 6e 64 20 6f 66 20 43 41 53 45 20 73 74 6d 74  end of CASE stmt
19bc0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 65   */.      int ne
19bd0 78 74 43 61 73 65 3b 20 20 20 20 20 20 20 20 20  xtCase;         
19be0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47              /* G
19bf0 4f 54 4f 20 6c 61 62 65 6c 20 66 6f 72 20 6e 65  OTO label for ne
19c00 78 74 20 57 48 45 4e 20 63 6c 61 75 73 65 20 2a  xt WHEN clause *
19c10 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 45 78 70  /.      int nExp
19c20 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
19c30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 32 78 20            /* 2x 
19c40 6e 75 6d 62 65 72 20 6f 66 20 57 48 45 4e 20 74  number of WHEN t
19c50 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e  erms */.      in
19c60 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
19c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19c80 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
19c90 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73  */.      ExprLis
19ca0 74 20 2a 70 45 4c 69 73 74 3b 20 20 20 20 20 20  t *pEList;      
19cb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69             /* Li
19cc0 73 74 20 6f 66 20 57 48 45 4e 20 74 65 72 6d 73  st of WHEN terms
19cd0 20 2a 2f 0a 20 20 20 20 20 20 73 74 72 75 63 74   */.      struct
19ce0 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
19cf0 61 4c 69 73 74 65 6c 65 6d 3b 20 20 2f 2a 20 41  aListelem;  /* A
19d00 72 72 61 79 20 6f 66 20 57 48 45 4e 20 74 65 72  rray of WHEN ter
19d10 6d 73 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72  ms */.      Expr
19d20 20 6f 70 43 6f 6d 70 61 72 65 3b 20 20 20 20 20   opCompare;     
19d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
19d40 20 54 68 65 20 58 3d 3d 45 69 20 65 78 70 72 65   The X==Ei expre
19d50 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45  ssion */.      E
19d60 78 70 72 20 2a 70 58 3b 20 20 20 20 20 20 20 20  xpr *pX;        
19d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19d80 20 2f 2a 20 54 68 65 20 58 20 65 78 70 72 65 73   /* The X expres
19d90 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45 78  sion */.      Ex
19da0 70 72 20 2a 70 54 65 73 74 20 3d 20 30 3b 20 20  pr *pTest = 0;  
19db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19dc0 2f 2a 20 58 3d 3d 45 69 20 28 66 6f 72 6d 20 41  /* X==Ei (form A
19dd0 29 20 6f 72 20 6a 75 73 74 20 45 69 20 28 66 6f  ) or just Ei (fo
19de0 72 6d 20 42 29 20 2a 2f 0a 20 20 20 20 20 20 56  rm B) */.      V
19df0 56 41 5f 4f 4e 4c 59 28 20 69 6e 74 20 69 43 61  VA_ONLY( int iCa
19e00 63 68 65 4c 65 76 65 6c 20 3d 20 70 50 61 72 73  cheLevel = pPars
19e10 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 3b 20  e->iCacheLevel; 
19e20 29 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  )..      assert(
19e30 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
19e40 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
19e50 65 6c 65 63 74 29 20 26 26 20 70 45 78 70 72 2d  elect) && pExpr-
19e60 3e 78 2e 70 4c 69 73 74 20 29 3b 0a 20 20 20 20  >x.pList );.    
19e70 20 20 61 73 73 65 72 74 28 70 45 78 70 72 2d 3e    assert(pExpr->
19e80 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3e  x.pList->nExpr >
19e90 20 30 29 3b 0a 20 20 20 20 20 20 70 45 4c 69 73   0);.      pELis
19ea0 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  t = pExpr->x.pLi
19eb0 73 74 3b 0a 20 20 20 20 20 20 61 4c 69 73 74 65  st;.      aListe
19ec0 6c 65 6d 20 3d 20 70 45 4c 69 73 74 2d 3e 61 3b  lem = pEList->a;
19ed0 0a 20 20 20 20 20 20 6e 45 78 70 72 20 3d 20 70  .      nExpr = p
19ee0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  EList->nExpr;.  
19ef0 20 20 20 20 65 6e 64 4c 61 62 65 6c 20 3d 20 73      endLabel = s
19f00 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
19f10 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 66  bel(v);.      if
19f20 28 20 28 70 58 20 3d 20 70 45 78 70 72 2d 3e 70  ( (pX = pExpr->p
19f30 4c 65 66 74 29 21 3d 30 20 29 7b 0a 20 20 20 20  Left)!=0 ){.    
19f40 20 20 20 20 74 65 6d 70 58 20 3d 20 2a 70 58 3b      tempX = *pX;
19f50 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
19f60 65 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  e( pX->op==TK_CO
19f70 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 20 20  LUMN );.        
19f80 65 78 70 72 54 6f 52 65 67 69 73 74 65 72 28 26  exprToRegister(&
19f90 74 65 6d 70 58 2c 20 73 71 6c 69 74 65 33 45 78  tempX, sqlite3Ex
19fa0 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
19fb0 65 2c 20 70 58 2c 20 26 72 65 67 46 72 65 65 31  e, pX, &regFree1
19fc0 29 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  ));.        test
19fd0 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d  case( regFree1==
19fe0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 6f 70 43  0 );.        opC
19ff0 6f 6d 70 61 72 65 2e 6f 70 20 3d 20 54 4b 5f 45  ompare.op = TK_E
1a000 51 3b 0a 20 20 20 20 20 20 20 20 6f 70 43 6f 6d  Q;.        opCom
1a010 70 61 72 65 2e 70 4c 65 66 74 20 3d 20 26 74 65  pare.pLeft = &te
1a020 6d 70 58 3b 0a 20 20 20 20 20 20 20 20 70 54 65  mpX;.        pTe
1a030 73 74 20 3d 20 26 6f 70 43 6f 6d 70 61 72 65 3b  st = &opCompare;
1a040 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 69 63 6b  .        /* Tick
1a050 65 74 20 62 33 35 31 64 39 35 66 39 63 64 35 65  et b351d95f9cd5e
1a060 66 31 37 65 39 64 39 64 62 61 65 31 38 66 35 63  f17e9d9dbae18f5c
1a070 61 38 36 31 31 31 39 30 30 30 31 3a 0a 20 20 20  a8611190001:.   
1a080 20 20 20 20 20 2a 2a 20 54 68 65 20 76 61 6c 75       ** The valu
1a090 65 20 69 6e 20 72 65 67 46 72 65 65 31 20 6d 69  e in regFree1 mi
1a0a0 67 68 74 20 67 65 74 20 53 43 6f 70 79 2d 65 64  ght get SCopy-ed
1a0b0 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 20 72   into the file r
1a0c0 65 73 75 6c 74 2e 0a 20 20 20 20 20 20 20 20 2a  esult..        *
1a0d0 2a 20 53 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  * So make sure t
1a0e0 68 61 74 20 74 68 65 20 72 65 67 46 72 65 65 31  hat the regFree1
1a0f0 20 72 65 67 69 73 74 65 72 20 69 73 20 6e 6f 74   register is not
1a100 20 72 65 75 73 65 64 20 66 6f 72 20 6f 74 68 65   reused for othe
1a110 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 75 72  r.        ** pur
1a120 70 6f 73 65 73 20 61 6e 64 20 70 6f 73 73 69 62  poses and possib
1a130 6c 79 20 6f 76 65 72 77 72 69 74 74 65 6e 2e 20  ly overwritten. 
1a140 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 67 46   */.        regF
1a150 72 65 65 31 20 3d 20 30 3b 0a 20 20 20 20 20 20  ree1 = 0;.      
1a160 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  }.      for(i=0;
1a170 20 69 3c 6e 45 78 70 72 2d 31 3b 20 69 3d 69 2b   i<nExpr-1; i=i+
1a180 32 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  2){.        sqli
1a190 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68  te3ExprCachePush
1a1a0 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
1a1b0 20 20 69 66 28 20 70 58 20 29 7b 0a 20 20 20 20    if( pX ){.    
1a1c0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
1a1d0 65 73 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  est!=0 );.      
1a1e0 20 20 20 20 6f 70 43 6f 6d 70 61 72 65 2e 70 52      opCompare.pR
1a1f0 69 67 68 74 20 3d 20 61 4c 69 73 74 65 6c 65 6d  ight = aListelem
1a200 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [i].pExpr;.     
1a210 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1a220 20 20 20 20 70 54 65 73 74 20 3d 20 61 4c 69 73      pTest = aLis
1a230 74 65 6c 65 6d 5b 69 5d 2e 70 45 78 70 72 3b 0a  telem[i].pExpr;.
1a240 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1a250 20 20 6e 65 78 74 43 61 73 65 20 3d 20 73 71 6c    nextCase = sql
1a260 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
1a270 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20 74 65  l(v);.        te
1a280 73 74 63 61 73 65 28 20 70 54 65 73 74 2d 3e 6f  stcase( pTest->o
1a290 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a  p==TK_COLUMN );.
1a2a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1a2b0 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
1a2c0 65 2c 20 70 54 65 73 74 2c 20 6e 65 78 74 43 61  e, pTest, nextCa
1a2d0 73 65 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49  se, SQLITE_JUMPI
1a2e0 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 20 20  FNULL);.        
1a2f0 74 65 73 74 63 61 73 65 28 20 61 4c 69 73 74 65  testcase( aListe
1a300 6c 65 6d 5b 69 2b 31 5d 2e 70 45 78 70 72 2d 3e  lem[i+1].pExpr->
1a310 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b  op==TK_COLUMN );
1a320 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1a330 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
1a340 20 61 4c 69 73 74 65 6c 65 6d 5b 69 2b 31 5d 2e   aListelem[i+1].
1a350 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a  pExpr, target);.
1a360 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
1a370 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1a380 47 6f 74 6f 2c 20 30 2c 20 65 6e 64 4c 61 62 65  Goto, 0, endLabe
1a390 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  l);.        sqli
1a3a0 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28  te3ExprCachePop(
1a3b0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
1a3c0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
1a3d0 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6e 65 78 74  lveLabel(v, next
1a3e0 43 61 73 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Case);.      }. 
1a3f0 20 20 20 20 20 69 66 28 20 28 6e 45 78 70 72 26       if( (nExpr&
1a400 31 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  1)!=0 ){.       
1a410 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
1a420 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20  ePush(pParse);. 
1a430 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
1a440 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
1a450 45 4c 69 73 74 2d 3e 61 5b 6e 45 78 70 72 2d 31  EList->a[nExpr-1
1a460 5d 2e 70 45 78 70 72 2c 20 74 61 72 67 65 74 29  ].pExpr, target)
1a470 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
1a480 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50  3ExprCachePop(pP
1a490 61 72 73 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c  arse);.      }el
1a4a0 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
1a4b0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1a4c0 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61 72   OP_Null, 0, tar
1a4d0 67 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  get);.      }.  
1a4e0 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
1a4f0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20  mallocFailed || 
1a500 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20 0a  pParse->nErr>0 .
1a510 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50             || pP
1a520 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65  arse->iCacheLeve
1a530 6c 3d 3d 69 43 61 63 68 65 4c 65 76 65 6c 20 29  l==iCacheLevel )
1a540 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1a550 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
1a560 76 2c 20 65 6e 64 4c 61 62 65 6c 29 3b 0a 20 20  v, endLabel);.  
1a570 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1a580 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1a590 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a 20 20 20  OMIT_TRIGGER.   
1a5a0 20 63 61 73 65 20 54 4b 5f 52 41 49 53 45 3a 20   case TK_RAISE: 
1a5b0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
1a5c0 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d  pExpr->affinity=
1a5d0 3d 4f 45 5f 52 6f 6c 6c 62 61 63 6b 20 0a 20 20  =OE_Rollback .  
1a5e0 20 20 20 20 20 20 20 20 20 7c 7c 20 70 45 78 70           || pExp
1a5f0 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f  r->affinity==OE_
1a600 41 62 6f 72 74 0a 20 20 20 20 20 20 20 20 20 20  Abort.          
1a610 20 7c 7c 20 70 45 78 70 72 2d 3e 61 66 66 69 6e   || pExpr->affin
1a620 69 74 79 3d 3d 4f 45 5f 46 61 69 6c 0a 20 20 20  ity==OE_Fail.   
1a630 20 20 20 20 20 20 20 20 7c 7c 20 70 45 78 70 72          || pExpr
1a640 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 49  ->affinity==OE_I
1a650 67 6e 6f 72 65 0a 20 20 20 20 20 20 29 3b 0a 20  gnore.      );. 
1a660 20 20 20 20 20 69 66 28 20 21 70 50 61 72 73 65       if( !pParse
1a670 2d 3e 70 54 72 69 67 67 65 72 54 61 62 20 29 7b  ->pTriggerTab ){
1a680 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1a690 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
1a6a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1a6b0 20 20 20 20 20 20 20 20 22 52 41 49 53 45 28 29          "RAISE()
1a6c0 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 75 73 65   may only be use
1a6d0 64 20 77 69 74 68 69 6e 20 61 20 74 72 69 67 67  d within a trigg
1a6e0 65 72 2d 70 72 6f 67 72 61 6d 22 29 3b 0a 20 20  er-program");.  
1a6f0 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
1a700 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
1a710 28 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74  ( pExpr->affinit
1a720 79 3d 3d 4f 45 5f 41 62 6f 72 74 20 29 7b 0a 20  y==OE_Abort ){. 
1a730 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 61         sqlite3Ma
1a740 79 41 62 6f 72 74 28 70 50 61 72 73 65 29 3b 0a  yAbort(pParse);.
1a750 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
1a760 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
1a770 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
1a780 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20  _IntValue) );.  
1a790 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 61      if( pExpr->a
1a7a0 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 49 67 6e 6f  ffinity==OE_Igno
1a7b0 72 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  re ){.        sq
1a7c0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
1a7d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 76 2c 20  .            v, 
1a7e0 4f 50 5f 48 61 6c 74 2c 20 53 51 4c 49 54 45 5f  OP_Halt, SQLITE_
1a7f0 4f 4b 2c 20 4f 45 5f 49 67 6e 6f 72 65 2c 20 30  OK, OE_Ignore, 0
1a800 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  , pExpr->u.zToke
1a810 6e 2c 30 29 3b 0a 20 20 20 20 20 20 20 20 56 64  n,0);.        Vd
1a820 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
1a830 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1a840 20 20 20 20 73 71 6c 69 74 65 33 48 61 6c 74 43      sqlite3HaltC
1a850 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 72 73 65  onstraint(pParse
1a860 2c 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  , SQLITE_CONSTRA
1a870 49 4e 54 5f 54 52 49 47 47 45 52 2c 0a 20 20 20  INT_TRIGGER,.   
1a880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a890 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
1a8a0 2d 3e 61 66 66 69 6e 69 74 79 2c 20 70 45 78 70  ->affinity, pExp
1a8b0 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30 2c 20  r->u.zToken, 0, 
1a8c0 30 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  0);.      }..   
1a8d0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1a8e0 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 73 71 6c  #endif.  }.  sql
1a8f0 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
1a900 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72  eg(pParse, regFr
1a910 65 65 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 52  ee1);.  sqlite3R
1a920 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
1a930 61 72 73 65 2c 20 72 65 67 46 72 65 65 32 29 3b  arse, regFree2);
1a940 0a 20 20 72 65 74 75 72 6e 20 69 6e 52 65 67 3b  .  return inReg;
1a950 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 61 63 74 6f 72  .}../*.** Factor
1a960 20 6f 75 74 20 74 68 65 20 63 6f 64 65 20 6f 66   out the code of
1a970 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72 65   the given expre
1a980 73 73 69 6f 6e 20 74 6f 20 69 6e 69 74 69 61 6c  ssion to initial
1a990 69 7a 61 74 69 6f 6e 20 74 69 6d 65 2e 0a 2a 2f  ization time..*/
1a9a0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
1a9b0 72 43 6f 64 65 41 74 49 6e 69 74 28 0a 20 20 50  rCodeAtInit(.  P
1a9c0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
1a9d0 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
1a9e0 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ext */.  Expr *p
1a9f0 45 78 70 72 2c 20 20 20 20 20 20 2f 2a 20 54 68  Expr,      /* Th
1aa00 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20  e expression to 
1aa10 63 6f 64 65 20 77 68 65 6e 20 74 68 65 20 56 44  code when the VD
1aa20 42 45 20 69 6e 69 74 69 61 6c 69 7a 65 73 20 2a  BE initializes *
1aa30 2f 0a 20 20 69 6e 74 20 72 65 67 44 65 73 74 2c  /.  int regDest,
1aa40 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74        /* Store t
1aa50 68 65 20 76 61 6c 75 65 20 69 6e 20 74 68 69 73  he value in this
1aa60 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 75   register */.  u
1aa70 38 20 72 65 75 73 61 62 6c 65 20 20 20 20 20 20  8 reusable      
1aa80 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73   /* True if this
1aa90 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 72   expression is r
1aaa0 65 75 73 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20  eusable */.){.  
1aab0 45 78 70 72 4c 69 73 74 20 2a 70 3b 0a 20 20 61  ExprList *p;.  a
1aac0 73 73 65 72 74 28 20 43 6f 6e 73 74 46 61 63 74  ssert( ConstFact
1aad0 6f 72 4f 6b 28 70 50 61 72 73 65 29 20 29 3b 0a  orOk(pParse) );.
1aae0 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 43    p = pParse->pC
1aaf0 6f 6e 73 74 45 78 70 72 3b 0a 20 20 70 45 78 70  onstExpr;.  pExp
1ab00 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  r = sqlite3ExprD
1ab10 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  up(pParse->db, p
1ab20 45 78 70 72 2c 20 30 29 3b 0a 20 20 70 20 3d 20  Expr, 0);.  p = 
1ab30 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
1ab40 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70 2c  ppend(pParse, p,
1ab50 20 70 45 78 70 72 29 3b 0a 20 20 69 66 28 20 70   pExpr);.  if( p
1ab60 20 29 7b 0a 20 20 20 20 20 73 74 72 75 63 74 20   ){.     struct 
1ab70 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
1ab80 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 70 2d 3e  Item = &p->a[p->
1ab90 6e 45 78 70 72 2d 31 5d 3b 0a 20 20 20 20 20 70  nExpr-1];.     p
1aba0 49 74 65 6d 2d 3e 75 2e 69 43 6f 6e 73 74 45 78  Item->u.iConstEx
1abb0 70 72 52 65 67 20 3d 20 72 65 67 44 65 73 74 3b  prReg = regDest;
1abc0 0a 20 20 20 20 20 70 49 74 65 6d 2d 3e 72 65 75  .     pItem->reu
1abd0 73 61 62 6c 65 20 3d 20 72 65 75 73 61 62 6c 65  sable = reusable
1abe0 3b 0a 20 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e  ;.  }.  pParse->
1abf0 70 43 6f 6e 73 74 45 78 70 72 20 3d 20 70 3b 0a  pConstExpr = p;.
1ac00 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
1ac10 65 20 63 6f 64 65 20 74 6f 20 65 76 61 6c 75 61  e code to evalua
1ac20 74 65 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  te an expression
1ac30 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72   and store the r
1ac40 65 73 75 6c 74 73 0a 2a 2a 20 69 6e 74 6f 20 61  esults.** into a
1ac50 20 72 65 67 69 73 74 65 72 2e 20 20 52 65 74 75   register.  Retu
1ac60 72 6e 20 74 68 65 20 72 65 67 69 73 74 65 72 20  rn the register 
1ac70 6e 75 6d 62 65 72 20 77 68 65 72 65 20 74 68 65  number where the
1ac80 20 72 65 73 75 6c 74 73 0a 2a 2a 20 61 72 65 20   results.** are 
1ac90 73 74 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  stored..**.** If
1aca0 20 74 68 65 20 72 65 67 69 73 74 65 72 20 69 73   the register is
1acb0 20 61 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67   a temporary reg
1acc0 69 73 74 65 72 20 74 68 61 74 20 63 61 6e 20 62  ister that can b
1acd0 65 20 64 65 61 6c 6c 6f 63 61 74 65 64 2c 0a 2a  e deallocated,.*
1ace0 2a 20 74 68 65 6e 20 77 72 69 74 65 20 69 74 73  * then write its
1acf0 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20 2a 70 52   number into *pR
1ad00 65 67 2e 20 20 49 66 20 74 68 65 20 72 65 73 75  eg.  If the resu
1ad10 6c 74 20 72 65 67 69 73 74 65 72 20 69 73 20 6e  lt register is n
1ad20 6f 74 0a 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72  ot.** a temporar
1ad30 79 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65  y, then set *pRe
1ad40 67 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a  g to zero..**.**
1ad50 20 49 66 20 70 45 78 70 72 20 69 73 20 61 20 63   If pExpr is a c
1ad60 6f 6e 73 74 61 6e 74 2c 20 74 68 65 6e 20 74 68  onstant, then th
1ad70 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74  is routine might
1ad80 20 67 65 6e 65 72 61 74 65 20 74 68 69 73 0a 2a   generate this.*
1ad90 2a 20 63 6f 64 65 20 74 6f 20 66 69 6c 6c 20 74  * code to fill t
1ada0 68 65 20 72 65 67 69 73 74 65 72 20 69 6e 20 74  he register in t
1adb0 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  he initializatio
1adc0 6e 20 73 65 63 74 69 6f 6e 20 6f 66 20 74 68 65  n section of the
1add0 0a 2a 2a 20 56 44 42 45 20 70 72 6f 67 72 61 6d  .** VDBE program
1ade0 2c 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 66 61  , in order to fa
1adf0 63 74 6f 72 20 69 74 20 6f 75 74 20 6f 66 20 74  ctor it out of t
1ae00 68 65 20 65 76 61 6c 75 61 74 69 6f 6e 20 6c 6f  he evaluation lo
1ae10 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  op..*/.int sqlit
1ae20 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 50  e3ExprCodeTemp(P
1ae30 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
1ae40 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 2a  pr *pExpr, int *
1ae50 70 52 65 67 29 7b 0a 20 20 69 6e 74 20 72 32 3b  pReg){.  int r2;
1ae60 0a 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74  .  pExpr = sqlit
1ae70 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74  e3ExprSkipCollat
1ae80 65 28 70 45 78 70 72 29 3b 0a 20 20 69 66 28 20  e(pExpr);.  if( 
1ae90 43 6f 6e 73 74 46 61 63 74 6f 72 4f 6b 28 70 50  ConstFactorOk(pP
1aea0 61 72 73 65 29 0a 20 20 20 26 26 20 70 45 78 70  arse).   && pExp
1aeb0 72 2d 3e 6f 70 21 3d 54 4b 5f 52 45 47 49 53 54  r->op!=TK_REGIST
1aec0 45 52 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33  ER.   && sqlite3
1aed0 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f  ExprIsConstantNo
1aee0 74 4a 6f 69 6e 28 70 45 78 70 72 29 0a 20 20 29  tJoin(pExpr).  )
1aef0 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a  {.    ExprList *
1af00 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 43 6f 6e  p = pParse->pCon
1af10 73 74 45 78 70 72 3b 0a 20 20 20 20 69 6e 74 20  stExpr;.    int 
1af20 69 3b 0a 20 20 20 20 2a 70 52 65 67 20 20 3d 20  i;.    *pReg  = 
1af30 30 3b 0a 20 20 20 20 69 66 28 20 70 20 29 7b 0a  0;.    if( p ){.
1af40 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70        struct Exp
1af50 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
1af60 6d 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 49 74  m;.      for(pIt
1af70 65 6d 3d 70 2d 3e 61 2c 20 69 3d 70 2d 3e 6e 45  em=p->a, i=p->nE
1af80 78 70 72 3b 20 69 3e 30 3b 20 70 49 74 65 6d 2b  xpr; i>0; pItem+
1af90 2b 2c 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 20  +, i--){.       
1afa0 20 69 66 28 20 70 49 74 65 6d 2d 3e 72 65 75 73   if( pItem->reus
1afb0 61 62 6c 65 20 26 26 20 73 71 6c 69 74 65 33 45  able && sqlite3E
1afc0 78 70 72 43 6f 6d 70 61 72 65 28 70 49 74 65 6d  xprCompare(pItem
1afd0 2d 3e 70 45 78 70 72 2c 70 45 78 70 72 2c 2d 31  ->pExpr,pExpr,-1
1afe0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
1aff0 20 20 72 65 74 75 72 6e 20 70 49 74 65 6d 2d 3e    return pItem->
1b000 75 2e 69 43 6f 6e 73 74 45 78 70 72 52 65 67 3b  u.iConstExprReg;
1b010 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1b020 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 32 20   }.    }.    r2 
1b030 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
1b040 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
1b050 72 43 6f 64 65 41 74 49 6e 69 74 28 70 50 61 72  rCodeAtInit(pPar
1b060 73 65 2c 20 70 45 78 70 72 2c 20 72 32 2c 20 31  se, pExpr, r2, 1
1b070 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1b080 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33  int r1 = sqlite3
1b090 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
1b0a0 65 29 3b 0a 20 20 20 20 72 32 20 3d 20 73 71 6c  e);.    r2 = sql
1b0b0 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67  ite3ExprCodeTarg
1b0c0 65 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  et(pParse, pExpr
1b0d0 2c 20 72 31 29 3b 0a 20 20 20 20 69 66 28 20 72  , r1);.    if( r
1b0e0 32 3d 3d 72 31 20 29 7b 0a 20 20 20 20 20 20 2a  2==r1 ){.      *
1b0f0 70 52 65 67 20 3d 20 72 31 3b 0a 20 20 20 20 7d  pReg = r1;.    }
1b100 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
1b110 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
1b120 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20  g(pParse, r1);. 
1b130 20 20 20 20 20 2a 70 52 65 67 20 3d 20 30 3b 0a       *pReg = 0;.
1b140 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
1b150 72 6e 20 72 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn r2;.}../*.** 
1b160 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
1b170 61 74 20 77 69 6c 6c 20 65 76 61 6c 75 61 74 65  at will evaluate
1b180 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70   expression pExp
1b190 72 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 0a  r and store the.
1b1a0 2a 2a 20 72 65 73 75 6c 74 73 20 69 6e 20 72 65  ** results in re
1b1b0 67 69 73 74 65 72 20 74 61 72 67 65 74 2e 20 20  gister target.  
1b1c0 54 68 65 20 72 65 73 75 6c 74 73 20 61 72 65 20  The results are 
1b1d0 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 61 70  guaranteed to ap
1b1e0 70 65 61 72 0a 2a 2a 20 69 6e 20 72 65 67 69 73  pear.** in regis
1b1f0 74 65 72 20 74 61 72 67 65 74 2e 0a 2a 2f 0a 76  ter target..*/.v
1b200 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43  oid sqlite3ExprC
1b210 6f 64 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ode(Parse *pPars
1b220 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  e, Expr *pExpr, 
1b230 69 6e 74 20 74 61 72 67 65 74 29 7b 0a 20 20 69  int target){.  i
1b240 6e 74 20 69 6e 52 65 67 3b 0a 0a 20 20 61 73 73  nt inReg;..  ass
1b250 65 72 74 28 20 74 61 72 67 65 74 3e 30 20 26 26  ert( target>0 &&
1b260 20 74 61 72 67 65 74 3c 3d 70 50 61 72 73 65 2d   target<=pParse-
1b270 3e 6e 4d 65 6d 20 29 3b 0a 20 20 69 66 28 20 70  >nMem );.  if( p
1b280 45 78 70 72 20 26 26 20 70 45 78 70 72 2d 3e 6f  Expr && pExpr->o
1b290 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29  p==TK_REGISTER )
1b2a0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
1b2b0 65 41 64 64 4f 70 32 28 70 50 61 72 73 65 2d 3e  eAddOp2(pParse->
1b2c0 70 56 64 62 65 2c 20 4f 50 5f 43 6f 70 79 2c 20  pVdbe, OP_Copy, 
1b2d0 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 74  pExpr->iTable, t
1b2e0 61 72 67 65 74 29 3b 0a 20 20 7d 65 6c 73 65 7b  arget);.  }else{
1b2f0 0a 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c  .    inReg = sql
1b300 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67  ite3ExprCodeTarg
1b310 65 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  et(pParse, pExpr
1b320 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 61  , target);.    a
1b330 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70  ssert( pParse->p
1b340 56 64 62 65 20 7c 7c 20 70 50 61 72 73 65 2d 3e  Vdbe || pParse->
1b350 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1b360 20 29 3b 0a 20 20 20 20 69 66 28 20 69 6e 52 65   );.    if( inRe
1b370 67 21 3d 74 61 72 67 65 74 20 26 26 20 70 50 61  g!=target && pPa
1b380 72 73 65 2d 3e 70 56 64 62 65 20 29 7b 0a 20 20  rse->pVdbe ){.  
1b390 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1b3a0 64 64 4f 70 32 28 70 50 61 72 73 65 2d 3e 70 56  ddOp2(pParse->pV
1b3b0 64 62 65 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 69  dbe, OP_SCopy, i
1b3c0 6e 52 65 67 2c 20 74 61 72 67 65 74 29 3b 0a 20  nReg, target);. 
1b3d0 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
1b3e0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
1b3f0 74 68 61 74 20 77 69 6c 6c 20 65 76 61 6c 75 61  that will evalua
1b400 74 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45  te expression pE
1b410 78 70 72 20 61 6e 64 20 73 74 6f 72 65 20 74 68  xpr and store th
1b420 65 0a 2a 2a 20 72 65 73 75 6c 74 73 20 69 6e 20  e.** results in 
1b430 72 65 67 69 73 74 65 72 20 74 61 72 67 65 74 2e  register target.
1b440 20 20 54 68 65 20 72 65 73 75 6c 74 73 20 61 72    The results ar
1b450 65 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  e guaranteed to 
1b460 61 70 70 65 61 72 0a 2a 2a 20 69 6e 20 72 65 67  appear.** in reg
1b470 69 73 74 65 72 20 74 61 72 67 65 74 2e 20 20 49  ister target.  I
1b480 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
1b490 20 69 73 20 63 6f 6e 73 74 61 6e 74 2c 20 74 68   is constant, th
1b4a0 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  en this routine.
1b4b0 2a 2a 20 6d 69 67 68 74 20 63 68 6f 6f 73 65 20  ** might choose 
1b4c0 74 6f 20 63 6f 64 65 20 74 68 65 20 65 78 70 72  to code the expr
1b4d0 65 73 73 69 6f 6e 20 61 74 20 69 6e 69 74 69 61  ession at initia
1b4e0 6c 69 7a 61 74 69 6f 6e 20 74 69 6d 65 2e 0a 2a  lization time..*
1b4f0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
1b500 70 72 43 6f 64 65 46 61 63 74 6f 72 61 62 6c 65  prCodeFactorable
1b510 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1b520 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74  Expr *pExpr, int
1b530 20 74 61 72 67 65 74 29 7b 0a 20 20 69 66 28 20   target){.  if( 
1b540 70 50 61 72 73 65 2d 3e 6f 6b 43 6f 6e 73 74 46  pParse->okConstF
1b550 61 63 74 6f 72 20 26 26 20 73 71 6c 69 74 65 33  actor && sqlite3
1b560 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70  ExprIsConstant(p
1b570 45 78 70 72 29 20 29 7b 0a 20 20 20 20 73 71 6c  Expr) ){.    sql
1b580 69 74 65 33 45 78 70 72 43 6f 64 65 41 74 49 6e  ite3ExprCodeAtIn
1b590 69 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  it(pParse, pExpr
1b5a0 2c 20 74 61 72 67 65 74 2c 20 30 29 3b 0a 20 20  , target, 0);.  
1b5b0 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
1b5c0 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
1b5d0 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65 74  e, pExpr, target
1b5e0 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
1b5f0 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
1b600 61 74 20 65 76 61 6c 75 61 74 65 73 20 74 68 65  at evaluates the
1b610 20 67 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f   given expressio
1b620 6e 20 61 6e 64 20 70 75 74 73 20 74 68 65 20 72  n and puts the r
1b630 65 73 75 6c 74 0a 2a 2a 20 69 6e 20 72 65 67 69  esult.** in regi
1b640 73 74 65 72 20 74 61 72 67 65 74 2e 0a 2a 2a 0a  ster target..**.
1b650 2a 2a 20 41 6c 73 6f 20 6d 61 6b 65 20 61 20 63  ** Also make a c
1b660 6f 70 79 20 6f 66 20 74 68 65 20 65 78 70 72 65  opy of the expre
1b670 73 73 69 6f 6e 20 72 65 73 75 6c 74 73 20 69 6e  ssion results in
1b680 74 6f 20 61 6e 6f 74 68 65 72 20 22 63 61 63 68  to another "cach
1b690 65 22 20 72 65 67 69 73 74 65 72 0a 2a 2a 20 61  e" register.** a
1b6a0 6e 64 20 6d 6f 64 69 66 79 20 74 68 65 20 65 78  nd modify the ex
1b6b0 70 72 65 73 73 69 6f 6e 20 73 6f 20 74 68 61 74  pression so that
1b6c0 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65 20 69   the next time i
1b6d0 74 20 69 73 20 65 76 61 6c 75 61 74 65 64 2c 0a  t is evaluated,.
1b6e0 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 69 73  ** the result is
1b6f0 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63   a copy of the c
1b700 61 63 68 65 20 72 65 67 69 73 74 65 72 2e 0a 2a  ache register..*
1b710 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1b720 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 65 78  e is used for ex
1b730 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20 61  pressions that a
1b740 72 65 20 75 73 65 64 20 6d 75 6c 74 69 70 6c 65  re used multiple
1b750 20 0a 2a 2a 20 74 69 6d 65 73 2e 20 20 54 68 65   .** times.  The
1b760 79 20 61 72 65 20 65 76 61 6c 75 61 74 65 64 20  y are evaluated 
1b770 6f 6e 63 65 20 61 6e 64 20 74 68 65 20 72 65 73  once and the res
1b780 75 6c 74 73 20 6f 66 20 74 68 65 20 65 78 70 72  ults of the expr
1b790 65 73 73 69 6f 6e 0a 2a 2a 20 61 72 65 20 72 65  ession.** are re
1b7a0 75 73 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  used..*/.void sq
1b7b0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 41 6e 64  lite3ExprCodeAnd
1b7c0 43 61 63 68 65 28 50 61 72 73 65 20 2a 70 50 61  Cache(Parse *pPa
1b7d0 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
1b7e0 2c 20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a 20  , int target){. 
1b7f0 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
1b800 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
1b810 69 4d 65 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28  iMem;..  assert(
1b820 20 74 61 72 67 65 74 3e 30 20 29 3b 0a 20 20 61   target>0 );.  a
1b830 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
1b840 21 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29 3b  !=TK_REGISTER );
1b850 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  .  sqlite3ExprCo
1b860 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
1b870 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 69 4d 65  , target);.  iMe
1b880 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  m = ++pParse->nM
1b890 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  em;.  sqlite3Vdb
1b8a0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f  eAddOp2(v, OP_Co
1b8b0 70 79 2c 20 74 61 72 67 65 74 2c 20 69 4d 65 6d  py, target, iMem
1b8c0 29 3b 0a 20 20 65 78 70 72 54 6f 52 65 67 69 73  );.  exprToRegis
1b8d0 74 65 72 28 70 45 78 70 72 2c 20 69 4d 65 6d 29  ter(pExpr, iMem)
1b8e0 3b 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  ;.}..#if defined
1b8f0 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 54  (SQLITE_ENABLE_T
1b900 52 45 45 5f 45 58 50 4c 41 49 4e 29 0a 2f 2a 0a  REE_EXPLAIN)./*.
1b910 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 20 68 75  ** Generate a hu
1b920 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20 65 78 70  man-readable exp
1b930 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 61 6e 20 65  lanation of an e
1b940 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 0a  xpression tree..
1b950 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
1b960 78 70 6c 61 69 6e 45 78 70 72 28 56 64 62 65 20  xplainExpr(Vdbe 
1b970 2a 70 4f 75 74 2c 20 45 78 70 72 20 2a 70 45 78  *pOut, Expr *pEx
1b980 70 72 29 7b 0a 20 20 69 6e 74 20 6f 70 3b 20 20  pr){.  int op;  
1b990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b9a0 20 2f 2a 20 54 68 65 20 6f 70 63 6f 64 65 20 62   /* The opcode b
1b9b0 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20  eing coded */.  
1b9c0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 42 69 6e  const char *zBin
1b9d0 4f 70 20 3d 20 30 3b 20 20 20 2f 2a 20 42 69 6e  Op = 0;   /* Bin
1b9e0 61 72 79 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a  ary operator */.
1b9f0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55    const char *zU
1ba00 6e 69 4f 70 20 3d 20 30 3b 20 20 20 2f 2a 20 55  niOp = 0;   /* U
1ba10 6e 61 72 79 20 6f 70 65 72 61 74 6f 72 20 2a 2f  nary operator */
1ba20 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20  .  if( pExpr==0 
1ba30 29 7b 0a 20 20 20 20 6f 70 20 3d 20 54 4b 5f 4e  ){.    op = TK_N
1ba40 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ULL;.  }else{.  
1ba50 20 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70    op = pExpr->op
1ba60 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63 68 28 20  ;.  }.  switch( 
1ba70 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
1ba80 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a  K_AGG_COLUMN: {.
1ba90 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1baa0 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c  lainPrintf(pOut,
1bab0 20 22 41 47 47 7b 25 64 3a 25 64 7d 22 2c 0a 20   "AGG{%d:%d}",. 
1bac0 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
1bad0 2d 3e 69 54 61 62 6c 65 2c 20 70 45 78 70 72 2d  ->iTable, pExpr-
1bae0 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20  >iColumn);.     
1baf0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1bb00 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e    case TK_COLUMN
1bb10 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45  : {.      if( pE
1bb20 78 70 72 2d 3e 69 54 61 62 6c 65 3c 30 20 29 7b  xpr->iTable<0 ){
1bb30 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73  .        /* This
1bb40 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 77 68   only happens wh
1bb50 65 6e 20 63 6f 64 69 6e 67 20 63 68 65 63 6b 20  en coding check 
1bb60 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20  constraints */. 
1bb70 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
1bb80 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74  plainPrintf(pOut
1bb90 2c 20 22 43 4f 4c 55 4d 4e 28 25 64 29 22 2c 20  , "COLUMN(%d)", 
1bba0 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b  pExpr->iColumn);
1bbb0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1bbc0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1bbd0 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c  lainPrintf(pOut,
1bbe0 20 22 7b 25 64 3a 25 64 7d 22 2c 0a 20 20 20 20   "{%d:%d}",.    
1bbf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bc00 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
1bc10 69 54 61 62 6c 65 2c 20 70 45 78 70 72 2d 3e 69  iTable, pExpr->i
1bc20 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 7d  Column);.      }
1bc30 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1bc40 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
1bc50 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20 20  INTEGER: {.     
1bc60 20 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67   if( pExpr->flag
1bc70 73 20 26 20 45 50 5f 49 6e 74 56 61 6c 75 65 20  s & EP_IntValue 
1bc80 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1bc90 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28  e3ExplainPrintf(
1bca0 70 4f 75 74 2c 20 22 25 64 22 2c 20 70 45 78 70  pOut, "%d", pExp
1bcb0 72 2d 3e 75 2e 69 56 61 6c 75 65 29 3b 0a 20 20  r->u.iValue);.  
1bcc0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1bcd0 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
1bce0 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 25  nPrintf(pOut, "%
1bcf0 73 22 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  s", pExpr->u.zTo
1bd00 6b 65 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ken);.      }.  
1bd10 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1bd20 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1bd30 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f  OMIT_FLOATING_PO
1bd40 49 4e 54 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  INT.    case TK_
1bd50 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20 73  FLOAT: {.      s
1bd60 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69  qlite3ExplainPri
1bd70 6e 74 66 28 70 4f 75 74 2c 22 25 73 22 2c 20 70  ntf(pOut,"%s", p
1bd80 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b  Expr->u.zToken);
1bd90 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1bda0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63    }.#endif.    c
1bdb0 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 20 7b  ase TK_STRING: {
1bdc0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1bdd0 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74  plainPrintf(pOut
1bde0 2c 22 25 51 22 2c 20 70 45 78 70 72 2d 3e 75 2e  ,"%Q", pExpr->u.
1bdf0 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 62  zToken);.      b
1be00 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
1be10 63 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a 20 7b 0a  case TK_NULL: {.
1be20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1be30 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c  lainPrintf(pOut,
1be40 22 4e 55 4c 4c 22 29 3b 0a 20 20 20 20 20 20 62  "NULL");.      b
1be50 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  reak;.    }.#ifn
1be60 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1be70 42 4c 4f 42 5f 4c 49 54 45 52 41 4c 0a 20 20 20  BLOB_LITERAL.   
1be80 20 63 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 20 7b   case TK_BLOB: {
1be90 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1bea0 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74  plainPrintf(pOut
1beb0 2c 22 25 73 22 2c 20 70 45 78 70 72 2d 3e 75 2e  ,"%s", pExpr->u.
1bec0 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 62  zToken);.      b
1bed0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
1bee0 69 66 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 56  if.    case TK_V
1bef0 41 52 49 41 42 4c 45 3a 20 7b 0a 20 20 20 20 20  ARIABLE: {.     
1bf00 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
1bf10 72 69 6e 74 66 28 70 4f 75 74 2c 22 56 41 52 49  rintf(pOut,"VARI
1bf20 41 42 4c 45 28 25 73 2c 25 64 29 22 2c 0a 20 20  ABLE(%s,%d)",.  
1bf30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bf40 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
1bf50 75 2e 7a 54 6f 6b 65 6e 2c 20 70 45 78 70 72 2d  u.zToken, pExpr-
1bf60 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20  >iColumn);.     
1bf70 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1bf80 20 20 63 61 73 65 20 54 4b 5f 52 45 47 49 53 54    case TK_REGIST
1bf90 45 52 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  ER: {.      sqli
1bfa0 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
1bfb0 28 70 4f 75 74 2c 22 52 45 47 49 53 54 45 52 28  (pOut,"REGISTER(
1bfc0 25 64 29 22 2c 20 70 45 78 70 72 2d 3e 69 54 61  %d)", pExpr->iTa
1bfd0 62 6c 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ble);.      brea
1bfe0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
1bff0 65 20 54 4b 5f 41 53 3a 20 7b 0a 20 20 20 20 20  e TK_AS: {.     
1c000 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45   sqlite3ExplainE
1c010 78 70 72 28 70 4f 75 74 2c 20 70 45 78 70 72 2d  xpr(pOut, pExpr-
1c020 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 62  >pLeft);.      b
1c030 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  reak;.    }.#ifn
1c040 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1c050 43 41 53 54 0a 20 20 20 20 63 61 73 65 20 54 4b  CAST.    case TK
1c060 5f 43 41 53 54 3a 20 7b 0a 20 20 20 20 20 20 2f  _CAST: {.      /
1c070 2a 20 45 78 70 72 65 73 73 69 6f 6e 73 20 6f 66  * Expressions of
1c080 20 74 68 65 20 66 6f 72 6d 3a 20 20 20 43 41 53   the form:   CAS
1c090 54 28 70 4c 65 66 74 20 41 53 20 74 6f 6b 65 6e  T(pLeft AS token
1c0a0 29 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74  ) */.      const
1c0b0 20 63 68 61 72 20 2a 7a 41 66 66 20 3d 20 22 75   char *zAff = "u
1c0c0 6e 6b 22 3b 0a 20 20 20 20 20 20 73 77 69 74 63  nk";.      switc
1c0d0 68 28 20 73 71 6c 69 74 65 33 41 66 66 69 6e 69  h( sqlite3Affini
1c0e0 74 79 54 79 70 65 28 70 45 78 70 72 2d 3e 75 2e  tyType(pExpr->u.
1c0f0 7a 54 6f 6b 65 6e 2c 20 30 29 20 29 7b 0a 20 20  zToken, 0) ){.  
1c100 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
1c110 45 5f 41 46 46 5f 54 45 58 54 3a 20 20 20 20 7a  E_AFF_TEXT:    z
1c120 41 66 66 20 3d 20 22 54 45 58 54 22 3b 20 20 20  Aff = "TEXT";   
1c130 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
1c140 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 46 46   case SQLITE_AFF
1c150 5f 4e 4f 4e 45 3a 20 20 20 20 7a 41 66 66 20 3d  _NONE:    zAff =
1c160 20 22 4e 4f 4e 45 22 3b 20 20 20 20 20 62 72 65   "NONE";     bre
1c170 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65  ak;.        case
1c180 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45   SQLITE_AFF_NUME
1c190 52 49 43 3a 20 7a 41 66 66 20 3d 20 22 4e 55 4d  RIC: zAff = "NUM
1c1a0 45 52 49 43 22 3b 20 20 62 72 65 61 6b 3b 0a 20  ERIC";  break;. 
1c1b0 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49         case SQLI
1c1c0 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 3a 20  TE_AFF_INTEGER: 
1c1d0 7a 41 66 66 20 3d 20 22 49 4e 54 45 47 45 52 22  zAff = "INTEGER"
1c1e0 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  ;  break;.      
1c1f0 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 46    case SQLITE_AF
1c200 46 5f 52 45 41 4c 3a 20 20 20 20 7a 41 66 66 20  F_REAL:    zAff 
1c210 3d 20 22 52 45 41 4c 22 3b 20 20 20 20 20 62 72  = "REAL";     br
1c220 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
1c230 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
1c240 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 43  nPrintf(pOut, "C
1c250 41 53 54 2d 25 73 28 22 2c 20 7a 41 66 66 29 3b  AST-%s(", zAff);
1c260 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1c270 70 6c 61 69 6e 45 78 70 72 28 70 4f 75 74 2c 20  plainExpr(pOut, 
1c280 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
1c290 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c       sqlite3Expl
1c2a0 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20  ainPrintf(pOut, 
1c2b0 22 29 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ")");.      brea
1c2c0 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20  k;.    }.#endif 
1c2d0 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  /* SQLITE_OMIT_C
1c2e0 41 53 54 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  AST */.    case 
1c2f0 54 4b 5f 4c 54 3a 20 20 20 20 20 20 7a 42 69 6e  TK_LT:      zBin
1c300 4f 70 20 3d 20 22 4c 54 22 3b 20 20 20 20 20 62  Op = "LT";     b
1c310 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
1c320 4b 5f 4c 45 3a 20 20 20 20 20 20 7a 42 69 6e 4f  K_LE:      zBinO
1c330 70 20 3d 20 22 4c 45 22 3b 20 20 20 20 20 62 72  p = "LE";     br
1c340 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
1c350 5f 47 54 3a 20 20 20 20 20 20 7a 42 69 6e 4f 70  _GT:      zBinOp
1c360 20 3d 20 22 47 54 22 3b 20 20 20 20 20 62 72 65   = "GT";     bre
1c370 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
1c380 47 45 3a 20 20 20 20 20 20 7a 42 69 6e 4f 70 20  GE:      zBinOp 
1c390 3d 20 22 47 45 22 3b 20 20 20 20 20 62 72 65 61  = "GE";     brea
1c3a0 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  k;.    case TK_N
1c3b0 45 3a 20 20 20 20 20 20 7a 42 69 6e 4f 70 20 3d  E:      zBinOp =
1c3c0 20 22 4e 45 22 3b 20 20 20 20 20 62 72 65 61 6b   "NE";     break
1c3d0 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51  ;.    case TK_EQ
1c3e0 3a 20 20 20 20 20 20 7a 42 69 6e 4f 70 20 3d 20  :      zBinOp = 
1c3f0 22 45 51 22 3b 20 20 20 20 20 62 72 65 61 6b 3b  "EQ";     break;
1c400 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 3a  .    case TK_IS:
1c410 20 20 20 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22        zBinOp = "
1c420 49 53 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a  IS";     break;.
1c430 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f      case TK_ISNO
1c440 54 3a 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22 49  T:   zBinOp = "I
1c450 53 4e 4f 54 22 3b 20 20 62 72 65 61 6b 3b 0a 20  SNOT";  break;. 
1c460 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20     case TK_AND: 
1c470 20 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22 41 4e      zBinOp = "AN
1c480 44 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  D";    break;.  
1c490 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20 20 20    case TK_OR:   
1c4a0 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22 4f 52 22     zBinOp = "OR"
1c4b0 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ;     break;.   
1c4c0 20 63 61 73 65 20 54 4b 5f 50 4c 55 53 3a 20 20   case TK_PLUS:  
1c4d0 20 20 7a 42 69 6e 4f 70 20 3d 20 22 41 44 44 22    zBinOp = "ADD"
1c4e0 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ;    break;.    
1c4f0 63 61 73 65 20 54 4b 5f 53 54 41 52 3a 20 20 20  case TK_STAR:   
1c500 20 7a 42 69 6e 4f 70 20 3d 20 22 4d 55 4c 22 3b   zBinOp = "MUL";
1c510 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
1c520 61 73 65 20 54 4b 5f 4d 49 4e 55 53 3a 20 20 20  ase TK_MINUS:   
1c530 7a 42 69 6e 4f 70 20 3d 20 22 53 55 42 22 3b 20  zBinOp = "SUB"; 
1c540 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
1c550 73 65 20 54 4b 5f 52 45 4d 3a 20 20 20 20 20 7a  se TK_REM:     z
1c560 42 69 6e 4f 70 20 3d 20 22 52 45 4d 22 3b 20 20  BinOp = "REM";  
1c570 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
1c580 65 20 54 4b 5f 42 49 54 41 4e 44 3a 20 20 7a 42  e TK_BITAND:  zB
1c590 69 6e 4f 70 20 3d 20 22 42 49 54 41 4e 44 22 3b  inOp = "BITAND";
1c5a0 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
1c5b0 20 54 4b 5f 42 49 54 4f 52 3a 20 20 20 7a 42 69   TK_BITOR:   zBi
1c5c0 6e 4f 70 20 3d 20 22 42 49 54 4f 52 22 3b 20 20  nOp = "BITOR";  
1c5d0 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
1c5e0 54 4b 5f 53 4c 41 53 48 3a 20 20 20 7a 42 69 6e  TK_SLASH:   zBin
1c5f0 4f 70 20 3d 20 22 44 49 56 22 3b 20 20 20 20 62  Op = "DIV";    b
1c600 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
1c610 4b 5f 4c 53 48 49 46 54 3a 20 20 7a 42 69 6e 4f  K_LSHIFT:  zBinO
1c620 70 20 3d 20 22 4c 53 48 49 46 54 22 3b 20 62 72  p = "LSHIFT"; br
1c630 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
1c640 5f 52 53 48 49 46 54 3a 20 20 7a 42 69 6e 4f 70  _RSHIFT:  zBinOp
1c650 20 3d 20 22 52 53 48 49 46 54 22 3b 20 62 72 65   = "RSHIFT"; bre
1c660 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
1c670 43 4f 4e 43 41 54 3a 20 20 7a 42 69 6e 4f 70 20  CONCAT:  zBinOp 
1c680 3d 20 22 43 4f 4e 43 41 54 22 3b 20 62 72 65 61  = "CONCAT"; brea
1c690 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  k;..    case TK_
1c6a0 55 4d 49 4e 55 53 3a 20 20 7a 55 6e 69 4f 70 20  UMINUS:  zUniOp 
1c6b0 3d 20 22 55 4d 49 4e 55 53 22 3b 20 62 72 65 61  = "UMINUS"; brea
1c6c0 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55  k;.    case TK_U
1c6d0 50 4c 55 53 3a 20 20 20 7a 55 6e 69 4f 70 20 3d  PLUS:   zUniOp =
1c6e0 20 22 55 50 4c 55 53 22 3b 20 20 62 72 65 61 6b   "UPLUS";  break
1c6f0 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49  ;.    case TK_BI
1c700 54 4e 4f 54 3a 20 20 7a 55 6e 69 4f 70 20 3d 20  TNOT:  zUniOp = 
1c710 22 42 49 54 4e 4f 54 22 3b 20 62 72 65 61 6b 3b  "BITNOT"; break;
1c720 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54  .    case TK_NOT
1c730 3a 20 20 20 20 20 7a 55 6e 69 4f 70 20 3d 20 22  :     zUniOp = "
1c740 4e 4f 54 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a  NOT";    break;.
1c750 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55      case TK_ISNU
1c760 4c 4c 3a 20 20 7a 55 6e 69 4f 70 20 3d 20 22 49  LL:  zUniOp = "I
1c770 53 4e 55 4c 4c 22 3b 20 62 72 65 61 6b 3b 0a 20  SNULL"; break;. 
1c780 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55     case TK_NOTNU
1c790 4c 4c 3a 20 7a 55 6e 69 4f 70 20 3d 20 22 4e 4f  LL: zUniOp = "NO
1c7a0 54 4e 55 4c 4c 22 3b 20 62 72 65 61 6b 3b 0a 0a  TNULL"; break;..
1c7b0 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 4c      case TK_COLL
1c7c0 41 54 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  ATE: {.      sql
1c7d0 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72 28  ite3ExplainExpr(
1c7e0 70 4f 75 74 2c 20 70 45 78 70 72 2d 3e 70 4c 65  pOut, pExpr->pLe
1c7f0 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ft);.      sqlit
1c800 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28  e3ExplainPrintf(
1c810 70 4f 75 74 2c 22 2e 43 4f 4c 4c 41 54 45 28 25  pOut,".COLLATE(%
1c820 73 29 22 2c 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  s)",pExpr->u.zTo
1c830 6b 65 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ken);.      brea
1c840 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61  k;.    }..    ca
1c850 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49  se TK_AGG_FUNCTI
1c860 4f 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ON:.    case TK_
1c870 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20  FUNCTION: {.    
1c880 20 20 45 78 70 72 4c 69 73 74 20 2a 70 46 61 72    ExprList *pFar
1c890 67 3b 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74  g;       /* List
1c8a0 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20 61 72 67   of function arg
1c8b0 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20  uments */.      
1c8c0 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
1c8d0 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 54 6f  rty(pExpr, EP_To
1c8e0 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20  kenOnly) ){.    
1c8f0 20 20 20 20 70 46 61 72 67 20 3d 20 30 3b 0a 20      pFarg = 0;. 
1c900 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1c910 20 20 20 20 70 46 61 72 67 20 3d 20 70 45 78 70      pFarg = pExp
1c920 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20  r->x.pList;.    
1c930 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6f 70    }.      if( op
1c940 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f  ==TK_AGG_FUNCTIO
1c950 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  N ){.        sql
1c960 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74  ite3ExplainPrint
1c970 66 28 70 4f 75 74 2c 20 22 41 47 47 5f 46 55 4e  f(pOut, "AGG_FUN
1c980 43 54 49 4f 4e 25 64 3a 25 73 28 22 2c 0a 20 20  CTION%d:%s(",.  
1c990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c9a0 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
1c9b0 2d 3e 6f 70 32 2c 20 70 45 78 70 72 2d 3e 75 2e  ->op2, pExpr->u.
1c9c0 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 7d  zToken);.      }
1c9d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
1c9e0 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e  lite3ExplainPrin
1c9f0 74 66 28 70 4f 75 74 2c 20 22 46 55 4e 43 54 49  tf(pOut, "FUNCTI
1ca00 4f 4e 3a 25 73 28 22 2c 20 70 45 78 70 72 2d 3e  ON:%s(", pExpr->
1ca10 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20  u.zToken);.     
1ca20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 46 61   }.      if( pFa
1ca30 72 67 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  rg ){.        sq
1ca40 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72  lite3ExplainExpr
1ca50 4c 69 73 74 28 70 4f 75 74 2c 20 70 46 61 72 67  List(pOut, pFarg
1ca60 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1ca70 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
1ca80 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 29 22 29  rintf(pOut, ")")
1ca90 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1caa0 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
1cab0 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
1cac0 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58  Y.    case TK_EX
1cad0 49 53 54 53 3a 20 7b 0a 20 20 20 20 20 20 73 71  ISTS: {.      sq
1cae0 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e  lite3ExplainPrin
1caf0 74 66 28 70 4f 75 74 2c 20 22 45 58 49 53 54 53  tf(pOut, "EXISTS
1cb00 28 22 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (");.      sqlit
1cb10 65 33 45 78 70 6c 61 69 6e 53 65 6c 65 63 74 28  e3ExplainSelect(
1cb20 70 4f 75 74 2c 20 70 45 78 70 72 2d 3e 78 2e 70  pOut, pExpr->x.p
1cb30 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 73  Select);.      s
1cb40 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69  qlite3ExplainPri
1cb50 6e 74 66 28 70 4f 75 74 2c 22 29 22 29 3b 0a 20  ntf(pOut,")");. 
1cb60 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1cb70 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45  }.    case TK_SE
1cb80 4c 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 73 71  LECT: {.      sq
1cb90 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e  lite3ExplainPrin
1cba0 74 66 28 70 4f 75 74 2c 20 22 28 22 29 3b 0a 20  tf(pOut, "(");. 
1cbb0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c       sqlite3Expl
1cbc0 61 69 6e 53 65 6c 65 63 74 28 70 4f 75 74 2c 20  ainSelect(pOut, 
1cbd0 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74  pExpr->x.pSelect
1cbe0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1cbf0 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f  ExplainPrintf(pO
1cc00 75 74 2c 20 22 29 22 29 3b 0a 20 20 20 20 20 20  ut, ")");.      
1cc10 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1cc20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20   case TK_IN: {. 
1cc30 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c       sqlite3Expl
1cc40 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20  ainPrintf(pOut, 
1cc50 22 49 4e 28 22 29 3b 0a 20 20 20 20 20 20 73 71  "IN(");.      sq
1cc60 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72  lite3ExplainExpr
1cc70 28 70 4f 75 74 2c 20 70 45 78 70 72 2d 3e 70 4c  (pOut, pExpr->pL
1cc80 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  eft);.      sqli
1cc90 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
1cca0 28 70 4f 75 74 2c 20 22 2c 22 29 3b 0a 20 20 20  (pOut, ",");.   
1ccb0 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72     if( ExprHasPr
1ccc0 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
1ccd0 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20  _xIsSelect) ){. 
1cce0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
1ccf0 70 6c 61 69 6e 53 65 6c 65 63 74 28 70 4f 75 74  plainSelect(pOut
1cd00 2c 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65  , pExpr->x.pSele
1cd10 63 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ct);.      }else
1cd20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1cd30 33 45 78 70 6c 61 69 6e 45 78 70 72 4c 69 73 74  3ExplainExprList
1cd40 28 70 4f 75 74 2c 20 70 45 78 70 72 2d 3e 78 2e  (pOut, pExpr->x.
1cd50 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a  pList);.      }.
1cd60 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1cd70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c  lainPrintf(pOut,
1cd80 20 22 29 22 29 3b 0a 20 20 20 20 20 20 62 72 65   ")");.      bre
1cd90 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
1cda0 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
1cdb0 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 20 20 20  SUBQUERY */..   
1cdc0 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 20 20 78 20   /*.    **    x 
1cdd0 42 45 54 57 45 45 4e 20 79 20 41 4e 44 20 7a 0a  BETWEEN y AND z.
1cde0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
1cdf0 69 73 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74  is is equivalent
1ce00 20 74 6f 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a   to.    **.    *
1ce10 2a 20 20 20 20 78 3e 3d 79 20 41 4e 44 20 78 3c  *    x>=y AND x<
1ce20 3d 7a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  =z.    **.    **
1ce30 20 58 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20   X is stored in 
1ce40 70 45 78 70 72 2d 3e 70 4c 65 66 74 2e 0a 20 20  pExpr->pLeft..  
1ce50 20 20 2a 2a 20 59 20 69 73 20 73 74 6f 72 65 64    ** Y is stored
1ce60 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 69 73 74   in pExpr->pList
1ce70 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2e 0a 20 20  ->a[0].pExpr..  
1ce80 20 20 2a 2a 20 5a 20 69 73 20 73 74 6f 72 65 64    ** Z is stored
1ce90 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 69 73 74   in pExpr->pList
1cea0 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 2e 0a 20 20  ->a[1].pExpr..  
1ceb0 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b    */.    case TK
1cec0 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20  _BETWEEN: {.    
1ced0 20 20 45 78 70 72 20 2a 70 58 20 3d 20 70 45 78    Expr *pX = pEx
1cee0 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20  pr->pLeft;.     
1cef0 20 45 78 70 72 20 2a 70 59 20 3d 20 70 45 78 70   Expr *pY = pExp
1cf00 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 30 5d  r->x.pList->a[0]
1cf10 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 45 78  .pExpr;.      Ex
1cf20 70 72 20 2a 70 5a 20 3d 20 70 45 78 70 72 2d 3e  pr *pZ = pExpr->
1cf30 78 2e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45  x.pList->a[1].pE
1cf40 78 70 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  xpr;.      sqlit
1cf50 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28  e3ExplainPrintf(
1cf60 70 4f 75 74 2c 20 22 42 45 54 57 45 45 4e 28 22  pOut, "BETWEEN("
1cf70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1cf80 45 78 70 6c 61 69 6e 45 78 70 72 28 70 4f 75 74  ExplainExpr(pOut
1cf90 2c 20 70 58 29 3b 0a 20 20 20 20 20 20 73 71 6c  , pX);.      sql
1cfa0 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74  ite3ExplainPrint
1cfb0 66 28 70 4f 75 74 2c 20 22 2c 22 29 3b 0a 20 20  f(pOut, ",");.  
1cfc0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
1cfd0 69 6e 45 78 70 72 28 70 4f 75 74 2c 20 70 59 29  inExpr(pOut, pY)
1cfe0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1cff0 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75  xplainPrintf(pOu
1d000 74 2c 20 22 2c 22 29 3b 0a 20 20 20 20 20 20 73  t, ",");.      s
1d010 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70  qlite3ExplainExp
1d020 72 28 70 4f 75 74 2c 20 70 5a 29 3b 0a 20 20 20  r(pOut, pZ);.   
1d030 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
1d040 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 29  nPrintf(pOut, ")
1d050 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ");.      break;
1d060 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1d070 54 4b 5f 54 52 49 47 47 45 52 3a 20 7b 0a 20 20  TK_TRIGGER: {.  
1d080 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 70      /* If the op
1d090 63 6f 64 65 20 69 73 20 54 4b 5f 54 52 49 47 47  code is TK_TRIGG
1d0a0 45 52 2c 20 74 68 65 6e 20 74 68 65 20 65 78 70  ER, then the exp
1d0b0 72 65 73 73 69 6f 6e 20 69 73 20 61 20 72 65 66  ression is a ref
1d0c0 65 72 65 6e 63 65 0a 20 20 20 20 20 20 2a 2a 20  erence.      ** 
1d0d0 74 6f 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74  to a column in t
1d0e0 68 65 20 6e 65 77 2e 2a 20 6f 72 20 6f 6c 64 2e  he new.* or old.
1d0f0 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 73 20  * pseudo-tables 
1d100 61 76 61 69 6c 61 62 6c 65 20 74 6f 0a 20 20 20  available to.   
1d110 20 20 20 2a 2a 20 74 72 69 67 67 65 72 20 70 72     ** trigger pr
1d120 6f 67 72 61 6d 73 2e 20 49 6e 20 74 68 69 73 20  ograms. In this 
1d130 63 61 73 65 20 45 78 70 72 2e 69 54 61 62 6c 65  case Expr.iTable
1d140 20 69 73 20 73 65 74 20 74 6f 20 31 20 66 6f 72   is set to 1 for
1d150 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6e 65   the.      ** ne
1d160 77 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65  w.* pseudo-table
1d170 2c 20 6f 72 20 30 20 66 6f 72 20 74 68 65 20 6f  , or 0 for the o
1d180 6c 64 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c  ld.* pseudo-tabl
1d190 65 2e 20 45 78 70 72 2e 69 43 6f 6c 75 6d 6e 0a  e. Expr.iColumn.
1d1a0 20 20 20 20 20 20 2a 2a 20 69 73 20 73 65 74 20        ** is set 
1d1b0 74 6f 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6f 66  to the column of
1d1c0 20 74 68 65 20 70 73 65 75 64 6f 2d 74 61 62 6c   the pseudo-tabl
1d1d0 65 20 74 6f 20 72 65 61 64 2c 20 6f 72 20 74 6f  e to read, or to
1d1e0 20 2d 31 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20   -1 to.      ** 
1d1f0 72 65 61 64 20 74 68 65 20 72 6f 77 69 64 20 66  read the rowid f
1d200 69 65 6c 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ield..      */. 
1d210 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c       sqlite3Expl
1d220 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20  ainPrintf(pOut, 
1d230 22 25 73 28 25 64 29 22 2c 20 0a 20 20 20 20 20  "%s(%d)", .     
1d240 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62       pExpr->iTab
1d250 6c 65 20 3f 20 22 4e 45 57 22 20 3a 20 22 4f 4c  le ? "NEW" : "OL
1d260 44 22 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  D", pExpr->iColu
1d270 6d 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  mn);.      break
1d280 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1d290 20 54 4b 5f 43 41 53 45 3a 20 7b 0a 20 20 20 20   TK_CASE: {.    
1d2a0 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
1d2b0 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 43 41  Printf(pOut, "CA
1d2c0 53 45 28 22 29 3b 0a 20 20 20 20 20 20 73 71 6c  SE(");.      sql
1d2d0 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72 28  ite3ExplainExpr(
1d2e0 70 4f 75 74 2c 20 70 45 78 70 72 2d 3e 70 4c 65  pOut, pExpr->pLe
1d2f0 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ft);.      sqlit
1d300 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28  e3ExplainPrintf(
1d310 70 4f 75 74 2c 20 22 2c 22 29 3b 0a 20 20 20 20  pOut, ",");.    
1d320 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
1d330 45 78 70 72 4c 69 73 74 28 70 4f 75 74 2c 20 70  ExprList(pOut, p
1d340 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a  Expr->x.pList);.
1d350 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1d360 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
1d370 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a 20  E_OMIT_TRIGGER. 
1d380 20 20 20 63 61 73 65 20 54 4b 5f 52 41 49 53 45     case TK_RAISE
1d390 3a 20 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20  : {.      const 
1d3a0 63 68 61 72 20 2a 7a 54 79 70 65 20 3d 20 22 75  char *zType = "u
1d3b0 6e 6b 22 3b 0a 20 20 20 20 20 20 73 77 69 74 63  nk";.      switc
1d3c0 68 28 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69  h( pExpr->affini
1d3d0 74 79 20 29 7b 0a 20 20 20 20 20 20 20 20 63 61  ty ){.        ca
1d3e0 73 65 20 4f 45 5f 52 6f 6c 6c 62 61 63 6b 3a 20  se OE_Rollback: 
1d3f0 20 20 7a 54 79 70 65 20 3d 20 22 72 6f 6c 6c 62    zType = "rollb
1d400 61 63 6b 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20  ack";  break;.  
1d410 20 20 20 20 20 20 63 61 73 65 20 4f 45 5f 41 62        case OE_Ab
1d420 6f 72 74 3a 20 20 20 20 20 20 7a 54 79 70 65 20  ort:      zType 
1d430 3d 20 22 61 62 6f 72 74 22 3b 20 20 20 20 20 62  = "abort";     b
1d440 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61  reak;.        ca
1d450 73 65 20 4f 45 5f 46 61 69 6c 3a 20 20 20 20 20  se OE_Fail:     
1d460 20 20 7a 54 79 70 65 20 3d 20 22 66 61 69 6c 22    zType = "fail"
1d470 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ;      break;.  
1d480 20 20 20 20 20 20 63 61 73 65 20 4f 45 5f 49 67        case OE_Ig
1d490 6e 6f 72 65 3a 20 20 20 20 20 7a 54 79 70 65 20  nore:     zType 
1d4a0 3d 20 22 69 67 6e 6f 72 65 22 3b 20 20 20 20 62  = "ignore";    b
1d4b0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
1d4c0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
1d4d0 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22  inPrintf(pOut, "
1d4e0 52 41 49 53 45 2d 25 73 28 25 73 29 22 2c 20 7a  RAISE-%s(%s)", z
1d4f0 54 79 70 65 2c 20 70 45 78 70 72 2d 3e 75 2e 7a  Type, pExpr->u.z
1d500 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 62 72  Token);.      br
1d510 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
1d520 66 0a 20 20 7d 0a 20 20 69 66 28 20 7a 42 69 6e  f.  }.  if( zBin
1d530 4f 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  Op ){.    sqlite
1d540 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70  3ExplainPrintf(p
1d550 4f 75 74 2c 22 25 73 28 22 2c 20 7a 42 69 6e 4f  Out,"%s(", zBinO
1d560 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  p);.    sqlite3E
1d570 78 70 6c 61 69 6e 45 78 70 72 28 70 4f 75 74 2c  xplainExpr(pOut,
1d580 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a   pExpr->pLeft);.
1d590 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
1d5a0 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 22 2c  inPrintf(pOut,",
1d5b0 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  ");.    sqlite3E
1d5c0 78 70 6c 61 69 6e 45 78 70 72 28 70 4f 75 74 2c  xplainExpr(pOut,
1d5d0 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b   pExpr->pRight);
1d5e0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c  .    sqlite3Expl
1d5f0 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 22  ainPrintf(pOut,"
1d600 29 22 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  )");.  }else if(
1d610 20 7a 55 6e 69 4f 70 20 29 7b 0a 20 20 20 20 73   zUniOp ){.    s
1d620 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69  qlite3ExplainPri
1d630 6e 74 66 28 70 4f 75 74 2c 22 25 73 28 22 2c 20  ntf(pOut,"%s(", 
1d640 7a 55 6e 69 4f 70 29 3b 0a 20 20 20 20 73 71 6c  zUniOp);.    sql
1d650 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72 28  ite3ExplainExpr(
1d660 70 4f 75 74 2c 20 70 45 78 70 72 2d 3e 70 4c 65  pOut, pExpr->pLe
1d670 66 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ft);.    sqlite3
1d680 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f  ExplainPrintf(pO
1d690 75 74 2c 22 29 22 29 3b 0a 20 20 7d 0a 7d 0a 23  ut,")");.  }.}.#
1d6a0 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64  endif /* defined
1d6b0 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 54  (SQLITE_ENABLE_T
1d6c0 52 45 45 5f 45 58 50 4c 41 49 4e 29 20 2a 2f 0a  REE_EXPLAIN) */.
1d6d0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
1d6e0 49 54 45 5f 45 4e 41 42 4c 45 5f 54 52 45 45 5f  ITE_ENABLE_TREE_
1d6f0 45 58 50 4c 41 49 4e 29 0a 2f 2a 0a 2a 2a 20 47  EXPLAIN)./*.** G
1d700 65 6e 65 72 61 74 65 20 61 20 68 75 6d 61 6e 2d  enerate a human-
1d710 72 65 61 64 61 62 6c 65 20 65 78 70 6c 61 6e 61  readable explana
1d720 74 69 6f 6e 20 6f 66 20 61 6e 20 65 78 70 72 65  tion of an expre
1d730 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2f 0a 76  ssion list..*/.v
1d740 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 6c 61  oid sqlite3Expla
1d750 69 6e 45 78 70 72 4c 69 73 74 28 56 64 62 65 20  inExprList(Vdbe 
1d760 2a 70 4f 75 74 2c 20 45 78 70 72 4c 69 73 74 20  *pOut, ExprList 
1d770 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69  *pList){.  int i
1d780 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ;.  if( pList==0
1d790 20 7c 7c 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72   || pList->nExpr
1d7a0 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
1d7b0 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28  e3ExplainPrintf(
1d7c0 70 4f 75 74 2c 20 22 28 65 6d 70 74 79 2d 6c 69  pOut, "(empty-li
1d7d0 73 74 29 22 29 3b 0a 20 20 20 20 72 65 74 75 72  st)");.    retur
1d7e0 6e 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  n;.  }else if( p
1d7f0 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 31 20 29  List->nExpr==1 )
1d800 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
1d810 6c 61 69 6e 45 78 70 72 28 70 4f 75 74 2c 20 70  lainExpr(pOut, p
1d820 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
1d830 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1d840 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 75  sqlite3ExplainPu
1d850 73 68 28 70 4f 75 74 29 3b 0a 20 20 20 20 66 6f  sh(pOut);.    fo
1d860 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  r(i=0; i<pList->
1d870 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
1d880 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
1d890 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 69  nPrintf(pOut, "i
1d8a0 74 65 6d 5b 25 64 5d 20 3d 20 22 2c 20 69 29 3b  tem[%d] = ", i);
1d8b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1d8c0 70 6c 61 69 6e 50 75 73 68 28 70 4f 75 74 29 3b  plainPush(pOut);
1d8d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1d8e0 70 6c 61 69 6e 45 78 70 72 28 70 4f 75 74 2c 20  plainExpr(pOut, 
1d8f0 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
1d900 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  r);.      sqlite
1d910 33 45 78 70 6c 61 69 6e 50 6f 70 28 70 4f 75 74  3ExplainPop(pOut
1d920 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 69  );.      if( pLi
1d930 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 29  st->a[i].zName )
1d940 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1d950 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70  3ExplainPrintf(p
1d960 4f 75 74 2c 20 22 20 41 53 20 25 73 22 2c 20 70  Out, " AS %s", p
1d970 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
1d980 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1d990 20 69 66 28 20 70 4c 69 73 74 2d 3e 61 5b 69 5d   if( pList->a[i]
1d9a0 2e 62 53 70 61 6e 49 73 54 61 62 20 29 7b 0a 20  .bSpanIsTab ){. 
1d9b0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
1d9c0 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74  plainPrintf(pOut
1d9d0 2c 20 22 20 28 25 73 29 22 2c 20 70 4c 69 73 74  , " (%s)", pList
1d9e0 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 29 3b 0a 20  ->a[i].zSpan);. 
1d9f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
1da00 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d   i<pList->nExpr-
1da10 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  1 ){.        sql
1da20 69 74 65 33 45 78 70 6c 61 69 6e 4e 4c 28 70 4f  ite3ExplainNL(pO
1da30 75 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ut);.      }.   
1da40 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78   }.    sqlite3Ex
1da50 70 6c 61 69 6e 50 6f 70 28 70 4f 75 74 29 3b 0a  plainPop(pOut);.
1da60 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20    }.}.#endif /* 
1da70 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a  SQLITE_DEBUG */.
1da80 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
1da90 63 6f 64 65 20 74 68 61 74 20 70 75 73 68 65 73  code that pushes
1daa0 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 65 76   the value of ev
1dab0 65 72 79 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74  ery element of t
1dac0 68 65 20 67 69 76 65 6e 0a 2a 2a 20 65 78 70 72  he given.** expr
1dad0 65 73 73 69 6f 6e 20 6c 69 73 74 20 69 6e 74 6f  ession list into
1dae0 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20 72   a sequence of r
1daf0 65 67 69 73 74 65 72 73 20 62 65 67 69 6e 6e 69  egisters beginni
1db00 6e 67 20 61 74 20 74 61 72 67 65 74 2e 0a 2a 2a  ng at target..**
1db10 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
1db20 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74  umber of element
1db30 73 20 65 76 61 6c 75 61 74 65 64 2e 0a 2a 2a 0a  s evaluated..**.
1db40 2a 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 45 43  ** The SQLITE_EC
1db50 45 4c 5f 44 55 50 20 66 6c 61 67 20 70 72 65 76  EL_DUP flag prev
1db60 65 6e 74 73 20 74 68 65 20 61 72 67 75 6d 65 6e  ents the argumen
1db70 74 73 20 66 72 6f 6d 20 62 65 69 6e 67 0a 2a 2a  ts from being.**
1db80 20 66 69 6c 6c 65 64 20 75 73 69 6e 67 20 4f 50   filled using OP
1db90 5f 53 43 6f 70 79 2e 20 20 4f 50 5f 43 6f 70 79  _SCopy.  OP_Copy
1dba0 20 6d 75 73 74 20 62 65 20 75 73 65 64 20 69 6e   must be used in
1dbb0 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  stead..**.** The
1dbc0 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 46 41 43   SQLITE_ECEL_FAC
1dbd0 54 4f 52 20 61 72 67 75 6d 65 6e 74 20 61 6c 6c  TOR argument all
1dbe0 6f 77 73 20 63 6f 6e 73 74 61 6e 74 20 61 72 67  ows constant arg
1dbf0 75 6d 65 6e 74 73 20 74 6f 20 62 65 0a 2a 2a 20  uments to be.** 
1dc00 66 61 63 74 6f 72 65 64 20 6f 75 74 20 69 6e 74  factored out int
1dc10 6f 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  o initialization
1dc20 20 63 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71   code..*/.int sq
1dc30 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70  lite3ExprCodeExp
1dc40 72 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20 2a  rList(.  Parse *
1dc50 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 50  pParse,     /* P
1dc60 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
1dc70 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  /.  ExprList *pL
1dc80 69 73 74 2c 20 20 20 2f 2a 20 54 68 65 20 65 78  ist,   /* The ex
1dc90 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 74 6f  pression list to
1dca0 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69   be coded */.  i
1dcb0 6e 74 20 74 61 72 67 65 74 2c 20 20 20 20 20 20  nt target,      
1dcc0 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 77 72    /* Where to wr
1dcd0 69 74 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20  ite results */. 
1dce0 20 75 38 20 66 6c 61 67 73 20 20 20 20 20 20 20   u8 flags       
1dcf0 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 45 43      /* SQLITE_EC
1dd00 45 4c 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a 29 7b  EL_* flags */.){
1dd10 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69  .  struct ExprLi
1dd20 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
1dd30 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 75 38    int i, n;.  u8
1dd40 20 63 6f 70 79 4f 70 20 3d 20 28 66 6c 61 67 73   copyOp = (flags
1dd50 20 26 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44   & SQLITE_ECEL_D
1dd60 55 50 29 20 3f 20 4f 50 5f 43 6f 70 79 20 3a 20  UP) ? OP_Copy : 
1dd70 4f 50 5f 53 43 6f 70 79 3b 0a 20 20 61 73 73 65  OP_SCopy;.  asse
1dd80 72 74 28 20 70 4c 69 73 74 21 3d 30 20 29 3b 0a  rt( pList!=0 );.
1dd90 20 20 61 73 73 65 72 74 28 20 74 61 72 67 65 74    assert( target
1dda0 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
1ddb0 70 50 61 72 73 65 2d 3e 70 56 64 62 65 21 3d 30  pParse->pVdbe!=0
1ddc0 20 29 3b 20 20 2f 2a 20 4e 65 76 65 72 20 67 65   );  /* Never ge
1ddd0 74 73 20 74 68 69 73 20 66 61 72 20 6f 74 68 65  ts this far othe
1dde0 72 77 69 73 65 20 2a 2f 0a 20 20 6e 20 3d 20 70  rwise */.  n = p
1ddf0 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 69  List->nExpr;.  i
1de00 66 28 20 21 43 6f 6e 73 74 46 61 63 74 6f 72 4f  f( !ConstFactorO
1de10 6b 28 70 50 61 72 73 65 29 20 29 20 66 6c 61 67  k(pParse) ) flag
1de20 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 45 43 45  s &= ~SQLITE_ECE
1de30 4c 5f 46 41 43 54 4f 52 3b 0a 20 20 66 6f 72 28  L_FACTOR;.  for(
1de40 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20  pItem=pList->a, 
1de50 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 2c 20 70  i=0; i<n; i++, p
1de60 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70  Item++){.    Exp
1de70 72 20 2a 70 45 78 70 72 20 3d 20 70 49 74 65 6d  r *pExpr = pItem
1de80 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28  ->pExpr;.    if(
1de90 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
1dea0 5f 45 43 45 4c 5f 46 41 43 54 4f 52 29 21 3d 30  _ECEL_FACTOR)!=0
1deb0 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 49   && sqlite3ExprI
1dec0 73 43 6f 6e 73 74 61 6e 74 28 70 45 78 70 72 29  sConstant(pExpr)
1ded0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
1dee0 33 45 78 70 72 43 6f 64 65 41 74 49 6e 69 74 28  3ExprCodeAtInit(
1def0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74  pParse, pExpr, t
1df00 61 72 67 65 74 2b 69 2c 20 30 29 3b 0a 20 20 20  arget+i, 0);.   
1df10 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e   }else{.      in
1df20 74 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65  t inReg = sqlite
1df30 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28  3ExprCodeTarget(
1df40 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74  pParse, pExpr, t
1df50 61 72 67 65 74 2b 69 29 3b 0a 20 20 20 20 20 20  arget+i);.      
1df60 69 66 28 20 69 6e 52 65 67 21 3d 74 61 72 67 65  if( inReg!=targe
1df70 74 2b 69 20 29 7b 0a 20 20 20 20 20 20 20 20 56  t+i ){.        V
1df80 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 20 20  dbeOp *pOp;.    
1df90 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50      Vdbe *v = pP
1dfa0 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 20  arse->pVdbe;.   
1dfb0 20 20 20 20 20 69 66 28 20 63 6f 70 79 4f 70 3d       if( copyOp=
1dfc0 3d 4f 50 5f 43 6f 70 79 0a 20 20 20 20 20 20 20  =OP_Copy.       
1dfd0 20 20 26 26 20 28 70 4f 70 3d 73 71 6c 69 74 65    && (pOp=sqlite
1dfe0 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20 2d 31  3VdbeGetOp(v, -1
1dff0 29 29 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43  ))->opcode==OP_C
1e000 6f 70 79 0a 20 20 20 20 20 20 20 20 20 26 26 20  opy.         && 
1e010 70 4f 70 2d 3e 70 31 2b 70 4f 70 2d 3e 70 33 2b  pOp->p1+pOp->p3+
1e020 31 3d 3d 69 6e 52 65 67 0a 20 20 20 20 20 20 20  1==inReg.       
1e030 20 20 26 26 20 70 4f 70 2d 3e 70 32 2b 70 4f 70    && pOp->p2+pOp
1e040 2d 3e 70 33 2b 31 3d 3d 74 61 72 67 65 74 2b 69  ->p3+1==target+i
1e050 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
1e060 20 20 20 20 20 20 70 4f 70 2d 3e 70 33 2b 2b 3b        pOp->p3++;
1e070 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
1e080 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1e090 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 63  3VdbeAddOp2(v, c
1e0a0 6f 70 79 4f 70 2c 20 69 6e 52 65 67 2c 20 74 61  opyOp, inReg, ta
1e0b0 72 67 65 74 2b 69 29 3b 0a 20 20 20 20 20 20 20  rget+i);.       
1e0c0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
1e0d0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b  .  }.  return n;
1e0e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
1e0f0 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20 42 45  te code for a BE
1e100 54 57 45 45 4e 20 6f 70 65 72 61 74 6f 72 2e 0a  TWEEN operator..
1e110 2a 2a 0a 2a 2a 20 20 20 20 78 20 42 45 54 57 45  **.**    x BETWE
1e120 45 4e 20 79 20 41 4e 44 20 7a 0a 2a 2a 0a 2a 2a  EN y AND z.**.**
1e130 20 54 68 65 20 61 62 6f 76 65 20 69 73 20 65 71   The above is eq
1e140 75 69 76 61 6c 65 6e 74 20 74 6f 20 0a 2a 2a 0a  uivalent to .**.
1e150 2a 2a 20 20 20 20 78 3e 3d 79 20 41 4e 44 20 78  **    x>=y AND x
1e160 3c 3d 7a 0a 2a 2a 0a 2a 2a 20 43 6f 64 65 20 69  <=z.**.** Code i
1e170 74 20 61 73 20 73 75 63 68 2c 20 74 61 6b 69 6e  t as such, takin
1e180 67 20 63 61 72 65 20 74 6f 20 64 6f 20 74 68 65  g care to do the
1e190 20 63 6f 6d 6d 6f 6e 20 73 75 62 65 78 70 72 65   common subexpre
1e1a0 73 73 69 6f 6e 0a 2a 2a 20 65 6c 69 6d 69 6e 61  ssion.** elimina
1e1b0 74 69 6f 6e 20 6f 66 20 78 2e 0a 2a 2f 0a 73 74  tion of x..*/.st
1e1c0 61 74 69 63 20 76 6f 69 64 20 65 78 70 72 43 6f  atic void exprCo
1e1d0 64 65 42 65 74 77 65 65 6e 28 0a 20 20 50 61 72  deBetween(.  Par
1e1e0 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f  se *pParse,    /
1e1f0 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f  * Parsing and co
1e200 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f  de generating co
1e210 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20  ntext */.  Expr 
1e220 2a 70 45 78 70 72 2c 20 20 20 20 20 20 2f 2a 20  *pExpr,      /* 
1e230 54 68 65 20 42 45 54 57 45 45 4e 20 65 78 70 72  The BETWEEN expr
1e240 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ession */.  int 
1e250 64 65 73 74 2c 20 20 20 20 20 20 20 20 20 2f 2a  dest,         /*
1e260 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 74 68   Jump here if th
1e270 65 20 6a 75 6d 70 20 69 73 20 74 61 6b 65 6e 20  e jump is taken 
1e280 2a 2f 0a 20 20 69 6e 74 20 6a 75 6d 70 49 66 54  */.  int jumpIfT
1e290 72 75 65 2c 20 20 20 2f 2a 20 54 61 6b 65 20 74  rue,   /* Take t
1e2a0 68 65 20 6a 75 6d 70 20 69 66 20 74 68 65 20 42  he jump if the B
1e2b0 45 54 57 45 45 4e 20 69 73 20 74 72 75 65 20 2a  ETWEEN is true *
1e2c0 2f 0a 20 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75  /.  int jumpIfNu
1e2d0 6c 6c 20 20 20 20 2f 2a 20 54 61 6b 65 20 74 68  ll    /* Take th
1e2e0 65 20 6a 75 6d 70 20 69 66 20 74 68 65 20 42 45  e jump if the BE
1e2f0 54 57 45 45 4e 20 69 73 20 4e 55 4c 4c 20 2a 2f  TWEEN is NULL */
1e300 0a 29 7b 0a 20 20 45 78 70 72 20 65 78 70 72 41  .){.  Expr exprA
1e310 6e 64 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 41  nd;     /* The A
1e320 4e 44 20 6f 70 65 72 61 74 6f 72 20 69 6e 20 20  ND operator in  
1e330 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 20 20 2a  x>=y AND x<=z  *
1e340 2f 0a 20 20 45 78 70 72 20 63 6f 6d 70 4c 65 66  /.  Expr compLef
1e350 74 3b 20 20 20 20 2f 2a 20 54 68 65 20 20 78 3e  t;    /* The  x>
1e360 3d 79 20 20 74 65 72 6d 20 2a 2f 0a 20 20 45 78  =y  term */.  Ex
1e370 70 72 20 63 6f 6d 70 52 69 67 68 74 3b 20 20 20  pr compRight;   
1e380 2f 2a 20 54 68 65 20 20 78 3c 3d 7a 20 20 74 65  /* The  x<=z  te
1e390 72 6d 20 2a 2f 0a 20 20 45 78 70 72 20 65 78 70  rm */.  Expr exp
1e3a0 72 58 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  rX;       /* The
1e3b0 20 20 78 20 20 73 75 62 65 78 70 72 65 73 73 69    x  subexpressi
1e3c0 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 46  on */.  int regF
1e3d0 72 65 65 31 20 3d 20 30 3b 20 2f 2a 20 54 65 6d  ree1 = 0; /* Tem
1e3e0 70 6f 72 61 72 79 20 75 73 65 20 72 65 67 69 73  porary use regis
1e3f0 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ter */..  assert
1e400 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
1e410 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73  ty(pExpr, EP_xIs
1e420 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 65 78 70  Select) );.  exp
1e430 72 58 20 3d 20 2a 70 45 78 70 72 2d 3e 70 4c 65  rX = *pExpr->pLe
1e440 66 74 3b 0a 20 20 65 78 70 72 41 6e 64 2e 6f 70  ft;.  exprAnd.op
1e450 20 3d 20 54 4b 5f 41 4e 44 3b 0a 20 20 65 78 70   = TK_AND;.  exp
1e460 72 41 6e 64 2e 70 4c 65 66 74 20 3d 20 26 63 6f  rAnd.pLeft = &co
1e470 6d 70 4c 65 66 74 3b 0a 20 20 65 78 70 72 41 6e  mpLeft;.  exprAn
1e480 64 2e 70 52 69 67 68 74 20 3d 20 26 63 6f 6d 70  d.pRight = &comp
1e490 52 69 67 68 74 3b 0a 20 20 63 6f 6d 70 4c 65 66  Right;.  compLef
1e4a0 74 2e 6f 70 20 3d 20 54 4b 5f 47 45 3b 0a 20 20  t.op = TK_GE;.  
1e4b0 63 6f 6d 70 4c 65 66 74 2e 70 4c 65 66 74 20 3d  compLeft.pLeft =
1e4c0 20 26 65 78 70 72 58 3b 0a 20 20 63 6f 6d 70 4c   &exprX;.  compL
1e4d0 65 66 74 2e 70 52 69 67 68 74 20 3d 20 70 45 78  eft.pRight = pEx
1e4e0 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 30  pr->x.pList->a[0
1e4f0 5d 2e 70 45 78 70 72 3b 0a 20 20 63 6f 6d 70 52  ].pExpr;.  compR
1e500 69 67 68 74 2e 6f 70 20 3d 20 54 4b 5f 4c 45 3b  ight.op = TK_LE;
1e510 0a 20 20 63 6f 6d 70 52 69 67 68 74 2e 70 4c 65  .  compRight.pLe
1e520 66 74 20 3d 20 26 65 78 70 72 58 3b 0a 20 20 63  ft = &exprX;.  c
1e530 6f 6d 70 52 69 67 68 74 2e 70 52 69 67 68 74 20  ompRight.pRight 
1e540 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  = pExpr->x.pList
1e550 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[1].pExpr;.  
1e560 65 78 70 72 54 6f 52 65 67 69 73 74 65 72 28 26  exprToRegister(&
1e570 65 78 70 72 58 2c 20 73 71 6c 69 74 65 33 45 78  exprX, sqlite3Ex
1e580 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
1e590 65 2c 20 26 65 78 70 72 58 2c 20 26 72 65 67 46  e, &exprX, &regF
1e5a0 72 65 65 31 29 29 3b 0a 20 20 69 66 28 20 6a 75  ree1));.  if( ju
1e5b0 6d 70 49 66 54 72 75 65 20 29 7b 0a 20 20 20 20  mpIfTrue ){.    
1e5c0 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75  sqlite3ExprIfTru
1e5d0 65 28 70 50 61 72 73 65 2c 20 26 65 78 70 72 41  e(pParse, &exprA
1e5e0 6e 64 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  nd, dest, jumpIf
1e5f0 4e 75 6c 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Null);.  }else{.
1e600 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
1e610 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 26  fFalse(pParse, &
1e620 65 78 70 72 41 6e 64 2c 20 64 65 73 74 2c 20 6a  exprAnd, dest, j
1e630 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 7d 0a  umpIfNull);.  }.
1e640 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
1e650 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
1e660 72 65 67 46 72 65 65 31 29 3b 0a 0a 20 20 2f 2a  regFree1);..  /*
1e670 20 45 6e 73 75 72 65 20 61 64 65 71 75 61 74 65   Ensure adequate
1e680 20 74 65 73 74 20 63 6f 76 65 72 61 67 65 20 2a   test coverage *
1e690 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20 6a 75  /.  testcase( ju
1e6a0 6d 70 49 66 54 72 75 65 3d 3d 30 20 26 26 20 6a  mpIfTrue==0 && j
1e6b0 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26 20  umpIfNull==0 && 
1e6c0 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
1e6d0 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
1e6e0 66 54 72 75 65 3d 3d 30 20 26 26 20 6a 75 6d 70  fTrue==0 && jump
1e6f0 49 66 4e 75 6c 6c 3d 3d 30 20 26 26 20 72 65 67  IfNull==0 && reg
1e700 46 72 65 65 31 21 3d 30 20 29 3b 0a 20 20 74 65  Free1!=0 );.  te
1e710 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 54 72  stcase( jumpIfTr
1e720 75 65 3d 3d 30 20 26 26 20 6a 75 6d 70 49 66 4e  ue==0 && jumpIfN
1e730 75 6c 6c 21 3d 30 20 26 26 20 72 65 67 46 72 65  ull!=0 && regFre
1e740 65 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74 63  e1==0 );.  testc
1e750 61 73 65 28 20 6a 75 6d 70 49 66 54 72 75 65 3d  ase( jumpIfTrue=
1e760 3d 30 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c  =0 && jumpIfNull
1e770 21 3d 30 20 26 26 20 72 65 67 46 72 65 65 31 21  !=0 && regFree1!
1e780 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =0 );.  testcase
1e790 28 20 6a 75 6d 70 49 66 54 72 75 65 21 3d 30 20  ( jumpIfTrue!=0 
1e7a0 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  && jumpIfNull==0
1e7b0 20 26 26 20 72 65 67 46 72 65 65 31 3d 3d 30 20   && regFree1==0 
1e7c0 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6a  );.  testcase( j
1e7d0 75 6d 70 49 66 54 72 75 65 21 3d 30 20 26 26 20  umpIfTrue!=0 && 
1e7e0 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26  jumpIfNull==0 &&
1e7f0 20 72 65 67 46 72 65 65 31 21 3d 30 20 29 3b 0a   regFree1!=0 );.
1e800 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
1e810 49 66 54 72 75 65 21 3d 30 20 26 26 20 6a 75 6d  IfTrue!=0 && jum
1e820 70 49 66 4e 75 6c 6c 21 3d 30 20 26 26 20 72 65  pIfNull!=0 && re
1e830 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 74  gFree1==0 );.  t
1e840 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 54  estcase( jumpIfT
1e850 72 75 65 21 3d 30 20 26 26 20 6a 75 6d 70 49 66  rue!=0 && jumpIf
1e860 4e 75 6c 6c 21 3d 30 20 26 26 20 72 65 67 46 72  Null!=0 && regFr
1e870 65 65 31 21 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a  ee1!=0 );.}../*.
1e880 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
1e890 20 66 6f 72 20 61 20 62 6f 6f 6c 65 61 6e 20 65   for a boolean e
1e8a0 78 70 72 65 73 73 69 6f 6e 20 73 75 63 68 20 74  xpression such t
1e8b0 68 61 74 20 61 20 6a 75 6d 70 20 69 73 20 6d 61  hat a jump is ma
1e8c0 64 65 0a 2a 2a 20 74 6f 20 74 68 65 20 6c 61 62  de.** to the lab
1e8d0 65 6c 20 22 64 65 73 74 22 20 69 66 20 74 68 65  el "dest" if the
1e8e0 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74   expression is t
1e8f0 72 75 65 20 62 75 74 20 65 78 65 63 75 74 69 6f  rue but executio
1e900 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 73 20 73  n.** continues s
1e910 74 72 61 69 67 68 74 20 74 68 72 75 20 69 66 20  traight thru if 
1e920 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
1e930 73 20 66 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20 49  s false..**.** I
1e940 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
1e950 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20 4e 55   evaluates to NU
1e960 4c 4c 20 28 6e 65 69 74 68 65 72 20 74 72 75 65  LL (neither true
1e970 20 6e 6f 72 20 66 61 6c 73 65 29 2c 20 74 68 65   nor false), the
1e980 6e 0a 2a 2a 20 74 61 6b 65 20 74 68 65 20 6a 75  n.** take the ju
1e990 6d 70 20 69 66 20 74 68 65 20 6a 75 6d 70 49 66  mp if the jumpIf
1e9a0 4e 75 6c 6c 20 66 6c 61 67 20 69 73 20 53 51 4c  Null flag is SQL
1e9b0 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 2e 0a  ITE_JUMPIFNULL..
1e9c0 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 6f 64 65 20  **.** This code 
1e9d0 64 65 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 66  depends on the f
1e9e0 61 63 74 20 74 68 61 74 20 63 65 72 74 61 69 6e  act that certain
1e9f0 20 74 6f 6b 65 6e 20 76 61 6c 75 65 73 20 28 65   token values (e
1ea00 78 3a 20 54 4b 5f 45 51 29 0a 2a 2a 20 61 72 65  x: TK_EQ).** are
1ea10 20 74 68 65 20 73 61 6d 65 20 61 73 20 6f 70 63   the same as opc
1ea20 6f 64 65 20 76 61 6c 75 65 73 20 28 65 78 3a 20  ode values (ex: 
1ea30 4f 50 5f 45 71 29 20 74 68 61 74 20 69 6d 70 6c  OP_Eq) that impl
1ea40 65 6d 65 6e 74 20 74 68 65 20 63 6f 72 72 65 73  ement the corres
1ea50 70 6f 6e 64 69 6e 67 0a 2a 2a 20 6f 70 65 72 61  ponding.** opera
1ea60 74 69 6f 6e 2e 20 20 53 70 65 63 69 61 6c 20 63  tion.  Special c
1ea70 6f 6d 6d 65 6e 74 73 20 69 6e 20 76 64 62 65 2e  omments in vdbe.
1ea80 63 20 61 6e 64 20 74 68 65 20 6d 6b 6f 70 63 6f  c and the mkopco
1ea90 64 65 68 2e 61 77 6b 20 73 63 72 69 70 74 20 69  deh.awk script i
1eaa0 6e 0a 2a 2a 20 74 68 65 20 6d 61 6b 65 20 70 72  n.** the make pr
1eab0 6f 63 65 73 73 20 63 61 75 73 65 20 74 68 65 73  ocess cause thes
1eac0 65 20 76 61 6c 75 65 73 20 74 6f 20 61 6c 69 67  e values to alig
1ead0 6e 2e 20 20 41 73 73 65 72 74 28 29 73 20 69 6e  n.  Assert()s in
1eae0 20 74 68 65 20 63 6f 64 65 0a 2a 2a 20 62 65 6c   the code.** bel
1eaf0 6f 77 20 76 65 72 69 66 79 20 74 68 61 74 20 74  ow verify that t
1eb00 68 65 20 6e 75 6d 62 65 72 73 20 61 72 65 20 61  he numbers are a
1eb10 6c 69 67 6e 65 64 20 63 6f 72 72 65 63 74 6c 79  ligned correctly
1eb20 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1eb30 33 45 78 70 72 49 66 54 72 75 65 28 50 61 72 73  3ExprIfTrue(Pars
1eb40 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
1eb50 2a 70 45 78 70 72 2c 20 69 6e 74 20 64 65 73 74  *pExpr, int dest
1eb60 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c  , int jumpIfNull
1eb70 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
1eb80 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
1eb90 69 6e 74 20 6f 70 20 3d 20 30 3b 0a 20 20 69 6e  int op = 0;.  in
1eba0 74 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b 0a  t regFree1 = 0;.
1ebb0 20 20 69 6e 74 20 72 65 67 46 72 65 65 32 20 3d    int regFree2 =
1ebc0 20 30 3b 0a 20 20 69 6e 74 20 72 31 2c 20 72 32   0;.  int r1, r2
1ebd0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6a 75 6d  ;..  assert( jum
1ebe0 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f  pIfNull==SQLITE_
1ebf0 4a 55 4d 50 49 46 4e 55 4c 4c 20 7c 7c 20 6a 75  JUMPIFNULL || ju
1ec00 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
1ec10 20 69 66 28 20 4e 45 56 45 52 28 76 3d 3d 30 29   if( NEVER(v==0)
1ec20 20 29 20 20 20 20 20 72 65 74 75 72 6e 3b 20 20   )     return;  
1ec30 2f 2a 20 45 78 69 73 74 65 6e 63 65 20 6f 66 20  /* Existence of 
1ec40 56 44 42 45 20 63 68 65 63 6b 65 64 20 62 79 20  VDBE checked by 
1ec50 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 69 66 28 20  caller */.  if( 
1ec60 4e 45 56 45 52 28 70 45 78 70 72 3d 3d 30 29 20  NEVER(pExpr==0) 
1ec70 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 4e 6f  ) return;  /* No
1ec80 20 77 61 79 20 74 68 69 73 20 63 61 6e 20 68 61   way this can ha
1ec90 70 70 65 6e 20 2a 2f 0a 20 20 6f 70 20 3d 20 70  ppen */.  op = p
1eca0 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 73 77 69 74  Expr->op;.  swit
1ecb0 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61  ch( op ){.    ca
1ecc0 73 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a 20 20 20  se TK_AND: {.   
1ecd0 20 20 20 69 6e 74 20 64 32 20 3d 20 73 71 6c 69     int d2 = sqli
1ece0 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
1ecf0 28 76 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  (v);.      testc
1ed00 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  ase( jumpIfNull=
1ed10 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =0 );.      sqli
1ed20 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
1ed30 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
1ed40 65 66 74 2c 20 64 32 2c 6a 75 6d 70 49 66 4e 75  eft, d2,jumpIfNu
1ed50 6c 6c 5e 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46  ll^SQLITE_JUMPIF
1ed60 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 71 6c  NULL);.      sql
1ed70 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73  ite3ExprCachePus
1ed80 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  h(pParse);.     
1ed90 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72   sqlite3ExprIfTr
1eda0 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ue(pParse, pExpr
1edb0 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20  ->pRight, dest, 
1edc0 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
1edd0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
1ede0 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 32  solveLabel(v, d2
1edf0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1ee00 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61  ExprCachePop(pPa
1ee10 72 73 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61  rse);.      brea
1ee20 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
1ee30 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20 20  e TK_OR: {.     
1ee40 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
1ee50 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  fNull==0 );.    
1ee60 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54    sqlite3ExprIfT
1ee70 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  rue(pParse, pExp
1ee80 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20  r->pLeft, dest, 
1ee90 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
1eea0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
1eeb0 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b  chePush(pParse);
1eec0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1eed0 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c  prIfTrue(pParse,
1eee0 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
1eef0 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
1ef00 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1ef10 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61  ExprCachePop(pPa
1ef20 72 73 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61  rse);.      brea
1ef30 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
1ef40 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20  e TK_NOT: {.    
1ef50 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
1ef60 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  IfNull==0 );.   
1ef70 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
1ef80 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45  False(pParse, pE
1ef90 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74  xpr->pLeft, dest
1efa0 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
1efb0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1efc0 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54  }.    case TK_LT
1efd0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45  :.    case TK_LE
1efe0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54  :.    case TK_GT
1eff0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45  :.    case TK_GE
1f000 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45  :.    case TK_NE
1f010 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51  :.    case TK_EQ
1f020 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61  : {.      testca
1f030 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  se( jumpIfNull==
1f040 30 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20  0 );.      r1 = 
1f050 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
1f060 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
1f070 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72  r->pLeft, &regFr
1f080 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d  ee1);.      r2 =
1f090 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1f0a0 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
1f0b0 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67  pr->pRight, &reg
1f0c0 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 63 6f  Free2);.      co
1f0d0 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65  deCompare(pParse
1f0e0 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
1f0f0 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f  pExpr->pRight, o
1f100 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  p,.             
1f110 20 20 20 20 20 72 31 2c 20 72 32 2c 20 64 65 73       r1, r2, des
1f120 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
1f130 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f        assert(TK_
1f140 4c 54 3d 3d 4f 50 5f 4c 74 29 3b 20 74 65 73 74  LT==OP_Lt); test
1f150 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 74 29 3b  case(op==OP_Lt);
1f160 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
1f170 76 2c 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a 20 20  v,op==OP_Lt);.  
1f180 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4c 45      assert(TK_LE
1f190 3d 3d 4f 50 5f 4c 65 29 3b 20 74 65 73 74 63 61  ==OP_Le); testca
1f1a0 73 65 28 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 20 56  se(op==OP_Le); V
1f1b0 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
1f1c0 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 0a 20 20 20 20  op==OP_Le);.    
1f1d0 20 20 61 73 73 65 72 74 28 54 4b 5f 47 54 3d 3d    assert(TK_GT==
1f1e0 4f 50 5f 47 74 29 3b 20 74 65 73 74 63 61 73 65  OP_Gt); testcase
1f1f0 28 6f 70 3d 3d 4f 50 5f 47 74 29 3b 20 56 64 62  (op==OP_Gt); Vdb
1f200 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70  eCoverageIf(v,op
1f210 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20 20 20 20 20  ==OP_Gt);.      
1f220 61 73 73 65 72 74 28 54 4b 5f 47 45 3d 3d 4f 50  assert(TK_GE==OP
1f230 5f 47 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f  _Ge); testcase(o
1f240 70 3d 3d 4f 50 5f 47 65 29 3b 20 56 64 62 65 43  p==OP_Ge); VdbeC
1f250 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d  overageIf(v,op==
1f260 4f 50 5f 47 65 29 3b 0a 20 20 20 20 20 20 61 73  OP_Ge);.      as
1f270 73 65 72 74 28 54 4b 5f 45 51 3d 3d 4f 50 5f 45  sert(TK_EQ==OP_E
1f280 71 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d  q); testcase(op=
1f290 3d 4f 50 5f 45 71 29 3b 20 56 64 62 65 43 6f 76  =OP_Eq); VdbeCov
1f2a0 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50  erageIf(v,op==OP
1f2b0 5f 45 71 29 3b 0a 20 20 20 20 20 20 61 73 73 65  _Eq);.      asse
1f2c0 72 74 28 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 29  rt(TK_NE==OP_Ne)
1f2d0 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f  ; testcase(op==O
1f2e0 50 5f 4e 65 29 3b 20 56 64 62 65 43 6f 76 65 72  P_Ne); VdbeCover
1f2f0 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4e  ageIf(v,op==OP_N
1f300 65 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  e);.      testca
1f310 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20  se( regFree1==0 
1f320 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1f330 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29  e( regFree2==0 )
1f340 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1f350 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
1f360 5f 49 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _IS:.    case TK
1f370 5f 49 53 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20  _ISNOT: {.      
1f380 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
1f390 5f 49 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _IS );.      tes
1f3a0 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53  tcase( op==TK_IS
1f3b0 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20 72 31 20  NOT );.      r1 
1f3c0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
1f3d0 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
1f3e0 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67  xpr->pLeft, &reg
1f3f0 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32  Free1);.      r2
1f400 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1f410 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
1f420 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72  Expr->pRight, &r
1f430 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20  egFree2);.      
1f440 6f 70 20 3d 20 28 6f 70 3d 3d 54 4b 5f 49 53 29  op = (op==TK_IS)
1f450 20 3f 20 54 4b 5f 45 51 20 3a 20 54 4b 5f 4e 45   ? TK_EQ : TK_NE
1f460 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70  ;.      codeComp
1f470 61 72 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  are(pParse, pExp
1f480 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d  r->pLeft, pExpr-
1f490 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20  >pRight, op,.   
1f4a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
1f4b0 31 2c 20 72 32 2c 20 64 65 73 74 2c 20 53 51 4c  1, r2, dest, SQL
1f4c0 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20  ITE_NULLEQ);.   
1f4d0 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
1f4e0 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 45 51 29 3b  f(v, op==TK_EQ);
1f4f0 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
1f500 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f  ageIf(v, op==TK_
1f510 4e 45 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  NE);.      testc
1f520 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30  ase( regFree1==0
1f530 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
1f540 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20  se( regFree2==0 
1f550 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1f560 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
1f570 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61  K_ISNULL:.    ca
1f580 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b  se TK_NOTNULL: {
1f590 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
1f5a0 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f 50 5f 49 73 4e  K_ISNULL==OP_IsN
1f5b0 75 6c 6c 20 29 3b 20 20 20 74 65 73 74 63 61 73  ull );   testcas
1f5c0 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c  e( op==TK_ISNULL
1f5d0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1f5e0 28 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50  ( TK_NOTNULL==OP
1f5f0 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 20 74 65 73 74  _NotNull ); test
1f600 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54  case( op==TK_NOT
1f610 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 72 31  NULL );.      r1
1f620 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1f630 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
1f640 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65  Expr->pLeft, &re
1f650 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 73  gFree1);.      s
1f660 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1f670 28 76 2c 20 6f 70 2c 20 72 31 2c 20 64 65 73 74  (v, op, r1, dest
1f680 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
1f690 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54  erageIf(v, op==T
1f6a0 4b 5f 49 53 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  K_ISNULL);.     
1f6b0 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
1f6c0 76 2c 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c  v, op==TK_NOTNUL
1f6d0 4c 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  L);.      testca
1f6e0 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20  se( regFree1==0 
1f6f0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1f700 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
1f710 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20  K_BETWEEN: {.   
1f720 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d     testcase( jum
1f730 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
1f740 20 20 20 20 65 78 70 72 43 6f 64 65 42 65 74 77      exprCodeBetw
1f750 65 65 6e 28 70 50 61 72 73 65 2c 20 70 45 78 70  een(pParse, pExp
1f760 72 2c 20 64 65 73 74 2c 20 31 2c 20 6a 75 6d 70  r, dest, 1, jump
1f770 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62  IfNull);.      b
1f780 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  reak;.    }.#ifn
1f790 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1f7a0 53 55 42 51 55 45 52 59 0a 20 20 20 20 63 61 73  SUBQUERY.    cas
1f7b0 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20  e TK_IN: {.     
1f7c0 20 69 6e 74 20 64 65 73 74 49 66 46 61 6c 73 65   int destIfFalse
1f7d0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
1f7e0 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
1f7f0 20 20 69 6e 74 20 64 65 73 74 49 66 4e 75 6c 6c    int destIfNull
1f800 20 3d 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 3f 20   = jumpIfNull ? 
1f810 64 65 73 74 20 3a 20 64 65 73 74 49 66 46 61 6c  dest : destIfFal
1f820 73 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se;.      sqlite
1f830 33 45 78 70 72 43 6f 64 65 49 4e 28 70 50 61 72  3ExprCodeIN(pPar
1f840 73 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74 49  se, pExpr, destI
1f850 66 46 61 6c 73 65 2c 20 64 65 73 74 49 66 4e 75  fFalse, destIfNu
1f860 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ll);.      sqlit
1f870 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1f880 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 64 65 73 74  OP_Goto, 0, dest
1f890 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1f8a0 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
1f8b0 28 76 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29  (v, destIfFalse)
1f8c0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1f8d0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
1f8e0 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
1f8f0 20 69 66 28 20 65 78 70 72 41 6c 77 61 79 73 54   if( exprAlwaysT
1f900 72 75 65 28 70 45 78 70 72 29 20 29 7b 0a 20 20  rue(pExpr) ){.  
1f910 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1f920 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
1f930 74 6f 2c 20 30 2c 20 64 65 73 74 29 3b 0a 20 20  to, 0, dest);.  
1f940 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 78      }else if( ex
1f950 70 72 41 6c 77 61 79 73 46 61 6c 73 65 28 70 45  prAlwaysFalse(pE
1f960 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  xpr) ){.        
1f970 2f 2a 20 4e 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20  /* No-op */.    
1f980 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1f990 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r1 = sqlite3Exp
1f9a0 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
1f9b0 2c 20 70 45 78 70 72 2c 20 26 72 65 67 46 72 65  , pExpr, &regFre
1f9c0 65 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  e1);.        sql
1f9d0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
1f9e0 2c 20 4f 50 5f 49 66 2c 20 72 31 2c 20 64 65 73  , OP_If, r1, des
1f9f0 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30  t, jumpIfNull!=0
1fa00 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43  );.        VdbeC
1fa10 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
1fa20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
1fa30 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20  gFree1==0 );.   
1fa40 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
1fa50 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
1fa60 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
1fa70 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
1fa80 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
1fa90 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
1faa0 65 67 46 72 65 65 31 29 3b 0a 20 20 73 71 6c 69  egFree1);.  sqli
1fab0 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
1fac0 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65  g(pParse, regFre
1fad0 65 32 29 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  e2);  .}../*.** 
1fae0 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
1faf0 72 20 61 20 62 6f 6f 6c 65 61 6e 20 65 78 70 72  r a boolean expr
1fb00 65 73 73 69 6f 6e 20 73 75 63 68 20 74 68 61 74  ession such that
1fb10 20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 0a   a jump is made.
1fb20 2a 2a 20 74 6f 20 74 68 65 20 6c 61 62 65 6c 20  ** to the label 
1fb30 22 64 65 73 74 22 20 69 66 20 74 68 65 20 65 78  "dest" if the ex
1fb40 70 72 65 73 73 69 6f 6e 20 69 73 20 66 61 6c 73  pression is fals
1fb50 65 20 62 75 74 20 65 78 65 63 75 74 69 6f 6e 0a  e but execution.
1fb60 2a 2a 20 63 6f 6e 74 69 6e 75 65 73 20 73 74 72  ** continues str
1fb70 61 69 67 68 74 20 74 68 72 75 20 69 66 20 74 68  aight thru if th
1fb80 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
1fb90 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  true..**.** If t
1fba0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 65 76  he expression ev
1fbb0 61 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c 20  aluates to NULL 
1fbc0 28 6e 65 69 74 68 65 72 20 74 72 75 65 20 6e 6f  (neither true no
1fbd0 72 20 66 61 6c 73 65 29 20 74 68 65 6e 0a 2a 2a  r false) then.**
1fbe0 20 6a 75 6d 70 20 69 66 20 6a 75 6d 70 49 66 4e   jump if jumpIfN
1fbf0 75 6c 6c 20 69 73 20 53 51 4c 49 54 45 5f 4a 55  ull is SQLITE_JU
1fc00 4d 50 49 46 4e 55 4c 4c 20 6f 72 20 66 61 6c 6c  MPIFNULL or fall
1fc10 20 74 68 72 6f 75 67 68 20 69 66 20 6a 75 6d 70   through if jump
1fc20 49 66 4e 75 6c 6c 0a 2a 2a 20 69 73 20 30 2e 0a  IfNull.** is 0..
1fc30 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
1fc40 78 70 72 49 66 46 61 6c 73 65 28 50 61 72 73 65  xprIfFalse(Parse
1fc50 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
1fc60 70 45 78 70 72 2c 20 69 6e 74 20 64 65 73 74 2c  pExpr, int dest,
1fc70 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29   int jumpIfNull)
1fc80 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
1fc90 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
1fca0 6e 74 20 6f 70 20 3d 20 30 3b 0a 20 20 69 6e 74  nt op = 0;.  int
1fcb0 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b 0a 20   regFree1 = 0;. 
1fcc0 20 69 6e 74 20 72 65 67 46 72 65 65 32 20 3d 20   int regFree2 = 
1fcd0 30 3b 0a 20 20 69 6e 74 20 72 31 2c 20 72 32 3b  0;.  int r1, r2;
1fce0 0a 0a 20 20 61 73 73 65 72 74 28 20 6a 75 6d 70  ..  assert( jump
1fcf0 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4a  IfNull==SQLITE_J
1fd00 55 4d 50 49 46 4e 55 4c 4c 20 7c 7c 20 6a 75 6d  UMPIFNULL || jum
1fd10 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
1fd20 69 66 28 20 4e 45 56 45 52 28 76 3d 3d 30 29 20  if( NEVER(v==0) 
1fd30 29 20 72 65 74 75 72 6e 3b 20 2f 2a 20 45 78 69  ) return; /* Exi
1fd40 73 74 65 6e 63 65 20 6f 66 20 56 44 42 45 20 63  stence of VDBE c
1fd50 68 65 63 6b 65 64 20 62 79 20 63 61 6c 6c 65 72  hecked by caller
1fd60 20 2a 2f 0a 20 20 69 66 28 20 70 45 78 70 72 3d   */.  if( pExpr=
1fd70 3d 30 20 29 20 20 20 20 72 65 74 75 72 6e 3b 0a  =0 )    return;.
1fd80 0a 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20  .  /* The value 
1fd90 6f 66 20 70 45 78 70 72 2d 3e 6f 70 20 61 6e 64  of pExpr->op and
1fda0 20 6f 70 20 61 72 65 20 72 65 6c 61 74 65 64 20   op are related 
1fdb0 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a  as follows:.  **
1fdc0 0a 20 20 2a 2a 20 20 20 20 20 20 20 70 45 78 70  .  **       pExp
1fdd0 72 2d 3e 6f 70 20 20 20 20 20 20 20 20 20 20 20  r->op           
1fde0 20 6f 70 0a 20 20 2a 2a 20 20 20 20 20 20 20 2d   op.  **       -
1fdf0 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 20 20 20  --------        
1fe00 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 20 2a    ----------.  *
1fe10 2a 20 20 20 20 20 20 20 54 4b 5f 49 53 4e 55 4c  *       TK_ISNUL
1fe20 4c 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4e 6f  L          OP_No
1fe30 74 4e 75 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 20  tNull.  **      
1fe40 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 20 20 20 20   TK_NOTNULL     
1fe50 20 20 20 20 4f 50 5f 49 73 4e 75 6c 6c 0a 20 20      OP_IsNull.  
1fe60 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4e 45 20 20  **       TK_NE  
1fe70 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 45              OP_E
1fe80 71 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f  q.  **       TK_
1fe90 45 51 20 20 20 20 20 20 20 20 20 20 20 20 20 20  EQ              
1fea0 4f 50 5f 4e 65 0a 20 20 2a 2a 20 20 20 20 20 20  OP_Ne.  **      
1feb0 20 54 4b 5f 47 54 20 20 20 20 20 20 20 20 20 20   TK_GT          
1fec0 20 20 20 20 4f 50 5f 4c 65 0a 20 20 2a 2a 20 20      OP_Le.  **  
1fed0 20 20 20 20 20 54 4b 5f 4c 45 20 20 20 20 20 20       TK_LE      
1fee0 20 20 20 20 20 20 20 20 4f 50 5f 47 74 0a 20 20          OP_Gt.  
1fef0 2a 2a 20 20 20 20 20 20 20 54 4b 5f 47 45 20 20  **       TK_GE  
1ff00 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4c              OP_L
1ff10 74 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f  t.  **       TK_
1ff20 4c 54 20 20 20 20 20 20 20 20 20 20 20 20 20 20  LT              
1ff30 4f 50 5f 47 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20  OP_Ge.  **.  ** 
1ff40 46 6f 72 20 6f 74 68 65 72 20 76 61 6c 75 65 73  For other values
1ff50 20 6f 66 20 70 45 78 70 72 2d 3e 6f 70 2c 20 6f   of pExpr->op, o
1ff60 70 20 69 73 20 75 6e 64 65 66 69 6e 65 64 20 61  p is undefined a
1ff70 6e 64 20 75 6e 75 73 65 64 2e 0a 20 20 2a 2a 20  nd unused..  ** 
1ff80 54 68 65 20 76 61 6c 75 65 20 6f 66 20 54 4b 5f  The value of TK_
1ff90 20 61 6e 64 20 4f 50 5f 20 63 6f 6e 73 74 61 6e   and OP_ constan
1ffa0 74 73 20 61 72 65 20 61 72 72 61 6e 67 65 64 20  ts are arranged 
1ffb0 73 75 63 68 20 74 68 61 74 20 77 65 0a 20 20 2a  such that we.  *
1ffc0 2a 20 63 61 6e 20 63 6f 6d 70 75 74 65 20 74 68  * can compute th
1ffd0 65 20 6d 61 70 70 69 6e 67 20 61 62 6f 76 65 20  e mapping above 
1ffe0 75 73 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77  using the follow
1fff0 69 6e 67 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a  ing expression..
20000 20 20 2a 2a 20 41 73 73 65 72 74 28 29 73 20 76    ** Assert()s v
20010 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20 63  erify that the c
20020 6f 6d 70 75 74 61 74 69 6f 6e 20 69 73 20 63 6f  omputation is co
20030 72 72 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 6f 70  rrect..  */.  op
20040 20 3d 20 28 28 70 45 78 70 72 2d 3e 6f 70 2b 28   = ((pExpr->op+(
20050 54 4b 5f 49 53 4e 55 4c 4c 26 31 29 29 5e 31 29  TK_ISNULL&1))^1)
20060 2d 28 54 4b 5f 49 53 4e 55 4c 4c 26 31 29 3b 0a  -(TK_ISNULL&1);.
20070 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 63 6f 72  .  /* Verify cor
20080 72 65 63 74 20 61 6c 69 67 6e 6d 65 6e 74 20 6f  rect alignment o
20090 66 20 54 4b 5f 20 61 6e 64 20 4f 50 5f 20 63 6f  f TK_ and OP_ co
200a0 6e 73 74 61 6e 74 73 0a 20 20 2a 2f 0a 20 20 61  nstants.  */.  a
200b0 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
200c0 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20 7c 7c 20 6f  !=TK_ISNULL || o
200d0 70 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b  p==OP_NotNull );
200e0 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
200f0 2d 3e 6f 70 21 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c  ->op!=TK_NOTNULL
20100 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 49 73 4e 75 6c   || op==OP_IsNul
20110 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  l );.  assert( p
20120 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 45 20  Expr->op!=TK_NE 
20130 7c 7c 20 6f 70 3d 3d 4f 50 5f 45 71 20 29 3b 0a  || op==OP_Eq );.
20140 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
20150 3e 6f 70 21 3d 54 4b 5f 45 51 20 7c 7c 20 6f 70  >op!=TK_EQ || op
20160 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20 61 73 73  ==OP_Ne );.  ass
20170 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d  ert( pExpr->op!=
20180 54 4b 5f 4c 54 20 7c 7c 20 6f 70 3d 3d 4f 50 5f  TK_LT || op==OP_
20190 47 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Ge );.  assert( 
201a0 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4c 45  pExpr->op!=TK_LE
201b0 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 74 20 29 3b   || op==OP_Gt );
201c0 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
201d0 2d 3e 6f 70 21 3d 54 4b 5f 47 54 20 7c 7c 20 6f  ->op!=TK_GT || o
201e0 70 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20 61 73  p==OP_Le );.  as
201f0 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21  sert( pExpr->op!
20200 3d 54 4b 5f 47 45 20 7c 7c 20 6f 70 3d 3d 4f 50  =TK_GE || op==OP
20210 5f 4c 74 20 29 3b 0a 0a 20 20 73 77 69 74 63 68  _Lt );..  switch
20220 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20  ( pExpr->op ){. 
20230 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20     case TK_AND: 
20240 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
20250 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  ( jumpIfNull==0 
20260 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
20270 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
20280 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
20290 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
202a0 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ll);.      sqlit
202b0 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28  e3ExprCachePush(
202c0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73  pParse);.      s
202d0 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
202e0 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
202f0 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a  >pRight, dest, j
20300 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
20310 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
20320 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20  hePop(pParse);. 
20330 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
20340 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52  }.    case TK_OR
20350 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 32  : {.      int d2
20360 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
20370 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
20380 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
20390 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  IfNull==0 );.   
203a0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
203b0 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78  True(pParse, pEx
203c0 70 72 2d 3e 70 4c 65 66 74 2c 20 64 32 2c 20 6a  pr->pLeft, d2, j
203d0 75 6d 70 49 66 4e 75 6c 6c 5e 53 51 4c 49 54 45  umpIfNull^SQLITE
203e0 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20  _JUMPIFNULL);.  
203f0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
20400 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29  achePush(pParse)
20410 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
20420 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
20430 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  e, pExpr->pRight
20440 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
20450 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ll);.      sqlit
20460 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
20470 65 6c 28 76 2c 20 64 32 29 3b 0a 20 20 20 20 20  el(v, d2);.     
20480 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
20490 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20  ePop(pParse);.  
204a0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
204b0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54  .    case TK_NOT
204c0 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61  : {.      testca
204d0 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  se( jumpIfNull==
204e0 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 );.      sqlit
204f0 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61  e3ExprIfTrue(pPa
20500 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
20510 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  t, dest, jumpIfN
20520 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ull);.      brea
20530 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
20540 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73  e TK_LT:.    cas
20550 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73  e TK_LE:.    cas
20560 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73  e TK_GT:.    cas
20570 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73  e TK_GE:.    cas
20580 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73  e TK_NE:.    cas
20590 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20  e TK_EQ: {.     
205a0 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
205b0 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  fNull==0 );.    
205c0 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78    r1 = sqlite3Ex
205d0 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
205e0 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
205f0 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20   &regFree1);.   
20600 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45     r2 = sqlite3E
20610 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
20620 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
20630 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20  t, &regFree2);. 
20640 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65       codeCompare
20650 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
20660 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52  pLeft, pExpr->pR
20670 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20  ight, op,.      
20680 20 20 20 20 20 20 20 20 20 20 20 20 72 31 2c 20              r1, 
20690 72 32 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  r2, dest, jumpIf
206a0 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 61 73 73  Null);.      ass
206b0 65 72 74 28 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74  ert(TK_LT==OP_Lt
206c0 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d  ); testcase(op==
206d0 4f 50 5f 4c 74 29 3b 20 56 64 62 65 43 6f 76 65  OP_Lt); VdbeCove
206e0 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f  rageIf(v,op==OP_
206f0 4c 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Lt);.      asser
20700 74 28 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 29 3b  t(TK_LE==OP_Le);
20710 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50   testcase(op==OP
20720 5f 4c 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61  _Le); VdbeCovera
20730 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 65  geIf(v,op==OP_Le
20740 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
20750 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74 29 3b 20 74  TK_GT==OP_Gt); t
20760 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47  estcase(op==OP_G
20770 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  t); VdbeCoverage
20780 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 74 29 3b  If(v,op==OP_Gt);
20790 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b  .      assert(TK
207a0 5f 47 45 3d 3d 4f 50 5f 47 65 29 3b 20 74 65 73  _GE==OP_Ge); tes
207b0 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 65 29  tcase(op==OP_Ge)
207c0 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66  ; VdbeCoverageIf
207d0 28 76 2c 6f 70 3d 3d 4f 50 5f 47 65 29 3b 0a 20  (v,op==OP_Ge);. 
207e0 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 45       assert(TK_E
207f0 51 3d 3d 4f 50 5f 45 71 29 3b 20 74 65 73 74 63  Q==OP_Eq); testc
20800 61 73 65 28 6f 70 3d 3d 4f 50 5f 45 71 29 3b 20  ase(op==OP_Eq); 
20810 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
20820 2c 6f 70 3d 3d 4f 50 5f 45 71 29 3b 0a 20 20 20  ,op==OP_Eq);.   
20830 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4e 45 3d     assert(TK_NE=
20840 3d 4f 50 5f 4e 65 29 3b 20 74 65 73 74 63 61 73  =OP_Ne); testcas
20850 65 28 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 20 56 64  e(op==OP_Ne); Vd
20860 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f  beCoverageIf(v,o
20870 70 3d 3d 4f 50 5f 4e 65 29 3b 0a 20 20 20 20 20  p==OP_Ne);.     
20880 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
20890 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee1==0 );.      
208a0 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
208b0 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62  e2==0 );.      b
208c0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
208d0 63 61 73 65 20 54 4b 5f 49 53 3a 0a 20 20 20 20  case TK_IS:.    
208e0 63 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 20 7b  case TK_ISNOT: {
208f0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
20900 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49   pExpr->op==TK_I
20910 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  S );.      testc
20920 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
20930 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20 20 20 20  TK_ISNOT );.    
20940 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78    r1 = sqlite3Ex
20950 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
20960 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
20970 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20   &regFree1);.   
20980 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45     r2 = sqlite3E
20990 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
209a0 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
209b0 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20  t, &regFree2);. 
209c0 20 20 20 20 20 6f 70 20 3d 20 28 70 45 78 70 72       op = (pExpr
209d0 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 29 20 3f 20 54  ->op==TK_IS) ? T
209e0 4b 5f 4e 45 20 3a 20 54 4b 5f 45 51 3b 0a 20 20  K_NE : TK_EQ;.  
209f0 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28      codeCompare(
20a00 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
20a10 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69  Left, pExpr->pRi
20a20 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20  ght, op,.       
20a30 20 20 20 20 20 20 20 20 20 20 20 72 31 2c 20 72             r1, r
20a40 32 2c 20 64 65 73 74 2c 20 53 51 4c 49 54 45 5f  2, dest, SQLITE_
20a50 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 56  NULLEQ);.      V
20a60 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
20a70 20 6f 70 3d 3d 54 4b 5f 45 51 29 3b 0a 20 20 20   op==TK_EQ);.   
20a80 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
20a90 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4e 45 29 3b  f(v, op==TK_NE);
20aa0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
20ab0 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
20ac0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
20ad0 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20  regFree2==0 );. 
20ae0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
20af0 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53  }.    case TK_IS
20b00 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54  NULL:.    case T
20b10 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20  K_NOTNULL: {.   
20b20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
20b30 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
20b40 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
20b50 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20  , &regFree1);.  
20b60 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
20b70 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20 72 31 2c  ddOp2(v, op, r1,
20b80 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 74 65   dest);.      te
20b90 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49  stcase( op==TK_I
20ba0 53 4e 55 4c 4c 20 29 3b 20 20 20 56 64 62 65 43  SNULL );   VdbeC
20bb0 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d  overageIf(v, op=
20bc0 3d 54 4b 5f 49 53 4e 55 4c 4c 29 3b 0a 20 20 20  =TK_ISNULL);.   
20bd0 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
20be0 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 20 20  =TK_NOTNULL );  
20bf0 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
20c00 2c 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c  , op==TK_NOTNULL
20c10 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
20c20 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  e( regFree1==0 )
20c30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
20c40 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
20c50 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20  _BETWEEN: {.    
20c60 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
20c70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  IfNull==0 );.   
20c80 20 20 20 65 78 70 72 43 6f 64 65 42 65 74 77 65     exprCodeBetwe
20c90 65 6e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  en(pParse, pExpr
20ca0 2c 20 64 65 73 74 2c 20 30 2c 20 6a 75 6d 70 49  , dest, 0, jumpI
20cb0 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72  fNull);.      br
20cc0 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  eak;.    }.#ifnd
20cd0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
20ce0 55 42 51 55 45 52 59 0a 20 20 20 20 63 61 73 65  UBQUERY.    case
20cf0 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20   TK_IN: {.      
20d00 69 66 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 29  if( jumpIfNull )
20d10 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
20d20 33 45 78 70 72 43 6f 64 65 49 4e 28 70 50 61 72  3ExprCodeIN(pPar
20d30 73 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74 2c  se, pExpr, dest,
20d40 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 7d 65   dest);.      }e
20d50 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  lse{.        int
20d60 20 64 65 73 74 49 66 4e 75 6c 6c 20 3d 20 73 71   destIfNull = sq
20d70 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
20d80 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73  el(v);.        s
20d90 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e  qlite3ExprCodeIN
20da0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
20db0 64 65 73 74 2c 20 64 65 73 74 49 66 4e 75 6c 6c  dest, destIfNull
20dc0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
20dd0 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
20de0 65 6c 28 76 2c 20 64 65 73 74 49 66 4e 75 6c 6c  el(v, destIfNull
20df0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
20e00 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
20e10 6e 64 69 66 0a 20 20 20 20 64 65 66 61 75 6c 74  ndif.    default
20e20 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 65 78  : {.      if( ex
20e30 70 72 41 6c 77 61 79 73 46 61 6c 73 65 28 70 45  prAlwaysFalse(pE
20e40 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  xpr) ){.        
20e50 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
20e60 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  2(v, OP_Goto, 0,
20e70 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 7d 65   dest);.      }e
20e80 6c 73 65 20 69 66 28 20 65 78 70 72 41 6c 77 61  lse if( exprAlwa
20e90 79 73 54 72 75 65 28 70 45 78 70 72 29 20 29 7b  ysTrue(pExpr) ){
20ea0 0a 20 20 20 20 20 20 20 20 2f 2a 20 6e 6f 2d 6f  .        /* no-o
20eb0 70 20 2a 2f 0a 20 20 20 20 20 20 7d 65 6c 73 65  p */.      }else
20ec0 7b 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20 73  {.        r1 = s
20ed0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
20ee0 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
20ef0 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20  , &regFree1);.  
20f00 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
20f10 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66  eAddOp3(v, OP_If
20f20 4e 6f 74 2c 20 72 31 2c 20 64 65 73 74 2c 20 6a  Not, r1, dest, j
20f30 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 29 3b 0a 20  umpIfNull!=0);. 
20f40 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
20f50 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
20f60 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
20f70 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  e1==0 );.       
20f80 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
20f90 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  fNull==0 );.    
20fa0 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
20fb0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
20fc0 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
20fd0 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72  eg(pParse, regFr
20fe0 65 65 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 52  ee1);.  sqlite3R
20ff0 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
21000 61 72 73 65 2c 20 72 65 67 46 72 65 65 32 29 3b  arse, regFree2);
21010 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 61 20 64  .}../*.** Do a d
21020 65 65 70 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f  eep comparison o
21030 66 20 74 77 6f 20 65 78 70 72 65 73 73 69 6f 6e  f two expression
21040 20 74 72 65 65 73 2e 20 20 52 65 74 75 72 6e 20   trees.  Return 
21050 30 20 69 66 20 74 68 65 20 74 77 6f 0a 2a 2a 20  0 if the two.** 
21060 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65 20  expressions are 
21070 63 6f 6d 70 6c 65 74 65 6c 79 20 69 64 65 6e 74  completely ident
21080 69 63 61 6c 2e 20 20 52 65 74 75 72 6e 20 31 20  ical.  Return 1 
21090 69 66 20 74 68 65 79 20 64 69 66 66 65 72 20 6f  if they differ o
210a0 6e 6c 79 0a 2a 2a 20 62 79 20 61 20 43 4f 4c 4c  nly.** by a COLL
210b0 41 54 45 20 6f 70 65 72 61 74 6f 72 20 61 74 20  ATE operator at 
210c0 74 68 65 20 74 6f 70 20 6c 65 76 65 6c 2e 20 20  the top level.  
210d0 52 65 74 75 72 6e 20 32 20 69 66 20 74 68 65 72  Return 2 if ther
210e0 65 20 61 72 65 20 64 69 66 66 65 72 65 6e 63 65  e are difference
210f0 73 0a 2a 2a 20 6f 74 68 65 72 20 74 68 61 6e 20  s.** other than 
21100 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c 20 43 4f  the top-level CO
21110 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 2e 0a  LLATE operator..
21120 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 20 73 75 62  **.** If any sub
21130 65 6c 65 6d 65 6e 74 20 6f 66 20 70 42 20 68 61  element of pB ha
21140 73 20 45 78 70 72 2e 69 54 61 62 6c 65 3d 3d 28  s Expr.iTable==(
21150 2d 31 29 20 74 68 65 6e 20 69 74 20 69 73 20 61  -1) then it is a
21160 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 63 6f 6d  llowed.** to com
21170 70 61 72 65 20 65 71 75 61 6c 20 74 6f 20 61 6e  pare equal to an
21180 20 65 71 75 69 76 61 6c 65 6e 74 20 65 6c 65 6d   equivalent elem
21190 65 6e 74 20 69 6e 20 70 41 20 77 69 74 68 20 45  ent in pA with E
211a0 78 70 72 2e 69 54 61 62 6c 65 3d 3d 69 54 61 62  xpr.iTable==iTab
211b0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 41 20 73  ..**.** The pA s
211c0 69 64 65 20 6d 69 67 68 74 20 62 65 20 75 73 69  ide might be usi
211d0 6e 67 20 54 4b 5f 52 45 47 49 53 54 45 52 2e 20  ng TK_REGISTER. 
211e0 20 49 66 20 74 68 61 74 20 69 73 20 74 68 65 20   If that is the 
211f0 63 61 73 65 20 61 6e 64 20 70 42 20 69 73 0a 2a  case and pB is.*
21200 2a 20 6e 6f 74 20 75 73 69 6e 67 20 54 4b 5f 52  * not using TK_R
21210 45 47 49 53 54 45 52 20 62 75 74 20 69 73 20 6f  EGISTER but is o
21220 74 68 65 72 77 69 73 65 20 65 71 75 69 76 61 6c  therwise equival
21230 65 6e 74 2c 20 74 68 65 6e 20 73 74 69 6c 6c 20  ent, then still 
21240 72 65 74 75 72 6e 20 30 2e 0a 2a 2a 0a 2a 2a 20  return 0..**.** 
21250 53 6f 6d 65 74 69 6d 65 73 20 74 68 69 73 20 72  Sometimes this r
21260 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75  outine will retu
21270 72 6e 20 32 20 65 76 65 6e 20 69 66 20 74 68 65  rn 2 even if the
21280 20 74 77 6f 20 65 78 70 72 65 73 73 69 6f 6e 73   two expressions
21290 0a 2a 2a 20 72 65 61 6c 6c 79 20 61 72 65 20 65  .** really are e
212a0 71 75 69 76 61 6c 65 6e 74 2e 20 20 49 66 20 77  quivalent.  If w
212b0 65 20 63 61 6e 6e 6f 74 20 70 72 6f 76 65 20 74  e cannot prove t
212c0 68 61 74 20 74 68 65 20 65 78 70 72 65 73 73 69  hat the expressi
212d0 6f 6e 73 20 61 72 65 0a 2a 2a 20 69 64 65 6e 74  ons are.** ident
212e0 69 63 61 6c 2c 20 77 65 20 72 65 74 75 72 6e 20  ical, we return 
212f0 32 20 6a 75 73 74 20 74 6f 20 62 65 20 73 61 66  2 just to be saf
21300 65 2e 20 20 53 6f 20 69 66 20 74 68 69 73 20 72  e.  So if this r
21310 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e  outine.** return
21320 73 20 32 2c 20 74 68 65 6e 20 79 6f 75 20 64 6f  s 2, then you do
21330 20 6e 6f 74 20 72 65 61 6c 6c 79 20 6b 6e 6f 77   not really know
21340 20 66 6f 72 20 63 65 72 74 61 69 6e 20 69 66 20   for certain if 
21350 74 68 65 20 74 77 6f 0a 2a 2a 20 65 78 70 72 65  the two.** expre
21360 73 73 69 6f 6e 73 20 61 72 65 20 74 68 65 20 73  ssions are the s
21370 61 6d 65 2e 20 20 42 75 74 20 69 66 20 79 6f 75  ame.  But if you
21380 20 67 65 74 20 61 20 30 20 6f 72 20 31 20 72 65   get a 0 or 1 re
21390 74 75 72 6e 2c 20 74 68 65 6e 20 79 6f 75 0a 2a  turn, then you.*
213a0 2a 20 63 61 6e 20 62 65 20 73 75 72 65 20 74 68  * can be sure th
213b0 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72  e expressions ar
213c0 65 20 74 68 65 20 73 61 6d 65 2e 20 20 49 6e 20  e the same.  In 
213d0 74 68 65 20 70 6c 61 63 65 73 20 77 68 65 72 65  the places where
213e0 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
213f0 20 69 73 20 75 73 65 64 2c 20 69 74 20 64 6f 65   is used, it doe
21400 73 20 6e 6f 74 20 68 75 72 74 20 74 6f 20 67 65  s not hurt to ge
21410 74 20 61 6e 20 65 78 74 72 61 20 32 20 2d 20 74  t an extra 2 - t
21420 68 61 74 0a 2a 2a 20 6a 75 73 74 20 6d 69 67 68  hat.** just migh
21430 74 20 72 65 73 75 6c 74 20 69 6e 20 73 6f 6d 65  t result in some
21440 20 73 6c 69 67 68 74 6c 79 20 73 6c 6f 77 65 72   slightly slower
21450 20 63 6f 64 65 2e 20 20 42 75 74 20 72 65 74 75   code.  But retu
21460 72 6e 69 6e 67 0a 2a 2a 20 61 6e 20 69 6e 63 6f  rning.** an inco
21470 72 72 65 63 74 20 30 20 6f 72 20 31 20 63 6f 75  rrect 0 or 1 cou
21480 6c 64 20 6c 65 61 64 20 74 6f 20 61 20 6d 61 6c  ld lead to a mal
21490 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74  function..*/.int
214a0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70   sqlite3ExprComp
214b0 61 72 65 28 45 78 70 72 20 2a 70 41 2c 20 45 78  are(Expr *pA, Ex
214c0 70 72 20 2a 70 42 2c 20 69 6e 74 20 69 54 61 62  pr *pB, int iTab
214d0 29 7b 0a 20 20 75 33 32 20 63 6f 6d 62 69 6e 65  ){.  u32 combine
214e0 64 46 6c 61 67 73 3b 0a 20 20 69 66 28 20 70 41  dFlags;.  if( pA
214f0 3d 3d 30 20 7c 7c 20 70 42 3d 3d 30 20 29 7b 0a  ==0 || pB==0 ){.
21500 20 20 20 20 72 65 74 75 72 6e 20 70 42 3d 3d 70      return pB==p
21510 41 20 3f 20 30 20 3a 20 32 3b 0a 20 20 7d 0a 20  A ? 0 : 2;.  }. 
21520 20 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20 3d   combinedFlags =
21530 20 70 41 2d 3e 66 6c 61 67 73 20 7c 20 70 42 2d   pA->flags | pB-
21540 3e 66 6c 61 67 73 3b 0a 20 20 69 66 28 20 63 6f  >flags;.  if( co
21550 6d 62 69 6e 65 64 46 6c 61 67 73 20 26 20 45 50  mbinedFlags & EP
21560 5f 49 6e 74 56 61 6c 75 65 20 29 7b 0a 20 20 20  _IntValue ){.   
21570 20 69 66 28 20 28 70 41 2d 3e 66 6c 61 67 73 26   if( (pA->flags&
21580 70 42 2d 3e 66 6c 61 67 73 26 45 50 5f 49 6e 74  pB->flags&EP_Int
21590 56 61 6c 75 65 29 21 3d 30 20 26 26 20 70 41 2d  Value)!=0 && pA-
215a0 3e 75 2e 69 56 61 6c 75 65 3d 3d 70 42 2d 3e 75  >u.iValue==pB->u
215b0 2e 69 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 20  .iValue ){.     
215c0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
215d0 0a 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20  .    return 2;. 
215e0 20 7d 0a 20 20 69 66 28 20 70 41 2d 3e 6f 70 21   }.  if( pA->op!
215f0 3d 70 42 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 69  =pB->op ){.    i
21600 66 28 20 70 41 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  f( pA->op==TK_CO
21610 4c 4c 41 54 45 20 26 26 20 73 71 6c 69 74 65 33  LLATE && sqlite3
21620 45 78 70 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e  ExprCompare(pA->
21630 70 4c 65 66 74 2c 20 70 42 2c 20 69 54 61 62 29  pLeft, pB, iTab)
21640 3c 32 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  <2 ){.      retu
21650 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 1;.    }.    
21660 69 66 28 20 70 42 2d 3e 6f 70 3d 3d 54 4b 5f 43  if( pB->op==TK_C
21670 4f 4c 4c 41 54 45 20 26 26 20 73 71 6c 69 74 65  OLLATE && sqlite
21680 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 41 2c  3ExprCompare(pA,
21690 20 70 42 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62   pB->pLeft, iTab
216a0 29 3c 32 20 29 7b 0a 20 20 20 20 20 20 72 65 74  )<2 ){.      ret
216b0 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 1;.    }.   
216c0 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 7d 0a 20   return 2;.  }. 
216d0 20 69 66 28 20 70 41 2d 3e 6f 70 21 3d 54 4b 5f   if( pA->op!=TK_
216e0 43 4f 4c 55 4d 4e 20 26 26 20 41 4c 57 41 59 53  COLUMN && ALWAYS
216f0 28 70 41 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f  (pA->op!=TK_AGG_
21700 43 4f 4c 55 4d 4e 29 20 26 26 20 70 41 2d 3e 75  COLUMN) && pA->u
21710 2e 7a 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 69  .zToken ){.    i
21720 66 28 20 73 74 72 63 6d 70 28 70 41 2d 3e 75 2e  f( strcmp(pA->u.
21730 7a 54 6f 6b 65 6e 2c 70 42 2d 3e 75 2e 7a 54 6f  zToken,pB->u.zTo
21740 6b 65 6e 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ken)!=0 ){.     
21750 20 72 65 74 75 72 6e 20 70 41 2d 3e 6f 70 3d 3d   return pA->op==
21760 54 4b 5f 43 4f 4c 4c 41 54 45 20 3f 20 31 20 3a  TK_COLLATE ? 1 :
21770 20 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   2;.    }.  }.  
21780 69 66 28 20 28 70 41 2d 3e 66 6c 61 67 73 20 26  if( (pA->flags &
21790 20 45 50 5f 44 69 73 74 69 6e 63 74 29 21 3d 28   EP_Distinct)!=(
217a0 70 42 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 44  pB->flags & EP_D
217b0 69 73 74 69 6e 63 74 29 20 29 20 72 65 74 75 72  istinct) ) retur
217c0 6e 20 32 3b 0a 20 20 69 66 28 20 41 4c 57 41 59  n 2;.  if( ALWAY
217d0 53 28 28 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73  S((combinedFlags
217e0 20 26 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29   & EP_TokenOnly)
217f0 3d 3d 30 29 20 29 7b 0a 20 20 20 20 69 66 28 20  ==0) ){.    if( 
21800 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20 26 20  combinedFlags & 
21810 45 50 5f 78 49 73 53 65 6c 65 63 74 20 29 20 72  EP_xIsSelect ) r
21820 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 69 66 28  eturn 2;.    if(
21830 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70   sqlite3ExprComp
21840 61 72 65 28 70 41 2d 3e 70 4c 65 66 74 2c 20 70  are(pA->pLeft, p
21850 42 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 29 20  B->pLeft, iTab) 
21860 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20  ) return 2;.    
21870 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43  if( sqlite3ExprC
21880 6f 6d 70 61 72 65 28 70 41 2d 3e 70 52 69 67 68  ompare(pA->pRigh
21890 74 2c 20 70 42 2d 3e 70 52 69 67 68 74 2c 20 69  t, pB->pRight, i
218a0 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 32 3b  Tab) ) return 2;
218b0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
218c0 45 78 70 72 4c 69 73 74 43 6f 6d 70 61 72 65 28  ExprListCompare(
218d0 70 41 2d 3e 78 2e 70 4c 69 73 74 2c 20 70 42 2d  pA->x.pList, pB-
218e0 3e 78 2e 70 4c 69 73 74 2c 20 69 54 61 62 29 20  >x.pList, iTab) 
218f0 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20  ) return 2;.    
21900 69 66 28 20 41 4c 57 41 59 53 28 28 63 6f 6d 62  if( ALWAYS((comb
21910 69 6e 65 64 46 6c 61 67 73 20 26 20 45 50 5f 52  inedFlags & EP_R
21920 65 64 75 63 65 64 29 3d 3d 30 29 20 29 7b 0a 20  educed)==0) ){. 
21930 20 20 20 20 20 69 66 28 20 70 41 2d 3e 69 43 6f       if( pA->iCo
21940 6c 75 6d 6e 21 3d 70 42 2d 3e 69 43 6f 6c 75 6d  lumn!=pB->iColum
21950 6e 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20  n ) return 2;.  
21960 20 20 20 20 69 66 28 20 70 41 2d 3e 69 54 61 62      if( pA->iTab
21970 6c 65 21 3d 70 42 2d 3e 69 54 61 62 6c 65 20 0a  le!=pB->iTable .
21980 20 20 20 20 20 20 20 26 26 20 28 70 41 2d 3e 69         && (pA->i
21990 54 61 62 6c 65 21 3d 69 54 61 62 20 7c 7c 20 4e  Table!=iTab || N
219a0 45 56 45 52 28 70 42 2d 3e 69 54 61 62 6c 65 3e  EVER(pB->iTable>
219b0 3d 30 29 29 20 29 20 72 65 74 75 72 6e 20 32 3b  =0)) ) return 2;
219c0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
219d0 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
219e0 43 6f 6d 70 61 72 65 20 74 77 6f 20 45 78 70 72  Compare two Expr
219f0 4c 69 73 74 20 6f 62 6a 65 63 74 73 2e 20 20 52  List objects.  R
21a00 65 74 75 72 6e 20 30 20 69 66 20 74 68 65 79 20  eturn 0 if they 
21a10 61 72 65 20 69 64 65 6e 74 69 63 61 6c 20 61 6e  are identical an
21a20 64 20 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 69  d .** non-zero i
21a30 66 20 74 68 65 79 20 64 69 66 66 65 72 20 69 6e  f they differ in
21a40 20 61 6e 79 20 77 61 79 2e 0a 2a 2a 0a 2a 2a 20   any way..**.** 
21a50 49 66 20 61 6e 79 20 73 75 62 65 6c 65 6d 65 6e  If any subelemen
21a60 74 20 6f 66 20 70 42 20 68 61 73 20 45 78 70 72  t of pB has Expr
21a70 2e 69 54 61 62 6c 65 3d 3d 28 2d 31 29 20 74 68  .iTable==(-1) th
21a80 65 6e 20 69 74 20 69 73 20 61 6c 6c 6f 77 65 64  en it is allowed
21a90 0a 2a 2a 20 74 6f 20 63 6f 6d 70 61 72 65 20 65  .** to compare e
21aa0 71 75 61 6c 20 74 6f 20 61 6e 20 65 71 75 69 76  qual to an equiv
21ab0 61 6c 65 6e 74 20 65 6c 65 6d 65 6e 74 20 69 6e  alent element in
21ac0 20 70 41 20 77 69 74 68 20 45 78 70 72 2e 69 54   pA with Expr.iT
21ad0 61 62 6c 65 3d 3d 69 54 61 62 2e 0a 2a 2a 0a 2a  able==iTab..**.*
21ae0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  * This routine m
21af0 69 67 68 74 20 72 65 74 75 72 6e 20 6e 6f 6e 2d  ight return non-
21b00 7a 65 72 6f 20 66 6f 72 20 65 71 75 69 76 61 6c  zero for equival
21b10 65 6e 74 20 45 78 70 72 4c 69 73 74 73 2e 20 20  ent ExprLists.  
21b20 54 68 65 0a 2a 2a 20 6f 6e 6c 79 20 63 6f 6e 73  The.** only cons
21b30 65 71 75 65 6e 63 65 20 77 69 6c 6c 20 62 65 20  equence will be 
21b40 64 69 73 61 62 6c 65 64 20 6f 70 74 69 6d 69 7a  disabled optimiz
21b50 61 74 69 6f 6e 73 2e 20 20 42 75 74 20 74 68 69  ations.  But thi
21b60 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 6d 75 73  s routine.** mus
21b70 74 20 6e 65 76 65 72 20 72 65 74 75 72 6e 20 30  t never return 0
21b80 20 69 66 20 74 68 65 20 74 77 6f 20 45 78 70 72   if the two Expr
21b90 4c 69 73 74 20 6f 62 6a 65 63 74 73 20 61 72 65  List objects are
21ba0 20 64 69 66 66 65 72 65 6e 74 2c 20 6f 72 0a 2a   different, or.*
21bb0 2a 20 61 20 6d 61 6c 66 75 6e 63 74 69 6f 6e 20  * a malfunction 
21bc0 77 69 6c 6c 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a  will result..**.
21bd0 2a 2a 20 54 77 6f 20 4e 55 4c 4c 20 70 6f 69 6e  ** Two NULL poin
21be0 74 65 72 73 20 61 72 65 20 63 6f 6e 73 69 64 65  ters are conside
21bf0 72 65 64 20 74 6f 20 62 65 20 74 68 65 20 73 61  red to be the sa
21c00 6d 65 2e 20 20 42 75 74 20 61 20 4e 55 4c 4c 20  me.  But a NULL 
21c10 70 6f 69 6e 74 65 72 0a 2a 2a 20 61 6c 77 61 79  pointer.** alway
21c20 73 20 64 69 66 66 65 72 73 20 66 72 6f 6d 20 61  s differs from a
21c30 20 6e 6f 6e 2d 4e 55 4c 4c 20 70 6f 69 6e 74 65   non-NULL pointe
21c40 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  r..*/.int sqlite
21c50 33 45 78 70 72 4c 69 73 74 43 6f 6d 70 61 72 65  3ExprListCompare
21c60 28 45 78 70 72 4c 69 73 74 20 2a 70 41 2c 20 45  (ExprList *pA, E
21c70 78 70 72 4c 69 73 74 20 2a 70 42 2c 20 69 6e 74  xprList *pB, int
21c80 20 69 54 61 62 29 7b 0a 20 20 69 6e 74 20 69 3b   iTab){.  int i;
21c90 0a 20 20 69 66 28 20 70 41 3d 3d 30 20 26 26 20  .  if( pA==0 && 
21ca0 70 42 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  pB==0 ) return 0
21cb0 3b 0a 20 20 69 66 28 20 70 41 3d 3d 30 20 7c 7c  ;.  if( pA==0 ||
21cc0 20 70 42 3d 3d 30 20 29 20 72 65 74 75 72 6e 20   pB==0 ) return 
21cd0 31 3b 0a 20 20 69 66 28 20 70 41 2d 3e 6e 45 78  1;.  if( pA->nEx
21ce0 70 72 21 3d 70 42 2d 3e 6e 45 78 70 72 20 29 20  pr!=pB->nExpr ) 
21cf0 72 65 74 75 72 6e 20 31 3b 0a 20 20 66 6f 72 28  return 1;.  for(
21d00 69 3d 30 3b 20 69 3c 70 41 2d 3e 6e 45 78 70 72  i=0; i<pA->nExpr
21d10 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  ; i++){.    Expr
21d20 20 2a 70 45 78 70 72 41 20 3d 20 70 41 2d 3e 61   *pExprA = pA->a
21d30 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 45  [i].pExpr;.    E
21d40 78 70 72 20 2a 70 45 78 70 72 42 20 3d 20 70 42  xpr *pExprB = pB
21d50 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
21d60 20 20 69 66 28 20 70 41 2d 3e 61 5b 69 5d 2e 73    if( pA->a[i].s
21d70 6f 72 74 4f 72 64 65 72 21 3d 70 42 2d 3e 61 5b  ortOrder!=pB->a[
21d80 69 5d 2e 73 6f 72 74 4f 72 64 65 72 20 29 20 72  i].sortOrder ) r
21d90 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 69 66 28  eturn 1;.    if(
21da0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70   sqlite3ExprComp
21db0 61 72 65 28 70 45 78 70 72 41 2c 20 70 45 78 70  are(pExprA, pExp
21dc0 72 42 2c 20 69 54 61 62 29 20 29 20 72 65 74 75  rB, iTab) ) retu
21dd0 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 1;.  }.  retu
21de0 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  rn 0;.}../*.** R
21df0 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 77 65  eturn true if we
21e00 20 63 61 6e 20 70 72 6f 76 65 20 74 68 65 20 70   can prove the p
21e10 45 32 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 62  E2 will always b
21e20 65 20 74 72 75 65 20 69 66 20 70 45 31 20 69 73  e true if pE1 is
21e30 0a 2a 2a 20 74 72 75 65 2e 20 20 52 65 74 75 72  .** true.  Retur
21e40 6e 20 66 61 6c 73 65 20 69 66 20 77 65 20 63 61  n false if we ca
21e50 6e 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 20 74 68  nnot complete th
21e60 65 20 70 72 6f 6f 66 20 6f 72 20 69 66 20 70 45  e proof or if pE
21e70 32 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20 66 61  2 might.** be fa
21e80 6c 73 65 2e 20 20 45 78 61 6d 70 6c 65 73 3a 0a  lse.  Examples:.
21e90 2a 2a 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78  **.**     pE1: x
21ea0 3d 3d 35 20 20 20 20 20 20 20 70 45 32 3a 20 78  ==5       pE2: x
21eb0 3d 3d 35 20 20 20 20 20 20 20 20 20 20 20 20 20  ==5             
21ec0 52 65 73 75 6c 74 3a 20 74 72 75 65 0a 2a 2a 20  Result: true.** 
21ed0 20 20 20 20 70 45 31 3a 20 78 3e 30 20 20 20 20      pE1: x>0    
21ee0 20 20 20 20 70 45 32 3a 20 78 3d 3d 35 20 20 20      pE2: x==5   
21ef0 20 20 20 20 20 20 20 20 20 20 52 65 73 75 6c 74            Result
21f00 3a 20 66 61 6c 73 65 0a 2a 2a 20 20 20 20 20 70  : false.**     p
21f10 45 31 3a 20 78 3d 32 31 20 20 20 20 20 20 20 70  E1: x=21       p
21f20 45 32 3a 20 78 3d 32 31 20 4f 52 20 79 3d 34 33  E2: x=21 OR y=43
21f30 20 20 20 20 20 52 65 73 75 6c 74 3a 20 74 72 75       Result: tru
21f40 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78 21  e.**     pE1: x!
21f50 3d 31 32 33 20 20 20 20 20 70 45 32 3a 20 78 20  =123     pE2: x 
21f60 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 52  IS NOT NULL    R
21f70 65 73 75 6c 74 3a 20 74 72 75 65 0a 2a 2a 20 20  esult: true.**  
21f80 20 20 20 70 45 31 3a 20 78 21 3d 3f 31 20 20 20     pE1: x!=?1   
21f90 20 20 20 70 45 32 3a 20 78 20 49 53 20 4e 4f 54     pE2: x IS NOT
21fa0 20 4e 55 4c 4c 20 20 20 20 52 65 73 75 6c 74 3a   NULL    Result:
21fb0 20 74 72 75 65 0a 2a 2a 20 20 20 20 20 70 45 31   true.**     pE1
21fc0 3a 20 78 20 49 53 20 4e 55 4c 4c 20 20 70 45 32  : x IS NULL  pE2
21fd0 3a 20 78 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20  : x IS NOT NULL 
21fe0 20 20 20 52 65 73 75 6c 74 3a 20 66 61 6c 73 65     Result: false
21ff0 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78 20 49  .**     pE1: x I
22000 53 20 3f 32 20 20 20 20 70 45 32 3a 20 78 20 49  S ?2    pE2: x I
22010 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 52 65  S NOT NULL    Re
22020 75 73 6c 74 3a 20 66 61 6c 73 65 0a 2a 2a 0a 2a  uslt: false.**.*
22030 2a 20 57 68 65 6e 20 63 6f 6d 70 61 72 69 6e 67  * When comparing
22040 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73   TK_COLUMN nodes
22050 20 62 65 74 77 65 65 6e 20 70 45 31 20 61 6e 64   between pE1 and
22060 20 70 45 32 2c 20 69 66 20 70 45 32 20 68 61 73   pE2, if pE2 has
22070 0a 2a 2a 20 45 78 70 72 2e 69 54 61 62 6c 65 3c  .** Expr.iTable<
22080 30 20 74 68 65 6e 20 61 73 73 75 6d 65 20 61 20  0 then assume a 
22090 74 61 62 6c 65 20 6e 75 6d 62 65 72 20 67 69 76  table number giv
220a0 65 6e 20 62 79 20 69 54 61 62 2e 0a 2a 2a 0a 2a  en by iTab..**.*
220b0 2a 20 57 68 65 6e 20 69 6e 20 64 6f 75 62 74 2c  * When in doubt,
220c0 20 72 65 74 75 72 6e 20 66 61 6c 73 65 2e 20 20   return false.  
220d0 52 65 74 75 72 6e 69 6e 67 20 74 72 75 65 20 6d  Returning true m
220e0 69 67 68 74 20 67 69 76 65 20 61 20 70 65 72 66  ight give a perf
220f0 6f 72 6d 61 6e 63 65 0a 2a 2a 20 69 6d 70 72 6f  ormance.** impro
22100 76 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 69  vement.  Returni
22110 6e 67 20 66 61 6c 73 65 20 6d 69 67 68 74 20 63  ng false might c
22120 61 75 73 65 20 61 20 70 65 72 66 6f 72 6d 61 6e  ause a performan
22130 63 65 20 72 65 64 75 63 74 69 6f 6e 2c 20 62 75  ce reduction, bu
22140 74 0a 2a 2a 20 69 74 20 77 69 6c 6c 20 61 6c 77  t.** it will alw
22150 61 79 73 20 67 69 76 65 20 74 68 65 20 63 6f 72  ays give the cor
22160 72 65 63 74 20 61 6e 73 77 65 72 20 61 6e 64 20  rect answer and 
22170 69 73 20 68 65 6e 63 65 20 61 6c 77 61 79 73 20  is hence always 
22180 73 61 66 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  safe..*/.int sql
22190 69 74 65 33 45 78 70 72 49 6d 70 6c 69 65 73 45  ite3ExprImpliesE
221a0 78 70 72 28 45 78 70 72 20 2a 70 45 31 2c 20 45  xpr(Expr *pE1, E
221b0 78 70 72 20 2a 70 45 32 2c 20 69 6e 74 20 69 54  xpr *pE2, int iT
221c0 61 62 29 7b 0a 20 20 69 66 28 20 73 71 6c 69 74  ab){.  if( sqlit
221d0 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 45  e3ExprCompare(pE
221e0 31 2c 20 70 45 32 2c 20 69 54 61 62 29 3d 3d 30  1, pE2, iTab)==0
221f0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31   ){.    return 1
22200 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 45 32 2d  ;.  }.  if( pE2-
22210 3e 6f 70 3d 3d 54 4b 5f 4f 52 0a 20 20 20 26 26  >op==TK_OR.   &&
22220 20 28 73 71 6c 69 74 65 33 45 78 70 72 49 6d 70   (sqlite3ExprImp
22230 6c 69 65 73 45 78 70 72 28 70 45 31 2c 20 70 45  liesExpr(pE1, pE
22240 32 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 29 0a  2->pLeft, iTab).
22250 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
22260 73 71 6c 69 74 65 33 45 78 70 72 49 6d 70 6c 69  sqlite3ExprImpli
22270 65 73 45 78 70 72 28 70 45 31 2c 20 70 45 32 2d  esExpr(pE1, pE2-
22280 3e 70 52 69 67 68 74 2c 20 69 54 61 62 29 20 29  >pRight, iTab) )
22290 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  .  ){.    return
222a0 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 45   1;.  }.  if( pE
222b0 32 2d 3e 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c  2->op==TK_NOTNUL
222c0 4c 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33 45  L.   && sqlite3E
222d0 78 70 72 43 6f 6d 70 61 72 65 28 70 45 31 2d 3e  xprCompare(pE1->
222e0 70 4c 65 66 74 2c 20 70 45 32 2d 3e 70 4c 65 66  pLeft, pE2->pLef
222f0 74 2c 20 69 54 61 62 29 3d 3d 30 0a 20 20 20 26  t, iTab)==0.   &
22300 26 20 28 70 45 31 2d 3e 6f 70 21 3d 54 4b 5f 49  & (pE1->op!=TK_I
22310 53 4e 55 4c 4c 20 26 26 20 70 45 31 2d 3e 6f 70  SNULL && pE1->op
22320 21 3d 54 4b 5f 49 53 29 0a 20 20 29 7b 0a 20 20  !=TK_IS).  ){.  
22330 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
22340 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
22350 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65  *.** An instance
22360 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
22370 67 20 73 74 72 75 63 74 75 72 65 20 69 73 20 75  g structure is u
22380 73 65 64 20 62 79 20 74 68 65 20 74 72 65 65 20  sed by the tree 
22390 77 61 6c 6b 65 72 0a 2a 2a 20 74 6f 20 63 6f 75  walker.** to cou
223a0 6e 74 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  nt references to
223b0 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 20 69   table columns i
223c0 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74 73 20  n the arguments 
223d0 6f 66 20 61 6e 20 0a 2a 2a 20 61 67 67 72 65 67  of an .** aggreg
223e0 61 74 65 20 66 75 6e 63 74 69 6f 6e 2c 20 69 6e  ate function, in
223f0 20 6f 72 64 65 72 20 74 6f 20 69 6d 70 6c 65 6d   order to implem
22400 65 6e 74 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74  ent the.** sqlit
22410 65 33 46 75 6e 63 74 69 6f 6e 54 68 69 73 53 72  e3FunctionThisSr
22420 63 28 29 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a  c() routine..*/.
22430 73 74 72 75 63 74 20 53 72 63 43 6f 75 6e 74 20  struct SrcCount 
22440 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72  {.  SrcList *pSr
22450 63 3b 20 20 20 2f 2a 20 4f 6e 65 20 70 61 72 74  c;   /* One part
22460 69 63 75 6c 61 72 20 46 52 4f 4d 20 63 6c 61 75  icular FROM clau
22470 73 65 20 69 6e 20 61 20 6e 65 73 74 65 64 20 71  se in a nested q
22480 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 54  uery */.  int nT
22490 68 69 73 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75  his;       /* Nu
224a0 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63  mber of referenc
224b0 65 73 20 74 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e  es to columns in
224c0 20 70 53 72 63 4c 69 73 74 20 2a 2f 0a 20 20 69   pSrcList */.  i
224d0 6e 74 20 6e 4f 74 68 65 72 3b 20 20 20 20 20 20  nt nOther;      
224e0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 66  /* Number of ref
224f0 65 72 65 6e 63 65 73 20 74 6f 20 63 6f 6c 75 6d  erences to colum
22500 6e 73 20 69 6e 20 6f 74 68 65 72 20 46 52 4f 4d  ns in other FROM
22510 20 63 6c 61 75 73 65 73 20 2a 2f 0a 7d 3b 0a 0a   clauses */.};..
22520 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65 20  /*.** Count the 
22530 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65  number of refere
22540 6e 63 65 73 20 74 6f 20 63 6f 6c 75 6d 6e 73 2e  nces to columns.
22550 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65  .*/.static int e
22560 78 70 72 53 72 63 43 6f 75 6e 74 28 57 61 6c 6b  xprSrcCount(Walk
22570 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70  er *pWalker, Exp
22580 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 2f 2a 20  r *pExpr){.  /* 
22590 54 68 65 20 4e 45 56 45 52 28 29 20 6f 6e 20 74  The NEVER() on t
225a0 68 65 20 73 65 63 6f 6e 64 20 74 65 72 6d 20 69  he second term i
225b0 73 20 62 65 63 61 75 73 65 20 73 71 6c 69 74 65  s because sqlite
225c0 33 46 75 6e 63 74 69 6f 6e 55 73 65 73 54 68 69  3FunctionUsesThi
225d0 73 53 72 63 28 29 0a 20 20 2a 2a 20 69 73 20 61  sSrc().  ** is a
225e0 6c 77 61 79 73 20 63 61 6c 6c 65 64 20 62 65 66  lways called bef
225f0 6f 72 65 20 73 71 6c 69 74 65 33 45 78 70 72 41  ore sqlite3ExprA
22600 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73  nalyzeAggregates
22610 28 29 20 61 6e 64 20 73 6f 20 74 68 65 0a 20 20  () and so the.  
22620 2a 2a 20 54 4b 5f 43 4f 4c 55 4d 4e 73 20 68 61  ** TK_COLUMNs ha
22630 76 65 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20  ve not yet been 
22640 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 54  converted into T
22650 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 2e 20 20 49  K_AGG_COLUMN.  I
22660 66 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 46 75  f.  ** sqlite3Fu
22670 6e 63 74 69 6f 6e 55 73 65 73 54 68 69 73 53 72  nctionUsesThisSr
22680 63 28 29 20 69 73 20 75 73 65 64 20 64 69 66 66  c() is used diff
22690 65 72 65 6e 74 6c 79 20 69 6e 20 74 68 65 20 66  erently in the f
226a0 75 74 75 72 65 2c 20 74 68 65 0a 20 20 2a 2a 20  uture, the.  ** 
226b0 4e 45 56 45 52 28 29 20 77 69 6c 6c 20 6e 65 65  NEVER() will nee
226c0 64 20 74 6f 20 62 65 20 72 65 6d 6f 76 65 64 2e  d to be removed.
226d0 20 2a 2f 0a 20 20 69 66 28 20 70 45 78 70 72 2d   */.  if( pExpr-
226e0 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c  >op==TK_COLUMN |
226f0 7c 20 4e 45 56 45 52 28 70 45 78 70 72 2d 3e 6f  | NEVER(pExpr->o
22700 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  p==TK_AGG_COLUMN
22710 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  ) ){.    int i;.
22720 20 20 20 20 73 74 72 75 63 74 20 53 72 63 43 6f      struct SrcCo
22730 75 6e 74 20 2a 70 20 3d 20 70 57 61 6c 6b 65 72  unt *p = pWalker
22740 2d 3e 75 2e 70 53 72 63 43 6f 75 6e 74 3b 0a 20  ->u.pSrcCount;. 
22750 20 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63     SrcList *pSrc
22760 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20   = p->pSrc;.    
22770 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72 63 2d  for(i=0; i<pSrc-
22780 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nSrc; i++){.   
22790 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 54     if( pExpr->iT
227a0 61 62 6c 65 3d 3d 70 53 72 63 2d 3e 61 5b 69 5d  able==pSrc->a[i]
227b0 2e 69 43 75 72 73 6f 72 20 29 20 62 72 65 61 6b  .iCursor ) break
227c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
227d0 69 3c 70 53 72 63 2d 3e 6e 53 72 63 20 29 7b 0a  i<pSrc->nSrc ){.
227e0 20 20 20 20 20 20 70 2d 3e 6e 54 68 69 73 2b 2b        p->nThis++
227f0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
22800 20 20 20 70 2d 3e 6e 4f 74 68 65 72 2b 2b 3b 0a     p->nOther++;.
22810 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
22820 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
22830 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d  .}../*.** Determ
22840 69 6e 65 20 69 66 20 61 6e 79 20 6f 66 20 74 68  ine if any of th
22850 65 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 74  e arguments to t
22860 68 65 20 70 45 78 70 72 20 46 75 6e 63 74 69 6f  he pExpr Functio
22870 6e 20 72 65 66 65 72 65 6e 63 65 0a 2a 2a 20 70  n reference.** p
22880 53 72 63 4c 69 73 74 2e 20 20 52 65 74 75 72 6e  SrcList.  Return
22890 20 74 72 75 65 20 69 66 20 74 68 65 79 20 64 6f   true if they do
228a0 2e 20 20 41 6c 73 6f 20 72 65 74 75 72 6e 20 74  .  Also return t
228b0 72 75 65 20 69 66 20 74 68 65 20 66 75 6e 63 74  rue if the funct
228c0 69 6f 6e 0a 2a 2a 20 68 61 73 20 6e 6f 20 61 72  ion.** has no ar
228d0 67 75 6d 65 6e 74 73 20 6f 72 20 68 61 73 20 6f  guments or has o
228e0 6e 6c 79 20 63 6f 6e 73 74 61 6e 74 20 61 72 67  nly constant arg
228f0 75 6d 65 6e 74 73 2e 20 20 52 65 74 75 72 6e 20  uments.  Return 
22900 66 61 6c 73 65 20 69 66 20 70 45 78 70 72 0a 2a  false if pExpr.*
22910 2a 20 72 65 66 65 72 65 6e 63 65 73 20 63 6f 6c  * references col
22920 75 6d 6e 73 20 62 75 74 20 6e 6f 74 20 63 6f 6c  umns but not col
22930 75 6d 6e 73 20 6f 66 20 74 61 62 6c 65 73 20 66  umns of tables f
22940 6f 75 6e 64 20 69 6e 20 70 53 72 63 4c 69 73 74  ound in pSrcList
22950 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
22960 46 75 6e 63 74 69 6f 6e 55 73 65 73 54 68 69 73  FunctionUsesThis
22970 53 72 63 28 45 78 70 72 20 2a 70 45 78 70 72 2c  Src(Expr *pExpr,
22980 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 4c 69   SrcList *pSrcLi
22990 73 74 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b  st){.  Walker w;
229a0 0a 20 20 73 74 72 75 63 74 20 53 72 63 43 6f 75  .  struct SrcCou
229b0 6e 74 20 63 6e 74 3b 0a 20 20 61 73 73 65 72 74  nt cnt;.  assert
229c0 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
229d0 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a  AGG_FUNCTION );.
229e0 20 20 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c 20    memset(&w, 0, 
229f0 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20 77 2e  sizeof(w));.  w.
22a00 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20  xExprCallback = 
22a10 65 78 70 72 53 72 63 43 6f 75 6e 74 3b 0a 20 20  exprSrcCount;.  
22a20 77 2e 75 2e 70 53 72 63 43 6f 75 6e 74 20 3d 20  w.u.pSrcCount = 
22a30 26 63 6e 74 3b 0a 20 20 63 6e 74 2e 70 53 72 63  &cnt;.  cnt.pSrc
22a40 20 3d 20 70 53 72 63 4c 69 73 74 3b 0a 20 20 63   = pSrcList;.  c
22a50 6e 74 2e 6e 54 68 69 73 20 3d 20 30 3b 0a 20 20  nt.nThis = 0;.  
22a60 63 6e 74 2e 6e 4f 74 68 65 72 20 3d 20 30 3b 0a  cnt.nOther = 0;.
22a70 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70    sqlite3WalkExp
22a80 72 4c 69 73 74 28 26 77 2c 20 70 45 78 70 72 2d  rList(&w, pExpr-
22a90 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 72 65 74  >x.pList);.  ret
22aa0 75 72 6e 20 63 6e 74 2e 6e 54 68 69 73 3e 30 20  urn cnt.nThis>0 
22ab0 7c 7c 20 63 6e 74 2e 6e 4f 74 68 65 72 3d 3d 30  || cnt.nOther==0
22ac0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  ;.}../*.** Add a
22ad0 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20   new element to 
22ae0 74 68 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43  the pAggInfo->aC
22af0 6f 6c 5b 5d 20 61 72 72 61 79 2e 20 20 52 65 74  ol[] array.  Ret
22b00 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66  urn the index of
22b10 0a 2a 2a 20 74 68 65 20 6e 65 77 20 65 6c 65 6d  .** the new elem
22b20 65 6e 74 2e 20 20 52 65 74 75 72 6e 20 61 20 6e  ent.  Return a n
22b30 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72 20 69  egative number i
22b40 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 2e 0a  f malloc fails..
22b50 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 64  */.static int ad
22b60 64 41 67 67 49 6e 66 6f 43 6f 6c 75 6d 6e 28 73  dAggInfoColumn(s
22b70 71 6c 69 74 65 33 20 2a 64 62 2c 20 41 67 67 49  qlite3 *db, AggI
22b80 6e 66 6f 20 2a 70 49 6e 66 6f 29 7b 0a 20 20 69  nfo *pInfo){.  i
22b90 6e 74 20 69 3b 0a 20 20 70 49 6e 66 6f 2d 3e 61  nt i;.  pInfo->a
22ba0 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 41 72 72  Col = sqlite3Arr
22bb0 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20 20 20  ayAllocate(.    
22bc0 20 20 20 64 62 2c 0a 20 20 20 20 20 20 20 70 49     db,.       pI
22bd0 6e 66 6f 2d 3e 61 43 6f 6c 2c 0a 20 20 20 20 20  nfo->aCol,.     
22be0 20 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e    sizeof(pInfo->
22bf0 61 43 6f 6c 5b 30 5d 29 2c 0a 20 20 20 20 20 20  aCol[0]),.      
22c00 20 26 70 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e   &pInfo->nColumn
22c10 2c 0a 20 20 20 20 20 20 20 26 69 0a 20 20 29 3b  ,.       &i.  );
22c20 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 20 20  .  return i;.}  
22c30 20 20 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20    ../*.** Add a 
22c40 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74  new element to t
22c50 68 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75  he pAggInfo->aFu
22c60 6e 63 5b 5d 20 61 72 72 61 79 2e 20 20 52 65 74  nc[] array.  Ret
22c70 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66  urn the index of
22c80 0a 2a 2a 20 74 68 65 20 6e 65 77 20 65 6c 65 6d  .** the new elem
22c90 65 6e 74 2e 20 20 52 65 74 75 72 6e 20 61 20 6e  ent.  Return a n
22ca0 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72 20 69  egative number i
22cb0 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 2e 0a  f malloc fails..
22cc0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 64  */.static int ad
22cd0 64 41 67 67 49 6e 66 6f 46 75 6e 63 28 73 71 6c  dAggInfoFunc(sql
22ce0 69 74 65 33 20 2a 64 62 2c 20 41 67 67 49 6e 66  ite3 *db, AggInf
22cf0 6f 20 2a 70 49 6e 66 6f 29 7b 0a 20 20 69 6e 74  o *pInfo){.  int
22d00 20 69 3b 0a 20 20 70 49 6e 66 6f 2d 3e 61 46 75   i;.  pInfo->aFu
22d10 6e 63 20 3d 20 73 71 6c 69 74 65 33 41 72 72 61  nc = sqlite3Arra
22d20 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20 20 20 20  yAllocate(.     
22d30 20 20 64 62 2c 20 0a 20 20 20 20 20 20 20 70 49    db, .       pI
22d40 6e 66 6f 2d 3e 61 46 75 6e 63 2c 0a 20 20 20 20  nfo->aFunc,.    
22d50 20 20 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d     sizeof(pInfo-
22d60 3e 61 46 75 6e 63 5b 30 5d 29 2c 0a 20 20 20 20  >aFunc[0]),.    
22d70 20 20 20 26 70 49 6e 66 6f 2d 3e 6e 46 75 6e 63     &pInfo->nFunc
22d80 2c 0a 20 20 20 20 20 20 20 26 69 0a 20 20 29 3b  ,.       &i.  );
22d90 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 20 20  .  return i;.}  
22da0 20 20 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69    ../*.** This i
22db0 73 20 74 68 65 20 78 45 78 70 72 43 61 6c 6c 62  s the xExprCallb
22dc0 61 63 6b 20 66 6f 72 20 61 20 74 72 65 65 20 77  ack for a tree w
22dd0 61 6c 6b 65 72 2e 20 20 49 74 20 69 73 20 75 73  alker.  It is us
22de0 65 64 20 74 6f 0a 2a 2a 20 69 6d 70 6c 65 6d 65  ed to.** impleme
22df0 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e  nt sqlite3ExprAn
22e00 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28  alyzeAggregates(
22e10 29 2e 20 20 53 65 65 20 73 71 6c 69 74 65 33 45  ).  See sqlite3E
22e20 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67  xprAnalyzeAggreg
22e30 61 74 65 73 0a 2a 2a 20 66 6f 72 20 61 64 64 69  ates.** for addi
22e40 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69  tional informati
22e50 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
22e60 74 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  t analyzeAggrega
22e70 74 65 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b  te(Walker *pWalk
22e80 65 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  er, Expr *pExpr)
22e90 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4e 61 6d  {.  int i;.  Nam
22ea0 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 20 3d 20  eContext *pNC = 
22eb0 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 4e 43 3b 0a  pWalker->u.pNC;.
22ec0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20    Parse *pParse 
22ed0 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20  = pNC->pParse;. 
22ee0 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 4c 69   SrcList *pSrcLi
22ef0 73 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69  st = pNC->pSrcLi
22f00 73 74 3b 0a 20 20 41 67 67 49 6e 66 6f 20 2a 70  st;.  AggInfo *p
22f10 41 67 67 49 6e 66 6f 20 3d 20 70 4e 43 2d 3e 70  AggInfo = pNC->p
22f20 41 67 67 49 6e 66 6f 3b 0a 0a 20 20 73 77 69 74  AggInfo;..  swit
22f30 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b  ch( pExpr->op ){
22f40 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47  .    case TK_AGG
22f50 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73  _COLUMN:.    cas
22f60 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20  e TK_COLUMN: {. 
22f70 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
22f80 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47  Expr->op==TK_AGG
22f90 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20  _COLUMN );.     
22fa0 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
22fb0 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
22fc0 29 3b 0a 20 20 20 20 20 20 2f 2a 20 43 68 65 63  );.      /* Chec
22fd0 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20  k to see if the 
22fe0 63 6f 6c 75 6d 6e 20 69 73 20 69 6e 20 6f 6e 65  column is in one
22ff0 20 6f 66 20 74 68 65 20 74 61 62 6c 65 73 20 69   of the tables i
23000 6e 20 74 68 65 20 46 52 4f 4d 0a 20 20 20 20 20  n the FROM.     
23010 20 2a 2a 20 63 6c 61 75 73 65 20 6f 66 20 74 68   ** clause of th
23020 65 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72  e aggregate quer
23030 79 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 41  y */.      if( A
23040 4c 57 41 59 53 28 70 53 72 63 4c 69 73 74 21 3d  LWAYS(pSrcList!=
23050 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74  0) ){.        st
23060 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
23070 6d 20 2a 70 49 74 65 6d 20 3d 20 70 53 72 63 4c  m *pItem = pSrcL
23080 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20 20 20  ist->a;.        
23090 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72 63 4c  for(i=0; i<pSrcL
230a0 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20  ist->nSrc; i++, 
230b0 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
230c0 20 20 20 20 73 74 72 75 63 74 20 41 67 67 49 6e      struct AggIn
230d0 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 3b 0a 20 20  fo_col *pCol;.  
230e0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
230f0 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
23100 28 70 45 78 70 72 2c 20 45 50 5f 54 6f 6b 65 6e  (pExpr, EP_Token
23110 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64 29  Only|EP_Reduced)
23120 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   );.          if
23130 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d  ( pExpr->iTable=
23140 3d 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20  =pItem->iCursor 
23150 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  ){.            /
23160 2a 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68  * If we reach th
23170 69 73 20 70 6f 69 6e 74 2c 20 69 74 20 6d 65 61  is point, it mea
23180 6e 73 20 74 68 61 74 20 70 45 78 70 72 20 72 65  ns that pExpr re
23190 66 65 72 73 20 74 6f 20 61 20 74 61 62 6c 65 0a  fers to a table.
231a0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74              ** t
231b0 68 61 74 20 69 73 20 69 6e 20 74 68 65 20 46 52  hat is in the FR
231c0 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  OM clause of the
231d0 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72 79   aggregate query
231e0 2e 20 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  .  .            
231f0 2a 2a 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  **.            *
23200 2a 20 4d 61 6b 65 20 61 6e 20 65 6e 74 72 79 20  * Make an entry 
23210 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69  for the column i
23220 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c  n pAggInfo->aCol
23230 5b 5d 20 69 66 20 74 68 65 72 65 0a 20 20 20 20  [] if there.    
23240 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 6e 6f          ** is no
23250 74 20 61 6e 20 65 6e 74 72 79 20 74 68 65 72 65  t an entry there
23260 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 20 20   already..      
23270 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
23280 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20       int k;.    
23290 20 20 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 70          pCol = p
232a0 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 3b 0a 20  AggInfo->aCol;. 
232b0 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6b             for(k
232c0 3d 30 3b 20 6b 3c 70 41 67 67 49 6e 66 6f 2d 3e  =0; k<pAggInfo->
232d0 6e 43 6f 6c 75 6d 6e 3b 20 6b 2b 2b 2c 20 70 43  nColumn; k++, pC
232e0 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  ol++){.         
232f0 20 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69       if( pCol->i
23300 54 61 62 6c 65 3d 3d 70 45 78 70 72 2d 3e 69 54  Table==pExpr->iT
23310 61 62 6c 65 20 26 26 0a 20 20 20 20 20 20 20 20  able &&.        
23320 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e            pCol->
23330 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d 3e  iColumn==pExpr->
23340 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20  iColumn ){.     
23350 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
23360 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
23370 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  }.            }.
23380 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
23390 28 6b 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6e 43  (k>=pAggInfo->nC
233a0 6f 6c 75 6d 6e 29 0a 20 20 20 20 20 20 20 20 20  olumn).         
233b0 20 20 20 20 26 26 20 28 6b 20 3d 20 61 64 64 41      && (k = addA
233c0 67 67 49 6e 66 6f 43 6f 6c 75 6d 6e 28 70 50 61  ggInfoColumn(pPa
233d0 72 73 65 2d 3e 64 62 2c 20 70 41 67 67 49 6e 66  rse->db, pAggInf
233e0 6f 29 29 3e 3d 30 20 0a 20 20 20 20 20 20 20 20  o))>=0 .        
233f0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
23400 20 20 20 20 20 70 43 6f 6c 20 3d 20 26 70 41 67       pCol = &pAg
23410 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 6b 5d 3b 0a  gInfo->aCol[k];.
23420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
23430 6f 6c 2d 3e 70 54 61 62 20 3d 20 70 45 78 70 72  ol->pTab = pExpr
23440 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20  ->pTab;.        
23450 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 54 61 62        pCol->iTab
23460 6c 65 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62  le = pExpr->iTab
23470 6c 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  le;.            
23480 20 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 20    pCol->iColumn 
23490 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  = pExpr->iColumn
234a0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
234b0 70 43 6f 6c 2d 3e 69 4d 65 6d 20 3d 20 2b 2b 70  pCol->iMem = ++p
234c0 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
234d0 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
234e0 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 20 3d  >iSorterColumn =
234f0 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20   -1;.           
23500 20 20 20 70 43 6f 6c 2d 3e 70 45 78 70 72 20 3d     pCol->pExpr =
23510 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20   pExpr;.        
23520 20 20 20 20 20 20 69 66 28 20 70 41 67 67 49 6e        if( pAggIn
23530 66 6f 2d 3e 70 47 72 6f 75 70 42 79 20 29 7b 0a  fo->pGroupBy ){.
23540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23550 69 6e 74 20 6a 2c 20 6e 3b 0a 20 20 20 20 20 20  int j, n;.      
23560 20 20 20 20 20 20 20 20 20 20 45 78 70 72 4c 69            ExprLi
23570 73 74 20 2a 70 47 42 20 3d 20 70 41 67 67 49 6e  st *pGB = pAggIn
23580 66 6f 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20  fo->pGroupBy;.  
23590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74                st
235a0 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
235b0 65 6d 20 2a 70 54 65 72 6d 20 3d 20 70 47 42 2d  em *pTerm = pGB-
235c0 3e 61 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  >a;.            
235d0 20 20 20 20 6e 20 3d 20 70 47 42 2d 3e 6e 45 78      n = pGB->nEx
235e0 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  pr;.            
235f0 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e      for(j=0; j<n
23600 3b 20 6a 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b  ; j++, pTerm++){
23610 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
23620 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70 54     Expr *pE = pT
23630 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  erm->pExpr;.    
23640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
23650 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  ( pE->op==TK_COL
23660 55 4d 4e 20 26 26 20 70 45 2d 3e 69 54 61 62 6c  UMN && pE->iTabl
23670 65 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  e==pExpr->iTable
23680 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20   &&.            
23690 20 20 20 20 20 20 20 20 20 20 70 45 2d 3e 69 43            pE->iC
236a0 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d 3e 69 43  olumn==pExpr->iC
236b0 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20  olumn ){.       
236c0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
236d0 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e  l->iSorterColumn
236e0 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20   = j;.          
236f0 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
23700 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
23710 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
23720 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
23730 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
23740 20 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69       if( pCol->i
23750 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3c 30 20 29  SorterColumn<0 )
23760 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
23770 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43    pCol->iSorterC
23780 6f 6c 75 6d 6e 20 3d 20 70 41 67 67 49 6e 66 6f  olumn = pAggInfo
23790 2d 3e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e  ->nSortingColumn
237a0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ++;.            
237b0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
237c0 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  }.            /*
237d0 20 54 68 65 72 65 20 69 73 20 6e 6f 77 20 61 6e   There is now an
237e0 20 65 6e 74 72 79 20 66 6f 72 20 70 45 78 70 72   entry for pExpr
237f0 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43   in pAggInfo->aC
23800 6f 6c 5b 5d 20 28 65 69 74 68 65 72 0a 20 20 20  ol[] (either.   
23810 20 20 20 20 20 20 20 20 20 2a 2a 20 62 65 63 61           ** beca
23820 75 73 65 20 69 74 20 77 61 73 20 74 68 65 72 65  use it was there
23830 20 62 65 66 6f 72 65 20 6f 72 20 62 65 63 61 75   before or becau
23840 73 65 20 77 65 20 6a 75 73 74 20 63 72 65 61 74  se we just creat
23850 65 64 20 69 74 29 2e 0a 20 20 20 20 20 20 20 20  ed it)..        
23860 20 20 20 20 2a 2a 20 43 6f 6e 76 65 72 74 20 74      ** Convert t
23870 68 65 20 70 45 78 70 72 20 74 6f 20 62 65 20 61  he pExpr to be a
23880 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 72   TK_AGG_COLUMN r
23890 65 66 65 72 72 69 6e 67 20 74 6f 20 74 68 61 74  eferring to that
238a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
238b0 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d  pAggInfo->aCol[]
238c0 20 65 6e 74 72 79 2e 0a 20 20 20 20 20 20 20 20   entry..        
238d0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
238e0 20 20 20 45 78 70 72 53 65 74 56 56 41 50 72 6f     ExprSetVVAPro
238f0 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
23900 4e 6f 52 65 64 75 63 65 29 3b 0a 20 20 20 20 20  NoReduce);.     
23910 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 41         pExpr->pA
23920 67 67 49 6e 66 6f 20 3d 20 70 41 67 67 49 6e 66  ggInfo = pAggInf
23930 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  o;.            p
23940 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 41 47  Expr->op = TK_AG
23950 47 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20  G_COLUMN;.      
23960 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 41 67        pExpr->iAg
23970 67 20 3d 20 28 69 31 36 29 6b 3b 0a 20 20 20 20  g = (i16)k;.    
23980 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
23990 20 20 20 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e           } /* en
239a0 64 69 66 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  dif pExpr->iTabl
239b0 65 3d 3d 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f  e==pItem->iCurso
239c0 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 20 2f  r */.        } /
239d0 2a 20 65 6e 64 20 6c 6f 6f 70 20 6f 76 65 72 20  * end loop over 
239e0 70 53 72 63 4c 69 73 74 20 2a 2f 0a 20 20 20 20  pSrcList */.    
239f0 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e    }.      return
23a00 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20   WRC_Prune;.    
23a10 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47  }.    case TK_AG
23a20 47 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20  G_FUNCTION: {.  
23a30 20 20 20 20 69 66 28 20 28 70 4e 43 2d 3e 6e 63      if( (pNC->nc
23a40 46 6c 61 67 73 20 26 20 4e 43 5f 49 6e 41 67 67  Flags & NC_InAgg
23a50 46 75 6e 63 29 3d 3d 30 0a 20 20 20 20 20 20 20  Func)==0.       
23a60 26 26 20 70 57 61 6c 6b 65 72 2d 3e 77 61 6c 6b  && pWalker->walk
23a70 65 72 44 65 70 74 68 3d 3d 70 45 78 70 72 2d 3e  erDepth==pExpr->
23a80 6f 70 32 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  op2.      ){.   
23a90 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f       /* Check to
23aa0 20 73 65 65 20 69 66 20 70 45 78 70 72 20 69 73   see if pExpr is
23ab0 20 61 20 64 75 70 6c 69 63 61 74 65 20 6f 66 20   a duplicate of 
23ac0 61 6e 6f 74 68 65 72 20 61 67 67 72 65 67 61 74  another aggregat
23ad0 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75  e .        ** fu
23ae0 6e 63 74 69 6f 6e 20 74 68 61 74 20 69 73 20 61  nction that is a
23af0 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 70 41  lready in the pA
23b00 67 67 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  ggInfo structure
23b10 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
23b20 20 20 20 20 73 74 72 75 63 74 20 41 67 67 49 6e      struct AggIn
23b30 66 6f 5f 66 75 6e 63 20 2a 70 49 74 65 6d 20 3d  fo_func *pItem =
23b40 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63   pAggInfo->aFunc
23b50 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
23b60 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e  0; i<pAggInfo->n
23b70 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d  Func; i++, pItem
23b80 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ++){.          i
23b90 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  f( sqlite3ExprCo
23ba0 6d 70 61 72 65 28 70 49 74 65 6d 2d 3e 70 45 78  mpare(pItem->pEx
23bb0 70 72 2c 20 70 45 78 70 72 2c 20 2d 31 29 3d 3d  pr, pExpr, -1)==
23bc0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
23bd0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
23be0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
23bf0 20 20 20 20 20 20 69 66 28 20 69 3e 3d 70 41 67        if( i>=pAg
23c00 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 20 29 7b 0a  gInfo->nFunc ){.
23c10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 45 78            /* pEx
23c20 70 72 20 69 73 20 6f 72 69 67 69 6e 61 6c 2e 20  pr is original. 
23c30 20 4d 61 6b 65 20 61 20 6e 65 77 20 65 6e 74 72   Make a new entr
23c40 79 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61  y in pAggInfo->a
23c50 46 75 6e 63 5b 5d 0a 20 20 20 20 20 20 20 20 20  Func[].         
23c60 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 75 38   */.          u8
23c70 20 65 6e 63 20 3d 20 45 4e 43 28 70 50 61 72 73   enc = ENC(pPars
23c80 65 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20 20 20  e->db);.        
23c90 20 20 69 20 3d 20 61 64 64 41 67 67 49 6e 66 6f    i = addAggInfo
23ca0 46 75 6e 63 28 70 50 61 72 73 65 2d 3e 64 62 2c  Func(pParse->db,
23cb0 20 70 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20   pAggInfo);.    
23cc0 20 20 20 20 20 20 69 66 28 20 69 3e 3d 30 20 29        if( i>=0 )
23cd0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73  {.            as
23ce0 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
23cf0 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
23d00 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20  _xIsSelect) );. 
23d10 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d             pItem
23d20 20 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e 61 46   = &pAggInfo->aF
23d30 75 6e 63 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20  unc[i];.        
23d40 20 20 20 20 70 49 74 65 6d 2d 3e 70 45 78 70 72      pItem->pExpr
23d50 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20   = pExpr;.      
23d60 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 4d 65        pItem->iMe
23d70 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  m = ++pParse->nM
23d80 65 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  em;.            
23d90 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
23da0 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
23db0 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a  EP_IntValue) );.
23dc0 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65              pIte
23dd0 6d 2d 3e 70 46 75 6e 63 20 3d 20 73 71 6c 69 74  m->pFunc = sqlit
23de0 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 70  e3FindFunction(p
23df0 50 61 72 73 65 2d 3e 64 62 2c 0a 20 20 20 20 20  Parse->db,.     
23e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
23e10 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 73  xpr->u.zToken, s
23e20 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70  qlite3Strlen30(p
23e30 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 2c  Expr->u.zToken),
23e40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
23e50 20 20 20 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69      pExpr->x.pLi
23e60 73 74 20 3f 20 70 45 78 70 72 2d 3e 78 2e 70 4c  st ? pExpr->x.pL
23e70 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 2c 20  ist->nExpr : 0, 
23e80 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  enc, 0);.       
23e90 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
23ea0 66 6c 61 67 73 20 26 20 45 50 5f 44 69 73 74 69  flags & EP_Disti
23eb0 6e 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  nct ){.         
23ec0 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 44 69 73       pItem->iDis
23ed0 74 69 6e 63 74 20 3d 20 70 50 61 72 73 65 2d 3e  tinct = pParse->
23ee0 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nTab++;.        
23ef0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
23f00 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e           pItem->
23f10 69 44 69 73 74 69 6e 63 74 20 3d 20 2d 31 3b 0a  iDistinct = -1;.
23f20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
23f30 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
23f40 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20 4d    }.        /* M
23f50 61 6b 65 20 70 45 78 70 72 20 70 6f 69 6e 74 20  ake pExpr point 
23f60 74 6f 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  to the appropria
23f70 74 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75  te pAggInfo->aFu
23f80 6e 63 5b 5d 20 65 6e 74 72 79 0a 20 20 20 20 20  nc[] entry.     
23f90 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73     */.        as
23fa0 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
23fb0 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
23fc0 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65  _TokenOnly|EP_Re
23fd0 64 75 63 65 64 29 20 29 3b 0a 20 20 20 20 20 20  duced) );.      
23fe0 20 20 45 78 70 72 53 65 74 56 56 41 50 72 6f 70    ExprSetVVAProp
23ff0 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 4e  erty(pExpr, EP_N
24000 6f 52 65 64 75 63 65 29 3b 0a 20 20 20 20 20 20  oReduce);.      
24010 20 20 70 45 78 70 72 2d 3e 69 41 67 67 20 3d 20    pExpr->iAgg = 
24020 28 69 31 36 29 69 3b 0a 20 20 20 20 20 20 20 20  (i16)i;.        
24030 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f 20  pExpr->pAggInfo 
24040 3d 20 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20  = pAggInfo;.    
24050 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50      return WRC_P
24060 72 75 6e 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73  rune;.      }els
24070 65 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  e{.        retur
24080 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
24090 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
240a0 7d 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43  }.  return WRC_C
240b0 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 73 74 61 74 69  ontinue;.}.stati
240c0 63 20 69 6e 74 20 61 6e 61 6c 79 7a 65 41 67 67  c int analyzeAgg
240d0 72 65 67 61 74 65 73 49 6e 53 65 6c 65 63 74 28  regatesInSelect(
240e0 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c  Walker *pWalker,
240f0 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
24100 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
24110 4d 45 54 45 52 28 70 57 61 6c 6b 65 72 29 3b 0a  METER(pWalker);.
24120 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
24130 45 52 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 72  ER(pSelect);.  r
24140 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e  eturn WRC_Contin
24150 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61  ue;.}../*.** Ana
24160 6c 79 7a 65 20 74 68 65 20 70 45 78 70 72 20 65  lyze the pExpr e
24170 78 70 72 65 73 73 69 6f 6e 20 6c 6f 6f 6b 69 6e  xpression lookin
24180 67 20 66 6f 72 20 61 67 67 72 65 67 61 74 65 20  g for aggregate 
24190 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 0a 2a 2a  functions and.**
241a0 20 66 6f 72 20 76 61 72 69 61 62 6c 65 73 20 74   for variables t
241b0 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20 61  hat need to be a
241c0 64 64 65 64 20 74 6f 20 41 67 67 49 6e 66 6f 20  dded to AggInfo 
241d0 6f 62 6a 65 63 74 20 74 68 61 74 20 70 4e 43 2d  object that pNC-
241e0 3e 70 41 67 67 49 6e 66 6f 0a 2a 2a 20 70 6f 69  >pAggInfo.** poi
241f0 6e 74 73 20 74 6f 2e 20 20 41 64 64 69 74 69 6f  nts to.  Additio
24200 6e 61 6c 20 65 6e 74 72 69 65 73 20 61 72 65 20  nal entries are 
24210 6d 61 64 65 20 6f 6e 20 74 68 65 20 41 67 67 49  made on the AggI
24220 6e 66 6f 20 6f 62 6a 65 63 74 20 61 73 0a 2a 2a  nfo object as.**
24230 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 0a 2a   necessary..**.*
24240 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * This routine s
24250 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61  hould only be ca
24260 6c 6c 65 64 20 61 66 74 65 72 20 74 68 65 20 65  lled after the e
24270 78 70 72 65 73 73 69 6f 6e 20 68 61 73 20 62 65  xpression has be
24280 65 6e 0a 2a 2a 20 61 6e 61 6c 79 7a 65 64 20 62  en.** analyzed b
24290 79 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65  y sqlite3Resolve
242a0 45 78 70 72 4e 61 6d 65 73 28 29 2e 0a 2a 2f 0a  ExprNames()..*/.
242b0 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
242c0 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  AnalyzeAggregate
242d0 73 28 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70  s(NameContext *p
242e0 4e 43 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  NC, Expr *pExpr)
242f0 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20  {.  Walker w;.  
24300 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c 20 73 69  memset(&w, 0, si
24310 7a 65 6f 66 28 77 29 29 3b 0a 20 20 77 2e 78 45  zeof(w));.  w.xE
24320 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 61 6e  xprCallback = an
24330 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 3b 0a  alyzeAggregate;.
24340 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62    w.xSelectCallb
24350 61 63 6b 20 3d 20 61 6e 61 6c 79 7a 65 41 67 67  ack = analyzeAgg
24360 72 65 67 61 74 65 73 49 6e 53 65 6c 65 63 74 3b  regatesInSelect;
24370 0a 20 20 77 2e 75 2e 70 4e 43 20 3d 20 70 4e 43  .  w.u.pNC = pNC
24380 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e 43 2d  ;.  assert( pNC-
24390 3e 70 53 72 63 4c 69 73 74 21 3d 30 20 29 3b 0a  >pSrcList!=0 );.
243a0 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70    sqlite3WalkExp
243b0 72 28 26 77 2c 20 70 45 78 70 72 29 3b 0a 7d 0a  r(&w, pExpr);.}.
243c0 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 73 71 6c 69  ./*.** Call sqli
243d0 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
243e0 67 72 65 67 61 74 65 73 28 29 20 66 6f 72 20 65  gregates() for e
243f0 76 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20  very expression 
24400 69 6e 20 61 6e 0a 2a 2a 20 65 78 70 72 65 73 73  in an.** express
24410 69 6f 6e 20 6c 69 73 74 2e 20 20 52 65 74 75 72  ion list.  Retur
24420 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
24430 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  errors..**.** If
24440 20 61 6e 20 65 72 72 6f 72 20 69 73 20 66 6f 75   an error is fou
24450 6e 64 2c 20 74 68 65 20 61 6e 61 6c 79 73 69 73  nd, the analysis
24460 20 69 73 20 63 75 74 20 73 68 6f 72 74 2e 0a 2a   is cut short..*
24470 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
24480 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74  prAnalyzeAggList
24490 28 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e  (NameContext *pN
244a0 43 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  C, ExprList *pLi
244b0 73 74 29 7b 0a 20 20 73 74 72 75 63 74 20 45 78  st){.  struct Ex
244c0 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
244d0 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  em;.  int i;.  i
244e0 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  f( pList ){.    
244f0 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d  for(pItem=pList-
24500 3e 61 2c 20 69 3d 30 3b 20 69 3c 70 4c 69 73 74  >a, i=0; i<pList
24510 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49  ->nExpr; i++, pI
24520 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71  tem++){.      sq
24530 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65  lite3ExprAnalyze
24540 41 67 67 72 65 67 61 74 65 73 28 70 4e 43 2c 20  Aggregates(pNC, 
24550 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20  pItem->pExpr);. 
24560 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
24570 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 73 69 6e  * Allocate a sin
24580 67 6c 65 20 6e 65 77 20 72 65 67 69 73 74 65 72  gle new register
24590 20 66 6f 72 20 75 73 65 20 74 6f 20 68 6f 6c 64   for use to hold
245a0 20 73 6f 6d 65 20 69 6e 74 65 72 6d 65 64 69 61   some intermedia
245b0 74 65 20 72 65 73 75 6c 74 2e 0a 2a 2f 0a 69 6e  te result..*/.in
245c0 74 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  t sqlite3GetTemp
245d0 52 65 67 28 50 61 72 73 65 20 2a 70 50 61 72 73  Reg(Parse *pPars
245e0 65 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65  e){.  if( pParse
245f0 2d 3e 6e 54 65 6d 70 52 65 67 3d 3d 30 20 29 7b  ->nTempReg==0 ){
24600 0a 20 20 20 20 72 65 74 75 72 6e 20 2b 2b 70 50  .    return ++pP
24610 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 7d 0a  arse->nMem;.  }.
24620 20 20 72 65 74 75 72 6e 20 70 50 61 72 73 65 2d    return pParse-
24630 3e 61 54 65 6d 70 52 65 67 5b 2d 2d 70 50 61 72  >aTempReg[--pPar
24640 73 65 2d 3e 6e 54 65 6d 70 52 65 67 5d 3b 0a 7d  se->nTempReg];.}
24650 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61  ../*.** Dealloca
24660 74 65 20 61 20 72 65 67 69 73 74 65 72 2c 20 6d  te a register, m
24670 61 6b 69 6e 67 20 61 76 61 69 6c 61 62 6c 65 20  aking available 
24680 66 6f 72 20 72 65 75 73 65 20 66 6f 72 20 73 6f  for reuse for so
24690 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 70 75 72 70  me other.** purp
246a0 6f 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  ose..**.** If a 
246b0 72 65 67 69 73 74 65 72 20 69 73 20 63 75 72 72  register is curr
246c0 65 6e 74 6c 79 20 62 65 69 6e 67 20 75 73 65 64  ently being used
246d0 20 62 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63   by the column c
246e0 61 63 68 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68  ache, then.** th
246f0 65 20 64 65 61 6c 6c 6f 63 61 74 69 6f 6e 20 69  e deallocation i
24700 73 20 64 65 66 65 72 72 65 64 20 75 6e 74 69 6c  s deferred until
24710 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68   the column cach
24720 65 20 6c 69 6e 65 20 74 68 61 74 20 75 73 65 73  e line that uses
24730 0a 2a 2a 20 74 68 65 20 72 65 67 69 73 74 65 72  .** the register
24740 20 62 65 63 6f 6d 65 73 20 73 74 61 6c 65 2e 0a   becomes stale..
24750 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52  */.void sqlite3R
24760 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 50 61  eleaseTempReg(Pa
24770 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
24780 20 69 52 65 67 29 7b 0a 20 20 69 66 28 20 69 52   iReg){.  if( iR
24790 65 67 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 54  eg && pParse->nT
247a0 65 6d 70 52 65 67 3c 41 72 72 61 79 53 69 7a 65  empReg<ArraySize
247b0 28 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65  (pParse->aTempRe
247c0 67 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  g) ){.    int i;
247d0 0a 20 20 20 20 73 74 72 75 63 74 20 79 43 6f 6c  .    struct yCol
247e0 43 61 63 68 65 20 2a 70 3b 0a 20 20 20 20 66 6f  Cache *p;.    fo
247f0 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d  r(i=0, p=pParse-
24800 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51  >aColCache; i<SQ
24810 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b  LITE_N_COLCACHE;
24820 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20   i++, p++){.    
24830 20 20 69 66 28 20 70 2d 3e 69 52 65 67 3d 3d 69    if( p->iReg==i
24840 52 65 67 20 29 7b 0a 20 20 20 20 20 20 20 20 70  Reg ){.        p
24850 2d 3e 74 65 6d 70 52 65 67 20 3d 20 31 3b 0a 20  ->tempReg = 1;. 
24860 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20         return;. 
24870 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
24880 20 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65   pParse->aTempRe
24890 67 5b 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52  g[pParse->nTempR
248a0 65 67 2b 2b 5d 20 3d 20 69 52 65 67 3b 0a 20 20  eg++] = iReg;.  
248b0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  }.}../*.** Alloc
248c0 61 74 65 20 6f 72 20 64 65 61 6c 6c 6f 63 61 74  ate or deallocat
248d0 65 20 61 20 62 6c 6f 63 6b 20 6f 66 20 6e 52 65  e a block of nRe
248e0 67 20 63 6f 6e 73 65 63 75 74 69 76 65 20 72 65  g consecutive re
248f0 67 69 73 74 65 72 73 0a 2a 2f 0a 69 6e 74 20 73  gisters.*/.int s
24900 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e  qlite3GetTempRan
24910 67 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ge(Parse *pParse
24920 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20 69  , int nReg){.  i
24930 6e 74 20 69 2c 20 6e 3b 0a 20 20 69 20 3d 20 70  nt i, n;.  i = p
24940 50 61 72 73 65 2d 3e 69 52 61 6e 67 65 52 65 67  Parse->iRangeReg
24950 3b 0a 20 20 6e 20 3d 20 70 50 61 72 73 65 2d 3e  ;.  n = pParse->
24960 6e 52 61 6e 67 65 52 65 67 3b 0a 20 20 69 66 28  nRangeReg;.  if(
24970 20 6e 52 65 67 3c 3d 6e 20 29 7b 0a 20 20 20 20   nReg<=n ){.    
24980 61 73 73 65 72 74 28 20 21 75 73 65 64 41 73 43  assert( !usedAsC
24990 6f 6c 75 6d 6e 43 61 63 68 65 28 70 50 61 72 73  olumnCache(pPars
249a0 65 2c 20 69 2c 20 69 2b 6e 2d 31 29 20 29 3b 0a  e, i, i+n-1) );.
249b0 20 20 20 20 70 50 61 72 73 65 2d 3e 69 52 61 6e      pParse->iRan
249c0 67 65 52 65 67 20 2b 3d 20 6e 52 65 67 3b 0a 20  geReg += nReg;. 
249d0 20 20 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67     pParse->nRang
249e0 65 52 65 67 20 2d 3d 20 6e 52 65 67 3b 0a 20 20  eReg -= nReg;.  
249f0 7d 65 6c 73 65 7b 0a 20 20 20 20 69 20 3d 20 70  }else{.    i = p
24a00 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20  Parse->nMem+1;. 
24a10 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
24a20 2b 3d 20 6e 52 65 67 3b 0a 20 20 7d 0a 20 20 72  += nReg;.  }.  r
24a30 65 74 75 72 6e 20 69 3b 0a 7d 0a 76 6f 69 64 20  eturn i;.}.void 
24a40 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
24a50 6d 70 52 61 6e 67 65 28 50 61 72 73 65 20 2a 70  mpRange(Parse *p
24a60 50 61 72 73 65 2c 20 69 6e 74 20 69 52 65 67 2c  Parse, int iReg,
24a70 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20 73 71   int nReg){.  sq
24a80 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 52 65  lite3ExprCacheRe
24a90 6d 6f 76 65 28 70 50 61 72 73 65 2c 20 69 52 65  move(pParse, iRe
24aa0 67 2c 20 6e 52 65 67 29 3b 0a 20 20 69 66 28 20  g, nReg);.  if( 
24ab0 6e 52 65 67 3e 70 50 61 72 73 65 2d 3e 6e 52 61  nReg>pParse->nRa
24ac0 6e 67 65 52 65 67 20 29 7b 0a 20 20 20 20 70 50  ngeReg ){.    pP
24ad0 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20  arse->nRangeReg 
24ae0 3d 20 6e 52 65 67 3b 0a 20 20 20 20 70 50 61 72  = nReg;.    pPar
24af0 73 65 2d 3e 69 52 61 6e 67 65 52 65 67 20 3d 20  se->iRangeReg = 
24b00 69 52 65 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  iReg;.  }.}../*.
24b10 2a 2a 20 4d 61 72 6b 20 61 6c 6c 20 74 65 6d 70  ** Mark all temp
24b20 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 73 20  orary registers 
24b30 61 73 20 62 65 69 6e 67 20 75 6e 61 76 61 69 6c  as being unavail
24b40 61 62 6c 65 20 66 6f 72 20 72 65 75 73 65 2e 0a  able for reuse..
24b50 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43  */.void sqlite3C
24b60 6c 65 61 72 54 65 6d 70 52 65 67 43 61 63 68 65  learTempRegCache
24b70 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b  (Parse *pParse){
24b80 0a 20 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70  .  pParse->nTemp
24b90 52 65 67 20 3d 20 30 3b 0a 20 20 70 50 61 72 73  Reg = 0;.  pPars
24ba0 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20 3d 20 30  e->nRangeReg = 0
24bb0 3b 0a 7d 0a                                      ;.}.