/ Hex Artifact Content
Login

Artifact 00da3072f362b06f39ce4052baa1d4ce2bb36d1c:


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 20 75 73 65 64 20 74 6f  allbacks used to
9c40: 20 63 68 65 63 6b 20 65 78 70 72 65 73 73 69 6f   check expressio
9c50: 6e 73 20 74 6f 0a 2a 2a 20 73 65 65 20 69 66 20  ns to.** see if 
9c60: 74 68 65 79 20 61 72 65 20 22 63 6f 6e 73 74 61  they are "consta
9c70: 6e 74 22 20 66 6f 72 20 73 6f 6d 65 20 64 65 66  nt" for some def
9c80: 69 6e 69 74 69 6f 6e 20 6f 66 20 63 6f 6e 73 74  inition of const
9c90: 61 6e 74 2e 20 20 54 68 65 0a 2a 2a 20 57 61 6c  ant.  The.** Wal
9ca0: 6b 65 72 2e 65 43 6f 64 65 20 76 61 6c 75 65 20  ker.eCode value 
9cb0: 64 65 74 65 72 6d 69 6e 65 73 20 74 68 65 20 74  determines the t
9cc0: 79 70 65 20 6f 66 20 22 63 6f 6e 73 74 61 6e 74  ype of "constant
9cd0: 22 20 77 65 20 61 72 65 20 6c 6f 6f 6b 69 6e 67  " we are looking
9ce0: 0a 2a 2a 20 66 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54  .** for..**.** T
9cf0: 68 65 73 65 20 63 61 6c 6c 62 61 63 6b 20 72 6f  hese callback ro
9d00: 75 74 69 6e 65 73 20 61 72 65 20 75 73 65 64 20  utines are used 
9d10: 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65  to implement the
9d20: 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a   following:.**.*
9d30: 2a 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  *     sqlite3Exp
9d40: 72 49 73 43 6f 6e 73 74 61 6e 74 28 29 20 20 20  rIsConstant()   
9d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
9d60: 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 31  Walker->eCode==1
9d70: 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33 45  .**     sqlite3E
9d80: 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74  xprIsConstantNot
9d90: 4a 6f 69 6e 28 29 20 20 20 20 20 20 20 20 20 20  Join()          
9da0: 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d   pWalker->eCode=
9db0: 3d 32 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65  =2.**     sqlite
9dc0: 33 45 78 70 72 52 65 66 4f 6e 65 54 61 62 6c 65  3ExprRefOneTable
9dd0: 4f 6e 6c 79 28 29 20 20 20 20 20 20 20 20 20 20  Only()          
9de0: 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64     pWalker->eCod
9df0: 65 3d 3d 33 0a 2a 2a 20 20 20 20 20 73 71 6c 69  e==3.**     sqli
9e00: 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
9e10: 74 4f 72 46 75 6e 63 74 69 6f 6e 28 29 20 20 20  tOrFunction()   
9e20: 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43       pWalker->eC
9e30: 6f 64 65 3d 3d 34 20 6f 72 20 35 0a 2a 2a 0a 2a  ode==4 or 5.**.*
9e40: 2a 20 49 6e 20 61 6c 6c 20 63 61 73 65 73 2c 20  * In all cases, 
9e50: 74 68 65 20 63 61 6c 6c 62 61 63 6b 73 20 73 65  the callbacks se
9e60: 74 20 57 61 6c 6b 65 72 2e 65 43 6f 64 65 3d 30  t Walker.eCode=0
9e70: 20 61 6e 64 20 61 62 6f 72 74 20 69 66 20 74 68   and abort if th
9e80: 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20  e expression.** 
9e90: 69 73 20 66 6f 75 6e 64 20 74 6f 20 6e 6f 74 20  is found to not 
9ea0: 62 65 20 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a  be a constant..*
9eb0: 2a 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33  *.** The sqlite3
9ec0: 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72  ExprIsConstantOr
9ed0: 46 75 6e 63 74 69 6f 6e 28 29 20 69 73 20 75 73  Function() is us
9ee0: 65 64 20 66 6f 72 20 65 76 61 6c 75 61 74 69 6e  ed for evaluatin
9ef0: 67 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a  g expressions.**
9f00: 20 69 6e 20 61 20 43 52 45 41 54 45 20 54 41 42   in a CREATE TAB
9f10: 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54  LE statement.  T
9f20: 68 65 20 57 61 6c 6b 65 72 2e 65 43 6f 64 65 20  he Walker.eCode 
9f30: 76 61 6c 75 65 20 69 73 20 35 20 77 68 65 6e 20  value is 5 when 
9f40: 70 61 72 73 69 6e 67 0a 2a 2a 20 61 6e 20 65 78  parsing.** an ex
9f50: 69 73 74 69 6e 67 20 73 63 68 65 6d 61 20 61 6e  isting schema an
9f60: 64 20 34 20 77 68 65 6e 20 70 72 6f 63 65 73 73  d 4 when process
9f70: 69 6e 67 20 61 20 6e 65 77 20 73 74 61 74 65 6d  ing a new statem
9f80: 65 6e 74 2e 20 20 41 20 62 6f 75 6e 64 0a 2a 2a  ent.  A bound.**
9f90: 20 70 61 72 61 6d 65 74 65 72 20 72 61 69 73 65   parameter raise
9fa0: 73 20 61 6e 20 65 72 72 6f 72 20 66 6f 72 20 6e  s an error for n
9fb0: 65 77 20 73 74 61 74 65 6d 65 6e 74 73 2c 20 62  ew statements, b
9fc0: 75 74 20 69 73 20 73 69 6c 65 6e 74 6c 79 20 63  ut is silently c
9fd0: 6f 6e 76 65 72 74 65 64 0a 2a 2a 20 74 6f 20 4e  onverted.** to N
9fe0: 55 4c 4c 20 66 6f 72 20 65 78 69 73 74 69 6e 67  ULL for existing
9ff0: 20 73 63 68 65 6d 61 73 2e 20 20 54 68 69 73 20   schemas.  This 
a000: 61 6c 6c 6f 77 73 20 73 71 6c 69 74 65 5f 6d 61  allows sqlite_ma
a010: 73 74 65 72 20 74 61 62 6c 65 73 20 74 68 61 74  ster tables that
a020: 20 0a 2a 2a 20 63 6f 6e 74 61 69 6e 20 61 20 62   .** contain a b
a030: 6f 75 6e 64 20 70 61 72 61 6d 65 74 65 72 20 62  ound parameter b
a040: 65 63 61 75 73 65 20 74 68 65 79 20 77 65 72 65  ecause they were
a050: 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 6f 6c   generated by ol
a060: 64 65 72 20 76 65 72 73 69 6f 6e 73 0a 2a 2a 20  der versions.** 
a070: 6f 66 20 53 51 4c 69 74 65 20 74 6f 20 62 65 20  of SQLite to be 
a080: 70 61 72 73 65 64 20 62 79 20 6e 65 77 65 72 20  parsed by newer 
a090: 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69  versions of SQLi
a0a0: 74 65 20 77 69 74 68 6f 75 74 20 72 61 69 73 69  te without raisi
a0b0: 6e 67 20 61 0a 2a 2a 20 6d 61 6c 66 6f 72 6d 65  ng a.** malforme
a0c0: 64 20 73 63 68 65 6d 61 20 65 72 72 6f 72 2e 0a  d schema error..
a0d0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78  */.static int ex
a0e0: 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74  prNodeIsConstant
a0f0: 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72  (Walker *pWalker
a100: 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  , Expr *pExpr){.
a110: 0a 20 20 2f 2a 20 49 66 20 70 57 61 6c 6b 65 72  .  /* If pWalker
a120: 2d 3e 65 43 6f 64 65 20 69 73 20 32 20 74 68 65  ->eCode is 2 the
a130: 6e 20 61 6e 79 20 74 65 72 6d 20 6f 66 20 74 68  n any term of th
a140: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61  e expression tha
a150: 74 20 63 6f 6d 65 73 20 66 72 6f 6d 0a 20 20 2a  t comes from.  *
a160: 2a 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e  * the ON or USIN
a170: 47 20 63 6c 61 75 73 65 73 20 6f 66 20 61 20 6c  G clauses of a l
a180: 65 66 74 20 6a 6f 69 6e 20 64 69 73 71 75 61 6c  eft join disqual
a190: 69 66 69 65 73 20 74 68 65 20 65 78 70 72 65 73  ifies the expres
a1a0: 73 69 6f 6e 0a 20 20 2a 2a 20 66 72 6f 6d 20 62  sion.  ** from b
a1b0: 65 69 6e 67 20 63 6f 6e 73 69 64 65 72 65 64 20  eing considered 
a1c0: 63 6f 6e 73 74 61 6e 74 2e 20 2a 2f 0a 20 20 69  constant. */.  i
a1d0: 66 28 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64  f( pWalker->eCod
a1e0: 65 3d 3d 32 20 26 26 20 45 78 70 72 48 61 73 50  e==2 && ExprHasP
a1f0: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
a200: 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20  P_FromJoin) ){. 
a210: 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64     pWalker->eCod
a220: 65 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72  e = 0;.    retur
a230: 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d  n WRC_Abort;.  }
a240: 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70  ..  switch( pExp
a250: 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 2f 2a 20  r->op ){.    /* 
a260: 43 6f 6e 73 69 64 65 72 20 66 75 6e 63 74 69 6f  Consider functio
a270: 6e 73 20 74 6f 20 62 65 20 63 6f 6e 73 74 61 6e  ns to be constan
a280: 74 20 69 66 20 61 6c 6c 20 74 68 65 69 72 20 61  t if all their a
a290: 72 67 75 6d 65 6e 74 73 20 61 72 65 20 63 6f 6e  rguments are con
a2a0: 73 74 61 6e 74 0a 20 20 20 20 2a 2a 20 61 6e 64  stant.    ** and
a2b0: 20 65 69 74 68 65 72 20 70 57 61 6c 6b 65 72 2d   either pWalker-
a2c0: 3e 65 43 6f 64 65 3d 3d 34 20 6f 72 20 35 20 6f  >eCode==4 or 5 o
a2d0: 72 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 68  r the function h
a2e0: 61 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 53 51  as the.    ** SQ
a2f0: 4c 49 54 45 5f 46 55 4e 43 5f 43 4f 4e 53 54 20  LITE_FUNC_CONST 
a300: 66 6c 61 67 2e 20 2a 2f 0a 20 20 20 20 63 61 73  flag. */.    cas
a310: 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20  e TK_FUNCTION:. 
a320: 20 20 20 20 20 69 66 28 20 70 57 61 6c 6b 65 72       if( pWalker
a330: 2d 3e 65 43 6f 64 65 3e 3d 34 20 7c 7c 20 45 78  ->eCode>=4 || Ex
a340: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
a350: 78 70 72 2c 45 50 5f 43 6f 6e 73 74 61 6e 74 29  xpr,EP_Constant)
a360: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
a370: 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
a380: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
a390: 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65        pWalker->e
a3a0: 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Code = 0;.      
a3b0: 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f    return WRC_Abo
a3c0: 72 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rt;.      }.    
a3d0: 63 61 73 65 20 54 4b 5f 49 44 3a 0a 20 20 20 20  case TK_ID:.    
a3e0: 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a  case TK_COLUMN:.
a3f0: 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f      case TK_AGG_
a400: 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 63 61  FUNCTION:.    ca
a410: 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  se TK_AGG_COLUMN
a420: 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  :.      testcase
a430: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
a440: 49 44 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ID );.      test
a450: 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
a460: 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20  =TK_COLUMN );.  
a470: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
a480: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f  xpr->op==TK_AGG_
a490: 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 20 20  FUNCTION );.    
a4a0: 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
a4b0: 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f  r->op==TK_AGG_CO
a4c0: 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 69 66  LUMN );.      if
a4d0: 28 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65  ( pWalker->eCode
a4e0: 3d 3d 33 20 26 26 20 70 45 78 70 72 2d 3e 69 54  ==3 && pExpr->iT
a4f0: 61 62 6c 65 3d 3d 70 57 61 6c 6b 65 72 2d 3e 75  able==pWalker->u
a500: 2e 69 43 75 72 20 29 7b 0a 20 20 20 20 20 20 20  .iCur ){.       
a510: 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
a520: 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73  inue;.      }els
a530: 65 7b 0a 20 20 20 20 20 20 20 20 70 57 61 6c 6b  e{.        pWalk
a540: 65 72 2d 3e 65 43 6f 64 65 20 3d 20 30 3b 0a 20  er->eCode = 0;. 
a550: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52         return WR
a560: 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 7d  C_Abort;.      }
a570: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 56 41 52  .    case TK_VAR
a580: 49 41 42 4c 45 3a 0a 20 20 20 20 20 20 69 66 28  IABLE:.      if(
a590: 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d   pWalker->eCode=
a5a0: 3d 35 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  =5 ){.        /*
a5b0: 20 53 69 6c 65 6e 74 6c 79 20 63 6f 6e 76 65 72   Silently conver
a5c0: 74 20 62 6f 75 6e 64 20 70 61 72 61 6d 65 74 65  t bound paramete
a5d0: 72 73 20 74 68 61 74 20 61 70 70 65 61 72 20 69  rs that appear i
a5e0: 6e 73 69 64 65 20 6f 66 20 43 52 45 41 54 45 0a  nside of CREATE.
a5f0: 20 20 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65          ** state
a600: 6d 65 6e 74 73 20 69 6e 74 6f 20 61 20 4e 55 4c  ments into a NUL
a610: 4c 20 77 68 65 6e 20 70 61 72 73 69 6e 67 20 74  L when parsing t
a620: 68 65 20 43 52 45 41 54 45 20 73 74 61 74 65 6d  he CREATE statem
a630: 65 6e 74 20 74 65 78 74 20 6f 75 74 0a 20 20 20  ent text out.   
a640: 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 73       ** of the s
a650: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
a660: 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 45  le */.        pE
a670: 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 4e 55 4c  xpr->op = TK_NUL
a680: 4c 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  L;.      }else i
a690: 66 28 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64  f( pWalker->eCod
a6a0: 65 3d 3d 34 20 29 7b 0a 20 20 20 20 20 20 20 20  e==4 ){.        
a6b0: 2f 2a 20 41 20 62 6f 75 6e 64 20 70 61 72 61 6d  /* A bound param
a6c0: 65 74 65 72 20 69 6e 20 61 20 43 52 45 41 54 45  eter in a CREATE
a6d0: 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20   statement that 
a6e0: 6f 72 69 67 69 6e 61 74 65 73 20 66 72 6f 6d 0a  originates from.
a6f0: 20 20 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74          ** sqlit
a700: 65 33 5f 70 72 65 70 61 72 65 28 29 20 63 61 75  e3_prepare() cau
a710: 73 65 73 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a  ses an error */.
a720: 20 20 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d          pWalker-
a730: 3e 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20  >eCode = 0;.    
a740: 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41      return WRC_A
a750: 62 6f 72 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  bort;.      }.  
a760: 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f      /* Fall thro
a770: 75 67 68 20 2a 2f 0a 20 20 20 20 64 65 66 61 75  ugh */.    defau
a780: 6c 74 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61  lt:.      testca
a790: 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
a7a0: 4b 5f 53 45 4c 45 43 54 20 29 3b 20 2f 2a 20 73  K_SELECT ); /* s
a7b0: 65 6c 65 63 74 4e 6f 64 65 49 73 43 6f 6e 73 74  electNodeIsConst
a7c0: 61 6e 74 20 77 69 6c 6c 20 64 69 73 61 6c 6c 6f  ant will disallo
a7d0: 77 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63  w */.      testc
a7e0: 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
a7f0: 54 4b 5f 45 58 49 53 54 53 20 29 3b 20 2f 2a 20  TK_EXISTS ); /* 
a800: 73 65 6c 65 63 74 4e 6f 64 65 49 73 43 6f 6e 73  selectNodeIsCons
a810: 74 61 6e 74 20 77 69 6c 6c 20 64 69 73 61 6c 6c  tant will disall
a820: 6f 77 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75  ow */.      retu
a830: 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
a840: 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 69 6e  .  }.}.static in
a850: 74 20 73 65 6c 65 63 74 4e 6f 64 65 49 73 43 6f  t selectNodeIsCo
a860: 6e 73 74 61 6e 74 28 57 61 6c 6b 65 72 20 2a 70  nstant(Walker *p
a870: 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a  Walker, Select *
a880: 4e 6f 74 55 73 65 64 29 7b 0a 20 20 55 4e 55 53  NotUsed){.  UNUS
a890: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
a8a0: 55 73 65 64 29 3b 0a 20 20 70 57 61 6c 6b 65 72  Used);.  pWalker
a8b0: 2d 3e 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20 72  ->eCode = 0;.  r
a8c0: 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
a8d0: 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78  .}.static int ex
a8e0: 70 72 49 73 43 6f 6e 73 74 28 45 78 70 72 20 2a  prIsConst(Expr *
a8f0: 70 2c 20 69 6e 74 20 69 6e 69 74 46 6c 61 67 2c  p, int initFlag,
a900: 20 69 6e 74 20 69 43 75 72 29 7b 0a 20 20 57 61   int iCur){.  Wa
a910: 6c 6b 65 72 20 77 3b 0a 20 20 6d 65 6d 73 65 74  lker w;.  memset
a920: 28 26 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77  (&w, 0, sizeof(w
a930: 29 29 3b 0a 20 20 77 2e 65 43 6f 64 65 20 3d 20  ));.  w.eCode = 
a940: 69 6e 69 74 46 6c 61 67 3b 0a 20 20 77 2e 78 45  initFlag;.  w.xE
a950: 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78  xprCallback = ex
a960: 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74  prNodeIsConstant
a970: 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c  ;.  w.xSelectCal
a980: 6c 62 61 63 6b 20 3d 20 73 65 6c 65 63 74 4e 6f  lback = selectNo
a990: 64 65 49 73 43 6f 6e 73 74 61 6e 74 3b 0a 20 20  deIsConstant;.  
a9a0: 77 2e 75 2e 69 43 75 72 20 3d 20 69 43 75 72 3b  w.u.iCur = iCur;
a9b0: 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78  .  sqlite3WalkEx
a9c0: 70 72 28 26 77 2c 20 70 29 3b 0a 20 20 72 65 74  pr(&w, p);.  ret
a9d0: 75 72 6e 20 77 2e 65 43 6f 64 65 3b 0a 7d 0a 0a  urn w.eCode;.}..
a9e0: 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78  /*.** Walk an ex
a9f0: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20  pression tree.  
aa00: 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20  Return non-zero 
aa10: 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
aa20: 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a  n is constant.**
aa30: 20 61 6e 64 20 30 20 69 66 20 69 74 20 69 6e 76   and 0 if it inv
aa40: 6f 6c 76 65 73 20 76 61 72 69 61 62 6c 65 73 20  olves variables 
aa50: 6f 72 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c  or function call
aa60: 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65  s..**.** For the
aa70: 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68 69   purposes of thi
aa80: 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20 64 6f  s function, a do
aa90: 75 62 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69  uble-quoted stri
aaa0: 6e 67 20 28 65 78 3a 20 22 61 62 63 22 29 0a 2a  ng (ex: "abc").*
aab0: 2a 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20  * is considered 
aac0: 61 20 76 61 72 69 61 62 6c 65 20 62 75 74 20 61  a variable but a
aad0: 20 73 69 6e 67 6c 65 2d 71 75 6f 74 65 64 20 73   single-quoted s
aae0: 74 72 69 6e 67 20 28 65 78 3a 20 27 61 62 63 27  tring (ex: 'abc'
aaf0: 29 20 69 73 0a 2a 2a 20 61 20 63 6f 6e 73 74 61  ) is.** a consta
ab00: 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nt..*/.int sqlit
ab10: 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
ab20: 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 72 65 74  (Expr *p){.  ret
ab30: 75 72 6e 20 65 78 70 72 49 73 43 6f 6e 73 74 28  urn exprIsConst(
ab40: 70 2c 20 31 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a  p, 1, 0);.}../*.
ab50: 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65  ** Walk an expre
ab60: 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74  ssion tree.  Ret
ab70: 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20  urn non-zero if 
ab80: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
ab90: 73 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 74 68  s constant.** th
aba0: 61 74 20 64 6f 65 73 20 6e 6f 20 6f 72 69 67 69  at does no origi
abb0: 6e 61 74 65 20 66 72 6f 6d 20 74 68 65 20 4f 4e  nate from the ON
abc0: 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65   or USING clause
abd0: 73 20 6f 66 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 20  s of a join..** 
abe0: 52 65 74 75 72 6e 20 30 20 69 66 20 69 74 20 69  Return 0 if it i
abf0: 6e 76 6f 6c 76 65 73 20 76 61 72 69 61 62 6c 65  nvolves variable
ac00: 73 20 6f 72 20 66 75 6e 63 74 69 6f 6e 20 63 61  s or function ca
ac10: 6c 6c 73 20 6f 72 20 74 65 72 6d 73 20 66 72 6f  lls or terms fro
ac20: 6d 0a 2a 2a 20 61 6e 20 4f 4e 20 6f 72 20 55 53  m.** an ON or US
ac30: 49 4e 47 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 69  ING clause..*/.i
ac40: 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  nt sqlite3ExprIs
ac50: 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28  ConstantNotJoin(
ac60: 45 78 70 72 20 2a 70 29 7b 0a 20 20 72 65 74 75  Expr *p){.  retu
ac70: 72 6e 20 65 78 70 72 49 73 43 6f 6e 73 74 28 70  rn exprIsConst(p
ac80: 2c 20 32 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  , 2, 0);.}../*.*
ac90: 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73  * Walk an expres
aca0: 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75  sion tree.  Retu
acb0: 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74  rn non-zero if t
acc0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 63 6f  he expression co
acd0: 6e 73 74 61 6e 74 0a 2a 2a 20 66 6f 72 20 61 6e  nstant.** for an
ace0: 79 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20  y single row of 
acf0: 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 63  the table with c
ad00: 75 72 73 6f 72 20 69 43 75 72 2e 20 20 49 6e 20  ursor iCur.  In 
ad10: 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68 65  other words, the
ad20: 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6d  .** expression m
ad30: 75 73 74 20 6e 6f 74 20 72 65 66 65 72 20 74 6f  ust not refer to
ad40: 20 61 6e 79 20 6e 6f 6e 2d 64 65 74 65 72 6d 69   any non-determi
ad50: 6e 69 73 74 69 63 20 66 75 6e 63 74 69 6f 6e 20  nistic function 
ad60: 6e 6f 72 20 61 6e 79 0a 2a 2a 20 74 61 62 6c 65  nor any.** table
ad70: 20 6f 74 68 65 72 20 74 68 61 6e 20 69 43 75 72   other than iCur
ad80: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
ad90: 45 78 70 72 49 73 54 61 62 6c 65 43 6f 6e 73 74  ExprIsTableConst
ada0: 61 6e 74 28 45 78 70 72 20 2a 70 2c 20 69 6e 74  ant(Expr *p, int
adb0: 20 69 43 75 72 29 7b 0a 20 20 72 65 74 75 72 6e   iCur){.  return
adc0: 20 65 78 70 72 49 73 43 6f 6e 73 74 28 70 2c 20   exprIsConst(p, 
add0: 33 2c 20 69 43 75 72 29 3b 0a 7d 0a 0a 2f 2a 0a  3, iCur);.}../*.
ade0: 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65  ** Walk an expre
adf0: 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74  ssion tree.  Ret
ae00: 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20  urn non-zero if 
ae10: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
ae20: 73 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 6f 72  s constant.** or
ae30: 20 61 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c   a function call
ae40: 20 77 69 74 68 20 63 6f 6e 73 74 61 6e 74 20 61   with constant a
ae50: 72 67 75 6d 65 6e 74 73 2e 20 20 52 65 74 75 72  rguments.  Retur
ae60: 6e 20 61 6e 64 20 30 20 69 66 20 74 68 65 72 65  n and 0 if there
ae70: 0a 2a 2a 20 61 72 65 20 61 6e 79 20 76 61 72 69  .** are any vari
ae80: 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  ables..**.** For
ae90: 20 74 68 65 20 70 75 72 70 6f 73 65 73 20 6f 66   the purposes of
aea0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20   this function, 
aeb0: 61 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65 64 20  a double-quoted 
aec0: 73 74 72 69 6e 67 20 28 65 78 3a 20 22 61 62 63  string (ex: "abc
aed0: 22 29 0a 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65  ").** is conside
aee0: 72 65 64 20 61 20 76 61 72 69 61 62 6c 65 20 62  red a variable b
aef0: 75 74 20 61 20 73 69 6e 67 6c 65 2d 71 75 6f 74  ut a single-quot
af00: 65 64 20 73 74 72 69 6e 67 20 28 65 78 3a 20 27  ed string (ex: '
af10: 61 62 63 27 29 20 69 73 0a 2a 2a 20 61 20 63 6f  abc') is.** a co
af20: 6e 73 74 61 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73  nstant..*/.int s
af30: 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
af40: 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f 6e 28 45  tantOrFunction(E
af50: 78 70 72 20 2a 70 2c 20 75 38 20 69 73 49 6e 69  xpr *p, u8 isIni
af60: 74 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 73  t){.  assert( is
af70: 49 6e 69 74 3d 3d 30 20 7c 7c 20 69 73 49 6e 69  Init==0 || isIni
af80: 74 3d 3d 31 20 29 3b 0a 20 20 72 65 74 75 72 6e  t==1 );.  return
af90: 20 65 78 70 72 49 73 43 6f 6e 73 74 28 70 2c 20   exprIsConst(p, 
afa0: 34 2b 69 73 49 6e 69 74 2c 20 30 29 3b 0a 7d 0a  4+isInit, 0);.}.
afb0: 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78  ./*.** If the ex
afc0: 70 72 65 73 73 69 6f 6e 20 70 20 63 6f 64 65 73  pression p codes
afd0: 20 61 20 63 6f 6e 73 74 61 6e 74 20 69 6e 74 65   a constant inte
afe0: 67 65 72 20 74 68 61 74 20 69 73 20 73 6d 61 6c  ger that is smal
aff0: 6c 20 65 6e 6f 75 67 68 0a 2a 2a 20 74 6f 20 66  l enough.** to f
b000: 69 74 20 69 6e 20 61 20 33 32 2d 62 69 74 20 69  it in a 32-bit i
b010: 6e 74 65 67 65 72 2c 20 72 65 74 75 72 6e 20 31  nteger, return 1
b020: 20 61 6e 64 20 70 75 74 20 74 68 65 20 76 61 6c   and put the val
b030: 75 65 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65  ue of the intege
b040: 72 0a 2a 2a 20 69 6e 20 2a 70 56 61 6c 75 65 2e  r.** in *pValue.
b050: 20 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73    If the express
b060: 69 6f 6e 20 69 73 20 6e 6f 74 20 61 6e 20 69 6e  ion is not an in
b070: 74 65 67 65 72 20 6f 72 20 69 66 20 69 74 20 69  teger or if it i
b080: 73 20 74 6f 6f 20 62 69 67 0a 2a 2a 20 74 6f 20  s too big.** to 
b090: 66 69 74 20 69 6e 20 61 20 73 69 67 6e 65 64 20  fit in a signed 
b0a0: 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 2c 20  32-bit integer, 
b0b0: 72 65 74 75 72 6e 20 30 20 61 6e 64 20 6c 65 61  return 0 and lea
b0c0: 76 65 20 2a 70 56 61 6c 75 65 20 75 6e 63 68 61  ve *pValue uncha
b0d0: 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  nged..*/.int sql
b0e0: 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65  ite3ExprIsIntege
b0f0: 72 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 2a  r(Expr *p, int *
b100: 70 56 61 6c 75 65 29 7b 0a 20 20 69 6e 74 20 72  pValue){.  int r
b110: 63 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49 66 20  c = 0;..  /* If 
b120: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  an expression is
b130: 20 61 6e 20 69 6e 74 65 67 65 72 20 6c 69 74 65   an integer lite
b140: 72 61 6c 20 74 68 61 74 20 66 69 74 73 20 69 6e  ral that fits in
b150: 20 61 20 73 69 67 6e 65 64 20 33 32 2d 62 69 74   a signed 32-bit
b160: 0a 20 20 2a 2a 20 69 6e 74 65 67 65 72 2c 20 74  .  ** integer, t
b170: 68 65 6e 20 74 68 65 20 45 50 5f 49 6e 74 56 61  hen the EP_IntVa
b180: 6c 75 65 20 66 6c 61 67 20 77 69 6c 6c 20 68 61  lue flag will ha
b190: 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ve already been 
b1a0: 73 65 74 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  set */.  assert(
b1b0: 20 70 2d 3e 6f 70 21 3d 54 4b 5f 49 4e 54 45 47   p->op!=TK_INTEG
b1c0: 45 52 20 7c 7c 20 28 70 2d 3e 66 6c 61 67 73 20  ER || (p->flags 
b1d0: 26 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 21 3d  & EP_IntValue)!=
b1e0: 30 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  0.           || 
b1f0: 73 71 6c 69 74 65 33 47 65 74 49 6e 74 33 32 28  sqlite3GetInt32(
b200: 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 26 72 63  p->u.zToken, &rc
b210: 29 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 70  )==0 );..  if( p
b220: 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e 74  ->flags & EP_Int
b230: 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 2a 70 56  Value ){.    *pV
b240: 61 6c 75 65 20 3d 20 70 2d 3e 75 2e 69 56 61 6c  alue = p->u.iVal
b250: 75 65 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  ue;.    return 1
b260: 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63 68 28 20  ;.  }.  switch( 
b270: 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  p->op ){.    cas
b280: 65 20 54 4b 5f 55 50 4c 55 53 3a 20 7b 0a 20 20  e TK_UPLUS: {.  
b290: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
b2a0: 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 2d  ExprIsInteger(p-
b2b0: 3e 70 4c 65 66 74 2c 20 70 56 61 6c 75 65 29 3b  >pLeft, pValue);
b2c0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
b2d0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
b2e0: 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20 20 20 20  UMINUS: {.      
b2f0: 69 6e 74 20 76 3b 0a 20 20 20 20 20 20 69 66 28  int v;.      if(
b300: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e   sqlite3ExprIsIn
b310: 74 65 67 65 72 28 70 2d 3e 70 4c 65 66 74 2c 20  teger(p->pLeft, 
b320: 26 76 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61  &v) ){.        a
b330: 73 73 65 72 74 28 20 76 21 3d 28 2d 32 31 34 37  ssert( v!=(-2147
b340: 34 38 33 36 34 37 2d 31 29 20 29 3b 0a 20 20 20  483647-1) );.   
b350: 20 20 20 20 20 2a 70 56 61 6c 75 65 20 3d 20 2d       *pValue = -
b360: 76 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  v;.        rc = 
b370: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
b380: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
b390: 20 20 64 65 66 61 75 6c 74 3a 20 62 72 65 61 6b    default: break
b3a0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
b3b0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
b3c0: 72 6e 20 46 41 4c 53 45 20 69 66 20 74 68 65 72  rn FALSE if ther
b3d0: 65 20 69 73 20 6e 6f 20 63 68 61 6e 63 65 20 74  e is no chance t
b3e0: 68 61 74 20 74 68 65 20 65 78 70 72 65 73 73 69  hat the expressi
b3f0: 6f 6e 20 63 61 6e 20 62 65 20 4e 55 4c 4c 2e 0a  on can be NULL..
b400: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70  **.** If the exp
b410: 72 65 73 73 69 6f 6e 20 6d 69 67 68 74 20 62 65  ression might be
b420: 20 4e 55 4c 4c 20 6f 72 20 69 66 20 74 68 65 20   NULL or if the 
b430: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 6f  expression is to
b440: 6f 20 63 6f 6d 70 6c 65 78 0a 2a 2a 20 74 6f 20  o complex.** to 
b450: 74 65 6c 6c 20 72 65 74 75 72 6e 20 54 52 55 45  tell return TRUE
b460: 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  .  .**.** This r
b470: 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 61  outine is used a
b480: 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f  s an optimizatio
b490: 6e 2c 20 74 6f 20 73 6b 69 70 20 4f 50 5f 49 73  n, to skip OP_Is
b4a0: 4e 75 6c 6c 20 6f 70 63 6f 64 65 73 0a 2a 2a 20  Null opcodes.** 
b4b0: 77 68 65 6e 20 77 65 20 6b 6e 6f 77 20 74 68 61  when we know tha
b4c0: 74 20 61 20 76 61 6c 75 65 20 63 61 6e 6e 6f 74  t a value cannot
b4d0: 20 62 65 20 4e 55 4c 4c 2e 20 20 48 65 6e 63 65   be NULL.  Hence
b4e0: 2c 20 61 20 66 61 6c 73 65 20 70 6f 73 69 74 69  , a false positi
b4f0: 76 65 0a 2a 2a 20 28 72 65 74 75 72 6e 69 6e 67  ve.** (returning
b500: 20 54 52 55 45 20 77 68 65 6e 20 69 6e 20 66 61   TRUE when in fa
b510: 63 74 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  ct the expressio
b520: 6e 20 63 61 6e 20 6e 65 76 65 72 20 62 65 20 4e  n can never be N
b530: 55 4c 4c 29 20 6d 69 67 68 74 0a 2a 2a 20 62 65  ULL) might.** be
b540: 20 61 20 73 6d 61 6c 6c 20 70 65 72 66 6f 72 6d   a small perform
b550: 61 6e 63 65 20 68 69 74 20 62 75 74 20 69 73 20  ance hit but is 
b560: 6f 74 68 65 72 77 69 73 65 20 68 61 72 6d 6c 65  otherwise harmle
b570: 73 73 2e 20 20 4f 6e 20 74 68 65 20 6f 74 68 65  ss.  On the othe
b580: 72 0a 2a 2a 20 68 61 6e 64 2c 20 61 20 66 61 6c  r.** hand, a fal
b590: 73 65 20 6e 65 67 61 74 69 76 65 20 28 72 65 74  se negative (ret
b5a0: 75 72 6e 69 6e 67 20 46 41 4c 53 45 20 77 68 65  urning FALSE whe
b5b0: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f 75  n the result cou
b5c0: 6c 64 20 62 65 20 4e 55 4c 4c 29 0a 2a 2a 20 77  ld be NULL).** w
b5d0: 69 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 73 75 6c  ill likely resul
b5e0: 74 20 69 6e 20 61 6e 20 69 6e 63 6f 72 72 65 63  t in an incorrec
b5f0: 74 20 61 6e 73 77 65 72 2e 20 20 53 6f 20 77 68  t answer.  So wh
b600: 65 6e 20 69 6e 20 64 6f 75 62 74 2c 20 72 65 74  en in doubt, ret
b610: 75 72 6e 0a 2a 2a 20 54 52 55 45 2e 0a 2a 2f 0a  urn.** TRUE..*/.
b620: 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43  int sqlite3ExprC
b630: 61 6e 42 65 4e 75 6c 6c 28 63 6f 6e 73 74 20 45  anBeNull(const E
b640: 78 70 72 20 2a 70 29 7b 0a 20 20 75 38 20 6f 70  xpr *p){.  u8 op
b650: 3b 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 6f 70  ;.  while( p->op
b660: 3d 3d 54 4b 5f 55 50 4c 55 53 20 7c 7c 20 70 2d  ==TK_UPLUS || p-
b670: 3e 6f 70 3d 3d 54 4b 5f 55 4d 49 4e 55 53 20 29  >op==TK_UMINUS )
b680: 7b 20 70 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 20  { p = p->pLeft; 
b690: 7d 0a 20 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a  }.  op = p->op;.
b6a0: 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 52 45 47    if( op==TK_REG
b6b0: 49 53 54 45 52 20 29 20 6f 70 20 3d 20 70 2d 3e  ISTER ) op = p->
b6c0: 6f 70 32 3b 0a 20 20 73 77 69 74 63 68 28 20 6f  op2;.  switch( o
b6d0: 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
b6e0: 5f 49 4e 54 45 47 45 52 3a 0a 20 20 20 20 63 61  _INTEGER:.    ca
b6f0: 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 0a 20 20  se TK_STRING:.  
b700: 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a    case TK_FLOAT:
b710: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 4c 4f  .    case TK_BLO
b720: 42 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  B:.      return 
b730: 30 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43  0;.    case TK_C
b740: 4f 4c 55 4d 4e 3a 0a 20 20 20 20 20 20 61 73 73  OLUMN:.      ass
b750: 65 72 74 28 20 70 2d 3e 70 54 61 62 21 3d 30 20  ert( p->pTab!=0 
b760: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
b770: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
b780: 70 2c 20 45 50 5f 43 61 6e 42 65 4e 75 6c 6c 29  p, EP_CanBeNull)
b790: 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20   ||.            
b7a0: 20 28 70 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20   (p->iColumn>=0 
b7b0: 26 26 20 70 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c  && p->pTab->aCol
b7c0: 5b 70 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 6e 6f 74  [p->iColumn].not
b7d0: 4e 75 6c 6c 3d 3d 30 29 3b 0a 20 20 20 20 64 65  Null==0);.    de
b7e0: 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 72 65 74  fault:.      ret
b7f0: 75 72 6e 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  urn 1;.  }.}../*
b800: 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
b810: 69 66 20 74 68 65 20 67 69 76 65 6e 20 65 78 70  if the given exp
b820: 72 65 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6e  ression is a con
b830: 73 74 61 6e 74 20 77 68 69 63 68 20 77 6f 75 6c  stant which woul
b840: 64 20 62 65 0a 2a 2a 20 75 6e 63 68 61 6e 67 65  d be.** unchange
b850: 64 20 62 79 20 4f 50 5f 41 66 66 69 6e 69 74 79  d by OP_Affinity
b860: 20 77 69 74 68 20 74 68 65 20 61 66 66 69 6e 69   with the affini
b870: 74 79 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20  ty given in the 
b880: 73 65 63 6f 6e 64 0a 2a 2a 20 61 72 67 75 6d 65  second.** argume
b890: 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  nt..**.** This r
b8a0: 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 74  outine is used t
b8b0: 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74  o determine if t
b8c0: 68 65 20 4f 50 5f 41 66 66 69 6e 69 74 79 20 6f  he OP_Affinity o
b8d0: 70 65 72 61 74 69 6f 6e 0a 2a 2a 20 63 61 6e 20  peration.** can 
b8e0: 62 65 20 6f 6d 69 74 74 65 64 2e 20 20 57 68 65  be omitted.  Whe
b8f0: 6e 20 69 6e 20 64 6f 75 62 74 20 72 65 74 75 72  n in doubt retur
b900: 6e 20 46 41 4c 53 45 2e 20 20 41 20 66 61 6c 73  n FALSE.  A fals
b910: 65 20 6e 65 67 61 74 69 76 65 0a 2a 2a 20 69 73  e negative.** is
b920: 20 68 61 72 6d 6c 65 73 73 2e 20 20 41 20 66 61   harmless.  A fa
b930: 6c 73 65 20 70 6f 73 69 74 69 76 65 2c 20 68 6f  lse positive, ho
b940: 77 65 76 65 72 2c 20 63 61 6e 20 72 65 73 75 6c  wever, can resul
b950: 74 20 69 6e 20 74 68 65 20 77 72 6f 6e 67 0a 2a  t in the wrong.*
b960: 2a 20 61 6e 73 77 65 72 2e 0a 2a 2f 0a 69 6e 74  * answer..*/.int
b970: 20 73 71 6c 69 74 65 33 45 78 70 72 4e 65 65 64   sqlite3ExprNeed
b980: 73 4e 6f 41 66 66 69 6e 69 74 79 43 68 61 6e 67  sNoAffinityChang
b990: 65 28 63 6f 6e 73 74 20 45 78 70 72 20 2a 70 2c  e(const Expr *p,
b9a0: 20 63 68 61 72 20 61 66 66 29 7b 0a 20 20 75 38   char aff){.  u8
b9b0: 20 6f 70 3b 0a 20 20 69 66 28 20 61 66 66 3d 3d   op;.  if( aff==
b9c0: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20  SQLITE_AFF_NONE 
b9d0: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 77 68  ) return 1;.  wh
b9e0: 69 6c 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55  ile( p->op==TK_U
b9f0: 50 4c 55 53 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54  PLUS || p->op==T
ba00: 4b 5f 55 4d 49 4e 55 53 20 29 7b 20 70 20 3d 20  K_UMINUS ){ p = 
ba10: 70 2d 3e 70 4c 65 66 74 3b 20 7d 0a 20 20 6f 70  p->pLeft; }.  op
ba20: 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 69 66 28 20   = p->op;.  if( 
ba30: 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20  op==TK_REGISTER 
ba40: 29 20 6f 70 20 3d 20 70 2d 3e 6f 70 32 3b 0a 20  ) op = p->op2;. 
ba50: 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20   switch( op ){. 
ba60: 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 47     case TK_INTEG
ba70: 45 52 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75  ER: {.      retu
ba80: 72 6e 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41  rn aff==SQLITE_A
ba90: 46 46 5f 49 4e 54 45 47 45 52 20 7c 7c 20 61 66  FF_INTEGER || af
baa0: 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55  f==SQLITE_AFF_NU
bab0: 4d 45 52 49 43 3b 0a 20 20 20 20 7d 0a 20 20 20  MERIC;.    }.   
bac0: 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 20   case TK_FLOAT: 
bad0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 61  {.      return a
bae0: 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52  ff==SQLITE_AFF_R
baf0: 45 41 4c 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49  EAL || aff==SQLI
bb00: 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a  TE_AFF_NUMERIC;.
bb10: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
bb20: 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20  K_STRING: {.    
bb30: 20 20 72 65 74 75 72 6e 20 61 66 66 3d 3d 53 51    return aff==SQ
bb40: 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20  LITE_AFF_TEXT;. 
bb50: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
bb60: 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20 72  _BLOB: {.      r
bb70: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
bb80: 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d     case TK_COLUM
bb90: 4e 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  N: {.      asser
bba0: 74 28 20 70 2d 3e 69 54 61 62 6c 65 3e 3d 30 20  t( p->iTable>=0 
bbb0: 29 3b 20 20 2f 2a 20 70 20 63 61 6e 6e 6f 74 20  );  /* p cannot 
bbc0: 62 65 20 70 61 72 74 20 6f 66 20 61 20 43 48 45  be part of a CHE
bbd0: 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f  CK constraint */
bbe0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 2d  .      return p-
bbf0: 3e 69 43 6f 6c 75 6d 6e 3c 30 0a 20 20 20 20 20  >iColumn<0.     
bc00: 20 20 20 20 20 26 26 20 28 61 66 66 3d 3d 53 51       && (aff==SQ
bc10: 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52  LITE_AFF_INTEGER
bc20: 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f   || aff==SQLITE_
bc30: 41 46 46 5f 4e 55 4d 45 52 49 43 29 3b 0a 20 20  AFF_NUMERIC);.  
bc40: 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a    }.    default:
bc50: 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   {.      return 
bc60: 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  0;.    }.  }.}..
bc70: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
bc80: 45 20 69 66 20 74 68 65 20 67 69 76 65 6e 20 73  E if the given s
bc90: 74 72 69 6e 67 20 69 73 20 61 20 72 6f 77 2d 69  tring is a row-i
bca0: 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 2e 0a 2a  d column name..*
bcb0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 73 52  /.int sqlite3IsR
bcc0: 6f 77 69 64 28 63 6f 6e 73 74 20 63 68 61 72 20  owid(const char 
bcd0: 2a 7a 29 7b 0a 20 20 69 66 28 20 73 71 6c 69 74  *z){.  if( sqlit
bce0: 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22 5f 52  e3StrICmp(z, "_R
bcf0: 4f 57 49 44 5f 22 29 3d 3d 30 20 29 20 72 65 74  OWID_")==0 ) ret
bd00: 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 73 71 6c  urn 1;.  if( sql
bd10: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22  ite3StrICmp(z, "
bd20: 52 4f 57 49 44 22 29 3d 3d 30 20 29 20 72 65 74  ROWID")==0 ) ret
bd30: 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 73 71 6c  urn 1;.  if( sql
bd40: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22  ite3StrICmp(z, "
bd50: 4f 49 44 22 29 3d 3d 30 20 29 20 72 65 74 75 72  OID")==0 ) retur
bd60: 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b  n 1;.  return 0;
bd70: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
bd80: 20 74 72 75 65 20 69 66 20 77 65 20 61 72 65 20   true if we are 
bd90: 61 62 6c 65 20 74 6f 20 74 68 65 20 49 4e 20 6f  able to the IN o
bda0: 70 65 72 61 74 6f 72 20 6f 70 74 69 6d 69 7a 61  perator optimiza
bdb0: 74 69 6f 6e 20 6f 6e 20 61 0a 2a 2a 20 71 75 65  tion on a.** que
bdc0: 72 79 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a 2a  ry of the form.*
bdd0: 2a 0a 2a 2a 20 20 20 20 20 20 20 78 20 49 4e 20  *.**       x IN 
bde0: 28 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 2a 2a 0a  (SELECT ...).**.
bdf0: 2a 2a 20 57 68 65 72 65 20 74 68 65 20 53 45 4c  ** Where the SEL
be00: 45 43 54 2e 2e 2e 20 63 6c 61 75 73 65 20 69 73  ECT... clause is
be10: 20 61 73 20 73 70 65 63 69 66 69 65 64 20 62 79   as specified by
be20: 20 74 68 65 20 70 61 72 61 6d 65 74 65 72 20 74   the parameter t
be30: 6f 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e  o this.** routin
be40: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 65 6c  e..**.** The Sel
be50: 65 63 74 20 6f 62 6a 65 63 74 20 70 61 73 73 65  ect object passe
be60: 64 20 69 6e 20 68 61 73 20 61 6c 72 65 61 64 79  d in has already
be70: 20 62 65 65 6e 20 70 72 65 70 72 6f 63 65 73 73   been preprocess
be80: 65 64 20 61 6e 64 20 6e 6f 0a 2a 2a 20 65 72 72  ed and no.** err
be90: 6f 72 73 20 68 61 76 65 20 62 65 65 6e 20 66 6f  ors have been fo
bea0: 75 6e 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  und..*/.#ifndef 
beb0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
bec0: 55 45 52 59 0a 73 74 61 74 69 63 20 69 6e 74 20  UERY.static int 
bed0: 69 73 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e  isCandidateForIn
bee0: 4f 70 74 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a  Opt(Select *p){.
bef0: 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b    SrcList *pSrc;
bf00: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
bf10: 69 73 74 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54  ist;.  Table *pT
bf20: 61 62 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29  ab;.  if( p==0 )
bf30: 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
bf40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
bf50: 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20  right-hand side 
bf60: 6f 66 20 49 4e 20 69 73 20 53 45 4c 45 43 54 20  of IN is SELECT 
bf70: 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69  */.  if( p->pPri
bf80: 6f 72 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  or ) return 0;  
bf90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
bfa0: 6f 74 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45  ot a compound SE
bfb0: 4c 45 43 54 20 2a 2f 0a 20 20 69 66 28 20 70 2d  LECT */.  if( p-
bfc0: 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f  >selFlags & (SF_
bfd0: 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72  Distinct|SF_Aggr
bfe0: 65 67 61 74 65 29 20 29 7b 0a 20 20 20 20 74 65  egate) ){.    te
bff0: 73 74 63 61 73 65 28 20 28 70 2d 3e 73 65 6c 46  stcase( (p->selF
c000: 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74 69  lags & (SF_Disti
c010: 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65  nct|SF_Aggregate
c020: 29 29 3d 3d 53 46 5f 44 69 73 74 69 6e 63 74 20  ))==SF_Distinct 
c030: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
c040: 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
c050: 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f  (SF_Distinct|SF_
c060: 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f  Aggregate))==SF_
c070: 41 67 67 72 65 67 61 74 65 20 29 3b 0a 20 20 20  Aggregate );.   
c080: 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 4e 6f   return 0; /* No
c090: 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72   DISTINCT keywor
c0a0: 64 20 61 6e 64 20 6e 6f 20 61 67 67 72 65 67 61  d and no aggrega
c0b0: 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a  te functions */.
c0c0: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d    }.  assert( p-
c0d0: 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b 20  >pGroupBy==0 ); 
c0e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c0f0: 48 61 73 20 6e 6f 20 47 52 4f 55 50 20 42 59 20  Has no GROUP BY 
c100: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 66 28 20  clause */.  if( 
c110: 70 2d 3e 70 4c 69 6d 69 74 20 29 20 72 65 74 75  p->pLimit ) retu
c120: 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
c130: 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20 4c 49 4d     /* Has no LIM
c140: 49 54 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 61  IT clause */.  a
c150: 73 73 65 72 74 28 20 70 2d 3e 70 4f 66 66 73 65  ssert( p->pOffse
c160: 74 3d 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20  t==0 );         
c170: 20 20 20 20 20 20 2f 2a 20 4e 6f 20 4c 49 4d 49        /* No LIMI
c180: 54 20 6d 65 61 6e 73 20 6e 6f 20 4f 46 46 53 45  T means no OFFSE
c190: 54 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 57  T */.  if( p->pW
c1a0: 68 65 72 65 20 29 20 72 65 74 75 72 6e 20 30 3b  here ) return 0;
c1b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c1c0: 20 48 61 73 20 6e 6f 20 57 48 45 52 45 20 63 6c   Has no WHERE cl
c1d0: 61 75 73 65 20 2a 2f 0a 20 20 70 53 72 63 20 3d  ause */.  pSrc =
c1e0: 20 70 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65   p->pSrc;.  asse
c1f0: 72 74 28 20 70 53 72 63 21 3d 30 20 29 3b 0a 20  rt( pSrc!=0 );. 
c200: 20 69 66 28 20 70 53 72 63 2d 3e 6e 53 72 63 21   if( pSrc->nSrc!
c210: 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  =1 ) return 0;  
c220: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 6e 67 6c          /* Singl
c230: 65 20 74 65 72 6d 20 69 6e 20 46 52 4f 4d 20 63  e term in FROM c
c240: 6c 61 75 73 65 20 2a 2f 0a 20 20 69 66 28 20 70  lause */.  if( p
c250: 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63  Src->a[0].pSelec
c260: 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  t ) return 0;   
c270: 20 20 2f 2a 20 46 52 4f 4d 20 69 73 20 6e 6f 74    /* FROM is not
c280: 20 61 20 73 75 62 71 75 65 72 79 20 6f 72 20 76   a subquery or v
c290: 69 65 77 20 2a 2f 0a 20 20 70 54 61 62 20 3d 20  iew */.  pTab = 
c2a0: 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b  pSrc->a[0].pTab;
c2b0: 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 54 61  .  if( NEVER(pTa
c2c0: 62 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 20 30  b==0) ) return 0
c2d0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62  ;.  assert( pTab
c2e0: 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 3b 20  ->pSelect==0 ); 
c2f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 52             /* FR
c300: 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 6e 6f 74  OM clause is not
c310: 20 61 20 76 69 65 77 20 2a 2f 0a 20 20 69 66 28   a view */.  if(
c320: 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29   IsVirtual(pTab)
c330: 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
c340: 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75      /* FROM clau
c350: 73 65 20 6e 6f 74 20 61 20 76 69 72 74 75 61 6c  se not a virtual
c360: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 70 45 4c 69   table */.  pELi
c370: 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a  st = p->pEList;.
c380: 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 6e 45    if( pEList->nE
c390: 78 70 72 21 3d 31 20 29 20 72 65 74 75 72 6e 20  xpr!=1 ) return 
c3a0: 30 3b 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20  0;       /* One 
c3b0: 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 72 65  column in the re
c3c0: 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 69 66  sult set */.  if
c3d0: 28 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  ( pEList->a[0].p
c3e0: 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c  Expr->op!=TK_COL
c3f0: 55 4d 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 20  UMN ) return 0; 
c400: 2f 2a 20 52 65 73 75 6c 74 20 69 73 20 61 20 63  /* Result is a c
c410: 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 72 65 74 75 72  olumn */.  retur
c420: 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  n 1;.}.#endif /*
c430: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
c440: 51 55 45 52 59 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  QUERY */../*.** 
c450: 43 6f 64 65 20 61 6e 20 4f 50 5f 4f 6e 63 65 20  Code an OP_Once 
c460: 69 6e 73 74 72 75 63 74 69 6f 6e 20 61 6e 64 20  instruction and 
c470: 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66  allocate space f
c480: 6f 72 20 69 74 73 20 66 6c 61 67 2e 20 52 65 74  or its flag. Ret
c490: 75 72 6e 20 74 68 65 20 0a 2a 2a 20 61 64 64 72  urn the .** addr
c4a0: 65 73 73 20 6f 66 20 74 68 65 20 6e 65 77 20 69  ess of the new i
c4b0: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 69  nstruction..*/.i
c4c0: 6e 74 20 73 71 6c 69 74 65 33 43 6f 64 65 4f 6e  nt sqlite3CodeOn
c4d0: 63 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ce(Parse *pParse
c4e0: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73  ){.  Vdbe *v = s
c4f0: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
c500: 61 72 73 65 29 3b 20 20 20 20 20 20 2f 2a 20 56  arse);      /* V
c510: 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 62  irtual machine b
c520: 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20  eing coded */.  
c530: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64  return sqlite3Vd
c540: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4f  beAddOp1(v, OP_O
c550: 6e 63 65 2c 20 70 50 61 72 73 65 2d 3e 6e 4f 6e  nce, pParse->nOn
c560: 63 65 2b 2b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ce++);.}../*.** 
c570: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
c580: 61 74 20 63 68 65 63 6b 73 20 74 68 65 20 6c 65  at checks the le
c590: 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 6f  ft-most column o
c5a0: 66 20 69 6e 64 65 78 20 74 61 62 6c 65 20 69 43  f index table iC
c5b0: 75 72 20 74 6f 20 73 65 65 20 69 66 0a 2a 2a 20  ur to see if.** 
c5c0: 69 74 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79 20  it contains any 
c5d0: 4e 55 4c 4c 20 65 6e 74 72 69 65 73 2e 20 20 43  NULL entries.  C
c5e0: 61 75 73 65 20 74 68 65 20 72 65 67 69 73 74 65  ause the registe
c5f0: 72 20 61 74 20 72 65 67 48 61 73 4e 75 6c 6c 20  r at regHasNull 
c600: 74 6f 20 62 65 20 73 65 74 0a 2a 2a 20 74 6f 20  to be set.** to 
c610: 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65  a non-NULL value
c620: 20 69 66 20 69 43 75 72 20 63 6f 6e 74 61 69 6e   if iCur contain
c630: 73 20 6e 6f 20 4e 55 4c 4c 73 2e 20 20 43 61 75  s no NULLs.  Cau
c640: 73 65 20 72 65 67 69 73 74 65 72 20 72 65 67 48  se register regH
c650: 61 73 4e 75 6c 6c 0a 2a 2a 20 74 6f 20 62 65 20  asNull.** to be 
c660: 73 65 74 20 74 6f 20 4e 55 4c 4c 20 69 66 20 69  set to NULL if i
c670: 43 75 72 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65  Cur contains one
c680: 20 6f 72 20 6d 6f 72 65 20 4e 55 4c 4c 20 76 61   or more NULL va
c690: 6c 75 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lues..*/.static 
c6a0: 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65 74 48  void sqlite3SetH
c6b0: 61 73 4e 75 6c 6c 46 6c 61 67 28 56 64 62 65 20  asNullFlag(Vdbe 
c6c0: 2a 76 2c 20 69 6e 74 20 69 43 75 72 2c 20 69 6e  *v, int iCur, in
c6d0: 74 20 72 65 67 48 61 73 4e 75 6c 6c 29 7b 0a 20  t regHasNull){. 
c6e0: 20 69 6e 74 20 6a 31 3b 0a 20 20 73 71 6c 69 74   int j1;.  sqlit
c6f0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
c700: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72  OP_Integer, 0, r
c710: 65 67 48 61 73 4e 75 6c 6c 29 3b 0a 20 20 6a 31  egHasNull);.  j1
c720: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
c730: 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 77 69 6e  dOp1(v, OP_Rewin
c740: 64 2c 20 69 43 75 72 29 3b 20 56 64 62 65 43 6f  d, iCur); VdbeCo
c750: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c  verage(v);.  sql
c760: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
c770: 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 43 75  , OP_Column, iCu
c780: 72 2c 20 30 2c 20 72 65 67 48 61 73 4e 75 6c 6c  r, 0, regHasNull
c790: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
c7a0: 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c  ChangeP5(v, OPFL
c7b0: 41 47 5f 54 59 50 45 4f 46 41 52 47 29 3b 0a 20  AG_TYPEOFARG);. 
c7c0: 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
c7d0: 20 22 66 69 72 73 74 5f 65 6e 74 72 79 5f 69 6e   "first_entry_in
c7e0: 28 25 64 29 22 2c 20 69 43 75 72 29 29 3b 0a 20  (%d)", iCur));. 
c7f0: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
c800: 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a 7d 0a 0a  Here(v, j1);.}..
c810: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
c820: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a  OMIT_SUBQUERY./*
c830: 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74  .** The argument
c840: 20 69 73 20 61 6e 20 49 4e 20 6f 70 65 72 61 74   is an IN operat
c850: 6f 72 20 77 69 74 68 20 61 20 6c 69 73 74 20 28  or with a list (
c860: 6e 6f 74 20 61 20 73 75 62 71 75 65 72 79 29 20  not a subquery) 
c870: 6f 6e 20 74 68 65 20 0a 2a 2a 20 72 69 67 68 74  on the .** right
c880: 2d 68 61 6e 64 20 73 69 64 65 2e 20 20 52 65 74  -hand side.  Ret
c890: 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 61 74  urn TRUE if that
c8a0: 20 6c 69 73 74 20 69 73 20 63 6f 6e 73 74 61 6e   list is constan
c8b0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
c8c0: 20 73 71 6c 69 74 65 33 49 6e 52 68 73 49 73 43   sqlite3InRhsIsC
c8d0: 6f 6e 73 74 61 6e 74 28 45 78 70 72 20 2a 70 49  onstant(Expr *pI
c8e0: 6e 29 7b 0a 20 20 45 78 70 72 20 2a 70 4c 48 53  n){.  Expr *pLHS
c8f0: 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 61  ;.  int res;.  a
c900: 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
c910: 72 6f 70 65 72 74 79 28 70 49 6e 2c 20 45 50 5f  roperty(pIn, EP_
c920: 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20  xIsSelect) );.  
c930: 70 4c 48 53 20 3d 20 70 49 6e 2d 3e 70 4c 65 66  pLHS = pIn->pLef
c940: 74 3b 0a 20 20 70 49 6e 2d 3e 70 4c 65 66 74 20  t;.  pIn->pLeft 
c950: 3d 20 30 3b 0a 20 20 72 65 73 20 3d 20 73 71 6c  = 0;.  res = sql
c960: 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
c970: 6e 74 28 70 49 6e 29 3b 0a 20 20 70 49 6e 2d 3e  nt(pIn);.  pIn->
c980: 70 4c 65 66 74 20 3d 20 70 4c 48 53 3b 0a 20 20  pLeft = pLHS;.  
c990: 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 23 65  return res;.}.#e
c9a0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ndif../*.** This
c9b0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
c9c0: 64 20 62 79 20 74 68 65 20 69 6d 70 6c 65 6d 65  d by the impleme
c9d0: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 49  ntation of the I
c9e0: 4e 20 28 2e 2e 2e 29 20 6f 70 65 72 61 74 6f 72  N (...) operator
c9f0: 2e 0a 2a 2a 20 54 68 65 20 70 58 20 70 61 72 61  ..** The pX para
ca00: 6d 65 74 65 72 20 69 73 20 74 68 65 20 65 78 70  meter is the exp
ca10: 72 65 73 73 69 6f 6e 20 6f 6e 20 74 68 65 20 52  ression on the R
ca20: 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65  HS of the IN ope
ca30: 72 61 74 6f 72 2c 20 77 68 69 63 68 0a 2a 2a 20  rator, which.** 
ca40: 6d 69 67 68 74 20 62 65 20 65 69 74 68 65 72 20  might be either 
ca50: 61 20 6c 69 73 74 20 6f 66 20 65 78 70 72 65 73  a list of expres
ca60: 73 69 6f 6e 73 20 6f 72 20 61 20 73 75 62 71 75  sions or a subqu
ca70: 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a  ery..**.** The j
ca80: 6f 62 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69  ob of this routi
ca90: 6e 65 20 69 73 20 74 6f 20 66 69 6e 64 20 6f 72  ne is to find or
caa0: 20 63 72 65 61 74 65 20 61 20 62 2d 74 72 65 65   create a b-tree
cab0: 20 6f 62 6a 65 63 74 20 74 68 61 74 20 63 61 6e   object that can
cac0: 0a 2a 2a 20 62 65 20 75 73 65 64 20 65 69 74 68  .** be used eith
cad0: 65 72 20 74 6f 20 74 65 73 74 20 66 6f 72 20 6d  er to test for m
cae0: 65 6d 62 65 72 73 68 69 70 20 69 6e 20 74 68 65  embership in the
caf0: 20 52 48 53 20 73 65 74 20 6f 72 20 74 6f 20 69   RHS set or to i
cb00: 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 0a 2a  terate through.*
cb10: 2a 20 61 6c 6c 20 6d 65 6d 62 65 72 73 20 6f 66  * all members of
cb20: 20 74 68 65 20 52 48 53 20 73 65 74 2c 20 73 6b   the RHS set, sk
cb30: 69 70 70 69 6e 67 20 64 75 70 6c 69 63 61 74 65  ipping duplicate
cb40: 73 2e 0a 2a 2a 0a 2a 2a 20 41 20 63 75 72 73 6f  s..**.** A curso
cb50: 72 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e 20 74  r is opened on t
cb60: 68 65 20 62 2d 74 72 65 65 20 6f 62 6a 65 63 74  he b-tree object
cb70: 20 74 68 61 74 20 69 73 20 74 68 65 20 52 48 53   that is the RHS
cb80: 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61   of the IN opera
cb90: 74 6f 72 0a 2a 2a 20 61 6e 64 20 70 58 2d 3e 69  tor.** and pX->i
cba0: 54 61 62 6c 65 20 69 73 20 73 65 74 20 74 6f 20  Table is set to 
cbb0: 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 61  the index of tha
cbc0: 74 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20  t cursor..**.** 
cbd0: 54 68 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c  The returned val
cbe0: 75 65 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74  ue of this funct
cbf0: 69 6f 6e 20 69 6e 64 69 63 61 74 65 73 20 74 68  ion indicates th
cc00: 65 20 62 2d 74 72 65 65 20 74 79 70 65 2c 20 61  e b-tree type, a
cc10: 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
cc20: 20 20 20 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49     IN_INDEX_ROWI
cc30: 44 20 20 20 20 20 20 2d 20 54 68 65 20 63 75 72  D      - The cur
cc40: 73 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f  sor was opened o
cc50: 6e 20 61 20 64 61 74 61 62 61 73 65 20 74 61 62  n a database tab
cc60: 6c 65 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45  le..**   IN_INDE
cc70: 58 5f 49 4e 44 45 58 5f 41 53 43 20 20 2d 20 54  X_INDEX_ASC  - T
cc80: 68 65 20 63 75 72 73 6f 72 20 77 61 73 20 6f 70  he cursor was op
cc90: 65 6e 65 64 20 6f 6e 20 61 6e 20 61 73 63 65 6e  ened on an ascen
cca0: 64 69 6e 67 20 69 6e 64 65 78 2e 0a 2a 2a 20 20  ding index..**  
ccb0: 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f   IN_INDEX_INDEX_
ccc0: 44 45 53 43 20 2d 20 54 68 65 20 63 75 72 73 6f  DESC - The curso
ccd0: 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20  r was opened on 
cce0: 61 20 64 65 73 63 65 6e 64 69 6e 67 20 69 6e 64  a descending ind
ccf0: 65 78 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45  ex..**   IN_INDE
cd00: 58 5f 45 50 48 20 20 20 20 20 20 20 20 2d 20 54  X_EPH        - T
cd10: 68 65 20 63 75 72 73 6f 72 20 77 61 73 20 6f 70  he cursor was op
cd20: 65 6e 65 64 20 6f 6e 20 61 20 73 70 65 63 69 61  ened on a specia
cd30: 6c 6c 79 20 63 72 65 61 74 65 64 20 61 6e 64 0a  lly created and.
cd40: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
cd50: 20 20 20 20 20 20 20 20 20 20 20 70 6f 70 75 6c             popul
cd60: 61 74 65 64 20 65 70 68 65 72 65 6d 61 6c 20 74  ated epheremal t
cd70: 61 62 6c 65 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e  able..**   IN_IN
cd80: 44 45 58 5f 4e 4f 4f 50 20 20 20 20 20 20 20 2d  DEX_NOOP       -
cd90: 20 4e 6f 20 63 75 72 73 6f 72 20 77 61 73 20 61   No cursor was a
cda0: 6c 6c 6f 63 61 74 65 64 2e 20 20 54 68 65 20 49  llocated.  The I
cdb0: 4e 20 6f 70 65 72 61 74 6f 72 20 6d 75 73 74 20  N operator must 
cdc0: 62 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  be.**           
cdd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6d                im
cde0: 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 20 73  plemented as a s
cdf0: 65 71 75 65 6e 63 65 20 6f 66 20 63 6f 6d 70 61  equence of compa
ce00: 72 69 73 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e  risons..**.** An
ce10: 20 65 78 69 73 74 69 6e 67 20 62 2d 74 72 65 65   existing b-tree
ce20: 20 6d 69 67 68 74 20 62 65 20 75 73 65 64 20 69   might be used i
ce30: 66 20 74 68 65 20 52 48 53 20 65 78 70 72 65 73  f the RHS expres
ce40: 73 69 6f 6e 20 70 58 20 69 73 20 61 20 73 69 6d  sion pX is a sim
ce50: 70 6c 65 0a 2a 2a 20 73 75 62 71 75 65 72 79 20  ple.** subquery 
ce60: 73 75 63 68 20 61 73 3a 0a 2a 2a 0a 2a 2a 20 20  such as:.**.**  
ce70: 20 20 20 53 45 4c 45 43 54 20 3c 63 6f 6c 75 6d     SELECT <colum
ce80: 6e 3e 20 46 52 4f 4d 20 3c 74 61 62 6c 65 3e 0a  n> FROM <table>.
ce90: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 52 48 53  **.** If the RHS
cea0: 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61   of the IN opera
ceb0: 74 6f 72 20 69 73 20 61 20 6c 69 73 74 20 6f 72  tor is a list or
cec0: 20 61 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20   a more complex 
ced0: 73 75 62 71 75 65 72 79 2c 20 74 68 65 6e 0a 2a  subquery, then.*
cee0: 2a 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 74  * an ephemeral t
cef0: 61 62 6c 65 20 6d 69 67 68 74 20 6e 65 65 64 20  able might need 
cf00: 74 6f 20 62 65 20 67 65 6e 65 72 61 74 65 64 20  to be generated 
cf10: 66 72 6f 6d 20 74 68 65 20 52 48 53 20 61 6e 64  from the RHS and
cf20: 20 74 68 65 6e 0a 2a 2a 20 70 58 2d 3e 69 54 61   then.** pX->iTa
cf30: 62 6c 65 20 6d 61 64 65 20 74 6f 20 70 6f 69 6e  ble made to poin
cf40: 74 20 74 6f 20 74 68 65 20 65 70 68 65 6d 65 72  t to the ephemer
cf50: 61 6c 20 74 61 62 6c 65 20 69 6e 73 74 65 61 64  al table instead
cf60: 20 6f 66 20 61 6e 0a 2a 2a 20 65 78 69 73 74 69   of an.** existi
cf70: 6e 67 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ng table..**.** 
cf80: 54 68 65 20 69 6e 46 6c 61 67 73 20 70 61 72 61  The inFlags para
cf90: 6d 65 74 65 72 20 6d 75 73 74 20 63 6f 6e 74 61  meter must conta
cfa0: 69 6e 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 6f  in exactly one o
cfb0: 66 20 74 68 65 20 62 69 74 73 0a 2a 2a 20 49 4e  f the bits.** IN
cfc0: 5f 49 4e 44 45 58 5f 4d 45 4d 42 45 52 53 48 49  _INDEX_MEMBERSHI
cfd0: 50 20 6f 72 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f  P or IN_INDEX_LO
cfe0: 4f 50 2e 20 20 49 66 20 69 6e 46 6c 61 67 73 20  OP.  If inFlags 
cff0: 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 49 4e 5f 49  contains.** IN_I
d000: 4e 44 45 58 5f 4d 45 4d 42 45 52 53 48 49 50 2c  NDEX_MEMBERSHIP,
d010: 20 74 68 65 6e 20 74 68 65 20 67 65 6e 65 72 61   then the genera
d020: 74 65 64 20 74 61 62 6c 65 20 77 69 6c 6c 20 62  ted table will b
d030: 65 20 75 73 65 64 20 66 6f 72 20 61 0a 2a 2a 20  e used for a.** 
d040: 66 61 73 74 20 6d 65 6d 62 65 72 73 68 69 70 20  fast membership 
d050: 74 65 73 74 2e 20 20 57 68 65 6e 20 74 68 65 20  test.  When the 
d060: 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 20 62 69  IN_INDEX_LOOP bi
d070: 74 20 69 73 20 73 65 74 2c 20 74 68 65 0a 2a 2a  t is set, the.**
d080: 20 49 4e 20 69 6e 64 65 78 20 77 69 6c 6c 20 62   IN index will b
d090: 65 20 75 73 65 64 20 74 6f 20 6c 6f 6f 70 20 6f  e used to loop o
d0a0: 76 65 72 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f  ver all values o
d0b0: 66 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 65  f the RHS of the
d0c0: 0a 2a 2a 20 49 4e 20 6f 70 65 72 61 74 6f 72 2e  .** IN operator.
d0d0: 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 49 4e 5f 49  .**.** When IN_I
d0e0: 4e 44 45 58 5f 4c 4f 4f 50 20 69 73 20 75 73 65  NDEX_LOOP is use
d0f0: 64 20 28 61 6e 64 20 74 68 65 20 62 2d 74 72 65  d (and the b-tre
d100: 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74  e will be used t
d110: 6f 20 69 74 65 72 61 74 65 0a 2a 2a 20 74 68 72  o iterate.** thr
d120: 6f 75 67 68 20 74 68 65 20 73 65 74 20 6d 65 6d  ough the set mem
d130: 62 65 72 73 29 20 74 68 65 6e 20 74 68 65 20 62  bers) then the b
d140: 2d 74 72 65 65 20 6d 75 73 74 20 6e 6f 74 20 63  -tree must not c
d150: 6f 6e 74 61 69 6e 20 64 75 70 6c 69 63 61 74 65  ontain duplicate
d160: 73 2e 0a 2a 2a 20 41 6e 20 65 70 68 65 72 65 6d  s..** An epherem
d170: 61 6c 20 74 61 62 6c 65 20 6d 75 73 74 20 62 65  al table must be
d180: 20 75 73 65 64 20 75 6e 6c 65 73 73 20 74 68 65   used unless the
d190: 20 73 65 6c 65 63 74 65 64 20 3c 63 6f 6c 75 6d   selected <colum
d1a0: 6e 3e 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  n> is guaranteed
d1b0: 0a 2a 2a 20 74 6f 20 62 65 20 75 6e 69 71 75 65  .** to be unique
d1c0: 20 2d 20 65 69 74 68 65 72 20 62 65 63 61 75 73   - either becaus
d1d0: 65 20 69 74 20 69 73 20 61 6e 20 49 4e 54 45 47  e it is an INTEG
d1e0: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f  ER PRIMARY KEY o
d1f0: 72 20 69 74 0a 2a 2a 20 68 61 73 20 61 20 55 4e  r it.** has a UN
d200: 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20  IQUE constraint 
d210: 6f 72 20 55 4e 49 51 55 45 20 69 6e 64 65 78 2e  or UNIQUE index.
d220: 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 49 4e 5f 49  .**.** When IN_I
d230: 4e 44 45 58 5f 4d 45 4d 42 45 52 53 48 49 50 20  NDEX_MEMBERSHIP 
d240: 69 73 20 75 73 65 64 20 28 61 6e 64 20 74 68 65  is used (and the
d250: 20 62 2d 74 72 65 65 20 77 69 6c 6c 20 62 65 20   b-tree will be 
d260: 75 73 65 64 20 0a 2a 2a 20 66 6f 72 20 66 61 73  used .** for fas
d270: 74 20 73 65 74 20 6d 65 6d 62 65 72 73 68 69 70  t set membership
d280: 20 74 65 73 74 73 29 20 74 68 65 6e 20 61 6e 20   tests) then an 
d290: 65 70 68 65 72 65 6d 61 6c 20 74 61 62 6c 65 20  epheremal table 
d2a0: 6d 75 73 74 20 0a 2a 2a 20 62 65 20 75 73 65 64  must .** be used
d2b0: 20 75 6e 6c 65 73 73 20 3c 63 6f 6c 75 6d 6e 3e   unless <column>
d2c0: 20 69 73 20 61 6e 20 49 4e 54 45 47 45 52 20 50   is an INTEGER P
d2d0: 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 61 6e  RIMARY KEY or an
d2e0: 20 69 6e 64 65 78 20 63 61 6e 20 0a 2a 2a 20 62   index can .** b
d2f0: 65 20 66 6f 75 6e 64 20 77 69 74 68 20 3c 63 6f  e found with <co
d300: 6c 75 6d 6e 3e 20 61 73 20 69 74 73 20 6c 65 66  lumn> as its lef
d310: 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 2e 0a 2a  t-most column..*
d320: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 49 4e 5f 49  *.** If the IN_I
d330: 4e 44 45 58 5f 4e 4f 4f 50 5f 4f 4b 20 61 6e 64  NDEX_NOOP_OK and
d340: 20 49 4e 5f 49 4e 44 45 58 5f 4d 45 4d 42 45 52   IN_INDEX_MEMBER
d350: 53 48 49 50 20 61 72 65 20 62 6f 74 68 20 73 65  SHIP are both se
d360: 74 20 61 6e 64 0a 2a 2a 20 69 66 20 74 68 65 20  t and.** if the 
d370: 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70  RHS of the IN op
d380: 65 72 61 74 6f 72 20 69 73 20 61 20 6c 69 73 74  erator is a list
d390: 20 28 6e 6f 74 20 61 20 73 75 62 71 75 65 72 79   (not a subquery
d3a0: 29 20 74 68 65 6e 20 74 68 69 73 0a 2a 2a 20 72  ) then this.** r
d3b0: 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 64 65 63  outine might dec
d3c0: 69 64 65 20 74 68 61 74 20 63 72 65 61 74 69 6e  ide that creatin
d3d0: 67 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 62  g an ephemeral b
d3e0: 2d 74 72 65 65 20 66 6f 72 20 6d 65 6d 62 65 72  -tree for member
d3f0: 73 68 69 70 0a 2a 2a 20 74 65 73 74 69 6e 67 20  ship.** testing 
d400: 69 73 20 74 6f 6f 20 65 78 70 65 6e 73 69 76 65  is too expensive
d410: 20 61 6e 64 20 72 65 74 75 72 6e 20 49 4e 5f 49   and return IN_I
d420: 4e 44 45 58 5f 4e 4f 4f 50 2e 20 20 49 6e 20 74  NDEX_NOOP.  In t
d430: 68 61 74 20 63 61 73 65 2c 20 74 68 65 0a 2a 2a  hat case, the.**
d440: 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65   calling routine
d450: 20 73 68 6f 75 6c 64 20 69 6d 70 6c 65 6d 65 6e   should implemen
d460: 74 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f  t the IN operato
d470: 72 20 75 73 69 6e 67 20 61 20 73 65 71 75 65 6e  r using a sequen
d480: 63 65 0a 2a 2a 20 6f 66 20 45 71 20 6f 72 20 4e  ce.** of Eq or N
d490: 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65  e comparison ope
d4a0: 72 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 57  rations..**.** W
d4b0: 68 65 6e 20 74 68 65 20 62 2d 74 72 65 65 20 69  hen the b-tree i
d4c0: 73 20 62 65 69 6e 67 20 75 73 65 64 20 66 6f 72  s being used for
d4d0: 20 6d 65 6d 62 65 72 73 68 69 70 20 74 65 73 74   membership test
d4e0: 73 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66  s, the calling f
d4f0: 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 69 67 68 74  unction.** might
d500: 20 6e 65 65 64 20 74 6f 20 6b 6e 6f 77 20 77 68   need to know wh
d510: 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65  ether or not the
d520: 20 52 48 53 20 73 69 64 65 20 6f 66 20 74 68 65   RHS side of the
d530: 20 49 4e 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20   IN operator.** 
d540: 63 6f 6e 74 61 69 6e 73 20 61 20 4e 55 4c 4c 2e  contains a NULL.
d550: 20 20 49 66 20 70 72 52 68 73 48 61 73 4e 75 6c    If prRhsHasNul
d560: 6c 20 69 73 20 6e 6f 74 20 61 20 4e 55 4c 4c 20  l is not a NULL 
d570: 70 6f 69 6e 74 65 72 20 61 6e 64 20 0a 2a 2a 20  pointer and .** 
d580: 69 66 20 74 68 65 72 65 20 69 73 20 61 6e 79 20  if there is any 
d590: 63 68 61 6e 63 65 20 74 68 61 74 20 74 68 65 20  chance that the 
d5a0: 28 2e 2e 2e 29 20 6d 69 67 68 74 20 63 6f 6e 74  (...) might cont
d5b0: 61 69 6e 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65  ain a NULL value
d5c0: 20 61 74 0a 2a 2a 20 72 75 6e 74 69 6d 65 2c 20   at.** runtime, 
d5d0: 74 68 65 6e 20 61 20 72 65 67 69 73 74 65 72 20  then a register 
d5e0: 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  is allocated and
d5f0: 20 74 68 65 20 72 65 67 69 73 74 65 72 20 6e 75   the register nu
d600: 6d 62 65 72 20 77 72 69 74 74 65 6e 0a 2a 2a 20  mber written.** 
d610: 74 6f 20 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c  to *prRhsHasNull
d620: 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f  . If there is no
d630: 20 63 68 61 6e 63 65 20 74 68 61 74 20 74 68 65   chance that the
d640: 20 28 2e 2e 2e 29 20 63 6f 6e 74 61 69 6e 73 20   (...) contains 
d650: 61 0a 2a 2a 20 4e 55 4c 4c 20 76 61 6c 75 65 2c  a.** NULL value,
d660: 20 74 68 65 6e 20 2a 70 72 52 68 73 48 61 73 4e   then *prRhsHasN
d670: 75 6c 6c 20 69 73 20 6c 65 66 74 20 75 6e 63 68  ull is left unch
d680: 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  anged..**.** If 
d690: 61 20 72 65 67 69 73 74 65 72 20 69 73 20 61 6c  a register is al
d6a0: 6c 6f 63 61 74 65 64 20 61 6e 64 20 69 74 73 20  located and its 
d6b0: 6c 6f 63 61 74 69 6f 6e 20 73 74 6f 72 65 64 20  location stored 
d6c0: 69 6e 20 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c  in *prRhsHasNull
d6d0: 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 76 61  , then.** the va
d6e0: 6c 75 65 20 69 6e 20 74 68 61 74 20 72 65 67 69  lue in that regi
d6f0: 73 74 65 72 20 77 69 6c 6c 20 62 65 20 4e 55 4c  ster will be NUL
d700: 4c 20 69 66 20 74 68 65 20 62 2d 74 72 65 65 20  L if the b-tree 
d710: 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20  contains one or 
d720: 6d 6f 72 65 0a 2a 2a 20 4e 55 4c 4c 20 76 61 6c  more.** NULL val
d730: 75 65 73 2c 20 61 6e 64 20 69 74 20 77 69 6c 6c  ues, and it will
d740: 20 62 65 20 73 6f 6d 65 20 6e 6f 6e 2d 4e 55 4c   be some non-NUL
d750: 4c 20 76 61 6c 75 65 20 69 66 20 74 68 65 20 62  L value if the b
d760: 2d 74 72 65 65 20 63 6f 6e 74 61 69 6e 73 20 6e  -tree contains n
d770: 6f 0a 2a 2a 20 4e 55 4c 4c 20 76 61 6c 75 65 73  o.** NULL values
d780: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
d790: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
d7a0: 59 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 69 6e  Y.int sqlite3Fin
d7b0: 64 49 6e 49 6e 64 65 78 28 50 61 72 73 65 20 2a  dInIndex(Parse *
d7c0: 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 58  pParse, Expr *pX
d7d0: 2c 20 75 33 32 20 69 6e 46 6c 61 67 73 2c 20 69  , u32 inFlags, i
d7e0: 6e 74 20 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c  nt *prRhsHasNull
d7f0: 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 3b 20  ){.  Select *p; 
d800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d810: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 45             /* SE
d820: 4c 45 43 54 20 74 6f 20 74 68 65 20 72 69 67 68  LECT to the righ
d830: 74 20 6f 66 20 49 4e 20 6f 70 65 72 61 74 6f 72  t of IN operator
d840: 20 2a 2f 0a 20 20 69 6e 74 20 65 54 79 70 65 20   */.  int eType 
d850: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
d860: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
d870: 79 70 65 20 6f 66 20 52 48 53 20 74 61 62 6c 65  ype of RHS table
d880: 2e 20 49 4e 5f 49 4e 44 45 58 5f 2a 20 2a 2f 0a  . IN_INDEX_* */.
d890: 20 20 69 6e 74 20 69 54 61 62 20 3d 20 70 50 61    int iTab = pPa
d8a0: 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20 20  rse->nTab++;    
d8b0: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f          /* Curso
d8c0: 72 20 6f 66 20 74 68 65 20 52 48 53 20 74 61 62  r of the RHS tab
d8d0: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6d 75 73 74  le */.  int must
d8e0: 42 65 55 6e 69 71 75 65 3b 20 20 20 20 20 20 20  BeUnique;       
d8f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d900: 20 54 72 75 65 20 69 66 20 52 48 53 20 6d 75 73   True if RHS mus
d910: 74 20 62 65 20 75 6e 69 71 75 65 20 2a 2f 0a 20  t be unique */. 
d920: 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74   Vdbe *v = sqlit
d930: 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
d940: 29 3b 20 20 20 20 20 2f 2a 20 56 69 72 74 75 61  );     /* Virtua
d950: 6c 20 6d 61 63 68 69 6e 65 20 62 65 69 6e 67 20  l machine being 
d960: 63 6f 64 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65  coded */..  asse
d970: 72 74 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 49  rt( pX->op==TK_I
d980: 4e 20 29 3b 0a 20 20 6d 75 73 74 42 65 55 6e 69  N );.  mustBeUni
d990: 71 75 65 20 3d 20 28 69 6e 46 6c 61 67 73 20 26  que = (inFlags &
d9a0: 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 29 21   IN_INDEX_LOOP)!
d9b0: 3d 30 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20  =0;..  /* Check 
d9c0: 74 6f 20 73 65 65 20 69 66 20 61 6e 20 65 78 69  to see if an exi
d9d0: 73 74 69 6e 67 20 74 61 62 6c 65 20 6f 72 20 69  sting table or i
d9e0: 6e 64 65 78 20 63 61 6e 20 62 65 20 75 73 65 64  ndex can be used
d9f0: 20 74 6f 0a 20 20 2a 2a 20 73 61 74 69 73 66 79   to.  ** satisfy
da00: 20 74 68 65 20 71 75 65 72 79 2e 20 20 54 68 69   the query.  Thi
da10: 73 20 69 73 20 70 72 65 66 65 72 61 62 6c 65 20  s is preferable 
da20: 74 6f 20 67 65 6e 65 72 61 74 69 6e 67 20 61 20  to generating a 
da30: 6e 65 77 20 0a 20 20 2a 2a 20 65 70 68 65 6d 65  new .  ** epheme
da40: 72 61 6c 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a  ral table..  */.
da50: 20 20 70 20 3d 20 28 45 78 70 72 48 61 73 50 72    p = (ExprHasPr
da60: 6f 70 65 72 74 79 28 70 58 2c 20 45 50 5f 78 49  operty(pX, EP_xI
da70: 73 53 65 6c 65 63 74 29 20 3f 20 70 58 2d 3e 78  sSelect) ? pX->x
da80: 2e 70 53 65 6c 65 63 74 20 3a 20 30 29 3b 0a 20  .pSelect : 0);. 
da90: 20 69 66 28 20 41 4c 57 41 59 53 28 70 50 61 72   if( ALWAYS(pPar
daa0: 73 65 2d 3e 6e 45 72 72 3d 3d 30 29 20 26 26 20  se->nErr==0) && 
dab0: 69 73 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e  isCandidateForIn
dac0: 4f 70 74 28 70 29 20 29 7b 0a 20 20 20 20 73 71  Opt(p) ){.    sq
dad0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
dae0: 73 65 2d 3e 64 62 3b 20 20 20 20 20 20 20 20 20  se->db;         
daf0: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
db00: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
db10: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20     Table *pTab; 
db20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62            /* Tab
db40: 6c 65 20 3c 74 61 62 6c 65 3e 2e 20 2a 2f 0a 20  le <table>. */. 
db50: 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b 20     Expr *pExpr; 
db60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70            /* Exp
db80: 72 65 73 73 69 6f 6e 20 3c 63 6f 6c 75 6d 6e 3e  ression <column>
db90: 20 2a 2f 0a 20 20 20 20 69 31 36 20 69 43 6f 6c   */.    i16 iCol
dba0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
dbb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
dbc0: 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d  * Index of colum
dbd0: 6e 20 3c 63 6f 6c 75 6d 6e 3e 20 2a 2f 0a 20 20  n <column> */.  
dbe0: 20 20 69 31 36 20 69 44 62 3b 20 20 20 20 20 20    i16 iDb;      
dbf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc00: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
dc10: 62 61 73 65 20 69 64 78 20 66 6f 72 20 70 54 61  base idx for pTa
dc20: 62 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74  b */..    assert
dc30: 28 20 70 20 29 3b 20 20 20 20 20 20 20 20 20 20  ( p );          
dc40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
dc50: 20 42 65 63 61 75 73 65 20 6f 66 20 69 73 43 61   Because of isCa
dc60: 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28  ndidateForInOpt(
dc70: 70 29 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  p) */.    assert
dc80: 28 20 70 2d 3e 70 45 4c 69 73 74 21 3d 30 20 29  ( p->pEList!=0 )
dc90: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
dca0: 20 42 65 63 61 75 73 65 20 6f 66 20 69 73 43 61   Because of isCa
dcb0: 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28  ndidateForInOpt(
dcc0: 70 29 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  p) */.    assert
dcd0: 28 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30  ( p->pEList->a[0
dce0: 5d 2e 70 45 78 70 72 21 3d 30 20 29 3b 20 2f 2a  ].pExpr!=0 ); /*
dcf0: 20 42 65 63 61 75 73 65 20 6f 66 20 69 73 43 61   Because of isCa
dd00: 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28  ndidateForInOpt(
dd10: 70 29 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  p) */.    assert
dd20: 28 20 70 2d 3e 70 53 72 63 21 3d 30 20 29 3b 20  ( p->pSrc!=0 ); 
dd30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
dd40: 20 42 65 63 61 75 73 65 20 6f 66 20 69 73 43 61   Because of isCa
dd50: 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28  ndidateForInOpt(
dd60: 70 29 20 2a 2f 0a 20 20 20 20 70 54 61 62 20 3d  p) */.    pTab =
dd70: 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70   p->pSrc->a[0].p
dd80: 54 61 62 3b 0a 20 20 20 20 70 45 78 70 72 20 3d  Tab;.    pExpr =
dd90: 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d   p->pEList->a[0]
dda0: 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 43 6f 6c  .pExpr;.    iCol
ddb0: 20 3d 20 28 69 31 36 29 70 45 78 70 72 2d 3e 69   = (i16)pExpr->i
ddc0: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 0a 20 20 20 20  Column;.   .    
ddd0: 2f 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f 54 72  /* Code an OP_Tr
dde0: 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 4f 50  ansaction and OP
ddf0: 5f 54 61 62 6c 65 4c 6f 63 6b 20 66 6f 72 20 3c  _TableLock for <
de00: 74 61 62 6c 65 3e 2e 20 2a 2f 0a 20 20 20 20 69  table>. */.    i
de10: 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
de20: 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54  maToIndex(db, pT
de30: 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  ab->pSchema);.  
de40: 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72    sqlite3CodeVer
de50: 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65  ifySchema(pParse
de60: 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69  , iDb);.    sqli
de70: 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61  te3TableLock(pPa
de80: 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e  rse, iDb, pTab->
de90: 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e 7a  tnum, 0, pTab->z
dea0: 4e 61 6d 65 29 3b 0a 0a 20 20 20 20 2f 2a 20 54  Name);..    /* T
deb0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
dec0: 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 66 72 6f 6d  only called from
ded0: 20 74 77 6f 20 70 6c 61 63 65 73 2e 20 49 6e 20   two places. In 
dee0: 62 6f 74 68 20 63 61 73 65 73 20 74 68 65 20 76  both cases the v
def0: 64 62 65 0a 20 20 20 20 2a 2a 20 68 61 73 20 61  dbe.    ** has a
df00: 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f  lready been allo
df10: 63 61 74 65 64 2e 20 53 6f 20 61 73 73 75 6d 65  cated. So assume
df20: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
df30: 29 20 69 73 20 61 6c 77 61 79 73 0a 20 20 20 20  ) is always.    
df40: 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20 68 65  ** successful he
df50: 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  re..    */.    a
df60: 73 73 65 72 74 28 76 29 3b 0a 20 20 20 20 69 66  ssert(v);.    if
df70: 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20  ( iCol<0 ){.    
df80: 20 20 69 6e 74 20 69 41 64 64 72 20 3d 20 73 71    int iAddr = sq
df90: 6c 69 74 65 33 43 6f 64 65 4f 6e 63 65 28 70 50  lite3CodeOnce(pP
dfa0: 61 72 73 65 29 3b 0a 20 20 20 20 20 20 56 64 62  arse);.      Vdb
dfb0: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a 20  eCoverage(v);.. 
dfc0: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e       sqlite3Open
dfd0: 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 69 54  Table(pParse, iT
dfe0: 61 62 2c 20 69 44 62 2c 20 70 54 61 62 2c 20 4f  ab, iDb, pTab, O
dff0: 50 5f 4f 70 65 6e 52 65 61 64 29 3b 0a 20 20 20  P_OpenRead);.   
e000: 20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e     eType = IN_IN
e010: 44 45 58 5f 52 4f 57 49 44 3b 0a 0a 20 20 20 20  DEX_ROWID;..    
e020: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
e030: 70 48 65 72 65 28 76 2c 20 69 41 64 64 72 29 3b  pHere(v, iAddr);
e040: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
e050: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20    Index *pIdx;  
e060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e070: 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74         /* Iterat
e080: 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 0a  or variable */..
e090: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6c        /* The col
e0a0: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
e0b0: 75 73 65 64 20 62 79 20 74 68 65 20 63 6f 6d 70  used by the comp
e0c0: 61 72 69 73 6f 6e 2e 20 49 66 20 61 6e 20 69 6e  arison. If an in
e0d0: 64 65 78 20 69 73 20 74 6f 0a 20 20 20 20 20 20  dex is to.      
e0e0: 2a 2a 20 62 65 20 75 73 65 64 20 69 6e 20 70 6c  ** be used in pl
e0f0: 61 63 65 20 6f 66 20 61 20 74 65 6d 70 2d 74 61  ace of a temp-ta
e100: 62 6c 65 2c 20 69 74 20 6d 75 73 74 20 62 65 20  ble, it must be 
e110: 6f 72 64 65 72 65 64 20 61 63 63 6f 72 64 69 6e  ordered accordin
e120: 67 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 68  g.      ** to th
e130: 69 73 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  is collation seq
e140: 75 65 6e 63 65 2e 20 20 2a 2f 0a 20 20 20 20 20  uence.  */.     
e150: 20 43 6f 6c 6c 53 65 71 20 2a 70 52 65 71 20 3d   CollSeq *pReq =
e160: 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f   sqlite3BinaryCo
e170: 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61  mpareCollSeq(pPa
e180: 72 73 65 2c 20 70 58 2d 3e 70 4c 65 66 74 2c 20  rse, pX->pLeft, 
e190: 70 45 78 70 72 29 3b 0a 0a 20 20 20 20 20 20 2f  pExpr);..      /
e1a0: 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65  * Check that the
e1b0: 20 61 66 66 69 6e 69 74 79 20 74 68 61 74 20 77   affinity that w
e1c0: 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f 20 70  ill be used to p
e1d0: 65 72 66 6f 72 6d 20 74 68 65 20 0a 20 20 20 20  erform the .    
e1e0: 20 20 2a 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 20    ** comparison 
e1f0: 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 74  is the same as t
e200: 68 65 20 61 66 66 69 6e 69 74 79 20 6f 66 20 74  he affinity of t
e210: 68 65 20 63 6f 6c 75 6d 6e 2e 20 49 66 0a 20 20  he column. If.  
e220: 20 20 20 20 2a 2a 20 69 74 20 69 73 20 6e 6f 74      ** it is not
e230: 2c 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73  , it is not poss
e240: 69 62 6c 65 20 74 6f 20 75 73 65 20 61 6e 79 20  ible to use any 
e250: 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 2a 2f 0a  index..      */.
e260: 20 20 20 20 20 20 69 6e 74 20 61 66 66 69 6e 69        int affini
e270: 74 79 5f 6f 6b 20 3d 20 73 71 6c 69 74 65 33 49  ty_ok = sqlite3I
e280: 6e 64 65 78 41 66 66 69 6e 69 74 79 4f 6b 28 70  ndexAffinityOk(p
e290: 58 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43  X, pTab->aCol[iC
e2a0: 6f 6c 5d 2e 61 66 66 69 6e 69 74 79 29 3b 0a 0a  ol].affinity);..
e2b0: 20 20 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70        for(pIdx=p
e2c0: 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64  Tab->pIndex; pId
e2d0: 78 20 26 26 20 65 54 79 70 65 3d 3d 30 20 26 26  x && eType==0 &&
e2e0: 20 61 66 66 69 6e 69 74 79 5f 6f 6b 3b 20 70 49   affinity_ok; pI
e2f0: 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b  dx=pIdx->pNext){
e300: 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70 49  .        if( (pI
e310: 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 3d  dx->aiColumn[0]=
e320: 3d 69 43 6f 6c 29 0a 20 20 20 20 20 20 20 20 20  =iCol).         
e330: 26 26 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f  && sqlite3FindCo
e340: 6c 6c 53 65 71 28 64 62 2c 20 45 4e 43 28 64 62  llSeq(db, ENC(db
e350: 29 2c 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b  ), pIdx->azColl[
e360: 30 5d 2c 20 30 29 3d 3d 70 52 65 71 0a 20 20 20  0], 0)==pReq.   
e370: 20 20 20 20 20 20 26 26 20 28 21 6d 75 73 74 42        && (!mustB
e380: 65 55 6e 69 71 75 65 20 7c 7c 20 28 70 49 64 78  eUnique || (pIdx
e390: 2d 3e 6e 4b 65 79 43 6f 6c 3d 3d 31 20 26 26 20  ->nKeyCol==1 && 
e3a0: 49 73 55 6e 69 71 75 65 49 6e 64 65 78 28 70 49  IsUniqueIndex(pI
e3b0: 64 78 29 29 29 0a 20 20 20 20 20 20 20 20 29 7b  dx))).        ){
e3c0: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69  .          int i
e3d0: 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33 43 6f  Addr = sqlite3Co
e3e0: 64 65 4f 6e 63 65 28 70 50 61 72 73 65 29 3b 20  deOnce(pParse); 
e3f0: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
e400: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
e410: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
e420: 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69 54 61  OP_OpenRead, iTa
e430: 62 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c 20 69  b, pIdx->tnum, i
e440: 44 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  Db);.          s
e450: 71 6c 69 74 65 33 56 64 62 65 53 65 74 50 34 4b  qlite3VdbeSetP4K
e460: 65 79 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70  eyInfo(pParse, p
e470: 49 64 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Idx);.          
e480: 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
e490: 22 25 73 22 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d  "%s", pIdx->zNam
e4a0: 65 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61  e));.          a
e4b0: 73 73 65 72 74 28 20 49 4e 5f 49 4e 44 45 58 5f  ssert( IN_INDEX_
e4c0: 49 4e 44 45 58 5f 44 45 53 43 20 3d 3d 20 49 4e  INDEX_DESC == IN
e4d0: 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 41 53 43  _INDEX_INDEX_ASC
e4e0: 2b 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  +1 );.          
e4f0: 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58  eType = IN_INDEX
e500: 5f 49 4e 44 45 58 5f 41 53 43 20 2b 20 70 49 64  _INDEX_ASC + pId
e510: 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 30 5d  x->aSortOrder[0]
e520: 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ;..          if(
e530: 20 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 26 26   prRhsHasNull &&
e540: 20 21 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f   !pTab->aCol[iCo
e550: 6c 5d 2e 6e 6f 74 4e 75 6c 6c 20 29 7b 0a 20 20  l].notNull ){.  
e560: 20 20 20 20 20 20 20 20 20 20 2a 70 72 52 68 73            *prRhs
e570: 48 61 73 4e 75 6c 6c 20 3d 20 2b 2b 70 50 61 72  HasNull = ++pPar
e580: 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
e590: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 74        sqlite3Set
e5a0: 48 61 73 4e 75 6c 6c 46 6c 61 67 28 76 2c 20 69  HasNullFlag(v, i
e5b0: 54 61 62 2c 20 2a 70 72 52 68 73 48 61 73 4e 75  Tab, *prRhsHasNu
e5c0: 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ll);.          }
e5d0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
e5e0: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
e5f0: 2c 20 69 41 64 64 72 29 3b 0a 20 20 20 20 20 20  , iAddr);.      
e600: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
e610: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6e  }.  }..  /* If n
e620: 6f 20 70 72 65 65 78 69 73 74 69 6e 67 20 69 6e  o preexisting in
e630: 64 65 78 20 69 73 20 61 76 61 69 6c 61 62 6c 65  dex is available
e640: 20 66 6f 72 20 74 68 65 20 49 4e 20 63 6c 61 75   for the IN clau
e650: 73 65 0a 20 20 2a 2a 20 61 6e 64 20 49 4e 5f 49  se.  ** and IN_I
e660: 4e 44 45 58 5f 4e 4f 4f 50 20 69 73 20 61 6e 20  NDEX_NOOP is an 
e670: 61 6c 6c 6f 77 65 64 20 72 65 70 6c 79 0a 20 20  allowed reply.  
e680: 2a 2a 20 61 6e 64 20 74 68 65 20 52 48 53 20 6f  ** and the RHS o
e690: 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f  f the IN operato
e6a0: 72 20 69 73 20 61 20 6c 69 73 74 2c 20 6e 6f 74  r is a list, not
e6b0: 20 61 20 73 75 62 71 75 65 72 79 0a 20 20 2a 2a   a subquery.  **
e6c0: 20 61 6e 64 20 74 68 65 20 52 48 53 20 69 73 20   and the RHS is 
e6d0: 6e 6f 74 20 63 6f 6e 74 61 6e 74 20 6f 72 20 68  not contant or h
e6e0: 61 73 20 74 77 6f 20 6f 72 20 66 65 77 65 72 20  as two or fewer 
e6f0: 74 65 72 6d 73 2c 0a 20 20 2a 2a 20 74 68 65 6e  terms,.  ** then
e700: 20 69 74 20 69 73 20 6e 6f 74 20 77 6f 72 74 68   it is not worth
e710: 20 63 72 65 61 74 69 6e 67 20 61 6e 20 65 70 68   creating an eph
e720: 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 74 6f 20  emeral table to 
e730: 65 76 61 6c 75 61 74 65 0a 20 20 2a 2a 20 74 68  evaluate.  ** th
e740: 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 73 6f  e IN operator so
e750: 20 72 65 74 75 72 6e 20 49 4e 5f 49 4e 44 45 58   return IN_INDEX
e760: 5f 4e 4f 4f 50 2e 0a 20 20 2a 2f 0a 20 20 69 66  _NOOP..  */.  if
e770: 28 20 65 54 79 70 65 3d 3d 30 0a 20 20 20 26 26  ( eType==0.   &&
e780: 20 28 69 6e 46 6c 61 67 73 20 26 20 49 4e 5f 49   (inFlags & IN_I
e790: 4e 44 45 58 5f 4e 4f 4f 50 5f 4f 4b 29 0a 20 20  NDEX_NOOP_OK).  
e7a0: 20 26 26 20 21 45 78 70 72 48 61 73 50 72 6f 70   && !ExprHasProp
e7b0: 65 72 74 79 28 70 58 2c 20 45 50 5f 78 49 73 53  erty(pX, EP_xIsS
e7c0: 65 6c 65 63 74 29 0a 20 20 20 26 26 20 28 21 73  elect).   && (!s
e7d0: 71 6c 69 74 65 33 49 6e 52 68 73 49 73 43 6f 6e  qlite3InRhsIsCon
e7e0: 73 74 61 6e 74 28 70 58 29 20 7c 7c 20 70 58 2d  stant(pX) || pX-
e7f0: 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3c  >x.pList->nExpr<
e800: 3d 32 29 0a 20 20 29 7b 0a 20 20 20 20 65 54 79  =2).  ){.    eTy
e810: 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f  pe = IN_INDEX_NO
e820: 4f 50 3b 0a 20 20 7d 0a 20 20 20 20 20 0a 0a 20  OP;.  }.     .. 
e830: 20 69 66 28 20 65 54 79 70 65 3d 3d 30 20 29 7b   if( eType==0 ){
e840: 0a 20 20 20 20 2f 2a 20 43 6f 75 6c 64 20 6e 6f  .    /* Could no
e850: 74 20 66 69 6e 64 20 61 6e 20 65 78 69 73 74 69  t find an existi
e860: 6e 67 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65  ng table or inde
e870: 78 20 74 6f 20 75 73 65 20 61 73 20 74 68 65 20  x to use as the 
e880: 52 48 53 20 62 2d 74 72 65 65 2e 0a 20 20 20 20  RHS b-tree..    
e890: 2a 2a 20 57 65 20 77 69 6c 6c 20 68 61 76 65 20  ** We will have 
e8a0: 74 6f 20 67 65 6e 65 72 61 74 65 20 61 6e 20 65  to generate an e
e8b0: 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 74  phemeral table t
e8c0: 6f 20 64 6f 20 74 68 65 20 6a 6f 62 2e 0a 20 20  o do the job..  
e8d0: 20 20 2a 2f 0a 20 20 20 20 75 33 32 20 73 61 76    */.    u32 sav
e8e0: 65 64 4e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70  edNQueryLoop = p
e8f0: 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f  Parse->nQueryLoo
e900: 70 3b 0a 20 20 20 20 69 6e 74 20 72 4d 61 79 48  p;.    int rMayH
e910: 61 76 65 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20  aveNull = 0;.   
e920: 20 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45   eType = IN_INDE
e930: 58 5f 45 50 48 3b 0a 20 20 20 20 69 66 28 20 69  X_EPH;.    if( i
e940: 6e 46 6c 61 67 73 20 26 20 49 4e 5f 49 4e 44 45  nFlags & IN_INDE
e950: 58 5f 4c 4f 4f 50 20 29 7b 0a 20 20 20 20 20 20  X_LOOP ){.      
e960: 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f  pParse->nQueryLo
e970: 6f 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66  op = 0;.      if
e980: 28 20 70 58 2d 3e 70 4c 65 66 74 2d 3e 69 43 6f  ( pX->pLeft->iCo
e990: 6c 75 6d 6e 3c 30 20 26 26 20 21 45 78 70 72 48  lumn<0 && !ExprH
e9a0: 61 73 50 72 6f 70 65 72 74 79 28 70 58 2c 20 45  asProperty(pX, E
e9b0: 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a  P_xIsSelect) ){.
e9c0: 20 20 20 20 20 20 20 20 65 54 79 70 65 20 3d 20          eType = 
e9d0: 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 3b 0a  IN_INDEX_ROWID;.
e9e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
e9f0: 65 20 69 66 28 20 70 72 52 68 73 48 61 73 4e 75  e if( prRhsHasNu
ea00: 6c 6c 20 29 7b 0a 20 20 20 20 20 20 2a 70 72 52  ll ){.      *prR
ea10: 68 73 48 61 73 4e 75 6c 6c 20 3d 20 72 4d 61 79  hsHasNull = rMay
ea20: 48 61 76 65 4e 75 6c 6c 20 3d 20 2b 2b 70 50 61  HaveNull = ++pPa
ea30: 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 7d  rse->nMem;.    }
ea40: 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65  .    sqlite3Code
ea50: 53 75 62 73 65 6c 65 63 74 28 70 50 61 72 73 65  Subselect(pParse
ea60: 2c 20 70 58 2c 20 72 4d 61 79 48 61 76 65 4e 75  , pX, rMayHaveNu
ea70: 6c 6c 2c 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e  ll, eType==IN_IN
ea80: 44 45 58 5f 52 4f 57 49 44 29 3b 0a 20 20 20 20  DEX_ROWID);.    
ea90: 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f  pParse->nQueryLo
eaa0: 6f 70 20 3d 20 73 61 76 65 64 4e 51 75 65 72 79  op = savedNQuery
eab0: 4c 6f 6f 70 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Loop;.  }else{. 
eac0: 20 20 20 70 58 2d 3e 69 54 61 62 6c 65 20 3d 20     pX->iTable = 
ead0: 69 54 61 62 3b 0a 20 20 7d 0a 20 20 72 65 74 75  iTab;.  }.  retu
eae0: 72 6e 20 65 54 79 70 65 3b 0a 7d 0a 23 65 6e 64  rn eType;.}.#end
eaf0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  if../*.** Genera
eb00: 74 65 20 63 6f 64 65 20 66 6f 72 20 73 63 61 6c  te code for scal
eb10: 61 72 20 73 75 62 71 75 65 72 69 65 73 20 75 73  ar subqueries us
eb20: 65 64 20 61 73 20 61 20 73 75 62 71 75 65 72 79  ed as a subquery
eb30: 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 45 58 49   expression, EXI
eb40: 53 54 53 2c 0a 2a 2a 20 6f 72 20 49 4e 20 6f 70  STS,.** or IN op
eb50: 65 72 61 74 6f 72 73 2e 20 20 45 78 61 6d 70 6c  erators.  Exampl
eb60: 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 53  es:.**.**     (S
eb70: 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 62 29 20  ELECT a FROM b) 
eb80: 20 20 20 20 20 20 20 20 20 2d 2d 20 73 75 62 71           -- subq
eb90: 75 65 72 79 0a 2a 2a 20 20 20 20 20 45 58 49 53  uery.**     EXIS
eba0: 54 53 20 28 53 45 4c 45 43 54 20 61 20 46 52 4f  TS (SELECT a FRO
ebb0: 4d 20 62 29 20 20 20 2d 2d 20 45 58 49 53 54 53  M b)   -- EXISTS
ebc0: 20 73 75 62 71 75 65 72 79 0a 2a 2a 20 20 20 20   subquery.**    
ebd0: 20 78 20 49 4e 20 28 34 2c 35 2c 31 31 29 20 20   x IN (4,5,11)  
ebe0: 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 49              -- I
ebf0: 4e 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68 20  N operator with 
ec00: 6c 69 73 74 20 6f 6e 20 72 69 67 68 74 2d 68 61  list on right-ha
ec10: 6e 64 20 73 69 64 65 0a 2a 2a 20 20 20 20 20 78  nd side.**     x
ec20: 20 49 4e 20 28 53 45 4c 45 43 54 20 61 20 46 52   IN (SELECT a FR
ec30: 4f 4d 20 62 29 20 20 20 20 20 2d 2d 20 49 4e 20  OM b)     -- IN 
ec40: 6f 70 65 72 61 74 6f 72 20 77 69 74 68 20 73 75  operator with su
ec50: 62 71 75 65 72 79 20 6f 6e 20 74 68 65 20 72 69  bquery on the ri
ec60: 67 68 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 45  ght.**.** The pE
ec70: 78 70 72 20 70 61 72 61 6d 65 74 65 72 20 64 65  xpr parameter de
ec80: 73 63 72 69 62 65 73 20 74 68 65 20 65 78 70 72  scribes the expr
ec90: 65 73 73 69 6f 6e 20 74 68 61 74 20 63 6f 6e 74  ession that cont
eca0: 61 69 6e 73 20 74 68 65 20 49 4e 0a 2a 2a 20 6f  ains the IN.** o
ecb0: 70 65 72 61 74 6f 72 20 6f 72 20 73 75 62 71 75  perator or subqu
ecc0: 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61  ery..**.** If pa
ecd0: 72 61 6d 65 74 65 72 20 69 73 52 6f 77 69 64 20  rameter isRowid 
ece0: 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
ecf0: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78  n expression pEx
ed00: 70 72 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  pr is guaranteed
ed10: 0a 2a 2a 20 74 6f 20 62 65 20 6f 66 20 74 68 65  .** to be of the
ed20: 20 66 6f 72 6d 20 22 3c 72 6f 77 69 64 3e 20 49   form "<rowid> I
ed30: 4e 20 28 3f 2c 20 3f 2c 20 3f 29 22 2c 20 77 68  N (?, ?, ?)", wh
ed40: 65 72 65 20 3c 72 6f 77 69 64 3e 20 69 73 20 61  ere <rowid> is a
ed50: 20 72 65 66 65 72 65 6e 63 65 0a 2a 2a 20 74 6f   reference.** to
ed60: 20 73 6f 6d 65 20 69 6e 74 65 67 65 72 20 6b 65   some integer ke
ed70: 79 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 20 74 61  y column of a ta
ed80: 62 6c 65 20 42 2d 54 72 65 65 2e 20 49 6e 20 74  ble B-Tree. In t
ed90: 68 69 73 20 63 61 73 65 2c 20 75 73 65 20 61 6e  his case, use an
eda0: 0a 2a 2a 20 69 6e 74 6b 65 79 20 42 2d 54 72 65  .** intkey B-Tre
edb0: 65 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 73  e to store the s
edc0: 65 74 20 6f 66 20 49 4e 28 2e 2e 2e 29 20 76 61  et of IN(...) va
edd0: 6c 75 65 73 20 69 6e 73 74 65 61 64 20 6f 66 20  lues instead of 
ede0: 74 68 65 20 75 73 75 61 6c 0a 2a 2a 20 28 73 6c  the usual.** (sl
edf0: 6f 77 65 72 29 20 76 61 72 69 61 62 6c 65 20 6c  ower) variable l
ee00: 65 6e 67 74 68 20 6b 65 79 73 20 42 2d 54 72 65  ength keys B-Tre
ee10: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72 4d 61 79  e..**.** If rMay
ee20: 48 61 76 65 4e 75 6c 6c 20 69 73 20 6e 6f 6e 2d  HaveNull is non-
ee30: 7a 65 72 6f 2c 20 74 68 61 74 20 6d 65 61 6e 73  zero, that means
ee40: 20 74 68 61 74 20 74 68 65 20 6f 70 65 72 61 74   that the operat
ee50: 69 6f 6e 20 69 73 20 61 6e 20 49 4e 0a 2a 2a 20  ion is an IN.** 
ee60: 28 6e 6f 74 20 61 20 53 45 4c 45 43 54 20 6f 72  (not a SELECT or
ee70: 20 45 58 49 53 54 53 29 20 61 6e 64 20 74 68 61   EXISTS) and tha
ee80: 74 20 74 68 65 20 52 48 53 20 6d 69 67 68 74 20  t the RHS might 
ee90: 63 6f 6e 74 61 69 6e 73 20 4e 55 4c 4c 73 2e 0a  contains NULLs..
eea0: 2a 2a 20 41 6c 6c 20 74 68 69 73 20 72 6f 75 74  ** All this rout
eeb0: 69 6e 65 20 64 6f 65 73 20 69 73 20 69 6e 69 74  ine does is init
eec0: 69 61 6c 69 7a 65 20 74 68 65 20 72 65 67 69 73  ialize the regis
eed0: 74 65 72 20 67 69 76 65 6e 20 62 79 20 72 4d 61  ter given by rMa
eee0: 79 48 61 76 65 4e 75 6c 6c 0a 2a 2a 20 74 6f 20  yHaveNull.** to 
eef0: 4e 55 4c 4c 2e 20 20 43 61 6c 6c 69 6e 67 20 72  NULL.  Calling r
ef00: 6f 75 74 69 6e 65 73 20 77 69 6c 6c 20 74 61 6b  outines will tak
ef10: 65 20 63 61 72 65 20 6f 66 20 63 68 61 6e 67 69  e care of changi
ef20: 6e 67 20 74 68 69 73 20 72 65 67 69 73 74 65 72  ng this register
ef30: 0a 2a 2a 20 76 61 6c 75 65 20 74 6f 20 6e 6f 6e  .** value to non
ef40: 2d 4e 55 4c 4c 20 69 66 20 74 68 65 20 52 48 53  -NULL if the RHS
ef50: 20 69 73 20 4e 55 4c 4c 2d 66 72 65 65 2e 0a 2a   is NULL-free..*
ef60: 2a 0a 2a 2a 20 46 6f 72 20 61 20 53 45 4c 45 43  *.** For a SELEC
ef70: 54 20 6f 72 20 45 58 49 53 54 53 20 6f 70 65 72  T or EXISTS oper
ef80: 61 74 6f 72 2c 20 72 65 74 75 72 6e 20 74 68 65  ator, return the
ef90: 20 72 65 67 69 73 74 65 72 20 74 68 61 74 20 68   register that h
efa0: 6f 6c 64 73 20 74 68 65 0a 2a 2a 20 72 65 73 75  olds the.** resu
efb0: 6c 74 2e 20 20 46 6f 72 20 49 4e 20 6f 70 65 72  lt.  For IN oper
efc0: 61 74 6f 72 73 20 6f 72 20 69 66 20 61 6e 20 65  ators or if an e
efd0: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65  rror occurs, the
efe0: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73   return value is
eff0: 20 30 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53   0..*/.#ifndef S
f000: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
f010: 45 52 59 0a 69 6e 74 20 73 71 6c 69 74 65 33 43  ERY.int sqlite3C
f020: 6f 64 65 53 75 62 73 65 6c 65 63 74 28 0a 20 20  odeSubselect(.  
f030: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
f040: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
f050: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
f060: 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20  Expr *pExpr,    
f070: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 49          /* The I
f080: 4e 2c 20 53 45 4c 45 43 54 2c 20 6f 72 20 45 58  N, SELECT, or EX
f090: 49 53 54 53 20 6f 70 65 72 61 74 6f 72 20 2a 2f  ISTS operator */
f0a0: 0a 20 20 69 6e 74 20 72 48 61 73 4e 75 6c 6c 46  .  int rHasNullF
f0b0: 6c 61 67 2c 20 20 20 20 20 20 20 2f 2a 20 52 65  lag,       /* Re
f0c0: 67 69 73 74 65 72 20 74 68 61 74 20 72 65 63 6f  gister that reco
f0d0: 72 64 73 20 77 68 65 74 68 65 72 20 4e 55 4c 4c  rds whether NULL
f0e0: 73 20 65 78 69 73 74 20 69 6e 20 52 48 53 20 2a  s exist in RHS *
f0f0: 2f 0a 20 20 69 6e 74 20 69 73 52 6f 77 69 64 20  /.  int isRowid 
f100: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
f110: 66 20 74 72 75 65 2c 20 4c 48 53 20 6f 66 20 49  f true, LHS of I
f120: 4e 20 6f 70 65 72 61 74 6f 72 20 69 73 20 61 20  N operator is a 
f130: 72 6f 77 69 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e  rowid */.){.  in
f140: 74 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63 20 3d  t jmpIfDynamic =
f150: 20 2d 31 3b 20 20 20 20 20 20 20 20 20 20 20 20   -1;            
f160: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65            /* One
f170: 2d 74 69 6d 65 20 74 65 73 74 20 61 64 64 72 65  -time test addre
f180: 73 73 20 2a 2f 0a 20 20 69 6e 74 20 72 52 65 67  ss */.  int rReg
f190: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
f1a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f1b0: 2f 2a 20 52 65 67 69 73 74 65 72 20 73 74 6f 72  /* Register stor
f1c0: 69 6e 67 20 72 65 73 75 6c 74 69 6e 67 20 2a 2f  ing resulting */
f1d0: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c  .  Vdbe *v = sql
f1e0: 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
f1f0: 73 65 29 3b 0a 20 20 69 66 28 20 4e 45 56 45 52  se);.  if( NEVER
f200: 28 76 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 20  (v==0) ) return 
f210: 30 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  0;.  sqlite3Expr
f220: 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65  CachePush(pParse
f230: 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 63 6f  );..  /* This co
f240: 64 65 20 6d 75 73 74 20 62 65 20 72 75 6e 20 69  de must be run i
f250: 6e 20 69 74 73 20 65 6e 74 69 72 65 74 79 20 65  n its entirety e
f260: 76 65 72 79 20 74 69 6d 65 20 69 74 20 69 73 20  very time it is 
f270: 65 6e 63 6f 75 6e 74 65 72 65 64 0a 20 20 2a 2a  encountered.  **
f280: 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20 66   if any of the f
f290: 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 74 72 75 65  ollowing is true
f2a0: 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 2a  :.  **.  **    *
f2b0: 20 20 54 68 65 20 72 69 67 68 74 2d 68 61 6e 64    The right-hand
f2c0: 20 73 69 64 65 20 69 73 20 61 20 63 6f 72 72 65   side is a corre
f2d0: 6c 61 74 65 64 20 73 75 62 71 75 65 72 79 0a 20  lated subquery. 
f2e0: 20 2a 2a 20 20 20 20 2a 20 20 54 68 65 20 72 69   **    *  The ri
f2f0: 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 69 73  ght-hand side is
f300: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c   an expression l
f310: 69 73 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 76  ist containing v
f320: 61 72 69 61 62 6c 65 73 0a 20 20 2a 2a 20 20 20  ariables.  **   
f330: 20 2a 20 20 57 65 20 61 72 65 20 69 6e 73 69 64   *  We are insid
f340: 65 20 61 20 74 72 69 67 67 65 72 0a 20 20 2a 2a  e a trigger.  **
f350: 0a 20 20 2a 2a 20 49 66 20 61 6c 6c 20 6f 66 20  .  ** If all of 
f360: 74 68 65 20 61 62 6f 76 65 20 61 72 65 20 66 61  the above are fa
f370: 6c 73 65 2c 20 74 68 65 6e 20 77 65 20 63 61 6e  lse, then we can
f380: 20 72 75 6e 20 74 68 69 73 20 63 6f 64 65 20 6a   run this code j
f390: 75 73 74 20 6f 6e 63 65 0a 20 20 2a 2a 20 73 61  ust once.  ** sa
f3a0: 76 65 20 74 68 65 20 72 65 73 75 6c 74 73 2c 20  ve the results, 
f3b0: 61 6e 64 20 72 65 75 73 65 20 74 68 65 20 73 61  and reuse the sa
f3c0: 6d 65 20 72 65 73 75 6c 74 20 6f 6e 20 73 75 62  me result on sub
f3d0: 73 65 71 75 65 6e 74 20 69 6e 76 6f 63 61 74 69  sequent invocati
f3e0: 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ons..  */.  if( 
f3f0: 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
f400: 28 70 45 78 70 72 2c 20 45 50 5f 56 61 72 53 65  (pExpr, EP_VarSe
f410: 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 6a 6d 70  lect) ){.    jmp
f420: 49 66 44 79 6e 61 6d 69 63 20 3d 20 73 71 6c 69  IfDynamic = sqli
f430: 74 65 33 43 6f 64 65 4f 6e 63 65 28 70 50 61 72  te3CodeOnce(pPar
f440: 73 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  se); VdbeCoverag
f450: 65 28 76 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64  e(v);.  }..#ifnd
f460: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  ef SQLITE_OMIT_E
f470: 58 50 4c 41 49 4e 0a 20 20 69 66 28 20 70 50 61  XPLAIN.  if( pPa
f480: 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20  rse->explain==2 
f490: 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 73  ){.    char *zMs
f4a0: 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  g = sqlite3MPrin
f4b0: 74 66 28 0a 20 20 20 20 20 20 20 20 70 50 61 72  tf(.        pPar
f4c0: 73 65 2d 3e 64 62 2c 20 22 45 58 45 43 55 54 45  se->db, "EXECUTE
f4d0: 20 25 73 25 73 20 53 55 42 51 55 45 52 59 20 25   %s%s SUBQUERY %
f4e0: 64 22 2c 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63  d", jmpIfDynamic
f4f0: 3e 3d 30 3f 22 22 3a 22 43 4f 52 52 45 4c 41 54  >=0?"":"CORRELAT
f500: 45 44 20 22 2c 0a 20 20 20 20 20 20 20 20 70 45  ED ",.        pE
f510: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 3f 22  xpr->op==TK_IN?"
f520: 4c 49 53 54 22 3a 22 53 43 41 4c 41 52 22 2c 20  LIST":"SCALAR", 
f530: 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c  pParse->iNextSel
f540: 65 63 74 49 64 0a 20 20 20 20 29 3b 0a 20 20 20  ectId.    );.   
f550: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
f560: 70 34 28 76 2c 20 4f 50 5f 45 78 70 6c 61 69 6e  p4(v, OP_Explain
f570: 2c 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63  , pParse->iSelec
f580: 74 49 64 2c 20 30 2c 20 30 2c 20 7a 4d 73 67 2c  tId, 0, 0, zMsg,
f590: 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20   P4_DYNAMIC);.  
f5a0: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 73 77 69 74  }.#endif..  swit
f5b0: 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b  ch( pExpr->op ){
f5c0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a  .    case TK_IN:
f5d0: 20 7b 0a 20 20 20 20 20 20 63 68 61 72 20 61 66   {.      char af
f5e0: 66 69 6e 69 74 79 3b 20 20 20 20 20 20 20 20 20  finity;         
f5f0: 20 20 20 20 20 2f 2a 20 41 66 66 69 6e 69 74 79       /* Affinity
f600: 20 6f 66 20 74 68 65 20 4c 48 53 20 6f 66 20 74   of the LHS of t
f610: 68 65 20 49 4e 20 2a 2f 0a 20 20 20 20 20 20 69  he IN */.      i
f620: 6e 74 20 61 64 64 72 3b 20 20 20 20 20 20 20 20  nt addr;        
f630: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
f640: 64 72 65 73 73 20 6f 66 20 4f 50 5f 4f 70 65 6e  dress of OP_Open
f650: 45 70 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 75  Ephemeral instru
f660: 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45  ction */.      E
f670: 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78  xpr *pLeft = pEx
f680: 70 72 2d 3e 70 4c 65 66 74 3b 20 2f 2a 20 74 68  pr->pLeft; /* th
f690: 65 20 4c 48 53 20 6f 66 20 74 68 65 20 49 4e 20  e LHS of the IN 
f6a0: 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20  operator */.    
f6b0: 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
f6c0: 6e 66 6f 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a  nfo = 0;      /*
f6d0: 20 4b 65 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   Key information
f6e0: 20 2a 2f 0a 0a 20 20 20 20 20 20 61 66 66 69 6e   */..      affin
f6f0: 69 74 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ity = sqlite3Exp
f700: 72 41 66 66 69 6e 69 74 79 28 70 4c 65 66 74 29  rAffinity(pLeft)
f710: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57 68 65 74  ;..      /* Whet
f720: 68 65 72 20 74 68 69 73 20 69 73 20 61 6e 20 27  her this is an '
f730: 78 20 49 4e 28 53 45 4c 45 43 54 2e 2e 2e 29 27  x IN(SELECT...)'
f740: 20 6f 72 20 61 6e 20 27 78 20 49 4e 28 3c 65 78   or an 'x IN(<ex
f750: 70 72 6c 69 73 74 3e 29 27 0a 20 20 20 20 20 20  prlist>)'.      
f760: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 69 74  ** expression it
f770: 20 69 73 20 68 61 6e 64 6c 65 64 20 74 68 65 20   is handled the 
f780: 73 61 6d 65 20 77 61 79 2e 20 20 41 6e 20 65 70  same way.  An ep
f790: 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 69 73  hemeral table is
f7a0: 20 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 6c 65   .      ** fille
f7b0: 64 20 77 69 74 68 20 73 69 6e 67 6c 65 2d 66 69  d with single-fi
f7c0: 65 6c 64 20 69 6e 64 65 78 20 6b 65 79 73 20 72  eld index keys r
f7d0: 65 70 72 65 73 65 6e 74 69 6e 67 20 74 68 65 20  epresenting the 
f7e0: 72 65 73 75 6c 74 73 0a 20 20 20 20 20 20 2a 2a  results.      **
f7f0: 20 66 72 6f 6d 20 74 68 65 20 53 45 4c 45 43 54   from the SELECT
f800: 20 6f 72 20 74 68 65 20 3c 65 78 70 72 6c 69 73   or the <exprlis
f810: 74 3e 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  t>..      **.   
f820: 20 20 20 2a 2a 20 49 66 20 74 68 65 20 27 78 27     ** If the 'x'
f830: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61   expression is a
f840: 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 2c 20 6f   column value, o
f850: 72 20 74 68 65 20 53 45 4c 45 43 54 2e 2e 2e 0a  r the SELECT....
f860: 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65        ** stateme
f870: 6e 74 20 72 65 74 75 72 6e 73 20 61 20 63 6f 6c  nt returns a col
f880: 75 6d 6e 20 76 61 6c 75 65 2c 20 74 68 65 6e 20  umn value, then 
f890: 74 68 65 20 61 66 66 69 6e 69 74 79 20 6f 66 20  the affinity of 
f8a0: 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 63 6f  that.      ** co
f8b0: 6c 75 6d 6e 20 69 73 20 75 73 65 64 20 74 6f 20  lumn is used to 
f8c0: 62 75 69 6c 64 20 74 68 65 20 69 6e 64 65 78 20  build the index 
f8d0: 6b 65 79 73 2e 20 49 66 20 62 6f 74 68 20 27 78  keys. If both 'x
f8e0: 27 20 61 6e 64 20 74 68 65 0a 20 20 20 20 20 20  ' and the.      
f8f0: 2a 2a 20 53 45 4c 45 43 54 2e 2e 2e 20 73 74 61  ** SELECT... sta
f900: 74 65 6d 65 6e 74 20 61 72 65 20 63 6f 6c 75 6d  tement are colum
f910: 6e 73 2c 20 74 68 65 6e 20 6e 75 6d 65 72 69 63  ns, then numeric
f920: 20 61 66 66 69 6e 69 74 79 20 69 73 20 75 73 65   affinity is use
f930: 64 0a 20 20 20 20 20 20 2a 2a 20 69 66 20 65 69  d.      ** if ei
f940: 74 68 65 72 20 63 6f 6c 75 6d 6e 20 68 61 73 20  ther column has 
f950: 4e 55 4d 45 52 49 43 20 6f 72 20 49 4e 54 45 47  NUMERIC or INTEG
f960: 45 52 20 61 66 66 69 6e 69 74 79 2e 20 49 66 20  ER affinity. If 
f970: 6e 65 69 74 68 65 72 0a 20 20 20 20 20 20 2a 2a  neither.      **
f980: 20 27 78 27 20 6e 6f 72 20 74 68 65 20 53 45 4c   'x' nor the SEL
f990: 45 43 54 2e 2e 2e 20 73 74 61 74 65 6d 65 6e 74  ECT... statement
f9a0: 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2c 20 74 68   are columns, th
f9b0: 65 6e 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e  en numeric affin
f9c0: 69 74 79 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  ity.      ** is 
f9d0: 75 73 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  used..      */. 
f9e0: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62       pExpr->iTab
f9f0: 6c 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  le = pParse->nTa
fa00: 62 2b 2b 3b 0a 20 20 20 20 20 20 61 64 64 72 20  b++;.      addr 
fa10: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
fa20: 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70  Op2(v, OP_OpenEp
fa30: 68 65 6d 65 72 61 6c 2c 20 70 45 78 70 72 2d 3e  hemeral, pExpr->
fa40: 69 54 61 62 6c 65 2c 20 21 69 73 52 6f 77 69 64  iTable, !isRowid
fa50: 29 3b 0a 20 20 20 20 20 20 70 4b 65 79 49 6e 66  );.      pKeyInf
fa60: 6f 20 3d 20 69 73 52 6f 77 69 64 20 3f 20 30 20  o = isRowid ? 0 
fa70: 3a 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  : sqlite3KeyInfo
fa80: 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64 62  Alloc(pParse->db
fa90: 2c 20 31 2c 20 31 29 3b 0a 0a 20 20 20 20 20 20  , 1, 1);..      
faa0: 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
fab0: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49  rty(pExpr, EP_xI
fac0: 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20  sSelect) ){.    
fad0: 20 20 20 20 2f 2a 20 43 61 73 65 20 31 3a 20 20      /* Case 1:  
fae0: 20 20 20 65 78 70 72 20 49 4e 20 28 53 45 4c 45     expr IN (SELE
faf0: 43 54 20 2e 2e 2e 29 0a 20 20 20 20 20 20 20 20  CT ...).        
fb00: 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 47 65  **.        ** Ge
fb10: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 77  nerate code to w
fb20: 72 69 74 65 20 74 68 65 20 72 65 73 75 6c 74 73  rite the results
fb30: 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 20 69   of the select i
fb40: 6e 74 6f 20 74 68 65 20 74 65 6d 70 6f 72 61 72  nto the temporar
fb50: 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62  y.        ** tab
fb60: 6c 65 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  le allocated and
fb70: 20 6f 70 65 6e 65 64 20 61 62 6f 76 65 2e 0a 20   opened above.. 
fb80: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
fb90: 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63    Select *pSelec
fba0: 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 53 65  t = pExpr->x.pSe
fbb0: 6c 65 63 74 3b 0a 20 20 20 20 20 20 20 20 53 65  lect;.        Se
fbc0: 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b 0a 20  lectDest dest;. 
fbd0: 20 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20         ExprList 
fbe0: 2a 70 45 4c 69 73 74 3b 0a 0a 20 20 20 20 20 20  *pEList;..      
fbf0: 20 20 61 73 73 65 72 74 28 20 21 69 73 52 6f 77    assert( !isRow
fc00: 69 64 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  id );.        sq
fc10: 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49  lite3SelectDestI
fc20: 6e 69 74 28 26 64 65 73 74 2c 20 53 52 54 5f 53  nit(&dest, SRT_S
fc30: 65 74 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  et, pExpr->iTabl
fc40: 65 29 3b 0a 20 20 20 20 20 20 20 20 64 65 73 74  e);.        dest
fc50: 2e 61 66 66 53 64 73 74 20 3d 20 28 75 38 29 61  .affSdst = (u8)a
fc60: 66 66 69 6e 69 74 79 3b 0a 20 20 20 20 20 20 20  ffinity;.       
fc70: 20 61 73 73 65 72 74 28 20 28 70 45 78 70 72 2d   assert( (pExpr-
fc80: 3e 69 54 61 62 6c 65 26 30 78 30 30 30 30 46 46  >iTable&0x0000FF
fc90: 46 46 29 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62  FF)==pExpr->iTab
fca0: 6c 65 20 29 3b 0a 20 20 20 20 20 20 20 20 70 53  le );.        pS
fcb0: 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 20 3d 20  elect->iLimit = 
fcc0: 30 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  0;.        testc
fcd0: 61 73 65 28 20 70 53 65 6c 65 63 74 2d 3e 73 65  ase( pSelect->se
fce0: 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74  lFlags & SF_Dist
fcf0: 69 6e 63 74 20 29 3b 0a 20 20 20 20 20 20 20 20  inct );.        
fd00: 74 65 73 74 63 61 73 65 28 20 70 4b 65 79 49 6e  testcase( pKeyIn
fd10: 66 6f 3d 3d 30 20 29 3b 20 2f 2a 20 43 61 75 73  fo==0 ); /* Caus
fd20: 65 64 20 62 79 20 4f 4f 4d 20 69 6e 20 73 71 6c  ed by OOM in sql
fd30: 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63  ite3KeyInfoAlloc
fd40: 28 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66  () */.        if
fd50: 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  ( sqlite3Select(
fd60: 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2c  pParse, pSelect,
fd70: 20 26 64 65 73 74 29 20 29 7b 0a 20 20 20 20 20   &dest) ){.     
fd80: 20 20 20 20 20 73 71 6c 69 74 65 33 4b 65 79 49       sqlite3KeyI
fd90: 6e 66 6f 55 6e 72 65 66 28 70 4b 65 79 49 6e 66  nfoUnref(pKeyInf
fda0: 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  o);.          re
fdb0: 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 20 20  turn 0;.        
fdc0: 7d 0a 20 20 20 20 20 20 20 20 70 45 4c 69 73 74  }.        pEList
fdd0: 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69   = pSelect->pELi
fde0: 73 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  st;.        asse
fdf0: 72 74 28 20 70 4b 65 79 49 6e 66 6f 21 3d 30 20  rt( pKeyInfo!=0 
fe00: 29 3b 20 2f 2a 20 4f 4f 4d 20 77 69 6c 6c 20 63  ); /* OOM will c
fe10: 61 75 73 65 20 65 78 69 74 20 61 66 74 65 72 20  ause exit after 
fe20: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29 20  sqlite3Select() 
fe30: 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  */.        asser
fe40: 74 28 20 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a  t( pEList!=0 );.
fe50: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
fe60: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20  pEList->nExpr>0 
fe70: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
fe80: 74 28 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66  t( sqlite3KeyInf
fe90: 6f 49 73 57 72 69 74 65 61 62 6c 65 28 70 4b 65  oIsWriteable(pKe
fea0: 79 49 6e 66 6f 29 20 29 3b 0a 20 20 20 20 20 20  yInfo) );.      
feb0: 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c    pKeyInfo->aCol
fec0: 6c 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 42 69  l[0] = sqlite3Bi
fed0: 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53  naryCompareCollS
fee0: 65 71 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  eq(pParse, pExpr
fef0: 2d 3e 70 4c 65 66 74 2c 0a 20 20 20 20 20 20 20  ->pLeft,.       
ff00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ff10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ff20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ff30: 20 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70    pEList->a[0].p
ff40: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c  Expr);.      }el
ff50: 73 65 20 69 66 28 20 41 4c 57 41 59 53 28 70 45  se if( ALWAYS(pE
ff60: 78 70 72 2d 3e 78 2e 70 4c 69 73 74 21 3d 30 29  xpr->x.pList!=0)
ff70: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43   ){.        /* C
ff80: 61 73 65 20 32 3a 20 20 20 20 20 65 78 70 72 20  ase 2:     expr 
ff90: 49 4e 20 28 65 78 70 72 6c 69 73 74 29 0a 20 20  IN (exprlist).  
ffa0: 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
ffb0: 20 2a 2a 20 46 6f 72 20 65 61 63 68 20 65 78 70   ** For each exp
ffc0: 72 65 73 73 69 6f 6e 2c 20 62 75 69 6c 64 20 61  ression, build a
ffd0: 6e 20 69 6e 64 65 78 20 6b 65 79 20 66 72 6f 6d  n index key from
ffe0: 20 74 68 65 20 65 76 61 6c 75 61 74 69 6f 6e 20   the evaluation 
fff0: 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 73  and.        ** s
10000 74 6f 72 65 20 69 74 20 69 6e 20 74 68 65 20 74  tore it in the t
10010 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2e 20  emporary table. 
10020 49 66 20 3c 65 78 70 72 3e 20 69 73 20 61 20 63  If <expr> is a c
10030 6f 6c 75 6d 6e 2c 20 74 68 65 6e 20 75 73 65 0a  olumn, then use.
10040 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20          ** that 
10050 63 6f 6c 75 6d 6e 73 20 61 66 66 69 6e 69 74 79  columns affinity
10060 20 77 68 65 6e 20 62 75 69 6c 64 69 6e 67 20 69   when building i
10070 6e 64 65 78 20 6b 65 79 73 2e 20 49 66 20 3c 65  ndex keys. If <e
10080 78 70 72 3e 20 69 73 20 6e 6f 74 0a 20 20 20 20  xpr> is not.    
10090 20 20 20 20 2a 2a 20 61 20 63 6f 6c 75 6d 6e 2c      ** a column,
100a0 20 75 73 65 20 6e 75 6d 65 72 69 63 20 61 66 66   use numeric aff
100b0 69 6e 69 74 79 2e 0a 20 20 20 20 20 20 20 20 2a  inity..        *
100c0 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b  /.        int i;
100d0 0a 20 20 20 20 20 20 20 20 45 78 70 72 4c 69 73  .        ExprLis
100e0 74 20 2a 70 4c 69 73 74 20 3d 20 70 45 78 70 72  t *pList = pExpr
100f0 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20  ->x.pList;.     
10100 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
10110 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
10120 20 20 20 20 20 20 20 20 69 6e 74 20 72 31 2c 20          int r1, 
10130 72 32 2c 20 72 33 3b 0a 0a 20 20 20 20 20 20 20  r2, r3;..       
10140 20 69 66 28 20 21 61 66 66 69 6e 69 74 79 20 29   if( !affinity )
10150 7b 0a 20 20 20 20 20 20 20 20 20 20 61 66 66 69  {.          affi
10160 6e 69 74 79 20 3d 20 53 51 4c 49 54 45 5f 41 46  nity = SQLITE_AF
10170 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20  F_NONE;.        
10180 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4b  }.        if( pK
10190 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20  eyInfo ){.      
101a0 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
101b0 74 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74  te3KeyInfoIsWrit
101c0 65 61 62 6c 65 28 70 4b 65 79 49 6e 66 6f 29 20  eable(pKeyInfo) 
101d0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4b 65  );.          pKe
101e0 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 30 5d 20  yInfo->aColl[0] 
101f0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
10200 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 45 78  lSeq(pParse, pEx
10210 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20  pr->pLeft);.    
10220 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f      }..        /
10230 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 65  * Loop through e
10240 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e 20 69  ach expression i
10250 6e 20 3c 65 78 70 72 6c 69 73 74 3e 2e 20 2a 2f  n <exprlist>. */
10260 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20 73 71  .        r1 = sq
10270 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
10280 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
10290 20 72 32 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r2 = sqlite3Get
102a0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
102b0 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 73 52  .        if( isR
102c0 6f 77 69 64 20 29 20 73 71 6c 69 74 65 33 56 64  owid ) sqlite3Vd
102d0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
102e0 75 6c 6c 2c 20 30 2c 20 72 32 29 3b 0a 20 20 20  ull, 0, r2);.   
102f0 20 20 20 20 20 66 6f 72 28 69 3d 70 4c 69 73 74       for(i=pList
10300 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d 70  ->nExpr, pItem=p
10310 4c 69 73 74 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d  List->a; i>0; i-
10320 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  -, pItem++){.   
10330 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 32         Expr *pE2
10340 20 3d 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 3b   = pItem->pExpr;
10350 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69  .          int i
10360 56 61 6c 54 6f 49 6e 73 3b 0a 0a 20 20 20 20 20  ValToIns;..     
10370 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 65       /* If the e
10380 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6e 6f 74  xpression is not
10390 20 63 6f 6e 73 74 61 6e 74 20 74 68 65 6e 20 77   constant then w
103a0 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 0a 20  e will need to. 
103b0 20 20 20 20 20 20 20 20 20 2a 2a 20 64 69 73 61           ** disa
103c0 62 6c 65 20 74 68 65 20 74 65 73 74 20 74 68 61  ble the test tha
103d0 74 20 77 61 73 20 67 65 6e 65 72 61 74 65 64 20  t was generated 
103e0 61 62 6f 76 65 20 74 68 61 74 20 6d 61 6b 65 73  above that makes
103f0 20 73 75 72 65 0a 20 20 20 20 20 20 20 20 20 20   sure.          
10400 2a 2a 20 74 68 69 73 20 63 6f 64 65 20 6f 6e 6c  ** this code onl
10410 79 20 65 78 65 63 75 74 65 73 20 6f 6e 63 65 2e  y executes once.
10420 20 20 42 65 63 61 75 73 65 20 66 6f 72 20 61 20    Because for a 
10430 6e 6f 6e 2d 63 6f 6e 73 74 61 6e 74 0a 20 20 20  non-constant.   
10440 20 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65 73         ** expres
10450 73 69 6f 6e 20 77 65 20 6e 65 65 64 20 74 6f 20  sion we need to 
10460 72 65 72 75 6e 20 74 68 69 73 20 63 6f 64 65 20  rerun this code 
10470 65 61 63 68 20 74 69 6d 65 2e 0a 20 20 20 20 20  each time..     
10480 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
10490 20 20 69 66 28 20 6a 6d 70 49 66 44 79 6e 61 6d    if( jmpIfDynam
104a0 69 63 3e 3d 30 20 26 26 20 21 73 71 6c 69 74 65  ic>=0 && !sqlite
104b0 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28  3ExprIsConstant(
104c0 70 45 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20  pE2) ){.        
104d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
104e0 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 6a  hangeToNoop(v, j
104f0 6d 70 49 66 44 79 6e 61 6d 69 63 29 3b 0a 20 20  mpIfDynamic);.  
10500 20 20 20 20 20 20 20 20 20 20 6a 6d 70 49 66 44            jmpIfD
10510 79 6e 61 6d 69 63 20 3d 20 2d 31 3b 0a 20 20 20  ynamic = -1;.   
10520 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
10530 20 20 20 20 2f 2a 20 45 76 61 6c 75 61 74 65 20      /* Evaluate 
10540 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 61  the expression a
10550 6e 64 20 69 6e 73 65 72 74 20 69 74 20 69 6e 74  nd insert it int
10560 6f 20 74 68 65 20 74 65 6d 70 20 74 61 62 6c 65  o the temp table
10570 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
10580 28 20 69 73 52 6f 77 69 64 20 26 26 20 73 71 6c  ( isRowid && sql
10590 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65  ite3ExprIsIntege
105a0 72 28 70 45 32 2c 20 26 69 56 61 6c 54 6f 49 6e  r(pE2, &iValToIn
105b0 73 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  s) ){.          
105c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
105d0 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74  Op3(v, OP_Insert
105e0 49 6e 74 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  Int, pExpr->iTab
105f0 6c 65 2c 20 72 32 2c 20 69 56 61 6c 54 6f 49 6e  le, r2, iValToIn
10600 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  s);.          }e
10610 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
10620 20 72 33 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r3 = sqlite3Exp
10630 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72  rCodeTarget(pPar
10640 73 65 2c 20 70 45 32 2c 20 72 31 29 3b 0a 20 20  se, pE2, r1);.  
10650 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 73            if( is
10660 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20 20  Rowid ){.       
10670 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
10680 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4d  beAddOp2(v, OP_M
10690 75 73 74 42 65 49 6e 74 2c 20 72 33 2c 0a 20 20  ustBeInt, r3,.  
106a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
106b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
106c0 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
106d0 41 64 64 72 28 76 29 2b 32 29 3b 0a 20 20 20 20  Addr(v)+2);.    
106e0 20 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f            VdbeCo
106f0 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
10700 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
10710 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
10720 5f 49 6e 73 65 72 74 2c 20 70 45 78 70 72 2d 3e  _Insert, pExpr->
10730 69 54 61 62 6c 65 2c 20 72 32 2c 20 72 33 29 3b  iTable, r2, r3);
10740 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c  .            }el
10750 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
10760 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
10770 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op4(v, OP_MakeRe
10780 63 6f 72 64 2c 20 72 33 2c 20 31 2c 20 72 32 2c  cord, r3, 1, r2,
10790 20 26 61 66 66 69 6e 69 74 79 2c 20 31 29 3b 0a   &affinity, 1);.
107a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
107b0 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66  lite3ExprCacheAf
107c0 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61  finityChange(pPa
107d0 72 73 65 2c 20 72 33 2c 20 31 29 3b 0a 20 20 20  rse, r3, 1);.   
107e0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
107f0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
10800 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 70 45  OP_IdxInsert, pE
10810 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 72 32 29  xpr->iTable, r2)
10820 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
10830 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
10840 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
10850 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
10860 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b  Reg(pParse, r1);
10870 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
10880 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
10890 50 61 72 73 65 2c 20 72 32 29 3b 0a 20 20 20 20  Parse, r2);.    
108a0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 4b    }.      if( pK
108b0 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20  eyInfo ){.      
108c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
108d0 6e 67 65 50 34 28 76 2c 20 61 64 64 72 2c 20 28  ngeP4(v, addr, (
108e0 76 6f 69 64 20 2a 29 70 4b 65 79 49 6e 66 6f 2c  void *)pKeyInfo,
108f0 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20   P4_KEYINFO);.  
10900 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
10910 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61  k;.    }..    ca
10920 73 65 20 54 4b 5f 45 58 49 53 54 53 3a 0a 20 20  se TK_EXISTS:.  
10930 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54    case TK_SELECT
10940 3a 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  :.    default: {
10950 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69  .      /* If thi
10960 73 20 68 61 73 20 74 6f 20 62 65 20 61 20 73 63  s has to be a sc
10970 61 6c 61 72 20 53 45 4c 45 43 54 2e 20 20 47 65  alar SELECT.  Ge
10980 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 70  nerate code to p
10990 75 74 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  ut the.      ** 
109a0 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20 73 65  value of this se
109b0 6c 65 63 74 20 69 6e 20 61 20 6d 65 6d 6f 72 79  lect in a memory
109c0 20 63 65 6c 6c 20 61 6e 64 20 72 65 63 6f 72 64   cell and record
109d0 20 74 68 65 20 6e 75 6d 62 65 72 0a 20 20 20 20   the number.    
109e0 20 20 2a 2a 20 6f 66 20 74 68 65 20 6d 65 6d 6f    ** of the memo
109f0 72 79 20 63 65 6c 6c 20 69 6e 20 69 43 6f 6c 75  ry cell in iColu
10a00 6d 6e 2e 20 20 49 66 20 74 68 69 73 20 69 73 20  mn.  If this is 
10a10 61 6e 20 45 58 49 53 54 53 2c 20 77 72 69 74 65  an EXISTS, write
10a20 0a 20 20 20 20 20 20 2a 2a 20 61 6e 20 69 6e 74  .      ** an int
10a30 65 67 65 72 20 30 20 28 6e 6f 74 20 65 78 69 73  eger 0 (not exis
10a40 74 73 29 20 6f 72 20 31 20 28 65 78 69 73 74 73  ts) or 1 (exists
10a50 29 20 69 6e 74 6f 20 61 20 6d 65 6d 6f 72 79 20  ) into a memory 
10a60 63 65 6c 6c 0a 20 20 20 20 20 20 2a 2a 20 61 6e  cell.      ** an
10a70 64 20 72 65 63 6f 72 64 20 74 68 61 74 20 6d 65  d record that me
10a80 6d 6f 72 79 20 63 65 6c 6c 20 69 6e 20 69 43 6f  mory cell in iCo
10a90 6c 75 6d 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  lumn..      */. 
10aa0 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 65       Select *pSe
10ab0 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
10ac0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 45             /* SE
10ad0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74  LECT statement t
10ae0 6f 20 65 6e 63 6f 64 65 20 2a 2f 0a 20 20 20 20  o encode */.    
10af0 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73    SelectDest des
10b00 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
10b10 20 20 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 74          /* How t
10b20 6f 20 64 65 61 6c 20 77 69 74 68 20 53 45 4c 45  o deal with SELE
10b30 43 74 20 72 65 73 75 6c 74 20 2a 2f 0a 0a 20 20  Ct result */..  
10b40 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
10b50 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53  xpr->op==TK_EXIS
10b60 54 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  TS );.      test
10b70 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
10b80 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 20 20  =TK_SELECT );.  
10b90 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
10ba0 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53 54 53  r->op==TK_EXISTS
10bb0 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54   || pExpr->op==T
10bc0 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 0a 20 20 20  K_SELECT );..   
10bd0 20 20 20 61 73 73 65 72 74 28 20 45 78 70 72 48     assert( ExprH
10be0 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
10bf0 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
10c00 29 3b 0a 20 20 20 20 20 20 70 53 65 6c 20 3d 20  );.      pSel = 
10c10 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74  pExpr->x.pSelect
10c20 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  ;.      sqlite3S
10c30 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64  electDestInit(&d
10c40 65 73 74 2c 20 30 2c 20 2b 2b 70 50 61 72 73 65  est, 0, ++pParse
10c50 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 20 20 20 20 69  ->nMem);.      i
10c60 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  f( pExpr->op==TK
10c70 5f 53 45 4c 45 43 54 20 29 7b 0a 20 20 20 20 20  _SELECT ){.     
10c80 20 20 20 64 65 73 74 2e 65 44 65 73 74 20 3d 20     dest.eDest = 
10c90 53 52 54 5f 4d 65 6d 3b 0a 20 20 20 20 20 20 20  SRT_Mem;.       
10ca0 20 64 65 73 74 2e 69 53 64 73 74 20 3d 20 64 65   dest.iSdst = de
10cb0 73 74 2e 69 53 44 50 61 72 6d 3b 0a 20 20 20 20  st.iSDParm;.    
10cc0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
10cd0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp2(v, OP_Null
10ce0 2c 20 30 2c 20 64 65 73 74 2e 69 53 44 50 61 72  , 0, dest.iSDPar
10cf0 6d 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  m);.        Vdbe
10d00 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 49 6e 69  Comment((v, "Ini
10d10 74 20 73 75 62 71 75 65 72 79 20 72 65 73 75 6c  t subquery resul
10d20 74 22 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  t"));.      }els
10d30 65 7b 0a 20 20 20 20 20 20 20 20 64 65 73 74 2e  e{.        dest.
10d40 65 44 65 73 74 20 3d 20 53 52 54 5f 45 78 69 73  eDest = SRT_Exis
10d50 74 73 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  ts;.        sqli
10d60 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
10d70 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
10d80 64 65 73 74 2e 69 53 44 50 61 72 6d 29 3b 0a 20  dest.iSDParm);. 
10d90 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65         VdbeComme
10da0 6e 74 28 28 76 2c 20 22 49 6e 69 74 20 45 58 49  nt((v, "Init EXI
10db0 53 54 53 20 72 65 73 75 6c 74 22 29 29 3b 0a 20  STS result"));. 
10dc0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
10dd0 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70  ite3ExprDelete(p
10de0 50 61 72 73 65 2d 3e 64 62 2c 20 70 53 65 6c 2d  Parse->db, pSel-
10df0 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20  >pLimit);.      
10e00 70 53 65 6c 2d 3e 70 4c 69 6d 69 74 20 3d 20 73  pSel->pLimit = s
10e10 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
10e20 73 65 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c 20  se, TK_INTEGER, 
10e30 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  0, 0,.          
10e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e50 20 20 20 20 20 20 20 20 26 73 71 6c 69 74 65 33          &sqlite3
10e60 49 6e 74 54 6f 6b 65 6e 73 5b 31 5d 29 3b 0a 20  IntTokens[1]);. 
10e70 20 20 20 20 20 70 53 65 6c 2d 3e 69 4c 69 6d 69       pSel->iLimi
10e80 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28  t = 0;.      if(
10e90 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
10ea0 50 61 72 73 65 2c 20 70 53 65 6c 2c 20 26 64 65  Parse, pSel, &de
10eb0 73 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  st) ){.        r
10ec0 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d  eturn 0;.      }
10ed0 0a 20 20 20 20 20 20 72 52 65 67 20 3d 20 64 65  .      rReg = de
10ee0 73 74 2e 69 53 44 50 61 72 6d 3b 0a 20 20 20 20  st.iSDParm;.    
10ef0 20 20 45 78 70 72 53 65 74 56 56 41 50 72 6f 70    ExprSetVVAProp
10f00 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 4e  erty(pExpr, EP_N
10f10 6f 52 65 64 75 63 65 29 3b 0a 20 20 20 20 20 20  oReduce);.      
10f20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
10f30 0a 0a 20 20 69 66 28 20 72 48 61 73 4e 75 6c 6c  ..  if( rHasNull
10f40 46 6c 61 67 20 29 7b 0a 20 20 20 20 73 71 6c 69  Flag ){.    sqli
10f50 74 65 33 53 65 74 48 61 73 4e 75 6c 6c 46 6c 61  te3SetHasNullFla
10f60 67 28 76 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  g(v, pExpr->iTab
10f70 6c 65 2c 20 72 48 61 73 4e 75 6c 6c 46 6c 61 67  le, rHasNullFlag
10f80 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6a 6d  );.  }..  if( jm
10f90 70 49 66 44 79 6e 61 6d 69 63 3e 3d 30 20 29 7b  pIfDynamic>=0 ){
10fa0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
10fb0 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 6d 70 49  JumpHere(v, jmpI
10fc0 66 44 79 6e 61 6d 69 63 29 3b 0a 20 20 7d 0a 20  fDynamic);.  }. 
10fd0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
10fe0 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 0a 20  ePop(pParse);.. 
10ff0 20 72 65 74 75 72 6e 20 72 52 65 67 3b 0a 7d 0a   return rReg;.}.
11000 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
11010 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a  _OMIT_SUBQUERY *
11020 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
11030 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
11040 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
11050 6f 64 65 20 66 6f 72 20 61 6e 20 49 4e 20 65 78  ode for an IN ex
11060 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  pression..**.** 
11070 20 20 20 20 20 78 20 49 4e 20 28 53 45 4c 45 43       x IN (SELEC
11080 54 20 2e 2e 2e 29 0a 2a 2a 20 20 20 20 20 20 78  T ...).**      x
11090 20 49 4e 20 28 76 61 6c 75 65 2c 20 76 61 6c 75   IN (value, valu
110a0 65 2c 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 54 68  e, ...).**.** Th
110b0 65 20 6c 65 66 74 2d 68 61 6e 64 20 73 69 64 65  e left-hand side
110c0 20 28 4c 48 53 29 20 69 73 20 61 20 73 63 61 6c   (LHS) is a scal
110d0 61 72 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20  ar expression.  
110e0 54 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73  The right-hand s
110f0 69 64 65 20 28 52 48 53 29 0a 2a 2a 20 69 73 20  ide (RHS).** is 
11100 61 6e 20 61 72 72 61 79 20 6f 66 20 7a 65 72 6f  an array of zero
11110 20 6f 72 20 6d 6f 72 65 20 76 61 6c 75 65 73 2e   or more values.
11120 20 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e    The expression
11130 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20   is true if the 
11140 4c 48 53 20 69 73 0a 2a 2a 20 63 6f 6e 74 61 69  LHS is.** contai
11150 6e 65 64 20 77 69 74 68 69 6e 20 74 68 65 20 52  ned within the R
11160 48 53 2e 20 20 54 68 65 20 76 61 6c 75 65 20 6f  HS.  The value o
11170 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
11180 20 69 73 20 75 6e 6b 6e 6f 77 6e 20 28 4e 55 4c   is unknown (NUL
11190 4c 29 0a 2a 2a 20 69 66 20 74 68 65 20 4c 48 53  L).** if the LHS
111a0 20 69 73 20 4e 55 4c 4c 20 6f 72 20 69 66 20 74   is NULL or if t
111b0 68 65 20 4c 48 53 20 69 73 20 6e 6f 74 20 63 6f  he LHS is not co
111c0 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20 74  ntained within t
111d0 68 65 20 52 48 53 20 61 6e 64 20 74 68 65 0a 2a  he RHS and the.*
111e0 2a 20 52 48 53 20 63 6f 6e 74 61 69 6e 73 20 6f  * RHS contains o
111f0 6e 65 20 6f 72 20 6d 6f 72 65 20 4e 55 4c 4c 20  ne or more NULL 
11200 76 61 6c 75 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  values..**.** Th
11210 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72  is routine gener
11220 61 74 65 73 20 63 6f 64 65 20 74 68 61 74 20 6a  ates code that j
11230 75 6d 70 73 20 74 6f 20 64 65 73 74 49 66 46 61  umps to destIfFa
11240 6c 73 65 20 69 66 20 74 68 65 20 4c 48 53 20 69  lse if the LHS i
11250 73 20 6e 6f 74 20 0a 2a 2a 20 63 6f 6e 74 61 69  s not .** contai
11260 6e 65 64 20 77 69 74 68 69 6e 20 74 68 65 20 52  ned within the R
11270 48 53 2e 20 20 49 66 20 64 75 65 20 74 6f 20 4e  HS.  If due to N
11280 55 4c 4c 73 20 77 65 20 63 61 6e 6e 6f 74 20 64  ULLs we cannot d
11290 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20  etermine if the 
112a0 4c 48 53 0a 2a 2a 20 69 73 20 63 6f 6e 74 61 69  LHS.** is contai
112b0 6e 65 64 20 69 6e 20 74 68 65 20 52 48 53 20 74  ned in the RHS t
112c0 68 65 6e 20 6a 75 6d 70 20 74 6f 20 64 65 73 74  hen jump to dest
112d0 49 66 4e 75 6c 6c 2e 20 20 49 66 20 74 68 65 20  IfNull.  If the 
112e0 4c 48 53 20 69 73 20 63 6f 6e 74 61 69 6e 65 64  LHS is contained
112f0 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20 52  .** within the R
11300 48 53 20 74 68 65 6e 20 66 61 6c 6c 20 74 68 72  HS then fall thr
11310 6f 75 67 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ough..*/.static 
11320 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
11330 43 6f 64 65 49 4e 28 0a 20 20 50 61 72 73 65 20  CodeIN(.  Parse 
11340 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
11350 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63  /* Parsing and c
11360 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63  ode generating c
11370 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
11380 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20 20   *pExpr,        
11390 20 20 2f 2a 20 54 68 65 20 49 4e 20 65 78 70 72    /* The IN expr
113a0 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ession */.  int 
113b0 64 65 73 74 49 66 46 61 6c 73 65 2c 20 20 20 20  destIfFalse,    
113c0 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69    /* Jump here i
113d0 66 20 4c 48 53 20 69 73 20 6e 6f 74 20 63 6f 6e  f LHS is not con
113e0 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 52 48  tained in the RH
113f0 53 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 49  S */.  int destI
11400 66 4e 75 6c 6c 20 20 20 20 20 20 20 20 2f 2a 20  fNull        /* 
11410 4a 75 6d 70 20 68 65 72 65 20 69 66 20 74 68 65  Jump here if the
11420 20 72 65 73 75 6c 74 73 20 61 72 65 20 75 6e 6b   results are unk
11430 6e 6f 77 6e 20 64 75 65 20 74 6f 20 4e 55 4c 4c  nown due to NULL
11440 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 52  s */.){.  int rR
11450 68 73 48 61 73 4e 75 6c 6c 20 3d 20 30 3b 20 20  hsHasNull = 0;  
11460 2f 2a 20 52 65 67 69 73 74 65 72 20 74 68 61 74  /* Register that
11470 20 69 73 20 74 72 75 65 20 69 66 20 52 48 53 20   is true if RHS 
11480 63 6f 6e 74 61 69 6e 73 20 4e 55 4c 4c 20 76 61  contains NULL va
11490 6c 75 65 73 20 2a 2f 0a 20 20 63 68 61 72 20 61  lues */.  char a
114a0 66 66 69 6e 69 74 79 3b 20 20 20 20 20 20 20 20  ffinity;        
114b0 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20 61 66  /* Comparison af
114c0 66 69 6e 69 74 79 20 74 6f 20 75 73 65 20 2a 2f  finity to use */
114d0 0a 20 20 69 6e 74 20 65 54 79 70 65 3b 20 20 20  .  int eType;   
114e0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 79 70 65           /* Type
114f0 20 6f 66 20 74 68 65 20 52 48 53 20 2a 2f 0a 20   of the RHS */. 
11500 20 69 6e 74 20 72 31 3b 20 20 20 20 20 20 20 20   int r1;        
11510 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72         /* Tempor
11520 61 72 79 20 75 73 65 20 72 65 67 69 73 74 65 72  ary use register
11530 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20   */.  Vdbe *v;  
11540 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
11550 74 61 74 65 6d 65 6e 74 20 75 6e 64 65 72 20 63  tatement under c
11560 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 0a  onstruction */..
11570 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65    /* Compute the
11580 20 52 48 53 2e 20 20 20 41 66 74 65 72 20 74 68   RHS.   After th
11590 69 73 20 73 74 65 70 2c 20 74 68 65 20 74 61 62  is step, the tab
115a0 6c 65 20 77 69 74 68 20 63 75 72 73 6f 72 0a 20  le with cursor. 
115b0 20 2a 2a 20 70 45 78 70 72 2d 3e 69 54 61 62 6c   ** pExpr->iTabl
115c0 65 20 77 69 6c 6c 20 63 6f 6e 74 61 69 6e 73 20  e will contains 
115d0 74 68 65 20 76 61 6c 75 65 73 20 74 68 61 74 20  the values that 
115e0 6d 61 6b 65 20 75 70 20 74 68 65 20 52 48 53 2e  make up the RHS.
115f0 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 70 50 61 72  .  */.  v = pPar
11600 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73  se->pVdbe;.  ass
11610 65 72 74 28 20 76 21 3d 30 20 29 3b 20 20 20 20  ert( v!=0 );    
11620 20 20 20 2f 2a 20 4f 4f 4d 20 64 65 74 65 63 74     /* OOM detect
11630 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68 69 73  ed prior to this
11640 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 56 64   routine */.  Vd
11650 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76  beNoopComment((v
11660 2c 20 22 62 65 67 69 6e 20 49 4e 20 65 78 70 72  , "begin IN expr
11670 22 29 29 3b 0a 20 20 65 54 79 70 65 20 3d 20 73  "));.  eType = s
11680 71 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e 64 65  qlite3FindInInde
11690 78 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  x(pParse, pExpr,
116a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
116b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 49 4e                IN
116c0 5f 49 4e 44 45 58 5f 4d 45 4d 42 45 52 53 48 49  _INDEX_MEMBERSHI
116d0 50 20 7c 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f  P | IN_INDEX_NOO
116e0 50 5f 4f 4b 2c 0a 20 20 20 20 20 20 20 20 20 20  P_OK,.          
116f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11700 20 20 20 64 65 73 74 49 66 46 61 6c 73 65 3d 3d     destIfFalse==
11710 64 65 73 74 49 66 4e 75 6c 6c 20 3f 20 30 20 3a  destIfNull ? 0 :
11720 20 26 72 52 68 73 48 61 73 4e 75 6c 6c 29 3b 0a   &rRhsHasNull);.
11730 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74  .  /* Figure out
11740 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 74 6f   the affinity to
11750 20 75 73 65 20 74 6f 20 63 72 65 61 74 65 20 61   use to create a
11760 20 6b 65 79 20 66 72 6f 6d 20 74 68 65 20 72 65   key from the re
11770 73 75 6c 74 73 0a 20 20 2a 2a 20 6f 66 20 74 68  sults.  ** of th
11780 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 61 66  e expression. af
11790 66 69 6e 69 74 79 53 74 72 20 73 74 6f 72 65 73  finityStr stores
117a0 20 61 20 73 74 61 74 69 63 20 73 74 72 69 6e 67   a static string
117b0 20 73 75 69 74 61 62 6c 65 20 66 6f 72 0a 20 20   suitable for.  
117c0 2a 2a 20 50 34 20 6f 66 20 4f 50 5f 4d 61 6b 65  ** P4 of OP_Make
117d0 52 65 63 6f 72 64 2e 0a 20 20 2a 2f 0a 20 20 61  Record..  */.  a
117e0 66 66 69 6e 69 74 79 20 3d 20 63 6f 6d 70 61 72  ffinity = compar
117f0 69 73 6f 6e 41 66 66 69 6e 69 74 79 28 70 45 78  isonAffinity(pEx
11800 70 72 29 3b 0a 0a 20 20 2f 2a 20 43 6f 64 65 20  pr);..  /* Code 
11810 74 68 65 20 4c 48 53 2c 20 74 68 65 20 3c 65 78  the LHS, the <ex
11820 70 72 3e 20 66 72 6f 6d 20 22 3c 65 78 70 72 3e  pr> from "<expr>
11830 20 49 4e 20 28 2e 2e 2e 29 22 2e 0a 20 20 2a 2f   IN (...)"..  */
11840 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  .  sqlite3ExprCa
11850 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b  chePush(pParse);
11860 0a 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47  .  r1 = sqlite3G
11870 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
11880 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
11890 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78  Code(pParse, pEx
118a0 70 72 2d 3e 70 4c 65 66 74 2c 20 72 31 29 3b 0a  pr->pLeft, r1);.
118b0 0a 20 20 2f 2a 20 49 66 20 73 71 6c 69 74 65 33  .  /* If sqlite3
118c0 46 69 6e 64 49 6e 49 6e 64 65 78 28 29 20 64 69  FindInIndex() di
118d0 64 20 6e 6f 74 20 66 69 6e 64 20 6f 72 20 63 72  d not find or cr
118e0 65 61 74 65 20 61 6e 20 69 6e 64 65 78 20 74 68  eate an index th
118f0 61 74 20 69 73 0a 20 20 2a 2a 20 73 75 69 74 61  at is.  ** suita
11900 62 6c 65 20 66 6f 72 20 65 76 61 6c 75 61 74 69  ble for evaluati
11910 6e 67 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74  ng the IN operat
11920 6f 72 2c 20 74 68 65 6e 20 65 76 61 6c 75 61 74  or, then evaluat
11930 65 20 75 73 69 6e 67 20 61 0a 20 20 2a 2a 20 73  e using a.  ** s
11940 65 71 75 65 6e 63 65 20 6f 66 20 63 6f 6d 70 61  equence of compa
11950 72 69 73 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69  risons..  */.  i
11960 66 28 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44  f( eType==IN_IND
11970 45 58 5f 4e 4f 4f 50 20 29 7b 0a 20 20 20 20 45  EX_NOOP ){.    E
11980 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d  xprList *pList =
11990 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b   pExpr->x.pList;
119a0 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  .    CollSeq *pC
119b0 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
119c0 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
119d0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a   pExpr->pLeft);.
119e0 20 20 20 20 69 6e 74 20 6c 61 62 65 6c 4f 6b 20      int labelOk 
119f0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
11a00 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 69  eLabel(v);.    i
11a10 6e 74 20 72 32 2c 20 72 65 67 54 6f 46 72 65 65  nt r2, regToFree
11a20 3b 0a 20 20 20 20 69 6e 74 20 72 65 67 43 6b 4e  ;.    int regCkN
11a30 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  ull = 0;.    int
11a40 20 69 69 3b 0a 20 20 20 20 61 73 73 65 72 74 28   ii;.    assert(
11a50 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
11a60 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
11a70 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 69 66  elect) );.    if
11a80 28 20 64 65 73 74 49 66 4e 75 6c 6c 21 3d 64 65  ( destIfNull!=de
11a90 73 74 49 66 46 61 6c 73 65 20 29 7b 0a 20 20 20  stIfFalse ){.   
11aa0 20 20 20 72 65 67 43 6b 4e 75 6c 6c 20 3d 20 73     regCkNull = s
11ab0 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
11ac0 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
11ad0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
11ae0 33 28 76 2c 20 4f 50 5f 42 69 74 41 6e 64 2c 20  3(v, OP_BitAnd, 
11af0 72 31 2c 20 72 31 2c 20 72 65 67 43 6b 4e 75 6c  r1, r1, regCkNul
11b00 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  l);.    }.    fo
11b10 72 28 69 69 3d 30 3b 20 69 69 3c 70 4c 69 73 74  r(ii=0; ii<pList
11b20 2d 3e 6e 45 78 70 72 3b 20 69 69 2b 2b 29 7b 0a  ->nExpr; ii++){.
11b30 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74        r2 = sqlit
11b40 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
11b50 50 61 72 73 65 2c 20 70 4c 69 73 74 2d 3e 61 5b  Parse, pList->a[
11b60 69 69 5d 2e 70 45 78 70 72 2c 20 26 72 65 67 54  ii].pExpr, &regT
11b70 6f 46 72 65 65 29 3b 0a 20 20 20 20 20 20 69 66  oFree);.      if
11b80 28 20 72 65 67 43 6b 4e 75 6c 6c 20 26 26 20 73  ( regCkNull && s
11b90 71 6c 69 74 65 33 45 78 70 72 43 61 6e 42 65 4e  qlite3ExprCanBeN
11ba0 75 6c 6c 28 70 4c 69 73 74 2d 3e 61 5b 69 69 5d  ull(pList->a[ii]
11bb0 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20  .pExpr) ){.     
11bc0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
11bd0 64 4f 70 33 28 76 2c 20 4f 50 5f 42 69 74 41 6e  dOp3(v, OP_BitAn
11be0 64 2c 20 72 65 67 43 6b 4e 75 6c 6c 2c 20 72 32  d, regCkNull, r2
11bf0 2c 20 72 65 67 43 6b 4e 75 6c 6c 29 3b 0a 20 20  , regCkNull);.  
11c00 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
11c10 69 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d  ii<pList->nExpr-
11c20 31 20 7c 7c 20 64 65 73 74 49 66 4e 75 6c 6c 21  1 || destIfNull!
11c30 3d 64 65 73 74 49 66 46 61 6c 73 65 20 29 7b 0a  =destIfFalse ){.
11c40 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
11c50 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
11c60 45 71 2c 20 72 31 2c 20 6c 61 62 65 6c 4f 6b 2c  Eq, r1, labelOk,
11c70 20 72 32 2c 0a 20 20 20 20 20 20 20 20 20 20 20   r2,.           
11c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
11c90 76 6f 69 64 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f  void*)pColl, P4_
11ca0 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 20 20  COLLSEQ);.      
11cb0 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
11cc0 28 76 2c 20 69 69 3c 70 4c 69 73 74 2d 3e 6e 45  (v, ii<pList->nE
11cd0 78 70 72 2d 31 29 3b 0a 20 20 20 20 20 20 20 20  xpr-1);.        
11ce0 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
11cf0 2c 20 69 69 3d 3d 70 4c 69 73 74 2d 3e 6e 45 78  , ii==pList->nEx
11d00 70 72 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 73  pr-1);.        s
11d10 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
11d20 50 35 28 76 2c 20 61 66 66 69 6e 69 74 79 29 3b  P5(v, affinity);
11d30 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
11d40 20 20 20 20 20 20 61 73 73 65 72 74 28 20 64 65        assert( de
11d50 73 74 49 66 4e 75 6c 6c 3d 3d 64 65 73 74 49 66  stIfNull==destIf
11d60 46 61 6c 73 65 20 29 3b 0a 20 20 20 20 20 20 20  False );.       
11d70 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
11d80 70 34 28 76 2c 20 4f 50 5f 4e 65 2c 20 72 31 2c  p4(v, OP_Ne, r1,
11d90 20 64 65 73 74 49 66 46 61 6c 73 65 2c 20 72 32   destIfFalse, r2
11da0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
11db0 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69              (voi
11dc0 64 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c  d*)pColl, P4_COL
11dd0 4c 53 45 51 29 3b 20 56 64 62 65 43 6f 76 65 72  LSEQ); VdbeCover
11de0 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
11df0 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
11e00 65 50 35 28 76 2c 20 61 66 66 69 6e 69 74 79 20  eP5(v, affinity 
11e10 7c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  | SQLITE_JUMPIFN
11e20 55 4c 4c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ULL);.      }.  
11e30 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
11e40 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
11e50 2c 20 72 65 67 54 6f 46 72 65 65 29 3b 0a 20 20  , regToFree);.  
11e60 20 20 7d 0a 20 20 20 20 69 66 28 20 72 65 67 43    }.    if( regC
11e70 6b 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 73  kNull ){.      s
11e80 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
11e90 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72  (v, OP_IsNull, r
11ea0 65 67 43 6b 4e 75 6c 6c 2c 20 64 65 73 74 49 66  egCkNull, destIf
11eb0 4e 75 6c 6c 29 3b 20 56 64 62 65 43 6f 76 65 72  Null); VdbeCover
11ec0 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 73 71  age(v);.      sq
11ed0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
11ee0 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 64  v, OP_Goto, 0, d
11ef0 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 20 20 20  estIfFalse);.   
11f00 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64   }.    sqlite3Vd
11f10 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
11f20 2c 20 6c 61 62 65 6c 4f 6b 29 3b 0a 20 20 20 20  , labelOk);.    
11f30 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
11f40 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
11f50 67 43 6b 4e 75 6c 6c 29 3b 0a 20 20 7d 65 6c 73  gCkNull);.  }els
11f60 65 7b 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20  e{.  .    /* If 
11f70 74 68 65 20 4c 48 53 20 69 73 20 4e 55 4c 4c 2c  the LHS is NULL,
11f80 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74   then the result
11f90 20 69 73 20 65 69 74 68 65 72 20 66 61 6c 73 65   is either false
11fa0 20 6f 72 20 4e 55 4c 4c 20 64 65 70 65 6e 64 69   or NULL dependi
11fb0 6e 67 0a 20 20 20 20 2a 2a 20 6f 6e 20 77 68 65  ng.    ** on whe
11fc0 74 68 65 72 20 74 68 65 20 52 48 53 20 69 73 20  ther the RHS is 
11fd0 65 6d 70 74 79 20 6f 72 20 6e 6f 74 2c 20 72 65  empty or not, re
11fe0 73 70 65 63 74 69 76 65 6c 79 2e 0a 20 20 20 20  spectively..    
11ff0 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  */.    if( sqlit
12000 65 33 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28  e3ExprCanBeNull(
12010 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 20 29 7b  pExpr->pLeft) ){
12020 0a 20 20 20 20 20 20 69 66 28 20 64 65 73 74 49  .      if( destI
12030 66 4e 75 6c 6c 3d 3d 64 65 73 74 49 66 46 61 6c  fNull==destIfFal
12040 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  se ){.        /*
12050 20 53 68 6f 72 74 63 75 74 20 66 6f 72 20 74 68   Shortcut for th
12060 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68  e common case wh
12070 65 72 65 20 74 68 65 20 66 61 6c 73 65 20 61 6e  ere the false an
12080 64 20 4e 55 4c 4c 20 6f 75 74 63 6f 6d 65 73 20  d NULL outcomes 
12090 61 72 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  are.        ** t
120a0 68 65 20 73 61 6d 65 2e 20 2a 2f 0a 20 20 20 20  he same. */.    
120b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
120c0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75  ddOp2(v, OP_IsNu
120d0 6c 6c 2c 20 72 31 2c 20 64 65 73 74 49 66 4e 75  ll, r1, destIfNu
120e0 6c 6c 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  ll); VdbeCoverag
120f0 65 28 76 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  e(v);.      }els
12100 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61  e{.        int a
12110 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64  ddr1 = sqlite3Vd
12120 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e  beAddOp1(v, OP_N
12130 6f 74 4e 75 6c 6c 2c 20 72 31 29 3b 20 56 64 62  otNull, r1); Vdb
12140 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
12150 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
12160 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65  eAddOp2(v, OP_Re
12170 77 69 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54 61  wind, pExpr->iTa
12180 62 6c 65 2c 20 64 65 73 74 49 66 46 61 6c 73 65  ble, destIfFalse
12190 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43  );.        VdbeC
121a0 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
121b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
121c0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
121d0 2c 20 30 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29  , 0, destIfNull)
121e0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
121f0 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
12200 20 61 64 64 72 31 29 3b 0a 20 20 20 20 20 20 7d   addr1);.      }
12210 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66  .    }.  .    if
12220 28 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45  ( eType==IN_INDE
12230 58 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20 20 20  X_ROWID ){.     
12240 20 2f 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65   /* In this case
12250 2c 20 74 68 65 20 52 48 53 20 69 73 20 74 68 65  , the RHS is the
12260 20 52 4f 57 49 44 20 6f 66 20 74 61 62 6c 65 20   ROWID of table 
12270 62 2d 74 72 65 65 0a 20 20 20 20 20 20 2a 2f 0a  b-tree.      */.
12280 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
12290 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4d 75  eAddOp2(v, OP_Mu
122a0 73 74 42 65 49 6e 74 2c 20 72 31 2c 20 64 65 73  stBeInt, r1, des
122b0 74 49 66 46 61 6c 73 65 29 3b 20 56 64 62 65 43  tIfFalse); VdbeC
122c0 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
122d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
122e0 4f 70 33 28 76 2c 20 4f 50 5f 4e 6f 74 45 78 69  Op3(v, OP_NotExi
122f0 73 74 73 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  sts, pExpr->iTab
12300 6c 65 2c 20 64 65 73 74 49 66 46 61 6c 73 65 2c  le, destIfFalse,
12310 20 72 31 29 3b 0a 20 20 20 20 20 20 56 64 62 65   r1);.      Vdbe
12320 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
12330 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
12340 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 74   In this case, t
12350 68 65 20 52 48 53 20 69 73 20 61 6e 20 69 6e 64  he RHS is an ind
12360 65 78 20 62 2d 74 72 65 65 2e 0a 20 20 20 20 20  ex b-tree..     
12370 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
12380 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
12390 50 5f 41 66 66 69 6e 69 74 79 2c 20 72 31 2c 20  P_Affinity, r1, 
123a0 31 2c 20 30 2c 20 26 61 66 66 69 6e 69 74 79 2c  1, 0, &affinity,
123b0 20 31 29 3b 0a 20 20 0a 20 20 20 20 20 20 2f 2a   1);.  .      /*
123c0 20 49 66 20 74 68 65 20 73 65 74 20 6d 65 6d 62   If the set memb
123d0 65 72 73 68 69 70 20 74 65 73 74 20 66 61 69 6c  ership test fail
123e0 73 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73 75  s, then the resu
123f0 6c 74 20 6f 66 20 74 68 65 20 0a 20 20 20 20 20  lt of the .     
12400 20 2a 2a 20 22 78 20 49 4e 20 28 2e 2e 2e 29 22   ** "x IN (...)"
12410 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 75 73 74   expression must
12420 20 62 65 20 65 69 74 68 65 72 20 30 20 6f 72 20   be either 0 or 
12430 4e 55 4c 4c 2e 20 49 66 20 74 68 65 20 73 65 74  NULL. If the set
12440 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69  .      ** contai
12450 6e 73 20 6e 6f 20 4e 55 4c 4c 20 76 61 6c 75 65  ns no NULL value
12460 73 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73 75  s, then the resu
12470 6c 74 20 69 73 20 30 2e 20 49 66 20 74 68 65 20  lt is 0. If the 
12480 73 65 74 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f  set .      ** co
12490 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f  ntains one or mo
124a0 72 65 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2c 20  re NULL values, 
124b0 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20  then the result 
124c0 6f 66 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  of the.      ** 
124d0 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 6c  expression is al
124e0 73 6f 20 4e 55 4c 4c 2e 0a 20 20 20 20 20 20 2a  so NULL..      *
124f0 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
12500 64 65 73 74 49 66 46 61 6c 73 65 21 3d 64 65 73  destIfFalse!=des
12510 74 49 66 4e 75 6c 6c 20 7c 7c 20 72 52 68 73 48  tIfNull || rRhsH
12520 61 73 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  asNull==0 );.   
12530 20 20 20 69 66 28 20 72 52 68 73 48 61 73 4e 75     if( rRhsHasNu
12540 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ll==0 ){.       
12550 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20   /* This branch 
12560 72 75 6e 73 20 69 66 20 69 74 20 69 73 20 6b 6e  runs if it is kn
12570 6f 77 6e 20 61 74 20 63 6f 6d 70 69 6c 65 20 74  own at compile t
12580 69 6d 65 20 74 68 61 74 20 74 68 65 20 52 48 53  ime that the RHS
12590 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 61 6e 6e  .        ** cann
125a0 6f 74 20 63 6f 6e 74 61 69 6e 20 4e 55 4c 4c 20  ot contain NULL 
125b0 76 61 6c 75 65 73 2e 20 54 68 69 73 20 68 61 70  values. This hap
125c0 70 65 6e 73 20 61 73 20 74 68 65 20 72 65 73 75  pens as the resu
125d0 6c 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66  lt.        ** of
125e0 20 61 20 22 4e 4f 54 20 4e 55 4c 4c 22 20 63 6f   a "NOT NULL" co
125f0 6e 73 74 72 61 69 6e 74 20 69 6e 20 74 68 65 20  nstraint in the 
12600 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e  database schema.
12610 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
12620 20 20 20 20 2a 2a 20 41 6c 73 6f 20 72 75 6e 20      ** Also run 
12630 74 68 69 73 20 62 72 61 6e 63 68 20 69 66 20 4e  this branch if N
12640 55 4c 4c 20 69 73 20 65 71 75 69 76 61 6c 65 6e  ULL is equivalen
12650 74 20 74 6f 20 46 41 4c 53 45 0a 20 20 20 20 20  t to FALSE.     
12660 20 20 20 2a 2a 20 66 6f 72 20 74 68 69 73 20 70     ** for this p
12670 61 72 74 69 63 75 6c 61 72 20 49 4e 20 6f 70 65  articular IN ope
12680 72 61 74 6f 72 2e 0a 20 20 20 20 20 20 20 20 2a  rator..        *
12690 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  /.        sqlite
126a0 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
126b0 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 70  , OP_NotFound, p
126c0 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 64 65  Expr->iTable, de
126d0 73 74 49 66 46 61 6c 73 65 2c 20 72 31 2c 20 31  stIfFalse, r1, 1
126e0 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43  );.        VdbeC
126f0 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
12700 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
12710 20 2f 2a 20 49 6e 20 74 68 69 73 20 62 72 61 6e   /* In this bran
12720 63 68 2c 20 74 68 65 20 52 48 53 20 6f 66 20 74  ch, the RHS of t
12730 68 65 20 49 4e 20 6d 69 67 68 74 20 63 6f 6e 74  he IN might cont
12740 61 69 6e 20 61 20 4e 55 4c 4c 20 61 6e 64 0a 20  ain a NULL and. 
12750 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70 72         ** the pr
12760 65 73 65 6e 63 65 20 6f 66 20 61 20 4e 55 4c 4c  esence of a NULL
12770 20 6f 6e 20 74 68 65 20 52 48 53 20 6d 61 6b 65   on the RHS make
12780 73 20 61 20 64 69 66 66 65 72 65 6e 63 65 20 69  s a difference i
12790 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  n the.        **
127a0 20 6f 75 74 63 6f 6d 65 2e 0a 20 20 20 20 20 20   outcome..      
127b0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74    */.        int
127c0 20 6a 31 3b 0a 20 20 0a 20 20 20 20 20 20 20 20   j1;.  .        
127d0 2f 2a 20 46 69 72 73 74 20 63 68 65 63 6b 20 74  /* First check t
127e0 6f 20 73 65 65 20 69 66 20 74 68 65 20 4c 48 53  o see if the LHS
127f0 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e   is contained in
12800 20 74 68 65 20 52 48 53 2e 20 20 49 66 20 73 6f   the RHS.  If so
12810 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  ,.        ** the
12820 6e 20 74 68 65 20 61 6e 73 77 65 72 20 69 73 20  n the answer is 
12830 54 52 55 45 20 74 68 65 20 70 72 65 73 65 6e 63  TRUE the presenc
12840 65 20 6f 66 20 4e 55 4c 4c 73 20 69 6e 20 74 68  e of NULLs in th
12850 65 20 52 48 53 20 64 6f 65 73 0a 20 20 20 20 20  e RHS does.     
12860 20 20 20 2a 2a 20 6e 6f 74 20 6d 61 74 74 65 72     ** not matter
12870 2e 20 20 49 66 20 74 68 65 20 4c 48 53 20 69 73  .  If the LHS is
12880 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20 69   not contained i
12890 6e 20 74 68 65 20 52 48 53 2c 20 74 68 65 6e 20  n the RHS, then 
128a0 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  the.        ** a
128b0 6e 73 77 65 72 20 69 73 20 4e 55 4c 4c 20 69 66  nswer is NULL if
128c0 20 74 68 65 20 52 48 53 20 63 6f 6e 74 61 69 6e   the RHS contain
128d0 73 20 4e 55 4c 4c 73 20 61 6e 64 20 74 68 65 20  s NULLs and the 
128e0 61 6e 73 77 65 72 20 69 73 0a 20 20 20 20 20 20  answer is.      
128f0 20 20 2a 2a 20 46 41 4c 53 45 20 69 66 20 74 68    ** FALSE if th
12900 65 20 52 48 53 20 69 73 20 4e 55 4c 4c 2d 66 72  e RHS is NULL-fr
12910 65 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ee..        */. 
12920 20 20 20 20 20 20 20 6a 31 20 3d 20 73 71 6c 69         j1 = sqli
12930 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
12940 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 70 45  (v, OP_Found, pE
12950 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 30 2c 20  xpr->iTable, 0, 
12960 72 31 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  r1, 1);.        
12970 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
12980 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
12990 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
129a0 5f 49 73 4e 75 6c 6c 2c 20 72 52 68 73 48 61 73  _IsNull, rRhsHas
129b0 4e 75 6c 6c 2c 20 64 65 73 74 49 66 4e 75 6c 6c  Null, destIfNull
129c0 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43  );.        VdbeC
129d0 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
129e0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
129f0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
12a00 2c 20 30 2c 20 64 65 73 74 49 66 46 61 6c 73 65  , 0, destIfFalse
12a10 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
12a20 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
12a30 2c 20 6a 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20  , j1);.      }. 
12a40 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
12a50 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
12a60 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20  (pParse, r1);.  
12a70 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
12a80 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20 56  Pop(pParse);.  V
12a90 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
12aa0 65 6e 64 20 49 4e 20 65 78 70 72 22 29 29 3b 0a  end IN expr"));.
12ab0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
12ac0 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
12ad0 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 44 75 70 6c 69   */../*.** Dupli
12ae0 63 61 74 65 20 61 6e 20 38 2d 62 79 74 65 20 76  cate an 8-byte v
12af0 61 6c 75 65 0a 2a 2f 0a 73 74 61 74 69 63 20 63  alue.*/.static c
12b00 68 61 72 20 2a 64 75 70 38 62 79 74 65 73 28 56  har *dup8bytes(V
12b10 64 62 65 20 2a 76 2c 20 63 6f 6e 73 74 20 63 68  dbe *v, const ch
12b20 61 72 20 2a 69 6e 29 7b 0a 20 20 63 68 61 72 20  ar *in){.  char 
12b30 2a 6f 75 74 20 3d 20 73 71 6c 69 74 65 33 44 62  *out = sqlite3Db
12b40 4d 61 6c 6c 6f 63 52 61 77 28 73 71 6c 69 74 65  MallocRaw(sqlite
12b50 33 56 64 62 65 44 62 28 76 29 2c 20 38 29 3b 0a  3VdbeDb(v), 8);.
12b60 20 20 69 66 28 20 6f 75 74 20 29 7b 0a 20 20 20    if( out ){.   
12b70 20 6d 65 6d 63 70 79 28 6f 75 74 2c 20 69 6e 2c   memcpy(out, in,
12b80 20 38 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   8);.  }.  retur
12b90 6e 20 6f 75 74 3b 0a 7d 0a 0a 23 69 66 6e 64 65  n out;.}..#ifnde
12ba0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c  f SQLITE_OMIT_FL
12bb0 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 2f 2a 0a  OATING_POINT./*.
12bc0 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 6e 20 69  ** Generate an i
12bd0 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 61 74 20  nstruction that 
12be0 77 69 6c 6c 20 70 75 74 20 74 68 65 20 66 6c 6f  will put the flo
12bf0 61 74 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20 76  ating point.** v
12c00 61 6c 75 65 20 64 65 73 63 72 69 62 65 64 20 62  alue described b
12c10 79 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 69 6e 74 6f  y z[0..n-1] into
12c20 20 72 65 67 69 73 74 65 72 20 69 4d 65 6d 2e 0a   register iMem..
12c30 2a 2a 0a 2a 2a 20 54 68 65 20 7a 5b 5d 20 73 74  **.** The z[] st
12c40 72 69 6e 67 20 77 69 6c 6c 20 70 72 6f 62 61 62  ring will probab
12c50 6c 79 20 6e 6f 74 20 62 65 20 7a 65 72 6f 2d 74  ly not be zero-t
12c60 65 72 6d 69 6e 61 74 65 64 2e 20 20 42 75 74 20  erminated.  But 
12c70 74 68 65 20 0a 2a 2a 20 7a 5b 6e 5d 20 63 68 61  the .** z[n] cha
12c80 72 61 63 74 65 72 20 69 73 20 67 75 61 72 61 6e  racter is guaran
12c90 74 65 65 64 20 74 6f 20 62 65 20 73 6f 6d 65 74  teed to be somet
12ca0 68 69 6e 67 20 74 68 61 74 20 64 6f 65 73 20 6e  hing that does n
12cb0 6f 74 20 6c 6f 6f 6b 0a 2a 2a 20 6c 69 6b 65 20  ot look.** like 
12cc0 74 68 65 20 63 6f 6e 74 69 6e 75 61 74 69 6f 6e  the continuation
12cd0 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 2e 0a   of the number..
12ce0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
12cf0 6f 64 65 52 65 61 6c 28 56 64 62 65 20 2a 76 2c  odeReal(Vdbe *v,
12d00 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20   const char *z, 
12d10 69 6e 74 20 6e 65 67 61 74 65 46 6c 61 67 2c 20  int negateFlag, 
12d20 69 6e 74 20 69 4d 65 6d 29 7b 0a 20 20 69 66 28  int iMem){.  if(
12d30 20 41 4c 57 41 59 53 28 7a 21 3d 30 29 20 29 7b   ALWAYS(z!=0) ){
12d40 0a 20 20 20 20 64 6f 75 62 6c 65 20 76 61 6c 75  .    double valu
12d50 65 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 56 3b  e;.    char *zV;
12d60 0a 20 20 20 20 73 71 6c 69 74 65 33 41 74 6f 46  .    sqlite3AtoF
12d70 28 7a 2c 20 26 76 61 6c 75 65 2c 20 73 71 6c 69  (z, &value, sqli
12d80 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 2c 20  te3Strlen30(z), 
12d90 53 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 20  SQLITE_UTF8);.  
12da0 20 20 61 73 73 65 72 74 28 20 21 73 71 6c 69 74    assert( !sqlit
12db0 65 33 49 73 4e 61 4e 28 76 61 6c 75 65 29 20 29  e3IsNaN(value) )
12dc0 3b 20 2f 2a 20 54 68 65 20 6e 65 77 20 41 74 6f  ; /* The new Ato
12dd0 46 20 6e 65 76 65 72 20 72 65 74 75 72 6e 73 20  F never returns 
12de0 4e 61 4e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e  NaN */.    if( n
12df0 65 67 61 74 65 46 6c 61 67 20 29 20 76 61 6c 75  egateFlag ) valu
12e00 65 20 3d 20 2d 76 61 6c 75 65 3b 0a 20 20 20 20  e = -value;.    
12e10 7a 56 20 3d 20 64 75 70 38 62 79 74 65 73 28 76  zV = dup8bytes(v
12e20 2c 20 28 63 68 61 72 2a 29 26 76 61 6c 75 65 29  , (char*)&value)
12e30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
12e40 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 52 65  eAddOp4(v, OP_Re
12e50 61 6c 2c 20 30 2c 20 69 4d 65 6d 2c 20 30 2c 20  al, 0, iMem, 0, 
12e60 7a 56 2c 20 50 34 5f 52 45 41 4c 29 3b 0a 20 20  zV, P4_REAL);.  
12e70 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a  }.}.#endif.../*.
12e80 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 6e 20 69  ** Generate an i
12e90 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 61 74 20  nstruction that 
12ea0 77 69 6c 6c 20 70 75 74 20 74 68 65 20 69 6e 74  will put the int
12eb0 65 67 65 72 20 64 65 73 63 72 69 62 65 20 62 79  eger describe by
12ec0 0a 2a 2a 20 74 65 78 74 20 7a 5b 30 2e 2e 6e 2d  .** text z[0..n-
12ed0 31 5d 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72  1] into register
12ee0 20 69 4d 65 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78 70   iMem..**.** Exp
12ef0 72 2e 75 2e 7a 54 6f 6b 65 6e 20 69 73 20 61 6c  r.u.zToken is al
12f00 77 61 79 73 20 55 54 46 38 20 61 6e 64 20 7a 65  ways UTF8 and ze
12f10 72 6f 2d 74 65 72 6d 69 6e 61 74 65 64 2e 0a 2a  ro-terminated..*
12f20 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f  /.static void co
12f30 64 65 49 6e 74 65 67 65 72 28 50 61 72 73 65 20  deInteger(Parse 
12f40 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
12f50 45 78 70 72 2c 20 69 6e 74 20 6e 65 67 46 6c 61  Expr, int negFla
12f60 67 2c 20 69 6e 74 20 69 4d 65 6d 29 7b 0a 20 20  g, int iMem){.  
12f70 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
12f80 2d 3e 70 56 64 62 65 3b 0a 20 20 69 66 28 20 70  ->pVdbe;.  if( p
12f90 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50  Expr->flags & EP
12fa0 5f 49 6e 74 56 61 6c 75 65 20 29 7b 0a 20 20 20  _IntValue ){.   
12fb0 20 69 6e 74 20 69 20 3d 20 70 45 78 70 72 2d 3e   int i = pExpr->
12fc0 75 2e 69 56 61 6c 75 65 3b 0a 20 20 20 20 61 73  u.iValue;.    as
12fd0 73 65 72 74 28 20 69 3e 3d 30 20 29 3b 0a 20 20  sert( i>=0 );.  
12fe0 20 20 69 66 28 20 6e 65 67 46 6c 61 67 20 29 20    if( negFlag ) 
12ff0 69 20 3d 20 2d 69 3b 0a 20 20 20 20 73 71 6c 69  i = -i;.    sqli
13000 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
13010 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69 2c 20   OP_Integer, i, 
13020 69 4d 65 6d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  iMem);.  }else{.
13030 20 20 20 20 69 6e 74 20 63 3b 0a 20 20 20 20 69      int c;.    i
13040 36 34 20 76 61 6c 75 65 3b 0a 20 20 20 20 63 6f  64 value;.    co
13050 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 70 45  nst char *z = pE
13060 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20  xpr->u.zToken;. 
13070 20 20 20 61 73 73 65 72 74 28 20 7a 21 3d 30 20     assert( z!=0 
13080 29 3b 0a 20 20 20 20 63 20 3d 20 73 71 6c 69 74  );.    c = sqlit
13090 65 33 44 65 63 4f 72 48 65 78 54 6f 49 36 34 28  e3DecOrHexToI64(
130a0 7a 2c 20 26 76 61 6c 75 65 29 3b 0a 20 20 20 20  z, &value);.    
130b0 69 66 28 20 63 3d 3d 30 20 7c 7c 20 28 63 3d 3d  if( c==0 || (c==
130c0 32 20 26 26 20 6e 65 67 46 6c 61 67 29 20 29 7b  2 && negFlag) ){
130d0 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 56 3b  .      char *zV;
130e0 0a 20 20 20 20 20 20 69 66 28 20 6e 65 67 46 6c  .      if( negFl
130f0 61 67 20 29 7b 20 76 61 6c 75 65 20 3d 20 63 3d  ag ){ value = c=
13100 3d 32 20 3f 20 53 4d 41 4c 4c 45 53 54 5f 49 4e  =2 ? SMALLEST_IN
13110 54 36 34 20 3a 20 2d 76 61 6c 75 65 3b 20 7d 0a  T64 : -value; }.
13120 20 20 20 20 20 20 7a 56 20 3d 20 64 75 70 38 62        zV = dup8b
13130 79 74 65 73 28 76 2c 20 28 63 68 61 72 2a 29 26  ytes(v, (char*)&
13140 76 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 73 71  value);.      sq
13150 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
13160 76 2c 20 4f 50 5f 49 6e 74 36 34 2c 20 30 2c 20  v, OP_Int64, 0, 
13170 69 4d 65 6d 2c 20 30 2c 20 7a 56 2c 20 50 34 5f  iMem, 0, zV, P4_
13180 49 4e 54 36 34 29 3b 0a 20 20 20 20 7d 65 6c 73  INT64);.    }els
13190 65 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  e{.#ifdef SQLITE
131a0 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50  _OMIT_FLOATING_P
131b0 4f 49 4e 54 0a 20 20 20 20 20 20 73 71 6c 69 74  OINT.      sqlit
131c0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
131d0 65 2c 20 22 6f 76 65 72 73 69 7a 65 64 20 69 6e  e, "oversized in
131e0 74 65 67 65 72 3a 20 25 73 25 73 22 2c 20 6e 65  teger: %s%s", ne
131f0 67 46 6c 61 67 20 3f 20 22 2d 22 20 3a 20 22 22  gFlag ? "-" : ""
13200 2c 20 7a 29 3b 0a 23 65 6c 73 65 0a 23 69 66 6e  , z);.#else.#ifn
13210 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
13220 48 45 58 5f 49 4e 54 45 47 45 52 0a 20 20 20 20  HEX_INTEGER.    
13230 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74    if( sqlite3_st
13240 72 6e 69 63 6d 70 28 7a 2c 22 30 78 22 2c 32 29  rnicmp(z,"0x",2)
13250 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
13260 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
13270 50 61 72 73 65 2c 20 22 68 65 78 20 6c 69 74 65  Parse, "hex lite
13280 72 61 6c 20 74 6f 6f 20 62 69 67 3a 20 25 73 22  ral too big: %s"
13290 2c 20 7a 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  , z);.      }els
132a0 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7b  e.#endif.      {
132b0 0a 20 20 20 20 20 20 20 20 63 6f 64 65 52 65 61  .        codeRea
132c0 6c 28 76 2c 20 7a 2c 20 6e 65 67 46 6c 61 67 2c  l(v, z, negFlag,
132d0 20 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20 7d 0a   iMem);.      }.
132e0 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d  #endif.    }.  }
132f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20  .}../*.** Clear 
13300 61 20 63 61 63 68 65 20 65 6e 74 72 79 2e 0a 2a  a cache entry..*
13310 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 61  /.static void ca
13320 63 68 65 45 6e 74 72 79 43 6c 65 61 72 28 50 61  cheEntryClear(Pa
13330 72 73 65 20 2a 70 50 61 72 73 65 2c 20 73 74 72  rse *pParse, str
13340 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70  uct yColCache *p
13350 29 7b 0a 20 20 69 66 28 20 70 2d 3e 74 65 6d 70  ){.  if( p->temp
13360 52 65 67 20 29 7b 0a 20 20 20 20 69 66 28 20 70  Reg ){.    if( p
13370 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 3c  Parse->nTempReg<
13380 41 72 72 61 79 53 69 7a 65 28 70 50 61 72 73 65  ArraySize(pParse
13390 2d 3e 61 54 65 6d 70 52 65 67 29 20 29 7b 0a 20  ->aTempReg) ){. 
133a0 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61 54 65       pParse->aTe
133b0 6d 70 52 65 67 5b 70 50 61 72 73 65 2d 3e 6e 54  mpReg[pParse->nT
133c0 65 6d 70 52 65 67 2b 2b 5d 20 3d 20 70 2d 3e 69  empReg++] = p->i
133d0 52 65 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  Reg;.    }.    p
133e0 2d 3e 74 65 6d 70 52 65 67 20 3d 20 30 3b 0a 20  ->tempReg = 0;. 
133f0 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 63   }.}.../*.** Rec
13400 6f 72 64 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d  ord in the colum
13410 6e 20 63 61 63 68 65 20 74 68 61 74 20 61 20 70  n cache that a p
13420 61 72 74 69 63 75 6c 61 72 20 63 6f 6c 75 6d 6e  articular column
13430 20 66 72 6f 6d 20 61 0a 2a 2a 20 70 61 72 74 69   from a.** parti
13440 63 75 6c 61 72 20 74 61 62 6c 65 20 69 73 20 73  cular table is s
13450 74 6f 72 65 64 20 69 6e 20 61 20 70 61 72 74 69  tored in a parti
13460 63 75 6c 61 72 20 72 65 67 69 73 74 65 72 2e 0a  cular register..
13470 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
13480 78 70 72 43 61 63 68 65 53 74 6f 72 65 28 50 61  xprCacheStore(Pa
13490 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
134a0 20 69 54 61 62 2c 20 69 6e 74 20 69 43 6f 6c 2c   iTab, int iCol,
134b0 20 69 6e 74 20 69 52 65 67 29 7b 0a 20 20 69 6e   int iReg){.  in
134c0 74 20 69 3b 0a 20 20 69 6e 74 20 6d 69 6e 4c 72  t i;.  int minLr
134d0 75 3b 0a 20 20 69 6e 74 20 69 64 78 4c 72 75 3b  u;.  int idxLru;
134e0 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61  .  struct yColCa
134f0 63 68 65 20 2a 70 3b 0a 0a 20 20 61 73 73 65 72  che *p;..  asser
13500 74 28 20 69 52 65 67 3e 30 20 29 3b 20 20 2f 2a  t( iReg>0 );  /*
13510 20 52 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72   Register number
13520 73 20 61 72 65 20 61 6c 77 61 79 73 20 70 6f 73  s are always pos
13530 69 74 69 76 65 20 2a 2f 0a 20 20 61 73 73 65 72  itive */.  asser
13540 74 28 20 69 43 6f 6c 3e 3d 2d 31 20 26 26 20 69  t( iCol>=-1 && i
13550 43 6f 6c 3c 33 32 37 36 38 20 29 3b 20 20 2f 2a  Col<32768 );  /*
13560 20 46 69 6e 69 74 65 20 63 6f 6c 75 6d 6e 20 6e   Finite column n
13570 75 6d 62 65 72 73 20 2a 2f 0a 0a 20 20 2f 2a 20  umbers */..  /* 
13580 54 68 65 20 53 51 4c 49 54 45 5f 43 6f 6c 75 6d  The SQLITE_Colum
13590 6e 43 61 63 68 65 20 66 6c 61 67 20 64 69 73 61  nCache flag disa
135a0 62 6c 65 73 20 74 68 65 20 63 6f 6c 75 6d 6e 20  bles the column 
135b0 63 61 63 68 65 2e 20 20 54 68 69 73 20 69 73 20  cache.  This is 
135c0 75 73 65 64 0a 20 20 2a 2a 20 66 6f 72 20 74 65  used.  ** for te
135d0 73 74 69 6e 67 20 6f 6e 6c 79 20 2d 20 74 6f 20  sting only - to 
135e0 76 65 72 69 66 79 20 74 68 61 74 20 53 51 4c 69  verify that SQLi
135f0 74 65 20 61 6c 77 61 79 73 20 67 65 74 73 20 74  te always gets t
13600 68 65 20 73 61 6d 65 20 61 6e 73 77 65 72 0a 20  he same answer. 
13610 20 2a 2a 20 77 69 74 68 20 61 6e 64 20 77 69 74   ** with and wit
13620 68 6f 75 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20  hout the column 
13630 63 61 63 68 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  cache..  */.  if
13640 28 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 44 69  ( OptimizationDi
13650 73 61 62 6c 65 64 28 70 50 61 72 73 65 2d 3e 64  sabled(pParse->d
13660 62 2c 20 53 51 4c 49 54 45 5f 43 6f 6c 75 6d 6e  b, SQLITE_Column
13670 43 61 63 68 65 29 20 29 20 72 65 74 75 72 6e 3b  Cache) ) return;
13680 0a 0a 20 20 2f 2a 20 46 69 72 73 74 20 72 65 70  ..  /* First rep
13690 6c 61 63 65 20 61 6e 79 20 65 78 69 73 74 69 6e  lace any existin
136a0 67 20 65 6e 74 72 79 2e 0a 20 20 2a 2a 0a 20 20  g entry..  **.  
136b0 2a 2a 20 41 63 74 75 61 6c 6c 79 2c 20 74 68 65  ** Actually, the
136c0 20 77 61 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20   way the column 
136d0 63 61 63 68 65 20 69 73 20 63 75 72 72 65 6e 74  cache is current
136e0 6c 79 20 75 73 65 64 2c 20 77 65 20 61 72 65 20  ly used, we are 
136f0 67 75 61 72 61 6e 74 65 65 64 0a 20 20 2a 2a 20  guaranteed.  ** 
13700 74 68 61 74 20 74 68 65 20 6f 62 6a 65 63 74 20  that the object 
13710 77 69 6c 6c 20 6e 65 76 65 72 20 61 6c 72 65 61  will never alrea
13720 64 79 20 62 65 20 69 6e 20 63 61 63 68 65 2e 20  dy be in cache. 
13730 20 56 65 72 69 66 79 20 74 68 69 73 20 67 75 61   Verify this gua
13740 72 61 6e 74 65 65 2e 0a 20 20 2a 2f 0a 23 69 66  rantee..  */.#if
13750 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 66 6f  ndef NDEBUG.  fo
13760 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d  r(i=0, p=pParse-
13770 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51  >aColCache; i<SQ
13780 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b  LITE_N_COLCACHE;
13790 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20   i++, p++){.    
137a0 61 73 73 65 72 74 28 20 70 2d 3e 69 52 65 67 3d  assert( p->iReg=
137b0 3d 30 20 7c 7c 20 70 2d 3e 69 54 61 62 6c 65 21  =0 || p->iTable!
137c0 3d 69 54 61 62 20 7c 7c 20 70 2d 3e 69 43 6f 6c  =iTab || p->iCol
137d0 75 6d 6e 21 3d 69 43 6f 6c 20 29 3b 0a 20 20 7d  umn!=iCol );.  }
137e0 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 46 69  .#endif..  /* Fi
137f0 6e 64 20 61 6e 20 65 6d 70 74 79 20 73 6c 6f 74  nd an empty slot
13800 20 61 6e 64 20 72 65 70 6c 61 63 65 20 69 74 20   and replace it 
13810 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d  */.  for(i=0, p=
13820 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68  pParse->aColCach
13830 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f  e; i<SQLITE_N_CO
13840 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b  LCACHE; i++, p++
13850 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 52  ){.    if( p->iR
13860 65 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  eg==0 ){.      p
13870 2d 3e 69 4c 65 76 65 6c 20 3d 20 70 50 61 72 73  ->iLevel = pPars
13880 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 3b 0a  e->iCacheLevel;.
13890 20 20 20 20 20 20 70 2d 3e 69 54 61 62 6c 65 20        p->iTable 
138a0 3d 20 69 54 61 62 3b 0a 20 20 20 20 20 20 70 2d  = iTab;.      p-
138b0 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69 43 6f 6c 3b  >iColumn = iCol;
138c0 0a 20 20 20 20 20 20 70 2d 3e 69 52 65 67 20 3d  .      p->iReg =
138d0 20 69 52 65 67 3b 0a 20 20 20 20 20 20 70 2d 3e   iReg;.      p->
138e0 74 65 6d 70 52 65 67 20 3d 20 30 3b 0a 20 20 20  tempReg = 0;.   
138f0 20 20 20 70 2d 3e 6c 72 75 20 3d 20 70 50 61 72     p->lru = pPar
13900 73 65 2d 3e 69 43 61 63 68 65 43 6e 74 2b 2b 3b  se->iCacheCnt++;
13910 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
13920 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52     }.  }..  /* R
13930 65 70 6c 61 63 65 20 74 68 65 20 6c 61 73 74 20  eplace the last 
13940 72 65 63 65 6e 74 6c 79 20 75 73 65 64 20 2a 2f  recently used */
13950 0a 20 20 6d 69 6e 4c 72 75 20 3d 20 30 78 37 66  .  minLru = 0x7f
13960 66 66 66 66 66 66 3b 0a 20 20 69 64 78 4c 72 75  ffffff;.  idxLru
13970 20 3d 20 2d 31 3b 0a 20 20 66 6f 72 28 69 3d 30   = -1;.  for(i=0
13980 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c  , p=pParse->aCol
13990 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f  Cache; i<SQLITE_
139a0 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c  N_COLCACHE; i++,
139b0 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70   p++){.    if( p
139c0 2d 3e 6c 72 75 3c 6d 69 6e 4c 72 75 20 29 7b 0a  ->lru<minLru ){.
139d0 20 20 20 20 20 20 69 64 78 4c 72 75 20 3d 20 69        idxLru = i
139e0 3b 0a 20 20 20 20 20 20 6d 69 6e 4c 72 75 20 3d  ;.      minLru =
139f0 20 70 2d 3e 6c 72 75 3b 0a 20 20 20 20 7d 0a 20   p->lru;.    }. 
13a00 20 7d 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28   }.  if( ALWAYS(
13a10 69 64 78 4c 72 75 3e 3d 30 29 20 29 7b 0a 20 20  idxLru>=0) ){.  
13a20 20 20 70 20 3d 20 26 70 50 61 72 73 65 2d 3e 61    p = &pParse->a
13a30 43 6f 6c 43 61 63 68 65 5b 69 64 78 4c 72 75 5d  ColCache[idxLru]
13a40 3b 0a 20 20 20 20 70 2d 3e 69 4c 65 76 65 6c 20  ;.    p->iLevel 
13a50 3d 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65  = pParse->iCache
13a60 4c 65 76 65 6c 3b 0a 20 20 20 20 70 2d 3e 69 54  Level;.    p->iT
13a70 61 62 6c 65 20 3d 20 69 54 61 62 3b 0a 20 20 20  able = iTab;.   
13a80 20 70 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69 43   p->iColumn = iC
13a90 6f 6c 3b 0a 20 20 20 20 70 2d 3e 69 52 65 67 20  ol;.    p->iReg 
13aa0 3d 20 69 52 65 67 3b 0a 20 20 20 20 70 2d 3e 74  = iReg;.    p->t
13ab0 65 6d 70 52 65 67 20 3d 20 30 3b 0a 20 20 20 20  empReg = 0;.    
13ac0 70 2d 3e 6c 72 75 20 3d 20 70 50 61 72 73 65 2d  p->lru = pParse-
13ad0 3e 69 43 61 63 68 65 43 6e 74 2b 2b 3b 0a 20 20  >iCacheCnt++;.  
13ae0 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 7d 0a    return;.  }.}.
13af0 0a 2f 2a 0a 2a 2a 20 49 6e 64 69 63 61 74 65 20  ./*.** Indicate 
13b00 74 68 61 74 20 72 65 67 69 73 74 65 72 73 20 62  that registers b
13b10 65 74 77 65 65 6e 20 69 52 65 67 2e 2e 69 52 65  etween iReg..iRe
13b20 67 2b 6e 52 65 67 2d 31 20 61 72 65 20 62 65 69  g+nReg-1 are bei
13b30 6e 67 20 6f 76 65 72 77 72 69 74 74 65 6e 2e 0a  ng overwritten..
13b40 2a 2a 20 50 75 72 67 65 20 74 68 65 20 72 61 6e  ** Purge the ran
13b50 67 65 20 6f 66 20 72 65 67 69 73 74 65 72 73 20  ge of registers 
13b60 66 72 6f 6d 20 74 68 65 20 63 6f 6c 75 6d 6e 20  from the column 
13b70 63 61 63 68 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73  cache..*/.void s
13b80 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 52  qlite3ExprCacheR
13b90 65 6d 6f 76 65 28 50 61 72 73 65 20 2a 70 50 61  emove(Parse *pPa
13ba0 72 73 65 2c 20 69 6e 74 20 69 52 65 67 2c 20 69  rse, int iReg, i
13bb0 6e 74 20 6e 52 65 67 29 7b 0a 20 20 69 6e 74 20  nt nReg){.  int 
13bc0 69 3b 0a 20 20 69 6e 74 20 69 4c 61 73 74 20 3d  i;.  int iLast =
13bd0 20 69 52 65 67 20 2b 20 6e 52 65 67 20 2d 20 31   iReg + nReg - 1
13be0 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43  ;.  struct yColC
13bf0 61 63 68 65 20 2a 70 3b 0a 20 20 66 6f 72 28 69  ache *p;.  for(i
13c00 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43  =0, p=pParse->aC
13c10 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54  olCache; i<SQLIT
13c20 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b  E_N_COLCACHE; i+
13c30 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  +, p++){.    int
13c40 20 72 20 3d 20 70 2d 3e 69 52 65 67 3b 0a 20 20   r = p->iReg;.  
13c50 20 20 69 66 28 20 72 3e 3d 69 52 65 67 20 26 26    if( r>=iReg &&
13c60 20 72 3c 3d 69 4c 61 73 74 20 29 7b 0a 20 20 20   r<=iLast ){.   
13c70 20 20 20 63 61 63 68 65 45 6e 74 72 79 43 6c 65     cacheEntryCle
13c80 61 72 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20  ar(pParse, p);. 
13c90 20 20 20 20 20 70 2d 3e 69 52 65 67 20 3d 20 30       p->iReg = 0
13ca0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
13cb0 2a 0a 2a 2a 20 52 65 6d 65 6d 62 65 72 20 74 68  *.** Remember th
13cc0 65 20 63 75 72 72 65 6e 74 20 63 6f 6c 75 6d 6e  e current column
13cd0 20 63 61 63 68 65 20 63 6f 6e 74 65 78 74 2e 20   cache context. 
13ce0 20 41 6e 79 20 6e 65 77 20 65 6e 74 72 69 65 73   Any new entries
13cf0 20 61 64 64 65 64 0a 2a 2a 20 61 64 64 65 64 20   added.** added 
13d00 74 6f 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61  to the column ca
13d10 63 68 65 20 61 66 74 65 72 20 74 68 69 73 20 63  che after this c
13d20 61 6c 6c 20 61 72 65 20 72 65 6d 6f 76 65 64 20  all are removed 
13d30 77 68 65 6e 20 74 68 65 0a 2a 2a 20 63 6f 72 72  when the.** corr
13d40 65 73 70 6f 6e 64 69 6e 67 20 70 6f 70 20 6f 63  esponding pop oc
13d50 63 75 72 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  curs..*/.void sq
13d60 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75  lite3ExprCachePu
13d70 73 68 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  sh(Parse *pParse
13d80 29 7b 0a 20 20 70 50 61 72 73 65 2d 3e 69 43 61  ){.  pParse->iCa
13d90 63 68 65 4c 65 76 65 6c 2b 2b 3b 0a 23 69 66 64  cheLevel++;.#ifd
13da0 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
13db0 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62    if( pParse->db
13dc0 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
13dd0 5f 56 64 62 65 41 64 64 6f 70 54 72 61 63 65 20  _VdbeAddopTrace 
13de0 29 7b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 50  ){.    printf("P
13df0 55 53 48 20 74 6f 20 25 64 5c 6e 22 2c 20 70 50  USH to %d\n", pP
13e00 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65  arse->iCacheLeve
13e10 6c 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d  l);.  }.#endif.}
13e20 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 66  ../*.** Remove f
13e30 72 6f 6d 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63  rom the column c
13e40 61 63 68 65 20 61 6e 79 20 65 6e 74 72 69 65 73  ache any entries
13e50 20 74 68 61 74 20 77 65 72 65 20 61 64 64 65 64   that were added
13e60 20 73 69 6e 63 65 20 74 68 65 0a 2a 2a 20 74 68   since the.** th
13e70 65 20 70 72 65 76 69 6f 75 73 20 73 71 6c 69 74  e previous sqlit
13e80 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68 20  e3ExprCachePush 
13e90 6f 70 65 72 61 74 69 6f 6e 2e 20 20 49 6e 20 6f  operation.  In o
13ea0 74 68 65 72 20 77 6f 72 64 73 2c 20 72 65 73 74  ther words, rest
13eb0 6f 72 65 0a 2a 2a 20 74 68 65 20 63 61 63 68 65  ore.** the cache
13ec0 20 74 6f 20 74 68 65 20 73 74 61 74 65 20 69 74   to the state it
13ed0 20 77 61 73 20 69 6e 20 70 72 69 6f 72 20 74 68   was in prior th
13ee0 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 50 75  e most recent Pu
13ef0 73 68 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  sh..*/.void sqli
13f00 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28  te3ExprCachePop(
13f10 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
13f20 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63    int i;.  struc
13f30 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a  t yColCache *p;.
13f40 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
13f50 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 3e 3d 31  ->iCacheLevel>=1
13f60 20 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 69 43   );.  pParse->iC
13f70 61 63 68 65 4c 65 76 65 6c 2d 2d 3b 0a 23 69 66  acheLevel--;.#if
13f80 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
13f90 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64  .  if( pParse->d
13fa0 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
13fb0 45 5f 56 64 62 65 41 64 64 6f 70 54 72 61 63 65  E_VdbeAddopTrace
13fc0 20 29 7b 0a 20 20 20 20 70 72 69 6e 74 66 28 22   ){.    printf("
13fd0 50 4f 50 20 20 74 6f 20 25 64 5c 6e 22 2c 20 70  POP  to %d\n", p
13fe0 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76  Parse->iCacheLev
13ff0 65 6c 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  el);.  }.#endif.
14000 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61    for(i=0, p=pPa
14010 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20  rse->aColCache; 
14020 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41  i<SQLITE_N_COLCA
14030 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a  CHE; i++, p++){.
14040 20 20 20 20 69 66 28 20 70 2d 3e 69 52 65 67 20      if( p->iReg 
14050 26 26 20 70 2d 3e 69 4c 65 76 65 6c 3e 70 50 61  && p->iLevel>pPa
14060 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c  rse->iCacheLevel
14070 20 29 7b 0a 20 20 20 20 20 20 63 61 63 68 65 45   ){.      cacheE
14080 6e 74 72 79 43 6c 65 61 72 28 70 50 61 72 73 65  ntryClear(pParse
14090 2c 20 70 29 3b 0a 20 20 20 20 20 20 70 2d 3e 69  , p);.      p->i
140a0 52 65 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  Reg = 0;.    }. 
140b0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e   }.}../*.** When
140c0 20 61 20 63 61 63 68 65 64 20 63 6f 6c 75 6d 6e   a cached column
140d0 20 69 73 20 72 65 75 73 65 64 2c 20 6d 61 6b 65   is reused, make
140e0 20 73 75 72 65 20 74 68 61 74 20 69 74 73 20 72   sure that its r
140f0 65 67 69 73 74 65 72 20 69 73 0a 2a 2a 20 6e 6f  egister is.** no
14100 20 6c 6f 6e 67 65 72 20 61 76 61 69 6c 61 62 6c   longer availabl
14110 65 20 61 73 20 61 20 74 65 6d 70 20 72 65 67 69  e as a temp regi
14120 73 74 65 72 2e 20 20 74 69 63 6b 65 74 20 23 33  ster.  ticket #3
14130 38 37 39 3a 20 20 74 68 61 74 20 73 61 6d 65 0a  879:  that same.
14140 2a 2a 20 72 65 67 69 73 74 65 72 20 6d 69 67 68  ** register migh
14150 74 20 62 65 20 69 6e 20 74 68 65 20 63 61 63 68  t be in the cach
14160 65 20 69 6e 20 6d 75 6c 74 69 70 6c 65 20 70 6c  e in multiple pl
14170 61 63 65 73 2c 20 73 6f 20 62 65 20 73 75 72 65  aces, so be sure
14180 20 74 6f 0a 2a 2a 20 67 65 74 20 74 68 65 6d 20   to.** get them 
14190 61 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  all..*/.static v
141a0 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43  oid sqlite3ExprC
141b0 61 63 68 65 50 69 6e 52 65 67 69 73 74 65 72 28  achePinRegister(
141c0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
141d0 6e 74 20 69 52 65 67 29 7b 0a 20 20 69 6e 74 20  nt iReg){.  int 
141e0 69 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c  i;.  struct yCol
141f0 43 61 63 68 65 20 2a 70 3b 0a 20 20 66 6f 72 28  Cache *p;.  for(
14200 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61  i=0, p=pParse->a
14210 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49  ColCache; i<SQLI
14220 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69  TE_N_COLCACHE; i
14230 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66  ++, p++){.    if
14240 28 20 70 2d 3e 69 52 65 67 3d 3d 69 52 65 67 20  ( p->iReg==iReg 
14250 29 7b 0a 20 20 20 20 20 20 70 2d 3e 74 65 6d 70  ){.      p->temp
14260 52 65 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  Reg = 0;.    }. 
14270 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65   }.}../*.** Gene
14280 72 61 74 65 20 63 6f 64 65 20 74 6f 20 65 78 74  rate code to ext
14290 72 61 63 74 20 74 68 65 20 76 61 6c 75 65 20 6f  ract the value o
142a0 66 20 74 68 65 20 69 43 6f 6c 2d 74 68 20 63 6f  f the iCol-th co
142b0 6c 75 6d 6e 20 6f 66 20 61 20 74 61 62 6c 65 2e  lumn of a table.
142c0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
142d0 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d  ExprCodeGetColum
142e0 6e 4f 66 54 61 62 6c 65 28 0a 20 20 56 64 62 65  nOfTable(.  Vdbe
142f0 20 2a 76 2c 20 20 20 20 20 20 20 20 2f 2a 20 54   *v,        /* T
14300 68 65 20 56 44 42 45 20 75 6e 64 65 72 20 63 6f  he VDBE under co
14310 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20  nstruction */.  
14320 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20  Table *pTab,    
14330 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 63 6f 6e  /* The table con
14340 74 61 69 6e 69 6e 67 20 74 68 65 20 76 61 6c 75  taining the valu
14350 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 43  e */.  int iTabC
14360 75 72 2c 20 20 20 20 2f 2a 20 54 68 65 20 74 61  ur,    /* The ta
14370 62 6c 65 20 63 75 72 73 6f 72 2e 20 20 4f 72 20  ble cursor.  Or 
14380 74 68 65 20 50 4b 20 63 75 72 73 6f 72 20 66 6f  the PK cursor fo
14390 72 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20  r WITHOUT ROWID 
143a0 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 20 20  */.  int iCol,  
143b0 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
143c0 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74 6f 20 65   the column to e
143d0 78 74 72 61 63 74 20 2a 2f 0a 20 20 69 6e 74 20  xtract */.  int 
143e0 72 65 67 4f 75 74 20 20 20 20 20 20 2f 2a 20 45  regOut      /* E
143f0 78 74 72 61 63 74 20 74 68 65 20 76 61 6c 75 65  xtract the value
14400 20 69 6e 74 6f 20 74 68 69 73 20 72 65 67 69 73   into this regis
14410 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  ter */.){.  if( 
14420 69 43 6f 6c 3c 30 20 7c 7c 20 69 43 6f 6c 3d 3d  iCol<0 || iCol==
14430 70 54 61 62 2d 3e 69 50 4b 65 79 20 29 7b 0a 20  pTab->iPKey ){. 
14440 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
14450 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 69 64  dOp2(v, OP_Rowid
14460 2c 20 69 54 61 62 43 75 72 2c 20 72 65 67 4f 75  , iTabCur, regOu
14470 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  t);.  }else{.   
14480 20 69 6e 74 20 6f 70 20 3d 20 49 73 56 69 72 74   int op = IsVirt
14490 75 61 6c 28 70 54 61 62 29 20 3f 20 4f 50 5f 56  ual(pTab) ? OP_V
144a0 43 6f 6c 75 6d 6e 20 3a 20 4f 50 5f 43 6f 6c 75  Column : OP_Colu
144b0 6d 6e 3b 0a 20 20 20 20 69 6e 74 20 78 20 3d 20  mn;.    int x = 
144c0 69 43 6f 6c 3b 0a 20 20 20 20 69 66 28 20 21 48  iCol;.    if( !H
144d0 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 29 7b  asRowid(pTab) ){
144e0 0a 20 20 20 20 20 20 78 20 3d 20 73 71 6c 69 74  .      x = sqlit
144f0 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78 28  e3ColumnOfIndex(
14500 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65  sqlite3PrimaryKe
14510 79 49 6e 64 65 78 28 70 54 61 62 29 2c 20 69 43  yIndex(pTab), iC
14520 6f 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ol);.    }.    s
14530 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
14540 28 76 2c 20 6f 70 2c 20 69 54 61 62 43 75 72 2c  (v, op, iTabCur,
14550 20 78 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20 7d   x, regOut);.  }
14560 0a 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 29  .  if( iCol>=0 )
14570 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6c  {.    sqlite3Col
14580 75 6d 6e 44 65 66 61 75 6c 74 28 76 2c 20 70 54  umnDefault(v, pT
14590 61 62 2c 20 69 43 6f 6c 2c 20 72 65 67 4f 75 74  ab, iCol, regOut
145a0 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
145b0 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
145c0 61 74 20 77 69 6c 6c 20 65 78 74 72 61 63 74 20  at will extract 
145d0 74 68 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 20 63  the iColumn-th c
145e0 6f 6c 75 6d 6e 20 66 72 6f 6d 0a 2a 2a 20 74 61  olumn from.** ta
145f0 62 6c 65 20 70 54 61 62 20 61 6e 64 20 73 74 6f  ble pTab and sto
14600 72 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 76 61  re the column va
14610 6c 75 65 20 69 6e 20 61 20 72 65 67 69 73 74 65  lue in a registe
14620 72 2e 20 20 41 6e 20 65 66 66 6f 72 74 0a 2a 2a  r.  An effort.**
14630 20 69 73 20 6d 61 64 65 20 74 6f 20 73 74 6f 72   is made to stor
14640 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 76 61 6c  e the column val
14650 75 65 20 69 6e 20 72 65 67 69 73 74 65 72 20 69  ue in register i
14660 52 65 67 2c 20 62 75 74 20 74 68 69 73 20 69 73  Reg, but this is
14670 0a 2a 2a 20 6e 6f 74 20 67 75 61 72 61 6e 74 65  .** not guarante
14680 65 64 2e 20 20 54 68 65 20 6c 6f 63 61 74 69 6f  ed.  The locatio
14690 6e 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20  n of the column 
146a0 76 61 6c 75 65 20 69 73 20 72 65 74 75 72 6e 65  value is returne
146b0 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 6d  d..**.** There m
146c0 75 73 74 20 62 65 20 61 6e 20 6f 70 65 6e 20 63  ust be an open c
146d0 75 72 73 6f 72 20 74 6f 20 70 54 61 62 20 69 6e  ursor to pTab in
146e0 20 69 54 61 62 6c 65 20 77 68 65 6e 20 74 68 69   iTable when thi
146f0 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20  s routine.** is 
14700 63 61 6c 6c 65 64 2e 20 20 49 66 20 69 43 6f 6c  called.  If iCol
14710 75 6d 6e 3c 30 20 74 68 65 6e 20 63 6f 64 65 20  umn<0 then code 
14720 69 73 20 67 65 6e 65 72 61 74 65 64 20 74 68 61  is generated tha
14730 74 20 65 78 74 72 61 63 74 73 20 74 68 65 20 72  t extracts the r
14740 6f 77 69 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  owid..*/.int sql
14750 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43  ite3ExprCodeGetC
14760 6f 6c 75 6d 6e 28 0a 20 20 50 61 72 73 65 20 2a  olumn(.  Parse *
14770 70 50 61 72 73 65 2c 20 20 20 2f 2a 20 50 61 72  pParse,   /* Par
14780 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65  sing and code ge
14790 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74  nerating context
147a0 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   */.  Table *pTa
147b0 62 2c 20 20 20 20 20 2f 2a 20 44 65 73 63 72 69  b,     /* Descri
147c0 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 74 61 62  ption of the tab
147d0 6c 65 20 77 65 20 61 72 65 20 72 65 61 64 69 6e  le we are readin
147e0 67 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20  g from */.  int 
147f0 69 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 2f 2a 20  iColumn,     /* 
14800 49 6e 64 65 78 20 6f 66 20 74 68 65 20 74 61 62  Index of the tab
14810 6c 65 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 69  le column */.  i
14820 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20  nt iTable,      
14830 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 70 6f  /* The cursor po
14840 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 74 61  inting to the ta
14850 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65  ble */.  int iRe
14860 67 2c 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f  g,        /* Sto
14870 72 65 20 72 65 73 75 6c 74 73 20 68 65 72 65 20  re results here 
14880 2a 2f 0a 20 20 75 38 20 70 35 20 20 20 20 20 20  */.  u8 p5      
14890 20 20 20 20 20 20 2f 2a 20 50 35 20 76 61 6c 75        /* P5 valu
148a0 65 20 66 6f 72 20 4f 50 5f 43 6f 6c 75 6d 6e 20  e for OP_Column 
148b0 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  */.){.  Vdbe *v 
148c0 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
148d0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75  .  int i;.  stru
148e0 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b  ct yColCache *p;
148f0 0a 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70  ..  for(i=0, p=p
14900 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65  Parse->aColCache
14910 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c  ; i<SQLITE_N_COL
14920 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29  CACHE; i++, p++)
14930 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 52 65  {.    if( p->iRe
14940 67 3e 30 20 26 26 20 70 2d 3e 69 54 61 62 6c 65  g>0 && p->iTable
14950 3d 3d 69 54 61 62 6c 65 20 26 26 20 70 2d 3e 69  ==iTable && p->i
14960 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e 20  Column==iColumn 
14970 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6c 72 75 20  ){.      p->lru 
14980 3d 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65  = pParse->iCache
14990 43 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c  Cnt++;.      sql
149a0 69 74 65 33 45 78 70 72 43 61 63 68 65 50 69 6e  ite3ExprCachePin
149b0 52 65 67 69 73 74 65 72 28 70 50 61 72 73 65 2c  Register(pParse,
149c0 20 70 2d 3e 69 52 65 67 29 3b 0a 20 20 20 20 20   p->iReg);.     
149d0 20 72 65 74 75 72 6e 20 70 2d 3e 69 52 65 67 3b   return p->iReg;
149e0 0a 20 20 20 20 7d 0a 20 20 7d 20 20 0a 20 20 61  .    }.  }  .  a
149f0 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20  ssert( v!=0 );. 
14a00 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
14a10 47 65 74 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65  GetColumnOfTable
14a20 28 76 2c 20 70 54 61 62 2c 20 69 54 61 62 6c 65  (v, pTab, iTable
14a30 2c 20 69 43 6f 6c 75 6d 6e 2c 20 69 52 65 67 29  , iColumn, iReg)
14a40 3b 0a 20 20 69 66 28 20 70 35 20 29 7b 0a 20 20  ;.  if( p5 ){.  
14a50 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
14a60 6e 67 65 50 35 28 76 2c 20 70 35 29 3b 0a 20 20  ngeP5(v, p5);.  
14a70 7d 65 6c 73 65 7b 20 20 20 0a 20 20 20 20 73 71  }else{   .    sq
14a80 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 53 74  lite3ExprCacheSt
14a90 6f 72 65 28 70 50 61 72 73 65 2c 20 69 54 61 62  ore(pParse, iTab
14aa0 6c 65 2c 20 69 43 6f 6c 75 6d 6e 2c 20 69 52 65  le, iColumn, iRe
14ab0 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  g);.  }.  return
14ac0 20 69 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   iReg;.}../*.** 
14ad0 43 6c 65 61 72 20 61 6c 6c 20 63 6f 6c 75 6d 6e  Clear all column
14ae0 20 63 61 63 68 65 20 65 6e 74 72 69 65 73 2e 0a   cache entries..
14af0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
14b00 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 50 61  xprCacheClear(Pa
14b10 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
14b20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
14b30 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 0a 23  yColCache *p;..#
14b40 69 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  if SQLITE_DEBUG.
14b50 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62    if( pParse->db
14b60 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
14b70 5f 56 64 62 65 41 64 64 6f 70 54 72 61 63 65 20  _VdbeAddopTrace 
14b80 29 7b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 43  ){.    printf("C
14b90 4c 45 41 52 5c 6e 22 29 3b 0a 20 20 7d 0a 23 65  LEAR\n");.  }.#e
14ba0 6e 64 69 66 0a 20 20 66 6f 72 28 69 3d 30 2c 20  ndif.  for(i=0, 
14bb0 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61  p=pParse->aColCa
14bc0 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f  che; i<SQLITE_N_
14bd0 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70  COLCACHE; i++, p
14be0 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  ++){.    if( p->
14bf0 69 52 65 67 20 29 7b 0a 20 20 20 20 20 20 63 61  iReg ){.      ca
14c00 63 68 65 45 6e 74 72 79 43 6c 65 61 72 28 70 50  cheEntryClear(pP
14c10 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 20 20  arse, p);.      
14c20 70 2d 3e 69 52 65 67 20 3d 20 30 3b 0a 20 20 20  p->iReg = 0;.   
14c30 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
14c40 52 65 63 6f 72 64 20 74 68 65 20 66 61 63 74 20  Record the fact 
14c50 74 68 61 74 20 61 6e 20 61 66 66 69 6e 69 74 79  that an affinity
14c60 20 63 68 61 6e 67 65 20 68 61 73 20 6f 63 63 75   change has occu
14c70 72 72 65 64 20 6f 6e 20 69 43 6f 75 6e 74 0a 2a  rred on iCount.*
14c80 2a 20 72 65 67 69 73 74 65 72 73 20 73 74 61 72  * registers star
14c90 74 69 6e 67 20 77 69 74 68 20 69 53 74 61 72 74  ting with iStart
14ca0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
14cb0 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69  3ExprCacheAffini
14cc0 74 79 43 68 61 6e 67 65 28 50 61 72 73 65 20 2a  tyChange(Parse *
14cd0 70 50 61 72 73 65 2c 20 69 6e 74 20 69 53 74 61  pParse, int iSta
14ce0 72 74 2c 20 69 6e 74 20 69 43 6f 75 6e 74 29 7b  rt, int iCount){
14cf0 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  .  sqlite3ExprCa
14d00 63 68 65 52 65 6d 6f 76 65 28 70 50 61 72 73 65  cheRemove(pParse
14d10 2c 20 69 53 74 61 72 74 2c 20 69 43 6f 75 6e 74  , iStart, iCount
14d20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  );.}../*.** Gene
14d30 72 61 74 65 20 63 6f 64 65 20 74 6f 20 6d 6f 76  rate code to mov
14d40 65 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 72  e content from r
14d50 65 67 69 73 74 65 72 73 20 69 46 72 6f 6d 2e 2e  egisters iFrom..
14d60 2e 69 46 72 6f 6d 2b 6e 52 65 67 2d 31 0a 2a 2a  .iFrom+nReg-1.**
14d70 20 6f 76 65 72 20 74 6f 20 69 54 6f 2e 2e 69 54   over to iTo..iT
14d80 6f 2b 6e 52 65 67 2d 31 2e 20 4b 65 65 70 20 74  o+nReg-1. Keep t
14d90 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20  he column cache 
14da0 75 70 2d 74 6f 2d 64 61 74 65 2e 0a 2a 2f 0a 76  up-to-date..*/.v
14db0 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43  oid sqlite3ExprC
14dc0 6f 64 65 4d 6f 76 65 28 50 61 72 73 65 20 2a 70  odeMove(Parse *p
14dd0 50 61 72 73 65 2c 20 69 6e 74 20 69 46 72 6f 6d  Parse, int iFrom
14de0 2c 20 69 6e 74 20 69 54 6f 2c 20 69 6e 74 20 6e  , int iTo, int n
14df0 52 65 67 29 7b 0a 20 20 61 73 73 65 72 74 28 20  Reg){.  assert( 
14e00 69 46 72 6f 6d 3e 3d 69 54 6f 2b 6e 52 65 67 20  iFrom>=iTo+nReg 
14e10 7c 7c 20 69 46 72 6f 6d 2b 6e 52 65 67 3c 3d 69  || iFrom+nReg<=i
14e20 54 6f 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  To );.  sqlite3V
14e30 64 62 65 41 64 64 4f 70 33 28 70 50 61 72 73 65  dbeAddOp3(pParse
14e40 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 4d 6f 76 65  ->pVdbe, OP_Move
14e50 2c 20 69 46 72 6f 6d 2c 20 69 54 6f 2c 20 6e 52  , iFrom, iTo, nR
14e60 65 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  eg);.  sqlite3Ex
14e70 70 72 43 61 63 68 65 52 65 6d 6f 76 65 28 70 50  prCacheRemove(pP
14e80 61 72 73 65 2c 20 69 46 72 6f 6d 2c 20 6e 52 65  arse, iFrom, nRe
14e90 67 29 3b 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e  g);.}..#if defin
14ea0 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29  ed(SQLITE_DEBUG)
14eb0 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49   || defined(SQLI
14ec0 54 45 5f 43 4f 56 45 52 41 47 45 5f 54 45 53 54  TE_COVERAGE_TEST
14ed0 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  )./*.** Return t
14ee0 72 75 65 20 69 66 20 61 6e 79 20 72 65 67 69 73  rue if any regis
14ef0 74 65 72 20 69 6e 20 74 68 65 20 72 61 6e 67 65  ter in the range
14f00 20 69 46 72 6f 6d 2e 2e 69 54 6f 20 28 69 6e 63   iFrom..iTo (inc
14f10 6c 75 73 69 76 65 29 0a 2a 2a 20 69 73 20 75 73  lusive).** is us
14f20 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 74 68  ed as part of th
14f30 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e 0a  e column cache..
14f40 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
14f50 6e 65 20 69 73 20 75 73 65 64 20 77 69 74 68 69  ne is used withi
14f60 6e 20 61 73 73 65 72 74 28 29 20 61 6e 64 20 74  n assert() and t
14f70 65 73 74 63 61 73 65 28 29 20 6d 61 63 72 6f 73  estcase() macros
14f80 20 6f 6e 6c 79 0a 2a 2a 20 61 6e 64 20 64 6f 65   only.** and doe
14f90 73 20 6e 6f 74 20 61 70 70 65 61 72 20 69 6e 20  s not appear in 
14fa0 61 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 2e 0a  a normal build..
14fb0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 73  */.static int us
14fc0 65 64 41 73 43 6f 6c 75 6d 6e 43 61 63 68 65 28  edAsColumnCache(
14fd0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
14fe0 6e 74 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69 54  nt iFrom, int iT
14ff0 6f 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  o){.  int i;.  s
15000 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20  truct yColCache 
15010 2a 70 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70  *p;.  for(i=0, p
15020 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63  =pParse->aColCac
15030 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43  he; i<SQLITE_N_C
15040 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b  OLCACHE; i++, p+
15050 2b 29 7b 0a 20 20 20 20 69 6e 74 20 72 20 3d 20  +){.    int r = 
15060 70 2d 3e 69 52 65 67 3b 0a 20 20 20 20 69 66 28  p->iReg;.    if(
15070 20 72 3e 3d 69 46 72 6f 6d 20 26 26 20 72 3c 3d   r>=iFrom && r<=
15080 69 54 6f 20 29 20 72 65 74 75 72 6e 20 31 3b 20  iTo ) return 1; 
15090 20 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a 20     /*NO_TEST*/. 
150a0 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
150b0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
150c0 45 5f 44 45 42 55 47 20 7c 7c 20 53 51 4c 49 54  E_DEBUG || SQLIT
150d0 45 5f 43 4f 56 45 52 41 47 45 5f 54 45 53 54 20  E_COVERAGE_TEST 
150e0 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72  */../*.** Conver
150f0 74 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  t an expression 
15100 6e 6f 64 65 20 74 6f 20 61 20 54 4b 5f 52 45 47  node to a TK_REG
15110 49 53 54 45 52 0a 2a 2f 0a 73 74 61 74 69 63 20  ISTER.*/.static 
15120 76 6f 69 64 20 65 78 70 72 54 6f 52 65 67 69 73  void exprToRegis
15130 74 65 72 28 45 78 70 72 20 2a 70 2c 20 69 6e 74  ter(Expr *p, int
15140 20 69 52 65 67 29 7b 0a 20 20 70 2d 3e 6f 70 32   iReg){.  p->op2
15150 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 70 2d 3e 6f   = p->op;.  p->o
15160 70 20 3d 20 54 4b 5f 52 45 47 49 53 54 45 52 3b  p = TK_REGISTER;
15170 0a 20 20 70 2d 3e 69 54 61 62 6c 65 20 3d 20 69  .  p->iTable = i
15180 52 65 67 3b 0a 20 20 45 78 70 72 43 6c 65 61 72  Reg;.  ExprClear
15190 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 53  Property(p, EP_S
151a0 6b 69 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  kip);.}../*.** G
151b0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74  enerate code int
151c0 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 56 64  o the current Vd
151d0 62 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74  be to evaluate t
151e0 68 65 20 67 69 76 65 6e 0a 2a 2a 20 65 78 70 72  he given.** expr
151f0 65 73 73 69 6f 6e 2e 20 20 41 74 74 65 6d 70 74  ession.  Attempt
15200 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 72 65   to store the re
15210 73 75 6c 74 73 20 69 6e 20 72 65 67 69 73 74 65  sults in registe
15220 72 20 22 74 61 72 67 65 74 22 2e 0a 2a 2a 20 52  r "target"..** R
15230 65 74 75 72 6e 20 74 68 65 20 72 65 67 69 73 74  eturn the regist
15240 65 72 20 77 68 65 72 65 20 72 65 73 75 6c 74 73  er where results
15250 20 61 72 65 20 73 74 6f 72 65 64 2e 0a 2a 2a 0a   are stored..**.
15260 2a 2a 20 57 69 74 68 20 74 68 69 73 20 72 6f 75  ** With this rou
15270 74 69 6e 65 2c 20 74 68 65 72 65 20 69 73 20 6e  tine, there is n
15280 6f 20 67 75 61 72 61 6e 74 65 65 20 74 68 61 74  o guarantee that
15290 20 72 65 73 75 6c 74 73 20 77 69 6c 6c 0a 2a 2a   results will.**
152a0 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 74 61   be stored in ta
152b0 72 67 65 74 2e 20 20 54 68 65 20 72 65 73 75 6c  rget.  The resul
152c0 74 20 6d 69 67 68 74 20 62 65 20 73 74 6f 72 65  t might be store
152d0 64 20 69 6e 20 73 6f 6d 65 20 6f 74 68 65 72 0a  d in some other.
152e0 2a 2a 20 72 65 67 69 73 74 65 72 20 69 66 20 69  ** register if i
152f0 74 20 69 73 20 63 6f 6e 76 65 6e 69 65 6e 74 20  t is convenient 
15300 74 6f 20 64 6f 20 73 6f 2e 20 20 54 68 65 20 63  to do so.  The c
15310 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a  alling function.
15320 2a 2a 20 6d 75 73 74 20 63 68 65 63 6b 20 74 68  ** must check th
15330 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 61 6e  e return code an
15340 64 20 6d 6f 76 65 20 74 68 65 20 72 65 73 75 6c  d move the resul
15350 74 73 20 74 6f 20 74 68 65 20 64 65 73 69 72 65  ts to the desire
15360 64 0a 2a 2a 20 72 65 67 69 73 74 65 72 2e 0a 2a  d.** register..*
15370 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
15380 72 43 6f 64 65 54 61 72 67 65 74 28 50 61 72 73  rCodeTarget(Pars
15390 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
153a0 2a 70 45 78 70 72 2c 20 69 6e 74 20 74 61 72 67  *pExpr, int targ
153b0 65 74 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  et){.  Vdbe *v =
153c0 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20   pParse->pVdbe; 
153d0 20 2f 2a 20 54 68 65 20 56 4d 20 75 6e 64 65 72   /* The VM under
153e0 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f   construction */
153f0 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20  .  int op;      
15400 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15410 54 68 65 20 6f 70 63 6f 64 65 20 62 65 69 6e 67  The opcode being
15420 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20   coded */.  int 
15430 69 6e 52 65 67 20 3d 20 74 61 72 67 65 74 3b 20  inReg = target; 
15440 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 73        /* Results
15450 20 73 74 6f 72 65 64 20 69 6e 20 72 65 67 69 73   stored in regis
15460 74 65 72 20 69 6e 52 65 67 20 2a 2f 0a 20 20 69  ter inReg */.  i
15470 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b  nt regFree1 = 0;
15480 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 6e           /* If n
15490 6f 6e 2d 7a 65 72 6f 20 66 72 65 65 20 74 68 69  on-zero free thi
154a0 73 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69  s temporary regi
154b0 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65  ster */.  int re
154c0 67 46 72 65 65 32 20 3d 20 30 3b 20 20 20 20 20  gFree2 = 0;     
154d0 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65      /* If non-ze
154e0 72 6f 20 66 72 65 65 20 74 68 69 73 20 74 65 6d  ro free this tem
154f0 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 20  porary register 
15500 2a 2f 0a 20 20 69 6e 74 20 72 31 2c 20 72 32 2c  */.  int r1, r2,
15510 20 72 33 2c 20 72 34 3b 20 20 20 20 20 20 20 2f   r3, r4;       /
15520 2a 20 56 61 72 69 6f 75 73 20 72 65 67 69 73 74  * Various regist
15530 65 72 20 6e 75 6d 62 65 72 73 20 2a 2f 0a 20 20  er numbers */.  
15540 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
15550 61 72 73 65 2d 3e 64 62 3b 20 2f 2a 20 54 68 65  arse->db; /* The
15560 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
15570 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 20 74  tion */.  Expr t
15580 65 6d 70 58 3b 20 20 20 20 20 20 20 20 20 20 20  empX;           
15590 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79      /* Temporary
155a0 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65   expression node
155b0 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 74   */..  assert( t
155c0 61 72 67 65 74 3e 30 20 26 26 20 74 61 72 67 65  arget>0 && targe
155d0 74 3c 3d 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20  t<=pParse->nMem 
155e0 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 7b  );.  if( v==0 ){
155f0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
15600 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
15610 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 72 65 74  ailed );.    ret
15620 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 69 66  urn 0;.  }..  if
15630 28 20 70 45 78 70 72 3d 3d 30 20 29 7b 0a 20 20  ( pExpr==0 ){.  
15640 20 20 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a    op = TK_NULL;.
15650 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 70 20    }else{.    op 
15660 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 7d  = pExpr->op;.  }
15670 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b  .  switch( op ){
15680 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47  .    case TK_AGG
15690 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20  _COLUMN: {.     
156a0 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e   AggInfo *pAggIn
156b0 66 6f 20 3d 20 70 45 78 70 72 2d 3e 70 41 67 67  fo = pExpr->pAgg
156c0 49 6e 66 6f 3b 0a 20 20 20 20 20 20 73 74 72 75  Info;.      stru
156d0 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a  ct AggInfo_col *
156e0 70 43 6f 6c 20 3d 20 26 70 41 67 67 49 6e 66 6f  pCol = &pAggInfo
156f0 2d 3e 61 43 6f 6c 5b 70 45 78 70 72 2d 3e 69 41  ->aCol[pExpr->iA
15700 67 67 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 21  gg];.      if( !
15710 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74  pAggInfo->direct
15720 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Mode ){.        
15730 61 73 73 65 72 74 28 20 70 43 6f 6c 2d 3e 69 4d  assert( pCol->iM
15740 65 6d 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20  em>0 );.        
15750 69 6e 52 65 67 20 3d 20 70 43 6f 6c 2d 3e 69 4d  inReg = pCol->iM
15760 65 6d 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  em;.        brea
15770 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  k;.      }else i
15780 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e 75 73 65  f( pAggInfo->use
15790 53 6f 72 74 69 6e 67 49 64 78 20 29 7b 0a 20 20  SortingIdx ){.  
157a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
157b0 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
157c0 6c 75 6d 6e 2c 20 70 41 67 67 49 6e 66 6f 2d 3e  lumn, pAggInfo->
157d0 73 6f 72 74 69 6e 67 49 64 78 50 54 61 62 2c 0a  sortingIdxPTab,.
157e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
157f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
15800 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d  ol->iSorterColum
15810 6e 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  n, target);.    
15820 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
15830 20 7d 0a 20 20 20 20 20 20 2f 2a 20 4f 74 68 65   }.      /* Othe
15840 72 77 69 73 65 2c 20 66 61 6c 6c 20 74 68 72 75  rwise, fall thru
15850 20 69 6e 74 6f 20 74 68 65 20 54 4b 5f 43 4f 4c   into the TK_COL
15860 55 4d 4e 20 63 61 73 65 20 2a 2f 0a 20 20 20 20  UMN case */.    
15870 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  }.    case TK_CO
15880 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e  LUMN: {.      in
15890 74 20 69 54 61 62 20 3d 20 70 45 78 70 72 2d 3e  t iTab = pExpr->
158a0 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 69 66  iTable;.      if
158b0 28 20 69 54 61 62 3c 30 20 29 7b 0a 20 20 20 20  ( iTab<0 ){.    
158c0 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e      if( pParse->
158d0 63 6b 42 61 73 65 3e 30 20 29 7b 0a 20 20 20 20  ckBase>0 ){.    
158e0 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
158f0 69 6e 67 20 43 48 45 43 4b 20 63 6f 6e 73 74 72  ing CHECK constr
15900 61 69 6e 74 73 20 6f 72 20 69 6e 73 65 72 74 69  aints or inserti
15910 6e 67 20 69 6e 74 6f 20 70 61 72 74 69 61 6c 20  ng into partial 
15920 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 20  index */.       
15930 20 20 20 69 6e 52 65 67 20 3d 20 70 45 78 70 72     inReg = pExpr
15940 2d 3e 69 43 6f 6c 75 6d 6e 20 2b 20 70 50 61 72  ->iColumn + pPar
15950 73 65 2d 3e 63 6b 42 61 73 65 3b 0a 20 20 20 20  se->ckBase;.    
15960 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
15970 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
15980 20 20 20 20 20 20 2f 2a 20 44 65 6c 65 74 69 6e        /* Deletin
15990 67 20 66 72 6f 6d 20 61 20 70 61 72 74 69 61 6c  g from a partial
159a0 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20   index */.      
159b0 20 20 20 20 69 54 61 62 20 3d 20 70 50 61 72 73      iTab = pPars
159c0 65 2d 3e 69 50 61 72 74 49 64 78 54 61 62 3b 0a  e->iPartIdxTab;.
159d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
159e0 7d 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20  }.      inReg = 
159f0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47  sqlite3ExprCodeG
15a00 65 74 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c  etColumn(pParse,
15a10 20 70 45 78 70 72 2d 3e 70 54 61 62 2c 0a 20 20   pExpr->pTab,.  
15a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15a30 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
15a40 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 69 54 61  pr->iColumn, iTa
15a50 62 2c 20 74 61 72 67 65 74 2c 0a 20 20 20 20 20  b, target,.     
15a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15a70 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
15a80 3e 6f 70 32 29 3b 0a 20 20 20 20 20 20 62 72 65  >op2);.      bre
15a90 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
15aa0 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 20 7b  se TK_INTEGER: {
15ab0 0a 20 20 20 20 20 20 63 6f 64 65 49 6e 74 65 67  .      codeInteg
15ac0 65 72 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  er(pParse, pExpr
15ad0 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  , 0, target);.  
15ae0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
15af0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
15b00 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f  OMIT_FLOATING_PO
15b10 49 4e 54 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  INT.    case TK_
15b20 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20 61  FLOAT: {.      a
15b30 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
15b40 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
15b50 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20  P_IntValue) );. 
15b60 20 20 20 20 20 63 6f 64 65 52 65 61 6c 28 76 2c       codeReal(v,
15b70 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
15b80 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  , 0, target);.  
15b90 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
15ba0 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65  .#endif.    case
15bb0 20 54 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20   TK_STRING: {.  
15bc0 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
15bd0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
15be0 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  pr, EP_IntValue)
15bf0 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
15c00 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
15c10 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 74 61  P_String8, 0, ta
15c20 72 67 65 74 2c 20 30 2c 20 70 45 78 70 72 2d 3e  rget, 0, pExpr->
15c30 75 2e 7a 54 6f 6b 65 6e 2c 20 30 29 3b 0a 20 20  u.zToken, 0);.  
15c40 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
15c50 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 55 4c  .    case TK_NUL
15c60 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  L: {.      sqlit
15c70 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
15c80 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61 72 67  OP_Null, 0, targ
15c90 65 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  et);.      break
15ca0 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
15cb0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 4c 4f 42  SQLITE_OMIT_BLOB
15cc0 5f 4c 49 54 45 52 41 4c 0a 20 20 20 20 63 61 73  _LITERAL.    cas
15cd0 65 20 54 4b 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20  e TK_BLOB: {.   
15ce0 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20     int n;.      
15cf0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20  const char *z;. 
15d00 20 20 20 20 20 63 68 61 72 20 2a 7a 42 6c 6f 62       char *zBlob
15d10 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
15d20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
15d30 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61  (pExpr, EP_IntVa
15d40 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 61 73  lue) );.      as
15d50 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a  sert( pExpr->u.z
15d60 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 78 27 20 7c 7c  Token[0]=='x' ||
15d70 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
15d80 5b 30 5d 3d 3d 27 58 27 20 29 3b 0a 20 20 20 20  [0]=='X' );.    
15d90 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
15da0 3e 75 2e 7a 54 6f 6b 65 6e 5b 31 5d 3d 3d 27 5c  >u.zToken[1]=='\
15db0 27 27 20 29 3b 0a 20 20 20 20 20 20 7a 20 3d 20  '' );.      z = 
15dc0 26 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e  &pExpr->u.zToken
15dd0 5b 32 5d 3b 0a 20 20 20 20 20 20 6e 20 3d 20 73  [2];.      n = s
15de0 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
15df0 29 20 2d 20 31 3b 0a 20 20 20 20 20 20 61 73 73  ) - 1;.      ass
15e00 65 72 74 28 20 7a 5b 6e 5d 3d 3d 27 5c 27 27 20  ert( z[n]=='\'' 
15e10 29 3b 0a 20 20 20 20 20 20 7a 42 6c 6f 62 20 3d  );.      zBlob =
15e20 20 73 71 6c 69 74 65 33 48 65 78 54 6f 42 6c 6f   sqlite3HexToBlo
15e30 62 28 73 71 6c 69 74 65 33 56 64 62 65 44 62 28  b(sqlite3VdbeDb(
15e40 76 29 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 20  v), z, n);.     
15e50 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15e60 70 34 28 76 2c 20 4f 50 5f 42 6c 6f 62 2c 20 6e  p4(v, OP_Blob, n
15e70 2f 32 2c 20 74 61 72 67 65 74 2c 20 30 2c 20 7a  /2, target, 0, z
15e80 42 6c 6f 62 2c 20 50 34 5f 44 59 4e 41 4d 49 43  Blob, P4_DYNAMIC
15e90 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
15ea0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
15eb0 20 63 61 73 65 20 54 4b 5f 56 41 52 49 41 42 4c   case TK_VARIABL
15ec0 45 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  E: {.      asser
15ed0 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
15ee0 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e  rty(pExpr, EP_In
15ef0 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20  tValue) );.     
15f00 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
15f10 75 2e 7a 54 6f 6b 65 6e 21 3d 30 20 29 3b 0a 20  u.zToken!=0 );. 
15f20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
15f30 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 21  pr->u.zToken[0]!
15f40 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =0 );.      sqli
15f50 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
15f60 20 4f 50 5f 56 61 72 69 61 62 6c 65 2c 20 70 45   OP_Variable, pE
15f70 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 74 61  xpr->iColumn, ta
15f80 72 67 65 74 29 3b 0a 20 20 20 20 20 20 69 66 28  rget);.      if(
15f90 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
15fa0 5b 31 5d 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  [1]!=0 ){.      
15fb0 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
15fc0 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 3f  >u.zToken[0]=='?
15fd0 27 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ' .             
15fe0 7c 7c 20 73 74 72 63 6d 70 28 70 45 78 70 72 2d  || strcmp(pExpr-
15ff0 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 70 50 61 72 73  >u.zToken, pPars
16000 65 2d 3e 61 7a 56 61 72 5b 70 45 78 70 72 2d 3e  e->azVar[pExpr->
16010 69 43 6f 6c 75 6d 6e 2d 31 5d 29 3d 3d 30 20 29  iColumn-1])==0 )
16020 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
16030 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c  3VdbeChangeP4(v,
16040 20 2d 31 2c 20 70 50 61 72 73 65 2d 3e 61 7a 56   -1, pParse->azV
16050 61 72 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  ar[pExpr->iColum
16060 6e 2d 31 5d 2c 20 50 34 5f 53 54 41 54 49 43 29  n-1], P4_STATIC)
16070 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
16080 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
16090 20 63 61 73 65 20 54 4b 5f 52 45 47 49 53 54 45   case TK_REGISTE
160a0 52 3a 20 7b 0a 20 20 20 20 20 20 69 6e 52 65 67  R: {.      inReg
160b0 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65   = pExpr->iTable
160c0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
160d0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
160e0 5f 41 53 3a 20 7b 0a 20 20 20 20 20 20 69 6e 52  _AS: {.      inR
160f0 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  eg = sqlite3Expr
16100 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73  CodeTarget(pPars
16110 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
16120 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
16130 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66  break;.    }.#if
16140 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
16150 5f 43 41 53 54 0a 20 20 20 20 63 61 73 65 20 54  _CAST.    case T
16160 4b 5f 43 41 53 54 3a 20 7b 0a 20 20 20 20 20 20  K_CAST: {.      
16170 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 73 20 6f  /* Expressions o
16180 66 20 74 68 65 20 66 6f 72 6d 3a 20 20 20 43 41  f the form:   CA
16190 53 54 28 70 4c 65 66 74 20 41 53 20 74 6f 6b 65  ST(pLeft AS toke
161a0 6e 29 20 2a 2f 0a 20 20 20 20 20 20 69 6e 52 65  n) */.      inRe
161b0 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  g = sqlite3ExprC
161c0 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65  odeTarget(pParse
161d0 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
161e0 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 69  target);.      i
161f0 66 28 20 69 6e 52 65 67 21 3d 74 61 72 67 65 74  f( inReg!=target
16200 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
16210 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
16220 20 4f 50 5f 53 43 6f 70 79 2c 20 69 6e 52 65 67   OP_SCopy, inReg
16230 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
16240 20 20 20 69 6e 52 65 67 20 3d 20 74 61 72 67 65     inReg = targe
16250 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
16260 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
16270 70 32 28 76 2c 20 4f 50 5f 43 61 73 74 2c 20 74  p2(v, OP_Cast, t
16280 61 72 67 65 74 2c 0a 20 20 20 20 20 20 20 20 20  arget,.         
16290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
162a0 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54 79  qlite3AffinityTy
162b0 70 65 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  pe(pExpr->u.zTok
162c0 65 6e 2c 20 30 29 29 3b 0a 20 20 20 20 20 20 74  en, 0));.      t
162d0 65 73 74 63 61 73 65 28 20 75 73 65 64 41 73 43  estcase( usedAsC
162e0 6f 6c 75 6d 6e 43 61 63 68 65 28 70 50 61 72 73  olumnCache(pPars
162f0 65 2c 20 69 6e 52 65 67 2c 20 69 6e 52 65 67 29  e, inReg, inReg)
16300 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
16310 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69  3ExprCacheAffini
16320 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c  tyChange(pParse,
16330 20 69 6e 52 65 67 2c 20 31 29 3b 0a 20 20 20 20   inReg, 1);.    
16340 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
16350 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
16360 4f 4d 49 54 5f 43 41 53 54 20 2a 2f 0a 20 20 20  OMIT_CAST */.   
16370 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20   case TK_LT:.   
16380 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20   case TK_LE:.   
16390 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20   case TK_GT:.   
163a0 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20   case TK_GE:.   
163b0 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20   case TK_NE:.   
163c0 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20   case TK_EQ: {. 
163d0 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
163e0 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
163f0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
16400 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  ft, &regFree1);.
16410 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74        r2 = sqlit
16420 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
16430 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
16440 69 67 68 74 2c 20 26 72 65 67 46 72 65 65 32 29  ight, &regFree2)
16450 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70  ;.      codeComp
16460 61 72 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  are(pParse, pExp
16470 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d  r->pLeft, pExpr-
16480 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20  >pRight, op,.   
16490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
164a0 31 2c 20 72 32 2c 20 69 6e 52 65 67 2c 20 53 51  1, r2, inReg, SQ
164b0 4c 49 54 45 5f 53 54 4f 52 45 50 32 29 3b 0a 20  LITE_STOREP2);. 
164c0 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4c       assert(TK_L
164d0 54 3d 3d 4f 50 5f 4c 74 29 3b 20 74 65 73 74 63  T==OP_Lt); testc
164e0 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 20  ase(op==OP_Lt); 
164f0 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
16500 2c 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a 20 20 20  ,op==OP_Lt);.   
16510 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4c 45 3d     assert(TK_LE=
16520 3d 4f 50 5f 4c 65 29 3b 20 74 65 73 74 63 61 73  =OP_Le); testcas
16530 65 28 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 20 56 64  e(op==OP_Le); Vd
16540 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f  beCoverageIf(v,o
16550 70 3d 3d 4f 50 5f 4c 65 29 3b 0a 20 20 20 20 20  p==OP_Le);.     
16560 20 61 73 73 65 72 74 28 54 4b 5f 47 54 3d 3d 4f   assert(TK_GT==O
16570 50 5f 47 74 29 3b 20 74 65 73 74 63 61 73 65 28  P_Gt); testcase(
16580 6f 70 3d 3d 4f 50 5f 47 74 29 3b 20 56 64 62 65  op==OP_Gt); Vdbe
16590 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d  CoverageIf(v,op=
165a0 3d 4f 50 5f 47 74 29 3b 0a 20 20 20 20 20 20 61  =OP_Gt);.      a
165b0 73 73 65 72 74 28 54 4b 5f 47 45 3d 3d 4f 50 5f  ssert(TK_GE==OP_
165c0 47 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70  Ge); testcase(op
165d0 3d 3d 4f 50 5f 47 65 29 3b 20 56 64 62 65 43 6f  ==OP_Ge); VdbeCo
165e0 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f  verageIf(v,op==O
165f0 50 5f 47 65 29 3b 0a 20 20 20 20 20 20 61 73 73  P_Ge);.      ass
16600 65 72 74 28 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71  ert(TK_EQ==OP_Eq
16610 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d  ); testcase(op==
16620 4f 50 5f 45 71 29 3b 20 56 64 62 65 43 6f 76 65  OP_Eq); VdbeCove
16630 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f  rageIf(v,op==OP_
16640 45 71 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Eq);.      asser
16650 74 28 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 29 3b  t(TK_NE==OP_Ne);
16660 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50   testcase(op==OP
16670 5f 4e 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61  _Ne); VdbeCovera
16680 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4e 65  geIf(v,op==OP_Ne
16690 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
166a0 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  e( regFree1==0 )
166b0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
166c0 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b  ( regFree2==0 );
166d0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
166e0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
166f0 49 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  IS:.    case TK_
16700 49 53 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 74  ISNOT: {.      t
16710 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
16720 49 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  IS );.      test
16730 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e  case( op==TK_ISN
16740 4f 54 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d  OT );.      r1 =
16750 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
16760 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
16770 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46  pr->pLeft, &regF
16780 72 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32 20  ree1);.      r2 
16790 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
167a0 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
167b0 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65  xpr->pRight, &re
167c0 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 6f  gFree2);.      o
167d0 70 20 3d 20 28 6f 70 3d 3d 54 4b 5f 49 53 29 20  p = (op==TK_IS) 
167e0 3f 20 54 4b 5f 45 51 20 3a 20 54 4b 5f 4e 45 3b  ? TK_EQ : TK_NE;
167f0 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61  .      codeCompa
16800 72 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  re(pParse, pExpr
16810 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e  ->pLeft, pExpr->
16820 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20  pRight, op,.    
16830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 31                r1
16840 2c 20 72 32 2c 20 69 6e 52 65 67 2c 20 53 51 4c  , r2, inReg, SQL
16850 49 54 45 5f 53 54 4f 52 45 50 32 20 7c 20 53 51  ITE_STOREP2 | SQ
16860 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20  LITE_NULLEQ);.  
16870 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
16880 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 45 51 29  If(v, op==TK_EQ)
16890 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
168a0 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b  rageIf(v, op==TK
168b0 5f 4e 45 29 3b 0a 20 20 20 20 20 20 74 65 73 74  _NE);.      test
168c0 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d  case( regFree1==
168d0 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  0 );.      testc
168e0 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30  ase( regFree2==0
168f0 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
16900 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
16910 54 4b 5f 41 4e 44 3a 0a 20 20 20 20 63 61 73 65  TK_AND:.    case
16920 20 54 4b 5f 4f 52 3a 0a 20 20 20 20 63 61 73 65   TK_OR:.    case
16930 20 54 4b 5f 50 4c 55 53 3a 0a 20 20 20 20 63 61   TK_PLUS:.    ca
16940 73 65 20 54 4b 5f 53 54 41 52 3a 0a 20 20 20 20  se TK_STAR:.    
16950 63 61 73 65 20 54 4b 5f 4d 49 4e 55 53 3a 0a 20  case TK_MINUS:. 
16960 20 20 20 63 61 73 65 20 54 4b 5f 52 45 4d 3a 0a     case TK_REM:.
16970 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54 41      case TK_BITA
16980 4e 44 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ND:.    case TK_
16990 42 49 54 4f 52 3a 0a 20 20 20 20 63 61 73 65 20  BITOR:.    case 
169a0 54 4b 5f 53 4c 41 53 48 3a 0a 20 20 20 20 63 61  TK_SLASH:.    ca
169b0 73 65 20 54 4b 5f 4c 53 48 49 46 54 3a 0a 20 20  se TK_LSHIFT:.  
169c0 20 20 63 61 73 65 20 54 4b 5f 52 53 48 49 46 54    case TK_RSHIFT
169d0 3a 20 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43  : .    case TK_C
169e0 4f 4e 43 41 54 3a 20 7b 0a 20 20 20 20 20 20 61  ONCAT: {.      a
169f0 73 73 65 72 74 28 20 54 4b 5f 41 4e 44 3d 3d 4f  ssert( TK_AND==O
16a00 50 5f 41 6e 64 20 29 3b 20 20 20 20 20 20 20 20  P_And );        
16a10 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
16a20 3d 3d 54 4b 5f 41 4e 44 20 29 3b 0a 20 20 20 20  ==TK_AND );.    
16a30 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4f 52 3d    assert( TK_OR=
16a40 3d 4f 50 5f 4f 72 20 29 3b 20 20 20 20 20 20 20  =OP_Or );       
16a50 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
16a60 20 6f 70 3d 3d 54 4b 5f 4f 52 20 29 3b 0a 20 20   op==TK_OR );.  
16a70 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 50      assert( TK_P
16a80 4c 55 53 3d 3d 4f 50 5f 41 64 64 20 29 3b 20 20  LUS==OP_Add );  
16a90 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
16aa0 65 28 20 6f 70 3d 3d 54 4b 5f 50 4c 55 53 20 29  e( op==TK_PLUS )
16ab0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
16ac0 54 4b 5f 4d 49 4e 55 53 3d 3d 4f 50 5f 53 75 62  TK_MINUS==OP_Sub
16ad0 74 72 61 63 74 20 29 3b 20 20 20 20 20 74 65 73  tract );     tes
16ae0 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4d 49  tcase( op==TK_MI
16af0 4e 55 53 20 29 3b 0a 20 20 20 20 20 20 61 73 73  NUS );.      ass
16b00 65 72 74 28 20 54 4b 5f 52 45 4d 3d 3d 4f 50 5f  ert( TK_REM==OP_
16b10 52 65 6d 61 69 6e 64 65 72 20 29 3b 20 20 20 20  Remainder );    
16b20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
16b30 54 4b 5f 52 45 4d 20 29 3b 0a 20 20 20 20 20 20  TK_REM );.      
16b40 61 73 73 65 72 74 28 20 54 4b 5f 42 49 54 41 4e  assert( TK_BITAN
16b50 44 3d 3d 4f 50 5f 42 69 74 41 6e 64 20 29 3b 20  D==OP_BitAnd ); 
16b60 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
16b70 70 3d 3d 54 4b 5f 42 49 54 41 4e 44 20 29 3b 0a  p==TK_BITAND );.
16b80 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
16b90 5f 42 49 54 4f 52 3d 3d 4f 50 5f 42 69 74 4f 72  _BITOR==OP_BitOr
16ba0 20 29 3b 20 20 20 20 20 20 20 20 74 65 73 74 63   );        testc
16bb0 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 42 49 54 4f  ase( op==TK_BITO
16bc0 52 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  R );.      asser
16bd0 74 28 20 54 4b 5f 53 4c 41 53 48 3d 3d 4f 50 5f  t( TK_SLASH==OP_
16be0 44 69 76 69 64 65 20 29 3b 20 20 20 20 20 20 20  Divide );       
16bf0 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
16c00 5f 53 4c 41 53 48 20 29 3b 0a 20 20 20 20 20 20  _SLASH );.      
16c10 61 73 73 65 72 74 28 20 54 4b 5f 4c 53 48 49 46  assert( TK_LSHIF
16c20 54 3d 3d 4f 50 5f 53 68 69 66 74 4c 65 66 74 20  T==OP_ShiftLeft 
16c30 29 3b 20 20 20 74 65 73 74 63 61 73 65 28 20 6f  );   testcase( o
16c40 70 3d 3d 54 4b 5f 4c 53 48 49 46 54 20 29 3b 0a  p==TK_LSHIFT );.
16c50 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
16c60 5f 52 53 48 49 46 54 3d 3d 4f 50 5f 53 68 69 66  _RSHIFT==OP_Shif
16c70 74 52 69 67 68 74 20 29 3b 20 20 74 65 73 74 63  tRight );  testc
16c80 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 52 53 48 49  ase( op==TK_RSHI
16c90 46 54 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  FT );.      asse
16ca0 72 74 28 20 54 4b 5f 43 4f 4e 43 41 54 3d 3d 4f  rt( TK_CONCAT==O
16cb0 50 5f 43 6f 6e 63 61 74 20 29 3b 20 20 20 20 20  P_Concat );     
16cc0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
16cd0 4b 5f 43 4f 4e 43 41 54 20 29 3b 0a 20 20 20 20  K_CONCAT );.    
16ce0 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78    r1 = sqlite3Ex
16cf0 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
16d00 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
16d10 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20   &regFree1);.   
16d20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45     r2 = sqlite3E
16d30 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
16d40 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
16d50 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20  t, &regFree2);. 
16d60 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
16d70 41 64 64 4f 70 33 28 76 2c 20 6f 70 2c 20 72 32  AddOp3(v, op, r2
16d80 2c 20 72 31 2c 20 74 61 72 67 65 74 29 3b 0a 20  , r1, target);. 
16d90 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
16da0 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
16db0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
16dc0 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20  gFree2==0 );.   
16dd0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
16de0 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e      case TK_UMIN
16df0 55 53 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72  US: {.      Expr
16e00 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d   *pLeft = pExpr-
16e10 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 61 73  >pLeft;.      as
16e20 73 65 72 74 28 20 70 4c 65 66 74 20 29 3b 0a 20  sert( pLeft );. 
16e30 20 20 20 20 20 69 66 28 20 70 4c 65 66 74 2d 3e       if( pLeft->
16e40 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47 45 52 20 29  op==TK_INTEGER )
16e50 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 49 6e  {.        codeIn
16e60 74 65 67 65 72 28 70 50 61 72 73 65 2c 20 70 4c  teger(pParse, pL
16e70 65 66 74 2c 20 31 2c 20 74 61 72 67 65 74 29 3b  eft, 1, target);
16e80 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
16e90 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f  OMIT_FLOATING_PO
16ea0 49 4e 54 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  INT.      }else 
16eb0 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54  if( pLeft->op==T
16ec0 4b 5f 46 4c 4f 41 54 20 29 7b 0a 20 20 20 20 20  K_FLOAT ){.     
16ed0 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
16ee0 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
16ef0 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20  r, EP_IntValue) 
16f00 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 52  );.        codeR
16f10 65 61 6c 28 76 2c 20 70 4c 65 66 74 2d 3e 75 2e  eal(v, pLeft->u.
16f20 7a 54 6f 6b 65 6e 2c 20 31 2c 20 74 61 72 67 65  zToken, 1, targe
16f30 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  t);.#endif.     
16f40 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
16f50 74 65 6d 70 58 2e 6f 70 20 3d 20 54 4b 5f 49 4e  tempX.op = TK_IN
16f60 54 45 47 45 52 3b 0a 20 20 20 20 20 20 20 20 74  TEGER;.        t
16f70 65 6d 70 58 2e 66 6c 61 67 73 20 3d 20 45 50 5f  empX.flags = EP_
16f80 49 6e 74 56 61 6c 75 65 7c 45 50 5f 54 6f 6b 65  IntValue|EP_Toke
16f90 6e 4f 6e 6c 79 3b 0a 20 20 20 20 20 20 20 20 74  nOnly;.        t
16fa0 65 6d 70 58 2e 75 2e 69 56 61 6c 75 65 20 3d 20  empX.u.iValue = 
16fb0 30 3b 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20  0;.        r1 = 
16fc0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
16fd0 65 6d 70 28 70 50 61 72 73 65 2c 20 26 74 65 6d  emp(pParse, &tem
16fe0 70 58 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  pX, &regFree1);.
16ff0 20 20 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c          r2 = sql
17000 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
17010 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
17020 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 32  pLeft, &regFree2
17030 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
17040 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
17050 4f 50 5f 53 75 62 74 72 61 63 74 2c 20 72 32 2c  OP_Subtract, r2,
17060 20 72 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20   r1, target);.  
17070 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
17080 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20  regFree2==0 );. 
17090 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 6e 52       }.      inR
170a0 65 67 20 3d 20 74 61 72 67 65 74 3b 0a 20 20 20  eg = target;.   
170b0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
170c0 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4e      case TK_BITN
170d0 4f 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  OT:.    case TK_
170e0 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  NOT: {.      ass
170f0 65 72 74 28 20 54 4b 5f 42 49 54 4e 4f 54 3d 3d  ert( TK_BITNOT==
17100 4f 50 5f 42 69 74 4e 6f 74 20 29 3b 20 20 20 74  OP_BitNot );   t
17110 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
17120 42 49 54 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20  BITNOT );.      
17130 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54 3d 3d  assert( TK_NOT==
17140 4f 50 5f 4e 6f 74 20 29 3b 20 20 20 20 20 20 20  OP_Not );       
17150 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
17160 54 4b 5f 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20  TK_NOT );.      
17170 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
17180 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
17190 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26   pExpr->pLeft, &
171a0 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
171b0 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
171c0 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee1==0 );.      
171d0 69 6e 52 65 67 20 3d 20 74 61 72 67 65 74 3b 0a  inReg = target;.
171e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
171f0 65 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20 72  eAddOp2(v, op, r
17200 31 2c 20 69 6e 52 65 67 29 3b 0a 20 20 20 20 20  1, inReg);.     
17210 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
17220 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c    case TK_ISNULL
17230 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f  :.    case TK_NO
17240 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 69  TNULL: {.      i
17250 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20 61  nt addr;.      a
17260 73 73 65 72 74 28 20 54 4b 5f 49 53 4e 55 4c 4c  ssert( TK_ISNULL
17270 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 20 20  ==OP_IsNull );  
17280 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
17290 4b 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20  K_ISNULL );.    
172a0 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54    assert( TK_NOT
172b0 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c  NULL==OP_NotNull
172c0 20 29 3b 20 74 65 73 74 63 61 73 65 28 20 6f 70   ); testcase( op
172d0 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 0a  ==TK_NOTNULL );.
172e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
172f0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
17300 74 65 67 65 72 2c 20 31 2c 20 74 61 72 67 65 74  teger, 1, target
17310 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71  );.      r1 = sq
17320 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
17330 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
17340 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65  >pLeft, &regFree
17350 31 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  1);.      testca
17360 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20  se( regFree1==0 
17370 29 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20  );.      addr = 
17380 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
17390 31 28 76 2c 20 6f 70 2c 20 72 31 29 3b 0a 20 20  1(v, op, r1);.  
173a0 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
173b0 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 49 53 4e  If(v, op==TK_ISN
173c0 55 4c 4c 29 3b 0a 20 20 20 20 20 20 56 64 62 65  ULL);.      Vdbe
173d0 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70  CoverageIf(v, op
173e0 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a 20  ==TK_NOTNULL);. 
173f0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
17400 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
17410 65 67 65 72 2c 20 30 2c 20 74 61 72 67 65 74 29  eger, 0, target)
17420 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
17430 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
17440 64 64 72 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ddr);.      brea
17450 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
17460 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f  e TK_AGG_FUNCTIO
17470 4e 3a 20 7b 0a 20 20 20 20 20 20 41 67 67 49 6e  N: {.      AggIn
17480 66 6f 20 2a 70 49 6e 66 6f 20 3d 20 70 45 78 70  fo *pInfo = pExp
17490 72 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20  r->pAggInfo;.   
174a0 20 20 20 69 66 28 20 70 49 6e 66 6f 3d 3d 30 20     if( pInfo==0 
174b0 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
174c0 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
174d0 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e  rty(pExpr, EP_In
174e0 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20  tValue) );.     
174f0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
17500 73 67 28 70 50 61 72 73 65 2c 20 22 6d 69 73 75  sg(pParse, "misu
17510 73 65 20 6f 66 20 61 67 67 72 65 67 61 74 65 3a  se of aggregate:
17520 20 25 73 28 29 22 2c 20 70 45 78 70 72 2d 3e 75   %s()", pExpr->u
17530 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20  .zToken);.      
17540 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
17550 6e 52 65 67 20 3d 20 70 49 6e 66 6f 2d 3e 61 46  nReg = pInfo->aF
17560 75 6e 63 5b 70 45 78 70 72 2d 3e 69 41 67 67 5d  unc[pExpr->iAgg]
17570 2e 69 4d 65 6d 3b 0a 20 20 20 20 20 20 7d 0a 20  .iMem;.      }. 
17580 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
17590 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55  }.    case TK_FU
175a0 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20  NCTION: {.      
175b0 45 78 70 72 4c 69 73 74 20 2a 70 46 61 72 67 3b  ExprList *pFarg;
175c0 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f         /* List o
175d0 66 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d  f function argum
175e0 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ents */.      in
175f0 74 20 6e 46 61 72 67 3b 20 20 20 20 20 20 20 20  t nFarg;        
17600 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
17610 66 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d  f function argum
17620 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 46 75  ents */.      Fu
17630 6e 63 44 65 66 20 2a 70 44 65 66 3b 20 20 20 20  ncDef *pDef;    
17640 20 20 20 20 20 2f 2a 20 54 68 65 20 66 75 6e 63       /* The func
17650 74 69 6f 6e 20 64 65 66 69 6e 69 74 69 6f 6e 20  tion definition 
17660 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20 20 20  object */.      
17670 69 6e 74 20 6e 49 64 3b 20 20 20 20 20 20 20 20  int nId;        
17680 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68         /* Length
17690 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   of the function
176a0 20 6e 61 6d 65 20 69 6e 20 62 79 74 65 73 20 2a   name in bytes *
176b0 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  /.      const ch
176c0 61 72 20 2a 7a 49 64 3b 20 20 20 20 20 20 20 2f  ar *zId;       /
176d0 2a 20 54 68 65 20 66 75 6e 63 74 69 6f 6e 20 6e  * The function n
176e0 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 75 33 32  ame */.      u32
176f0 20 63 6f 6e 73 74 4d 61 73 6b 20 3d 20 30 3b 20   constMask = 0; 
17700 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 66      /* Mask of f
17710 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74  unction argument
17720 73 20 74 68 61 74 20 61 72 65 20 63 6f 6e 73 74  s that are const
17730 61 6e 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  ant */.      int
17740 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
17750 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
17760 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 75 38 20  ter */.      u8 
17770 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 20 20  enc = ENC(db);  
17780 20 20 20 20 2f 2a 20 54 68 65 20 74 65 78 74 20      /* The text 
17790 65 6e 63 6f 64 69 6e 67 20 75 73 65 64 20 62 79  encoding used by
177a0 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 2a   this database *
177b0 2f 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20  /.      CollSeq 
177c0 2a 70 43 6f 6c 6c 20 3d 20 30 3b 20 20 20 20 2f  *pColl = 0;    /
177d0 2a 20 41 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  * A collating se
177e0 71 75 65 6e 63 65 20 2a 2f 0a 0a 20 20 20 20 20  quence */..     
177f0 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
17800 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
17810 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
17820 3b 0a 20 20 20 20 20 20 69 66 28 20 45 78 70 72  ;.      if( Expr
17830 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
17840 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29  r, EP_TokenOnly)
17850 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 61 72   ){.        pFar
17860 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c  g = 0;.      }el
17870 73 65 7b 0a 20 20 20 20 20 20 20 20 70 46 61 72  se{.        pFar
17880 67 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  g = pExpr->x.pLi
17890 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  st;.      }.    
178a0 20 20 6e 46 61 72 67 20 3d 20 70 46 61 72 67 20    nFarg = pFarg 
178b0 3f 20 70 46 61 72 67 2d 3e 6e 45 78 70 72 20 3a  ? pFarg->nExpr :
178c0 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   0;.      assert
178d0 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
178e0 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74  ty(pExpr, EP_Int
178f0 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20  Value) );.      
17900 7a 49 64 20 3d 20 70 45 78 70 72 2d 3e 75 2e 7a  zId = pExpr->u.z
17910 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 6e 49 64  Token;.      nId
17920 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
17930 33 30 28 7a 49 64 29 3b 0a 20 20 20 20 20 20 70  30(zId);.      p
17940 44 65 66 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  Def = sqlite3Fin
17950 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 7a 49  dFunction(db, zI
17960 64 2c 20 6e 49 64 2c 20 6e 46 61 72 67 2c 20 65  d, nId, nFarg, e
17970 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  nc, 0);.      if
17980 28 20 70 44 65 66 3d 3d 30 20 7c 7c 20 70 44 65  ( pDef==0 || pDe
17990 66 2d 3e 78 46 75 6e 63 3d 3d 30 20 29 7b 0a 20  f->xFunc==0 ){. 
179a0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
179b0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
179c0 75 6e 6b 6e 6f 77 6e 20 66 75 6e 63 74 69 6f 6e  unknown function
179d0 3a 20 25 2e 2a 73 28 29 22 2c 20 6e 49 64 2c 20  : %.*s()", nId, 
179e0 7a 49 64 29 3b 0a 20 20 20 20 20 20 20 20 62 72  zId);.        br
179f0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  eak;.      }..  
17a00 20 20 20 20 2f 2a 20 41 74 74 65 6d 70 74 20 61      /* Attempt a
17a10 20 64 69 72 65 63 74 20 69 6d 70 6c 65 6d 65 6e   direct implemen
17a20 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 62 75  tation of the bu
17a30 69 6c 74 2d 69 6e 20 43 4f 41 4c 45 53 43 45 28  ilt-in COALESCE(
17a40 29 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 49  ) and.      ** I
17a50 46 4e 55 4c 4c 28 29 20 66 75 6e 63 74 69 6f 6e  FNULL() function
17a60 73 2e 20 20 54 68 69 73 20 61 76 6f 69 64 73 20  s.  This avoids 
17a70 75 6e 6e 65 63 65 73 73 61 72 79 20 65 76 61 6c  unnecessary eval
17a80 75 61 74 69 6f 6e 20 6f 66 0a 20 20 20 20 20 20  uation of.      
17a90 2a 2a 20 61 72 67 75 6d 65 6e 74 73 20 70 61 73  ** arguments pas
17aa0 74 20 74 68 65 20 66 69 72 73 74 20 6e 6f 6e 2d  t the first non-
17ab0 4e 55 4c 4c 20 61 72 67 75 6d 65 6e 74 2e 0a 20  NULL argument.. 
17ac0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
17ad0 28 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67  ( pDef->funcFlag
17ae0 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f  s & SQLITE_FUNC_
17af0 43 4f 41 4c 45 53 43 45 20 29 7b 0a 20 20 20 20  COALESCE ){.    
17b00 20 20 20 20 69 6e 74 20 65 6e 64 43 6f 61 6c 65      int endCoale
17b10 73 63 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62  sce = sqlite3Vdb
17b20 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
17b30 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e         assert( n
17b40 46 61 72 67 3e 3d 32 20 29 3b 0a 20 20 20 20 20  Farg>=2 );.     
17b50 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
17b60 64 65 28 70 50 61 72 73 65 2c 20 70 46 61 72 67  de(pParse, pFarg
17b70 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20 74 61  ->a[0].pExpr, ta
17b80 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 66  rget);.        f
17b90 6f 72 28 69 3d 31 3b 20 69 3c 6e 46 61 72 67 3b  or(i=1; i<nFarg;
17ba0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
17bb0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
17bc0 70 32 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c  p2(v, OP_NotNull
17bd0 2c 20 74 61 72 67 65 74 2c 20 65 6e 64 43 6f 61  , target, endCoa
17be0 6c 65 73 63 65 29 3b 0a 20 20 20 20 20 20 20 20  lesce);.        
17bf0 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
17c00 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
17c10 69 74 65 33 45 78 70 72 43 61 63 68 65 52 65 6d  ite3ExprCacheRem
17c20 6f 76 65 28 70 50 61 72 73 65 2c 20 74 61 72 67  ove(pParse, targ
17c30 65 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  et, 1);.        
17c40 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
17c50 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a  hePush(pParse);.
17c60 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
17c70 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
17c80 2c 20 70 46 61 72 67 2d 3e 61 5b 69 5d 2e 70 45  , pFarg->a[i].pE
17c90 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  xpr, target);.  
17ca0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
17cb0 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72  xprCachePop(pPar
17cc0 73 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  se);.        }. 
17cd0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
17ce0 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
17cf0 2c 20 65 6e 64 43 6f 61 6c 65 73 63 65 29 3b 0a  , endCoalesce);.
17d00 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
17d10 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
17d20 20 54 68 65 20 55 4e 4c 49 4b 45 4c 59 28 29 20   The UNLIKELY() 
17d30 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
17d40 2d 6f 70 2e 20 20 54 68 65 20 72 65 73 75 6c 74  -op.  The result
17d50 20 69 73 20 74 68 65 20 76 61 6c 75 65 0a 20 20   is the value.  
17d60 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69      ** of the fi
17d70 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a 20 20  rst argument..  
17d80 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
17d90 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73   pDef->funcFlags
17da0 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 55   & SQLITE_FUNC_U
17db0 4e 4c 49 4b 45 4c 59 20 29 7b 0a 20 20 20 20 20  NLIKELY ){.     
17dc0 20 20 20 61 73 73 65 72 74 28 20 6e 46 61 72 67     assert( nFarg
17dd0 3e 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 73  >=1 );.        s
17de0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
17df0 50 61 72 73 65 2c 20 70 46 61 72 67 2d 3e 61 5b  Parse, pFarg->a[
17e00 30 5d 2e 70 45 78 70 72 2c 20 74 61 72 67 65 74  0].pExpr, target
17e10 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
17e20 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
17e30 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 46 61 72   for(i=0; i<nFar
17e40 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  g; i++){.       
17e50 20 69 66 28 20 69 3c 33 32 20 26 26 20 73 71 6c   if( i<32 && sql
17e60 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
17e70 6e 74 28 70 46 61 72 67 2d 3e 61 5b 69 5d 2e 70  nt(pFarg->a[i].p
17e80 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20  Expr) ){.       
17e90 20 20 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d     testcase( i==
17ea0 33 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  31 );.          
17eb0 63 6f 6e 73 74 4d 61 73 6b 20 7c 3d 20 4d 41 53  constMask |= MAS
17ec0 4b 42 49 54 33 32 28 69 29 3b 0a 20 20 20 20 20  KBIT32(i);.     
17ed0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
17ee0 20 28 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67   (pDef->funcFlag
17ef0 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f  s & SQLITE_FUNC_
17f00 4e 45 45 44 43 4f 4c 4c 29 21 3d 30 20 26 26 20  NEEDCOLL)!=0 && 
17f10 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20  !pColl ){.      
17f20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
17f30 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
17f40 50 61 72 73 65 2c 20 70 46 61 72 67 2d 3e 61 5b  Parse, pFarg->a[
17f50 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  i].pExpr);.     
17f60 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
17f70 20 20 20 69 66 28 20 70 46 61 72 67 20 29 7b 0a     if( pFarg ){.
17f80 20 20 20 20 20 20 20 20 69 66 28 20 63 6f 6e 73          if( cons
17f90 74 4d 61 73 6b 20 29 7b 0a 20 20 20 20 20 20 20  tMask ){.       
17fa0 20 20 20 72 31 20 3d 20 70 50 61 72 73 65 2d 3e     r1 = pParse->
17fb0 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 20 20 20 20  nMem+1;.        
17fc0 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b    pParse->nMem +
17fd0 3d 20 6e 46 61 72 67 3b 0a 20 20 20 20 20 20 20  = nFarg;.       
17fe0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
17ff0 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65    r1 = sqlite3Ge
18000 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  tTempRange(pPars
18010 65 2c 20 6e 46 61 72 67 29 3b 0a 20 20 20 20 20  e, nFarg);.     
18020 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a     }..        /*
18030 20 46 6f 72 20 6c 65 6e 67 74 68 28 29 20 61 6e   For length() an
18040 64 20 74 79 70 65 6f 66 28 29 20 66 75 6e 63 74  d typeof() funct
18050 69 6f 6e 73 20 77 69 74 68 20 61 20 63 6f 6c 75  ions with a colu
18060 6d 6e 20 61 72 67 75 6d 65 6e 74 2c 0a 20 20 20  mn argument,.   
18070 20 20 20 20 20 2a 2a 20 73 65 74 20 74 68 65 20       ** set the 
18080 50 35 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20  P5 parameter to 
18090 74 68 65 20 4f 50 5f 43 6f 6c 75 6d 6e 20 6f 70  the OP_Column op
180a0 63 6f 64 65 20 74 6f 20 4f 50 46 4c 41 47 5f 4c  code to OPFLAG_L
180b0 45 4e 47 54 48 41 52 47 0a 20 20 20 20 20 20 20  ENGTHARG.       
180c0 20 2a 2a 20 6f 72 20 4f 50 46 4c 41 47 5f 54 59   ** or OPFLAG_TY
180d0 50 45 4f 46 41 52 47 20 72 65 73 70 65 63 74 69  PEOFARG respecti
180e0 76 65 6c 79 2c 20 74 6f 20 61 76 6f 69 64 20 75  vely, to avoid u
180f0 6e 6e 65 63 65 73 73 61 72 79 20 64 61 74 61 0a  nnecessary data.
18100 20 20 20 20 20 20 20 20 2a 2a 20 6c 6f 61 64 69          ** loadi
18110 6e 67 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ng..        */. 
18120 20 20 20 20 20 20 20 69 66 28 20 28 70 44 65 66         if( (pDef
18130 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 28 53  ->funcFlags & (S
18140 51 4c 49 54 45 5f 46 55 4e 43 5f 4c 45 4e 47 54  QLITE_FUNC_LENGT
18150 48 7c 53 51 4c 49 54 45 5f 46 55 4e 43 5f 54 59  H|SQLITE_FUNC_TY
18160 50 45 4f 46 29 29 21 3d 30 20 29 7b 0a 20 20 20  PEOF))!=0 ){.   
18170 20 20 20 20 20 20 20 75 38 20 65 78 70 72 4f 70         u8 exprOp
18180 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
18190 72 74 28 20 6e 46 61 72 67 3d 3d 31 20 29 3b 0a  rt( nFarg==1 );.
181a0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
181b0 28 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45  ( pFarg->a[0].pE
181c0 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  xpr!=0 );.      
181d0 20 20 20 20 65 78 70 72 4f 70 20 3d 20 70 46 61      exprOp = pFa
181e0 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e  rg->a[0].pExpr->
181f0 6f 70 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  op;.          if
18200 28 20 65 78 70 72 4f 70 3d 3d 54 4b 5f 43 4f 4c  ( exprOp==TK_COL
18210 55 4d 4e 20 7c 7c 20 65 78 70 72 4f 70 3d 3d 54  UMN || exprOp==T
18220 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 7b 0a  K_AGG_COLUMN ){.
18230 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
18240 72 74 28 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f  rt( SQLITE_FUNC_
18250 4c 45 4e 47 54 48 3d 3d 4f 50 46 4c 41 47 5f 4c  LENGTH==OPFLAG_L
18260 45 4e 47 54 48 41 52 47 20 29 3b 0a 20 20 20 20  ENGTHARG );.    
18270 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
18280 53 51 4c 49 54 45 5f 46 55 4e 43 5f 54 59 50 45  SQLITE_FUNC_TYPE
18290 4f 46 3d 3d 4f 50 46 4c 41 47 5f 54 59 50 45 4f  OF==OPFLAG_TYPEO
182a0 46 41 52 47 20 29 3b 0a 20 20 20 20 20 20 20 20  FARG );.        
182b0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 44      testcase( pD
182c0 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20  ef->funcFlags & 
182d0 4f 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41 52 47  OPFLAG_LENGTHARG
182e0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
182f0 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70  pFarg->a[0].pExp
18300 72 2d 3e 6f 70 32 20 3d 20 0a 20 20 20 20 20 20  r->op2 = .      
18310 20 20 20 20 20 20 20 20 20 20 20 20 70 44 65 66              pDef
18320 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 28 4f  ->funcFlags & (O
18330 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41 52 47 7c  PFLAG_LENGTHARG|
18340 4f 50 46 4c 41 47 5f 54 59 50 45 4f 46 41 52 47  OPFLAG_TYPEOFARG
18350 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
18360 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
18370 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
18380 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 20  hePush(pParse); 
18390 20 20 20 20 2f 2a 20 54 69 63 6b 65 74 20 32 65      /* Ticket 2e
183a0 61 32 34 32 35 64 33 34 62 65 20 2a 2f 0a 20 20  a2425d34be */.  
183b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
183c0 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50  rCodeExprList(pP
183d0 61 72 73 65 2c 20 70 46 61 72 67 2c 20 72 31 2c  arse, pFarg, r1,
183e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
183f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18400 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50   SQLITE_ECEL_DUP
18410 7c 53 51 4c 49 54 45 5f 45 43 45 4c 5f 46 41 43  |SQLITE_ECEL_FAC
18420 54 4f 52 29 3b 0a 20 20 20 20 20 20 20 20 73 71  TOR);.        sq
18430 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f  lite3ExprCachePo
18440 70 28 70 50 61 72 73 65 29 3b 20 20 20 20 20 20  p(pParse);      
18450 2f 2a 20 54 69 63 6b 65 74 20 32 65 61 32 34 32  /* Ticket 2ea242
18460 35 64 33 34 62 65 20 2a 2f 0a 20 20 20 20 20 20  5d34be */.      
18470 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
18480 31 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23  1 = 0;.      }.#
18490 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
184a0 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
184b0 20 20 20 20 20 20 2f 2a 20 50 6f 73 73 69 62 6c        /* Possibl
184c0 79 20 6f 76 65 72 6c 6f 61 64 20 74 68 65 20 66  y overload the f
184d0 75 6e 63 74 69 6f 6e 20 69 66 20 74 68 65 20 66  unction if the f
184e0 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73  irst argument is
184f0 0a 20 20 20 20 20 20 2a 2a 20 61 20 76 69 72 74  .      ** a virt
18500 75 61 6c 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e  ual table column
18510 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
18520 20 2a 2a 20 46 6f 72 20 69 6e 66 69 78 20 66 75   ** For infix fu
18530 6e 63 74 69 6f 6e 73 20 28 4c 49 4b 45 2c 20 47  nctions (LIKE, G
18540 4c 4f 42 2c 20 52 45 47 45 58 50 2c 20 61 6e 64  LOB, REGEXP, and
18550 20 4d 41 54 43 48 29 20 75 73 65 20 74 68 65 0a   MATCH) use the.
18560 20 20 20 20 20 20 2a 2a 20 73 65 63 6f 6e 64 20        ** second 
18570 61 72 67 75 6d 65 6e 74 2c 20 6e 6f 74 20 74 68  argument, not th
18580 65 20 66 69 72 73 74 2c 20 61 73 20 74 68 65 20  e first, as the 
18590 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 65 73 74  argument to test
185a0 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 73 65 65   to.      ** see
185b0 20 69 66 20 69 74 20 69 73 20 61 20 63 6f 6c 75   if it is a colu
185c0 6d 6e 20 69 6e 20 61 20 76 69 72 74 75 61 6c 20  mn in a virtual 
185d0 74 61 62 6c 65 2e 20 20 54 68 69 73 20 69 73 20  table.  This is 
185e0 64 6f 6e 65 20 62 65 63 61 75 73 65 0a 20 20 20  done because.   
185f0 20 20 20 2a 2a 20 74 68 65 20 6c 65 66 74 20 6f     ** the left o
18600 70 65 72 61 6e 64 20 6f 66 20 69 6e 66 69 78 20  perand of infix 
18610 66 75 6e 63 74 69 6f 6e 73 20 28 74 68 65 20 6f  functions (the o
18620 70 65 72 61 6e 64 20 77 65 20 77 61 6e 74 20 74  perand we want t
18630 6f 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 72  o.      ** contr
18640 6f 6c 20 6f 76 65 72 6c 6f 61 64 69 6e 67 29 20  ol overloading) 
18650 65 6e 64 73 20 75 70 20 61 73 20 74 68 65 20 73  ends up as the s
18660 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74  econd argument t
18670 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 66  o the.      ** f
18680 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 65 78  unction.  The ex
18690 70 72 65 73 73 69 6f 6e 20 22 41 20 67 6c 6f 62  pression "A glob
186a0 20 42 22 20 69 73 20 65 71 75 69 76 61 6c 65 6e   B" is equivalen
186b0 74 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 22  t to .      ** "
186c0 67 6c 6f 62 28 42 2c 41 29 2e 20 20 57 65 20 77  glob(B,A).  We w
186d0 61 6e 74 20 74 6f 20 75 73 65 20 74 68 65 20 41  ant to use the A
186e0 20 69 6e 20 22 41 20 67 6c 6f 62 20 42 22 20 74   in "A glob B" t
186f0 6f 20 74 65 73 74 0a 20 20 20 20 20 20 2a 2a 20  o test.      ** 
18700 66 6f 72 20 66 75 6e 63 74 69 6f 6e 20 6f 76 65  for function ove
18710 72 6c 6f 61 64 69 6e 67 2e 20 20 42 75 74 20 77  rloading.  But w
18720 65 20 75 73 65 20 74 68 65 20 42 20 74 65 72 6d  e use the B term
18730 20 69 6e 20 22 67 6c 6f 62 28 42 2c 41 29 22 2e   in "glob(B,A)".
18740 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
18750 69 66 28 20 6e 46 61 72 67 3e 3d 32 20 26 26 20  if( nFarg>=2 && 
18760 28 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20  (pExpr->flags & 
18770 45 50 5f 49 6e 66 69 78 46 75 6e 63 29 20 29 7b  EP_InfixFunc) ){
18780 0a 20 20 20 20 20 20 20 20 70 44 65 66 20 3d 20  .        pDef = 
18790 73 71 6c 69 74 65 33 56 74 61 62 4f 76 65 72 6c  sqlite3VtabOverl
187a0 6f 61 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20  oadFunction(db, 
187b0 70 44 65 66 2c 20 6e 46 61 72 67 2c 20 70 46 61  pDef, nFarg, pFa
187c0 72 67 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 29 3b  rg->a[1].pExpr);
187d0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
187e0 20 6e 46 61 72 67 3e 30 20 29 7b 0a 20 20 20 20   nFarg>0 ){.    
187f0 20 20 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74      pDef = sqlit
18800 65 33 56 74 61 62 4f 76 65 72 6c 6f 61 64 46 75  e3VtabOverloadFu
18810 6e 63 74 69 6f 6e 28 64 62 2c 20 70 44 65 66 2c  nction(db, pDef,
18820 20 6e 46 61 72 67 2c 20 70 46 61 72 67 2d 3e 61   nFarg, pFarg->a
18830 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [0].pExpr);.    
18840 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
18850 20 69 66 28 20 70 44 65 66 2d 3e 66 75 6e 63 46   if( pDef->funcF
18860 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55  lags & SQLITE_FU
18870 4e 43 5f 4e 45 45 44 43 4f 4c 4c 20 29 7b 0a 20  NC_NEEDCOLL ){. 
18880 20 20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c         if( !pCol
18890 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e  l ) pColl = db->
188a0 70 44 66 6c 74 43 6f 6c 6c 3b 20 0a 20 20 20 20  pDfltColl; .    
188b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
188c0 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6c 6c  ddOp4(v, OP_Coll
188d0 53 65 71 2c 20 30 2c 20 30 2c 20 30 2c 20 28 63  Seq, 0, 0, 0, (c
188e0 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f  har *)pColl, P4_
188f0 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 20 20  COLLSEQ);.      
18900 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
18910 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
18920 46 75 6e 63 74 69 6f 6e 2c 20 63 6f 6e 73 74 4d  Function, constM
18930 61 73 6b 2c 20 72 31 2c 20 74 61 72 67 65 74 2c  ask, r1, target,
18940 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
18950 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29           (char*)
18960 70 44 65 66 2c 20 50 34 5f 46 55 4e 43 44 45 46  pDef, P4_FUNCDEF
18970 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
18980 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
18990 28 75 38 29 6e 46 61 72 67 29 3b 0a 20 20 20 20  (u8)nFarg);.    
189a0 20 20 69 66 28 20 6e 46 61 72 67 20 26 26 20 63    if( nFarg && c
189b0 6f 6e 73 74 4d 61 73 6b 3d 3d 30 20 29 7b 0a 20  onstMask==0 ){. 
189c0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65         sqlite3Re
189d0 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70  leaseTempRange(p
189e0 50 61 72 73 65 2c 20 72 31 2c 20 6e 46 61 72 67  Parse, r1, nFarg
189f0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
18a00 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69   break;.    }.#i
18a10 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
18a20 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 63  T_SUBQUERY.    c
18a30 61 73 65 20 54 4b 5f 45 58 49 53 54 53 3a 0a 20  ase TK_EXISTS:. 
18a40 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43     case TK_SELEC
18a50 54 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63  T: {.      testc
18a60 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 45 58 49 53  ase( op==TK_EXIS
18a70 54 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  TS );.      test
18a80 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 53 45 4c  case( op==TK_SEL
18a90 45 43 54 20 29 3b 0a 20 20 20 20 20 20 69 6e 52  ECT );.      inR
18aa0 65 67 20 3d 20 73 71 6c 69 74 65 33 43 6f 64 65  eg = sqlite3Code
18ab0 53 75 62 73 65 6c 65 63 74 28 70 50 61 72 73 65  Subselect(pParse
18ac0 2c 20 70 45 78 70 72 2c 20 30 2c 20 30 29 3b 0a  , pExpr, 0, 0);.
18ad0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
18ae0 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49   }.    case TK_I
18af0 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64  N: {.      int d
18b00 65 73 74 49 66 46 61 6c 73 65 20 3d 20 73 71 6c  estIfFalse = sql
18b10 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
18b20 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  l(v);.      int 
18b30 64 65 73 74 49 66 4e 75 6c 6c 20 3d 20 73 71 6c  destIfNull = sql
18b40 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
18b50 6c 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  l(v);.      sqli
18b60 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
18b70 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61 72   OP_Null, 0, tar
18b80 67 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  get);.      sqli
18b90 74 65 33 45 78 70 72 43 6f 64 65 49 4e 28 70 50  te3ExprCodeIN(pP
18ba0 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64 65 73  arse, pExpr, des
18bb0 74 49 66 46 61 6c 73 65 2c 20 64 65 73 74 49 66  tIfFalse, destIf
18bc0 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c  Null);.      sql
18bd0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
18be0 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c  , OP_Integer, 1,
18bf0 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
18c00 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
18c10 76 65 4c 61 62 65 6c 28 76 2c 20 64 65 73 74 49  veLabel(v, destI
18c20 66 46 61 6c 73 65 29 3b 0a 20 20 20 20 20 20 73  fFalse);.      s
18c30 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
18c40 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 74  (v, OP_AddImm, t
18c50 61 72 67 65 74 2c 20 30 29 3b 0a 20 20 20 20 20  arget, 0);.     
18c60 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
18c70 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 65 73 74  lveLabel(v, dest
18c80 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62  IfNull);.      b
18c90 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
18ca0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
18cb0 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 0a  T_SUBQUERY */...
18cc0 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 20      /*.    **   
18cd0 20 78 20 42 45 54 57 45 45 4e 20 79 20 41 4e 44   x BETWEEN y AND
18ce0 20 7a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a   z.    **.    **
18cf0 20 54 68 69 73 20 69 73 20 65 71 75 69 76 61 6c   This is equival
18d00 65 6e 74 20 74 6f 0a 20 20 20 20 2a 2a 0a 20 20  ent to.    **.  
18d10 20 20 2a 2a 20 20 20 20 78 3e 3d 79 20 41 4e 44    **    x>=y AND
18d20 20 78 3c 3d 7a 0a 20 20 20 20 2a 2a 0a 20 20 20   x<=z.    **.   
18d30 20 2a 2a 20 58 20 69 73 20 73 74 6f 72 65 64 20   ** X is stored 
18d40 69 6e 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2e  in pExpr->pLeft.
18d50 0a 20 20 20 20 2a 2a 20 59 20 69 73 20 73 74 6f  .    ** Y is sto
18d60 72 65 64 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c  red in pExpr->pL
18d70 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2e  ist->a[0].pExpr.
18d80 0a 20 20 20 20 2a 2a 20 5a 20 69 73 20 73 74 6f  .    ** Z is sto
18d90 72 65 64 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c  red in pExpr->pL
18da0 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 2e  ist->a[1].pExpr.
18db0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
18dc0 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20   TK_BETWEEN: {. 
18dd0 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74       Expr *pLeft
18de0 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b   = pExpr->pLeft;
18df0 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78  .      struct Ex
18e00 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4c 49  prList_item *pLI
18e10 74 65 6d 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  tem = pExpr->x.p
18e20 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20 45  List->a;.      E
18e30 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70 4c  xpr *pRight = pL
18e40 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 0a 20 20  Item->pExpr;..  
18e50 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
18e60 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
18e70 72 73 65 2c 20 70 4c 65 66 74 2c 20 26 72 65 67  rse, pLeft, &reg
18e80 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32  Free1);.      r2
18e90 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
18ea0 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
18eb0 52 69 67 68 74 2c 20 26 72 65 67 46 72 65 65 32  Right, &regFree2
18ec0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
18ed0 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  e( regFree1==0 )
18ee0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
18ef0 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b  ( regFree2==0 );
18f00 0a 20 20 20 20 20 20 72 33 20 3d 20 73 71 6c 69  .      r3 = sqli
18f10 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
18f20 61 72 73 65 29 3b 0a 20 20 20 20 20 20 72 34 20  arse);.      r4 
18f30 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
18f40 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
18f50 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70     codeCompare(p
18f60 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 52  Parse, pLeft, pR
18f70 69 67 68 74 2c 20 4f 50 5f 47 65 2c 0a 20 20 20  ight, OP_Ge,.   
18f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
18f90 31 2c 20 72 32 2c 20 72 33 2c 20 53 51 4c 49 54  1, r2, r3, SQLIT
18fa0 45 5f 53 54 4f 52 45 50 32 29 3b 20 20 56 64 62  E_STOREP2);  Vdb
18fb0 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
18fc0 20 20 20 20 70 4c 49 74 65 6d 2b 2b 3b 0a 20 20      pLItem++;.  
18fd0 20 20 20 20 70 52 69 67 68 74 20 3d 20 70 4c 49      pRight = pLI
18fe0 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  tem->pExpr;.    
18ff0 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
19000 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
19010 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20  regFree2);.     
19020 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r2 = sqlite3Exp
19030 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
19040 2c 20 70 52 69 67 68 74 2c 20 26 72 65 67 46 72  , pRight, &regFr
19050 65 65 32 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ee2);.      test
19060 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d  case( regFree2==
19070 30 20 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43  0 );.      codeC
19080 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70  ompare(pParse, p
19090 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20 4f 50  Left, pRight, OP
190a0 5f 4c 65 2c 20 72 31 2c 20 72 32 2c 20 72 34 2c  _Le, r1, r2, r4,
190b0 20 53 51 4c 49 54 45 5f 53 54 4f 52 45 50 32 29   SQLITE_STOREP2)
190c0 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
190d0 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 73  rage(v);.      s
190e0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
190f0 28 76 2c 20 4f 50 5f 41 6e 64 2c 20 72 33 2c 20  (v, OP_And, r3, 
19100 72 34 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  r4, target);.   
19110 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
19120 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
19130 20 72 33 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   r3);.      sqli
19140 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
19150 67 28 70 50 61 72 73 65 2c 20 72 34 29 3b 0a 20  g(pParse, r4);. 
19160 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
19170 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  }.    case TK_CO
19180 4c 4c 41 54 45 3a 20 0a 20 20 20 20 63 61 73 65  LLATE: .    case
19190 20 54 4b 5f 55 50 4c 55 53 3a 20 7b 0a 20 20 20   TK_UPLUS: {.   
191a0 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74     inReg = sqlit
191b0 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74  e3ExprCodeTarget
191c0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
191d0 70 4c 65 66 74 2c 20 74 61 72 67 65 74 29 3b 0a  pLeft, target);.
191e0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
191f0 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   }..    case TK_
19200 54 52 49 47 47 45 52 3a 20 7b 0a 20 20 20 20 20  TRIGGER: {.     
19210 20 2f 2a 20 49 66 20 74 68 65 20 6f 70 63 6f 64   /* If the opcod
19220 65 20 69 73 20 54 4b 5f 54 52 49 47 47 45 52 2c  e is TK_TRIGGER,
19230 20 74 68 65 6e 20 74 68 65 20 65 78 70 72 65 73   then the expres
19240 73 69 6f 6e 20 69 73 20 61 20 72 65 66 65 72 65  sion is a refere
19250 6e 63 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  nce.      ** to 
19260 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20  a column in the 
19270 6e 65 77 2e 2a 20 6f 72 20 6f 6c 64 2e 2a 20 70  new.* or old.* p
19280 73 65 75 64 6f 2d 74 61 62 6c 65 73 20 61 76 61  seudo-tables ava
19290 69 6c 61 62 6c 65 20 74 6f 0a 20 20 20 20 20 20  ilable to.      
192a0 2a 2a 20 74 72 69 67 67 65 72 20 70 72 6f 67 72  ** trigger progr
192b0 61 6d 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ams. In this cas
192c0 65 20 45 78 70 72 2e 69 54 61 62 6c 65 20 69 73  e Expr.iTable is
192d0 20 73 65 74 20 74 6f 20 31 20 66 6f 72 20 74 68   set to 1 for th
192e0 65 0a 20 20 20 20 20 20 2a 2a 20 6e 65 77 2e 2a  e.      ** new.*
192f0 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2c 20 6f   pseudo-table, o
19300 72 20 30 20 66 6f 72 20 74 68 65 20 6f 6c 64 2e  r 0 for the old.
19310 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2e 20  * pseudo-table. 
19320 45 78 70 72 2e 69 43 6f 6c 75 6d 6e 0a 20 20 20  Expr.iColumn.   
19330 20 20 20 2a 2a 20 69 73 20 73 65 74 20 74 6f 20     ** is set to 
19340 74 68 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  the column of th
19350 65 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 20 74  e pseudo-table t
19360 6f 20 72 65 61 64 2c 20 6f 72 20 74 6f 20 2d 31  o read, or to -1
19370 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 72 65 61   to.      ** rea
19380 64 20 74 68 65 20 72 6f 77 69 64 20 66 69 65 6c  d the rowid fiel
19390 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  d..      **.    
193a0 20 20 2a 2a 20 54 68 65 20 65 78 70 72 65 73 73    ** The express
193b0 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74  ion is implement
193c0 65 64 20 75 73 69 6e 67 20 61 6e 20 4f 50 5f 50  ed using an OP_P
193d0 61 72 61 6d 20 6f 70 63 6f 64 65 2e 20 54 68 65  aram opcode. The
193e0 20 70 31 0a 20 20 20 20 20 20 2a 2a 20 70 61 72   p1.      ** par
193f0 61 6d 65 74 65 72 20 69 73 20 73 65 74 20 74 6f  ameter is set to
19400 20 30 20 66 6f 72 20 61 6e 20 6f 6c 64 2e 72 6f   0 for an old.ro
19410 77 69 64 20 72 65 66 65 72 65 6e 63 65 2c 20 6f  wid reference, o
19420 72 20 74 6f 20 28 69 2b 31 29 0a 20 20 20 20 20  r to (i+1).     
19430 20 2a 2a 20 74 6f 20 72 65 66 65 72 65 6e 63 65   ** to reference
19440 20 61 6e 6f 74 68 65 72 20 63 6f 6c 75 6d 6e 20   another column 
19450 6f 66 20 74 68 65 20 6f 6c 64 2e 2a 20 70 73 65  of the old.* pse
19460 75 64 6f 2d 74 61 62 6c 65 2c 20 77 68 65 72 65  udo-table, where
19470 20 0a 20 20 20 20 20 20 2a 2a 20 69 20 69 73 20   .      ** i is 
19480 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  the index of the
19490 20 63 6f 6c 75 6d 6e 2e 20 46 6f 72 20 61 20 6e   column. For a n
194a0 65 77 2e 72 6f 77 69 64 20 72 65 66 65 72 65 6e  ew.rowid referen
194b0 63 65 2c 20 70 31 20 69 73 0a 20 20 20 20 20 20  ce, p1 is.      
194c0 2a 2a 20 73 65 74 20 74 6f 20 28 6e 2b 31 29 2c  ** set to (n+1),
194d0 20 77 68 65 72 65 20 6e 20 69 73 20 74 68 65 20   where n is the 
194e0 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  number of column
194f0 73 20 69 6e 20 65 61 63 68 20 70 73 65 75 64 6f  s in each pseudo
19500 2d 74 61 62 6c 65 2e 0a 20 20 20 20 20 20 2a 2a  -table..      **
19510 20 46 6f 72 20 61 20 72 65 66 65 72 65 6e 63 65   For a reference
19520 20 74 6f 20 61 6e 79 20 6f 74 68 65 72 20 63 6f   to any other co
19530 6c 75 6d 6e 20 69 6e 20 74 68 65 20 6e 65 77 2e  lumn in the new.
19540 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2c 20  * pseudo-table, 
19550 70 31 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73  p1.      ** is s
19560 65 74 20 74 6f 20 28 6e 2b 32 2b 69 29 2c 20 77  et to (n+2+i), w
19570 68 65 72 65 20 6e 20 61 6e 64 20 69 20 61 72 65  here n and i are
19580 20 61 73 20 64 65 66 69 6e 65 64 20 70 72 65 76   as defined prev
19590 69 6f 75 73 6c 79 2e 20 46 6f 72 0a 20 20 20 20  iously. For.    
195a0 20 20 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 69 66    ** example, if
195b0 20 74 68 65 20 74 61 62 6c 65 20 6f 6e 20 77 68   the table on wh
195c0 69 63 68 20 74 72 69 67 67 65 72 73 20 61 72 65  ich triggers are
195d0 20 62 65 69 6e 67 20 66 69 72 65 64 20 69 73 0a   being fired is.
195e0 20 20 20 20 20 20 2a 2a 20 64 65 63 6c 61 72 65        ** declare
195f0 64 20 61 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20  d as:.      **. 
19600 20 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45       **   CREATE
19610 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b   TABLE t1(a, b);
19620 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
19630 2a 2a 20 54 68 65 6e 20 70 31 20 69 73 20 69 6e  ** Then p1 is in
19640 74 65 72 70 72 65 74 65 64 20 61 73 20 66 6f 6c  terpreted as fol
19650 6c 6f 77 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20  lows:.      **. 
19660 20 20 20 20 20 2a 2a 20 20 20 70 31 3d 3d 30 20       **   p1==0 
19670 20 20 2d 3e 20 20 20 20 6f 6c 64 2e 72 6f 77 69    ->    old.rowi
19680 64 20 20 20 20 20 70 31 3d 3d 33 20 20 20 2d 3e  d     p1==3   ->
19690 20 20 20 20 6e 65 77 2e 72 6f 77 69 64 0a 20 20      new.rowid.  
196a0 20 20 20 20 2a 2a 20 20 20 70 31 3d 3d 31 20 20      **   p1==1  
196b0 20 2d 3e 20 20 20 20 6f 6c 64 2e 61 20 20 20 20   ->    old.a    
196c0 20 20 20 20 20 70 31 3d 3d 34 20 20 20 2d 3e 20       p1==4   -> 
196d0 20 20 20 6e 65 77 2e 61 0a 20 20 20 20 20 20 2a     new.a.      *
196e0 2a 20 20 20 70 31 3d 3d 32 20 20 20 2d 3e 20 20  *   p1==2   ->  
196f0 20 20 6f 6c 64 2e 62 20 20 20 20 20 20 20 20 20    old.b         
19700 70 31 3d 3d 35 20 20 20 2d 3e 20 20 20 20 6e 65  p1==5   ->    ne
19710 77 2e 62 20 20 20 20 20 20 20 0a 20 20 20 20 20  w.b       .     
19720 20 2a 2f 0a 20 20 20 20 20 20 54 61 62 6c 65 20   */.      Table 
19730 2a 70 54 61 62 20 3d 20 70 45 78 70 72 2d 3e 70  *pTab = pExpr->p
19740 54 61 62 3b 0a 20 20 20 20 20 20 69 6e 74 20 70  Tab;.      int p
19750 31 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  1 = pExpr->iTabl
19760 65 20 2a 20 28 70 54 61 62 2d 3e 6e 43 6f 6c 2b  e * (pTab->nCol+
19770 31 29 20 2b 20 31 20 2b 20 70 45 78 70 72 2d 3e  1) + 1 + pExpr->
19780 69 43 6f 6c 75 6d 6e 3b 0a 0a 20 20 20 20 20 20  iColumn;..      
19790 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 69  assert( pExpr->i
197a0 54 61 62 6c 65 3d 3d 30 20 7c 7c 20 70 45 78 70  Table==0 || pExp
197b0 72 2d 3e 69 54 61 62 6c 65 3d 3d 31 20 29 3b 0a  r->iTable==1 );.
197c0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
197d0 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 2d 31  xpr->iColumn>=-1
197e0 20 26 26 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75   && pExpr->iColu
197f0 6d 6e 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b  mn<pTab->nCol );
19800 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
19810 54 61 62 2d 3e 69 50 4b 65 79 3c 30 20 7c 7c 20  Tab->iPKey<0 || 
19820 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 21 3d  pExpr->iColumn!=
19830 70 54 61 62 2d 3e 69 50 4b 65 79 20 29 3b 0a 20  pTab->iPKey );. 
19840 20 20 20 20 20 61 73 73 65 72 74 28 20 70 31 3e       assert( p1>
19850 3d 30 20 26 26 20 70 31 3c 28 70 54 61 62 2d 3e  =0 && p1<(pTab->
19860 6e 43 6f 6c 2a 32 2b 32 29 20 29 3b 0a 0a 20 20  nCol*2+2) );..  
19870 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
19880 64 64 4f 70 32 28 76 2c 20 4f 50 5f 50 61 72 61  ddOp2(v, OP_Para
19890 6d 2c 20 70 31 2c 20 74 61 72 67 65 74 29 3b 0a  m, p1, target);.
198a0 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
198b0 74 28 28 76 2c 20 22 25 73 2e 25 73 20 2d 3e 20  t((v, "%s.%s -> 
198c0 24 25 64 22 2c 0a 20 20 20 20 20 20 20 20 28 70  $%d",.        (p
198d0 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3f 20 22  Expr->iTable ? "
198e0 6e 65 77 22 20 3a 20 22 6f 6c 64 22 29 2c 0a 20  new" : "old"),. 
198f0 20 20 20 20 20 20 20 28 70 45 78 70 72 2d 3e 69         (pExpr->i
19900 43 6f 6c 75 6d 6e 3c 30 20 3f 20 22 72 6f 77 69  Column<0 ? "rowi
19910 64 22 20 3a 20 70 45 78 70 72 2d 3e 70 54 61 62  d" : pExpr->pTab
19920 2d 3e 61 43 6f 6c 5b 70 45 78 70 72 2d 3e 69 43  ->aCol[pExpr->iC
19930 6f 6c 75 6d 6e 5d 2e 7a 4e 61 6d 65 29 2c 0a 20  olumn].zName),. 
19940 20 20 20 20 20 20 20 74 61 72 67 65 74 0a 20 20         target.  
19950 20 20 20 20 29 29 3b 0a 0a 23 69 66 6e 64 65 66      ));..#ifndef
19960 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f   SQLITE_OMIT_FLO
19970 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20  ATING_POINT.    
19980 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c 75    /* If the colu
19990 6d 6e 20 68 61 73 20 52 45 41 4c 20 61 66 66 69  mn has REAL affi
199a0 6e 69 74 79 2c 20 69 74 20 6d 61 79 20 63 75 72  nity, it may cur
199b0 72 65 6e 74 6c 79 20 62 65 20 73 74 6f 72 65 64  rently be stored
199c0 20 61 73 20 61 6e 0a 20 20 20 20 20 20 2a 2a 20   as an.      ** 
199d0 69 6e 74 65 67 65 72 2e 20 55 73 65 20 4f 50 5f  integer. Use OP_
199e0 52 65 61 6c 41 66 66 69 6e 69 74 79 20 74 6f 20  RealAffinity to 
199f0 6d 61 6b 65 20 73 75 72 65 20 69 74 20 69 73 20  make sure it is 
19a00 72 65 61 6c 6c 79 20 72 65 61 6c 2e 0a 20 20 20  really real..   
19a10 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 45     **.      ** E
19a20 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 36 30  VIDENCE-OF: R-60
19a30 39 38 35 2d 35 37 36 36 32 20 53 51 4c 69 74 65  985-57662 SQLite
19a40 20 77 69 6c 6c 20 63 6f 6e 76 65 72 74 20 74 68   will convert th
19a50 65 20 76 61 6c 75 65 20 62 61 63 6b 20 74 6f 0a  e value back to.
19a60 20 20 20 20 20 20 2a 2a 20 66 6c 6f 61 74 69 6e        ** floatin
19a70 67 20 70 6f 69 6e 74 20 77 68 65 6e 20 65 78 74  g point when ext
19a80 72 61 63 74 69 6e 67 20 69 74 20 66 72 6f 6d 20  racting it from 
19a90 74 68 65 20 72 65 63 6f 72 64 2e 20 20 2a 2f 0a  the record.  */.
19aa0 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
19ab0 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20 0a 20 20 20  >iColumn>=0 .   
19ac0 20 20 20 20 26 26 20 70 54 61 62 2d 3e 61 43 6f      && pTab->aCo
19ad0 6c 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  l[pExpr->iColumn
19ae0 5d 2e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49  ].affinity==SQLI
19af0 54 45 5f 41 46 46 5f 52 45 41 4c 0a 20 20 20 20  TE_AFF_REAL.    
19b00 20 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c    ){.        sql
19b10 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
19b20 2c 20 4f 50 5f 52 65 61 6c 41 66 66 69 6e 69 74  , OP_RealAffinit
19b30 79 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  y, target);.    
19b40 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
19b50 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 0a   break;.    }...
19b60 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 46 6f      /*.    ** Fo
19b70 72 6d 20 41 3a 0a 20 20 20 20 2a 2a 20 20 20 43  rm A:.    **   C
19b80 41 53 45 20 78 20 57 48 45 4e 20 65 31 20 54 48  ASE x WHEN e1 TH
19b90 45 4e 20 72 31 20 57 48 45 4e 20 65 32 20 54 48  EN r1 WHEN e2 TH
19ba0 45 4e 20 72 32 20 2e 2e 2e 20 57 48 45 4e 20 65  EN r2 ... WHEN e
19bb0 4e 20 54 48 45 4e 20 72 4e 20 45 4c 53 45 20 79  N THEN rN ELSE y
19bc0 20 45 4e 44 0a 20 20 20 20 2a 2a 0a 20 20 20 20   END.    **.    
19bd0 2a 2a 20 46 6f 72 6d 20 42 3a 0a 20 20 20 20 2a  ** Form B:.    *
19be0 2a 20 20 20 43 41 53 45 20 57 48 45 4e 20 65 31  *   CASE WHEN e1
19bf0 20 54 48 45 4e 20 72 31 20 57 48 45 4e 20 65 32   THEN r1 WHEN e2
19c00 20 54 48 45 4e 20 72 32 20 2e 2e 2e 20 57 48 45   THEN r2 ... WHE
19c10 4e 20 65 4e 20 54 48 45 4e 20 72 4e 20 45 4c 53  N eN THEN rN ELS
19c20 45 20 79 20 45 4e 44 0a 20 20 20 20 2a 2a 0a 20  E y END.    **. 
19c30 20 20 20 2a 2a 20 46 6f 72 6d 20 41 20 69 73 20     ** Form A is 
19c40 63 61 6e 20 62 65 20 74 72 61 6e 73 66 6f 72 6d  can be transform
19c50 65 64 20 69 6e 74 6f 20 74 68 65 20 65 71 75 69  ed into the equi
19c60 76 61 6c 65 6e 74 20 66 6f 72 6d 20 42 20 61 73  valent form B as
19c70 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20 2a 2a   follows:.    **
19c80 20 20 20 43 41 53 45 20 57 48 45 4e 20 78 3d 65     CASE WHEN x=e
19c90 31 20 54 48 45 4e 20 72 31 20 57 48 45 4e 20 78  1 THEN r1 WHEN x
19ca0 3d 65 32 20 54 48 45 4e 20 72 32 20 2e 2e 2e 0a  =e2 THEN r2 ....
19cb0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 57 48      **        WH
19cc0 45 4e 20 78 3d 65 4e 20 54 48 45 4e 20 72 4e 20  EN x=eN THEN rN 
19cd0 45 4c 53 45 20 79 20 45 4e 44 0a 20 20 20 20 2a  ELSE y END.    *
19ce0 2a 0a 20 20 20 20 2a 2a 20 58 20 28 69 66 20 69  *.    ** X (if i
19cf0 74 20 65 78 69 73 74 73 29 20 69 73 20 69 6e 20  t exists) is in 
19d00 70 45 78 70 72 2d 3e 70 4c 65 66 74 2e 0a 20 20  pExpr->pLeft..  
19d10 20 20 2a 2a 20 59 20 69 73 20 69 6e 20 74 68 65    ** Y is in the
19d20 20 6c 61 73 74 20 65 6c 65 6d 65 6e 74 20 6f 66   last element of
19d30 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20   pExpr->x.pList 
19d40 69 66 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73  if pExpr->x.pLis
19d50 74 2d 3e 6e 45 78 70 72 20 69 73 0a 20 20 20 20  t->nExpr is.    
19d60 2a 2a 20 6f 64 64 2e 20 20 54 68 65 20 59 20 69  ** odd.  The Y i
19d70 73 20 61 6c 73 6f 20 6f 70 74 69 6f 6e 61 6c 2e  s also optional.
19d80 20 20 49 66 20 74 68 65 20 6e 75 6d 62 65 72 20    If the number 
19d90 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 78  of elements in x
19da0 2e 70 4c 69 73 74 0a 20 20 20 20 2a 2a 20 69 73  .pList.    ** is
19db0 20 65 76 65 6e 2c 20 74 68 65 6e 20 59 20 69 73   even, then Y is
19dc0 20 6f 6d 69 74 74 65 64 20 61 6e 64 20 74 68 65   omitted and the
19dd0 20 22 6f 74 68 65 72 77 69 73 65 22 20 72 65 73   "otherwise" res
19de0 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 0a 20 20 20  ult is NULL..   
19df0 20 2a 2a 20 45 69 20 69 73 20 69 6e 20 70 45 78   ** Ei is in pEx
19e00 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 2a 32  pr->pList->a[i*2
19e10 5d 20 61 6e 64 20 52 69 20 69 73 20 70 45 78 70  ] and Ri is pExp
19e20 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 2a 32 2b  r->pList->a[i*2+
19e30 31 5d 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  1]..    **.    *
19e40 2a 20 54 68 65 20 72 65 73 75 6c 74 20 6f 66 20  * The result of 
19e50 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
19e60 73 20 74 68 65 20 52 69 20 66 6f 72 20 74 68 65  s the Ri for the
19e70 20 66 69 72 73 74 20 6d 61 74 63 68 69 6e 67 20   first matching 
19e80 45 69 2c 0a 20 20 20 20 2a 2a 20 6f 72 20 69 66  Ei,.    ** or if
19e90 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 61 74   there is no mat
19ea0 63 68 69 6e 67 20 45 69 2c 20 74 68 65 20 45 4c  ching Ei, the EL
19eb0 53 45 20 74 65 72 6d 20 59 2c 20 6f 72 20 69 66  SE term Y, or if
19ec0 20 74 68 65 72 65 20 69 73 0a 20 20 20 20 2a 2a   there is.    **
19ed0 20 6e 6f 20 45 4c 53 45 20 74 65 72 6d 2c 20 4e   no ELSE term, N
19ee0 55 4c 4c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ULL..    */.    
19ef0 64 65 66 61 75 6c 74 3a 20 61 73 73 65 72 74 28  default: assert(
19f00 20 6f 70 3d 3d 54 4b 5f 43 41 53 45 20 29 3b 20   op==TK_CASE ); 
19f10 7b 0a 20 20 20 20 20 20 69 6e 74 20 65 6e 64 4c  {.      int endL
19f20 61 62 65 6c 3b 20 20 20 20 20 20 20 20 20 20 20  abel;           
19f30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 4f 54            /* GOT
19f40 4f 20 6c 61 62 65 6c 20 66 6f 72 20 65 6e 64 20  O label for end 
19f50 6f 66 20 43 41 53 45 20 73 74 6d 74 20 2a 2f 0a  of CASE stmt */.
19f60 20 20 20 20 20 20 69 6e 74 20 6e 65 78 74 43 61        int nextCa
19f70 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  se;             
19f80 20 20 20 20 20 20 20 20 2f 2a 20 47 4f 54 4f 20          /* GOTO 
19f90 6c 61 62 65 6c 20 66 6f 72 20 6e 65 78 74 20 57  label for next W
19fa0 48 45 4e 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  HEN clause */.  
19fb0 20 20 20 20 69 6e 74 20 6e 45 78 70 72 3b 20 20      int nExpr;  
19fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19fd0 20 20 20 20 20 20 2f 2a 20 32 78 20 6e 75 6d 62        /* 2x numb
19fe0 65 72 20 6f 66 20 57 48 45 4e 20 74 65 72 6d 73  er of WHEN terms
19ff0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 3b   */.      int i;
1a000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a010 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
1a020 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
1a030 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70       ExprList *p
1a040 45 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20  EList;          
1a050 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f         /* List o
1a060 66 20 57 48 45 4e 20 74 65 72 6d 73 20 2a 2f 0a  f WHEN terms */.
1a070 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70        struct Exp
1a080 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 4c 69 73  rList_item *aLis
1a090 74 65 6c 65 6d 3b 20 20 2f 2a 20 41 72 72 61 79  telem;  /* Array
1a0a0 20 6f 66 20 57 48 45 4e 20 74 65 72 6d 73 20 2a   of WHEN terms *
1a0b0 2f 0a 20 20 20 20 20 20 45 78 70 72 20 6f 70 43  /.      Expr opC
1a0c0 6f 6d 70 61 72 65 3b 20 20 20 20 20 20 20 20 20  ompare;         
1a0d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1a0e0 20 58 3d 3d 45 69 20 65 78 70 72 65 73 73 69 6f   X==Ei expressio
1a0f0 6e 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20  n */.      Expr 
1a100 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20 20 20  *pX;            
1a110 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a120 54 68 65 20 58 20 65 78 70 72 65 73 73 69 6f 6e  The X expression
1a130 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a   */.      Expr *
1a140 70 54 65 73 74 20 3d 20 30 3b 20 20 20 20 20 20  pTest = 0;      
1a150 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 58              /* X
1a160 3d 3d 45 69 20 28 66 6f 72 6d 20 41 29 20 6f 72  ==Ei (form A) or
1a170 20 6a 75 73 74 20 45 69 20 28 66 6f 72 6d 20 42   just Ei (form B
1a180 29 20 2a 2f 0a 20 20 20 20 20 20 56 56 41 5f 4f  ) */.      VVA_O
1a190 4e 4c 59 28 20 69 6e 74 20 69 43 61 63 68 65 4c  NLY( int iCacheL
1a1a0 65 76 65 6c 20 3d 20 70 50 61 72 73 65 2d 3e 69  evel = pParse->i
1a1b0 43 61 63 68 65 4c 65 76 65 6c 3b 20 29 0a 0a 20  CacheLevel; ).. 
1a1c0 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
1a1d0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
1a1e0 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  xpr, EP_xIsSelec
1a1f0 74 29 20 26 26 20 70 45 78 70 72 2d 3e 78 2e 70  t) && pExpr->x.p
1a200 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20 61 73  List );.      as
1a210 73 65 72 74 28 70 45 78 70 72 2d 3e 78 2e 70 4c  sert(pExpr->x.pL
1a220 69 73 74 2d 3e 6e 45 78 70 72 20 3e 20 30 29 3b  ist->nExpr > 0);
1a230 0a 20 20 20 20 20 20 70 45 4c 69 73 74 20 3d 20  .      pEList = 
1a240 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a  pExpr->x.pList;.
1a250 20 20 20 20 20 20 61 4c 69 73 74 65 6c 65 6d 20        aListelem 
1a260 3d 20 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 20  = pEList->a;.   
1a270 20 20 20 6e 45 78 70 72 20 3d 20 70 45 4c 69 73     nExpr = pELis
1a280 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20  t->nExpr;.      
1a290 65 6e 64 4c 61 62 65 6c 20 3d 20 73 71 6c 69 74  endLabel = sqlit
1a2a0 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
1a2b0 76 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70  v);.      if( (p
1a2c0 58 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  X = pExpr->pLeft
1a2d0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
1a2e0 74 65 6d 70 58 20 3d 20 2a 70 58 3b 0a 20 20 20  tempX = *pX;.   
1a2f0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
1a300 58 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  X->op==TK_COLUMN
1a310 20 29 3b 0a 20 20 20 20 20 20 20 20 65 78 70 72   );.        expr
1a320 54 6f 52 65 67 69 73 74 65 72 28 26 74 65 6d 70  ToRegister(&temp
1a330 58 2c 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  X, sqlite3ExprCo
1a340 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
1a350 58 2c 20 26 72 65 67 46 72 65 65 31 29 29 3b 0a  X, &regFree1));.
1a360 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
1a370 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  ( regFree1==0 );
1a380 0a 20 20 20 20 20 20 20 20 6f 70 43 6f 6d 70 61  .        opCompa
1a390 72 65 2e 6f 70 20 3d 20 54 4b 5f 45 51 3b 0a 20  re.op = TK_EQ;. 
1a3a0 20 20 20 20 20 20 20 6f 70 43 6f 6d 70 61 72 65         opCompare
1a3b0 2e 70 4c 65 66 74 20 3d 20 26 74 65 6d 70 58 3b  .pLeft = &tempX;
1a3c0 0a 20 20 20 20 20 20 20 20 70 54 65 73 74 20 3d  .        pTest =
1a3d0 20 26 6f 70 43 6f 6d 70 61 72 65 3b 0a 20 20 20   &opCompare;.   
1a3e0 20 20 20 20 20 2f 2a 20 54 69 63 6b 65 74 20 62       /* Ticket b
1a3f0 33 35 31 64 39 35 66 39 63 64 35 65 66 31 37 65  351d95f9cd5ef17e
1a400 39 64 39 64 62 61 65 31 38 66 35 63 61 38 36 31  9d9dbae18f5ca861
1a410 31 31 39 30 30 30 31 3a 0a 20 20 20 20 20 20 20  1190001:.       
1a420 20 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 69 6e   ** The value in
1a430 20 72 65 67 46 72 65 65 31 20 6d 69 67 68 74 20   regFree1 might 
1a440 67 65 74 20 53 43 6f 70 79 2d 65 64 20 69 6e 74  get SCopy-ed int
1a450 6f 20 74 68 65 20 66 69 6c 65 20 72 65 73 75 6c  o the file resul
1a460 74 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 6f  t..        ** So
1a470 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
1a480 74 68 65 20 72 65 67 46 72 65 65 31 20 72 65 67  the regFree1 reg
1a490 69 73 74 65 72 20 69 73 20 6e 6f 74 20 72 65 75  ister is not reu
1a4a0 73 65 64 20 66 6f 72 20 6f 74 68 65 72 0a 20 20  sed for other.  
1a4b0 20 20 20 20 20 20 2a 2a 20 70 75 72 70 6f 73 65        ** purpose
1a4c0 73 20 61 6e 64 20 70 6f 73 73 69 62 6c 79 20 6f  s and possibly o
1a4d0 76 65 72 77 72 69 74 74 65 6e 2e 20 20 2a 2f 0a  verwritten.  */.
1a4e0 20 20 20 20 20 20 20 20 72 65 67 46 72 65 65 31          regFree1
1a4f0 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
1a500 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
1a510 45 78 70 72 2d 31 3b 20 69 3d 69 2b 32 29 7b 0a  Expr-1; i=i+2){.
1a520 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1a530 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61  xprCachePush(pPa
1a540 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  rse);.        if
1a550 28 20 70 58 20 29 7b 0a 20 20 20 20 20 20 20 20  ( pX ){.        
1a560 20 20 61 73 73 65 72 74 28 20 70 54 65 73 74 21    assert( pTest!
1a570 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  =0 );.          
1a580 6f 70 43 6f 6d 70 61 72 65 2e 70 52 69 67 68 74  opCompare.pRight
1a590 20 3d 20 61 4c 69 73 74 65 6c 65 6d 5b 69 5d 2e   = aListelem[i].
1a5a0 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 7d  pExpr;.        }
1a5b0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1a5c0 70 54 65 73 74 20 3d 20 61 4c 69 73 74 65 6c 65  pTest = aListele
1a5d0 6d 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  m[i].pExpr;.    
1a5e0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6e 65      }.        ne
1a5f0 78 74 43 61 73 65 20 3d 20 73 71 6c 69 74 65 33  xtCase = sqlite3
1a600 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
1a610 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
1a620 73 65 28 20 70 54 65 73 74 2d 3e 6f 70 3d 3d 54  se( pTest->op==T
1a630 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20  K_COLUMN );.    
1a640 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
1a650 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
1a660 54 65 73 74 2c 20 6e 65 78 74 43 61 73 65 2c 20  Test, nextCase, 
1a670 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
1a680 4c 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  L);.        test
1a690 63 61 73 65 28 20 61 4c 69 73 74 65 6c 65 6d 5b  case( aListelem[
1a6a0 69 2b 31 5d 2e 70 45 78 70 72 2d 3e 6f 70 3d 3d  i+1].pExpr->op==
1a6b0 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20  TK_COLUMN );.   
1a6c0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1a6d0 43 6f 64 65 28 70 50 61 72 73 65 2c 20 61 4c 69  Code(pParse, aLi
1a6e0 73 74 65 6c 65 6d 5b 69 2b 31 5d 2e 70 45 78 70  stelem[i+1].pExp
1a6f0 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  r, target);.    
1a700 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1a710 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
1a720 2c 20 30 2c 20 65 6e 64 4c 61 62 65 6c 29 3b 0a  , 0, endLabel);.
1a730 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1a740 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72  xprCachePop(pPar
1a750 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  se);.        sql
1a760 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
1a770 61 62 65 6c 28 76 2c 20 6e 65 78 74 43 61 73 65  abel(v, nextCase
1a780 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1a790 20 69 66 28 20 28 6e 45 78 70 72 26 31 29 21 3d   if( (nExpr&1)!=
1a7a0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
1a7b0 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73  ite3ExprCachePus
1a7c0 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  h(pParse);.     
1a7d0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
1a7e0 64 65 28 70 50 61 72 73 65 2c 20 70 45 4c 69 73  de(pParse, pELis
1a7f0 74 2d 3e 61 5b 6e 45 78 70 72 2d 31 5d 2e 70 45  t->a[nExpr-1].pE
1a800 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  xpr, target);.  
1a810 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1a820 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65  rCachePop(pParse
1a830 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
1a840 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
1a850 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1a860 4e 75 6c 6c 2c 20 30 2c 20 74 61 72 67 65 74 29  Null, 0, target)
1a870 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1a880 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c  assert( db->mall
1a890 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70 50 61 72  ocFailed || pPar
1a8a0 73 65 2d 3e 6e 45 72 72 3e 30 20 0a 20 20 20 20  se->nErr>0 .    
1a8b0 20 20 20 20 20 20 20 7c 7c 20 70 50 61 72 73 65         || pParse
1a8c0 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 3d 3d 69  ->iCacheLevel==i
1a8d0 43 61 63 68 65 4c 65 76 65 6c 20 29 3b 0a 20 20  CacheLevel );.  
1a8e0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
1a8f0 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65  esolveLabel(v, e
1a900 6e 64 4c 61 62 65 6c 29 3b 0a 20 20 20 20 20 20  ndLabel);.      
1a910 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66  break;.    }.#if
1a920 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1a930 5f 54 52 49 47 47 45 52 0a 20 20 20 20 63 61 73  _TRIGGER.    cas
1a940 65 20 54 4b 5f 52 41 49 53 45 3a 20 7b 0a 20 20  e TK_RAISE: {.  
1a950 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
1a960 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f  r->affinity==OE_
1a970 52 6f 6c 6c 62 61 63 6b 20 0a 20 20 20 20 20 20  Rollback .      
1a980 20 20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 61       || pExpr->a
1a990 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 41 62 6f 72  ffinity==OE_Abor
1a9a0 74 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  t.           || 
1a9b0 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d  pExpr->affinity=
1a9c0 3d 4f 45 5f 46 61 69 6c 0a 20 20 20 20 20 20 20  =OE_Fail.       
1a9d0 20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 61 66      || pExpr->af
1a9e0 66 69 6e 69 74 79 3d 3d 4f 45 5f 49 67 6e 6f 72  finity==OE_Ignor
1a9f0 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20  e.      );.     
1aa00 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 70 54   if( !pParse->pT
1aa10 72 69 67 67 65 72 54 61 62 20 29 7b 0a 20 20 20  riggerTab ){.   
1aa20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
1aa30 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20  rMsg(pParse,.   
1aa40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aa50 20 20 20 20 22 52 41 49 53 45 28 29 20 6d 61 79      "RAISE() may
1aa60 20 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 77 69   only be used wi
1aa70 74 68 69 6e 20 61 20 74 72 69 67 67 65 72 2d 70  thin a trigger-p
1aa80 72 6f 67 72 61 6d 22 29 3b 0a 20 20 20 20 20 20  rogram");.      
1aa90 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
1aaa0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 45    }.      if( pE
1aab0 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f  xpr->affinity==O
1aac0 45 5f 41 62 6f 72 74 20 29 7b 0a 20 20 20 20 20  E_Abort ){.     
1aad0 20 20 20 73 71 6c 69 74 65 33 4d 61 79 41 62 6f     sqlite3MayAbo
1aae0 72 74 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  rt(pParse);.    
1aaf0 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
1ab00 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
1ab10 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74  ty(pExpr, EP_Int
1ab20 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20  Value) );.      
1ab30 69 66 28 20 70 45 78 70 72 2d 3e 61 66 66 69 6e  if( pExpr->affin
1ab40 69 74 79 3d 3d 4f 45 5f 49 67 6e 6f 72 65 20 29  ity==OE_Ignore )
1ab50 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1ab60 33 56 64 62 65 41 64 64 4f 70 34 28 0a 20 20 20  3VdbeAddOp4(.   
1ab70 20 20 20 20 20 20 20 20 20 76 2c 20 4f 50 5f 48           v, OP_H
1ab80 61 6c 74 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20  alt, SQLITE_OK, 
1ab90 4f 45 5f 49 67 6e 6f 72 65 2c 20 30 2c 20 70 45  OE_Ignore, 0, pE
1aba0 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 30 29  xpr->u.zToken,0)
1abb0 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
1abc0 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
1abd0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1abe0 73 71 6c 69 74 65 33 48 61 6c 74 43 6f 6e 73 74  sqlite3HaltConst
1abf0 72 61 69 6e 74 28 70 50 61 72 73 65 2c 20 53 51  raint(pParse, SQ
1ac00 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  LITE_CONSTRAINT_
1ac10 54 52 49 47 47 45 52 2c 0a 20 20 20 20 20 20 20  TRIGGER,.       
1ac20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ac30 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 61 66         pExpr->af
1ac40 66 69 6e 69 74 79 2c 20 70 45 78 70 72 2d 3e 75  finity, pExpr->u
1ac50 2e 7a 54 6f 6b 65 6e 2c 20 30 2c 20 30 29 3b 0a  .zToken, 0, 0);.
1ac60 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 62        }..      b
1ac70 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
1ac80 69 66 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  if.  }.  sqlite3
1ac90 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
1aca0 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 31 29  Parse, regFree1)
1acb0 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  ;.  sqlite3Relea
1acc0 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
1acd0 2c 20 72 65 67 46 72 65 65 32 29 3b 0a 20 20 72  , regFree2);.  r
1ace0 65 74 75 72 6e 20 69 6e 52 65 67 3b 0a 7d 0a 0a  eturn inReg;.}..
1acf0 2f 2a 0a 2a 2a 20 46 61 63 74 6f 72 20 6f 75 74  /*.** Factor out
1ad00 20 74 68 65 20 63 6f 64 65 20 6f 66 20 74 68 65   the code of the
1ad10 20 67 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f   given expressio
1ad20 6e 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 61 74  n to initializat
1ad30 69 6f 6e 20 74 69 6d 65 2e 0a 2a 2f 0a 76 6f 69  ion time..*/.voi
1ad40 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  d sqlite3ExprCod
1ad50 65 41 74 49 6e 69 74 28 0a 20 20 50 61 72 73 65  eAtInit(.  Parse
1ad60 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20   *pParse,    /* 
1ad70 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
1ad80 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  */.  Expr *pExpr
1ad90 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78  ,      /* The ex
1ada0 70 72 65 73 73 69 6f 6e 20 74 6f 20 63 6f 64 65  pression to code
1adb0 20 77 68 65 6e 20 74 68 65 20 56 44 42 45 20 69   when the VDBE i
1adc0 6e 69 74 69 61 6c 69 7a 65 73 20 2a 2f 0a 20 20  nitializes */.  
1add0 69 6e 74 20 72 65 67 44 65 73 74 2c 20 20 20 20  int regDest,    
1ade0 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 76    /* Store the v
1adf0 61 6c 75 65 20 69 6e 20 74 68 69 73 20 72 65 67  alue in this reg
1ae00 69 73 74 65 72 20 2a 2f 0a 20 20 75 38 20 72 65  ister */.  u8 re
1ae10 75 73 61 62 6c 65 20 20 20 20 20 20 20 2f 2a 20  usable       /* 
1ae20 54 72 75 65 20 69 66 20 74 68 69 73 20 65 78 70  True if this exp
1ae30 72 65 73 73 69 6f 6e 20 69 73 20 72 65 75 73 61  ression is reusa
1ae40 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72  ble */.){.  Expr
1ae50 4c 69 73 74 20 2a 70 3b 0a 20 20 61 73 73 65 72  List *p;.  asser
1ae60 74 28 20 43 6f 6e 73 74 46 61 63 74 6f 72 4f 6b  t( ConstFactorOk
1ae70 28 70 50 61 72 73 65 29 20 29 3b 0a 20 20 70 20  (pParse) );.  p 
1ae80 3d 20 70 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74  = pParse->pConst
1ae90 45 78 70 72 3b 0a 20 20 70 45 78 70 72 20 3d 20  Expr;.  pExpr = 
1aea0 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70  sqlite3ExprDup(p
1aeb0 50 61 72 73 65 2d 3e 64 62 2c 20 70 45 78 70 72  Parse->db, pExpr
1aec0 2c 20 30 29 3b 0a 20 20 70 20 3d 20 73 71 6c 69  , 0);.  p = sqli
1aed0 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
1aee0 64 28 70 50 61 72 73 65 2c 20 70 2c 20 70 45 78  d(pParse, p, pEx
1aef0 70 72 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a  pr);.  if( p ){.
1af00 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72       struct Expr
1af10 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
1af20 20 3d 20 26 70 2d 3e 61 5b 70 2d 3e 6e 45 78 70   = &p->a[p->nExp
1af30 72 2d 31 5d 3b 0a 20 20 20 20 20 70 49 74 65 6d  r-1];.     pItem
1af40 2d 3e 75 2e 69 43 6f 6e 73 74 45 78 70 72 52 65  ->u.iConstExprRe
1af50 67 20 3d 20 72 65 67 44 65 73 74 3b 0a 20 20 20  g = regDest;.   
1af60 20 20 70 49 74 65 6d 2d 3e 72 65 75 73 61 62 6c    pItem->reusabl
1af70 65 20 3d 20 72 65 75 73 61 62 6c 65 3b 0a 20 20  e = reusable;.  
1af80 7d 0a 20 20 70 50 61 72 73 65 2d 3e 70 43 6f 6e  }.  pParse->pCon
1af90 73 74 45 78 70 72 20 3d 20 70 3b 0a 7d 0a 0a 2f  stExpr = p;.}../
1afa0 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
1afb0 64 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20 61  de to evaluate a
1afc0 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64  n expression and
1afd0 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   store the resul
1afe0 74 73 0a 2a 2a 20 69 6e 74 6f 20 61 20 72 65 67  ts.** into a reg
1aff0 69 73 74 65 72 2e 20 20 52 65 74 75 72 6e 20 74  ister.  Return t
1b000 68 65 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62  he register numb
1b010 65 72 20 77 68 65 72 65 20 74 68 65 20 72 65 73  er where the res
1b020 75 6c 74 73 0a 2a 2a 20 61 72 65 20 73 74 6f 72  ults.** are stor
1b030 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
1b040 20 72 65 67 69 73 74 65 72 20 69 73 20 61 20 74   register is a t
1b050 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74 65  emporary registe
1b060 72 20 74 68 61 74 20 63 61 6e 20 62 65 20 64 65  r that can be de
1b070 61 6c 6c 6f 63 61 74 65 64 2c 0a 2a 2a 20 74 68  allocated,.** th
1b080 65 6e 20 77 72 69 74 65 20 69 74 73 20 6e 75 6d  en write its num
1b090 62 65 72 20 69 6e 74 6f 20 2a 70 52 65 67 2e 20  ber into *pReg. 
1b0a0 20 49 66 20 74 68 65 20 72 65 73 75 6c 74 20 72   If the result r
1b0b0 65 67 69 73 74 65 72 20 69 73 20 6e 6f 74 0a 2a  egister is not.*
1b0c0 2a 20 61 20 74 65 6d 70 6f 72 61 72 79 2c 20 74  * a temporary, t
1b0d0 68 65 6e 20 73 65 74 20 2a 70 52 65 67 20 74 6f  hen set *pReg to
1b0e0 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   zero..**.** If 
1b0f0 70 45 78 70 72 20 69 73 20 61 20 63 6f 6e 73 74  pExpr is a const
1b100 61 6e 74 2c 20 74 68 65 6e 20 74 68 69 73 20 72  ant, then this r
1b110 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 67 65 6e  outine might gen
1b120 65 72 61 74 65 20 74 68 69 73 0a 2a 2a 20 63 6f  erate this.** co
1b130 64 65 20 74 6f 20 66 69 6c 6c 20 74 68 65 20 72  de to fill the r
1b140 65 67 69 73 74 65 72 20 69 6e 20 74 68 65 20 69  egister in the i
1b150 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 73 65  nitialization se
1b160 63 74 69 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a 20  ction of the.** 
1b170 56 44 42 45 20 70 72 6f 67 72 61 6d 2c 20 69 6e  VDBE program, in
1b180 20 6f 72 64 65 72 20 74 6f 20 66 61 63 74 6f 72   order to factor
1b190 20 69 74 20 6f 75 74 20 6f 66 20 74 68 65 20 65   it out of the e
1b1a0 76 61 6c 75 61 74 69 6f 6e 20 6c 6f 6f 70 2e 0a  valuation loop..
1b1b0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
1b1c0 70 72 43 6f 64 65 54 65 6d 70 28 50 61 72 73 65  prCodeTemp(Parse
1b1d0 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
1b1e0 70 45 78 70 72 2c 20 69 6e 74 20 2a 70 52 65 67  pExpr, int *pReg
1b1f0 29 7b 0a 20 20 69 6e 74 20 72 32 3b 0a 20 20 70  ){.  int r2;.  p
1b200 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78  Expr = sqlite3Ex
1b210 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 45  prSkipCollate(pE
1b220 78 70 72 29 3b 0a 20 20 69 66 28 20 43 6f 6e 73  xpr);.  if( Cons
1b230 74 46 61 63 74 6f 72 4f 6b 28 70 50 61 72 73 65  tFactorOk(pParse
1b240 29 0a 20 20 20 26 26 20 70 45 78 70 72 2d 3e 6f  ).   && pExpr->o
1b250 70 21 3d 54 4b 5f 52 45 47 49 53 54 45 52 0a 20  p!=TK_REGISTER. 
1b260 20 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72    && sqlite3Expr
1b270 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69  IsConstantNotJoi
1b280 6e 28 70 45 78 70 72 29 0a 20 20 29 7b 0a 20 20  n(pExpr).  ){.  
1b290 20 20 45 78 70 72 4c 69 73 74 20 2a 70 20 3d 20    ExprList *p = 
1b2a0 70 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74 45 78  pParse->pConstEx
1b2b0 70 72 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20  pr;.    int i;. 
1b2c0 20 20 20 2a 70 52 65 67 20 20 3d 20 30 3b 0a 20     *pReg  = 0;. 
1b2d0 20 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20     if( p ){.    
1b2e0 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
1b2f0 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
1b300 20 20 20 20 20 66 6f 72 28 70 49 74 65 6d 3d 70       for(pItem=p
1b310 2d 3e 61 2c 20 69 3d 70 2d 3e 6e 45 78 70 72 3b  ->a, i=p->nExpr;
1b320 20 69 3e 30 3b 20 70 49 74 65 6d 2b 2b 2c 20 69   i>0; pItem++, i
1b330 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  --){.        if(
1b340 20 70 49 74 65 6d 2d 3e 72 65 75 73 61 62 6c 65   pItem->reusable
1b350 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 43   && sqlite3ExprC
1b360 6f 6d 70 61 72 65 28 70 49 74 65 6d 2d 3e 70 45  ompare(pItem->pE
1b370 78 70 72 2c 70 45 78 70 72 2c 2d 31 29 3d 3d 30  xpr,pExpr,-1)==0
1b380 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
1b390 74 75 72 6e 20 70 49 74 65 6d 2d 3e 75 2e 69 43  turn pItem->u.iC
1b3a0 6f 6e 73 74 45 78 70 72 52 65 67 3b 0a 20 20 20  onstExprReg;.   
1b3b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
1b3c0 20 20 20 7d 0a 20 20 20 20 72 32 20 3d 20 2b 2b     }.    r2 = ++
1b3d0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
1b3e0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
1b3f0 65 41 74 49 6e 69 74 28 70 50 61 72 73 65 2c 20  eAtInit(pParse, 
1b400 70 45 78 70 72 2c 20 72 32 2c 20 31 29 3b 0a 20  pExpr, r2, 1);. 
1b410 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
1b420 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r1 = sqlite3GetT
1b430 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
1b440 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33      r2 = sqlite3
1b450 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70  ExprCodeTarget(p
1b460 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 72 31  Parse, pExpr, r1
1b470 29 3b 0a 20 20 20 20 69 66 28 20 72 32 3d 3d 72  );.    if( r2==r
1b480 31 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 67  1 ){.      *pReg
1b490 20 3d 20 72 31 3b 0a 20 20 20 20 7d 65 6c 73 65   = r1;.    }else
1b4a0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  {.      sqlite3R
1b4b0 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
1b4c0 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20  arse, r1);.     
1b4d0 20 2a 70 52 65 67 20 3d 20 30 3b 0a 20 20 20 20   *pReg = 0;.    
1b4e0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
1b4f0 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  2;.}../*.** Gene
1b500 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77  rate code that w
1b510 69 6c 6c 20 65 76 61 6c 75 61 74 65 20 65 78 70  ill evaluate exp
1b520 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20 61 6e  ression pExpr an
1b530 64 20 73 74 6f 72 65 20 74 68 65 0a 2a 2a 20 72  d store the.** r
1b540 65 73 75 6c 74 73 20 69 6e 20 72 65 67 69 73 74  esults in regist
1b550 65 72 20 74 61 72 67 65 74 2e 20 20 54 68 65 20  er target.  The 
1b560 72 65 73 75 6c 74 73 20 61 72 65 20 67 75 61 72  results are guar
1b570 61 6e 74 65 65 64 20 74 6f 20 61 70 70 65 61 72  anteed to appear
1b580 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74 65 72 20  .** in register 
1b590 74 61 72 67 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20  target..*/.void 
1b5a0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
1b5b0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
1b5c0 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20  xpr *pExpr, int 
1b5d0 74 61 72 67 65 74 29 7b 0a 20 20 69 6e 74 20 69  target){.  int i
1b5e0 6e 52 65 67 3b 0a 0a 20 20 61 73 73 65 72 74 28  nReg;..  assert(
1b5f0 20 74 61 72 67 65 74 3e 30 20 26 26 20 74 61 72   target>0 && tar
1b600 67 65 74 3c 3d 70 50 61 72 73 65 2d 3e 6e 4d 65  get<=pParse->nMe
1b610 6d 20 29 3b 0a 20 20 69 66 28 20 70 45 78 70 72  m );.  if( pExpr
1b620 20 26 26 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54   && pExpr->op==T
1b630 4b 5f 52 45 47 49 53 54 45 52 20 29 7b 0a 20 20  K_REGISTER ){.  
1b640 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1b650 4f 70 32 28 70 50 61 72 73 65 2d 3e 70 56 64 62  Op2(pParse->pVdb
1b660 65 2c 20 4f 50 5f 43 6f 70 79 2c 20 70 45 78 70  e, OP_Copy, pExp
1b670 72 2d 3e 69 54 61 62 6c 65 2c 20 74 61 72 67 65  r->iTable, targe
1b680 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  t);.  }else{.   
1b690 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33   inReg = sqlite3
1b6a0 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70  ExprCodeTarget(p
1b6b0 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61  Parse, pExpr, ta
1b6c0 72 67 65 74 29 3b 0a 20 20 20 20 61 73 73 65 72  rget);.    asser
1b6d0 74 28 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65  t( pParse->pVdbe
1b6e0 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e   || pParse->db->
1b6f0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
1b700 20 20 20 20 69 66 28 20 69 6e 52 65 67 21 3d 74      if( inReg!=t
1b710 61 72 67 65 74 20 26 26 20 70 50 61 72 73 65 2d  arget && pParse-
1b720 3e 70 56 64 62 65 20 29 7b 0a 20 20 20 20 20 20  >pVdbe ){.      
1b730 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1b740 32 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c  2(pParse->pVdbe,
1b750 20 4f 50 5f 53 43 6f 70 79 2c 20 69 6e 52 65 67   OP_SCopy, inReg
1b760 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 7d  , target);.    }
1b770 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  .  }.}../*.** Ge
1b780 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
1b790 20 77 69 6c 6c 20 65 76 61 6c 75 61 74 65 20 65   will evaluate e
1b7a0 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20  xpression pExpr 
1b7b0 61 6e 64 20 73 74 6f 72 65 20 74 68 65 0a 2a 2a  and store the.**
1b7c0 20 72 65 73 75 6c 74 73 20 69 6e 20 72 65 67 69   results in regi
1b7d0 73 74 65 72 20 74 61 72 67 65 74 2e 20 20 54 68  ster target.  Th
1b7e0 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 67 75  e results are gu
1b7f0 61 72 61 6e 74 65 65 64 20 74 6f 20 61 70 70 65  aranteed to appe
1b800 61 72 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74 65  ar.** in registe
1b810 72 20 74 61 72 67 65 74 2e 20 20 49 66 20 74 68  r target.  If th
1b820 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
1b830 63 6f 6e 73 74 61 6e 74 2c 20 74 68 65 6e 20 74  constant, then t
1b840 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 6d  his routine.** m
1b850 69 67 68 74 20 63 68 6f 6f 73 65 20 74 6f 20 63  ight choose to c
1b860 6f 64 65 20 74 68 65 20 65 78 70 72 65 73 73 69  ode the expressi
1b870 6f 6e 20 61 74 20 69 6e 69 74 69 61 6c 69 7a 61  on at initializa
1b880 74 69 6f 6e 20 74 69 6d 65 2e 0a 2a 2f 0a 76 6f  tion time..*/.vo
1b890 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  id sqlite3ExprCo
1b8a0 64 65 46 61 63 74 6f 72 61 62 6c 65 28 50 61 72  deFactorable(Par
1b8b0 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
1b8c0 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 74 61 72   *pExpr, int tar
1b8d0 67 65 74 29 7b 0a 20 20 69 66 28 20 70 50 61 72  get){.  if( pPar
1b8e0 73 65 2d 3e 6f 6b 43 6f 6e 73 74 46 61 63 74 6f  se->okConstFacto
1b8f0 72 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72  r && sqlite3Expr
1b900 49 73 43 6f 6e 73 74 61 6e 74 28 70 45 78 70 72  IsConstant(pExpr
1b910 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
1b920 45 78 70 72 43 6f 64 65 41 74 49 6e 69 74 28 70  ExprCodeAtInit(p
1b930 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61  Parse, pExpr, ta
1b940 72 67 65 74 2c 20 30 29 3b 0a 20 20 7d 65 6c 73  rget, 0);.  }els
1b950 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  e{.    sqlite3Ex
1b960 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
1b970 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20  Expr, target);. 
1b980 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65   }.}../*.** Gene
1b990 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 65  rate code that e
1b9a0 76 61 6c 75 61 74 65 73 20 74 68 65 20 67 69 76  valuates the giv
1b9b0 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e  en expression an
1b9c0 64 20 70 75 74 73 20 74 68 65 20 72 65 73 75 6c  d puts the resul
1b9d0 74 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74 65 72  t.** in register
1b9e0 20 74 61 72 67 65 74 2e 0a 2a 2a 0a 2a 2a 20 41   target..**.** A
1b9f0 6c 73 6f 20 6d 61 6b 65 20 61 20 63 6f 70 79 20  lso make a copy 
1ba00 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  of the expressio
1ba10 6e 20 72 65 73 75 6c 74 73 20 69 6e 74 6f 20 61  n results into a
1ba20 6e 6f 74 68 65 72 20 22 63 61 63 68 65 22 20 72  nother "cache" r
1ba30 65 67 69 73 74 65 72 0a 2a 2a 20 61 6e 64 20 6d  egister.** and m
1ba40 6f 64 69 66 79 20 74 68 65 20 65 78 70 72 65 73  odify the expres
1ba50 73 69 6f 6e 20 73 6f 20 74 68 61 74 20 74 68 65  sion so that the
1ba60 20 6e 65 78 74 20 74 69 6d 65 20 69 74 20 69 73   next time it is
1ba70 20 65 76 61 6c 75 61 74 65 64 2c 0a 2a 2a 20 74   evaluated,.** t
1ba80 68 65 20 72 65 73 75 6c 74 20 69 73 20 61 20 63  he result is a c
1ba90 6f 70 79 20 6f 66 20 74 68 65 20 63 61 63 68 65  opy of the cache
1baa0 20 72 65 67 69 73 74 65 72 2e 0a 2a 2a 0a 2a 2a   register..**.**
1bab0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
1bac0 20 75 73 65 64 20 66 6f 72 20 65 78 70 72 65 73   used for expres
1bad0 73 69 6f 6e 73 20 74 68 61 74 20 61 72 65 20 75  sions that are u
1bae0 73 65 64 20 6d 75 6c 74 69 70 6c 65 20 0a 2a 2a  sed multiple .**
1baf0 20 74 69 6d 65 73 2e 20 20 54 68 65 79 20 61 72   times.  They ar
1bb00 65 20 65 76 61 6c 75 61 74 65 64 20 6f 6e 63 65  e evaluated once
1bb10 20 61 6e 64 20 74 68 65 20 72 65 73 75 6c 74 73   and the results
1bb20 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
1bb30 6f 6e 0a 2a 2a 20 61 72 65 20 72 65 75 73 65 64  on.** are reused
1bb40 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1bb50 33 45 78 70 72 43 6f 64 65 41 6e 64 43 61 63 68  3ExprCodeAndCach
1bb60 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
1bb70 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e   Expr *pExpr, in
1bb80 74 20 74 61 72 67 65 74 29 7b 0a 20 20 56 64 62  t target){.  Vdb
1bb90 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
1bba0 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 4d 65 6d  Vdbe;.  int iMem
1bbb0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 74 61 72  ;..  assert( tar
1bbc0 67 65 74 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  get>0 );.  asser
1bbd0 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  t( pExpr->op!=TK
1bbe0 5f 52 45 47 49 53 54 45 52 20 29 3b 0a 20 20 73  _REGISTER );.  s
1bbf0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
1bc00 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61  Parse, pExpr, ta
1bc10 72 67 65 74 29 3b 0a 20 20 69 4d 65 6d 20 3d 20  rget);.  iMem = 
1bc20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
1bc30 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1bc40 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20  Op2(v, OP_Copy, 
1bc50 74 61 72 67 65 74 2c 20 69 4d 65 6d 29 3b 0a 20  target, iMem);. 
1bc60 20 65 78 70 72 54 6f 52 65 67 69 73 74 65 72 28   exprToRegister(
1bc70 70 45 78 70 72 2c 20 69 4d 65 6d 29 3b 0a 7d 0a  pExpr, iMem);.}.
1bc80 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
1bc90 45 42 55 47 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  EBUG./*.** Gener
1bca0 61 74 65 20 61 20 68 75 6d 61 6e 2d 72 65 61 64  ate a human-read
1bcb0 61 62 6c 65 20 65 78 70 6c 61 6e 61 74 69 6f 6e  able explanation
1bcc0 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f   of an expressio
1bcd0 6e 20 74 72 65 65 2e 0a 2a 2f 0a 76 6f 69 64 20  n tree..*/.void 
1bce0 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 45  sqlite3TreeViewE
1bcf0 78 70 72 28 54 72 65 65 56 69 65 77 20 2a 70 56  xpr(TreeView *pV
1bd00 69 65 77 2c 20 63 6f 6e 73 74 20 45 78 70 72 20  iew, const Expr 
1bd10 2a 70 45 78 70 72 2c 20 75 38 20 6d 6f 72 65 54  *pExpr, u8 moreT
1bd20 6f 46 6f 6c 6c 6f 77 29 7b 0a 20 20 63 6f 6e 73  oFollow){.  cons
1bd30 74 20 63 68 61 72 20 2a 7a 42 69 6e 4f 70 20 3d  t char *zBinOp =
1bd40 20 30 3b 20 20 20 2f 2a 20 42 69 6e 61 72 79 20   0;   /* Binary 
1bd50 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 63 6f  operator */.  co
1bd60 6e 73 74 20 63 68 61 72 20 2a 7a 55 6e 69 4f 70  nst char *zUniOp
1bd70 20 3d 20 30 3b 20 20 20 2f 2a 20 55 6e 61 72 79   = 0;   /* Unary
1bd80 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 70   operator */.  p
1bd90 56 69 65 77 20 3d 20 73 71 6c 69 74 65 33 54 72  View = sqlite3Tr
1bda0 65 65 56 69 65 77 50 75 73 68 28 70 56 69 65 77  eeViewPush(pView
1bdb0 2c 20 6d 6f 72 65 54 6f 46 6f 6c 6c 6f 77 29 3b  , moreToFollow);
1bdc0 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20  .  if( pExpr==0 
1bdd0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72  ){.    sqlite3Tr
1bde0 65 65 56 69 65 77 4c 69 6e 65 28 70 56 69 65 77  eeViewLine(pView
1bdf0 2c 20 22 6e 69 6c 22 29 3b 0a 20 20 20 20 73 71  , "nil");.    sq
1be00 6c 69 74 65 33 54 72 65 65 56 69 65 77 50 6f 70  lite3TreeViewPop
1be10 28 70 56 69 65 77 29 3b 0a 20 20 20 20 72 65 74  (pView);.    ret
1be20 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63  urn;.  }.  switc
1be30 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a  h( pExpr->op ){.
1be40 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f      case TK_AGG_
1be50 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20  COLUMN: {.      
1be60 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 4c  sqlite3TreeViewL
1be70 69 6e 65 28 70 56 69 65 77 2c 20 22 41 47 47 7b  ine(pView, "AGG{
1be80 25 64 3a 25 64 7d 22 2c 0a 20 20 20 20 20 20 20  %d:%d}",.       
1be90 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62       pExpr->iTab
1bea0 6c 65 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  le, pExpr->iColu
1beb0 6d 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  mn);.      break
1bec0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1bed0 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20   TK_COLUMN: {.  
1bee0 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69      if( pExpr->i
1bef0 54 61 62 6c 65 3c 30 20 29 7b 0a 20 20 20 20 20  Table<0 ){.     
1bf00 20 20 20 2f 2a 20 54 68 69 73 20 6f 6e 6c 79 20     /* This only 
1bf10 68 61 70 70 65 6e 73 20 77 68 65 6e 20 63 6f 64  happens when cod
1bf20 69 6e 67 20 63 68 65 63 6b 20 63 6f 6e 73 74 72  ing check constr
1bf30 61 69 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 20  aints */.       
1bf40 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77   sqlite3TreeView
1bf50 4c 69 6e 65 28 70 56 69 65 77 2c 20 22 43 4f 4c  Line(pView, "COL
1bf60 55 4d 4e 28 25 64 29 22 2c 20 70 45 78 70 72 2d  UMN(%d)", pExpr-
1bf70 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20  >iColumn);.     
1bf80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1bf90 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 4c  sqlite3TreeViewL
1bfa0 69 6e 65 28 70 56 69 65 77 2c 20 22 7b 25 64 3a  ine(pView, "{%d:
1bfb0 25 64 7d 22 2c 0a 20 20 20 20 20 20 20 20 20 20  %d}",.          
1bfc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bfd0 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65     pExpr->iTable
1bfe0 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  , pExpr->iColumn
1bff0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1c000 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1c010 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45    case TK_INTEGE
1c020 52 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70  R: {.      if( p
1c030 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50  Expr->flags & EP
1c040 5f 49 6e 74 56 61 6c 75 65 20 29 7b 0a 20 20 20  _IntValue ){.   
1c050 20 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65       sqlite3Tree
1c060 56 69 65 77 4c 69 6e 65 28 70 56 69 65 77 2c 20  ViewLine(pView, 
1c070 22 25 64 22 2c 20 70 45 78 70 72 2d 3e 75 2e 69  "%d", pExpr->u.i
1c080 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 7d 65  Value);.      }e
1c090 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
1c0a0 69 74 65 33 54 72 65 65 56 69 65 77 4c 69 6e 65  ite3TreeViewLine
1c0b0 28 70 56 69 65 77 2c 20 22 25 73 22 2c 20 70 45  (pView, "%s", pE
1c0c0 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a  xpr->u.zToken);.
1c0d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
1c0e0 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  eak;.    }.#ifnd
1c0f0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ef SQLITE_OMIT_F
1c100 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20  LOATING_POINT.  
1c110 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a    case TK_FLOAT:
1c120 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
1c130 54 72 65 65 56 69 65 77 4c 69 6e 65 28 70 56 69  TreeViewLine(pVi
1c140 65 77 2c 22 25 73 22 2c 20 70 45 78 70 72 2d 3e  ew,"%s", pExpr->
1c150 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20  u.zToken);.     
1c160 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
1c170 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 54 4b  ndif.    case TK
1c180 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20  _STRING: {.     
1c190 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77   sqlite3TreeView
1c1a0 4c 69 6e 65 28 70 56 69 65 77 2c 22 25 51 22 2c  Line(pView,"%Q",
1c1b0 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
1c1c0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1c1d0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
1c1e0 4b 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20  K_NULL: {.      
1c1f0 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 4c  sqlite3TreeViewL
1c200 69 6e 65 28 70 56 69 65 77 2c 22 4e 55 4c 4c 22  ine(pView,"NULL"
1c210 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1c220 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
1c230 4c 49 54 45 5f 4f 4d 49 54 5f 42 4c 4f 42 5f 4c  LITE_OMIT_BLOB_L
1c240 49 54 45 52 41 4c 0a 20 20 20 20 63 61 73 65 20  ITERAL.    case 
1c250 54 4b 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20  TK_BLOB: {.     
1c260 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77   sqlite3TreeView
1c270 4c 69 6e 65 28 70 56 69 65 77 2c 22 25 73 22 2c  Line(pView,"%s",
1c280 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
1c290 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1c2a0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
1c2b0 20 63 61 73 65 20 54 4b 5f 56 41 52 49 41 42 4c   case TK_VARIABL
1c2c0 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  E: {.      sqlit
1c2d0 65 33 54 72 65 65 56 69 65 77 4c 69 6e 65 28 70  e3TreeViewLine(p
1c2e0 56 69 65 77 2c 22 56 41 52 49 41 42 4c 45 28 25  View,"VARIABLE(%
1c2f0 73 2c 25 64 29 22 2c 0a 20 20 20 20 20 20 20 20  s,%d)",.        
1c300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c310 20 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65    pExpr->u.zToke
1c320 6e 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  n, pExpr->iColum
1c330 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  n);.      break;
1c340 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1c350 54 4b 5f 52 45 47 49 53 54 45 52 3a 20 7b 0a 20  TK_REGISTER: {. 
1c360 20 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65       sqlite3Tree
1c370 56 69 65 77 4c 69 6e 65 28 70 56 69 65 77 2c 22  ViewLine(pView,"
1c380 52 45 47 49 53 54 45 52 28 25 64 29 22 2c 20 70  REGISTER(%d)", p
1c390 45 78 70 72 2d 3e 69 54 61 62 6c 65 29 3b 0a 20  Expr->iTable);. 
1c3a0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1c3b0 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 53  }.    case TK_AS
1c3c0 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
1c3d0 33 54 72 65 65 56 69 65 77 4c 69 6e 65 28 70 56  3TreeViewLine(pV
1c3e0 69 65 77 2c 22 41 53 20 25 51 22 2c 20 70 45 78  iew,"AS %Q", pEx
1c3f0 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20  pr->u.zToken);. 
1c400 20 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65       sqlite3Tree
1c410 56 69 65 77 45 78 70 72 28 70 56 69 65 77 2c 20  ViewExpr(pView, 
1c420 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 30 29  pExpr->pLeft, 0)
1c430 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1c440 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
1c450 5f 49 44 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  _ID: {.      sql
1c460 69 74 65 33 54 72 65 65 56 69 65 77 4c 69 6e 65  ite3TreeViewLine
1c470 28 70 56 69 65 77 2c 22 49 44 20 25 51 22 2c 20  (pView,"ID %Q", 
1c480 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29  pExpr->u.zToken)
1c490 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1c4a0 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
1c4b0 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54 0a 20 20  ITE_OMIT_CAST.  
1c4c0 20 20 63 61 73 65 20 54 4b 5f 43 41 53 54 3a 20    case TK_CAST: 
1c4d0 7b 0a 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65  {.      /* Expre
1c4e0 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 66 6f  ssions of the fo
1c4f0 72 6d 3a 20 20 20 43 41 53 54 28 70 4c 65 66 74  rm:   CAST(pLeft
1c500 20 41 53 20 74 6f 6b 65 6e 29 20 2a 2f 0a 20 20   AS token) */.  
1c510 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56      sqlite3TreeV
1c520 69 65 77 4c 69 6e 65 28 70 56 69 65 77 2c 22 43  iewLine(pView,"C
1c530 41 53 54 20 25 51 22 2c 20 70 45 78 70 72 2d 3e  AST %Q", pExpr->
1c540 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20  u.zToken);.     
1c550 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77   sqlite3TreeView
1c560 45 78 70 72 28 70 56 69 65 77 2c 20 70 45 78 70  Expr(pView, pExp
1c570 72 2d 3e 70 4c 65 66 74 2c 20 30 29 3b 0a 20 20  r->pLeft, 0);.  
1c580 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1c590 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
1c5a0 45 5f 4f 4d 49 54 5f 43 41 53 54 20 2a 2f 0a 20  E_OMIT_CAST */. 
1c5b0 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 20 20     case TK_LT:  
1c5c0 20 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22 4c 54      zBinOp = "LT
1c5d0 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ";     break;.  
1c5e0 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 20 20 20    case TK_LE:   
1c5f0 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22 4c 45 22     zBinOp = "LE"
1c600 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ;     break;.   
1c610 20 63 61 73 65 20 54 4b 5f 47 54 3a 20 20 20 20   case TK_GT:    
1c620 20 20 7a 42 69 6e 4f 70 20 3d 20 22 47 54 22 3b    zBinOp = "GT";
1c630 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1c640 63 61 73 65 20 54 4b 5f 47 45 3a 20 20 20 20 20  case TK_GE:     
1c650 20 7a 42 69 6e 4f 70 20 3d 20 22 47 45 22 3b 20   zBinOp = "GE"; 
1c660 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
1c670 61 73 65 20 54 4b 5f 4e 45 3a 20 20 20 20 20 20  ase TK_NE:      
1c680 7a 42 69 6e 4f 70 20 3d 20 22 4e 45 22 3b 20 20  zBinOp = "NE";  
1c690 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
1c6a0 73 65 20 54 4b 5f 45 51 3a 20 20 20 20 20 20 7a  se TK_EQ:      z
1c6b0 42 69 6e 4f 70 20 3d 20 22 45 51 22 3b 20 20 20  BinOp = "EQ";   
1c6c0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
1c6d0 65 20 54 4b 5f 49 53 3a 20 20 20 20 20 20 7a 42  e TK_IS:      zB
1c6e0 69 6e 4f 70 20 3d 20 22 49 53 22 3b 20 20 20 20  inOp = "IS";    
1c6f0 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
1c700 20 54 4b 5f 49 53 4e 4f 54 3a 20 20 20 7a 42 69   TK_ISNOT:   zBi
1c710 6e 4f 70 20 3d 20 22 49 53 4e 4f 54 22 3b 20 20  nOp = "ISNOT";  
1c720 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
1c730 54 4b 5f 41 4e 44 3a 20 20 20 20 20 7a 42 69 6e  TK_AND:     zBin
1c740 4f 70 20 3d 20 22 41 4e 44 22 3b 20 20 20 20 62  Op = "AND";    b
1c750 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
1c760 4b 5f 4f 52 3a 20 20 20 20 20 20 7a 42 69 6e 4f  K_OR:      zBinO
1c770 70 20 3d 20 22 4f 52 22 3b 20 20 20 20 20 62 72  p = "OR";     br
1c780 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
1c790 5f 50 4c 55 53 3a 20 20 20 20 7a 42 69 6e 4f 70  _PLUS:    zBinOp
1c7a0 20 3d 20 22 41 44 44 22 3b 20 20 20 20 62 72 65   = "ADD";    bre
1c7b0 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
1c7c0 53 54 41 52 3a 20 20 20 20 7a 42 69 6e 4f 70 20  STAR:    zBinOp 
1c7d0 3d 20 22 4d 55 4c 22 3b 20 20 20 20 62 72 65 61  = "MUL";    brea
1c7e0 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4d  k;.    case TK_M
1c7f0 49 4e 55 53 3a 20 20 20 7a 42 69 6e 4f 70 20 3d  INUS:   zBinOp =
1c800 20 22 53 55 42 22 3b 20 20 20 20 62 72 65 61 6b   "SUB";    break
1c810 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45  ;.    case TK_RE
1c820 4d 3a 20 20 20 20 20 7a 42 69 6e 4f 70 20 3d 20  M:     zBinOp = 
1c830 22 52 45 4d 22 3b 20 20 20 20 62 72 65 61 6b 3b  "REM";    break;
1c840 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54  .    case TK_BIT
1c850 41 4e 44 3a 20 20 7a 42 69 6e 4f 70 20 3d 20 22  AND:  zBinOp = "
1c860 42 49 54 41 4e 44 22 3b 20 62 72 65 61 6b 3b 0a  BITAND"; break;.
1c870 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4f      case TK_BITO
1c880 52 3a 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22 42  R:   zBinOp = "B
1c890 49 54 4f 52 22 3b 20 20 62 72 65 61 6b 3b 0a 20  ITOR";  break;. 
1c8a0 20 20 20 63 61 73 65 20 54 4b 5f 53 4c 41 53 48     case TK_SLASH
1c8b0 3a 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22 44 49  :   zBinOp = "DI
1c8c0 56 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  V";    break;.  
1c8d0 20 20 63 61 73 65 20 54 4b 5f 4c 53 48 49 46 54    case TK_LSHIFT
1c8e0 3a 20 20 7a 42 69 6e 4f 70 20 3d 20 22 4c 53 48  :  zBinOp = "LSH
1c8f0 49 46 54 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  IFT"; break;.   
1c900 20 63 61 73 65 20 54 4b 5f 52 53 48 49 46 54 3a   case TK_RSHIFT:
1c910 20 20 7a 42 69 6e 4f 70 20 3d 20 22 52 53 48 49    zBinOp = "RSHI
1c920 46 54 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  FT"; break;.    
1c930 63 61 73 65 20 54 4b 5f 43 4f 4e 43 41 54 3a 20  case TK_CONCAT: 
1c940 20 7a 42 69 6e 4f 70 20 3d 20 22 43 4f 4e 43 41   zBinOp = "CONCA
1c950 54 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  T"; break;.    c
1c960 61 73 65 20 54 4b 5f 44 4f 54 3a 20 20 20 20 20  ase TK_DOT:     
1c970 7a 42 69 6e 4f 70 20 3d 20 22 44 4f 54 22 3b 20  zBinOp = "DOT"; 
1c980 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63     break;..    c
1c990 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 20  ase TK_UMINUS:  
1c9a0 7a 55 6e 69 4f 70 20 3d 20 22 55 4d 49 4e 55 53  zUniOp = "UMINUS
1c9b0 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
1c9c0 73 65 20 54 4b 5f 55 50 4c 55 53 3a 20 20 20 7a  se TK_UPLUS:   z
1c9d0 55 6e 69 4f 70 20 3d 20 22 55 50 4c 55 53 22 3b  UniOp = "UPLUS";
1c9e0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
1c9f0 65 20 54 4b 5f 42 49 54 4e 4f 54 3a 20 20 7a 55  e TK_BITNOT:  zU
1ca00 6e 69 4f 70 20 3d 20 22 42 49 54 4e 4f 54 22 3b  niOp = "BITNOT";
1ca10 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
1ca20 20 54 4b 5f 4e 4f 54 3a 20 20 20 20 20 7a 55 6e   TK_NOT:     zUn
1ca30 69 4f 70 20 3d 20 22 4e 4f 54 22 3b 20 20 20 20  iOp = "NOT";    
1ca40 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
1ca50 54 4b 5f 49 53 4e 55 4c 4c 3a 20 20 7a 55 6e 69  TK_ISNULL:  zUni
1ca60 4f 70 20 3d 20 22 49 53 4e 55 4c 4c 22 3b 20 62  Op = "ISNULL"; b
1ca70 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
1ca80 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7a 55 6e 69 4f  K_NOTNULL: zUniO
1ca90 70 20 3d 20 22 4e 4f 54 4e 55 4c 4c 22 3b 20 62  p = "NOTNULL"; b
1caa0 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20  reak;..    case 
1cab0 54 4b 5f 43 4f 4c 4c 41 54 45 3a 20 7b 0a 20 20  TK_COLLATE: {.  
1cac0 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56      sqlite3TreeV
1cad0 69 65 77 4c 69 6e 65 28 70 56 69 65 77 2c 20 22  iewLine(pView, "
1cae0 43 4f 4c 4c 41 54 45 20 25 51 22 2c 20 70 45 78  COLLATE %Q", pEx
1caf0 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20  pr->u.zToken);. 
1cb00 20 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65       sqlite3Tree
1cb10 56 69 65 77 45 78 70 72 28 70 56 69 65 77 2c 20  ViewExpr(pView, 
1cb20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 30 29  pExpr->pLeft, 0)
1cb30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1cb40 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 54     }..    case T
1cb50 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 0a  K_AGG_FUNCTION:.
1cb60 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43      case TK_FUNC
1cb70 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78  TION: {.      Ex
1cb80 70 72 4c 69 73 74 20 2a 70 46 61 72 67 3b 20 20  prList *pFarg;  
1cb90 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
1cba0 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e  function argumen
1cbb0 74 73 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ts */.      if( 
1cbc0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
1cbd0 70 45 78 70 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f  pExpr, EP_TokenO
1cbe0 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 20 20  nly) ){.        
1cbf0 70 46 61 72 67 20 3d 20 30 3b 0a 20 20 20 20 20  pFarg = 0;.     
1cc00 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1cc10 70 46 61 72 67 20 3d 20 70 45 78 70 72 2d 3e 78  pFarg = pExpr->x
1cc20 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 7d 0a  .pList;.      }.
1cc30 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
1cc40 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43  >op==TK_AGG_FUNC
1cc50 54 49 4f 4e 20 29 7b 0a 20 20 20 20 20 20 20 20  TION ){.        
1cc60 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 4c  sqlite3TreeViewL
1cc70 69 6e 65 28 70 56 69 65 77 2c 20 22 41 47 47 5f  ine(pView, "AGG_
1cc80 46 55 4e 43 54 49 4f 4e 25 64 20 25 51 22 2c 0a  FUNCTION%d %Q",.
1cc90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cca0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
1ccb0 70 72 2d 3e 6f 70 32 2c 20 70 45 78 70 72 2d 3e  pr->op2, pExpr->
1ccc0 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20  u.zToken);.     
1ccd0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1cce0 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 4c  sqlite3TreeViewL
1ccf0 69 6e 65 28 70 56 69 65 77 2c 20 22 46 55 4e 43  ine(pView, "FUNC
1cd00 54 49 4f 4e 20 25 51 22 2c 20 70 45 78 70 72 2d  TION %Q", pExpr-
1cd10 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20  >u.zToken);.    
1cd20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 46    }.      if( pF
1cd30 61 72 67 20 29 7b 0a 20 20 20 20 20 20 20 20 73  arg ){.        s
1cd40 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 45 78  qlite3TreeViewEx
1cd50 70 72 4c 69 73 74 28 70 56 69 65 77 2c 20 70 46  prList(pView, pF
1cd60 61 72 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  arg, 0, 0);.    
1cd70 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
1cd80 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
1cd90 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
1cda0 45 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ERY.    case TK_
1cdb0 45 58 49 53 54 53 3a 20 7b 0a 20 20 20 20 20 20  EXISTS: {.      
1cdc0 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 4c  sqlite3TreeViewL
1cdd0 69 6e 65 28 70 56 69 65 77 2c 20 22 45 58 49 53  ine(pView, "EXIS
1cde0 54 53 2d 65 78 70 72 22 29 3b 0a 20 20 20 20 20  TS-expr");.     
1cdf0 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77   sqlite3TreeView
1ce00 53 65 6c 65 63 74 28 70 56 69 65 77 2c 20 70 45  Select(pView, pE
1ce10 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2c 20  xpr->x.pSelect, 
1ce20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  0);.      break;
1ce30 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1ce40 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20  TK_SELECT: {.   
1ce50 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69     sqlite3TreeVi
1ce60 65 77 4c 69 6e 65 28 70 56 69 65 77 2c 20 22 53  ewLine(pView, "S
1ce70 45 4c 45 43 54 2d 65 78 70 72 22 29 3b 0a 20 20  ELECT-expr");.  
1ce80 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56      sqlite3TreeV
1ce90 69 65 77 53 65 6c 65 63 74 28 70 56 69 65 77 2c  iewSelect(pView,
1cea0 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63   pExpr->x.pSelec
1ceb0 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65  t, 0);.      bre
1cec0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
1ced0 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20  se TK_IN: {.    
1cee0 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65    sqlite3TreeVie
1cef0 77 4c 69 6e 65 28 70 56 69 65 77 2c 20 22 49 4e  wLine(pView, "IN
1cf00 22 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ");.      sqlite
1cf10 33 54 72 65 65 56 69 65 77 45 78 70 72 28 70 56  3TreeViewExpr(pV
1cf20 69 65 77 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  iew, pExpr->pLef
1cf30 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28  t, 1);.      if(
1cf40 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
1cf50 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  (pExpr, EP_xIsSe
1cf60 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20 20  lect) ){.       
1cf70 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77   sqlite3TreeView
1cf80 53 65 6c 65 63 74 28 70 56 69 65 77 2c 20 70 45  Select(pView, pE
1cf90 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2c 20  xpr->x.pSelect, 
1cfa0 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  0);.      }else{
1cfb0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1cfc0 54 72 65 65 56 69 65 77 45 78 70 72 4c 69 73 74  TreeViewExprList
1cfd0 28 70 56 69 65 77 2c 20 70 45 78 70 72 2d 3e 78  (pView, pExpr->x
1cfe0 2e 70 4c 69 73 74 2c 20 30 2c 20 30 29 3b 0a 20  .pList, 0, 0);. 
1cff0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
1d000 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
1d010 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
1d020 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 20 20 20  SUBQUERY */..   
1d030 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 20 20 78 20   /*.    **    x 
1d040 42 45 54 57 45 45 4e 20 79 20 41 4e 44 20 7a 0a  BETWEEN y AND z.
1d050 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
1d060 69 73 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74  is is equivalent
1d070 20 74 6f 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a   to.    **.    *
1d080 2a 20 20 20 20 78 3e 3d 79 20 41 4e 44 20 78 3c  *    x>=y AND x<
1d090 3d 7a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  =z.    **.    **
1d0a0 20 58 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20   X is stored in 
1d0b0 70 45 78 70 72 2d 3e 70 4c 65 66 74 2e 0a 20 20  pExpr->pLeft..  
1d0c0 20 20 2a 2a 20 59 20 69 73 20 73 74 6f 72 65 64    ** Y is stored
1d0d0 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 69 73 74   in pExpr->pList
1d0e0 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2e 0a 20 20  ->a[0].pExpr..  
1d0f0 20 20 2a 2a 20 5a 20 69 73 20 73 74 6f 72 65 64    ** Z is stored
1d100 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 69 73 74   in pExpr->pList
1d110 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 2e 0a 20 20  ->a[1].pExpr..  
1d120 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b    */.    case TK
1d130 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20  _BETWEEN: {.    
1d140 20 20 45 78 70 72 20 2a 70 58 20 3d 20 70 45 78    Expr *pX = pEx
1d150 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20  pr->pLeft;.     
1d160 20 45 78 70 72 20 2a 70 59 20 3d 20 70 45 78 70   Expr *pY = pExp
1d170 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 30 5d  r->x.pList->a[0]
1d180 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 45 78  .pExpr;.      Ex
1d190 70 72 20 2a 70 5a 20 3d 20 70 45 78 70 72 2d 3e  pr *pZ = pExpr->
1d1a0 78 2e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45  x.pList->a[1].pE
1d1b0 78 70 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  xpr;.      sqlit
1d1c0 65 33 54 72 65 65 56 69 65 77 4c 69 6e 65 28 70  e3TreeViewLine(p
1d1d0 56 69 65 77 2c 20 22 42 45 54 57 45 45 4e 22 29  View, "BETWEEN")
1d1e0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54  ;.      sqlite3T
1d1f0 72 65 65 56 69 65 77 45 78 70 72 28 70 56 69 65  reeViewExpr(pVie
1d200 77 2c 20 70 58 2c 20 31 29 3b 0a 20 20 20 20 20  w, pX, 1);.     
1d210 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77   sqlite3TreeView
1d220 45 78 70 72 28 70 56 69 65 77 2c 20 70 59 2c 20  Expr(pView, pY, 
1d230 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
1d240 33 54 72 65 65 56 69 65 77 45 78 70 72 28 70 56  3TreeViewExpr(pV
1d250 69 65 77 2c 20 70 5a 2c 20 30 29 3b 0a 20 20 20  iew, pZ, 0);.   
1d260 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1d270 20 20 20 20 63 61 73 65 20 54 4b 5f 54 52 49 47      case TK_TRIG
1d280 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  GER: {.      /* 
1d290 49 66 20 74 68 65 20 6f 70 63 6f 64 65 20 69 73  If the opcode is
1d2a0 20 54 4b 5f 54 52 49 47 47 45 52 2c 20 74 68 65   TK_TRIGGER, the
1d2b0 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  n the expression
1d2c0 20 69 73 20 61 20 72 65 66 65 72 65 6e 63 65 0a   is a reference.
1d2d0 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 20 63 6f        ** to a co
1d2e0 6c 75 6d 6e 20 69 6e 20 74 68 65 20 6e 65 77 2e  lumn in the new.
1d2f0 2a 20 6f 72 20 6f 6c 64 2e 2a 20 70 73 65 75 64  * or old.* pseud
1d300 6f 2d 74 61 62 6c 65 73 20 61 76 61 69 6c 61 62  o-tables availab
1d310 6c 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74  le to.      ** t
1d320 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d 73 2e  rigger programs.
1d330 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 45 78   In this case Ex
1d340 70 72 2e 69 54 61 62 6c 65 20 69 73 20 73 65 74  pr.iTable is set
1d350 20 74 6f 20 31 20 66 6f 72 20 74 68 65 0a 20 20   to 1 for the.  
1d360 20 20 20 20 2a 2a 20 6e 65 77 2e 2a 20 70 73 65      ** new.* pse
1d370 75 64 6f 2d 74 61 62 6c 65 2c 20 6f 72 20 30 20  udo-table, or 0 
1d380 66 6f 72 20 74 68 65 20 6f 6c 64 2e 2a 20 70 73  for the old.* ps
1d390 65 75 64 6f 2d 74 61 62 6c 65 2e 20 45 78 70 72  eudo-table. Expr
1d3a0 2e 69 43 6f 6c 75 6d 6e 0a 20 20 20 20 20 20 2a  .iColumn.      *
1d3b0 2a 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  * is set to the 
1d3c0 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 70 73  column of the ps
1d3d0 65 75 64 6f 2d 74 61 62 6c 65 20 74 6f 20 72 65  eudo-table to re
1d3e0 61 64 2c 20 6f 72 20 74 6f 20 2d 31 20 74 6f 0a  ad, or to -1 to.
1d3f0 20 20 20 20 20 20 2a 2a 20 72 65 61 64 20 74 68        ** read th
1d400 65 20 72 6f 77 69 64 20 66 69 65 6c 64 2e 0a 20  e rowid field.. 
1d410 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
1d420 6c 69 74 65 33 54 72 65 65 56 69 65 77 4c 69 6e  lite3TreeViewLin
1d430 65 28 70 56 69 65 77 2c 20 22 25 73 28 25 64 29  e(pView, "%s(%d)
1d440 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 70 45  ", .          pE
1d450 78 70 72 2d 3e 69 54 61 62 6c 65 20 3f 20 22 4e  xpr->iTable ? "N
1d460 45 57 22 20 3a 20 22 4f 4c 44 22 2c 20 70 45 78  EW" : "OLD", pEx
1d470 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20  pr->iColumn);.  
1d480 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1d490 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 41 53  .    case TK_CAS
1d4a0 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  E: {.      sqlit
1d4b0 65 33 54 72 65 65 56 69 65 77 4c 69 6e 65 28 70  e3TreeViewLine(p
1d4c0 56 69 65 77 2c 20 22 43 41 53 45 22 29 3b 0a 20  View, "CASE");. 
1d4d0 20 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65       sqlite3Tree
1d4e0 56 69 65 77 45 78 70 72 28 70 56 69 65 77 2c 20  ViewExpr(pView, 
1d4f0 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 31 29  pExpr->pLeft, 1)
1d500 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54  ;.      sqlite3T
1d510 72 65 65 56 69 65 77 45 78 70 72 4c 69 73 74 28  reeViewExprList(
1d520 70 56 69 65 77 2c 20 70 45 78 70 72 2d 3e 78 2e  pView, pExpr->x.
1d530 70 4c 69 73 74 2c 20 30 2c 20 30 29 3b 0a 20 20  pList, 0, 0);.  
1d540 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1d550 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1d560 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a 20 20 20  OMIT_TRIGGER.   
1d570 20 63 61 73 65 20 54 4b 5f 52 41 49 53 45 3a 20   case TK_RAISE: 
1d580 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  {.      const ch
1d590 61 72 20 2a 7a 54 79 70 65 20 3d 20 22 75 6e 6b  ar *zType = "unk
1d5a0 22 3b 0a 20 20 20 20 20 20 73 77 69 74 63 68 28  ";.      switch(
1d5b0 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79   pExpr->affinity
1d5c0 20 29 7b 0a 20 20 20 20 20 20 20 20 63 61 73 65   ){.        case
1d5d0 20 4f 45 5f 52 6f 6c 6c 62 61 63 6b 3a 20 20 20   OE_Rollback:   
1d5e0 7a 54 79 70 65 20 3d 20 22 72 6f 6c 6c 62 61 63  zType = "rollbac
1d5f0 6b 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  k";  break;.    
1d600 20 20 20 20 63 61 73 65 20 4f 45 5f 41 62 6f 72      case OE_Abor
1d610 74 3a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20  t:      zType = 
1d620 22 61 62 6f 72 74 22 3b 20 20 20 20 20 62 72 65  "abort";     bre
1d630 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65  ak;.        case
1d640 20 4f 45 5f 46 61 69 6c 3a 20 20 20 20 20 20 20   OE_Fail:       
1d650 7a 54 79 70 65 20 3d 20 22 66 61 69 6c 22 3b 20  zType = "fail"; 
1d660 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1d670 20 20 20 20 63 61 73 65 20 4f 45 5f 49 67 6e 6f      case OE_Igno
1d680 72 65 3a 20 20 20 20 20 7a 54 79 70 65 20 3d 20  re:     zType = 
1d690 22 69 67 6e 6f 72 65 22 3b 20 20 20 20 62 72 65  "ignore";    bre
1d6a0 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
1d6b0 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65    sqlite3TreeVie
1d6c0 77 4c 69 6e 65 28 70 56 69 65 77 2c 20 22 52 41  wLine(pView, "RA
1d6d0 49 53 45 20 25 73 28 25 51 29 22 2c 20 7a 54 79  ISE %s(%Q)", zTy
1d6e0 70 65 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  pe, pExpr->u.zTo
1d6f0 6b 65 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ken);.      brea
1d700 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
1d710 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
1d720 20 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65       sqlite3Tree
1d730 56 69 65 77 4c 69 6e 65 28 70 56 69 65 77 2c 20  ViewLine(pView, 
1d740 22 6f 70 3d 25 64 22 2c 20 70 45 78 70 72 2d 3e  "op=%d", pExpr->
1d750 6f 70 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  op);.      break
1d760 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
1d770 28 20 7a 42 69 6e 4f 70 20 29 7b 0a 20 20 20 20  ( zBinOp ){.    
1d780 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 4c  sqlite3TreeViewL
1d790 69 6e 65 28 70 56 69 65 77 2c 20 22 25 73 22 2c  ine(pView, "%s",
1d7a0 20 7a 42 69 6e 4f 70 29 3b 0a 20 20 20 20 73 71   zBinOp);.    sq
1d7b0 6c 69 74 65 33 54 72 65 65 56 69 65 77 45 78 70  lite3TreeViewExp
1d7c0 72 28 70 56 69 65 77 2c 20 70 45 78 70 72 2d 3e  r(pView, pExpr->
1d7d0 70 4c 65 66 74 2c 20 31 29 3b 0a 20 20 20 20 73  pLeft, 1);.    s
1d7e0 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 45 78  qlite3TreeViewEx
1d7f0 70 72 28 70 56 69 65 77 2c 20 70 45 78 70 72 2d  pr(pView, pExpr-
1d800 3e 70 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 7d  >pRight, 0);.  }
1d810 65 6c 73 65 20 69 66 28 20 7a 55 6e 69 4f 70 20  else if( zUniOp 
1d820 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72  ){.    sqlite3Tr
1d830 65 65 56 69 65 77 4c 69 6e 65 28 70 56 69 65 77  eeViewLine(pView
1d840 2c 20 22 25 73 22 2c 20 7a 55 6e 69 4f 70 29 3b  , "%s", zUniOp);
1d850 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65  .    sqlite3Tree
1d860 56 69 65 77 45 78 70 72 28 70 56 69 65 77 2c 20  ViewExpr(pView, 
1d870 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 30 29  pExpr->pLeft, 0)
1d880 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 54  ;.  }.  sqlite3T
1d890 72 65 65 56 69 65 77 50 6f 70 28 70 56 69 65 77  reeViewPop(pView
1d8a0 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  );.}.#endif /* S
1d8b0 51 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a 0a  QLITE_DEBUG */..
1d8c0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
1d8d0 42 55 47 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  BUG./*.** Genera
1d8e0 74 65 20 61 20 68 75 6d 61 6e 2d 72 65 61 64 61  te a human-reada
1d8f0 62 6c 65 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20  ble explanation 
1d900 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  of an expression
1d910 20 6c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73   list..*/.void s
1d920 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 45 78  qlite3TreeViewEx
1d930 70 72 4c 69 73 74 28 0a 20 20 54 72 65 65 56 69  prList(.  TreeVi
1d940 65 77 20 2a 70 56 69 65 77 2c 0a 20 20 63 6f 6e  ew *pView,.  con
1d950 73 74 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  st ExprList *pLi
1d960 73 74 2c 0a 20 20 75 38 20 6d 6f 72 65 54 6f 46  st,.  u8 moreToF
1d970 6f 6c 6c 6f 77 2c 0a 20 20 63 6f 6e 73 74 20 63  ollow,.  const c
1d980 68 61 72 20 2a 7a 4c 61 62 65 6c 0a 29 7b 0a 20  har *zLabel.){. 
1d990 20 69 6e 74 20 69 3b 0a 20 20 70 56 69 65 77 20   int i;.  pView 
1d9a0 3d 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65  = sqlite3TreeVie
1d9b0 77 50 75 73 68 28 70 56 69 65 77 2c 20 6d 6f 72  wPush(pView, mor
1d9c0 65 54 6f 46 6f 6c 6c 6f 77 29 3b 0a 20 20 69 66  eToFollow);.  if
1d9d0 28 20 7a 4c 61 62 65 6c 3d 3d 30 20 7c 7c 20 7a  ( zLabel==0 || z
1d9e0 4c 61 62 65 6c 5b 30 5d 3d 3d 30 20 29 20 7a 4c  Label[0]==0 ) zL
1d9f0 61 62 65 6c 20 3d 20 22 4c 49 53 54 22 3b 0a 20  abel = "LIST";. 
1da00 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b   if( pList==0 ){
1da10 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65  .    sqlite3Tree
1da20 56 69 65 77 4c 69 6e 65 28 70 56 69 65 77 2c 20  ViewLine(pView, 
1da30 22 25 73 20 28 65 6d 70 74 79 29 22 2c 20 7a 4c  "%s (empty)", zL
1da40 61 62 65 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  abel);.  }else{.
1da50 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56      sqlite3TreeV
1da60 69 65 77 4c 69 6e 65 28 70 56 69 65 77 2c 20 22  iewLine(pView, "
1da70 25 73 22 2c 20 7a 4c 61 62 65 6c 29 3b 0a 20 20  %s", zLabel);.  
1da80 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69    for(i=0; i<pLi
1da90 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
1daa0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 72  .      sqlite3Tr
1dab0 65 65 56 69 65 77 45 78 70 72 28 70 56 69 65 77  eeViewExpr(pView
1dac0 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  , pList->a[i].pE
1dad0 78 70 72 2c 20 69 3c 70 4c 69 73 74 2d 3e 6e 45  xpr, i<pList->nE
1dae0 78 70 72 2d 31 29 3b 0a 23 69 66 20 30 0a 20 20  xpr-1);.#if 0.  
1daf0 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 61 5b     if( pList->a[
1db00 69 5d 2e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20  i].zName ){.    
1db10 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
1db20 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22  inPrintf(pOut, "
1db30 20 41 53 20 25 73 22 2c 20 70 4c 69 73 74 2d 3e   AS %s", pList->
1db40 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20  a[i].zName);.   
1db50 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
1db60 4c 69 73 74 2d 3e 61 5b 69 5d 2e 62 53 70 61 6e  List->a[i].bSpan
1db70 49 73 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20  IsTab ){.       
1db80 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
1db90 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 20 28 25  rintf(pOut, " (%
1dba0 73 29 22 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d  s)", pList->a[i]
1dbb0 2e 7a 53 70 61 6e 29 3b 0a 20 20 20 20 20 20 7d  .zSpan);.      }
1dbc0 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20  .#endif.    }.  
1dbd0 7d 0a 20 20 73 71 6c 69 74 65 33 54 72 65 65 56  }.  sqlite3TreeV
1dbe0 69 65 77 50 6f 70 28 70 56 69 65 77 29 3b 0a 7d  iewPop(pView);.}
1dbf0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
1dc00 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a  E_DEBUG */../*.*
1dc10 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
1dc20 74 68 61 74 20 70 75 73 68 65 73 20 74 68 65 20  that pushes the 
1dc30 76 61 6c 75 65 20 6f 66 20 65 76 65 72 79 20 65  value of every e
1dc40 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 67 69  lement of the gi
1dc50 76 65 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  ven.** expressio
1dc60 6e 20 6c 69 73 74 20 69 6e 74 6f 20 61 20 73 65  n list into a se
1dc70 71 75 65 6e 63 65 20 6f 66 20 72 65 67 69 73 74  quence of regist
1dc80 65 72 73 20 62 65 67 69 6e 6e 69 6e 67 20 61 74  ers beginning at
1dc90 20 74 61 72 67 65 74 2e 0a 2a 2a 0a 2a 2a 20 52   target..**.** R
1dca0 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
1dcb0 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 65 76 61   of elements eva
1dcc0 6c 75 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  luated..**.** Th
1dcd0 65 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55  e SQLITE_ECEL_DU
1dce0 50 20 66 6c 61 67 20 70 72 65 76 65 6e 74 73 20  P flag prevents 
1dcf0 74 68 65 20 61 72 67 75 6d 65 6e 74 73 20 66 72  the arguments fr
1dd00 6f 6d 20 62 65 69 6e 67 0a 2a 2a 20 66 69 6c 6c  om being.** fill
1dd10 65 64 20 75 73 69 6e 67 20 4f 50 5f 53 43 6f 70  ed using OP_SCop
1dd20 79 2e 20 20 4f 50 5f 43 6f 70 79 20 6d 75 73 74  y.  OP_Copy must
1dd30 20 62 65 20 75 73 65 64 20 69 6e 73 74 65 61 64   be used instead
1dd40 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c 49  ..**.** The SQLI
1dd50 54 45 5f 45 43 45 4c 5f 46 41 43 54 4f 52 20 61  TE_ECEL_FACTOR a
1dd60 72 67 75 6d 65 6e 74 20 61 6c 6c 6f 77 73 20 63  rgument allows c
1dd70 6f 6e 73 74 61 6e 74 20 61 72 67 75 6d 65 6e 74  onstant argument
1dd80 73 20 74 6f 20 62 65 0a 2a 2a 20 66 61 63 74 6f  s to be.** facto
1dd90 72 65 64 20 6f 75 74 20 69 6e 74 6f 20 69 6e 69  red out into ini
1dda0 74 69 61 6c 69 7a 61 74 69 6f 6e 20 63 6f 64 65  tialization code
1ddb0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1ddc0 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74  ExprCodeExprList
1ddd0 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
1dde0 65 2c 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e  e,     /* Parsin
1ddf0 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
1de00 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
1de10 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73    /* The express
1de20 69 6f 6e 20 6c 69 73 74 20 74 6f 20 62 65 20 63  ion list to be c
1de30 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 74 61  oded */.  int ta
1de40 72 67 65 74 2c 20 20 20 20 20 20 20 20 2f 2a 20  rget,        /* 
1de50 57 68 65 72 65 20 74 6f 20 77 72 69 74 65 20 72  Where to write r
1de60 65 73 75 6c 74 73 20 2a 2f 0a 20 20 75 38 20 66  esults */.  u8 f
1de70 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20 2f  lags           /
1de80 2a 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 2a 20  * SQLITE_ECEL_* 
1de90 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 73 74  flags */.){.  st
1dea0 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
1deb0 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74  em *pItem;.  int
1dec0 20 69 2c 20 6e 3b 0a 20 20 75 38 20 63 6f 70 79   i, n;.  u8 copy
1ded0 4f 70 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51  Op = (flags & SQ
1dee0 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50 29 20 3f  LITE_ECEL_DUP) ?
1def0 20 4f 50 5f 43 6f 70 79 20 3a 20 4f 50 5f 53 43   OP_Copy : OP_SC
1df00 6f 70 79 3b 0a 20 20 61 73 73 65 72 74 28 20 70  opy;.  assert( p
1df10 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 61 73 73  List!=0 );.  ass
1df20 65 72 74 28 20 74 61 72 67 65 74 3e 30 20 29 3b  ert( target>0 );
1df30 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
1df40 65 2d 3e 70 56 64 62 65 21 3d 30 20 29 3b 20 20  e->pVdbe!=0 );  
1df50 2f 2a 20 4e 65 76 65 72 20 67 65 74 73 20 74 68  /* Never gets th
1df60 69 73 20 66 61 72 20 6f 74 68 65 72 77 69 73 65  is far otherwise
1df70 20 2a 2f 0a 20 20 6e 20 3d 20 70 4c 69 73 74 2d   */.  n = pList-
1df80 3e 6e 45 78 70 72 3b 0a 20 20 69 66 28 20 21 43  >nExpr;.  if( !C
1df90 6f 6e 73 74 46 61 63 74 6f 72 4f 6b 28 70 50 61  onstFactorOk(pPa
1dfa0 72 73 65 29 20 29 20 66 6c 61 67 73 20 26 3d 20  rse) ) flags &= 
1dfb0 7e 53 51 4c 49 54 45 5f 45 43 45 4c 5f 46 41 43  ~SQLITE_ECEL_FAC
1dfc0 54 4f 52 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d  TOR;.  for(pItem
1dfd0 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20  =pList->a, i=0; 
1dfe0 69 3c 6e 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b  i<n; i++, pItem+
1dff0 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45  +){.    Expr *pE
1e000 78 70 72 20 3d 20 70 49 74 65 6d 2d 3e 70 45 78  xpr = pItem->pEx
1e010 70 72 3b 0a 20 20 20 20 69 66 28 20 28 66 6c 61  pr;.    if( (fla
1e020 67 73 20 26 20 53 51 4c 49 54 45 5f 45 43 45 4c  gs & SQLITE_ECEL
1e030 5f 46 41 43 54 4f 52 29 21 3d 30 20 26 26 20 73  _FACTOR)!=0 && s
1e040 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
1e050 74 61 6e 74 28 70 45 78 70 72 29 20 29 7b 0a 20  tant(pExpr) ){. 
1e060 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1e070 43 6f 64 65 41 74 49 6e 69 74 28 70 50 61 72 73  CodeAtInit(pPars
1e080 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65 74  e, pExpr, target
1e090 2b 69 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73  +i, 0);.    }els
1e0a0 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 6e 52  e{.      int inR
1e0b0 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  eg = sqlite3Expr
1e0c0 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73  CodeTarget(pPars
1e0d0 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65 74  e, pExpr, target
1e0e0 2b 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69  +i);.      if( i
1e0f0 6e 52 65 67 21 3d 74 61 72 67 65 74 2b 69 20 29  nReg!=target+i )
1e100 7b 0a 20 20 20 20 20 20 20 20 56 64 62 65 4f 70  {.        VdbeOp
1e110 20 2a 70 4f 70 3b 0a 20 20 20 20 20 20 20 20 56   *pOp;.        V
1e120 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
1e130 3e 70 56 64 62 65 3b 0a 20 20 20 20 20 20 20 20  >pVdbe;.        
1e140 69 66 28 20 63 6f 70 79 4f 70 3d 3d 4f 50 5f 43  if( copyOp==OP_C
1e150 6f 70 79 0a 20 20 20 20 20 20 20 20 20 26 26 20  opy.         && 
1e160 28 70 4f 70 3d 73 71 6c 69 74 65 33 56 64 62 65  (pOp=sqlite3Vdbe
1e170 47 65 74 4f 70 28 76 2c 20 2d 31 29 29 2d 3e 6f  GetOp(v, -1))->o
1e180 70 63 6f 64 65 3d 3d 4f 50 5f 43 6f 70 79 0a 20  pcode==OP_Copy. 
1e190 20 20 20 20 20 20 20 20 26 26 20 70 4f 70 2d 3e          && pOp->
1e1a0 70 31 2b 70 4f 70 2d 3e 70 33 2b 31 3d 3d 69 6e  p1+pOp->p3+1==in
1e1b0 52 65 67 0a 20 20 20 20 20 20 20 20 20 26 26 20  Reg.         && 
1e1c0 70 4f 70 2d 3e 70 32 2b 70 4f 70 2d 3e 70 33 2b  pOp->p2+pOp->p3+
1e1d0 31 3d 3d 74 61 72 67 65 74 2b 69 0a 20 20 20 20  1==target+i.    
1e1e0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
1e1f0 20 70 4f 70 2d 3e 70 33 2b 2b 3b 0a 20 20 20 20   pOp->p3++;.    
1e200 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1e210 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1e220 41 64 64 4f 70 32 28 76 2c 20 63 6f 70 79 4f 70  AddOp2(v, copyOp
1e230 2c 20 69 6e 52 65 67 2c 20 74 61 72 67 65 74 2b  , inReg, target+
1e240 69 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  i);.        }.  
1e250 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1e260 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f    return n;.}../
1e270 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
1e280 64 65 20 66 6f 72 20 61 20 42 45 54 57 45 45 4e  de for a BETWEEN
1e290 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a   operator..**.**
1e2a0 20 20 20 20 78 20 42 45 54 57 45 45 4e 20 79 20      x BETWEEN y 
1e2b0 41 4e 44 20 7a 0a 2a 2a 0a 2a 2a 20 54 68 65 20  AND z.**.** The 
1e2c0 61 62 6f 76 65 20 69 73 20 65 71 75 69 76 61 6c  above is equival
1e2d0 65 6e 74 20 74 6f 20 0a 2a 2a 0a 2a 2a 20 20 20  ent to .**.**   
1e2e0 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 0a 2a   x>=y AND x<=z.*
1e2f0 2a 0a 2a 2a 20 43 6f 64 65 20 69 74 20 61 73 20  *.** Code it as 
1e300 73 75 63 68 2c 20 74 61 6b 69 6e 67 20 63 61 72  such, taking car
1e310 65 20 74 6f 20 64 6f 20 74 68 65 20 63 6f 6d 6d  e to do the comm
1e320 6f 6e 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  on subexpression
1e330 0a 2a 2a 20 65 6c 69 6d 69 6e 61 74 69 6f 6e 20  .** elimination 
1e340 6f 66 20 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  of x..*/.static 
1e350 76 6f 69 64 20 65 78 70 72 43 6f 64 65 42 65 74  void exprCodeBet
1e360 77 65 65 6e 28 0a 20 20 50 61 72 73 65 20 2a 70  ween(.  Parse *p
1e370 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72  Parse,    /* Par
1e380 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65  sing and code ge
1e390 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74  nerating context
1e3a0 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70   */.  Expr *pExp
1e3b0 72 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 42  r,      /* The B
1e3c0 45 54 57 45 45 4e 20 65 78 70 72 65 73 73 69 6f  ETWEEN expressio
1e3d0 6e 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 2c  n */.  int dest,
1e3e0 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70           /* Jump
1e3f0 20 68 65 72 65 20 69 66 20 74 68 65 20 6a 75 6d   here if the jum
1e400 70 20 69 73 20 74 61 6b 65 6e 20 2a 2f 0a 20 20  p is taken */.  
1e410 69 6e 74 20 6a 75 6d 70 49 66 54 72 75 65 2c 20  int jumpIfTrue, 
1e420 20 20 2f 2a 20 54 61 6b 65 20 74 68 65 20 6a 75    /* Take the ju
1e430 6d 70 20 69 66 20 74 68 65 20 42 45 54 57 45 45  mp if the BETWEE
1e440 4e 20 69 73 20 74 72 75 65 20 2a 2f 0a 20 20 69  N is true */.  i
1e450 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 20 20  nt jumpIfNull   
1e460 20 2f 2a 20 54 61 6b 65 20 74 68 65 20 6a 75 6d   /* Take the jum
1e470 70 20 69 66 20 74 68 65 20 42 45 54 57 45 45 4e  p if the BETWEEN
1e480 20 69 73 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20   is NULL */.){. 
1e490 20 45 78 70 72 20 65 78 70 72 41 6e 64 3b 20 20   Expr exprAnd;  
1e4a0 20 20 20 2f 2a 20 54 68 65 20 41 4e 44 20 6f 70     /* The AND op
1e4b0 65 72 61 74 6f 72 20 69 6e 20 20 78 3e 3d 79 20  erator in  x>=y 
1e4c0 41 4e 44 20 78 3c 3d 7a 20 20 2a 2f 0a 20 20 45  AND x<=z  */.  E
1e4d0 78 70 72 20 63 6f 6d 70 4c 65 66 74 3b 20 20 20  xpr compLeft;   
1e4e0 20 2f 2a 20 54 68 65 20 20 78 3e 3d 79 20 20 74   /* The  x>=y  t
1e4f0 65 72 6d 20 2a 2f 0a 20 20 45 78 70 72 20 63 6f  erm */.  Expr co
1e500 6d 70 52 69 67 68 74 3b 20 20 20 2f 2a 20 54 68  mpRight;   /* Th
1e510 65 20 20 78 3c 3d 7a 20 20 74 65 72 6d 20 2a 2f  e  x<=z  term */
1e520 0a 20 20 45 78 70 72 20 65 78 70 72 58 3b 20 20  .  Expr exprX;  
1e530 20 20 20 20 20 2f 2a 20 54 68 65 20 20 78 20 20       /* The  x  
1e540 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f  subexpression */
1e550 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65 31 20  .  int regFree1 
1e560 3d 20 30 3b 20 2f 2a 20 54 65 6d 70 6f 72 61 72  = 0; /* Temporar
1e570 79 20 75 73 65 20 72 65 67 69 73 74 65 72 20 2a  y use register *
1e580 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 21 45 78  /..  assert( !Ex
1e590 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
1e5a0 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  xpr, EP_xIsSelec
1e5b0 74 29 20 29 3b 0a 20 20 65 78 70 72 58 20 3d 20  t) );.  exprX = 
1e5c0 2a 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20  *pExpr->pLeft;. 
1e5d0 20 65 78 70 72 41 6e 64 2e 6f 70 20 3d 20 54 4b   exprAnd.op = TK
1e5e0 5f 41 4e 44 3b 0a 20 20 65 78 70 72 41 6e 64 2e  _AND;.  exprAnd.
1e5f0 70 4c 65 66 74 20 3d 20 26 63 6f 6d 70 4c 65 66  pLeft = &compLef
1e600 74 3b 0a 20 20 65 78 70 72 41 6e 64 2e 70 52 69  t;.  exprAnd.pRi
1e610 67 68 74 20 3d 20 26 63 6f 6d 70 52 69 67 68 74  ght = &compRight
1e620 3b 0a 20 20 63 6f 6d 70 4c 65 66 74 2e 6f 70 20  ;.  compLeft.op 
1e630 3d 20 54 4b 5f 47 45 3b 0a 20 20 63 6f 6d 70 4c  = TK_GE;.  compL
1e640 65 66 74 2e 70 4c 65 66 74 20 3d 20 26 65 78 70  eft.pLeft = &exp
1e650 72 58 3b 0a 20 20 63 6f 6d 70 4c 65 66 74 2e 70  rX;.  compLeft.p
1e660 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 78  Right = pExpr->x
1e670 2e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  .pList->a[0].pEx
1e680 70 72 3b 0a 20 20 63 6f 6d 70 52 69 67 68 74 2e  pr;.  compRight.
1e690 6f 70 20 3d 20 54 4b 5f 4c 45 3b 0a 20 20 63 6f  op = TK_LE;.  co
1e6a0 6d 70 52 69 67 68 74 2e 70 4c 65 66 74 20 3d 20  mpRight.pLeft = 
1e6b0 26 65 78 70 72 58 3b 0a 20 20 63 6f 6d 70 52 69  &exprX;.  compRi
1e6c0 67 68 74 2e 70 52 69 67 68 74 20 3d 20 70 45 78  ght.pRight = pEx
1e6d0 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 31  pr->x.pList->a[1
1e6e0 5d 2e 70 45 78 70 72 3b 0a 20 20 65 78 70 72 54  ].pExpr;.  exprT
1e6f0 6f 52 65 67 69 73 74 65 72 28 26 65 78 70 72 58  oRegister(&exprX
1e700 2c 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  , sqlite3ExprCod
1e710 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 26 65  eTemp(pParse, &e
1e720 78 70 72 58 2c 20 26 72 65 67 46 72 65 65 31 29  xprX, &regFree1)
1e730 29 3b 0a 20 20 69 66 28 20 6a 75 6d 70 49 66 54  );.  if( jumpIfT
1e740 72 75 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  rue ){.    sqlit
1e750 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61  e3ExprIfTrue(pPa
1e760 72 73 65 2c 20 26 65 78 70 72 41 6e 64 2c 20 64  rse, &exprAnd, d
1e770 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
1e780 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
1e790 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
1e7a0 65 28 70 50 61 72 73 65 2c 20 26 65 78 70 72 41  e(pParse, &exprA
1e7b0 6e 64 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  nd, dest, jumpIf
1e7c0 4e 75 6c 6c 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  Null);.  }.  sql
1e7d0 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
1e7e0 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72  eg(pParse, regFr
1e7f0 65 65 31 29 3b 0a 0a 20 20 2f 2a 20 45 6e 73 75  ee1);..  /* Ensu
1e800 72 65 20 61 64 65 71 75 61 74 65 20 74 65 73 74  re adequate test
1e810 20 63 6f 76 65 72 61 67 65 20 2a 2f 0a 20 20 74   coverage */.  t
1e820 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 54  estcase( jumpIfT
1e830 72 75 65 3d 3d 30 20 26 26 20 6a 75 6d 70 49 66  rue==0 && jumpIf
1e840 4e 75 6c 6c 3d 3d 30 20 26 26 20 72 65 67 46 72  Null==0 && regFr
1e850 65 65 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74  ee1==0 );.  test
1e860 63 61 73 65 28 20 6a 75 6d 70 49 66 54 72 75 65  case( jumpIfTrue
1e870 3d 3d 30 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c  ==0 && jumpIfNul
1e880 6c 3d 3d 30 20 26 26 20 72 65 67 46 72 65 65 31  l==0 && regFree1
1e890 21 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73  !=0 );.  testcas
1e8a0 65 28 20 6a 75 6d 70 49 66 54 72 75 65 3d 3d 30  e( jumpIfTrue==0
1e8b0 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d   && jumpIfNull!=
1e8c0 30 20 26 26 20 72 65 67 46 72 65 65 31 3d 3d 30  0 && regFree1==0
1e8d0 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
1e8e0 6a 75 6d 70 49 66 54 72 75 65 3d 3d 30 20 26 26  jumpIfTrue==0 &&
1e8f0 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 20 26   jumpIfNull!=0 &
1e900 26 20 72 65 67 46 72 65 65 31 21 3d 30 20 29 3b  & regFree1!=0 );
1e910 0a 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d  .  testcase( jum
1e920 70 49 66 54 72 75 65 21 3d 30 20 26 26 20 6a 75  pIfTrue!=0 && ju
1e930 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26 20 72  mpIfNull==0 && r
1e940 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
1e950 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
1e960 54 72 75 65 21 3d 30 20 26 26 20 6a 75 6d 70 49  True!=0 && jumpI
1e970 66 4e 75 6c 6c 3d 3d 30 20 26 26 20 72 65 67 46  fNull==0 && regF
1e980 72 65 65 31 21 3d 30 20 29 3b 0a 20 20 74 65 73  ree1!=0 );.  tes
1e990 74 63 61 73 65 28 20 6a 75 6d 70 49 66 54 72 75  tcase( jumpIfTru
1e9a0 65 21 3d 30 20 26 26 20 6a 75 6d 70 49 66 4e 75  e!=0 && jumpIfNu
1e9b0 6c 6c 21 3d 30 20 26 26 20 72 65 67 46 72 65 65  ll!=0 && regFree
1e9c0 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61  1==0 );.  testca
1e9d0 73 65 28 20 6a 75 6d 70 49 66 54 72 75 65 21 3d  se( jumpIfTrue!=
1e9e0 30 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21  0 && jumpIfNull!
1e9f0 3d 30 20 26 26 20 72 65 67 46 72 65 65 31 21 3d  =0 && regFree1!=
1ea00 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  0 );.}../*.** Ge
1ea10 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
1ea20 61 20 62 6f 6f 6c 65 61 6e 20 65 78 70 72 65 73  a boolean expres
1ea30 73 69 6f 6e 20 73 75 63 68 20 74 68 61 74 20 61  sion such that a
1ea40 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 0a 2a 2a   jump is made.**
1ea50 20 74 6f 20 74 68 65 20 6c 61 62 65 6c 20 22 64   to the label "d
1ea60 65 73 74 22 20 69 66 20 74 68 65 20 65 78 70 72  est" if the expr
1ea70 65 73 73 69 6f 6e 20 69 73 20 74 72 75 65 20 62  ession is true b
1ea80 75 74 20 65 78 65 63 75 74 69 6f 6e 0a 2a 2a 20  ut execution.** 
1ea90 63 6f 6e 74 69 6e 75 65 73 20 73 74 72 61 69 67  continues straig
1eaa0 68 74 20 74 68 72 75 20 69 66 20 74 68 65 20 65  ht thru if the e
1eab0 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66 61 6c  xpression is fal
1eac0 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  se..**.** If the
1ead0 20 65 78 70 72 65 73 73 69 6f 6e 20 65 76 61 6c   expression eval
1eae0 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c 20 28 6e  uates to NULL (n
1eaf0 65 69 74 68 65 72 20 74 72 75 65 20 6e 6f 72 20  either true nor 
1eb00 66 61 6c 73 65 29 2c 20 74 68 65 6e 0a 2a 2a 20  false), then.** 
1eb10 74 61 6b 65 20 74 68 65 20 6a 75 6d 70 20 69 66  take the jump if
1eb20 20 74 68 65 20 6a 75 6d 70 49 66 4e 75 6c 6c 20   the jumpIfNull 
1eb30 66 6c 61 67 20 69 73 20 53 51 4c 49 54 45 5f 4a  flag is SQLITE_J
1eb40 55 4d 50 49 46 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  UMPIFNULL..**.**
1eb50 20 54 68 69 73 20 63 6f 64 65 20 64 65 70 65 6e   This code depen
1eb60 64 73 20 6f 6e 20 74 68 65 20 66 61 63 74 20 74  ds on the fact t
1eb70 68 61 74 20 63 65 72 74 61 69 6e 20 74 6f 6b 65  hat certain toke
1eb80 6e 20 76 61 6c 75 65 73 20 28 65 78 3a 20 54 4b  n values (ex: TK
1eb90 5f 45 51 29 0a 2a 2a 20 61 72 65 20 74 68 65 20  _EQ).** are the 
1eba0 73 61 6d 65 20 61 73 20 6f 70 63 6f 64 65 20 76  same as opcode v
1ebb0 61 6c 75 65 73 20 28 65 78 3a 20 4f 50 5f 45 71  alues (ex: OP_Eq
1ebc0 29 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74  ) that implement
1ebd0 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
1ebe0 6e 67 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 2e  ng.** operation.
1ebf0 20 20 53 70 65 63 69 61 6c 20 63 6f 6d 6d 65 6e    Special commen
1ec00 74 73 20 69 6e 20 76 64 62 65 2e 63 20 61 6e 64  ts in vdbe.c and
1ec10 20 74 68 65 20 6d 6b 6f 70 63 6f 64 65 68 2e 61   the mkopcodeh.a
1ec20 77 6b 20 73 63 72 69 70 74 20 69 6e 0a 2a 2a 20  wk script in.** 
1ec30 74 68 65 20 6d 61 6b 65 20 70 72 6f 63 65 73 73  the make process
1ec40 20 63 61 75 73 65 20 74 68 65 73 65 20 76 61 6c   cause these val
1ec50 75 65 73 20 74 6f 20 61 6c 69 67 6e 2e 20 20 41  ues to align.  A
1ec60 73 73 65 72 74 28 29 73 20 69 6e 20 74 68 65 20  ssert()s in the 
1ec70 63 6f 64 65 0a 2a 2a 20 62 65 6c 6f 77 20 76 65  code.** below ve
1ec80 72 69 66 79 20 74 68 61 74 20 74 68 65 20 6e 75  rify that the nu
1ec90 6d 62 65 72 73 20 61 72 65 20 61 6c 69 67 6e 65  mbers are aligne
1eca0 64 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a  d correctly..*/.
1ecb0 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
1ecc0 49 66 54 72 75 65 28 50 61 72 73 65 20 2a 70 50  IfTrue(Parse *pP
1ecd0 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
1ece0 72 2c 20 69 6e 74 20 64 65 73 74 2c 20 69 6e 74  r, int dest, int
1ecf0 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20   jumpIfNull){.  
1ed00 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
1ed10 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 6f  ->pVdbe;.  int o
1ed20 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 67  p = 0;.  int reg
1ed30 46 72 65 65 31 20 3d 20 30 3b 0a 20 20 69 6e 74  Free1 = 0;.  int
1ed40 20 72 65 67 46 72 65 65 32 20 3d 20 30 3b 0a 20   regFree2 = 0;. 
1ed50 20 69 6e 74 20 72 31 2c 20 72 32 3b 0a 0a 20 20   int r1, r2;..  
1ed60 61 73 73 65 72 74 28 20 6a 75 6d 70 49 66 4e 75  assert( jumpIfNu
1ed70 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4a 55 4d 50 49  ll==SQLITE_JUMPI
1ed80 46 4e 55 4c 4c 20 7c 7c 20 6a 75 6d 70 49 66 4e  FNULL || jumpIfN
1ed90 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  ull==0 );.  if( 
1eda0 4e 45 56 45 52 28 76 3d 3d 30 29 20 29 20 20 20  NEVER(v==0) )   
1edb0 20 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 45 78    return;  /* Ex
1edc0 69 73 74 65 6e 63 65 20 6f 66 20 56 44 42 45 20  istence of VDBE 
1edd0 63 68 65 63 6b 65 64 20 62 79 20 63 61 6c 6c 65  checked by calle
1ede0 72 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52  r */.  if( NEVER
1edf0 28 70 45 78 70 72 3d 3d 30 29 20 29 20 72 65 74  (pExpr==0) ) ret
1ee00 75 72 6e 3b 20 20 2f 2a 20 4e 6f 20 77 61 79 20  urn;  /* No way 
1ee10 74 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e 20  this can happen 
1ee20 2a 2f 0a 20 20 6f 70 20 3d 20 70 45 78 70 72 2d  */.  op = pExpr-
1ee30 3e 6f 70 3b 0a 20 20 73 77 69 74 63 68 28 20 6f  >op;.  switch( o
1ee40 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
1ee50 5f 41 4e 44 3a 20 7b 0a 20 20 20 20 20 20 69 6e  _AND: {.      in
1ee60 74 20 64 32 20 3d 20 73 71 6c 69 74 65 33 56 64  t d2 = sqlite3Vd
1ee70 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
1ee80 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1ee90 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
1eea0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1eeb0 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
1eec0 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
1eed0 64 32 2c 6a 75 6d 70 49 66 4e 75 6c 6c 5e 53 51  d2,jumpIfNull^SQ
1eee0 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29  LITE_JUMPIFNULL)
1eef0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1ef00 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61  xprCachePush(pPa
1ef10 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  rse);.      sqli
1ef20 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50  te3ExprIfTrue(pP
1ef30 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69  arse, pExpr->pRi
1ef40 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49  ght, dest, jumpI
1ef50 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71  fNull);.      sq
1ef60 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
1ef70 4c 61 62 65 6c 28 76 2c 20 64 32 29 3b 0a 20 20  Label(v, d2);.  
1ef80 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
1ef90 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b  achePop(pParse);
1efa0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1efb0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
1efc0 4f 52 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74  OR: {.      test
1efd0 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  case( jumpIfNull
1efe0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ==0 );.      sql
1eff0 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70  ite3ExprIfTrue(p
1f000 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
1f010 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49  eft, dest, jumpI
1f020 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71  fNull);.      sq
1f030 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75  lite3ExprCachePu
1f040 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  sh(pParse);.    
1f050 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54    sqlite3ExprIfT
1f060 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  rue(pParse, pExp
1f070 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c  r->pRight, dest,
1f080 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
1f090 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
1f0a0 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b  achePop(pParse);
1f0b0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1f0c0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
1f0d0 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 74 65 73  NOT: {.      tes
1f0e0 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c  tcase( jumpIfNul
1f0f0 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71  l==0 );.      sq
1f100 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
1f110 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
1f120 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d  pLeft, dest, jum
1f130 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
1f140 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1f150 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20   case TK_LT:.   
1f160 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20   case TK_LE:.   
1f170 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20   case TK_GT:.   
1f180 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20   case TK_GE:.   
1f190 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20   case TK_NE:.   
1f1a0 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20   case TK_EQ: {. 
1f1b0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
1f1c0 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
1f1d0 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
1f1e0 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
1f1f0 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
1f200 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b  eft, &regFree1);
1f210 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69  .      r2 = sqli
1f220 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
1f230 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
1f240 52 69 67 68 74 2c 20 26 72 65 67 46 72 65 65 32  Right, &regFree2
1f250 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d  );.      codeCom
1f260 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 45 78  pare(pParse, pEx
1f270 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72  pr->pLeft, pExpr
1f280 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20  ->pRight, op,.  
1f290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f2a0 72 31 2c 20 72 32 2c 20 64 65 73 74 2c 20 6a 75  r1, r2, dest, ju
1f2b0 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
1f2c0 20 61 73 73 65 72 74 28 54 4b 5f 4c 54 3d 3d 4f   assert(TK_LT==O
1f2d0 50 5f 4c 74 29 3b 20 74 65 73 74 63 61 73 65 28  P_Lt); testcase(
1f2e0 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 20 56 64 62 65  op==OP_Lt); Vdbe
1f2f0 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d  CoverageIf(v,op=
1f300 3d 4f 50 5f 4c 74 29 3b 0a 20 20 20 20 20 20 61  =OP_Lt);.      a
1f310 73 73 65 72 74 28 54 4b 5f 4c 45 3d 3d 4f 50 5f  ssert(TK_LE==OP_
1f320 4c 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70  Le); testcase(op
1f330 3d 3d 4f 50 5f 4c 65 29 3b 20 56 64 62 65 43 6f  ==OP_Le); VdbeCo
1f340 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f  verageIf(v,op==O
1f350 50 5f 4c 65 29 3b 0a 20 20 20 20 20 20 61 73 73  P_Le);.      ass
1f360 65 72 74 28 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74  ert(TK_GT==OP_Gt
1f370 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d  ); testcase(op==
1f380 4f 50 5f 47 74 29 3b 20 56 64 62 65 43 6f 76 65  OP_Gt); VdbeCove
1f390 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f  rageIf(v,op==OP_
1f3a0 47 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Gt);.      asser
1f3b0 74 28 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65 29 3b  t(TK_GE==OP_Ge);
1f3c0 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50   testcase(op==OP
1f3d0 5f 47 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61  _Ge); VdbeCovera
1f3e0 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 65  geIf(v,op==OP_Ge
1f3f0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1f400 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71 29 3b 20 74  TK_EQ==OP_Eq); t
1f410 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 45  estcase(op==OP_E
1f420 71 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  q); VdbeCoverage
1f430 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 45 71 29 3b  If(v,op==OP_Eq);
1f440 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b  .      assert(TK
1f450 5f 4e 45 3d 3d 4f 50 5f 4e 65 29 3b 20 74 65 73  _NE==OP_Ne); tes
1f460 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4e 65 29  tcase(op==OP_Ne)
1f470 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66  ; VdbeCoverageIf
1f480 28 76 2c 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 0a 20  (v,op==OP_Ne);. 
1f490 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
1f4a0 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
1f4b0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
1f4c0 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20  gFree2==0 );.   
1f4d0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1f4e0 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 3a 0a      case TK_IS:.
1f4f0 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f      case TK_ISNO
1f500 54 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63  T: {.      testc
1f510 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 20 29  ase( op==TK_IS )
1f520 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1f530 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29  ( op==TK_ISNOT )
1f540 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  ;.      r1 = sql
1f550 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
1f560 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
1f570 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31  pLeft, &regFree1
1f580 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71  );.      r2 = sq
1f590 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
1f5a0 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
1f5b0 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46 72 65  >pRight, &regFre
1f5c0 65 32 29 3b 0a 20 20 20 20 20 20 6f 70 20 3d 20  e2);.      op = 
1f5d0 28 6f 70 3d 3d 54 4b 5f 49 53 29 20 3f 20 54 4b  (op==TK_IS) ? TK
1f5e0 5f 45 51 20 3a 20 54 4b 5f 4e 45 3b 0a 20 20 20  _EQ : TK_NE;.   
1f5f0 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70     codeCompare(p
1f600 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
1f610 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  eft, pExpr->pRig
1f620 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20 20  ht, op,.        
1f630 20 20 20 20 20 20 20 20 20 20 72 31 2c 20 72 32            r1, r2
1f640 2c 20 64 65 73 74 2c 20 53 51 4c 49 54 45 5f 4e  , dest, SQLITE_N
1f650 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 56 64  ULLEQ);.      Vd
1f660 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
1f670 6f 70 3d 3d 54 4b 5f 45 51 29 3b 0a 20 20 20 20  op==TK_EQ);.    
1f680 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
1f690 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4e 45 29 3b 0a  (v, op==TK_NE);.
1f6a0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1f6b0 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
1f6c0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
1f6d0 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20  egFree2==0 );.  
1f6e0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1f6f0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e  .    case TK_ISN
1f700 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  ULL:.    case TK
1f710 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20  _NOTNULL: {.    
1f720 20 20 61 73 73 65 72 74 28 20 54 4b 5f 49 53 4e    assert( TK_ISN
1f730 55 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29  ULL==OP_IsNull )
1f740 3b 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70  ;   testcase( op
1f750 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20  ==TK_ISNULL );. 
1f760 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
1f770 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e  NOTNULL==OP_NotN
1f780 75 6c 6c 20 29 3b 20 74 65 73 74 63 61 73 65 28  ull ); testcase(
1f790 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20   op==TK_NOTNULL 
1f7a0 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71  );.      r1 = sq
1f7b0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
1f7c0 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
1f7d0 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65  >pLeft, &regFree
1f7e0 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
1f7f0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 6f  3VdbeAddOp2(v, o
1f800 70 2c 20 72 31 2c 20 64 65 73 74 29 3b 0a 20 20  p, r1, dest);.  
1f810 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
1f820 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 49 53 4e  If(v, op==TK_ISN
1f830 55 4c 4c 29 3b 0a 20 20 20 20 20 20 56 64 62 65  ULL);.      Vdbe
1f840 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70  CoverageIf(v, op
1f850 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a 20  ==TK_NOTNULL);. 
1f860 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
1f870 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
1f880 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1f890 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54  .    case TK_BET
1f8a0 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 74 65  WEEN: {.      te
1f8b0 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75  stcase( jumpIfNu
1f8c0 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 65  ll==0 );.      e
1f8d0 78 70 72 43 6f 64 65 42 65 74 77 65 65 6e 28 70  xprCodeBetween(p
1f8e0 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64 65  Parse, pExpr, de
1f8f0 73 74 2c 20 31 2c 20 6a 75 6d 70 49 66 4e 75 6c  st, 1, jumpIfNul
1f900 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  l);.      break;
1f910 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
1f920 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
1f930 45 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ERY.    case TK_
1f940 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  IN: {.      int 
1f950 64 65 73 74 49 66 46 61 6c 73 65 20 3d 20 73 71  destIfFalse = sq
1f960 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
1f970 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 6e 74  el(v);.      int
1f980 20 64 65 73 74 49 66 4e 75 6c 6c 20 3d 20 6a 75   destIfNull = ju
1f990 6d 70 49 66 4e 75 6c 6c 20 3f 20 64 65 73 74 20  mpIfNull ? dest 
1f9a0 3a 20 64 65 73 74 49 66 46 61 6c 73 65 3b 0a 20  : destIfFalse;. 
1f9b0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1f9c0 43 6f 64 65 49 4e 28 70 50 61 72 73 65 2c 20 70  CodeIN(pParse, p
1f9d0 45 78 70 72 2c 20 64 65 73 74 49 66 46 61 6c 73  Expr, destIfFals
1f9e0 65 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a  e, destIfNull);.
1f9f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1fa00 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
1fa10 74 6f 2c 20 30 2c 20 64 65 73 74 29 3b 0a 20 20  to, 0, dest);.  
1fa20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
1fa30 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64  esolveLabel(v, d
1fa40 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 20 20 20  estIfFalse);.   
1fa50 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1fa60 23 65 6e 64 69 66 0a 20 20 20 20 64 65 66 61 75  #endif.    defau
1fa70 6c 74 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  lt: {.      if( 
1fa80 65 78 70 72 41 6c 77 61 79 73 54 72 75 65 28 70  exprAlwaysTrue(p
1fa90 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20  Expr) ){.       
1faa0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1fab0 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
1fac0 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 7d  , dest);.      }
1fad0 65 6c 73 65 20 69 66 28 20 65 78 70 72 41 6c 77  else if( exprAlw
1fae0 61 79 73 46 61 6c 73 65 28 70 45 78 70 72 29 20  aysFalse(pExpr) 
1faf0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f  ){.        /* No
1fb00 2d 6f 70 20 2a 2f 0a 20 20 20 20 20 20 7d 65 6c  -op */.      }el
1fb10 73 65 7b 0a 20 20 20 20 20 20 20 20 72 31 20 3d  se{.        r1 =
1fb20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1fb30 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
1fb40 70 72 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  pr, &regFree1);.
1fb50 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
1fb60 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
1fb70 49 66 2c 20 72 31 2c 20 64 65 73 74 2c 20 6a 75  If, r1, dest, ju
1fb80 6d 70 49 66 4e 75 6c 6c 21 3d 30 29 3b 0a 20 20  mpIfNull!=0);.  
1fb90 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
1fba0 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 74  ge(v);.        t
1fbb0 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
1fbc0 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  1==0 );.        
1fbd0 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
1fbe0 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Null==0 );.     
1fbf0 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
1fc00 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
1fc10 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
1fc20 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65  g(pParse, regFre
1fc30 65 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65  e1);.  sqlite3Re
1fc40 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
1fc50 72 73 65 2c 20 72 65 67 46 72 65 65 32 29 3b 20  rse, regFree2); 
1fc60 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72   .}../*.** Gener
1fc70 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20 62  ate code for a b
1fc80 6f 6f 6c 65 61 6e 20 65 78 70 72 65 73 73 69 6f  oolean expressio
1fc90 6e 20 73 75 63 68 20 74 68 61 74 20 61 20 6a 75  n such that a ju
1fca0 6d 70 20 69 73 20 6d 61 64 65 0a 2a 2a 20 74 6f  mp is made.** to
1fcb0 20 74 68 65 20 6c 61 62 65 6c 20 22 64 65 73 74   the label "dest
1fcc0 22 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  " if the express
1fcd0 69 6f 6e 20 69 73 20 66 61 6c 73 65 20 62 75 74  ion is false but
1fce0 20 65 78 65 63 75 74 69 6f 6e 0a 2a 2a 20 63 6f   execution.** co
1fcf0 6e 74 69 6e 75 65 73 20 73 74 72 61 69 67 68 74  ntinues straight
1fd00 20 74 68 72 75 20 69 66 20 74 68 65 20 65 78 70   thru if the exp
1fd10 72 65 73 73 69 6f 6e 20 69 73 20 74 72 75 65 2e  ression is true.
1fd20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78  .**.** If the ex
1fd30 70 72 65 73 73 69 6f 6e 20 65 76 61 6c 75 61 74  pression evaluat
1fd40 65 73 20 74 6f 20 4e 55 4c 4c 20 28 6e 65 69 74  es to NULL (neit
1fd50 68 65 72 20 74 72 75 65 20 6e 6f 72 20 66 61 6c  her true nor fal
1fd60 73 65 29 20 74 68 65 6e 0a 2a 2a 20 6a 75 6d 70  se) then.** jump
1fd70 20 69 66 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 69   if jumpIfNull i
1fd80 73 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  s SQLITE_JUMPIFN
1fd90 55 4c 4c 20 6f 72 20 66 61 6c 6c 20 74 68 72 6f  ULL or fall thro
1fda0 75 67 68 20 69 66 20 6a 75 6d 70 49 66 4e 75 6c  ugh if jumpIfNul
1fdb0 6c 0a 2a 2a 20 69 73 20 30 2e 0a 2a 2f 0a 76 6f  l.** is 0..*/.vo
1fdc0 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 49 66  id sqlite3ExprIf
1fdd0 46 61 6c 73 65 28 50 61 72 73 65 20 2a 70 50 61  False(Parse *pPa
1fde0 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
1fdf0 2c 20 69 6e 74 20 64 65 73 74 2c 20 69 6e 74 20  , int dest, int 
1fe00 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 56  jumpIfNull){.  V
1fe10 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
1fe20 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 6f 70  >pVdbe;.  int op
1fe30 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 67 46   = 0;.  int regF
1fe40 72 65 65 31 20 3d 20 30 3b 0a 20 20 69 6e 74 20  ree1 = 0;.  int 
1fe50 72 65 67 46 72 65 65 32 20 3d 20 30 3b 0a 20 20  regFree2 = 0;.  
1fe60 69 6e 74 20 72 31 2c 20 72 32 3b 0a 0a 20 20 61  int r1, r2;..  a
1fe70 73 73 65 72 74 28 20 6a 75 6d 70 49 66 4e 75 6c  ssert( jumpIfNul
1fe80 6c 3d 3d 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46  l==SQLITE_JUMPIF
1fe90 4e 55 4c 4c 20 7c 7c 20 6a 75 6d 70 49 66 4e 75  NULL || jumpIfNu
1fea0 6c 6c 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 4e  ll==0 );.  if( N
1feb0 45 56 45 52 28 76 3d 3d 30 29 20 29 20 72 65 74  EVER(v==0) ) ret
1fec0 75 72 6e 3b 20 2f 2a 20 45 78 69 73 74 65 6e 63  urn; /* Existenc
1fed0 65 20 6f 66 20 56 44 42 45 20 63 68 65 63 6b 65  e of VDBE checke
1fee0 64 20 62 79 20 63 61 6c 6c 65 72 20 2a 2f 0a 20  d by caller */. 
1fef0 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20   if( pExpr==0 ) 
1ff00 20 20 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a     return;..  /*
1ff10 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20 70 45   The value of pE
1ff20 78 70 72 2d 3e 6f 70 20 61 6e 64 20 6f 70 20 61  xpr->op and op a
1ff30 72 65 20 72 65 6c 61 74 65 64 20 61 73 20 66 6f  re related as fo
1ff40 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  llows:.  **.  **
1ff50 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70         pExpr->op
1ff60 20 20 20 20 20 20 20 20 20 20 20 20 6f 70 0a 20              op. 
1ff70 20 2a 2a 20 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d   **       ------
1ff80 2d 2d 2d 20 20 20 20 20 20 20 20 20 20 2d 2d 2d  ---          ---
1ff90 2d 2d 2d 2d 2d 2d 2d 0a 20 20 2a 2a 20 20 20 20  -------.  **    
1ffa0 20 20 20 54 4b 5f 49 53 4e 55 4c 4c 20 20 20 20     TK_ISNULL    
1ffb0 20 20 20 20 20 20 4f 50 5f 4e 6f 74 4e 75 6c 6c        OP_NotNull
1ffc0 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4e  .  **       TK_N
1ffd0 4f 54 4e 55 4c 4c 20 20 20 20 20 20 20 20 20 4f  OTNULL         O
1ffe0 50 5f 49 73 4e 75 6c 6c 0a 20 20 2a 2a 20 20 20  P_IsNull.  **   
1fff0 20 20 20 20 54 4b 5f 4e 45 20 20 20 20 20 20 20      TK_NE       
20000 20 20 20 20 20 20 20 4f 50 5f 45 71 0a 20 20 2a         OP_Eq.  *
20010 2a 20 20 20 20 20 20 20 54 4b 5f 45 51 20 20 20  *       TK_EQ   
20020 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4e 65             OP_Ne
20030 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 47  .  **       TK_G
20040 54 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f  T              O
20050 50 5f 4c 65 0a 20 20 2a 2a 20 20 20 20 20 20 20  P_Le.  **       
20060 54 4b 5f 4c 45 20 20 20 20 20 20 20 20 20 20 20  TK_LE           
20070 20 20 20 4f 50 5f 47 74 0a 20 20 2a 2a 20 20 20     OP_Gt.  **   
20080 20 20 20 20 54 4b 5f 47 45 20 20 20 20 20 20 20      TK_GE       
20090 20 20 20 20 20 20 20 4f 50 5f 4c 74 0a 20 20 2a         OP_Lt.  *
200a0 2a 20 20 20 20 20 20 20 54 4b 5f 4c 54 20 20 20  *       TK_LT   
200b0 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 47 65             OP_Ge
200c0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46 6f 72 20 6f  .  **.  ** For o
200d0 74 68 65 72 20 76 61 6c 75 65 73 20 6f 66 20 70  ther values of p
200e0 45 78 70 72 2d 3e 6f 70 2c 20 6f 70 20 69 73 20  Expr->op, op is 
200f0 75 6e 64 65 66 69 6e 65 64 20 61 6e 64 20 75 6e  undefined and un
20100 75 73 65 64 2e 0a 20 20 2a 2a 20 54 68 65 20 76  used..  ** The v
20110 61 6c 75 65 20 6f 66 20 54 4b 5f 20 61 6e 64 20  alue of TK_ and 
20120 4f 50 5f 20 63 6f 6e 73 74 61 6e 74 73 20 61 72  OP_ constants ar
20130 65 20 61 72 72 61 6e 67 65 64 20 73 75 63 68 20  e arranged such 
20140 74 68 61 74 20 77 65 0a 20 20 2a 2a 20 63 61 6e  that we.  ** can
20150 20 63 6f 6d 70 75 74 65 20 74 68 65 20 6d 61 70   compute the map
20160 70 69 6e 67 20 61 62 6f 76 65 20 75 73 69 6e 67  ping above using
20170 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65   the following e
20180 78 70 72 65 73 73 69 6f 6e 2e 0a 20 20 2a 2a 20  xpression..  ** 
20190 41 73 73 65 72 74 28 29 73 20 76 65 72 69 66 79  Assert()s verify
201a0 20 74 68 61 74 20 74 68 65 20 63 6f 6d 70 75 74   that the comput
201b0 61 74 69 6f 6e 20 69 73 20 63 6f 72 72 65 63 74  ation is correct
201c0 2e 0a 20 20 2a 2f 0a 20 20 6f 70 20 3d 20 28 28  ..  */.  op = ((
201d0 70 45 78 70 72 2d 3e 6f 70 2b 28 54 4b 5f 49 53  pExpr->op+(TK_IS
201e0 4e 55 4c 4c 26 31 29 29 5e 31 29 2d 28 54 4b 5f  NULL&1))^1)-(TK_
201f0 49 53 4e 55 4c 4c 26 31 29 3b 0a 0a 20 20 2f 2a  ISNULL&1);..  /*
20200 20 56 65 72 69 66 79 20 63 6f 72 72 65 63 74 20   Verify correct 
20210 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 54 4b 5f  alignment of TK_
20220 20 61 6e 64 20 4f 50 5f 20 63 6f 6e 73 74 61 6e   and OP_ constan
20230 74 73 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  ts.  */.  assert
20240 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
20250 49 53 4e 55 4c 4c 20 7c 7c 20 6f 70 3d 3d 4f 50  ISNULL || op==OP
20260 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 0a 20 20 61 73  _NotNull );.  as
20270 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21  sert( pExpr->op!
20280 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 7c 7c 20 6f  =TK_NOTNULL || o
20290 70 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 0a  p==OP_IsNull );.
202a0 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
202b0 3e 6f 70 21 3d 54 4b 5f 4e 45 20 7c 7c 20 6f 70  >op!=TK_NE || op
202c0 3d 3d 4f 50 5f 45 71 20 29 3b 0a 20 20 61 73 73  ==OP_Eq );.  ass
202d0 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d  ert( pExpr->op!=
202e0 54 4b 5f 45 51 20 7c 7c 20 6f 70 3d 3d 4f 50 5f  TK_EQ || op==OP_
202f0 4e 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Ne );.  assert( 
20300 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4c 54  pExpr->op!=TK_LT
20310 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 65 20 29 3b   || op==OP_Ge );
20320 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
20330 2d 3e 6f 70 21 3d 54 4b 5f 4c 45 20 7c 7c 20 6f  ->op!=TK_LE || o
20340 70 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20 20 61 73  p==OP_Gt );.  as
20350 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21  sert( pExpr->op!
20360 3d 54 4b 5f 47 54 20 7c 7c 20 6f 70 3d 3d 4f 50  =TK_GT || op==OP
20370 5f 4c 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _Le );.  assert(
20380 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 47   pExpr->op!=TK_G
20390 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c 74 20 29  E || op==OP_Lt )
203a0 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45 78  ;..  switch( pEx
203b0 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61  pr->op ){.    ca
203c0 73 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a 20 20 20  se TK_AND: {.   
203d0 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d     testcase( jum
203e0 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
203f0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
20400 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
20410 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73  Expr->pLeft, des
20420 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
20430 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
20440 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73  rCachePush(pPars
20450 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
20460 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
20470 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
20480 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  ht, dest, jumpIf
20490 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c  Null);.      sql
204a0 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70  ite3ExprCachePop
204b0 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
204c0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
204d0 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20   case TK_OR: {. 
204e0 20 20 20 20 20 69 6e 74 20 64 32 20 3d 20 73 71       int d2 = sq
204f0 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
20500 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 74 65 73  el(v);.      tes
20510 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c  tcase( jumpIfNul
20520 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71  l==0 );.      sq
20530 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28  lite3ExprIfTrue(
20540 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
20550 4c 65 66 74 2c 20 64 32 2c 20 6a 75 6d 70 49 66  Left, d2, jumpIf
20560 4e 75 6c 6c 5e 53 51 4c 49 54 45 5f 4a 55 4d 50  Null^SQLITE_JUMP
20570 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73  IFNULL);.      s
20580 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
20590 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20  ush(pParse);.   
205a0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
205b0 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45  False(pParse, pE
205c0 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73  xpr->pRight, des
205d0 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
205e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
205f0 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
20600 20 64 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   d2);.      sqli
20610 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28  te3ExprCachePop(
20620 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 62  pParse);.      b
20630 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
20640 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20  case TK_NOT: {. 
20650 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
20660 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
20670 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
20680 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20  rIfTrue(pParse, 
20690 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65  pExpr->pLeft, de
206a0 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
206b0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
206c0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
206d0 4c 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  LT:.    case TK_
206e0 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  LE:.    case TK_
206f0 47 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  GT:.    case TK_
20700 47 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  GE:.    case TK_
20710 4e 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  NE:.    case TK_
20720 45 51 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74  EQ: {.      test
20730 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  case( jumpIfNull
20740 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 31 20  ==0 );.      r1 
20750 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
20760 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
20770 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67  xpr->pLeft, &reg
20780 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32  Free1);.      r2
20790 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
207a0 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
207b0 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72  Expr->pRight, &r
207c0 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20  egFree2);.      
207d0 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72  codeCompare(pPar
207e0 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
207f0 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
20800 20 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20   op,.           
20810 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c 20 64         r1, r2, d
20820 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
20830 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54  ;.      assert(T
20840 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 29 3b 20 74 65  K_LT==OP_Lt); te
20850 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 74  stcase(op==OP_Lt
20860 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49  ); VdbeCoverageI
20870 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a  f(v,op==OP_Lt);.
20880 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f        assert(TK_
20890 4c 45 3d 3d 4f 50 5f 4c 65 29 3b 20 74 65 73 74  LE==OP_Le); test
208a0 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 65 29 3b  case(op==OP_Le);
208b0 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
208c0 76 2c 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 0a 20 20  v,op==OP_Le);.  
208d0 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 47 54      assert(TK_GT
208e0 3d 3d 4f 50 5f 47 74 29 3b 20 74 65 73 74 63 61  ==OP_Gt); testca
208f0 73 65 28 6f 70 3d 3d 4f 50 5f 47 74 29 3b 20 56  se(op==OP_Gt); V
20900 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
20910 6f 70 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20 20 20  op==OP_Gt);.    
20920 20 20 61 73 73 65 72 74 28 54 4b 5f 47 45 3d 3d    assert(TK_GE==
20930 4f 50 5f 47 65 29 3b 20 74 65 73 74 63 61 73 65  OP_Ge); testcase
20940 28 6f 70 3d 3d 4f 50 5f 47 65 29 3b 20 56 64 62  (op==OP_Ge); Vdb
20950 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70  eCoverageIf(v,op
20960 3d 3d 4f 50 5f 47 65 29 3b 0a 20 20 20 20 20 20  ==OP_Ge);.      
20970 61 73 73 65 72 74 28 54 4b 5f 45 51 3d 3d 4f 50  assert(TK_EQ==OP
20980 5f 45 71 29 3b 20 74 65 73 74 63 61 73 65 28 6f  _Eq); testcase(o
20990 70 3d 3d 4f 50 5f 45 71 29 3b 20 56 64 62 65 43  p==OP_Eq); VdbeC
209a0 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d  overageIf(v,op==
209b0 4f 50 5f 45 71 29 3b 0a 20 20 20 20 20 20 61 73  OP_Eq);.      as
209c0 73 65 72 74 28 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e  sert(TK_NE==OP_N
209d0 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d  e); testcase(op=
209e0 3d 4f 50 5f 4e 65 29 3b 20 56 64 62 65 43 6f 76  =OP_Ne); VdbeCov
209f0 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50  erageIf(v,op==OP
20a00 5f 4e 65 29 3b 0a 20 20 20 20 20 20 74 65 73 74  _Ne);.      test
20a10 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d  case( regFree1==
20a20 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  0 );.      testc
20a30 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30  ase( regFree2==0
20a40 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
20a50 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
20a60 54 4b 5f 49 53 3a 0a 20 20 20 20 63 61 73 65 20  TK_IS:.    case 
20a70 54 4b 5f 49 53 4e 4f 54 3a 20 7b 0a 20 20 20 20  TK_ISNOT: {.    
20a80 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
20a90 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a  r->op==TK_IS );.
20aa0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
20ab0 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53  pExpr->op==TK_IS
20ac0 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20 72 31 20  NOT );.      r1 
20ad0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
20ae0 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
20af0 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67  xpr->pLeft, &reg
20b00 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32  Free1);.      r2
20b10 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
20b20 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
20b30 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72  Expr->pRight, &r
20b40 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20  egFree2);.      
20b50 6f 70 20 3d 20 28 70 45 78 70 72 2d 3e 6f 70 3d  op = (pExpr->op=
20b60 3d 54 4b 5f 49 53 29 20 3f 20 54 4b 5f 4e 45 20  =TK_IS) ? TK_NE 
20b70 3a 20 54 4b 5f 45 51 3b 0a 20 20 20 20 20 20 63  : TK_EQ;.      c
20b80 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73  odeCompare(pPars
20b90 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
20ba0 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
20bb0 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  op,.            
20bc0 20 20 20 20 20 20 72 31 2c 20 72 32 2c 20 64 65        r1, r2, de
20bd0 73 74 2c 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45  st, SQLITE_NULLE
20be0 51 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  Q);.      VdbeCo
20bf0 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
20c00 54 4b 5f 45 51 29 3b 0a 20 20 20 20 20 20 56 64  TK_EQ);.      Vd
20c10 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
20c20 6f 70 3d 3d 54 4b 5f 4e 45 29 3b 0a 20 20 20 20  op==TK_NE);.    
20c30 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
20c40 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
20c50 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
20c60 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee2==0 );.      
20c70 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
20c80 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a   case TK_ISNULL:
20c90 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54  .    case TK_NOT
20ca0 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 72 31  NULL: {.      r1
20cb0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
20cc0 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
20cd0 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65  Expr->pLeft, &re
20ce0 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 73  gFree1);.      s
20cf0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
20d00 28 76 2c 20 6f 70 2c 20 72 31 2c 20 64 65 73 74  (v, op, r1, dest
20d10 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
20d20 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c  e( op==TK_ISNULL
20d30 20 29 3b 20 20 20 56 64 62 65 43 6f 76 65 72 61   );   VdbeCovera
20d40 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 49  geIf(v, op==TK_I
20d50 53 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 74 65  SNULL);.      te
20d60 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e  stcase( op==TK_N
20d70 4f 54 4e 55 4c 4c 20 29 3b 20 20 56 64 62 65 43  OTNULL );  VdbeC
20d80 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d  overageIf(v, op=
20d90 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a 20 20  =TK_NOTNULL);.  
20da0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
20db0 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20  gFree1==0 );.   
20dc0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
20dd0 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54 57      case TK_BETW
20de0 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 74 65 73  EEN: {.      tes
20df0 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c  tcase( jumpIfNul
20e00 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 65 78  l==0 );.      ex
20e10 70 72 43 6f 64 65 42 65 74 77 65 65 6e 28 70 50  prCodeBetween(pP
20e20 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64 65 73  arse, pExpr, des
20e30 74 2c 20 30 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  t, 0, jumpIfNull
20e40 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
20e50 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
20e60 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
20e70 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  RY.    case TK_I
20e80 4e 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 6a  N: {.      if( j
20e90 75 6d 70 49 66 4e 75 6c 6c 20 29 7b 0a 20 20 20  umpIfNull ){.   
20ea0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
20eb0 43 6f 64 65 49 4e 28 70 50 61 72 73 65 2c 20 70  CodeIN(pParse, p
20ec0 45 78 70 72 2c 20 64 65 73 74 2c 20 64 65 73 74  Expr, dest, dest
20ed0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
20ee0 20 20 20 20 20 20 20 20 69 6e 74 20 64 65 73 74          int dest
20ef0 49 66 4e 75 6c 6c 20 3d 20 73 71 6c 69 74 65 33  IfNull = sqlite3
20f00 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
20f10 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
20f20 33 45 78 70 72 43 6f 64 65 49 4e 28 70 50 61 72  3ExprCodeIN(pPar
20f30 73 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74 2c  se, pExpr, dest,
20f40 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20   destIfNull);.  
20f50 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
20f60 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
20f70 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20   destIfNull);.  
20f80 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
20f90 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
20fa0 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
20fb0 20 20 20 20 20 69 66 28 20 65 78 70 72 41 6c 77       if( exprAlw
20fc0 61 79 73 46 61 6c 73 65 28 70 45 78 70 72 29 20  aysFalse(pExpr) 
20fd0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
20fe0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
20ff0 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 64 65 73 74  OP_Goto, 0, dest
21000 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
21010 66 28 20 65 78 70 72 41 6c 77 61 79 73 54 72 75  f( exprAlwaysTru
21020 65 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20  e(pExpr) ){.    
21030 20 20 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a      /* no-op */.
21040 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
21050 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
21060 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
21070 61 72 73 65 2c 20 70 45 78 70 72 2c 20 26 72 65  arse, pExpr, &re
21080 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 20  gFree1);.       
21090 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
210a0 70 33 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20  p3(v, OP_IfNot, 
210b0 72 31 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  r1, dest, jumpIf
210c0 4e 75 6c 6c 21 3d 30 29 3b 0a 20 20 20 20 20 20  Null!=0);.      
210d0 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
210e0 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
210f0 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30  ase( regFree1==0
21100 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74   );.        test
21110 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  case( jumpIfNull
21120 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ==0 );.      }. 
21130 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
21140 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52  }.  }.  sqlite3R
21150 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
21160 61 72 73 65 2c 20 72 65 67 46 72 65 65 31 29 3b  arse, regFree1);
21170 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
21180 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
21190 20 72 65 67 46 72 65 65 32 29 3b 0a 7d 0a 0a 2f   regFree2);.}../
211a0 2a 0a 2a 2a 20 44 6f 20 61 20 64 65 65 70 20 63  *.** Do a deep c
211b0 6f 6d 70 61 72 69 73 6f 6e 20 6f 66 20 74 77 6f  omparison of two
211c0 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
211d0 73 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66 20  s.  Return 0 if 
211e0 74 68 65 20 74 77 6f 0a 2a 2a 20 65 78 70 72 65  the two.** expre
211f0 73 73 69 6f 6e 73 20 61 72 65 20 63 6f 6d 70 6c  ssions are compl
21200 65 74 65 6c 79 20 69 64 65 6e 74 69 63 61 6c 2e  etely identical.
21210 20 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68    Return 1 if th
21220 65 79 20 64 69 66 66 65 72 20 6f 6e 6c 79 0a 2a  ey differ only.*
21230 2a 20 62 79 20 61 20 43 4f 4c 4c 41 54 45 20 6f  * by a COLLATE o
21240 70 65 72 61 74 6f 72 20 61 74 20 74 68 65 20 74  perator at the t
21250 6f 70 20 6c 65 76 65 6c 2e 20 20 52 65 74 75 72  op level.  Retur
21260 6e 20 32 20 69 66 20 74 68 65 72 65 20 61 72 65  n 2 if there are
21270 20 64 69 66 66 65 72 65 6e 63 65 73 0a 2a 2a 20   differences.** 
21280 6f 74 68 65 72 20 74 68 61 6e 20 74 68 65 20 74  other than the t
21290 6f 70 2d 6c 65 76 65 6c 20 43 4f 4c 4c 41 54 45  op-level COLLATE
212a0 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a   operator..**.**
212b0 20 49 66 20 61 6e 79 20 73 75 62 65 6c 65 6d 65   If any subeleme
212c0 6e 74 20 6f 66 20 70 42 20 68 61 73 20 45 78 70  nt of pB has Exp
212d0 72 2e 69 54 61 62 6c 65 3d 3d 28 2d 31 29 20 74  r.iTable==(-1) t
212e0 68 65 6e 20 69 74 20 69 73 20 61 6c 6c 6f 77 65  hen it is allowe
212f0 64 0a 2a 2a 20 74 6f 20 63 6f 6d 70 61 72 65 20  d.** to compare 
21300 65 71 75 61 6c 20 74 6f 20 61 6e 20 65 71 75 69  equal to an equi
21310 76 61 6c 65 6e 74 20 65 6c 65 6d 65 6e 74 20 69  valent element i
21320 6e 20 70 41 20 77 69 74 68 20 45 78 70 72 2e 69  n pA with Expr.i
21330 54 61 62 6c 65 3d 3d 69 54 61 62 2e 0a 2a 2a 0a  Table==iTab..**.
21340 2a 2a 20 54 68 65 20 70 41 20 73 69 64 65 20 6d  ** The pA side m
21350 69 67 68 74 20 62 65 20 75 73 69 6e 67 20 54 4b  ight be using TK
21360 5f 52 45 47 49 53 54 45 52 2e 20 20 49 66 20 74  _REGISTER.  If t
21370 68 61 74 20 69 73 20 74 68 65 20 63 61 73 65 20  hat is the case 
21380 61 6e 64 20 70 42 20 69 73 0a 2a 2a 20 6e 6f 74  and pB is.** not
21390 20 75 73 69 6e 67 20 54 4b 5f 52 45 47 49 53 54   using TK_REGIST
213a0 45 52 20 62 75 74 20 69 73 20 6f 74 68 65 72 77  ER but is otherw
213b0 69 73 65 20 65 71 75 69 76 61 6c 65 6e 74 2c 20  ise equivalent, 
213c0 74 68 65 6e 20 73 74 69 6c 6c 20 72 65 74 75 72  then still retur
213d0 6e 20 30 2e 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74  n 0..**.** Somet
213e0 69 6d 65 73 20 74 68 69 73 20 72 6f 75 74 69 6e  imes this routin
213f0 65 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 32 20  e will return 2 
21400 65 76 65 6e 20 69 66 20 74 68 65 20 74 77 6f 20  even if the two 
21410 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 72  expressions.** r
21420 65 61 6c 6c 79 20 61 72 65 20 65 71 75 69 76 61  eally are equiva
21430 6c 65 6e 74 2e 20 20 49 66 20 77 65 20 63 61 6e  lent.  If we can
21440 6e 6f 74 20 70 72 6f 76 65 20 74 68 61 74 20 74  not prove that t
21450 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61  he expressions a
21460 72 65 0a 2a 2a 20 69 64 65 6e 74 69 63 61 6c 2c  re.** identical,
21470 20 77 65 20 72 65 74 75 72 6e 20 32 20 6a 75 73   we return 2 jus
21480 74 20 74 6f 20 62 65 20 73 61 66 65 2e 20 20 53  t to be safe.  S
21490 6f 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e  o if this routin
214a0 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20 32 2c 20  e.** returns 2, 
214b0 74 68 65 6e 20 79 6f 75 20 64 6f 20 6e 6f 74 20  then you do not 
214c0 72 65 61 6c 6c 79 20 6b 6e 6f 77 20 66 6f 72 20  really know for 
214d0 63 65 72 74 61 69 6e 20 69 66 20 74 68 65 20 74  certain if the t
214e0 77 6f 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  wo.** expression
214f0 73 20 61 72 65 20 74 68 65 20 73 61 6d 65 2e 20  s are the same. 
21500 20 42 75 74 20 69 66 20 79 6f 75 20 67 65 74 20   But if you get 
21510 61 20 30 20 6f 72 20 31 20 72 65 74 75 72 6e 2c  a 0 or 1 return,
21520 20 74 68 65 6e 20 79 6f 75 0a 2a 2a 20 63 61 6e   then you.** can
21530 20 62 65 20 73 75 72 65 20 74 68 65 20 65 78 70   be sure the exp
21540 72 65 73 73 69 6f 6e 73 20 61 72 65 20 74 68 65  ressions are the
21550 20 73 61 6d 65 2e 20 20 49 6e 20 74 68 65 20 70   same.  In the p
21560 6c 61 63 65 73 20 77 68 65 72 65 0a 2a 2a 20 74  laces where.** t
21570 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
21580 73 65 64 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74  sed, it does not
21590 20 68 75 72 74 20 74 6f 20 67 65 74 20 61 6e 20   hurt to get an 
215a0 65 78 74 72 61 20 32 20 2d 20 74 68 61 74 0a 2a  extra 2 - that.*
215b0 2a 20 6a 75 73 74 20 6d 69 67 68 74 20 72 65 73  * just might res
215c0 75 6c 74 20 69 6e 20 73 6f 6d 65 20 73 6c 69 67  ult in some slig
215d0 68 74 6c 79 20 73 6c 6f 77 65 72 20 63 6f 64 65  htly slower code
215e0 2e 20 20 42 75 74 20 72 65 74 75 72 6e 69 6e 67  .  But returning
215f0 0a 2a 2a 20 61 6e 20 69 6e 63 6f 72 72 65 63 74  .** an incorrect
21600 20 30 20 6f 72 20 31 20 63 6f 75 6c 64 20 6c 65   0 or 1 could le
21610 61 64 20 74 6f 20 61 20 6d 61 6c 66 75 6e 63 74  ad to a malfunct
21620 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ion..*/.int sqli
21630 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 45  te3ExprCompare(E
21640 78 70 72 20 2a 70 41 2c 20 45 78 70 72 20 2a 70  xpr *pA, Expr *p
21650 42 2c 20 69 6e 74 20 69 54 61 62 29 7b 0a 20 20  B, int iTab){.  
21660 75 33 32 20 63 6f 6d 62 69 6e 65 64 46 6c 61 67  u32 combinedFlag
21670 73 3b 0a 20 20 69 66 28 20 70 41 3d 3d 30 20 7c  s;.  if( pA==0 |
21680 7c 20 70 42 3d 3d 30 20 29 7b 0a 20 20 20 20 72  | pB==0 ){.    r
21690 65 74 75 72 6e 20 70 42 3d 3d 70 41 20 3f 20 30  eturn pB==pA ? 0
216a0 20 3a 20 32 3b 0a 20 20 7d 0a 20 20 63 6f 6d 62   : 2;.  }.  comb
216b0 69 6e 65 64 46 6c 61 67 73 20 3d 20 70 41 2d 3e  inedFlags = pA->
216c0 66 6c 61 67 73 20 7c 20 70 42 2d 3e 66 6c 61 67  flags | pB->flag
216d0 73 3b 0a 20 20 69 66 28 20 63 6f 6d 62 69 6e 65  s;.  if( combine
216e0 64 46 6c 61 67 73 20 26 20 45 50 5f 49 6e 74 56  dFlags & EP_IntV
216f0 61 6c 75 65 20 29 7b 0a 20 20 20 20 69 66 28 20  alue ){.    if( 
21700 28 70 41 2d 3e 66 6c 61 67 73 26 70 42 2d 3e 66  (pA->flags&pB->f
21710 6c 61 67 73 26 45 50 5f 49 6e 74 56 61 6c 75 65  lags&EP_IntValue
21720 29 21 3d 30 20 26 26 20 70 41 2d 3e 75 2e 69 56  )!=0 && pA->u.iV
21730 61 6c 75 65 3d 3d 70 42 2d 3e 75 2e 69 56 61 6c  alue==pB->u.iVal
21740 75 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  ue ){.      retu
21750 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 0;.    }.    
21760 72 65 74 75 72 6e 20 32 3b 0a 20 20 7d 0a 20 20  return 2;.  }.  
21770 69 66 28 20 70 41 2d 3e 6f 70 21 3d 70 42 2d 3e  if( pA->op!=pB->
21780 6f 70 20 29 7b 0a 20 20 20 20 69 66 28 20 70 41  op ){.    if( pA
21790 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45  ->op==TK_COLLATE
217a0 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 43   && sqlite3ExprC
217b0 6f 6d 70 61 72 65 28 70 41 2d 3e 70 4c 65 66 74  ompare(pA->pLeft
217c0 2c 20 70 42 2c 20 69 54 61 62 29 3c 32 20 29 7b  , pB, iTab)<2 ){
217d0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
217e0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
217f0 42 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54  B->op==TK_COLLAT
21800 45 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72  E && sqlite3Expr
21810 43 6f 6d 70 61 72 65 28 70 41 2c 20 70 42 2d 3e  Compare(pA, pB->
21820 70 4c 65 66 74 2c 20 69 54 61 62 29 3c 32 20 29  pLeft, iTab)<2 )
21830 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  {.      return 1
21840 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
21850 72 6e 20 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 2;.  }.  if( 
21860 70 41 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d  pA->op!=TK_COLUM
21870 4e 20 26 26 20 41 4c 57 41 59 53 28 70 41 2d 3e  N && ALWAYS(pA->
21880 6f 70 21 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  op!=TK_AGG_COLUM
21890 4e 29 20 26 26 20 70 41 2d 3e 75 2e 7a 54 6f 6b  N) && pA->u.zTok
218a0 65 6e 20 29 7b 0a 20 20 20 20 69 66 28 20 73 74  en ){.    if( st
218b0 72 63 6d 70 28 70 41 2d 3e 75 2e 7a 54 6f 6b 65  rcmp(pA->u.zToke
218c0 6e 2c 70 42 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 21  n,pB->u.zToken)!
218d0 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =0 ){.      retu
218e0 72 6e 20 70 41 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  rn pA->op==TK_CO
218f0 4c 4c 41 54 45 20 3f 20 31 20 3a 20 32 3b 0a 20  LLATE ? 1 : 2;. 
21900 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 28     }.  }.  if( (
21910 70 41 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 44  pA->flags & EP_D
21920 69 73 74 69 6e 63 74 29 21 3d 28 70 42 2d 3e 66  istinct)!=(pB->f
21930 6c 61 67 73 20 26 20 45 50 5f 44 69 73 74 69 6e  lags & EP_Distin
21940 63 74 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a  ct) ) return 2;.
21950 20 20 69 66 28 20 41 4c 57 41 59 53 28 28 63 6f    if( ALWAYS((co
21960 6d 62 69 6e 65 64 46 6c 61 67 73 20 26 20 45 50  mbinedFlags & EP
21970 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 3d 3d 30 29 20  _TokenOnly)==0) 
21980 29 7b 0a 20 20 20 20 69 66 28 20 63 6f 6d 62 69  ){.    if( combi
21990 6e 65 64 46 6c 61 67 73 20 26 20 45 50 5f 78 49  nedFlags & EP_xI
219a0 73 53 65 6c 65 63 74 20 29 20 72 65 74 75 72 6e  sSelect ) return
219b0 20 32 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   2;.    if( sqli
219c0 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70  te3ExprCompare(p
219d0 41 2d 3e 70 4c 65 66 74 2c 20 70 42 2d 3e 70 4c  A->pLeft, pB->pL
219e0 65 66 74 2c 20 69 54 61 62 29 20 29 20 72 65 74  eft, iTab) ) ret
219f0 75 72 6e 20 32 3b 0a 20 20 20 20 69 66 28 20 73  urn 2;.    if( s
21a00 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
21a10 65 28 70 41 2d 3e 70 52 69 67 68 74 2c 20 70 42  e(pA->pRight, pB
21a20 2d 3e 70 52 69 67 68 74 2c 20 69 54 61 62 29 20  ->pRight, iTab) 
21a30 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20  ) return 2;.    
21a40 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 4c  if( sqlite3ExprL
21a50 69 73 74 43 6f 6d 70 61 72 65 28 70 41 2d 3e 78  istCompare(pA->x
21a60 2e 70 4c 69 73 74 2c 20 70 42 2d 3e 78 2e 70 4c  .pList, pB->x.pL
21a70 69 73 74 2c 20 69 54 61 62 29 20 29 20 72 65 74  ist, iTab) ) ret
21a80 75 72 6e 20 32 3b 0a 20 20 20 20 69 66 28 20 41  urn 2;.    if( A
21a90 4c 57 41 59 53 28 28 63 6f 6d 62 69 6e 65 64 46  LWAYS((combinedF
21aa0 6c 61 67 73 20 26 20 45 50 5f 52 65 64 75 63 65  lags & EP_Reduce
21ab0 64 29 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20 20  d)==0) ){.      
21ac0 69 66 28 20 70 41 2d 3e 69 43 6f 6c 75 6d 6e 21  if( pA->iColumn!
21ad0 3d 70 42 2d 3e 69 43 6f 6c 75 6d 6e 20 29 20 72  =pB->iColumn ) r
21ae0 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 20 20 69  eturn 2;.      i
21af0 66 28 20 70 41 2d 3e 69 54 61 62 6c 65 21 3d 70  f( pA->iTable!=p
21b00 42 2d 3e 69 54 61 62 6c 65 20 0a 20 20 20 20 20  B->iTable .     
21b10 20 20 26 26 20 28 70 41 2d 3e 69 54 61 62 6c 65    && (pA->iTable
21b20 21 3d 69 54 61 62 20 7c 7c 20 4e 45 56 45 52 28  !=iTab || NEVER(
21b30 70 42 2d 3e 69 54 61 62 6c 65 3e 3d 30 29 29 20  pB->iTable>=0)) 
21b40 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20  ) return 2;.    
21b50 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
21b60 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61  ;.}../*.** Compa
21b70 72 65 20 74 77 6f 20 45 78 70 72 4c 69 73 74 20  re two ExprList 
21b80 6f 62 6a 65 63 74 73 2e 20 20 52 65 74 75 72 6e  objects.  Return
21b90 20 30 20 69 66 20 74 68 65 79 20 61 72 65 20 69   0 if they are i
21ba0 64 65 6e 74 69 63 61 6c 20 61 6e 64 20 0a 2a 2a  dentical and .**
21bb0 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65   non-zero if the
21bc0 79 20 64 69 66 66 65 72 20 69 6e 20 61 6e 79 20  y differ in any 
21bd0 77 61 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  way..**.** If an
21be0 79 20 73 75 62 65 6c 65 6d 65 6e 74 20 6f 66 20  y subelement of 
21bf0 70 42 20 68 61 73 20 45 78 70 72 2e 69 54 61 62  pB has Expr.iTab
21c00 6c 65 3d 3d 28 2d 31 29 20 74 68 65 6e 20 69 74  le==(-1) then it
21c10 20 69 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74   is allowed.** t
21c20 6f 20 63 6f 6d 70 61 72 65 20 65 71 75 61 6c 20  o compare equal 
21c30 74 6f 20 61 6e 20 65 71 75 69 76 61 6c 65 6e 74  to an equivalent
21c40 20 65 6c 65 6d 65 6e 74 20 69 6e 20 70 41 20 77   element in pA w
21c50 69 74 68 20 45 78 70 72 2e 69 54 61 62 6c 65 3d  ith Expr.iTable=
21c60 3d 69 54 61 62 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  =iTab..**.** Thi
21c70 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20  s routine might 
21c80 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20  return non-zero 
21c90 66 6f 72 20 65 71 75 69 76 61 6c 65 6e 74 20 45  for equivalent E
21ca0 78 70 72 4c 69 73 74 73 2e 20 20 54 68 65 0a 2a  xprLists.  The.*
21cb0 2a 20 6f 6e 6c 79 20 63 6f 6e 73 65 71 75 65 6e  * only consequen
21cc0 63 65 20 77 69 6c 6c 20 62 65 20 64 69 73 61 62  ce will be disab
21cd0 6c 65 64 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  led optimization
21ce0 73 2e 20 20 42 75 74 20 74 68 69 73 20 72 6f 75  s.  But this rou
21cf0 74 69 6e 65 0a 2a 2a 20 6d 75 73 74 20 6e 65 76  tine.** must nev
21d00 65 72 20 72 65 74 75 72 6e 20 30 20 69 66 20 74  er return 0 if t
21d10 68 65 20 74 77 6f 20 45 78 70 72 4c 69 73 74 20  he two ExprList 
21d20 6f 62 6a 65 63 74 73 20 61 72 65 20 64 69 66 66  objects are diff
21d30 65 72 65 6e 74 2c 20 6f 72 0a 2a 2a 20 61 20 6d  erent, or.** a m
21d40 61 6c 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20  alfunction will 
21d50 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 54 77  result..**.** Tw
21d60 6f 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 73 20  o NULL pointers 
21d70 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64 20 74  are considered t
21d80 6f 20 62 65 20 74 68 65 20 73 61 6d 65 2e 20 20  o be the same.  
21d90 42 75 74 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74  But a NULL point
21da0 65 72 0a 2a 2a 20 61 6c 77 61 79 73 20 64 69 66  er.** always dif
21db0 66 65 72 73 20 66 72 6f 6d 20 61 20 6e 6f 6e 2d  fers from a non-
21dc0 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f  NULL pointer..*/
21dd0 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
21de0 4c 69 73 74 43 6f 6d 70 61 72 65 28 45 78 70 72  ListCompare(Expr
21df0 4c 69 73 74 20 2a 70 41 2c 20 45 78 70 72 4c 69  List *pA, ExprLi
21e00 73 74 20 2a 70 42 2c 20 69 6e 74 20 69 54 61 62  st *pB, int iTab
21e10 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  ){.  int i;.  if
21e20 28 20 70 41 3d 3d 30 20 26 26 20 70 42 3d 3d 30  ( pA==0 && pB==0
21e30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
21e40 66 28 20 70 41 3d 3d 30 20 7c 7c 20 70 42 3d 3d  f( pA==0 || pB==
21e50 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
21e60 69 66 28 20 70 41 2d 3e 6e 45 78 70 72 21 3d 70  if( pA->nExpr!=p
21e70 42 2d 3e 6e 45 78 70 72 20 29 20 72 65 74 75 72  B->nExpr ) retur
21e80 6e 20 31 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  n 1;.  for(i=0; 
21e90 69 3c 70 41 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  i<pA->nExpr; i++
21ea0 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78  ){.    Expr *pEx
21eb0 70 72 41 20 3d 20 70 41 2d 3e 61 5b 69 5d 2e 70  prA = pA->a[i].p
21ec0 45 78 70 72 3b 0a 20 20 20 20 45 78 70 72 20 2a  Expr;.    Expr *
21ed0 70 45 78 70 72 42 20 3d 20 70 42 2d 3e 61 5b 69  pExprB = pB->a[i
21ee0 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28  ].pExpr;.    if(
21ef0 20 70 41 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72   pA->a[i].sortOr
21f00 64 65 72 21 3d 70 42 2d 3e 61 5b 69 5d 2e 73 6f  der!=pB->a[i].so
21f10 72 74 4f 72 64 65 72 20 29 20 72 65 74 75 72 6e  rtOrder ) return
21f20 20 31 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   1;.    if( sqli
21f30 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70  te3ExprCompare(p
21f40 45 78 70 72 41 2c 20 70 45 78 70 72 42 2c 20 69  ExprA, pExprB, i
21f50 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 31 3b  Tab) ) return 1;
21f60 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
21f70 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
21f80 20 74 72 75 65 20 69 66 20 77 65 20 63 61 6e 20   true if we can 
21f90 70 72 6f 76 65 20 74 68 65 20 70 45 32 20 77 69  prove the pE2 wi
21fa0 6c 6c 20 61 6c 77 61 79 73 20 62 65 20 74 72 75  ll always be tru
21fb0 65 20 69 66 20 70 45 31 20 69 73 0a 2a 2a 20 74  e if pE1 is.** t
21fc0 72 75 65 2e 20 20 52 65 74 75 72 6e 20 66 61 6c  rue.  Return fal
21fd0 73 65 20 69 66 20 77 65 20 63 61 6e 6e 6f 74 20  se if we cannot 
21fe0 63 6f 6d 70 6c 65 74 65 20 74 68 65 20 70 72 6f  complete the pro
21ff0 6f 66 20 6f 72 20 69 66 20 70 45 32 20 6d 69 67  of or if pE2 mig
22000 68 74 0a 2a 2a 20 62 65 20 66 61 6c 73 65 2e 20  ht.** be false. 
22010 20 45 78 61 6d 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a   Examples:.**.**
22020 20 20 20 20 20 70 45 31 3a 20 78 3d 3d 35 20 20       pE1: x==5  
22030 20 20 20 20 20 70 45 32 3a 20 78 3d 3d 35 20 20       pE2: x==5  
22040 20 20 20 20 20 20 20 20 20 20 20 52 65 73 75 6c             Resul
22050 74 3a 20 74 72 75 65 0a 2a 2a 20 20 20 20 20 70  t: true.**     p
22060 45 31 3a 20 78 3e 30 20 20 20 20 20 20 20 20 70  E1: x>0        p
22070 45 32 3a 20 78 3d 3d 35 20 20 20 20 20 20 20 20  E2: x==5        
22080 20 20 20 20 20 52 65 73 75 6c 74 3a 20 66 61 6c       Result: fal
22090 73 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78  se.**     pE1: x
220a0 3d 32 31 20 20 20 20 20 20 20 70 45 32 3a 20 78  =21       pE2: x
220b0 3d 32 31 20 4f 52 20 79 3d 34 33 20 20 20 20 20  =21 OR y=43     
220c0 52 65 73 75 6c 74 3a 20 74 72 75 65 0a 2a 2a 20  Result: true.** 
220d0 20 20 20 20 70 45 31 3a 20 78 21 3d 31 32 33 20      pE1: x!=123 
220e0 20 20 20 20 70 45 32 3a 20 78 20 49 53 20 4e 4f      pE2: x IS NO
220f0 54 20 4e 55 4c 4c 20 20 20 20 52 65 73 75 6c 74  T NULL    Result
22100 3a 20 74 72 75 65 0a 2a 2a 20 20 20 20 20 70 45  : true.**     pE
22110 31 3a 20 78 21 3d 3f 31 20 20 20 20 20 20 70 45  1: x!=?1      pE
22120 32 3a 20 78 20 49 53 20 4e 4f 54 20 4e 55 4c 4c  2: x IS NOT NULL
22130 20 20 20 20 52 65 73 75 6c 74 3a 20 74 72 75 65      Result: true
22140 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78 20 49  .**     pE1: x I
22150 53 20 4e 55 4c 4c 20 20 70 45 32 3a 20 78 20 49  S NULL  pE2: x I
22160 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 52 65  S NOT NULL    Re
22170 73 75 6c 74 3a 20 66 61 6c 73 65 0a 2a 2a 20 20  sult: false.**  
22180 20 20 20 70 45 31 3a 20 78 20 49 53 20 3f 32 20     pE1: x IS ?2 
22190 20 20 20 70 45 32 3a 20 78 20 49 53 20 4e 4f 54     pE2: x IS NOT
221a0 20 4e 55 4c 4c 20 20 20 20 52 65 75 73 6c 74 3a   NULL    Reuslt:
221b0 20 66 61 6c 73 65 0a 2a 2a 0a 2a 2a 20 57 68 65   false.**.** Whe
221c0 6e 20 63 6f 6d 70 61 72 69 6e 67 20 54 4b 5f 43  n comparing TK_C
221d0 4f 4c 55 4d 4e 20 6e 6f 64 65 73 20 62 65 74 77  OLUMN nodes betw
221e0 65 65 6e 20 70 45 31 20 61 6e 64 20 70 45 32 2c  een pE1 and pE2,
221f0 20 69 66 20 70 45 32 20 68 61 73 0a 2a 2a 20 45   if pE2 has.** E
22200 78 70 72 2e 69 54 61 62 6c 65 3c 30 20 74 68 65  xpr.iTable<0 the
22210 6e 20 61 73 73 75 6d 65 20 61 20 74 61 62 6c 65  n assume a table
22220 20 6e 75 6d 62 65 72 20 67 69 76 65 6e 20 62 79   number given by
22230 20 69 54 61 62 2e 0a 2a 2a 0a 2a 2a 20 57 68 65   iTab..**.** Whe
22240 6e 20 69 6e 20 64 6f 75 62 74 2c 20 72 65 74 75  n in doubt, retu
22250 72 6e 20 66 61 6c 73 65 2e 20 20 52 65 74 75 72  rn false.  Retur
22260 6e 69 6e 67 20 74 72 75 65 20 6d 69 67 68 74 20  ning true might 
22270 67 69 76 65 20 61 20 70 65 72 66 6f 72 6d 61 6e  give a performan
22280 63 65 0a 2a 2a 20 69 6d 70 72 6f 76 65 6d 65 6e  ce.** improvemen
22290 74 2e 20 20 52 65 74 75 72 6e 69 6e 67 20 66 61  t.  Returning fa
222a0 6c 73 65 20 6d 69 67 68 74 20 63 61 75 73 65 20  lse might cause 
222b0 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 72 65  a performance re
222c0 64 75 63 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20  duction, but.** 
222d0 69 74 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 67  it will always g
222e0 69 76 65 20 74 68 65 20 63 6f 72 72 65 63 74 20  ive the correct 
222f0 61 6e 73 77 65 72 20 61 6e 64 20 69 73 20 68 65  answer and is he
22300 6e 63 65 20 61 6c 77 61 79 73 20 73 61 66 65 2e  nce always safe.
22310 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
22320 78 70 72 49 6d 70 6c 69 65 73 45 78 70 72 28 45  xprImpliesExpr(E
22330 78 70 72 20 2a 70 45 31 2c 20 45 78 70 72 20 2a  xpr *pE1, Expr *
22340 70 45 32 2c 20 69 6e 74 20 69 54 61 62 29 7b 0a  pE2, int iTab){.
22350 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
22360 72 43 6f 6d 70 61 72 65 28 70 45 31 2c 20 70 45  rCompare(pE1, pE
22370 32 2c 20 69 54 61 62 29 3d 3d 30 20 29 7b 0a 20  2, iTab)==0 ){. 
22380 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
22390 0a 20 20 69 66 28 20 70 45 32 2d 3e 6f 70 3d 3d  .  if( pE2->op==
223a0 54 4b 5f 4f 52 0a 20 20 20 26 26 20 28 73 71 6c  TK_OR.   && (sql
223b0 69 74 65 33 45 78 70 72 49 6d 70 6c 69 65 73 45  ite3ExprImpliesE
223c0 78 70 72 28 70 45 31 2c 20 70 45 32 2d 3e 70 4c  xpr(pE1, pE2->pL
223d0 65 66 74 2c 20 69 54 61 62 29 0a 20 20 20 20 20  eft, iTab).     
223e0 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74          || sqlit
223f0 65 33 45 78 70 72 49 6d 70 6c 69 65 73 45 78 70  e3ExprImpliesExp
22400 72 28 70 45 31 2c 20 70 45 32 2d 3e 70 52 69 67  r(pE1, pE2->pRig
22410 68 74 2c 20 69 54 61 62 29 20 29 0a 20 20 29 7b  ht, iTab) ).  ){
22420 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
22430 20 7d 0a 20 20 69 66 28 20 70 45 32 2d 3e 6f 70   }.  if( pE2->op
22440 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 0a 20 20 20  ==TK_NOTNULL.   
22450 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  && sqlite3ExprCo
22460 6d 70 61 72 65 28 70 45 31 2d 3e 70 4c 65 66 74  mpare(pE1->pLeft
22470 2c 20 70 45 32 2d 3e 70 4c 65 66 74 2c 20 69 54  , pE2->pLeft, iT
22480 61 62 29 3d 3d 30 0a 20 20 20 26 26 20 28 70 45  ab)==0.   && (pE
22490 31 2d 3e 6f 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c  1->op!=TK_ISNULL
224a0 20 26 26 20 70 45 31 2d 3e 6f 70 21 3d 54 4b 5f   && pE1->op!=TK_
224b0 49 53 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74  IS).  ){.    ret
224c0 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 1;.  }.  ret
224d0 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
224e0 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  An instance of t
224f0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  he following str
22500 75 63 74 75 72 65 20 69 73 20 75 73 65 64 20 62  ucture is used b
22510 79 20 74 68 65 20 74 72 65 65 20 77 61 6c 6b 65  y the tree walke
22520 72 0a 2a 2a 20 74 6f 20 63 6f 75 6e 74 20 72 65  r.** to count re
22530 66 65 72 65 6e 63 65 73 20 74 6f 20 74 61 62 6c  ferences to tabl
22540 65 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  e columns in the
22550 20 61 72 67 75 6d 65 6e 74 73 20 6f 66 20 61 6e   arguments of an
22560 20 0a 2a 2a 20 61 67 67 72 65 67 61 74 65 20 66   .** aggregate f
22570 75 6e 63 74 69 6f 6e 2c 20 69 6e 20 6f 72 64 65  unction, in orde
22580 72 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74  r to implement t
22590 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 46 75 6e  he.** sqlite3Fun
225a0 63 74 69 6f 6e 54 68 69 73 53 72 63 28 29 20 72  ctionThisSrc() r
225b0 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74 72 75 63  outine..*/.struc
225c0 74 20 53 72 63 43 6f 75 6e 74 20 7b 0a 20 20 53  t SrcCount {.  S
225d0 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 20 20 20  rcList *pSrc;   
225e0 2f 2a 20 4f 6e 65 20 70 61 72 74 69 63 75 6c 61  /* One particula
225f0 72 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 6e  r FROM clause in
22600 20 61 20 6e 65 73 74 65 64 20 71 75 65 72 79 20   a nested query 
22610 2a 2f 0a 20 20 69 6e 74 20 6e 54 68 69 73 3b 20  */.  int nThis; 
22620 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
22630 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  of references to
22640 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 70 53 72 63   columns in pSrc
22650 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f  List */.  int nO
22660 74 68 65 72 3b 20 20 20 20 20 20 2f 2a 20 4e 75  ther;      /* Nu
22670 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63  mber of referenc
22680 65 73 20 74 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e  es to columns in
22690 20 6f 74 68 65 72 20 46 52 4f 4d 20 63 6c 61 75   other FROM clau
226a0 73 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  ses */.};../*.**
226b0 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65   Count the numbe
226c0 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20  r of references 
226d0 74 6f 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2f 0a 73  to columns..*/.s
226e0 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 53 72  tatic int exprSr
226f0 63 43 6f 75 6e 74 28 57 61 6c 6b 65 72 20 2a 70  cCount(Walker *p
22700 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45  Walker, Expr *pE
22710 78 70 72 29 7b 0a 20 20 2f 2a 20 54 68 65 20 4e  xpr){.  /* The N
22720 45 56 45 52 28 29 20 6f 6e 20 74 68 65 20 73 65  EVER() on the se
22730 63 6f 6e 64 20 74 65 72 6d 20 69 73 20 62 65 63  cond term is bec
22740 61 75 73 65 20 73 71 6c 69 74 65 33 46 75 6e 63  ause sqlite3Func
22750 74 69 6f 6e 55 73 65 73 54 68 69 73 53 72 63 28  tionUsesThisSrc(
22760 29 0a 20 20 2a 2a 20 69 73 20 61 6c 77 61 79 73  ).  ** is always
22770 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 73   called before s
22780 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
22790 65 41 67 67 72 65 67 61 74 65 73 28 29 20 61 6e  eAggregates() an
227a0 64 20 73 6f 20 74 68 65 0a 20 20 2a 2a 20 54 4b  d so the.  ** TK
227b0 5f 43 4f 4c 55 4d 4e 73 20 68 61 76 65 20 6e 6f  _COLUMNs have no
227c0 74 20 79 65 74 20 62 65 65 6e 20 63 6f 6e 76 65  t yet been conve
227d0 72 74 65 64 20 69 6e 74 6f 20 54 4b 5f 41 47 47  rted into TK_AGG
227e0 5f 43 4f 4c 55 4d 4e 2e 20 20 49 66 0a 20 20 2a  _COLUMN.  If.  *
227f0 2a 20 73 71 6c 69 74 65 33 46 75 6e 63 74 69 6f  * sqlite3Functio
22800 6e 55 73 65 73 54 68 69 73 53 72 63 28 29 20 69  nUsesThisSrc() i
22810 73 20 75 73 65 64 20 64 69 66 66 65 72 65 6e 74  s used different
22820 6c 79 20 69 6e 20 74 68 65 20 66 75 74 75 72 65  ly in the future
22830 2c 20 74 68 65 0a 20 20 2a 2a 20 4e 45 56 45 52  , the.  ** NEVER
22840 28 29 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20  () will need to 
22850 62 65 20 72 65 6d 6f 76 65 64 2e 20 2a 2f 0a 20  be removed. */. 
22860 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d   if( pExpr->op==
22870 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 4e 45 56  TK_COLUMN || NEV
22880 45 52 28 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  ER(pExpr->op==TK
22890 5f 41 47 47 5f 43 4f 4c 55 4d 4e 29 20 29 7b 0a  _AGG_COLUMN) ){.
228a0 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 73      int i;.    s
228b0 74 72 75 63 74 20 53 72 63 43 6f 75 6e 74 20 2a  truct SrcCount *
228c0 70 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70  p = pWalker->u.p
228d0 53 72 63 43 6f 75 6e 74 3b 0a 20 20 20 20 53 72  SrcCount;.    Sr
228e0 63 4c 69 73 74 20 2a 70 53 72 63 20 3d 20 70 2d  cList *pSrc = p-
228f0 3e 70 53 72 63 3b 0a 20 20 20 20 66 6f 72 28 69  >pSrc;.    for(i
22900 3d 30 3b 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63  =0; i<pSrc->nSrc
22910 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
22920 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d  ( pExpr->iTable=
22930 3d 70 53 72 63 2d 3e 61 5b 69 5d 2e 69 43 75 72  =pSrc->a[i].iCur
22940 73 6f 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  sor ) break;.   
22950 20 7d 0a 20 20 20 20 69 66 28 20 69 3c 70 53 72   }.    if( i<pSr
22960 63 2d 3e 6e 53 72 63 20 29 7b 0a 20 20 20 20 20  c->nSrc ){.     
22970 20 70 2d 3e 6e 54 68 69 73 2b 2b 3b 0a 20 20 20   p->nThis++;.   
22980 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d   }else{.      p-
22990 3e 6e 4f 74 68 65 72 2b 2b 3b 0a 20 20 20 20 7d  >nOther++;.    }
229a0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 57 52  .  }.  return WR
229b0 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f  C_Continue;.}../
229c0 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 69  *.** Determine i
229d0 66 20 61 6e 79 20 6f 66 20 74 68 65 20 61 72 67  f any of the arg
229e0 75 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 70 45  uments to the pE
229f0 78 70 72 20 46 75 6e 63 74 69 6f 6e 20 72 65 66  xpr Function ref
22a00 65 72 65 6e 63 65 0a 2a 2a 20 70 53 72 63 4c 69  erence.** pSrcLi
22a10 73 74 2e 20 20 52 65 74 75 72 6e 20 74 72 75 65  st.  Return true
22a20 20 69 66 20 74 68 65 79 20 64 6f 2e 20 20 41 6c   if they do.  Al
22a30 73 6f 20 72 65 74 75 72 6e 20 74 72 75 65 20 69  so return true i
22a40 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 0a 2a  f the function.*
22a50 2a 20 68 61 73 20 6e 6f 20 61 72 67 75 6d 65 6e  * has no argumen
22a60 74 73 20 6f 72 20 68 61 73 20 6f 6e 6c 79 20 63  ts or has only c
22a70 6f 6e 73 74 61 6e 74 20 61 72 67 75 6d 65 6e 74  onstant argument
22a80 73 2e 20 20 52 65 74 75 72 6e 20 66 61 6c 73 65  s.  Return false
22a90 20 69 66 20 70 45 78 70 72 0a 2a 2a 20 72 65 66   if pExpr.** ref
22aa0 65 72 65 6e 63 65 73 20 63 6f 6c 75 6d 6e 73 20  erences columns 
22ab0 62 75 74 20 6e 6f 74 20 63 6f 6c 75 6d 6e 73 20  but not columns 
22ac0 6f 66 20 74 61 62 6c 65 73 20 66 6f 75 6e 64 20  of tables found 
22ad0 69 6e 20 70 53 72 63 4c 69 73 74 2e 0a 2a 2f 0a  in pSrcList..*/.
22ae0 69 6e 74 20 73 71 6c 69 74 65 33 46 75 6e 63 74  int sqlite3Funct
22af0 69 6f 6e 55 73 65 73 54 68 69 73 53 72 63 28 45  ionUsesThisSrc(E
22b00 78 70 72 20 2a 70 45 78 70 72 2c 20 53 72 63 4c  xpr *pExpr, SrcL
22b10 69 73 74 20 2a 70 53 72 63 4c 69 73 74 29 7b 0a  ist *pSrcList){.
22b20 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 73 74    Walker w;.  st
22b30 72 75 63 74 20 53 72 63 43 6f 75 6e 74 20 63 6e  ruct SrcCount cn
22b40 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  t;.  assert( pEx
22b50 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46  pr->op==TK_AGG_F
22b60 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 6d 65 6d  UNCTION );.  mem
22b70 73 65 74 28 26 77 2c 20 30 2c 20 73 69 7a 65 6f  set(&w, 0, sizeo
22b80 66 28 77 29 29 3b 0a 20 20 77 2e 78 45 78 70 72  f(w));.  w.xExpr
22b90 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72 53  Callback = exprS
22ba0 72 63 43 6f 75 6e 74 3b 0a 20 20 77 2e 75 2e 70  rcCount;.  w.u.p
22bb0 53 72 63 43 6f 75 6e 74 20 3d 20 26 63 6e 74 3b  SrcCount = &cnt;
22bc0 0a 20 20 63 6e 74 2e 70 53 72 63 20 3d 20 70 53  .  cnt.pSrc = pS
22bd0 72 63 4c 69 73 74 3b 0a 20 20 63 6e 74 2e 6e 54  rcList;.  cnt.nT
22be0 68 69 73 20 3d 20 30 3b 0a 20 20 63 6e 74 2e 6e  his = 0;.  cnt.n
22bf0 4f 74 68 65 72 20 3d 20 30 3b 0a 20 20 73 71 6c  Other = 0;.  sql
22c00 69 74 65 33 57 61 6c 6b 45 78 70 72 4c 69 73 74  ite3WalkExprList
22c10 28 26 77 2c 20 70 45 78 70 72 2d 3e 78 2e 70 4c  (&w, pExpr->x.pL
22c20 69 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 63  ist);.  return c
22c30 6e 74 2e 6e 54 68 69 73 3e 30 20 7c 7c 20 63 6e  nt.nThis>0 || cn
22c40 74 2e 6e 4f 74 68 65 72 3d 3d 30 3b 0a 7d 0a 0a  t.nOther==0;.}..
22c50 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20  /*.** Add a new 
22c60 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 70  element to the p
22c70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20  AggInfo->aCol[] 
22c80 61 72 72 61 79 2e 20 20 52 65 74 75 72 6e 20 74  array.  Return t
22c90 68 65 20 69 6e 64 65 78 20 6f 66 0a 2a 2a 20 74  he index of.** t
22ca0 68 65 20 6e 65 77 20 65 6c 65 6d 65 6e 74 2e 20  he new element. 
22cb0 20 52 65 74 75 72 6e 20 61 20 6e 65 67 61 74 69   Return a negati
22cc0 76 65 20 6e 75 6d 62 65 72 20 69 66 20 6d 61 6c  ve number if mal
22cd0 6c 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74  loc fails..*/.st
22ce0 61 74 69 63 20 69 6e 74 20 61 64 64 41 67 67 49  atic int addAggI
22cf0 6e 66 6f 43 6f 6c 75 6d 6e 28 73 71 6c 69 74 65  nfoColumn(sqlite
22d00 33 20 2a 64 62 2c 20 41 67 67 49 6e 66 6f 20 2a  3 *db, AggInfo *
22d10 70 49 6e 66 6f 29 7b 0a 20 20 69 6e 74 20 69 3b  pInfo){.  int i;
22d20 0a 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 20 3d  .  pInfo->aCol =
22d30 20 73 71 6c 69 74 65 33 41 72 72 61 79 41 6c 6c   sqlite3ArrayAll
22d40 6f 63 61 74 65 28 0a 20 20 20 20 20 20 20 64 62  ocate(.       db
22d50 2c 0a 20 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e  ,.       pInfo->
22d60 61 43 6f 6c 2c 0a 20 20 20 20 20 20 20 73 69 7a  aCol,.       siz
22d70 65 6f 66 28 70 49 6e 66 6f 2d 3e 61 43 6f 6c 5b  eof(pInfo->aCol[
22d80 30 5d 29 2c 0a 20 20 20 20 20 20 20 26 70 49 6e  0]),.       &pIn
22d90 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 2c 0a 20 20 20  fo->nColumn,.   
22da0 20 20 20 20 26 69 0a 20 20 29 3b 0a 20 20 72 65      &i.  );.  re
22db0 74 75 72 6e 20 69 3b 0a 7d 20 20 20 20 0a 0a 2f  turn i;.}    ../
22dc0 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 65  *.** Add a new e
22dd0 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 70 41  lement to the pA
22de0 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 20  ggInfo->aFunc[] 
22df0 61 72 72 61 79 2e 20 20 52 65 74 75 72 6e 20 74  array.  Return t
22e00 68 65 20 69 6e 64 65 78 20 6f 66 0a 2a 2a 20 74  he index of.** t
22e10 68 65 20 6e 65 77 20 65 6c 65 6d 65 6e 74 2e 20  he new element. 
22e20 20 52 65 74 75 72 6e 20 61 20 6e 65 67 61 74 69   Return a negati
22e30 76 65 20 6e 75 6d 62 65 72 20 69 66 20 6d 61 6c  ve number if mal
22e40 6c 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74  loc fails..*/.st
22e50 61 74 69 63 20 69 6e 74 20 61 64 64 41 67 67 49  atic int addAggI
22e60 6e 66 6f 46 75 6e 63 28 73 71 6c 69 74 65 33 20  nfoFunc(sqlite3 
22e70 2a 64 62 2c 20 41 67 67 49 6e 66 6f 20 2a 70 49  *db, AggInfo *pI
22e80 6e 66 6f 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  nfo){.  int i;. 
22e90 20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 20 3d 20   pInfo->aFunc = 
22ea0 73 71 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f  sqlite3ArrayAllo
22eb0 63 61 74 65 28 0a 20 20 20 20 20 20 20 64 62 2c  cate(.       db,
22ec0 20 0a 20 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e   .       pInfo->
22ed0 61 46 75 6e 63 2c 0a 20 20 20 20 20 20 20 73 69  aFunc,.       si
22ee0 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 61 46 75 6e  zeof(pInfo->aFun
22ef0 63 5b 30 5d 29 2c 0a 20 20 20 20 20 20 20 26 70  c[0]),.       &p
22f00 49 6e 66 6f 2d 3e 6e 46 75 6e 63 2c 0a 20 20 20  Info->nFunc,.   
22f10 20 20 20 20 26 69 0a 20 20 29 3b 0a 20 20 72 65      &i.  );.  re
22f20 74 75 72 6e 20 69 3b 0a 7d 20 20 20 20 0a 0a 2f  turn i;.}    ../
22f30 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65  *.** This is the
22f40 20 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 66   xExprCallback f
22f50 6f 72 20 61 20 74 72 65 65 20 77 61 6c 6b 65 72  or a tree walker
22f60 2e 20 20 49 74 20 69 73 20 75 73 65 64 20 74 6f  .  It is used to
22f70 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 73 71  .** implement sq
22f80 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65  lite3ExprAnalyze
22f90 41 67 67 72 65 67 61 74 65 73 28 29 2e 20 20 53  Aggregates().  S
22fa0 65 65 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e  ee sqlite3ExprAn
22fb0 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 0a  alyzeAggregates.
22fc0 2a 2a 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  ** for additiona
22fd0 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a  l information..*
22fe0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6e 61  /.static int ana
22ff0 6c 79 7a 65 41 67 67 72 65 67 61 74 65 28 57 61  lyzeAggregate(Wa
23000 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45  lker *pWalker, E
23010 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69  xpr *pExpr){.  i
23020 6e 74 20 69 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74  nt i;.  NameCont
23030 65 78 74 20 2a 70 4e 43 20 3d 20 70 57 61 6c 6b  ext *pNC = pWalk
23040 65 72 2d 3e 75 2e 70 4e 43 3b 0a 20 20 50 61 72  er->u.pNC;.  Par
23050 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 4e 43  se *pParse = pNC
23060 2d 3e 70 50 61 72 73 65 3b 0a 20 20 53 72 63 4c  ->pParse;.  SrcL
23070 69 73 74 20 2a 70 53 72 63 4c 69 73 74 20 3d 20  ist *pSrcList = 
23080 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3b 0a 20  pNC->pSrcList;. 
23090 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e   AggInfo *pAggIn
230a0 66 6f 20 3d 20 70 4e 43 2d 3e 70 41 67 67 49 6e  fo = pNC->pAggIn
230b0 66 6f 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 70  fo;..  switch( p
230c0 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  Expr->op ){.    
230d0 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55  case TK_AGG_COLU
230e0 4d 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  MN:.    case TK_
230f0 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20  COLUMN: {.      
23100 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
23110 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55  >op==TK_AGG_COLU
23120 4d 4e 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  MN );.      test
23130 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
23140 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20  =TK_COLUMN );.  
23150 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20      /* Check to 
23160 73 65 65 20 69 66 20 74 68 65 20 63 6f 6c 75 6d  see if the colum
23170 6e 20 69 73 20 69 6e 20 6f 6e 65 20 6f 66 20 74  n is in one of t
23180 68 65 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65  he tables in the
23190 20 46 52 4f 4d 0a 20 20 20 20 20 20 2a 2a 20 63   FROM.      ** c
231a0 6c 61 75 73 65 20 6f 66 20 74 68 65 20 61 67 67  lause of the agg
231b0 72 65 67 61 74 65 20 71 75 65 72 79 20 2a 2f 0a  regate query */.
231c0 20 20 20 20 20 20 69 66 28 20 41 4c 57 41 59 53        if( ALWAYS
231d0 28 70 53 72 63 4c 69 73 74 21 3d 30 29 20 29 7b  (pSrcList!=0) ){
231e0 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20  .        struct 
231f0 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
23200 74 65 6d 20 3d 20 70 53 72 63 4c 69 73 74 2d 3e  tem = pSrcList->
23210 61 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  a;.        for(i
23220 3d 30 3b 20 69 3c 70 53 72 63 4c 69 73 74 2d 3e  =0; i<pSrcList->
23230 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d  nSrc; i++, pItem
23240 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  ++){.          s
23250 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f  truct AggInfo_co
23260 6c 20 2a 70 43 6f 6c 3b 0a 20 20 20 20 20 20 20  l *pCol;.       
23270 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
23280 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
23290 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c  r, EP_TokenOnly|
232a0 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a 20  EP_Reduced) );. 
232b0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78           if( pEx
232c0 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 49 74 65  pr->iTable==pIte
232d0 6d 2d 3e 69 43 75 72 73 6f 72 20 29 7b 0a 20 20  m->iCursor ){.  
232e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
232f0 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f  we reach this po
23300 69 6e 74 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  int, it means th
23310 61 74 20 70 45 78 70 72 20 72 65 66 65 72 73 20  at pExpr refers 
23320 74 6f 20 61 20 74 61 62 6c 65 0a 20 20 20 20 20  to a table.     
23330 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 69         ** that i
23340 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  s in the FROM cl
23350 61 75 73 65 20 6f 66 20 74 68 65 20 61 67 67 72  ause of the aggr
23360 65 67 61 74 65 20 71 75 65 72 79 2e 20 20 0a 20  egate query.  . 
23370 20 20 20 20 20 20 20 20 20 20 20 2a 2a 0a 20 20             **.  
23380 20 20 20 20 20 20 20 20 20 20 2a 2a 20 4d 61 6b            ** Mak
23390 65 20 61 6e 20 65 6e 74 72 79 20 66 6f 72 20 74  e an entry for t
233a0 68 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 41 67  he column in pAg
233b0 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 69 66  gInfo->aCol[] if
233c0 20 74 68 65 72 65 0a 20 20 20 20 20 20 20 20 20   there.         
233d0 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61 6e 20     ** is not an 
233e0 65 6e 74 72 79 20 74 68 65 72 65 20 61 6c 72 65  entry there alre
233f0 61 64 79 2e 0a 20 20 20 20 20 20 20 20 20 20 20  ady..           
23400 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
23410 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20 20 20 20  int k;.         
23420 20 20 20 70 43 6f 6c 20 3d 20 70 41 67 67 49 6e     pCol = pAggIn
23430 66 6f 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 20 20  fo->aCol;.      
23440 20 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b        for(k=0; k
23450 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75  <pAggInfo->nColu
23460 6d 6e 3b 20 6b 2b 2b 2c 20 70 43 6f 6c 2b 2b 29  mn; k++, pCol++)
23470 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
23480 69 66 28 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65  if( pCol->iTable
23490 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20  ==pExpr->iTable 
234a0 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  &&.             
234b0 20 20 20 20 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75       pCol->iColu
234c0 6d 6e 3d 3d 70 45 78 70 72 2d 3e 69 43 6f 6c 75  mn==pExpr->iColu
234d0 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  mn ){.          
234e0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
234f0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
23500 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
23510 20 20 20 20 20 20 20 69 66 28 20 28 6b 3e 3d 70         if( (k>=p
23520 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e  AggInfo->nColumn
23530 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26  ).             &
23540 26 20 28 6b 20 3d 20 61 64 64 41 67 67 49 6e 66  & (k = addAggInf
23550 6f 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2d 3e  oColumn(pParse->
23560 64 62 2c 20 70 41 67 67 49 6e 66 6f 29 29 3e 3d  db, pAggInfo))>=
23570 30 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 29  0 .            )
23580 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
23590 70 43 6f 6c 20 3d 20 26 70 41 67 67 49 6e 66 6f  pCol = &pAggInfo
235a0 2d 3e 61 43 6f 6c 5b 6b 5d 3b 0a 20 20 20 20 20  ->aCol[k];.     
235b0 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70           pCol->p
235c0 54 61 62 20 3d 20 70 45 78 70 72 2d 3e 70 54 61  Tab = pExpr->pTa
235d0 62 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  b;.             
235e0 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 20 3d 20   pCol->iTable = 
235f0 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20  pExpr->iTable;. 
23600 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
23610 6c 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 70 45 78  l->iColumn = pEx
23620 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20  pr->iColumn;.   
23630 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
23640 3e 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65  >iMem = ++pParse
23650 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20  ->nMem;.        
23660 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72        pCol->iSor
23670 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a  terColumn = -1;.
23680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
23690 6f 6c 2d 3e 70 45 78 70 72 20 3d 20 70 45 78 70  ol->pExpr = pExp
236a0 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r;.             
236b0 20 69 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e 70   if( pAggInfo->p
236c0 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20  GroupBy ){.     
236d0 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6a             int j
236e0 2c 20 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20  , n;.           
236f0 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70       ExprList *p
23700 47 42 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 70  GB = pAggInfo->p
23710 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 20 20 20  GroupBy;.       
23720 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20           struct 
23730 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
23740 54 65 72 6d 20 3d 20 70 47 42 2d 3e 61 3b 0a 20  Term = pGB->a;. 
23750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e                 n
23760 20 3d 20 70 47 42 2d 3e 6e 45 78 70 72 3b 0a 20   = pGB->nExpr;. 
23770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66                 f
23780 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 3b 20 6a 2b 2b  or(j=0; j<n; j++
23790 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  , pTerm++){.    
237a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45 78                Ex
237b0 70 72 20 2a 70 45 20 3d 20 70 54 65 72 6d 2d 3e  pr *pE = pTerm->
237c0 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20  pExpr;.         
237d0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 45 2d           if( pE-
237e0 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26  >op==TK_COLUMN &
237f0 26 20 70 45 2d 3e 69 54 61 62 6c 65 3d 3d 70 45  & pE->iTable==pE
23800 78 70 72 2d 3e 69 54 61 62 6c 65 20 26 26 0a 20  xpr->iTable &&. 
23810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23820 20 20 20 20 20 70 45 2d 3e 69 43 6f 6c 75 6d 6e       pE->iColumn
23830 3d 3d 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ==pExpr->iColumn
23840 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
23850 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53          pCol->iS
23860 6f 72 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 6a 3b  orterColumn = j;
23870 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
23880 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
23890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
238a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
238b0 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
238c0 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
238d0 69 66 28 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65  if( pCol->iSorte
238e0 72 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20  rColumn<0 ){.   
238f0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
23900 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e  l->iSorterColumn
23910 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 53 6f   = pAggInfo->nSo
23920 72 74 69 6e 67 43 6f 6c 75 6d 6e 2b 2b 3b 0a 20  rtingColumn++;. 
23930 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
23940 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
23950 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 72           /* Ther
23960 65 20 69 73 20 6e 6f 77 20 61 6e 20 65 6e 74 72  e is now an entr
23970 79 20 66 6f 72 20 70 45 78 70 72 20 69 6e 20 70  y for pExpr in p
23980 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20  AggInfo->aCol[] 
23990 28 65 69 74 68 65 72 0a 20 20 20 20 20 20 20 20  (either.        
239a0 20 20 20 20 2a 2a 20 62 65 63 61 75 73 65 20 69      ** because i
239b0 74 20 77 61 73 20 74 68 65 72 65 20 62 65 66 6f  t was there befo
239c0 72 65 20 6f 72 20 62 65 63 61 75 73 65 20 77 65  re or because we
239d0 20 6a 75 73 74 20 63 72 65 61 74 65 64 20 69 74   just created it
239e0 29 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  )..            *
239f0 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20 70 45  * Convert the pE
23a00 78 70 72 20 74 6f 20 62 65 20 61 20 54 4b 5f 41  xpr to be a TK_A
23a10 47 47 5f 43 4f 4c 55 4d 4e 20 72 65 66 65 72 72  GG_COLUMN referr
23a20 69 6e 67 20 74 6f 20 74 68 61 74 0a 20 20 20 20  ing to that.    
23a30 20 20 20 20 20 20 20 20 2a 2a 20 70 41 67 67 49          ** pAggI
23a40 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 65 6e 74 72  nfo->aCol[] entr
23a50 79 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  y..            *
23a60 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 45 78  /.            Ex
23a70 70 72 53 65 74 56 56 41 50 72 6f 70 65 72 74 79  prSetVVAProperty
23a80 28 70 45 78 70 72 2c 20 45 50 5f 4e 6f 52 65 64  (pExpr, EP_NoRed
23a90 75 63 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  uce);.          
23aa0 20 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66    pExpr->pAggInf
23ab0 6f 20 3d 20 70 41 67 67 49 6e 66 6f 3b 0a 20 20  o = pAggInfo;.  
23ac0 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
23ad0 3e 6f 70 20 3d 20 54 4b 5f 41 47 47 5f 43 4f 4c  >op = TK_AGG_COL
23ae0 55 4d 4e 3b 0a 20 20 20 20 20 20 20 20 20 20 20  UMN;.           
23af0 20 70 45 78 70 72 2d 3e 69 41 67 67 20 3d 20 28   pExpr->iAgg = (
23b00 69 31 36 29 6b 3b 0a 20 20 20 20 20 20 20 20 20  i16)k;.         
23b10 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
23b20 20 20 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20 70      } /* endif p
23b30 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 49  Expr->iTable==pI
23b40 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 2a 2f 0a  tem->iCursor */.
23b50 20 20 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64          } /* end
23b60 20 6c 6f 6f 70 20 6f 76 65 72 20 70 53 72 63 4c   loop over pSrcL
23b70 69 73 74 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20  ist */.      }. 
23b80 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f       return WRC_
23b90 50 72 75 6e 65 3b 0a 20 20 20 20 7d 0a 20 20 20  Prune;.    }.   
23ba0 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e   case TK_AGG_FUN
23bb0 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 69  CTION: {.      i
23bc0 66 28 20 28 70 4e 43 2d 3e 6e 63 46 6c 61 67 73  f( (pNC->ncFlags
23bd0 20 26 20 4e 43 5f 49 6e 41 67 67 46 75 6e 63 29   & NC_InAggFunc)
23be0 3d 3d 30 0a 20 20 20 20 20 20 20 26 26 20 70 57  ==0.       && pW
23bf0 61 6c 6b 65 72 2d 3e 77 61 6c 6b 65 72 44 65 70  alker->walkerDep
23c00 74 68 3d 3d 70 45 78 70 72 2d 3e 6f 70 32 0a 20  th==pExpr->op2. 
23c10 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
23c20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  /* Check to see 
23c30 69 66 20 70 45 78 70 72 20 69 73 20 61 20 64 75  if pExpr is a du
23c40 70 6c 69 63 61 74 65 20 6f 66 20 61 6e 6f 74 68  plicate of anoth
23c50 65 72 20 61 67 67 72 65 67 61 74 65 20 0a 20 20  er aggregate .  
23c60 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f        ** functio
23c70 6e 20 74 68 61 74 20 69 73 20 61 6c 72 65 61 64  n that is alread
23c80 79 20 69 6e 20 74 68 65 20 70 41 67 67 49 6e 66  y in the pAggInf
23c90 6f 20 73 74 72 75 63 74 75 72 65 0a 20 20 20 20  o structure.    
23ca0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 73      */.        s
23cb0 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75  truct AggInfo_fu
23cc0 6e 63 20 2a 70 49 74 65 6d 20 3d 20 70 41 67 67  nc *pItem = pAgg
23cd0 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 0a 20 20 20  Info->aFunc;.   
23ce0 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
23cf0 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b  pAggInfo->nFunc;
23d00 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i++, pItem++){.
23d10 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71            if( sq
23d20 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65  lite3ExprCompare
23d30 28 70 49 74 65 6d 2d 3e 70 45 78 70 72 2c 20 70  (pItem->pExpr, p
23d40 45 78 70 72 2c 20 2d 31 29 3d 3d 30 20 29 7b 0a  Expr, -1)==0 ){.
23d50 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
23d60 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  k;.          }. 
23d70 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
23d80 20 69 66 28 20 69 3e 3d 70 41 67 67 49 6e 66 6f   if( i>=pAggInfo
23d90 2d 3e 6e 46 75 6e 63 20 29 7b 0a 20 20 20 20 20  ->nFunc ){.     
23da0 20 20 20 20 20 2f 2a 20 70 45 78 70 72 20 69 73       /* pExpr is
23db0 20 6f 72 69 67 69 6e 61 6c 2e 20 20 4d 61 6b 65   original.  Make
23dc0 20 61 20 6e 65 77 20 65 6e 74 72 79 20 69 6e 20   a new entry in 
23dd0 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b  pAggInfo->aFunc[
23de0 5d 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ].          */. 
23df0 20 20 20 20 20 20 20 20 20 75 38 20 65 6e 63 20           u8 enc 
23e00 3d 20 45 4e 43 28 70 50 61 72 73 65 2d 3e 64 62  = ENC(pParse->db
23e10 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 20 3d  );.          i =
23e20 20 61 64 64 41 67 67 49 6e 66 6f 46 75 6e 63 28   addAggInfoFunc(
23e30 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 41 67 67  pParse->db, pAgg
23e40 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 20  Info);.         
23e50 20 69 66 28 20 69 3e 3d 30 20 29 7b 0a 20 20 20   if( i>=0 ){.   
23e60 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
23e70 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
23e80 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
23e90 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20  elect) );.      
23ea0 20 20 20 20 20 20 70 49 74 65 6d 20 3d 20 26 70        pItem = &p
23eb0 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69  AggInfo->aFunc[i
23ec0 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ];.            p
23ed0 49 74 65 6d 2d 3e 70 45 78 70 72 20 3d 20 70 45  Item->pExpr = pE
23ee0 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20  xpr;.           
23ef0 20 70 49 74 65 6d 2d 3e 69 4d 65 6d 20 3d 20 2b   pItem->iMem = +
23f00 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
23f10 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
23f20 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
23f30 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e  rty(pExpr, EP_In
23f40 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20  tValue) );.     
23f50 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 46         pItem->pF
23f60 75 6e 63 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  unc = sqlite3Fin
23f70 64 46 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65  dFunction(pParse
23f80 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20  ->db,.          
23f90 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
23fa0 75 2e 7a 54 6f 6b 65 6e 2c 20 73 71 6c 69 74 65  u.zToken, sqlite
23fb0 33 53 74 72 6c 65 6e 33 30 28 70 45 78 70 72 2d  3Strlen30(pExpr-
23fc0 3e 75 2e 7a 54 6f 6b 65 6e 29 2c 0a 20 20 20 20  >u.zToken),.    
23fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
23fe0 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20 3f 20  Expr->x.pList ? 
23ff0 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e  pExpr->x.pList->
24000 6e 45 78 70 72 20 3a 20 30 2c 20 65 6e 63 2c 20  nExpr : 0, enc, 
24010 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0);.            
24020 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73  if( pExpr->flags
24030 20 26 20 45 50 5f 44 69 73 74 69 6e 63 74 20 29   & EP_Distinct )
24040 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
24050 70 49 74 65 6d 2d 3e 69 44 69 73 74 69 6e 63 74  pItem->iDistinct
24060 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
24070 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  +;.            }
24080 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
24090 20 20 20 20 70 49 74 65 6d 2d 3e 69 44 69 73 74      pItem->iDist
240a0 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20  inct = -1;.     
240b0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
240c0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
240d0 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 70         /* Make p
240e0 45 78 70 72 20 70 6f 69 6e 74 20 74 6f 20 74 68  Expr point to th
240f0 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 70 41  e appropriate pA
24100 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 20  ggInfo->aFunc[] 
24110 65 6e 74 72 79 0a 20 20 20 20 20 20 20 20 2a 2f  entry.        */
24120 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
24130 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
24140 79 28 70 45 78 70 72 2c 20 45 50 5f 54 6f 6b 65  y(pExpr, EP_Toke
24150 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64  nOnly|EP_Reduced
24160 29 20 29 3b 0a 20 20 20 20 20 20 20 20 45 78 70  ) );.        Exp
24170 72 53 65 74 56 56 41 50 72 6f 70 65 72 74 79 28  rSetVVAProperty(
24180 70 45 78 70 72 2c 20 45 50 5f 4e 6f 52 65 64 75  pExpr, EP_NoRedu
24190 63 65 29 3b 0a 20 20 20 20 20 20 20 20 70 45 78  ce);.        pEx
241a0 70 72 2d 3e 69 41 67 67 20 3d 20 28 69 31 36 29  pr->iAgg = (i16)
241b0 69 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72  i;.        pExpr
241c0 2d 3e 70 41 67 67 49 6e 66 6f 20 3d 20 70 41 67  ->pAggInfo = pAg
241d0 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 72  gInfo;.        r
241e0 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b  eturn WRC_Prune;
241f0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
24200 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
24210 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20  _Continue;.     
24220 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
24230 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e  eturn WRC_Contin
24240 75 65 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74  ue;.}.static int
24250 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74   analyzeAggregat
24260 65 73 49 6e 53 65 6c 65 63 74 28 57 61 6c 6b 65  esInSelect(Walke
24270 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65  r *pWalker, Sele
24280 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20  ct *pSelect){.  
24290 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
242a0 28 70 57 61 6c 6b 65 72 29 3b 0a 20 20 55 4e 55  (pWalker);.  UNU
242b0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 53  SED_PARAMETER(pS
242c0 65 6c 65 63 74 29 3b 0a 20 20 72 65 74 75 72 6e  elect);.  return
242d0 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d   WRC_Continue;.}
242e0 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20  ../*.** Analyze 
242f0 74 68 65 20 70 45 78 70 72 20 65 78 70 72 65 73  the pExpr expres
24300 73 69 6f 6e 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72  sion looking for
24310 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
24320 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f 72 20  ions and.** for 
24330 76 61 72 69 61 62 6c 65 73 20 74 68 61 74 20 6e  variables that n
24340 65 65 64 20 74 6f 20 62 65 20 61 64 64 65 64 20  eed to be added 
24350 74 6f 20 41 67 67 49 6e 66 6f 20 6f 62 6a 65 63  to AggInfo objec
24360 74 20 74 68 61 74 20 70 4e 43 2d 3e 70 41 67 67  t that pNC->pAgg
24370 49 6e 66 6f 0a 2a 2a 20 70 6f 69 6e 74 73 20 74  Info.** points t
24380 6f 2e 20 20 41 64 64 69 74 69 6f 6e 61 6c 20 65  o.  Additional e
24390 6e 74 72 69 65 73 20 61 72 65 20 6d 61 64 65 20  ntries are made 
243a0 6f 6e 20 74 68 65 20 41 67 67 49 6e 66 6f 20 6f  on the AggInfo o
243b0 62 6a 65 63 74 20 61 73 0a 2a 2a 20 6e 65 63 65  bject as.** nece
243c0 73 73 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ssary..**.** Thi
243d0 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64  s routine should
243e0 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20   only be called 
243f0 61 66 74 65 72 20 74 68 65 20 65 78 70 72 65 73  after the expres
24400 73 69 6f 6e 20 68 61 73 20 62 65 65 6e 0a 2a 2a  sion has been.**
24410 20 61 6e 61 6c 79 7a 65 64 20 62 79 20 73 71 6c   analyzed by sql
24420 69 74 65 33 52 65 73 6f 6c 76 65 45 78 70 72 4e  ite3ResolveExprN
24430 61 6d 65 73 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20  ames()..*/.void 
24440 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79  sqlite3ExprAnaly
24450 7a 65 41 67 67 72 65 67 61 74 65 73 28 4e 61 6d  zeAggregates(Nam
24460 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 45  eContext *pNC, E
24470 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 57  xpr *pExpr){.  W
24480 61 6c 6b 65 72 20 77 3b 0a 20 20 6d 65 6d 73 65  alker w;.  memse
24490 74 28 26 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28  t(&w, 0, sizeof(
244a0 77 29 29 3b 0a 20 20 77 2e 78 45 78 70 72 43 61  w));.  w.xExprCa
244b0 6c 6c 62 61 63 6b 20 3d 20 61 6e 61 6c 79 7a 65  llback = analyze
244c0 41 67 67 72 65 67 61 74 65 3b 0a 20 20 77 2e 78  Aggregate;.  w.x
244d0 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d  SelectCallback =
244e0 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74   analyzeAggregat
244f0 65 73 49 6e 53 65 6c 65 63 74 3b 0a 20 20 77 2e  esInSelect;.  w.
24500 75 2e 70 4e 43 20 3d 20 70 4e 43 3b 0a 20 20 61  u.pNC = pNC;.  a
24510 73 73 65 72 74 28 20 70 4e 43 2d 3e 70 53 72 63  ssert( pNC->pSrc
24520 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 73 71 6c  List!=0 );.  sql
24530 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77 2c  ite3WalkExpr(&w,
24540 20 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   pExpr);.}../*.*
24550 2a 20 43 61 6c 6c 20 73 71 6c 69 74 65 33 45 78  * Call sqlite3Ex
24560 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  prAnalyzeAggrega
24570 74 65 73 28 29 20 66 6f 72 20 65 76 65 72 79 20  tes() for every 
24580 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 61 6e  expression in an
24590 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  .** expression l
245a0 69 73 74 2e 20 20 52 65 74 75 72 6e 20 74 68 65  ist.  Return the
245b0 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72   number of error
245c0 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  s..**.** If an e
245d0 72 72 6f 72 20 69 73 20 66 6f 75 6e 64 2c 20 74  rror is found, t
245e0 68 65 20 61 6e 61 6c 79 73 69 73 20 69 73 20 63  he analysis is c
245f0 75 74 20 73 68 6f 72 74 2e 0a 2a 2f 0a 76 6f 69  ut short..*/.voi
24600 64 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61  d sqlite3ExprAna
24610 6c 79 7a 65 41 67 67 4c 69 73 74 28 4e 61 6d 65  lyzeAggList(Name
24620 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 45 78  Context *pNC, Ex
24630 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a  prList *pList){.
24640 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
24650 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
24660 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c   int i;.  if( pL
24670 69 73 74 20 29 7b 0a 20 20 20 20 66 6f 72 28 70  ist ){.    for(p
24680 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69  Item=pList->a, i
24690 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  =0; i<pList->nEx
246a0 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b  pr; i++, pItem++
246b0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
246c0 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65  ExprAnalyzeAggre
246d0 67 61 74 65 73 28 70 4e 43 2c 20 70 49 74 65 6d  gates(pNC, pItem
246e0 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a  ->pExpr);.    }.
246f0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c    }.}../*.** All
24700 6f 63 61 74 65 20 61 20 73 69 6e 67 6c 65 20 6e  ocate a single n
24710 65 77 20 72 65 67 69 73 74 65 72 20 66 6f 72 20  ew register for 
24720 75 73 65 20 74 6f 20 68 6f 6c 64 20 73 6f 6d 65  use to hold some
24730 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 72 65   intermediate re
24740 73 75 6c 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  sult..*/.int sql
24750 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 50  ite3GetTempReg(P
24760 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20  arse *pParse){. 
24770 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 54 65   if( pParse->nTe
24780 6d 70 52 65 67 3d 3d 30 20 29 7b 0a 20 20 20 20  mpReg==0 ){.    
24790 72 65 74 75 72 6e 20 2b 2b 70 50 61 72 73 65 2d  return ++pParse-
247a0 3e 6e 4d 65 6d 3b 0a 20 20 7d 0a 20 20 72 65 74  >nMem;.  }.  ret
247b0 75 72 6e 20 70 50 61 72 73 65 2d 3e 61 54 65 6d  urn pParse->aTem
247c0 70 52 65 67 5b 2d 2d 70 50 61 72 73 65 2d 3e 6e  pReg[--pParse->n
247d0 54 65 6d 70 52 65 67 5d 3b 0a 7d 0a 0a 2f 2a 0a  TempReg];.}../*.
247e0 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20 61 20  ** Deallocate a 
247f0 72 65 67 69 73 74 65 72 2c 20 6d 61 6b 69 6e 67  register, making
24800 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 72   available for r
24810 65 75 73 65 20 66 6f 72 20 73 6f 6d 65 20 6f 74  euse for some ot
24820 68 65 72 0a 2a 2a 20 70 75 72 70 6f 73 65 2e 0a  her.** purpose..
24830 2a 2a 0a 2a 2a 20 49 66 20 61 20 72 65 67 69 73  **.** If a regis
24840 74 65 72 20 69 73 20 63 75 72 72 65 6e 74 6c 79  ter is currently
24850 20 62 65 69 6e 67 20 75 73 65 64 20 62 79 20 74   being used by t
24860 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2c  he column cache,
24870 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 64 65 61   then.** the dea
24880 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 64 65 66  llocation is def
24890 65 72 72 65 64 20 75 6e 74 69 6c 20 74 68 65 20  erred until the 
248a0 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 6c 69 6e  column cache lin
248b0 65 20 74 68 61 74 20 75 73 65 73 0a 2a 2a 20 74  e that uses.** t
248c0 68 65 20 72 65 67 69 73 74 65 72 20 62 65 63 6f  he register beco
248d0 6d 65 73 20 73 74 61 6c 65 2e 0a 2a 2f 0a 76 6f  mes stale..*/.vo
248e0 69 64 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  id sqlite3Releas
248f0 65 54 65 6d 70 52 65 67 28 50 61 72 73 65 20 2a  eTempReg(Parse *
24900 70 50 61 72 73 65 2c 20 69 6e 74 20 69 52 65 67  pParse, int iReg
24910 29 7b 0a 20 20 69 66 28 20 69 52 65 67 20 26 26  ){.  if( iReg &&
24920 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65   pParse->nTempRe
24930 67 3c 41 72 72 61 79 53 69 7a 65 28 70 50 61 72  g<ArraySize(pPar
24940 73 65 2d 3e 61 54 65 6d 70 52 65 67 29 20 29 7b  se->aTempReg) ){
24950 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
24960 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65  struct yColCache
24970 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30   *p;.    for(i=0
24980 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c  , p=pParse->aCol
24990 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f  Cache; i<SQLITE_
249a0 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c  N_COLCACHE; i++,
249b0 20 70 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   p++){.      if(
249c0 20 70 2d 3e 69 52 65 67 3d 3d 69 52 65 67 20 29   p->iReg==iReg )
249d0 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 74 65 6d  {.        p->tem
249e0 70 52 65 67 20 3d 20 31 3b 0a 20 20 20 20 20 20  pReg = 1;.      
249f0 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20    return;.      
24a00 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72  }.    }.    pPar
24a10 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b 70 50 61  se->aTempReg[pPa
24a20 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 2b 2b 5d  rse->nTempReg++]
24a30 20 3d 20 69 52 65 67 3b 0a 20 20 7d 0a 7d 0a 0a   = iReg;.  }.}..
24a40 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6f  /*.** Allocate o
24a50 72 20 64 65 61 6c 6c 6f 63 61 74 65 20 61 20 62  r deallocate a b
24a60 6c 6f 63 6b 20 6f 66 20 6e 52 65 67 20 63 6f 6e  lock of nReg con
24a70 73 65 63 75 74 69 76 65 20 72 65 67 69 73 74 65  secutive registe
24a80 72 73 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  rs.*/.int sqlite
24a90 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 50 61  3GetTempRange(Pa
24aa0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
24ab0 20 6e 52 65 67 29 7b 0a 20 20 69 6e 74 20 69 2c   nReg){.  int i,
24ac0 20 6e 3b 0a 20 20 69 20 3d 20 70 50 61 72 73 65   n;.  i = pParse
24ad0 2d 3e 69 52 61 6e 67 65 52 65 67 3b 0a 20 20 6e  ->iRangeReg;.  n
24ae0 20 3d 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67   = pParse->nRang
24af0 65 52 65 67 3b 0a 20 20 69 66 28 20 6e 52 65 67  eReg;.  if( nReg
24b00 3c 3d 6e 20 29 7b 0a 20 20 20 20 61 73 73 65 72  <=n ){.    asser
24b10 74 28 20 21 75 73 65 64 41 73 43 6f 6c 75 6d 6e  t( !usedAsColumn
24b20 43 61 63 68 65 28 70 50 61 72 73 65 2c 20 69 2c  Cache(pParse, i,
24b30 20 69 2b 6e 2d 31 29 20 29 3b 0a 20 20 20 20 70   i+n-1) );.    p
24b40 50 61 72 73 65 2d 3e 69 52 61 6e 67 65 52 65 67  Parse->iRangeReg
24b50 20 2b 3d 20 6e 52 65 67 3b 0a 20 20 20 20 70 50   += nReg;.    pP
24b60 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20  arse->nRangeReg 
24b70 2d 3d 20 6e 52 65 67 3b 0a 20 20 7d 65 6c 73 65  -= nReg;.  }else
24b80 7b 0a 20 20 20 20 69 20 3d 20 70 50 61 72 73 65  {.    i = pParse
24b90 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70 50  ->nMem+1;.    pP
24ba0 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52  arse->nMem += nR
24bb0 65 67 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  eg;.  }.  return
24bc0 20 69 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74   i;.}.void sqlit
24bd0 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e  e3ReleaseTempRan
24be0 67 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ge(Parse *pParse
24bf0 2c 20 69 6e 74 20 69 52 65 67 2c 20 69 6e 74 20  , int iReg, int 
24c00 6e 52 65 67 29 7b 0a 20 20 73 71 6c 69 74 65 33  nReg){.  sqlite3
24c10 45 78 70 72 43 61 63 68 65 52 65 6d 6f 76 65 28  ExprCacheRemove(
24c20 70 50 61 72 73 65 2c 20 69 52 65 67 2c 20 6e 52  pParse, iReg, nR
24c30 65 67 29 3b 0a 20 20 69 66 28 20 6e 52 65 67 3e  eg);.  if( nReg>
24c40 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65  pParse->nRangeRe
24c50 67 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d  g ){.    pParse-
24c60 3e 6e 52 61 6e 67 65 52 65 67 20 3d 20 6e 52 65  >nRangeReg = nRe
24c70 67 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 69  g;.    pParse->i
24c80 52 61 6e 67 65 52 65 67 20 3d 20 69 52 65 67 3b  RangeReg = iReg;
24c90 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61  .  }.}../*.** Ma
24ca0 72 6b 20 61 6c 6c 20 74 65 6d 70 6f 72 61 72 79  rk all temporary
24cb0 20 72 65 67 69 73 74 65 72 73 20 61 73 20 62 65   registers as be
24cc0 69 6e 67 20 75 6e 61 76 61 69 6c 61 62 6c 65 20  ing unavailable 
24cd0 66 6f 72 20 72 65 75 73 65 2e 0a 2a 2f 0a 76 6f  for reuse..*/.vo
24ce0 69 64 20 73 71 6c 69 74 65 33 43 6c 65 61 72 54  id sqlite3ClearT
24cf0 65 6d 70 52 65 67 43 61 63 68 65 28 50 61 72 73  empRegCache(Pars
24d00 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 70 50  e *pParse){.  pP
24d10 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 20 3d  arse->nTempReg =
24d20 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 52   0;.  pParse->nR
24d30 61 6e 67 65 52 65 67 20 3d 20 30 3b 0a 7d 0a     angeReg = 0;.}.