/ Hex Artifact Content
Login

Artifact 622ca88bb258292690a550ca0c290ec7b071bed4:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 72 6f 75  ile contains rou
0190: 74 69 6e 65 73 20 75 73 65 64 20 66 6f 72 20 61  tines used for a
01a0: 6e 61 6c 79 7a 69 6e 67 20 65 78 70 72 65 73 73  nalyzing express
01b0: 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f 72 20  ions and.** for 
01c0: 67 65 6e 65 72 61 74 69 6e 67 20 56 44 42 45 20  generating VDBE 
01d0: 63 6f 64 65 20 74 68 61 74 20 65 76 61 6c 75 61  code that evalua
01e0: 74 65 73 20 65 78 70 72 65 73 73 69 6f 6e 73 20  tes expressions 
01f0: 69 6e 20 53 51 4c 69 74 65 2e 0a 2a 2f 0a 23 69  in SQLite..*/.#i
0200: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
0210: 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  t.h"../*.** Retu
0220: 72 6e 20 74 68 65 20 27 61 66 66 69 6e 69 74 79  rn the 'affinity
0230: 27 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73  ' of the express
0240: 69 6f 6e 20 70 45 78 70 72 20 69 66 20 61 6e 79  ion pExpr if any
0250: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78 70 72  ..**.** If pExpr
0260: 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 61 20   is a column, a 
0270: 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61 20 63  reference to a c
0280: 6f 6c 75 6d 6e 20 76 69 61 20 61 6e 20 27 41 53  olumn via an 'AS
0290: 27 20 61 6c 69 61 73 2c 0a 2a 2a 20 6f 72 20 61  ' alias,.** or a
02a0: 20 73 75 62 2d 73 65 6c 65 63 74 20 77 69 74 68   sub-select with
02b0: 20 61 20 63 6f 6c 75 6d 6e 20 61 73 20 74 68 65   a column as the
02c0: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 2c 20 74   return value, t
02d0: 68 65 6e 20 74 68 65 20 0a 2a 2a 20 61 66 66 69  hen the .** affi
02e0: 6e 69 74 79 20 6f 66 20 74 68 61 74 20 63 6f 6c  nity of that col
02f0: 75 6d 6e 20 69 73 20 72 65 74 75 72 6e 65 64 2e  umn is returned.
0300: 20 4f 74 68 65 72 77 69 73 65 2c 20 30 78 30 30   Otherwise, 0x00
0310: 20 69 73 20 72 65 74 75 72 6e 65 64 2c 0a 2a 2a   is returned,.**
0320: 20 69 6e 64 69 63 61 74 69 6e 67 20 6e 6f 20 61   indicating no a
0330: 66 66 69 6e 69 74 79 20 66 6f 72 20 74 68 65 20  ffinity for the 
0340: 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a  expression..**.*
0350: 2a 20 69 2e 65 2e 20 74 68 65 20 57 48 45 52 45  * i.e. the WHERE
0360: 20 63 6c 61 75 73 65 20 65 78 70 72 65 73 73 69   clause expressi
0370: 6f 6e 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f  ons in the follo
0380: 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 73 20  wing statements 
0390: 61 6c 6c 0a 2a 2a 20 68 61 76 65 20 61 6e 20 61  all.** have an a
03a0: 66 66 69 6e 69 74 79 3a 0a 2a 2a 0a 2a 2a 20 43  ffinity:.**.** C
03b0: 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61  REATE TABLE t1(a
03c0: 29 3b 0a 2a 2a 20 53 45 4c 45 43 54 20 2a 20 46  );.** SELECT * F
03d0: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3b 0a  ROM t1 WHERE a;.
03e0: 2a 2a 20 53 45 4c 45 43 54 20 61 20 41 53 20 62  ** SELECT a AS b
03f0: 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 62   FROM t1 WHERE b
0400: 3b 0a 2a 2a 20 53 45 4c 45 43 54 20 2a 20 46 52  ;.** SELECT * FR
0410: 4f 4d 20 74 31 20 57 48 45 52 45 20 28 73 65 6c  OM t1 WHERE (sel
0420: 65 63 74 20 61 20 66 72 6f 6d 20 74 31 29 3b 0a  ect a from t1);.
0430: 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33 45  */.char sqlite3E
0440: 78 70 72 41 66 66 69 6e 69 74 79 28 45 78 70 72  xprAffinity(Expr
0450: 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74 20   *pExpr){.  int 
0460: 6f 70 3b 0a 20 20 70 45 78 70 72 20 3d 20 73 71  op;.  pExpr = sq
0470: 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c  lite3ExprSkipCol
0480: 6c 61 74 65 28 70 45 78 70 72 29 3b 0a 20 20 69  late(pExpr);.  i
0490: 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 20  f( pExpr->flags 
04a0: 26 20 45 50 5f 47 65 6e 65 72 69 63 20 29 20 72  & EP_Generic ) r
04b0: 65 74 75 72 6e 20 30 3b 0a 20 20 6f 70 20 3d 20  eturn 0;.  op = 
04c0: 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 69 66 28  pExpr->op;.  if(
04d0: 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29   op==TK_SELECT )
04e0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45  {.    assert( pE
04f0: 78 70 72 2d 3e 66 6c 61 67 73 26 45 50 5f 78 49  xpr->flags&EP_xI
0500: 73 53 65 6c 65 63 74 20 29 3b 0a 20 20 20 20 72  sSelect );.    r
0510: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70  eturn sqlite3Exp
0520: 72 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 2d  rAffinity(pExpr-
0530: 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69  >x.pSelect->pELi
0540: 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b  st->a[0].pExpr);
0550: 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c  .  }.#ifndef SQL
0560: 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54 0a 20 20  ITE_OMIT_CAST.  
0570: 69 66 28 20 6f 70 3d 3d 54 4b 5f 43 41 53 54 20  if( op==TK_CAST 
0580: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  ){.    assert( !
0590: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
05a0: 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c  pExpr, EP_IntVal
05b0: 75 65 29 20 29 3b 0a 20 20 20 20 72 65 74 75 72  ue) );.    retur
05c0: 6e 20 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74  n sqlite3Affinit
05d0: 79 54 79 70 65 28 70 45 78 70 72 2d 3e 75 2e 7a  yType(pExpr->u.z
05e0: 54 6f 6b 65 6e 2c 20 30 29 3b 0a 20 20 7d 0a 23  Token, 0);.  }.#
05f0: 65 6e 64 69 66 0a 20 20 69 66 28 20 28 6f 70 3d  endif.  if( (op=
0600: 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 7c  =TK_AGG_COLUMN |
0610: 7c 20 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  | op==TK_COLUMN 
0620: 7c 7c 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54  || op==TK_REGIST
0630: 45 52 29 20 0a 20 20 20 26 26 20 70 45 78 70 72  ER) .   && pExpr
0640: 2d 3e 70 54 61 62 21 3d 30 0a 20 20 29 7b 0a 20  ->pTab!=0.  ){. 
0650: 20 20 20 2f 2a 20 6f 70 3d 3d 54 4b 5f 52 45 47     /* op==TK_REG
0660: 49 53 54 45 52 20 26 26 20 70 45 78 70 72 2d 3e  ISTER && pExpr->
0670: 70 54 61 62 21 3d 30 20 68 61 70 70 65 6e 73 20  pTab!=0 happens 
0680: 77 68 65 6e 20 70 45 78 70 72 20 77 61 73 20 6f  when pExpr was o
0690: 72 69 67 69 6e 61 6c 6c 79 0a 20 20 20 20 2a 2a  riginally.    **
06a0: 20 61 20 54 4b 5f 43 4f 4c 55 4d 4e 20 62 75 74   a TK_COLUMN but
06b0: 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20   was previously 
06c0: 65 76 61 6c 75 61 74 65 64 20 61 6e 64 20 63 61  evaluated and ca
06d0: 63 68 65 64 20 69 6e 20 61 20 72 65 67 69 73 74  ched in a regist
06e0: 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6a 20  er */.    int j 
06f0: 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  = pExpr->iColumn
0700: 3b 0a 20 20 20 20 69 66 28 20 6a 3c 30 20 29 20  ;.    if( j<0 ) 
0710: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46  return SQLITE_AF
0720: 46 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 61  F_INTEGER;.    a
0730: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 54  ssert( pExpr->pT
0740: 61 62 20 26 26 20 6a 3c 70 45 78 70 72 2d 3e 70  ab && j<pExpr->p
0750: 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20  Tab->nCol );.   
0760: 20 72 65 74 75 72 6e 20 70 45 78 70 72 2d 3e 70   return pExpr->p
0770: 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 61 66 66  Tab->aCol[j].aff
0780: 69 6e 69 74 79 3b 0a 20 20 7d 0a 20 20 72 65 74  inity;.  }.  ret
0790: 75 72 6e 20 70 45 78 70 72 2d 3e 61 66 66 69 6e  urn pExpr->affin
07a0: 69 74 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  ity;.}../*.** Se
07b0: 74 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20  t the collating 
07c0: 73 65 71 75 65 6e 63 65 20 66 6f 72 20 65 78 70  sequence for exp
07d0: 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20 74 6f  ression pExpr to
07e0: 20 62 65 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e   be the collatin
07f0: 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65 20 6e 61  g.** sequence na
0800: 6d 65 64 20 62 79 20 70 54 6f 6b 65 6e 2e 20 20  med by pToken.  
0810: 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
0820: 72 20 74 6f 20 61 20 6e 65 77 20 45 78 70 72 20  r to a new Expr 
0830: 6e 6f 64 65 20 74 68 61 74 0a 2a 2a 20 69 6d 70  node that.** imp
0840: 6c 65 6d 65 6e 74 73 20 74 68 65 20 43 4f 4c 4c  lements the COLL
0850: 41 54 45 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a  ATE operator..**
0860: 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79 20  .** If a memory 
0870: 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72  allocation error
0880: 20 6f 63 63 75 72 73 2c 20 74 68 61 74 20 66 61   occurs, that fa
0890: 63 74 20 69 73 20 72 65 63 6f 72 64 65 64 20 69  ct is recorded i
08a0: 6e 20 70 50 61 72 73 65 2d 3e 64 62 0a 2a 2a 20  n pParse->db.** 
08b0: 61 6e 64 20 74 68 65 20 70 45 78 70 72 20 70 61  and the pExpr pa
08c0: 72 61 6d 65 74 65 72 20 69 73 20 72 65 74 75 72  rameter is retur
08d0: 6e 65 64 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a  ned unchanged..*
08e0: 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45  /.Expr *sqlite3E
08f0: 78 70 72 41 64 64 43 6f 6c 6c 61 74 65 54 6f 6b  xprAddCollateTok
0900: 65 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  en(.  Parse *pPa
0910: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f  rse,           /
0920: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
0930: 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78  t */.  Expr *pEx
0940: 70 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  pr,             
0950: 2f 2a 20 41 64 64 20 74 68 65 20 22 43 4f 4c 4c  /* Add the "COLL
0960: 41 54 45 22 20 63 6c 61 75 73 65 20 74 6f 20 74  ATE" clause to t
0970: 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20 2a  his expression *
0980: 2f 0a 20 20 63 6f 6e 73 74 20 54 6f 6b 65 6e 20  /.  const Token 
0990: 2a 70 43 6f 6c 6c 4e 61 6d 65 20 20 20 2f 2a 20  *pCollName   /* 
09a0: 4e 61 6d 65 20 6f 66 20 63 6f 6c 6c 61 74 69 6e  Name of collatin
09b0: 67 20 73 65 71 75 65 6e 63 65 20 2a 2f 0a 29 7b  g sequence */.){
09c0: 0a 20 20 69 66 28 20 70 43 6f 6c 6c 4e 61 6d 65  .  if( pCollName
09d0: 2d 3e 6e 3e 30 20 29 7b 0a 20 20 20 20 45 78 70  ->n>0 ){.    Exp
09e0: 72 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  r *pNew = sqlite
09f0: 33 45 78 70 72 41 6c 6c 6f 63 28 70 50 61 72 73  3ExprAlloc(pPars
0a00: 65 2d 3e 64 62 2c 20 54 4b 5f 43 4f 4c 4c 41 54  e->db, TK_COLLAT
0a10: 45 2c 20 70 43 6f 6c 6c 4e 61 6d 65 2c 20 31 29  E, pCollName, 1)
0a20: 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 20 29  ;.    if( pNew )
0a30: 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 4c  {.      pNew->pL
0a40: 65 66 74 20 3d 20 70 45 78 70 72 3b 0a 20 20 20  eft = pExpr;.   
0a50: 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c     pNew->flags |
0a60: 3d 20 45 50 5f 43 6f 6c 6c 61 74 65 7c 45 50 5f  = EP_Collate|EP_
0a70: 53 6b 69 70 3b 0a 20 20 20 20 20 20 70 45 78 70  Skip;.      pExp
0a80: 72 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 7d 0a  r = pNew;.    }.
0a90: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 45 78    }.  return pEx
0aa0: 70 72 3b 0a 7d 0a 45 78 70 72 20 2a 73 71 6c 69  pr;.}.Expr *sqli
0ab0: 74 65 33 45 78 70 72 41 64 64 43 6f 6c 6c 61 74  te3ExprAddCollat
0ac0: 65 53 74 72 69 6e 67 28 50 61 72 73 65 20 2a 70  eString(Parse *p
0ad0: 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
0ae0: 70 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  pr, const char *
0af0: 7a 43 29 7b 0a 20 20 54 6f 6b 65 6e 20 73 3b 0a  zC){.  Token s;.
0b00: 20 20 61 73 73 65 72 74 28 20 7a 43 21 3d 30 20    assert( zC!=0 
0b10: 29 3b 0a 20 20 73 2e 7a 20 3d 20 7a 43 3b 0a 20  );.  s.z = zC;. 
0b20: 20 73 2e 6e 20 3d 20 73 71 6c 69 74 65 33 53 74   s.n = sqlite3St
0b30: 72 6c 65 6e 33 30 28 73 2e 7a 29 3b 0a 20 20 72  rlen30(s.z);.  r
0b40: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70  eturn sqlite3Exp
0b50: 72 41 64 64 43 6f 6c 6c 61 74 65 54 6f 6b 65 6e  rAddCollateToken
0b60: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
0b70: 26 73 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6b  &s);.}../*.** Sk
0b80: 69 70 20 6f 76 65 72 20 61 6e 79 20 54 4b 5f 43  ip over any TK_C
0b90: 4f 4c 4c 41 54 45 20 6f 72 20 54 4b 5f 41 53 20  OLLATE or TK_AS 
0ba0: 6f 70 65 72 61 74 6f 72 73 20 61 6e 64 20 61 6e  operators and an
0bb0: 79 20 75 6e 6c 69 6b 65 6c 79 28 29 0a 2a 2a 20  y unlikely().** 
0bc0: 6f 72 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 29 20  or likelihood() 
0bd0: 66 75 6e 63 74 69 6f 6e 20 61 74 20 74 68 65 20  function at the 
0be0: 72 6f 6f 74 20 6f 66 20 61 6e 20 65 78 70 72 65  root of an expre
0bf0: 73 73 69 6f 6e 2e 0a 2a 2f 0a 45 78 70 72 20 2a  ssion..*/.Expr *
0c00: 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43  sqlite3ExprSkipC
0c10: 6f 6c 6c 61 74 65 28 45 78 70 72 20 2a 70 45 78  ollate(Expr *pEx
0c20: 70 72 29 7b 0a 20 20 77 68 69 6c 65 28 20 70 45  pr){.  while( pE
0c30: 78 70 72 20 26 26 20 45 78 70 72 48 61 73 50 72  xpr && ExprHasPr
0c40: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
0c50: 5f 53 6b 69 70 29 20 29 7b 0a 20 20 20 20 69 66  _Skip) ){.    if
0c60: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
0c70: 79 28 70 45 78 70 72 2c 20 45 50 5f 55 6e 6c 69  y(pExpr, EP_Unli
0c80: 6b 65 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 61  kely) ){.      a
0c90: 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
0ca0: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
0cb0: 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a  P_xIsSelect) );.
0cc0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
0cd0: 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45  xpr->x.pList->nE
0ce0: 78 70 72 3e 30 20 29 3b 0a 20 20 20 20 20 20 61  xpr>0 );.      a
0cf0: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
0d00: 3d 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 29 3b  ==TK_FUNCTION );
0d10: 0a 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 70  .      pExpr = p
0d20: 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61  Expr->x.pList->a
0d30: 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 7d  [0].pExpr;.    }
0d40: 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
0d50: 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  rt( pExpr->op==T
0d60: 4b 5f 43 4f 4c 4c 41 54 45 20 7c 7c 20 70 45 78  K_COLLATE || pEx
0d70: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 53 20 29 3b  pr->op==TK_AS );
0d80: 0a 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 70  .      pExpr = p
0d90: 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20  Expr->pLeft;.   
0da0: 20 7d 0a 20 20 7d 20 20 20 0a 20 20 72 65 74 75   }.  }   .  retu
0db0: 72 6e 20 70 45 78 70 72 3b 0a 7d 0a 0a 2f 2a 0a  rn pExpr;.}../*.
0dc0: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 6f  ** Return the co
0dd0: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
0de0: 20 66 6f 72 20 74 68 65 20 65 78 70 72 65 73 73   for the express
0df0: 69 6f 6e 20 70 45 78 70 72 2e 20 49 66 0a 2a 2a  ion pExpr. If.**
0e00: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 64 65 66   there is no def
0e10: 69 6e 65 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73  ined collating s
0e20: 65 71 75 65 6e 63 65 2c 20 72 65 74 75 72 6e 20  equence, return 
0e30: 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  NULL..**.** The 
0e40: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
0e50: 63 65 20 6d 69 67 68 74 20 62 65 20 64 65 74 65  ce might be dete
0e60: 72 6d 69 6e 65 64 20 62 79 20 61 20 43 4f 4c 4c  rmined by a COLL
0e70: 41 54 45 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20  ATE operator.** 
0e80: 6f 72 20 62 79 20 74 68 65 20 70 72 65 73 65 6e  or by the presen
0e90: 63 65 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20 77  ce of a column w
0ea0: 69 74 68 20 61 20 64 65 66 69 6e 65 64 20 63 6f  ith a defined co
0eb0: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
0ec0: 2e 0a 2a 2a 20 43 4f 4c 4c 41 54 45 20 6f 70 65  ..** COLLATE ope
0ed0: 72 61 74 6f 72 73 20 74 61 6b 65 20 66 69 72 73  rators take firs
0ee0: 74 20 70 72 65 63 65 64 65 6e 63 65 2e 20 20 4c  t precedence.  L
0ef0: 65 66 74 20 6f 70 65 72 61 6e 64 73 20 74 61 6b  eft operands tak
0f00: 65 0a 2a 2a 20 70 72 65 63 65 64 65 6e 63 65 20  e.** precedence 
0f10: 6f 76 65 72 20 72 69 67 68 74 20 6f 70 65 72 61  over right opera
0f20: 6e 64 73 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20  nds..*/.CollSeq 
0f30: 2a 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c  *sqlite3ExprColl
0f40: 53 65 71 28 50 61 72 73 65 20 2a 70 50 61 72 73  Seq(Parse *pPars
0f50: 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  e, Expr *pExpr){
0f60: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
0f70: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 43   pParse->db;.  C
0f80: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20  ollSeq *pColl = 
0f90: 30 3b 0a 20 20 45 78 70 72 20 2a 70 20 3d 20 70  0;.  Expr *p = p
0fa0: 45 78 70 72 3b 0a 20 20 77 68 69 6c 65 28 20 70  Expr;.  while( p
0fb0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 6f 70 20 3d   ){.    int op =
0fc0: 20 70 2d 3e 6f 70 3b 0a 20 20 20 20 69 66 28 20   p->op;.    if( 
0fd0: 70 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 47 65  p->flags & EP_Ge
0fe0: 6e 65 72 69 63 20 29 20 62 72 65 61 6b 3b 0a 20  neric ) break;. 
0ff0: 20 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 43 41     if( op==TK_CA
1000: 53 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 50 4c  ST || op==TK_UPL
1010: 55 53 20 29 7b 0a 20 20 20 20 20 20 70 20 3d 20  US ){.      p = 
1020: 70 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20  p->pLeft;.      
1030: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a  continue;.    }.
1040: 20 20 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 43      if( op==TK_C
1050: 4f 4c 4c 41 54 45 20 7c 7c 20 28 6f 70 3d 3d 54  OLLATE || (op==T
1060: 4b 5f 52 45 47 49 53 54 45 52 20 26 26 20 70 2d  K_REGISTER && p-
1070: 3e 6f 70 32 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45  >op2==TK_COLLATE
1080: 29 20 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c 6c  ) ){.      pColl
1090: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 43 6f 6c   = sqlite3GetCol
10a0: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 45 4e 43  lSeq(pParse, ENC
10b0: 28 64 62 29 2c 20 30 2c 20 70 2d 3e 75 2e 7a 54  (db), 0, p->u.zT
10c0: 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 62 72 65  oken);.      bre
10d0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ak;.    }.    if
10e0: 28 20 70 2d 3e 70 54 61 62 21 3d 30 0a 20 20 20  ( p->pTab!=0.   
10f0: 20 20 26 26 20 28 6f 70 3d 3d 54 4b 5f 41 47 47    && (op==TK_AGG
1100: 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 6f 70 3d 3d 54  _COLUMN || op==T
1110: 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20 20 20 20 20  K_COLUMN.       
1120: 20 20 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 52 45 47     || op==TK_REG
1130: 49 53 54 45 52 20 7c 7c 20 6f 70 3d 3d 54 4b 5f  ISTER || op==TK_
1140: 54 52 49 47 47 45 52 29 0a 20 20 20 20 29 7b 0a  TRIGGER).    ){.
1150: 20 20 20 20 20 20 2f 2a 20 6f 70 3d 3d 54 4b 5f        /* op==TK_
1160: 52 45 47 49 53 54 45 52 20 26 26 20 70 2d 3e 70  REGISTER && p->p
1170: 54 61 62 21 3d 30 20 68 61 70 70 65 6e 73 20 77  Tab!=0 happens w
1180: 68 65 6e 20 70 45 78 70 72 20 77 61 73 20 6f 72  hen pExpr was or
1190: 69 67 69 6e 61 6c 6c 79 0a 20 20 20 20 20 20 2a  iginally.      *
11a0: 2a 20 61 20 54 4b 5f 43 4f 4c 55 4d 4e 20 62 75  * a TK_COLUMN bu
11b0: 74 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79  t was previously
11c0: 20 65 76 61 6c 75 61 74 65 64 20 61 6e 64 20 63   evaluated and c
11d0: 61 63 68 65 64 20 69 6e 20 61 20 72 65 67 69 73  ached in a regis
11e0: 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  ter */.      int
11f0: 20 6a 20 3d 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3b   j = p->iColumn;
1200: 0a 20 20 20 20 20 20 69 66 28 20 6a 3e 3d 30 20  .      if( j>=0 
1210: 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  ){.        const
1220: 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70   char *zColl = p
1230: 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e  ->pTab->aCol[j].
1240: 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70  zColl;.        p
1250: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69  Coll = sqlite3Fi
1260: 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 45 4e  ndCollSeq(db, EN
1270: 43 28 64 62 29 2c 20 7a 43 6f 6c 6c 2c 20 30 29  C(db), zColl, 0)
1280: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1290: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
12a0: 20 69 66 28 20 70 2d 3e 66 6c 61 67 73 20 26 20   if( p->flags & 
12b0: 45 50 5f 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20  EP_Collate ){.  
12c0: 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 70      if( ALWAYS(p
12d0: 2d 3e 70 4c 65 66 74 29 20 26 26 20 28 70 2d 3e  ->pLeft) && (p->
12e0: 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20 26 20 45  pLeft->flags & E
12f0: 50 5f 43 6f 6c 6c 61 74 65 29 21 3d 30 20 29 7b  P_Collate)!=0 ){
1300: 0a 20 20 20 20 20 20 20 20 70 20 3d 20 70 2d 3e  .        p = p->
1310: 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 7d 65 6c  pLeft;.      }el
1320: 73 65 7b 0a 20 20 20 20 20 20 20 20 70 20 3d 20  se{.        p = 
1330: 70 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20  p->pRight;.     
1340: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
1350: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1360: 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74  .  }.  if( sqlit
1370: 65 33 43 68 65 63 6b 43 6f 6c 6c 53 65 71 28 70  e3CheckCollSeq(p
1380: 50 61 72 73 65 2c 20 70 43 6f 6c 6c 29 20 29 7b  Parse, pColl) ){
1390: 20 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 30 3b   .    pColl = 0;
13a0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 43  .  }.  return pC
13b0: 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45  oll;.}../*.** pE
13c0: 78 70 72 20 69 73 20 61 6e 20 6f 70 65 72 61 6e  xpr is an operan
13d0: 64 20 6f 66 20 61 20 63 6f 6d 70 61 72 69 73 6f  d of a compariso
13e0: 6e 20 6f 70 65 72 61 74 6f 72 2e 20 20 61 66 66  n operator.  aff
13f0: 32 20 69 73 20 74 68 65 0a 2a 2a 20 74 79 70 65  2 is the.** type
1400: 20 61 66 66 69 6e 69 74 79 20 6f 66 20 74 68 65   affinity of the
1410: 20 6f 74 68 65 72 20 6f 70 65 72 61 6e 64 2e 20   other operand. 
1420: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
1430: 74 75 72 6e 73 20 74 68 65 0a 2a 2a 20 74 79 70  turns the.** typ
1440: 65 20 61 66 66 69 6e 69 74 79 20 74 68 61 74 20  e affinity that 
1450: 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20 66  should be used f
1460: 6f 72 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  or the compariso
1470: 6e 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2f 0a 63  n operator..*/.c
1480: 68 61 72 20 73 71 6c 69 74 65 33 43 6f 6d 70 61  har sqlite3Compa
1490: 72 65 41 66 66 69 6e 69 74 79 28 45 78 70 72 20  reAffinity(Expr 
14a0: 2a 70 45 78 70 72 2c 20 63 68 61 72 20 61 66 66  *pExpr, char aff
14b0: 32 29 7b 0a 20 20 63 68 61 72 20 61 66 66 31 20  2){.  char aff1 
14c0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66  = sqlite3ExprAff
14d0: 69 6e 69 74 79 28 70 45 78 70 72 29 3b 0a 20 20  inity(pExpr);.  
14e0: 69 66 28 20 61 66 66 31 20 26 26 20 61 66 66 32  if( aff1 && aff2
14f0: 20 29 7b 0a 20 20 20 20 2f 2a 20 42 6f 74 68 20   ){.    /* Both 
1500: 73 69 64 65 73 20 6f 66 20 74 68 65 20 63 6f 6d  sides of the com
1510: 70 61 72 69 73 6f 6e 20 61 72 65 20 63 6f 6c 75  parison are colu
1520: 6d 6e 73 2e 20 49 66 20 6f 6e 65 20 68 61 73 20  mns. If one has 
1530: 6e 75 6d 65 72 69 63 0a 20 20 20 20 2a 2a 20 61  numeric.    ** a
1540: 66 66 69 6e 69 74 79 2c 20 75 73 65 20 74 68 61  ffinity, use tha
1550: 74 2e 20 4f 74 68 65 72 77 69 73 65 20 75 73 65  t. Otherwise use
1560: 20 6e 6f 20 61 66 66 69 6e 69 74 79 2e 0a 20 20   no affinity..  
1570: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c    */.    if( sql
1580: 69 74 65 33 49 73 4e 75 6d 65 72 69 63 41 66 66  ite3IsNumericAff
1590: 69 6e 69 74 79 28 61 66 66 31 29 20 7c 7c 20 73  inity(aff1) || s
15a0: 71 6c 69 74 65 33 49 73 4e 75 6d 65 72 69 63 41  qlite3IsNumericA
15b0: 66 66 69 6e 69 74 79 28 61 66 66 32 29 20 29 7b  ffinity(aff2) ){
15c0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
15d0: 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43  LITE_AFF_NUMERIC
15e0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
15f0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1600: 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 7d  _AFF_NONE;.    }
1610: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 61 66  .  }else if( !af
1620: 66 31 20 26 26 20 21 61 66 66 32 20 29 7b 0a 20  f1 && !aff2 ){. 
1630: 20 20 20 2f 2a 20 4e 65 69 74 68 65 72 20 73 69     /* Neither si
1640: 64 65 20 6f 66 20 74 68 65 20 63 6f 6d 70 61 72  de of the compar
1650: 69 73 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e  ison is a column
1660: 2e 20 20 43 6f 6d 70 61 72 65 20 74 68 65 0a 20  .  Compare the. 
1670: 20 20 20 2a 2a 20 72 65 73 75 6c 74 73 20 64 69     ** results di
1680: 72 65 63 74 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20  rectly..    */. 
1690: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
16a0: 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 7d 65 6c  _AFF_NONE;.  }el
16b0: 73 65 7b 0a 20 20 20 20 2f 2a 20 4f 6e 65 20 73  se{.    /* One s
16c0: 69 64 65 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c  ide is a column,
16d0: 20 74 68 65 20 6f 74 68 65 72 20 69 73 20 6e 6f   the other is no
16e0: 74 2e 20 55 73 65 20 74 68 65 20 63 6f 6c 75 6d  t. Use the colum
16f0: 6e 73 20 61 66 66 69 6e 69 74 79 2e 20 2a 2f 0a  ns affinity. */.
1700: 20 20 20 20 61 73 73 65 72 74 28 20 61 66 66 31      assert( aff1
1710: 3d 3d 30 20 7c 7c 20 61 66 66 32 3d 3d 30 20 29  ==0 || aff2==0 )
1720: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 61 66  ;.    return (af
1730: 66 31 20 2b 20 61 66 66 32 29 3b 0a 20 20 7d 0a  f1 + aff2);.  }.
1740: 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72 20 69  }../*.** pExpr i
1750: 73 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f  s a comparison o
1760: 70 65 72 61 74 6f 72 2e 20 20 52 65 74 75 72 6e  perator.  Return
1770: 20 74 68 65 20 74 79 70 65 20 61 66 66 69 6e 69   the type affini
1780: 74 79 20 74 68 61 74 20 73 68 6f 75 6c 64 0a 2a  ty that should.*
1790: 2a 20 62 65 20 61 70 70 6c 69 65 64 20 74 6f 20  * be applied to 
17a0: 62 6f 74 68 20 6f 70 65 72 61 6e 64 73 20 70 72  both operands pr
17b0: 69 6f 72 20 74 6f 20 64 6f 69 6e 67 20 74 68 65  ior to doing the
17c0: 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 0a 2a 2f 0a   comparison..*/.
17d0: 73 74 61 74 69 63 20 63 68 61 72 20 63 6f 6d 70  static char comp
17e0: 61 72 69 73 6f 6e 41 66 66 69 6e 69 74 79 28 45  arisonAffinity(E
17f0: 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 63  xpr *pExpr){.  c
1800: 68 61 72 20 61 66 66 3b 0a 20 20 61 73 73 65 72  har aff;.  asser
1810: 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  t( pExpr->op==TK
1820: 5f 45 51 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70  _EQ || pExpr->op
1830: 3d 3d 54 4b 5f 49 4e 20 7c 7c 20 70 45 78 70 72  ==TK_IN || pExpr
1840: 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54 20 7c 7c 0a 20  ->op==TK_LT ||. 
1850: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
1860: 6f 70 3d 3d 54 4b 5f 47 54 20 7c 7c 20 70 45 78  op==TK_GT || pEx
1870: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 47 45 20 7c 7c  pr->op==TK_GE ||
1880: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c   pExpr->op==TK_L
1890: 45 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 70  E ||.          p
18a0: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4e 45 20  Expr->op==TK_NE 
18b0: 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  || pExpr->op==TK
18c0: 5f 49 53 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70  _IS || pExpr->op
18d0: 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20 20  ==TK_ISNOT );.  
18e0: 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70  assert( pExpr->p
18f0: 4c 65 66 74 20 29 3b 0a 20 20 61 66 66 20 3d 20  Left );.  aff = 
1900: 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e  sqlite3ExprAffin
1910: 69 74 79 28 70 45 78 70 72 2d 3e 70 4c 65 66 74  ity(pExpr->pLeft
1920: 29 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  );.  if( pExpr->
1930: 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20 61 66  pRight ){.    af
1940: 66 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70 61  f = sqlite3Compa
1950: 72 65 41 66 66 69 6e 69 74 79 28 70 45 78 70 72  reAffinity(pExpr
1960: 2d 3e 70 52 69 67 68 74 2c 20 61 66 66 29 3b 0a  ->pRight, aff);.
1970: 20 20 7d 65 6c 73 65 20 69 66 28 20 45 78 70 72    }else if( Expr
1980: 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
1990: 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
19a0: 20 29 7b 0a 20 20 20 20 61 66 66 20 3d 20 73 71   ){.    aff = sq
19b0: 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69  lite3CompareAffi
19c0: 6e 69 74 79 28 70 45 78 70 72 2d 3e 78 2e 70 53  nity(pExpr->x.pS
19d0: 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61  elect->pEList->a
19e0: 5b 30 5d 2e 70 45 78 70 72 2c 20 61 66 66 29 3b  [0].pExpr, aff);
19f0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 61 66  .  }else if( !af
1a00: 66 20 29 7b 0a 20 20 20 20 61 66 66 20 3d 20 53  f ){.    aff = S
1a10: 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a  QLITE_AFF_NONE;.
1a20: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 61 66 66    }.  return aff
1a30: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72  ;.}../*.** pExpr
1a40: 20 69 73 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e   is a comparison
1a50: 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 65 67 2e   expression, eg.
1a60: 20 27 3d 27 2c 20 27 3c 27 2c 20 49 4e 28 2e 2e   '=', '<', IN(..
1a70: 2e 29 20 65 74 63 2e 0a 2a 2a 20 69 64 78 5f 61  .) etc..** idx_a
1a80: 66 66 69 6e 69 74 79 20 69 73 20 74 68 65 20 61  ffinity is the a
1a90: 66 66 69 6e 69 74 79 20 6f 66 20 61 6e 20 69 6e  ffinity of an in
1aa0: 64 65 78 65 64 20 63 6f 6c 75 6d 6e 2e 20 52 65  dexed column. Re
1ab0: 74 75 72 6e 20 74 72 75 65 0a 2a 2a 20 69 66 20  turn true.** if 
1ac0: 74 68 65 20 69 6e 64 65 78 20 77 69 74 68 20 61  the index with a
1ad0: 66 66 69 6e 69 74 79 20 69 64 78 5f 61 66 66 69  ffinity idx_affi
1ae0: 6e 69 74 79 20 6d 61 79 20 62 65 20 75 73 65 64  nity may be used
1af0: 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 0a 2a 2a   to implement.**
1b00: 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20   the comparison 
1b10: 69 6e 20 70 45 78 70 72 2e 0a 2a 2f 0a 69 6e 74  in pExpr..*/.int
1b20: 20 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66 66   sqlite3IndexAff
1b30: 69 6e 69 74 79 4f 6b 28 45 78 70 72 20 2a 70 45  inityOk(Expr *pE
1b40: 78 70 72 2c 20 63 68 61 72 20 69 64 78 5f 61 66  xpr, char idx_af
1b50: 66 69 6e 69 74 79 29 7b 0a 20 20 63 68 61 72 20  finity){.  char 
1b60: 61 66 66 20 3d 20 63 6f 6d 70 61 72 69 73 6f 6e  aff = comparison
1b70: 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 29 3b  Affinity(pExpr);
1b80: 0a 20 20 73 77 69 74 63 68 28 20 61 66 66 20 29  .  switch( aff )
1b90: 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  {.    case SQLIT
1ba0: 45 5f 41 46 46 5f 4e 4f 4e 45 3a 0a 20 20 20 20  E_AFF_NONE:.    
1bb0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
1bc0: 63 61 73 65 20 53 51 4c 49 54 45 5f 41 46 46 5f  case SQLITE_AFF_
1bd0: 54 45 58 54 3a 0a 20 20 20 20 20 20 72 65 74 75  TEXT:.      retu
1be0: 72 6e 20 69 64 78 5f 61 66 66 69 6e 69 74 79 3d  rn idx_affinity=
1bf0: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54  =SQLITE_AFF_TEXT
1c00: 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20  ;.    default:. 
1c10: 20 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69       return sqli
1c20: 74 65 33 49 73 4e 75 6d 65 72 69 63 41 66 66 69  te3IsNumericAffi
1c30: 6e 69 74 79 28 69 64 78 5f 61 66 66 69 6e 69 74  nity(idx_affinit
1c40: 79 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  y);.  }.}../*.**
1c50: 20 52 65 74 75 72 6e 20 74 68 65 20 50 35 20 76   Return the P5 v
1c60: 61 6c 75 65 20 74 68 61 74 20 73 68 6f 75 6c 64  alue that should
1c70: 20 62 65 20 75 73 65 64 20 66 6f 72 20 61 20 62   be used for a b
1c80: 69 6e 61 72 79 20 63 6f 6d 70 61 72 69 73 6f 6e  inary comparison
1c90: 0a 2a 2a 20 6f 70 63 6f 64 65 20 28 4f 50 5f 45  .** opcode (OP_E
1ca0: 71 2c 20 4f 50 5f 47 65 20 65 74 63 2e 29 20 75  q, OP_Ge etc.) u
1cb0: 73 65 64 20 74 6f 20 63 6f 6d 70 61 72 65 20 70  sed to compare p
1cc0: 45 78 70 72 31 20 61 6e 64 20 70 45 78 70 72 32  Expr1 and pExpr2
1cd0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 38 20 62  ..*/.static u8 b
1ce0: 69 6e 61 72 79 43 6f 6d 70 61 72 65 50 35 28 45  inaryCompareP5(E
1cf0: 78 70 72 20 2a 70 45 78 70 72 31 2c 20 45 78 70  xpr *pExpr1, Exp
1d00: 72 20 2a 70 45 78 70 72 32 2c 20 69 6e 74 20 6a  r *pExpr2, int j
1d10: 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 75 38  umpIfNull){.  u8
1d20: 20 61 66 66 20 3d 20 28 63 68 61 72 29 73 71 6c   aff = (char)sql
1d30: 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79  ite3ExprAffinity
1d40: 28 70 45 78 70 72 32 29 3b 0a 20 20 61 66 66 20  (pExpr2);.  aff 
1d50: 3d 20 28 75 38 29 73 71 6c 69 74 65 33 43 6f 6d  = (u8)sqlite3Com
1d60: 70 61 72 65 41 66 66 69 6e 69 74 79 28 70 45 78  pareAffinity(pEx
1d70: 70 72 31 2c 20 61 66 66 29 20 7c 20 28 75 38 29  pr1, aff) | (u8)
1d80: 6a 75 6d 70 49 66 4e 75 6c 6c 3b 0a 20 20 72 65  jumpIfNull;.  re
1d90: 74 75 72 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a  turn aff;.}../*.
1da0: 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
1db0: 74 65 72 20 74 6f 20 74 68 65 20 63 6f 6c 6c 61  ter to the colla
1dc0: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 74 68  tion sequence th
1dd0: 61 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65  at should be use
1de0: 64 20 62 79 0a 2a 2a 20 61 20 62 69 6e 61 72 79  d by.** a binary
1df0: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72   comparison oper
1e00: 61 74 6f 72 20 63 6f 6d 70 61 72 69 6e 67 20 70  ator comparing p
1e10: 4c 65 66 74 20 61 6e 64 20 70 52 69 67 68 74 2e  Left and pRight.
1e20: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 65  .**.** If the le
1e30: 66 74 20 68 61 6e 64 20 65 78 70 72 65 73 73 69  ft hand expressi
1e40: 6f 6e 20 68 61 73 20 61 20 63 6f 6c 6c 61 74 69  on has a collati
1e50: 6e 67 20 73 65 71 75 65 6e 63 65 20 74 79 70 65  ng sequence type
1e60: 2c 20 74 68 65 6e 20 69 74 20 69 73 0a 2a 2a 20  , then it is.** 
1e70: 75 73 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20  used. Otherwise 
1e80: 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  the collation se
1e90: 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20 72  quence for the r
1ea0: 69 67 68 74 20 68 61 6e 64 20 65 78 70 72 65 73  ight hand expres
1eb0: 73 69 6f 6e 0a 2a 2a 20 69 73 20 75 73 65 64 2c  sion.** is used,
1ec0: 20 6f 72 20 74 68 65 20 64 65 66 61 75 6c 74 20   or the default 
1ed0: 28 42 49 4e 41 52 59 29 20 69 66 20 6e 65 69 74  (BINARY) if neit
1ee0: 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e 20 68  her expression h
1ef0: 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a  as a collating.*
1f00: 2a 20 74 79 70 65 2e 0a 2a 2a 0a 2a 2a 20 41 72  * type..**.** Ar
1f10: 67 75 6d 65 6e 74 20 70 52 69 67 68 74 20 28 62  gument pRight (b
1f20: 75 74 20 6e 6f 74 20 70 4c 65 66 74 29 20 6d 61  ut not pLeft) ma
1f30: 79 20 62 65 20 61 20 6e 75 6c 6c 20 70 6f 69 6e  y be a null poin
1f40: 74 65 72 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ter. In this cas
1f50: 65 2c 0a 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20  e,.** it is not 
1f60: 63 6f 6e 73 69 64 65 72 65 64 2e 0a 2a 2f 0a 43  considered..*/.C
1f70: 6f 6c 6c 53 65 71 20 2a 73 71 6c 69 74 65 33 42  ollSeq *sqlite3B
1f80: 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c  inaryCompareColl
1f90: 53 65 71 28 0a 20 20 50 61 72 73 65 20 2a 70 50  Seq(.  Parse *pP
1fa0: 61 72 73 65 2c 20 0a 20 20 45 78 70 72 20 2a 70  arse, .  Expr *p
1fb0: 4c 65 66 74 2c 20 0a 20 20 45 78 70 72 20 2a 70  Left, .  Expr *p
1fc0: 52 69 67 68 74 0a 29 7b 0a 20 20 43 6f 6c 6c 53  Right.){.  CollS
1fd0: 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 61 73 73  eq *pColl;.  ass
1fe0: 65 72 74 28 20 70 4c 65 66 74 20 29 3b 0a 20 20  ert( pLeft );.  
1ff0: 69 66 28 20 70 4c 65 66 74 2d 3e 66 6c 61 67 73  if( pLeft->flags
2000: 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 20 29 7b   & EP_Collate ){
2010: 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c  .    pColl = sql
2020: 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
2030: 70 50 61 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a  pParse, pLeft);.
2040: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 52 69 67    }else if( pRig
2050: 68 74 20 26 26 20 28 70 52 69 67 68 74 2d 3e 66  ht && (pRight->f
2060: 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74  lags & EP_Collat
2070: 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 70 43 6f  e)!=0 ){.    pCo
2080: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
2090: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
20a0: 70 52 69 67 68 74 29 3b 0a 20 20 7d 65 6c 73 65  pRight);.  }else
20b0: 7b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71  {.    pColl = sq
20c0: 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
20d0: 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 29 3b  (pParse, pLeft);
20e0: 0a 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20  .    if( !pColl 
20f0: 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d  ){.      pColl =
2100: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
2110: 53 65 71 28 70 50 61 72 73 65 2c 20 70 52 69 67  Seq(pParse, pRig
2120: 68 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ht);.    }.  }. 
2130: 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d   return pColl;.}
2140: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
2150: 20 63 6f 64 65 20 66 6f 72 20 61 20 63 6f 6d 70   code for a comp
2160: 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e  arison operator.
2170: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
2180: 6f 64 65 43 6f 6d 70 61 72 65 28 0a 20 20 50 61  odeCompare(.  Pa
2190: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
21a0: 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 28  /* The parsing (
21b0: 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74  and code generat
21c0: 69 6e 67 29 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  ing) context */.
21d0: 20 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 20    Expr *pLeft,  
21e0: 20 20 20 20 2f 2a 20 54 68 65 20 6c 65 66 74 20      /* The left 
21f0: 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 45 78 70  operand */.  Exp
2200: 72 20 2a 70 52 69 67 68 74 2c 20 20 20 20 20 2f  r *pRight,     /
2210: 2a 20 54 68 65 20 72 69 67 68 74 20 6f 70 65 72  * The right oper
2220: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 63  and */.  int opc
2230: 6f 64 65 2c 20 20 20 20 20 20 20 2f 2a 20 54 68  ode,       /* Th
2240: 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 63  e comparison opc
2250: 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 31  ode */.  int in1
2260: 2c 20 69 6e 74 20 69 6e 32 2c 20 2f 2a 20 52 65  , int in2, /* Re
2270: 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 6f  gister holding o
2280: 70 65 72 61 6e 64 73 20 2a 2f 0a 20 20 69 6e 74  perands */.  int
2290: 20 64 65 73 74 2c 20 20 20 20 20 20 20 20 20 2f   dest,         /
22a0: 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 74  * Jump here if t
22b0: 72 75 65 2e 20 20 2a 2f 0a 20 20 69 6e 74 20 6a  rue.  */.  int j
22c0: 75 6d 70 49 66 4e 75 6c 6c 20 20 20 20 2f 2a 20  umpIfNull    /* 
22d0: 49 66 20 74 72 75 65 2c 20 6a 75 6d 70 20 69 66  If true, jump if
22e0: 20 65 69 74 68 65 72 20 6f 70 65 72 61 6e 64 20   either operand 
22f0: 69 73 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20  is NULL */.){.  
2300: 69 6e 74 20 70 35 3b 0a 20 20 69 6e 74 20 61 64  int p5;.  int ad
2310: 64 72 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70  dr;.  CollSeq *p
2320: 34 3b 0a 0a 20 20 70 34 20 3d 20 73 71 6c 69 74  4;..  p4 = sqlit
2330: 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43  e3BinaryCompareC
2340: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
2350: 4c 65 66 74 2c 20 70 52 69 67 68 74 29 3b 0a 20  Left, pRight);. 
2360: 20 70 35 20 3d 20 62 69 6e 61 72 79 43 6f 6d 70   p5 = binaryComp
2370: 61 72 65 50 35 28 70 4c 65 66 74 2c 20 70 52 69  areP5(pLeft, pRi
2380: 67 68 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  ght, jumpIfNull)
2390: 3b 0a 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74  ;.  addr = sqlit
23a0: 65 33 56 64 62 65 41 64 64 4f 70 34 28 70 50 61  e3VdbeAddOp4(pPa
23b0: 72 73 65 2d 3e 70 56 64 62 65 2c 20 6f 70 63 6f  rse->pVdbe, opco
23c0: 64 65 2c 20 69 6e 32 2c 20 64 65 73 74 2c 20 69  de, in2, dest, i
23d0: 6e 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n1,.            
23e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
23f0: 76 6f 69 64 2a 29 70 34 2c 20 50 34 5f 43 4f 4c  void*)p4, P4_COL
2400: 4c 53 45 51 29 3b 0a 20 20 73 71 6c 69 74 65 33  LSEQ);.  sqlite3
2410: 56 64 62 65 43 68 61 6e 67 65 50 35 28 70 50 61  VdbeChangeP5(pPa
2420: 72 73 65 2d 3e 70 56 64 62 65 2c 20 28 75 38 29  rse->pVdbe, (u8)
2430: 70 35 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 64  p5);.  return ad
2440: 64 72 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54  dr;.}..#if SQLIT
2450: 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48  E_MAX_EXPR_DEPTH
2460: 3e 30 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74  >0./*.** Check t
2470: 68 61 74 20 61 72 67 75 6d 65 6e 74 20 6e 48 65  hat argument nHe
2480: 69 67 68 74 20 69 73 20 6c 65 73 73 20 74 68 61  ight is less tha
2490: 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68  n or equal to th
24a0: 65 20 6d 61 78 69 6d 75 6d 0a 2a 2a 20 65 78 70  e maximum.** exp
24b0: 72 65 73 73 69 6f 6e 20 64 65 70 74 68 20 61 6c  ression depth al
24c0: 6c 6f 77 65 64 2e 20 49 66 20 69 74 20 69 73 20  lowed. If it is 
24d0: 6e 6f 74 2c 20 6c 65 61 76 65 20 61 6e 20 65 72  not, leave an er
24e0: 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 0a 2a  ror message in.*
24f0: 2a 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 69 6e 74  * pParse..*/.int
2500: 20 73 71 6c 69 74 65 33 45 78 70 72 43 68 65 63   sqlite3ExprChec
2510: 6b 48 65 69 67 68 74 28 50 61 72 73 65 20 2a 70  kHeight(Parse *p
2520: 50 61 72 73 65 2c 20 69 6e 74 20 6e 48 65 69 67  Parse, int nHeig
2530: 68 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ht){.  int rc = 
2540: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74  SQLITE_OK;.  int
2550: 20 6d 78 48 65 69 67 68 74 20 3d 20 70 50 61 72   mxHeight = pPar
2560: 73 65 2d 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53  se->db->aLimit[S
2570: 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 45 58 50 52  QLITE_LIMIT_EXPR
2580: 5f 44 45 50 54 48 5d 3b 0a 20 20 69 66 28 20 6e  _DEPTH];.  if( n
2590: 48 65 69 67 68 74 3e 6d 78 48 65 69 67 68 74 20  Height>mxHeight 
25a0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
25b0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a  rorMsg(pParse, .
25c0: 20 20 20 20 20 20 20 22 45 78 70 72 65 73 73 69         "Expressi
25d0: 6f 6e 20 74 72 65 65 20 69 73 20 74 6f 6f 20 6c  on tree is too l
25e0: 61 72 67 65 20 28 6d 61 78 69 6d 75 6d 20 64 65  arge (maximum de
25f0: 70 74 68 20 25 64 29 22 2c 20 6d 78 48 65 69 67  pth %d)", mxHeig
2600: 68 74 0a 20 20 20 20 29 3b 0a 20 20 20 20 72 63  ht.    );.    rc
2610: 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
2620: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
2630: 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 66 6f 6c 6c  ;.}../* The foll
2640: 6f 77 69 6e 67 20 74 68 72 65 65 20 66 75 6e 63  owing three func
2650: 74 69 6f 6e 73 2c 20 68 65 69 67 68 74 4f 66 45  tions, heightOfE
2660: 78 70 72 28 29 2c 20 68 65 69 67 68 74 4f 66 45  xpr(), heightOfE
2670: 78 70 72 4c 69 73 74 28 29 0a 2a 2a 20 61 6e 64  xprList().** and
2680: 20 68 65 69 67 68 74 4f 66 53 65 6c 65 63 74 28   heightOfSelect(
2690: 29 2c 20 61 72 65 20 75 73 65 64 20 74 6f 20 64  ), are used to d
26a0: 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6d 61 78  etermine the max
26b0: 69 6d 75 6d 20 68 65 69 67 68 74 0a 2a 2a 20 6f  imum height.** o
26c0: 66 20 61 6e 79 20 65 78 70 72 65 73 73 69 6f 6e  f any expression
26d0: 20 74 72 65 65 20 72 65 66 65 72 65 6e 63 65 64   tree referenced
26e0: 20 62 79 20 74 68 65 20 73 74 72 75 63 74 75 72   by the structur
26f0: 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65 0a  e passed as the.
2700: 2a 2a 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  ** first argumen
2710: 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73  t..**.** If this
2720: 20 6d 61 78 69 6d 75 6d 20 68 65 69 67 68 74 20   maximum height 
2730: 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
2740: 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75  the current valu
2750: 65 20 70 6f 69 6e 74 65 64 0a 2a 2a 20 74 6f 20  e pointed.** to 
2760: 62 79 20 70 6e 48 65 69 67 68 74 2c 20 74 68 65  by pnHeight, the
2770: 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65   second paramete
2780: 72 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 6e 48  r, then set *pnH
2790: 65 69 67 68 74 20 74 6f 20 74 68 61 74 0a 2a 2a  eight to that.**
27a0: 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69   value..*/.stati
27b0: 63 20 76 6f 69 64 20 68 65 69 67 68 74 4f 66 45  c void heightOfE
27c0: 78 70 72 28 45 78 70 72 20 2a 70 2c 20 69 6e 74  xpr(Expr *p, int
27d0: 20 2a 70 6e 48 65 69 67 68 74 29 7b 0a 20 20 69   *pnHeight){.  i
27e0: 66 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28 20  f( p ){.    if( 
27f0: 70 2d 3e 6e 48 65 69 67 68 74 3e 2a 70 6e 48 65  p->nHeight>*pnHe
2800: 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 2a 70  ight ){.      *p
2810: 6e 48 65 69 67 68 74 20 3d 20 70 2d 3e 6e 48 65  nHeight = p->nHe
2820: 69 67 68 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ight;.    }.  }.
2830: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68 65  }.static void he
2840: 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28 45  ightOfExprList(E
2850: 78 70 72 4c 69 73 74 20 2a 70 2c 20 69 6e 74 20  xprList *p, int 
2860: 2a 70 6e 48 65 69 67 68 74 29 7b 0a 20 20 69 66  *pnHeight){.  if
2870: 28 20 70 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ( p ){.    int i
2880: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
2890: 3c 70 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  <p->nExpr; i++){
28a0: 0a 20 20 20 20 20 20 68 65 69 67 68 74 4f 66 45  .      heightOfE
28b0: 78 70 72 28 70 2d 3e 61 5b 69 5d 2e 70 45 78 70  xpr(p->a[i].pExp
28c0: 72 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20  r, pnHeight);.  
28d0: 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63    }.  }.}.static
28e0: 20 76 6f 69 64 20 68 65 69 67 68 74 4f 66 53 65   void heightOfSe
28f0: 6c 65 63 74 28 53 65 6c 65 63 74 20 2a 70 2c 20  lect(Select *p, 
2900: 69 6e 74 20 2a 70 6e 48 65 69 67 68 74 29 7b 0a  int *pnHeight){.
2910: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 68    if( p ){.    h
2920: 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70  eightOfExpr(p->p
2930: 57 68 65 72 65 2c 20 70 6e 48 65 69 67 68 74 29  Where, pnHeight)
2940: 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78  ;.    heightOfEx
2950: 70 72 28 70 2d 3e 70 48 61 76 69 6e 67 2c 20 70  pr(p->pHaving, p
2960: 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65  nHeight);.    he
2970: 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 4c  ightOfExpr(p->pL
2980: 69 6d 69 74 2c 20 70 6e 48 65 69 67 68 74 29 3b  imit, pnHeight);
2990: 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70  .    heightOfExp
29a0: 72 28 70 2d 3e 70 4f 66 66 73 65 74 2c 20 70 6e  r(p->pOffset, pn
29b0: 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69  Height);.    hei
29c0: 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28 70 2d  ghtOfExprList(p-
29d0: 3e 70 45 4c 69 73 74 2c 20 70 6e 48 65 69 67 68  >pEList, pnHeigh
29e0: 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66  t);.    heightOf
29f0: 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 47 72 6f  ExprList(p->pGro
2a00: 75 70 42 79 2c 20 70 6e 48 65 69 67 68 74 29 3b  upBy, pnHeight);
2a10: 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70  .    heightOfExp
2a20: 72 4c 69 73 74 28 70 2d 3e 70 4f 72 64 65 72 42  rList(p->pOrderB
2a30: 79 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20  y, pnHeight);.  
2a40: 20 20 68 65 69 67 68 74 4f 66 53 65 6c 65 63 74    heightOfSelect
2a50: 28 70 2d 3e 70 50 72 69 6f 72 2c 20 70 6e 48 65  (p->pPrior, pnHe
2a60: 69 67 68 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ight);.  }.}../*
2a70: 0a 2a 2a 20 53 65 74 20 74 68 65 20 45 78 70 72  .** Set the Expr
2a80: 2e 6e 48 65 69 67 68 74 20 76 61 72 69 61 62 6c  .nHeight variabl
2a90: 65 20 69 6e 20 74 68 65 20 73 74 72 75 63 74 75  e in the structu
2aa0: 72 65 20 70 61 73 73 65 64 20 61 73 20 61 6e 20  re passed as an 
2ab0: 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 20 41 6e  .** argument. An
2ac0: 20 65 78 70 72 65 73 73 69 6f 6e 20 77 69 74 68   expression with
2ad0: 20 6e 6f 20 63 68 69 6c 64 72 65 6e 2c 20 45 78   no children, Ex
2ae0: 70 72 2e 70 4c 69 73 74 20 6f 72 20 0a 2a 2a 20  pr.pList or .** 
2af0: 45 78 70 72 2e 70 53 65 6c 65 63 74 20 6d 65 6d  Expr.pSelect mem
2b00: 62 65 72 20 68 61 73 20 61 20 68 65 69 67 68 74  ber has a height
2b10: 20 6f 66 20 31 2e 20 41 6e 79 20 6f 74 68 65 72   of 1. Any other
2b20: 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 68   expression.** h
2b30: 61 73 20 61 20 68 65 69 67 68 74 20 65 71 75 61  as a height equa
2b40: 6c 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d  l to the maximum
2b50: 20 68 65 69 67 68 74 20 6f 66 20 61 6e 79 20 6f   height of any o
2b60: 74 68 65 72 20 0a 2a 2a 20 72 65 66 65 72 65 6e  ther .** referen
2b70: 63 65 64 20 45 78 70 72 20 70 6c 75 73 20 6f 6e  ced Expr plus on
2b80: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
2b90: 64 20 65 78 70 72 53 65 74 48 65 69 67 68 74 28  d exprSetHeight(
2ba0: 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20  Expr *p){.  int 
2bb0: 6e 48 65 69 67 68 74 20 3d 20 30 3b 0a 20 20 68  nHeight = 0;.  h
2bc0: 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70  eightOfExpr(p->p
2bd0: 4c 65 66 74 2c 20 26 6e 48 65 69 67 68 74 29 3b  Left, &nHeight);
2be0: 0a 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 28  .  heightOfExpr(
2bf0: 70 2d 3e 70 52 69 67 68 74 2c 20 26 6e 48 65 69  p->pRight, &nHei
2c00: 67 68 74 29 3b 0a 20 20 69 66 28 20 45 78 70 72  ght);.  if( Expr
2c10: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
2c20: 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a  P_xIsSelect) ){.
2c30: 20 20 20 20 68 65 69 67 68 74 4f 66 53 65 6c 65      heightOfSele
2c40: 63 74 28 70 2d 3e 78 2e 70 53 65 6c 65 63 74 2c  ct(p->x.pSelect,
2c50: 20 26 6e 48 65 69 67 68 74 29 3b 0a 20 20 7d 65   &nHeight);.  }e
2c60: 6c 73 65 7b 0a 20 20 20 20 68 65 69 67 68 74 4f  lse{.    heightO
2c70: 66 45 78 70 72 4c 69 73 74 28 70 2d 3e 78 2e 70  fExprList(p->x.p
2c80: 4c 69 73 74 2c 20 26 6e 48 65 69 67 68 74 29 3b  List, &nHeight);
2c90: 0a 20 20 7d 0a 20 20 70 2d 3e 6e 48 65 69 67 68  .  }.  p->nHeigh
2ca0: 74 20 3d 20 6e 48 65 69 67 68 74 20 2b 20 31 3b  t = nHeight + 1;
2cb0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
2cc0: 65 20 45 78 70 72 2e 6e 48 65 69 67 68 74 20 76  e Expr.nHeight v
2cd0: 61 72 69 61 62 6c 65 20 75 73 69 6e 67 20 74 68  ariable using th
2ce0: 65 20 65 78 70 72 53 65 74 48 65 69 67 68 74 28  e exprSetHeight(
2cf0: 29 20 66 75 6e 63 74 69 6f 6e 2e 20 49 66 0a 2a  ) function. If.*
2d00: 2a 20 74 68 65 20 68 65 69 67 68 74 20 69 73 20  * the height is 
2d10: 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65  greater than the
2d20: 20 6d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64   maximum allowed
2d30: 20 65 78 70 72 65 73 73 69 6f 6e 20 64 65 70 74   expression dept
2d40: 68 2c 0a 2a 2a 20 6c 65 61 76 65 20 61 6e 20 65  h,.** leave an e
2d50: 72 72 6f 72 20 69 6e 20 70 50 61 72 73 65 2e 0a  rror in pParse..
2d60: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
2d70: 78 70 72 53 65 74 48 65 69 67 68 74 28 50 61 72  xprSetHeight(Par
2d80: 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
2d90: 20 2a 70 29 7b 0a 20 20 65 78 70 72 53 65 74 48   *p){.  exprSetH
2da0: 65 69 67 68 74 28 70 29 3b 0a 20 20 73 71 6c 69  eight(p);.  sqli
2db0: 74 65 33 45 78 70 72 43 68 65 63 6b 48 65 69 67  te3ExprCheckHeig
2dc0: 68 74 28 70 50 61 72 73 65 2c 20 70 2d 3e 6e 48  ht(pParse, p->nH
2dd0: 65 69 67 68 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  eight);.}../*.**
2de0: 20 52 65 74 75 72 6e 20 74 68 65 20 6d 61 78 69   Return the maxi
2df0: 6d 75 6d 20 68 65 69 67 68 74 20 6f 66 20 61 6e  mum height of an
2e00: 79 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  y expression tre
2e10: 65 20 72 65 66 65 72 65 6e 63 65 64 0a 2a 2a 20  e referenced.** 
2e20: 62 79 20 74 68 65 20 73 65 6c 65 63 74 20 73 74  by the select st
2e30: 61 74 65 6d 65 6e 74 20 70 61 73 73 65 64 20 61  atement passed a
2e40: 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  s an argument..*
2e50: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 65 6c  /.int sqlite3Sel
2e60: 65 63 74 45 78 70 72 48 65 69 67 68 74 28 53 65  ectExprHeight(Se
2e70: 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69 6e 74 20  lect *p){.  int 
2e80: 6e 48 65 69 67 68 74 20 3d 20 30 3b 0a 20 20 68  nHeight = 0;.  h
2e90: 65 69 67 68 74 4f 66 53 65 6c 65 63 74 28 70 2c  eightOfSelect(p,
2ea0: 20 26 6e 48 65 69 67 68 74 29 3b 0a 20 20 72 65   &nHeight);.  re
2eb0: 74 75 72 6e 20 6e 48 65 69 67 68 74 3b 0a 7d 0a  turn nHeight;.}.
2ec0: 23 65 6c 73 65 0a 20 20 23 64 65 66 69 6e 65 20  #else.  #define 
2ed0: 65 78 70 72 53 65 74 48 65 69 67 68 74 28 79 29  exprSetHeight(y)
2ee0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
2ef0: 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48  E_MAX_EXPR_DEPTH
2f00: 3e 30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  >0 */../*.** Thi
2f10: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65  s routine is the
2f20: 20 63 6f 72 65 20 61 6c 6c 6f 63 61 74 6f 72 20   core allocator 
2f30: 66 6f 72 20 45 78 70 72 20 6e 6f 64 65 73 2e 0a  for Expr nodes..
2f40: 2a 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20  **.** Construct 
2f50: 61 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e  a new expression
2f60: 20 6e 6f 64 65 20 61 6e 64 20 72 65 74 75 72 6e   node and return
2f70: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69 74   a pointer to it
2f80: 2e 20 20 4d 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72  .  Memory.** for
2f90: 20 74 68 69 73 20 6e 6f 64 65 20 61 6e 64 20 66   this node and f
2fa0: 6f 72 20 74 68 65 20 70 54 6f 6b 65 6e 20 61 72  or the pToken ar
2fb0: 67 75 6d 65 6e 74 20 69 73 20 61 20 73 69 6e 67  gument is a sing
2fc0: 6c 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a  le allocation.**
2fd0: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73   obtained from s
2fe0: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 28 29  qlite3DbMalloc()
2ff0: 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66  .  The calling f
3000: 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 72 65  unction.** is re
3010: 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 6d 61  sponsible for ma
3020: 6b 69 6e 67 20 73 75 72 65 20 74 68 65 20 6e 6f  king sure the no
3030: 64 65 20 65 76 65 6e 74 75 61 6c 6c 79 20 67 65  de eventually ge
3040: 74 73 20 66 72 65 65 64 2e 0a 2a 2a 0a 2a 2a 20  ts freed..**.** 
3050: 49 66 20 64 65 71 75 6f 74 65 20 69 73 20 74 72  If dequote is tr
3060: 75 65 2c 20 74 68 65 6e 20 74 68 65 20 74 6f 6b  ue, then the tok
3070: 65 6e 20 28 69 66 20 69 74 20 65 78 69 73 74 73  en (if it exists
3080: 29 20 69 73 20 64 65 71 75 6f 74 65 64 2e 0a 2a  ) is dequoted..*
3090: 2a 20 49 66 20 64 65 71 75 6f 74 65 20 69 73 20  * If dequote is 
30a0: 66 61 6c 73 65 2c 20 6e 6f 20 64 65 71 75 6f 74  false, no dequot
30b0: 69 6e 67 20 69 73 20 70 65 72 66 6f 72 6d 61 6e  ing is performan
30c0: 63 65 2e 20 20 54 68 65 20 64 65 51 75 6f 74 65  ce.  The deQuote
30d0: 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73  .** parameter is
30e0: 20 69 67 6e 6f 72 65 64 20 69 66 20 70 54 6f 6b   ignored if pTok
30f0: 65 6e 20 69 73 20 4e 55 4c 4c 20 6f 72 20 69 66  en is NULL or if
3100: 20 74 68 65 20 74 6f 6b 65 6e 20 64 6f 65 73 20   the token does 
3110: 6e 6f 74 0a 2a 2a 20 61 70 70 65 61 72 20 74 6f  not.** appear to
3120: 20 62 65 20 71 75 6f 74 65 64 2e 20 20 49 66 20   be quoted.  If 
3130: 74 68 65 20 71 75 6f 74 65 73 20 77 65 72 65 20  the quotes were 
3140: 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 2e 2e 2e  of the form "...
3150: 22 20 28 64 6f 75 62 6c 65 2d 71 75 6f 74 65 73  " (double-quotes
3160: 29 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 45 50  ).** then the EP
3170: 5f 44 62 6c 51 75 6f 74 65 64 20 66 6c 61 67 20  _DblQuoted flag 
3180: 69 73 20 73 65 74 20 6f 6e 20 74 68 65 20 65 78  is set on the ex
3190: 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 2e 0a 2a  pression node..*
31a0: 2a 0a 2a 2a 20 53 70 65 63 69 61 6c 20 63 61 73  *.** Special cas
31b0: 65 3a 20 20 49 66 20 6f 70 3d 3d 54 4b 5f 49 4e  e:  If op==TK_IN
31c0: 54 45 47 45 52 20 61 6e 64 20 70 54 6f 6b 65 6e  TEGER and pToken
31d0: 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 73 74 72   points to a str
31e0: 69 6e 67 20 74 68 61 74 0a 2a 2a 20 63 61 6e 20  ing that.** can 
31f0: 62 65 20 74 72 61 6e 73 6c 61 74 65 64 20 69 6e  be translated in
3200: 74 6f 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65  to a 32-bit inte
3210: 67 65 72 2c 20 74 68 65 6e 20 74 68 65 20 74 6f  ger, then the to
3220: 6b 65 6e 20 69 73 20 6e 6f 74 0a 2a 2a 20 73 74  ken is not.** st
3230: 6f 72 65 64 20 69 6e 20 75 2e 7a 54 6f 6b 65 6e  ored in u.zToken
3240: 2e 20 20 49 6e 73 74 65 61 64 2c 20 74 68 65 20  .  Instead, the 
3250: 69 6e 74 65 67 65 72 20 76 61 6c 75 65 73 20 69  integer values i
3260: 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74  s written.** int
3270: 6f 20 75 2e 69 56 61 6c 75 65 20 61 6e 64 20 74  o u.iValue and t
3280: 68 65 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 66  he EP_IntValue f
3290: 6c 61 67 20 69 73 20 73 65 74 2e 20 20 4e 6f 20  lag is set.  No 
32a0: 65 78 74 72 61 20 73 74 6f 72 61 67 65 0a 2a 2a  extra storage.**
32b0: 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 74 6f   is allocated to
32c0: 20 68 6f 6c 64 20 74 68 65 20 69 6e 74 65 67 65   hold the intege
32d0: 72 20 74 65 78 74 20 61 6e 64 20 74 68 65 20 64  r text and the d
32e0: 65 71 75 6f 74 65 20 66 6c 61 67 20 69 73 20 69  equote flag is i
32f0: 67 6e 6f 72 65 64 2e 0a 2a 2f 0a 45 78 70 72 20  gnored..*/.Expr 
3300: 2a 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f  *sqlite3ExprAllo
3310: 63 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  c(.  sqlite3 *db
3320: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
3330: 48 61 6e 64 6c 65 20 66 6f 72 20 73 71 6c 69 74  Handle for sqlit
3340: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 29  e3DbMallocZero()
3350: 20 28 6d 61 79 20 62 65 20 6e 75 6c 6c 29 20 2a   (may be null) *
3360: 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20  /.  int op,     
3370: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
3380: 78 70 72 65 73 73 69 6f 6e 20 6f 70 63 6f 64 65  xpression opcode
3390: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 54 6f 6b 65   */.  const Toke
33a0: 6e 20 2a 70 54 6f 6b 65 6e 2c 20 20 20 20 2f 2a  n *pToken,    /*
33b0: 20 54 6f 6b 65 6e 20 61 72 67 75 6d 65 6e 74 2e   Token argument.
33c0: 20 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20    Might be NULL 
33d0: 2a 2f 0a 20 20 69 6e 74 20 64 65 71 75 6f 74 65  */.  int dequote
33e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
33f0: 54 72 75 65 20 74 6f 20 64 65 71 75 6f 74 65 20  True to dequote 
3400: 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e  */.){.  Expr *pN
3410: 65 77 3b 0a 20 20 69 6e 74 20 6e 45 78 74 72 61  ew;.  int nExtra
3420: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 56 61 6c   = 0;.  int iVal
3430: 75 65 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70  ue = 0;..  if( p
3440: 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 69 66 28  Token ){.    if(
3450: 20 6f 70 21 3d 54 4b 5f 49 4e 54 45 47 45 52 20   op!=TK_INTEGER 
3460: 7c 7c 20 70 54 6f 6b 65 6e 2d 3e 7a 3d 3d 30 0a  || pToken->z==0.
3470: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c            || sql
3480: 69 74 65 33 47 65 74 49 6e 74 33 32 28 70 54 6f  ite3GetInt32(pTo
3490: 6b 65 6e 2d 3e 7a 2c 20 26 69 56 61 6c 75 65 29  ken->z, &iValue)
34a0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 45 78  ==0 ){.      nEx
34b0: 74 72 61 20 3d 20 70 54 6f 6b 65 6e 2d 3e 6e 2b  tra = pToken->n+
34c0: 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  1;.      assert(
34d0: 20 69 56 61 6c 75 65 3e 3d 30 20 29 3b 0a 20 20   iValue>=0 );.  
34e0: 20 20 7d 0a 20 20 7d 0a 20 20 70 4e 65 77 20 3d    }.  }.  pNew =
34f0: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
3500: 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28  Zero(db, sizeof(
3510: 45 78 70 72 29 2b 6e 45 78 74 72 61 29 3b 0a 20  Expr)+nExtra);. 
3520: 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20   if( pNew ){.   
3530: 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 28 75 38 29   pNew->op = (u8)
3540: 6f 70 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69 41  op;.    pNew->iA
3550: 67 67 20 3d 20 2d 31 3b 0a 20 20 20 20 69 66 28  gg = -1;.    if(
3560: 20 70 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 20   pToken ){.     
3570: 20 69 66 28 20 6e 45 78 74 72 61 3d 3d 30 20 29   if( nExtra==0 )
3580: 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  {.        pNew->
3590: 66 6c 61 67 73 20 7c 3d 20 45 50 5f 49 6e 74 56  flags |= EP_IntV
35a0: 61 6c 75 65 3b 0a 20 20 20 20 20 20 20 20 70 4e  alue;.        pN
35b0: 65 77 2d 3e 75 2e 69 56 61 6c 75 65 20 3d 20 69  ew->u.iValue = i
35c0: 56 61 6c 75 65 3b 0a 20 20 20 20 20 20 7d 65 6c  Value;.      }el
35d0: 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  se{.        int 
35e0: 63 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  c;.        pNew-
35f0: 3e 75 2e 7a 54 6f 6b 65 6e 20 3d 20 28 63 68 61  >u.zToken = (cha
3600: 72 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a 20 20 20  r*)&pNew[1];.   
3610: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 6f       assert( pTo
3620: 6b 65 6e 2d 3e 7a 21 3d 30 20 7c 7c 20 70 54 6f  ken->z!=0 || pTo
3630: 6b 65 6e 2d 3e 6e 3d 3d 30 20 29 3b 0a 20 20 20  ken->n==0 );.   
3640: 20 20 20 20 20 69 66 28 20 70 54 6f 6b 65 6e 2d       if( pToken-
3650: 3e 6e 20 29 20 6d 65 6d 63 70 79 28 70 4e 65 77  >n ) memcpy(pNew
3660: 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 70 54 6f 6b  ->u.zToken, pTok
3670: 65 6e 2d 3e 7a 2c 20 70 54 6f 6b 65 6e 2d 3e 6e  en->z, pToken->n
3680: 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  );.        pNew-
3690: 3e 75 2e 7a 54 6f 6b 65 6e 5b 70 54 6f 6b 65 6e  >u.zToken[pToken
36a0: 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  ->n] = 0;.      
36b0: 20 20 69 66 28 20 64 65 71 75 6f 74 65 20 26 26    if( dequote &&
36c0: 20 6e 45 78 74 72 61 3e 3d 33 20 0a 20 20 20 20   nExtra>=3 .    
36d0: 20 20 20 20 20 20 20 20 20 26 26 20 28 28 63 20           && ((c 
36e0: 3d 20 70 54 6f 6b 65 6e 2d 3e 7a 5b 30 5d 29 3d  = pToken->z[0])=
36f0: 3d 27 5c 27 27 20 7c 7c 20 63 3d 3d 27 22 27 20  ='\'' || c=='"' 
3700: 7c 7c 20 63 3d 3d 27 5b 27 20 7c 7c 20 63 3d 3d  || c=='[' || c==
3710: 27 60 27 29 20 29 7b 0a 20 20 20 20 20 20 20 20  '`') ){.        
3720: 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65    sqlite3Dequote
3730: 28 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 29  (pNew->u.zToken)
3740: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
3750: 63 3d 3d 27 22 27 20 29 20 70 4e 65 77 2d 3e 66  c=='"' ) pNew->f
3760: 6c 61 67 73 20 7c 3d 20 45 50 5f 44 62 6c 51 75  lags |= EP_DblQu
3770: 6f 74 65 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a  oted;.        }.
3780: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69        }.    }.#i
3790: 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50  f SQLITE_MAX_EXP
37a0: 52 5f 44 45 50 54 48 3e 30 0a 20 20 20 20 70 4e  R_DEPTH>0.    pN
37b0: 65 77 2d 3e 6e 48 65 69 67 68 74 20 3d 20 31 3b  ew->nHeight = 1;
37c0: 0a 23 65 6e 64 69 66 20 20 0a 20 20 7d 0a 20 20  .#endif  .  }.  
37d0: 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a  return pNew;.}..
37e0: 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61  /*.** Allocate a
37f0: 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20   new expression 
3800: 6e 6f 64 65 20 66 72 6f 6d 20 61 20 7a 65 72 6f  node from a zero
3810: 2d 74 65 72 6d 69 6e 61 74 65 64 20 74 6f 6b 65  -terminated toke
3820: 6e 20 74 68 61 74 20 68 61 73 0a 2a 2a 20 61 6c  n that has.** al
3830: 72 65 61 64 79 20 62 65 65 6e 20 64 65 71 75 6f  ready been dequo
3840: 74 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71  ted..*/.Expr *sq
3850: 6c 69 74 65 33 45 78 70 72 28 0a 20 20 73 71 6c  lite3Expr(.  sql
3860: 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
3870: 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 66       /* Handle f
3880: 6f 72 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c  or sqlite3DbMall
3890: 6f 63 5a 65 72 6f 28 29 20 28 6d 61 79 20 62 65  ocZero() (may be
38a0: 20 6e 75 6c 6c 29 20 2a 2f 0a 20 20 69 6e 74 20   null) */.  int 
38b0: 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  op,             
38c0: 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
38d0: 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 63 6f  n opcode */.  co
38e0: 6e 73 74 20 63 68 61 72 20 2a 7a 54 6f 6b 65 6e  nst char *zToken
38f0: 20 20 20 20 20 20 2f 2a 20 54 6f 6b 65 6e 20 61        /* Token a
3900: 72 67 75 6d 65 6e 74 2e 20 20 4d 69 67 68 74 20  rgument.  Might 
3910: 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20  be NULL */.){.  
3920: 54 6f 6b 65 6e 20 78 3b 0a 20 20 78 2e 7a 20 3d  Token x;.  x.z =
3930: 20 7a 54 6f 6b 65 6e 3b 0a 20 20 78 2e 6e 20 3d   zToken;.  x.n =
3940: 20 7a 54 6f 6b 65 6e 20 3f 20 73 71 6c 69 74 65   zToken ? sqlite
3950: 33 53 74 72 6c 65 6e 33 30 28 7a 54 6f 6b 65 6e  3Strlen30(zToken
3960: 29 20 3a 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  ) : 0;.  return 
3970: 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63  sqlite3ExprAlloc
3980: 28 64 62 2c 20 6f 70 2c 20 26 78 2c 20 30 29 3b  (db, op, &x, 0);
3990: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 61 63 68  .}../*.** Attach
39a0: 20 73 75 62 74 72 65 65 73 20 70 4c 65 66 74 20   subtrees pLeft 
39b0: 61 6e 64 20 70 52 69 67 68 74 20 74 6f 20 74 68  and pRight to th
39c0: 65 20 45 78 70 72 20 6e 6f 64 65 20 70 52 6f 6f  e Expr node pRoo
39d0: 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 52 6f 6f  t..**.** If pRoo
39e0: 74 3d 3d 4e 55 4c 4c 20 74 68 61 74 20 6d 65 61  t==NULL that mea
39f0: 6e 73 20 74 68 61 74 20 61 20 6d 65 6d 6f 72 79  ns that a memory
3a00: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f   allocation erro
3a10: 72 20 68 61 73 20 6f 63 63 75 72 72 65 64 2e 0a  r has occurred..
3a20: 2a 2a 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c  ** In that case,
3a30: 20 64 65 6c 65 74 65 20 74 68 65 20 73 75 62 74   delete the subt
3a40: 72 65 65 73 20 70 4c 65 66 74 20 61 6e 64 20 70  rees pLeft and p
3a50: 52 69 67 68 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  Right..*/.void s
3a60: 71 6c 69 74 65 33 45 78 70 72 41 74 74 61 63 68  qlite3ExprAttach
3a70: 53 75 62 74 72 65 65 73 28 0a 20 20 73 71 6c 69  Subtrees(.  sqli
3a80: 74 65 33 20 2a 64 62 2c 0a 20 20 45 78 70 72 20  te3 *db,.  Expr 
3a90: 2a 70 52 6f 6f 74 2c 0a 20 20 45 78 70 72 20 2a  *pRoot,.  Expr *
3aa0: 70 4c 65 66 74 2c 0a 20 20 45 78 70 72 20 2a 70  pLeft,.  Expr *p
3ab0: 52 69 67 68 74 0a 29 7b 0a 20 20 69 66 28 20 70  Right.){.  if( p
3ac0: 52 6f 6f 74 3d 3d 30 20 29 7b 0a 20 20 20 20 61  Root==0 ){.    a
3ad0: 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f  ssert( db->mallo
3ae0: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 73  cFailed );.    s
3af0: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
3b00: 28 64 62 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20  (db, pLeft);.   
3b10: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
3b20: 74 65 28 64 62 2c 20 70 52 69 67 68 74 29 3b 0a  te(db, pRight);.
3b30: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28    }else{.    if(
3b40: 20 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20   pRight ){.     
3b50: 20 70 52 6f 6f 74 2d 3e 70 52 69 67 68 74 20 3d   pRoot->pRight =
3b60: 20 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 70   pRight;.      p
3b70: 52 6f 6f 74 2d 3e 66 6c 61 67 73 20 7c 3d 20 45  Root->flags |= E
3b80: 50 5f 43 6f 6c 6c 61 74 65 20 26 20 70 52 69 67  P_Collate & pRig
3b90: 68 74 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 7d  ht->flags;.    }
3ba0: 0a 20 20 20 20 69 66 28 20 70 4c 65 66 74 20 29  .    if( pLeft )
3bb0: 7b 0a 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e 70  {.      pRoot->p
3bc0: 4c 65 66 74 20 3d 20 70 4c 65 66 74 3b 0a 20 20  Left = pLeft;.  
3bd0: 20 20 20 20 70 52 6f 6f 74 2d 3e 66 6c 61 67 73      pRoot->flags
3be0: 20 7c 3d 20 45 50 5f 43 6f 6c 6c 61 74 65 20 26   |= EP_Collate &
3bf0: 20 70 4c 65 66 74 2d 3e 66 6c 61 67 73 3b 0a 20   pLeft->flags;. 
3c00: 20 20 20 7d 0a 20 20 20 20 65 78 70 72 53 65 74     }.    exprSet
3c10: 48 65 69 67 68 74 28 70 52 6f 6f 74 29 3b 0a 20  Height(pRoot);. 
3c20: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f   }.}../*.** Allo
3c30: 63 61 74 65 20 61 6e 20 45 78 70 72 20 6e 6f 64  cate an Expr nod
3c40: 65 20 77 68 69 63 68 20 6a 6f 69 6e 73 20 61 73  e which joins as
3c50: 20 6d 61 6e 79 20 61 73 20 74 77 6f 20 73 75 62   many as two sub
3c60: 74 72 65 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 65  trees..**.** One
3c70: 20 6f 72 20 62 6f 74 68 20 6f 66 20 74 68 65 20   or both of the 
3c80: 73 75 62 74 72 65 65 73 20 63 61 6e 20 62 65 20  subtrees can be 
3c90: 4e 55 4c 4c 2e 20 20 52 65 74 75 72 6e 20 61 20  NULL.  Return a 
3ca0: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6e  pointer to the n
3cb0: 65 77 0a 2a 2a 20 45 78 70 72 20 6e 6f 64 65 2e  ew.** Expr node.
3cc0: 20 20 4f 72 2c 20 69 66 20 61 6e 20 4f 4f 4d 20    Or, if an OOM 
3cd0: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 65  error occurs, se
3ce0: 74 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  t pParse->db->ma
3cf0: 6c 6c 6f 63 46 61 69 6c 65 64 2c 0a 2a 2a 20 66  llocFailed,.** f
3d00: 72 65 65 20 74 68 65 20 73 75 62 74 72 65 65 73  ree the subtrees
3d10: 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c   and return NULL
3d20: 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74  ..*/.Expr *sqlit
3d30: 65 33 50 45 78 70 72 28 0a 20 20 50 61 72 73 65  e3PExpr(.  Parse
3d40: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
3d50: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
3d60: 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6f  ntext */.  int o
3d70: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
3d80: 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e     /* Expression
3d90: 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 45 78 70   opcode */.  Exp
3da0: 72 20 2a 70 4c 65 66 74 2c 20 20 20 20 20 20 20  r *pLeft,       
3db0: 20 20 20 20 20 2f 2a 20 4c 65 66 74 20 6f 70 65       /* Left ope
3dc0: 72 61 6e 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a  rand */.  Expr *
3dd0: 70 52 69 67 68 74 2c 20 20 20 20 20 20 20 20 20  pRight,         
3de0: 20 20 2f 2a 20 52 69 67 68 74 20 6f 70 65 72 61    /* Right opera
3df0: 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 54 6f  nd */.  const To
3e00: 6b 65 6e 20 2a 70 54 6f 6b 65 6e 20 20 20 20 20  ken *pToken     
3e10: 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f 6b 65  /* Argument toke
3e20: 6e 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a  n */.){.  Expr *
3e30: 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  p;.  if( op==TK_
3e40: 41 4e 44 20 26 26 20 70 4c 65 66 74 20 26 26 20  AND && pLeft && 
3e50: 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20 2f 2a  pRight ){.    /*
3e60: 20 54 61 6b 65 20 61 64 76 61 6e 74 61 67 65 20   Take advantage 
3e70: 6f 66 20 73 68 6f 72 74 2d 63 69 72 63 75 69 74  of short-circuit
3e80: 20 66 61 6c 73 65 20 6f 70 74 69 6d 69 7a 61 74   false optimizat
3e90: 69 6f 6e 20 66 6f 72 20 41 4e 44 20 2a 2f 0a 20  ion for AND */. 
3ea0: 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 45 78     p = sqlite3Ex
3eb0: 70 72 41 6e 64 28 70 50 61 72 73 65 2d 3e 64 62  prAnd(pParse->db
3ec0: 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 29  , pLeft, pRight)
3ed0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
3ee0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c   = sqlite3ExprAl
3ef0: 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  loc(pParse->db, 
3f00: 6f 70 2c 20 70 54 6f 6b 65 6e 2c 20 31 29 3b 0a  op, pToken, 1);.
3f10: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41      sqlite3ExprA
3f20: 74 74 61 63 68 53 75 62 74 72 65 65 73 28 70 50  ttachSubtrees(pP
3f30: 61 72 73 65 2d 3e 64 62 2c 20 70 2c 20 70 4c 65  arse->db, p, pLe
3f40: 66 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 7d  ft, pRight);.  }
3f50: 0a 20 20 69 66 28 20 70 20 29 20 7b 0a 20 20 20  .  if( p ) {.   
3f60: 20 73 71 6c 69 74 65 33 45 78 70 72 43 68 65 63   sqlite3ExprChec
3f70: 6b 48 65 69 67 68 74 28 70 50 61 72 73 65 2c 20  kHeight(pParse, 
3f80: 70 2d 3e 6e 48 65 69 67 68 74 29 3b 0a 20 20 7d  p->nHeight);.  }
3f90: 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a  .  return p;.}..
3fa0: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70  /*.** If the exp
3fb0: 72 65 73 73 69 6f 6e 20 69 73 20 61 6c 77 61 79  ression is alway
3fc0: 73 20 65 69 74 68 65 72 20 54 52 55 45 20 6f 72  s either TRUE or
3fd0: 20 46 41 4c 53 45 20 28 72 65 73 70 65 63 74 69   FALSE (respecti
3fe0: 76 65 6c 79 29 2c 0a 2a 2a 20 74 68 65 6e 20 72  vely),.** then r
3ff0: 65 74 75 72 6e 20 31 2e 20 20 49 66 20 6f 6e 65  eturn 1.  If one
4000: 20 63 61 6e 6e 6f 74 20 64 65 74 65 72 6d 69 6e   cannot determin
4010: 65 20 74 68 65 20 74 72 75 74 68 20 76 61 6c 75  e the truth valu
4020: 65 20 6f 66 20 74 68 65 0a 2a 2a 20 65 78 70 72  e of the.** expr
4030: 65 73 73 69 6f 6e 20 61 74 20 63 6f 6d 70 69 6c  ession at compil
4040: 65 2d 74 69 6d 65 20 72 65 74 75 72 6e 20 30 2e  e-time return 0.
4050: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61  .**.** This is a
4060: 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20  n optimization. 
4070: 20 49 66 20 69 73 20 4f 4b 20 74 6f 20 72 65 74   If is OK to ret
4080: 75 72 6e 20 30 20 68 65 72 65 20 65 76 65 6e 20  urn 0 here even 
4090: 69 66 0a 2a 2a 20 74 68 65 20 65 78 70 72 65 73  if.** the expres
40a0: 73 69 6f 6e 20 72 65 61 6c 6c 79 20 69 73 20 61  sion really is a
40b0: 6c 77 61 79 73 20 66 61 6c 73 65 20 6f 72 20 66  lways false or f
40c0: 61 6c 73 65 20 28 61 20 66 61 6c 73 65 20 6e 65  alse (a false ne
40d0: 67 61 74 69 76 65 29 2e 0a 2a 2a 20 42 75 74 20  gative)..** But 
40e0: 69 74 20 69 73 20 61 20 62 75 67 20 74 6f 20 72  it is a bug to r
40f0: 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 65  eturn 1 if the e
4100: 78 70 72 65 73 73 69 6f 6e 20 6d 69 67 68 74 20  xpression might 
4110: 68 61 76 65 20 64 69 66 66 65 72 65 6e 74 0a 2a  have different.*
4120: 2a 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 73  * boolean values
4130: 20 69 6e 20 64 69 66 66 65 72 65 6e 74 20 63 69   in different ci
4140: 72 63 75 6d 73 74 61 6e 63 65 73 20 28 61 20 66  rcumstances (a f
4150: 61 6c 73 65 20 70 6f 73 69 74 69 76 65 2e 29 0a  alse positive.).
4160: 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
4170: 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
4180: 6e 20 69 73 20 70 61 72 74 20 6f 66 20 63 6f 6e  n is part of con
4190: 64 69 74 69 6f 6e 61 6c 20 66 6f 72 20 61 0a 2a  ditional for a.*
41a0: 2a 20 4c 45 46 54 20 4a 4f 49 4e 2c 20 74 68 65  * LEFT JOIN, the
41b0: 6e 20 77 65 20 63 61 6e 6e 6f 74 20 64 65 74 65  n we cannot dete
41c0: 72 6d 69 6e 65 20 61 74 20 63 6f 6d 70 69 6c 65  rmine at compile
41d0: 2d 74 69 6d 65 20 77 68 65 74 68 65 72 20 6f 72  -time whether or
41e0: 20 6e 6f 74 0a 2a 2a 20 69 73 20 69 74 20 74 72   not.** is it tr
41f0: 75 65 20 6f 72 20 66 61 6c 73 65 2c 20 73 6f 20  ue or false, so 
4200: 61 6c 77 61 79 73 20 72 65 74 75 72 6e 20 30 2e  always return 0.
4210: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65  .*/.static int e
4220: 78 70 72 41 6c 77 61 79 73 54 72 75 65 28 45 78  xprAlwaysTrue(Ex
4230: 70 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20 76 20  pr *p){.  int v 
4240: 3d 20 30 3b 0a 20 20 69 66 28 20 45 78 70 72 48  = 0;.  if( ExprH
4250: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
4260: 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 20 72 65 74  _FromJoin) ) ret
4270: 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 21 73 71  urn 0;.  if( !sq
4280: 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67  lite3ExprIsInteg
4290: 65 72 28 70 2c 20 26 76 29 20 29 20 72 65 74 75  er(p, &v) ) retu
42a0: 72 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 76  rn 0;.  return v
42b0: 21 3d 30 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e  !=0;.}.static in
42c0: 74 20 65 78 70 72 41 6c 77 61 79 73 46 61 6c 73  t exprAlwaysFals
42d0: 65 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 6e  e(Expr *p){.  in
42e0: 74 20 76 20 3d 20 30 3b 0a 20 20 69 66 28 20 45  t v = 0;.  if( E
42f0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
4300: 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29  , EP_FromJoin) )
4310: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
4320: 20 21 73 71 6c 69 74 65 33 45 78 70 72 49 73 49   !sqlite3ExprIsI
4330: 6e 74 65 67 65 72 28 70 2c 20 26 76 29 20 29 20  nteger(p, &v) ) 
4340: 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75  return 0;.  retu
4350: 72 6e 20 76 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn v==0;.}../*.*
4360: 2a 20 4a 6f 69 6e 20 74 77 6f 20 65 78 70 72 65  * Join two expre
4370: 73 73 69 6f 6e 73 20 75 73 69 6e 67 20 61 6e 20  ssions using an 
4380: 41 4e 44 20 6f 70 65 72 61 74 6f 72 2e 20 20 49  AND operator.  I
4390: 66 20 65 69 74 68 65 72 20 65 78 70 72 65 73 73  f either express
43a0: 69 6f 6e 20 69 73 0a 2a 2a 20 4e 55 4c 4c 2c 20  ion is.** NULL, 
43b0: 74 68 65 6e 20 6a 75 73 74 20 72 65 74 75 72 6e  then just return
43c0: 20 74 68 65 20 6f 74 68 65 72 20 65 78 70 72 65   the other expre
43d0: 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ssion..**.** If 
43e0: 6f 6e 65 20 73 69 64 65 20 6f 72 20 74 68 65 20  one side or the 
43f0: 6f 74 68 65 72 20 6f 66 20 74 68 65 20 41 4e 44  other of the AND
4400: 20 69 73 20 6b 6e 6f 77 6e 20 74 6f 20 62 65 20   is known to be 
4410: 66 61 6c 73 65 2c 20 74 68 65 6e 20 69 6e 73 74  false, then inst
4420: 65 61 64 0a 2a 2a 20 6f 66 20 72 65 74 75 72 6e  ead.** of return
4430: 69 6e 67 20 61 6e 20 41 4e 44 20 65 78 70 72 65  ing an AND expre
4440: 73 73 69 6f 6e 2c 20 6a 75 73 74 20 72 65 74 75  ssion, just retu
4450: 72 6e 20 61 20 63 6f 6e 73 74 61 6e 74 20 65 78  rn a constant ex
4460: 70 72 65 73 73 69 6f 6e 20 77 69 74 68 0a 2a 2a  pression with.**
4470: 20 61 20 76 61 6c 75 65 20 6f 66 20 66 61 6c 73   a value of fals
4480: 65 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69  e..*/.Expr *sqli
4490: 74 65 33 45 78 70 72 41 6e 64 28 73 71 6c 69 74  te3ExprAnd(sqlit
44a0: 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 4c  e3 *db, Expr *pL
44b0: 65 66 74 2c 20 45 78 70 72 20 2a 70 52 69 67 68  eft, Expr *pRigh
44c0: 74 29 7b 0a 20 20 69 66 28 20 70 4c 65 66 74 3d  t){.  if( pLeft=
44d0: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
44e0: 20 70 52 69 67 68 74 3b 0a 20 20 7d 65 6c 73 65   pRight;.  }else
44f0: 20 69 66 28 20 70 52 69 67 68 74 3d 3d 30 20 29   if( pRight==0 )
4500: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 4c 65  {.    return pLe
4510: 66 74 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ft;.  }else if( 
4520: 65 78 70 72 41 6c 77 61 79 73 46 61 6c 73 65 28  exprAlwaysFalse(
4530: 70 4c 65 66 74 29 20 7c 7c 20 65 78 70 72 41 6c  pLeft) || exprAl
4540: 77 61 79 73 46 61 6c 73 65 28 70 52 69 67 68 74  waysFalse(pRight
4550: 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
4560: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
4570: 4c 65 66 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  Left);.    sqlit
4580: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
4590: 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20 72 65   pRight);.    re
45a0: 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72  turn sqlite3Expr
45b0: 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f 49 4e 54  Alloc(db, TK_INT
45c0: 45 47 45 52 2c 20 26 73 71 6c 69 74 65 33 49 6e  EGER, &sqlite3In
45d0: 74 54 6f 6b 65 6e 73 5b 30 5d 2c 20 30 29 3b 0a  tTokens[0], 0);.
45e0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 45 78 70    }else{.    Exp
45f0: 72 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  r *pNew = sqlite
4600: 33 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54  3ExprAlloc(db, T
4610: 4b 5f 41 4e 44 2c 20 30 2c 20 30 29 3b 0a 20 20  K_AND, 0, 0);.  
4620: 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 74 74    sqlite3ExprAtt
4630: 61 63 68 53 75 62 74 72 65 65 73 28 64 62 2c 20  achSubtrees(db, 
4640: 70 4e 65 77 2c 20 70 4c 65 66 74 2c 20 70 52 69  pNew, pLeft, pRi
4650: 67 68 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ght);.    return
4660: 20 70 4e 65 77 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a   pNew;.  }.}../*
4670: 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20  .** Construct a 
4680: 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6e  new expression n
4690: 6f 64 65 20 66 6f 72 20 61 20 66 75 6e 63 74 69  ode for a functi
46a0: 6f 6e 20 77 69 74 68 20 6d 75 6c 74 69 70 6c 65  on with multiple
46b0: 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 73 2e 0a 2a  .** arguments..*
46c0: 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45  /.Expr *sqlite3E
46d0: 78 70 72 46 75 6e 63 74 69 6f 6e 28 50 61 72 73  xprFunction(Pars
46e0: 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 4c  e *pParse, ExprL
46f0: 69 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65  ist *pList, Toke
4700: 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 45 78  n *pToken){.  Ex
4710: 70 72 20 2a 70 4e 65 77 3b 0a 20 20 73 71 6c 69  pr *pNew;.  sqli
4720: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
4730: 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20  ->db;.  assert( 
4740: 70 54 6f 6b 65 6e 20 29 3b 0a 20 20 70 4e 65 77  pToken );.  pNew
4750: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c   = sqlite3ExprAl
4760: 6c 6f 63 28 64 62 2c 20 54 4b 5f 46 55 4e 43 54  loc(db, TK_FUNCT
4770: 49 4f 4e 2c 20 70 54 6f 6b 65 6e 2c 20 31 29 3b  ION, pToken, 1);
4780: 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29  .  if( pNew==0 )
4790: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
47a0: 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
47b0: 70 4c 69 73 74 29 3b 20 2f 2a 20 41 76 6f 69 64  pList); /* Avoid
47c0: 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 20 77 68 65   memory leak whe
47d0: 6e 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20 2a  n malloc fails *
47e0: 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  /.    return 0;.
47f0: 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 78 2e 70 4c    }.  pNew->x.pL
4800: 69 73 74 20 3d 20 70 4c 69 73 74 3b 0a 20 20 61  ist = pList;.  a
4810: 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
4820: 72 6f 70 65 72 74 79 28 70 4e 65 77 2c 20 45 50  roperty(pNew, EP
4830: 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20  _xIsSelect) );. 
4840: 20 73 71 6c 69 74 65 33 45 78 70 72 53 65 74 48   sqlite3ExprSetH
4850: 65 69 67 68 74 28 70 50 61 72 73 65 2c 20 70 4e  eight(pParse, pN
4860: 65 77 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e  ew);.  return pN
4870: 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73  ew;.}../*.** Ass
4880: 69 67 6e 20 61 20 76 61 72 69 61 62 6c 65 20 6e  ign a variable n
4890: 75 6d 62 65 72 20 74 6f 20 61 6e 20 65 78 70 72  umber to an expr
48a0: 65 73 73 69 6f 6e 20 74 68 61 74 20 65 6e 63 6f  ession that enco
48b0: 64 65 73 20 61 20 77 69 6c 64 63 61 72 64 0a 2a  des a wildcard.*
48c0: 2a 20 69 6e 20 74 68 65 20 6f 72 69 67 69 6e 61  * in the origina
48d0: 6c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e  l SQL statement.
48e0: 20 20 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72    .**.** Wildcar
48f0: 64 73 20 63 6f 6e 73 69 73 74 69 6e 67 20 6f 66  ds consisting of
4900: 20 61 20 73 69 6e 67 6c 65 20 22 3f 22 20 61 72   a single "?" ar
4910: 65 20 61 73 73 69 67 6e 65 64 20 74 68 65 20 6e  e assigned the n
4920: 65 78 74 20 73 65 71 75 65 6e 74 69 61 6c 0a 2a  ext sequential.*
4930: 2a 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65  * variable numbe
4940: 72 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72  r..**.** Wildcar
4950: 64 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  ds of the form "
4960: 3f 6e 6e 6e 22 20 61 72 65 20 61 73 73 69 67 6e  ?nnn" are assign
4970: 65 64 20 74 68 65 20 6e 75 6d 62 65 72 20 22 6e  ed the number "n
4980: 6e 6e 22 2e 20 20 57 65 20 6d 61 6b 65 0a 2a 2a  nn".  We make.**
4990: 20 73 75 72 65 20 22 6e 6e 6e 22 20 69 73 20 6e   sure "nnn" is n
49a0: 6f 74 20 74 6f 6f 20 62 65 20 74 6f 20 61 76 6f  ot too be to avo
49b0: 69 64 20 61 20 64 65 6e 69 61 6c 20 6f 66 20 73  id a denial of s
49c0: 65 72 76 69 63 65 20 61 74 74 61 63 6b 20 77 68  ervice attack wh
49d0: 65 6e 0a 2a 2a 20 74 68 65 20 53 51 4c 20 73 74  en.** the SQL st
49e0: 61 74 65 6d 65 6e 74 20 63 6f 6d 65 73 20 66 72  atement comes fr
49f0: 6f 6d 20 61 6e 20 65 78 74 65 72 6e 61 6c 20 73  om an external s
4a00: 6f 75 72 63 65 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c  ource..**.** Wil
4a10: 64 63 61 72 64 73 20 6f 66 20 74 68 65 20 66 6f  dcards of the fo
4a20: 72 6d 20 22 3a 61 61 61 22 2c 20 22 40 61 61 61  rm ":aaa", "@aaa
4a30: 22 2c 20 6f 72 20 22 24 61 61 61 22 20 61 72 65  ", or "$aaa" are
4a40: 20 61 73 73 69 67 6e 65 64 20 74 68 65 20 73 61   assigned the sa
4a50: 6d 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 61 73 20  me number.** as 
4a60: 74 68 65 20 70 72 65 76 69 6f 75 73 20 69 6e 73  the previous ins
4a70: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 73 61 6d  tance of the sam
4a80: 65 20 77 69 6c 64 63 61 72 64 2e 20 20 4f 72 20  e wildcard.  Or 
4a90: 69 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66  if this is the f
4aa0: 69 72 73 74 0a 2a 2a 20 69 6e 73 74 61 6e 63 65  irst.** instance
4ab0: 20 6f 66 20 74 68 65 20 77 69 6c 64 63 61 72 64   of the wildcard
4ac0: 2c 20 74 68 65 20 6e 65 78 74 20 73 65 71 75 65  , the next seque
4ad0: 6e 74 69 61 6c 20 76 61 72 69 61 62 6c 65 20 6e  ntial variable n
4ae0: 75 6d 62 65 72 20 69 73 0a 2a 2a 20 61 73 73 69  umber is.** assi
4af0: 67 6e 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  gned..*/.void sq
4b00: 6c 69 74 65 33 45 78 70 72 41 73 73 69 67 6e 56  lite3ExprAssignV
4b10: 61 72 4e 75 6d 62 65 72 28 50 61 72 73 65 20 2a  arNumber(Parse *
4b20: 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
4b30: 78 70 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  xpr){.  sqlite3 
4b40: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
4b50: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
4b60: 7a 3b 0a 0a 20 20 69 66 28 20 70 45 78 70 72 3d  z;..  if( pExpr=
4b70: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61  =0 ) return;.  a
4b80: 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
4b90: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
4ba0: 50 5f 49 6e 74 56 61 6c 75 65 7c 45 50 5f 52 65  P_IntValue|EP_Re
4bb0: 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e  duced|EP_TokenOn
4bc0: 6c 79 29 20 29 3b 0a 20 20 7a 20 3d 20 70 45 78  ly) );.  z = pEx
4bd0: 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20  pr->u.zToken;.  
4be0: 61 73 73 65 72 74 28 20 7a 21 3d 30 20 29 3b 0a  assert( z!=0 );.
4bf0: 20 20 61 73 73 65 72 74 28 20 7a 5b 30 5d 21 3d    assert( z[0]!=
4c00: 30 20 29 3b 0a 20 20 69 66 28 20 7a 5b 31 5d 3d  0 );.  if( z[1]=
4c10: 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 57 69 6c  =0 ){.    /* Wil
4c20: 64 63 61 72 64 20 6f 66 20 74 68 65 20 66 6f 72  dcard of the for
4c30: 6d 20 22 3f 22 2e 20 20 41 73 73 69 67 6e 20 74  m "?".  Assign t
4c40: 68 65 20 6e 65 78 74 20 76 61 72 69 61 62 6c 65  he next variable
4c50: 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20 61   number */.    a
4c60: 73 73 65 72 74 28 20 7a 5b 30 5d 3d 3d 27 3f 27  ssert( z[0]=='?'
4c70: 20 29 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 69   );.    pExpr->i
4c80: 43 6f 6c 75 6d 6e 20 3d 20 28 79 6e 56 61 72 29  Column = (ynVar)
4c90: 28 2b 2b 70 50 61 72 73 65 2d 3e 6e 56 61 72 29  (++pParse->nVar)
4ca0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 79  ;.  }else{.    y
4cb0: 6e 56 61 72 20 78 20 3d 20 30 3b 0a 20 20 20 20  nVar x = 0;.    
4cc0: 75 33 32 20 6e 20 3d 20 73 71 6c 69 74 65 33 53  u32 n = sqlite3S
4cd0: 74 72 6c 65 6e 33 30 28 7a 29 3b 0a 20 20 20 20  trlen30(z);.    
4ce0: 69 66 28 20 7a 5b 30 5d 3d 3d 27 3f 27 20 29 7b  if( z[0]=='?' ){
4cf0: 0a 20 20 20 20 20 20 2f 2a 20 57 69 6c 64 63 61  .      /* Wildca
4d00: 72 64 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  rd of the form "
4d10: 3f 6e 6e 6e 22 2e 20 20 43 6f 6e 76 65 72 74 20  ?nnn".  Convert 
4d20: 22 6e 6e 6e 22 20 74 6f 20 61 6e 20 69 6e 74 65  "nnn" to an inte
4d30: 67 65 72 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a  ger and.      **
4d40: 20 75 73 65 20 69 74 20 61 73 20 74 68 65 20 76   use it as the v
4d50: 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 2a  ariable number *
4d60: 2f 0a 20 20 20 20 20 20 69 36 34 20 69 3b 0a 20  /.      i64 i;. 
4d70: 20 20 20 20 20 69 6e 74 20 62 4f 6b 20 3d 20 30       int bOk = 0
4d80: 3d 3d 73 71 6c 69 74 65 33 41 74 6f 69 36 34 28  ==sqlite3Atoi64(
4d90: 26 7a 5b 31 5d 2c 20 26 69 2c 20 6e 2d 31 2c 20  &z[1], &i, n-1, 
4da0: 53 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 20  SQLITE_UTF8);.  
4db0: 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75      pExpr->iColu
4dc0: 6d 6e 20 3d 20 78 20 3d 20 28 79 6e 56 61 72 29  mn = x = (ynVar)
4dd0: 69 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  i;.      testcas
4de0: 65 28 20 69 3d 3d 30 20 29 3b 0a 20 20 20 20 20  e( i==0 );.     
4df0: 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d 31 20   testcase( i==1 
4e00: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
4e10: 65 28 20 69 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74  e( i==db->aLimit
4e20: 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41  [SQLITE_LIMIT_VA
4e30: 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 2d 31  RIABLE_NUMBER]-1
4e40: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
4e50: 73 65 28 20 69 3d 3d 64 62 2d 3e 61 4c 69 6d 69  se( i==db->aLimi
4e60: 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56  t[SQLITE_LIMIT_V
4e70: 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 20  ARIABLE_NUMBER] 
4e80: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 62 4f 6b  );.      if( bOk
4e90: 3d 3d 30 20 7c 7c 20 69 3c 31 20 7c 7c 20 69 3e  ==0 || i<1 || i>
4ea0: 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54  db->aLimit[SQLIT
4eb0: 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45  E_LIMIT_VARIABLE
4ec0: 5f 4e 55 4d 42 45 52 5d 20 29 7b 0a 20 20 20 20  _NUMBER] ){.    
4ed0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
4ee0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 76 61 72  Msg(pParse, "var
4ef0: 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 6d 75 73  iable number mus
4f00: 74 20 62 65 20 62 65 74 77 65 65 6e 20 3f 31 20  t be between ?1 
4f10: 61 6e 64 20 3f 25 64 22 2c 0a 20 20 20 20 20 20  and ?%d",.      
4f20: 20 20 20 20 20 20 64 62 2d 3e 61 4c 69 6d 69 74        db->aLimit
4f30: 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41  [SQLITE_LIMIT_VA
4f40: 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 29 3b  RIABLE_NUMBER]);
4f50: 0a 20 20 20 20 20 20 20 20 78 20 3d 20 30 3b 0a  .        x = 0;.
4f60: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
4f70: 28 20 69 3e 70 50 61 72 73 65 2d 3e 6e 56 61 72  ( i>pParse->nVar
4f80: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 72   ){.        pPar
4f90: 73 65 2d 3e 6e 56 61 72 20 3d 20 28 69 6e 74 29  se->nVar = (int)
4fa0: 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  i;.      }.    }
4fb0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 57  else{.      /* W
4fc0: 69 6c 64 63 61 72 64 73 20 6c 69 6b 65 20 22 3a  ildcards like ":
4fd0: 61 61 61 22 2c 20 22 24 61 61 61 22 20 6f 72 20  aaa", "$aaa" or 
4fe0: 22 40 61 61 61 22 2e 20 20 52 65 75 73 65 20 74  "@aaa".  Reuse t
4ff0: 68 65 20 73 61 6d 65 20 76 61 72 69 61 62 6c 65  he same variable
5000: 0a 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72  .      ** number
5010: 20 61 73 20 74 68 65 20 70 72 69 6f 72 20 61 70   as the prior ap
5020: 70 65 61 72 61 6e 63 65 20 6f 66 20 74 68 65 20  pearance of the 
5030: 73 61 6d 65 20 6e 61 6d 65 2c 20 6f 72 20 69 66  same name, or if
5040: 20 74 68 65 20 6e 61 6d 65 0a 20 20 20 20 20 20   the name.      
5050: 2a 2a 20 68 61 73 20 6e 65 76 65 72 20 61 70 70  ** has never app
5060: 65 61 72 65 64 20 62 65 66 6f 72 65 2c 20 72 65  eared before, re
5070: 75 73 65 20 74 68 65 20 73 61 6d 65 20 76 61 72  use the same var
5080: 69 61 62 6c 65 20 6e 75 6d 62 65 72 0a 20 20 20  iable number.   
5090: 20 20 20 2a 2f 0a 20 20 20 20 20 20 79 6e 56 61     */.      ynVa
50a0: 72 20 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  r i;.      for(i
50b0: 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 7a  =0; i<pParse->nz
50c0: 56 61 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Var; i++){.     
50d0: 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 61     if( pParse->a
50e0: 7a 56 61 72 5b 69 5d 20 26 26 20 73 74 72 63 6d  zVar[i] && strcm
50f0: 70 28 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 5b  p(pParse->azVar[
5100: 69 5d 2c 7a 29 3d 3d 30 20 29 7b 0a 20 20 20 20  i],z)==0 ){.    
5110: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f        pExpr->iCo
5120: 6c 75 6d 6e 20 3d 20 78 20 3d 20 28 79 6e 56 61  lumn = x = (ynVa
5130: 72 29 69 2b 31 3b 0a 20 20 20 20 20 20 20 20 20  r)i+1;.         
5140: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
5150: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
5160: 69 66 28 20 78 3d 3d 30 20 29 20 78 20 3d 20 70  if( x==0 ) x = p
5170: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20  Expr->iColumn = 
5180: 28 79 6e 56 61 72 29 28 2b 2b 70 50 61 72 73 65  (ynVar)(++pParse
5190: 2d 3e 6e 56 61 72 29 3b 0a 20 20 20 20 7d 0a 20  ->nVar);.    }. 
51a0: 20 20 20 69 66 28 20 78 3e 30 20 29 7b 0a 20 20     if( x>0 ){.  
51b0: 20 20 20 20 69 66 28 20 78 3e 70 50 61 72 73 65      if( x>pParse
51c0: 2d 3e 6e 7a 56 61 72 20 29 7b 0a 20 20 20 20 20  ->nzVar ){.     
51d0: 20 20 20 63 68 61 72 20 2a 2a 61 3b 0a 20 20 20     char **a;.   
51e0: 20 20 20 20 20 61 20 3d 20 73 71 6c 69 74 65 33       a = sqlite3
51f0: 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70 50  DbRealloc(db, pP
5200: 61 72 73 65 2d 3e 61 7a 56 61 72 2c 20 78 2a 73  arse->azVar, x*s
5210: 69 7a 65 6f 66 28 61 5b 30 5d 29 29 3b 0a 20 20  izeof(a[0]));.  
5220: 20 20 20 20 20 20 69 66 28 20 61 3d 3d 30 20 29        if( a==0 )
5230: 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 45 72 72   return;  /* Err
5240: 6f 72 20 72 65 70 6f 72 74 65 64 20 74 68 72 6f  or reported thro
5250: 75 67 68 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  ugh db->mallocFa
5260: 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20  iled */.        
5270: 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 20 3d 20  pParse->azVar = 
5280: 61 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65  a;.        memse
5290: 74 28 26 61 5b 70 50 61 72 73 65 2d 3e 6e 7a 56  t(&a[pParse->nzV
52a0: 61 72 5d 2c 20 30 2c 20 28 78 2d 70 50 61 72 73  ar], 0, (x-pPars
52b0: 65 2d 3e 6e 7a 56 61 72 29 2a 73 69 7a 65 6f 66  e->nzVar)*sizeof
52c0: 28 61 5b 30 5d 29 29 3b 0a 20 20 20 20 20 20 20  (a[0]));.       
52d0: 20 70 50 61 72 73 65 2d 3e 6e 7a 56 61 72 20 3d   pParse->nzVar =
52e0: 20 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   x;.      }.    
52f0: 20 20 69 66 28 20 7a 5b 30 5d 21 3d 27 3f 27 20    if( z[0]!='?' 
5300: 7c 7c 20 70 50 61 72 73 65 2d 3e 61 7a 56 61 72  || pParse->azVar
5310: 5b 78 2d 31 5d 3d 3d 30 20 29 7b 0a 20 20 20 20  [x-1]==0 ){.    
5320: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
5330: 65 28 64 62 2c 20 70 50 61 72 73 65 2d 3e 61 7a  e(db, pParse->az
5340: 56 61 72 5b 78 2d 31 5d 29 3b 0a 20 20 20 20 20  Var[x-1]);.     
5350: 20 20 20 70 50 61 72 73 65 2d 3e 61 7a 56 61 72     pParse->azVar
5360: 5b 78 2d 31 5d 20 3d 20 73 71 6c 69 74 65 33 44  [x-1] = sqlite3D
5370: 62 53 74 72 4e 44 75 70 28 64 62 2c 20 7a 2c 20  bStrNDup(db, z, 
5380: 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  n);.      }.    
5390: 7d 0a 20 20 7d 20 0a 20 20 69 66 28 20 21 70 50  }.  } .  if( !pP
53a0: 61 72 73 65 2d 3e 6e 45 72 72 20 26 26 20 70 50  arse->nErr && pP
53b0: 61 72 73 65 2d 3e 6e 56 61 72 3e 64 62 2d 3e 61  arse->nVar>db->a
53c0: 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
53d0: 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42  IT_VARIABLE_NUMB
53e0: 45 52 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ER] ){.    sqlit
53f0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
5400: 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 53 51 4c  e, "too many SQL
5410: 20 76 61 72 69 61 62 6c 65 73 22 29 3b 0a 20 20   variables");.  
5420: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 75 72  }.}../*.** Recur
5430: 73 69 76 65 6c 79 20 64 65 6c 65 74 65 20 61 6e  sively delete an
5440: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
5450: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
5460: 33 45 78 70 72 44 65 6c 65 74 65 28 73 71 6c 69  3ExprDelete(sqli
5470: 74 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70  te3 *db, Expr *p
5480: 29 7b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  ){.  if( p==0 ) 
5490: 72 65 74 75 72 6e 3b 0a 20 20 2f 2a 20 53 61 6e  return;.  /* San
54a0: 69 74 79 20 63 68 65 63 6b 3a 20 41 73 73 65 72  ity check: Asser
54b0: 74 20 74 68 61 74 20 74 68 65 20 49 6e 74 56 61  t that the IntVa
54c0: 6c 75 65 20 69 73 20 6e 6f 6e 2d 6e 65 67 61 74  lue is non-negat
54d0: 69 76 65 20 69 66 20 69 74 20 65 78 69 73 74 73  ive if it exists
54e0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21 45   */.  assert( !E
54f0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
5500: 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 7c  , EP_IntValue) |
5510: 7c 20 70 2d 3e 75 2e 69 56 61 6c 75 65 3e 3d 30  | p->u.iValue>=0
5520: 20 29 3b 0a 20 20 69 66 28 20 21 45 78 70 72 48   );.  if( !ExprH
5530: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
5540: 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20  _TokenOnly) ){. 
5550: 20 20 20 2f 2a 20 54 68 65 20 45 78 70 72 2e 78     /* The Expr.x
5560: 20 75 6e 69 6f 6e 20 69 73 20 6e 65 76 65 72 20   union is never 
5570: 75 73 65 64 20 61 74 20 74 68 65 20 73 61 6d 65  used at the same
5580: 20 74 69 6d 65 20 61 73 20 45 78 70 72 2e 70 52   time as Expr.pR
5590: 69 67 68 74 20 2a 2f 0a 20 20 20 20 61 73 73 65  ight */.    asse
55a0: 72 74 28 20 70 2d 3e 78 2e 70 4c 69 73 74 3d 3d  rt( p->x.pList==
55b0: 30 20 7c 7c 20 70 2d 3e 70 52 69 67 68 74 3d 3d  0 || p->pRight==
55c0: 30 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 );.    sqlite3
55d0: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
55e0: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 73 71  ->pLeft);.    sq
55f0: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
5600: 64 62 2c 20 70 2d 3e 70 52 69 67 68 74 29 3b 0a  db, p->pRight);.
5610: 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50      if( ExprHasP
5620: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 4d 65  roperty(p, EP_Me
5630: 6d 54 6f 6b 65 6e 29 20 29 20 73 71 6c 69 74 65  mToken) ) sqlite
5640: 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 75  3DbFree(db, p->u
5650: 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 69 66  .zToken);.    if
5660: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
5670: 79 28 70 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  y(p, EP_xIsSelec
5680: 74 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  t) ){.      sqli
5690: 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
56a0: 64 62 2c 20 70 2d 3e 78 2e 70 53 65 6c 65 63 74  db, p->x.pSelect
56b0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
56c0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
56d0: 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  istDelete(db, p-
56e0: 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20 7d  >x.pList);.    }
56f0: 0a 20 20 7d 0a 20 20 69 66 28 20 21 45 78 70 72  .  }.  if( !Expr
5700: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
5710: 50 5f 53 74 61 74 69 63 29 20 29 7b 0a 20 20 20  P_Static) ){.   
5720: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
5730: 62 2c 20 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  b, p);.  }.}../*
5740: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
5750: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 61  umber of bytes a
5760: 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 74 68 65  llocated for the
5770: 20 65 78 70 72 65 73 73 69 6f 6e 20 73 74 72 75   expression stru
5780: 63 74 75 72 65 20 0a 2a 2a 20 70 61 73 73 65 64  cture .** passed
5790: 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
57a0: 67 75 6d 65 6e 74 2e 20 54 68 69 73 20 69 73 20  gument. This is 
57b0: 61 6c 77 61 79 73 20 6f 6e 65 20 6f 66 20 45 58  always one of EX
57c0: 50 52 5f 46 55 4c 4c 53 49 5a 45 2c 0a 2a 2a 20  PR_FULLSIZE,.** 
57d0: 45 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45  EXPR_REDUCEDSIZE
57e0: 20 6f 72 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e   or EXPR_TOKENON
57f0: 4c 59 53 49 5a 45 2e 0a 2a 2f 0a 73 74 61 74 69  LYSIZE..*/.stati
5800: 63 20 69 6e 74 20 65 78 70 72 53 74 72 75 63 74  c int exprStruct
5810: 53 69 7a 65 28 45 78 70 72 20 2a 70 29 7b 0a 20  Size(Expr *p){. 
5820: 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
5830: 65 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e  erty(p, EP_Token
5840: 4f 6e 6c 79 29 20 29 20 72 65 74 75 72 6e 20 45  Only) ) return E
5850: 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a  XPR_TOKENONLYSIZ
5860: 45 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73  E;.  if( ExprHas
5870: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 52  Property(p, EP_R
5880: 65 64 75 63 65 64 29 20 29 20 72 65 74 75 72 6e  educed) ) return
5890: 20 45 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a   EXPR_REDUCEDSIZ
58a0: 45 3b 0a 20 20 72 65 74 75 72 6e 20 45 58 50 52  E;.  return EXPR
58b0: 5f 46 55 4c 4c 53 49 5a 45 3b 0a 7d 0a 0a 2f 2a  _FULLSIZE;.}../*
58c0: 0a 2a 2a 20 54 68 65 20 64 75 70 65 64 45 78 70  .** The dupedExp
58d0: 72 2a 53 69 7a 65 28 29 20 72 6f 75 74 69 6e 65  r*Size() routine
58e0: 73 20 65 61 63 68 20 72 65 74 75 72 6e 20 74 68  s each return th
58f0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
5900: 73 20 72 65 71 75 69 72 65 64 0a 2a 2a 20 74 6f  s required.** to
5910: 20 73 74 6f 72 65 20 61 20 63 6f 70 79 20 6f 66   store a copy of
5920: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6f   an expression o
5930: 72 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  r expression tre
5940: 65 2e 20 20 54 68 65 79 20 64 69 66 66 65 72 20  e.  They differ 
5950: 69 6e 0a 2a 2a 20 68 6f 77 20 6d 75 63 68 20 6f  in.** how much o
5960: 66 20 74 68 65 20 74 72 65 65 20 69 73 20 6d 65  f the tree is me
5970: 61 73 75 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20  asured..**.**   
5980: 20 20 64 75 70 65 64 45 78 70 72 53 74 72 75 63    dupedExprStruc
5990: 74 53 69 7a 65 28 29 20 20 20 20 20 53 69 7a 65  tSize()     Size
59a0: 20 6f 66 20 6f 6e 6c 79 20 74 68 65 20 45 78 70   of only the Exp
59b0: 72 20 73 74 72 75 63 74 75 72 65 20 0a 2a 2a 20  r structure .** 
59c0: 20 20 20 20 64 75 70 65 64 45 78 70 72 4e 6f 64      dupedExprNod
59d0: 65 53 69 7a 65 28 29 20 20 20 20 20 20 20 53 69  eSize()       Si
59e0: 7a 65 20 6f 66 20 45 78 70 72 20 2b 20 73 70 61  ze of Expr + spa
59f0: 63 65 20 66 6f 72 20 74 6f 6b 65 6e 0a 2a 2a 20  ce for token.** 
5a00: 20 20 20 20 64 75 70 65 64 45 78 70 72 53 69 7a      dupedExprSiz
5a10: 65 28 29 20 20 20 20 20 20 20 20 20 20 20 45 78  e()           Ex
5a20: 70 72 20 2b 20 74 6f 6b 65 6e 20 2b 20 73 75 62  pr + token + sub
5a30: 74 72 65 65 20 63 6f 6d 70 6f 6e 65 6e 74 73 0a  tree components.
5a40: 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
5a50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5a60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5a70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5a80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
5a90: 2a 0a 2a 2a 20 54 68 65 20 64 75 70 65 64 45 78  *.** The dupedEx
5aa0: 70 72 53 74 72 75 63 74 53 69 7a 65 28 29 20 66  prStructSize() f
5ab0: 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
5ac0: 74 77 6f 20 76 61 6c 75 65 73 20 4f 52 2d 65 64  two values OR-ed
5ad0: 20 74 6f 67 65 74 68 65 72 3a 20 20 0a 2a 2a 20   together:  .** 
5ae0: 28 31 29 20 74 68 65 20 73 70 61 63 65 20 72 65  (1) the space re
5af0: 71 75 69 72 65 64 20 66 6f 72 20 61 20 63 6f 70  quired for a cop
5b00: 79 20 6f 66 20 74 68 65 20 45 78 70 72 20 73 74  y of the Expr st
5b10: 72 75 63 74 75 72 65 20 6f 6e 6c 79 20 61 6e 64  ructure only and
5b20: 20 0a 2a 2a 20 28 32 29 20 74 68 65 20 45 50 5f   .** (2) the EP_
5b30: 78 78 78 20 66 6c 61 67 73 20 74 68 61 74 20 69  xxx flags that i
5b40: 6e 64 69 63 61 74 65 20 77 68 61 74 20 74 68 65  ndicate what the
5b50: 20 73 74 72 75 63 74 75 72 65 20 73 69 7a 65 20   structure size 
5b60: 73 68 6f 75 6c 64 20 62 65 2e 0a 2a 2a 20 54 68  should be..** Th
5b70: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 73 20  e return values 
5b80: 69 73 20 61 6c 77 61 79 73 20 6f 6e 65 20 6f 66  is always one of
5b90: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 45 58 50  :.**.**      EXP
5ba0: 52 5f 46 55 4c 4c 53 49 5a 45 0a 2a 2a 20 20 20  R_FULLSIZE.**   
5bb0: 20 20 20 45 58 50 52 5f 52 45 44 55 43 45 44 53     EXPR_REDUCEDS
5bc0: 49 5a 45 20 20 20 7c 20 45 50 5f 52 65 64 75 63  IZE   | EP_Reduc
5bd0: 65 64 0a 2a 2a 20 20 20 20 20 20 45 58 50 52 5f  ed.**      EXPR_
5be0: 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 20 7c 20  TOKENONLYSIZE | 
5bf0: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 0a 2a 2a 0a  EP_TokenOnly.**.
5c00: 2a 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74  ** The size of t
5c10: 68 65 20 73 74 72 75 63 74 75 72 65 20 63 61 6e  he structure can
5c20: 20 62 65 20 66 6f 75 6e 64 20 62 79 20 6d 61 73   be found by mas
5c30: 6b 69 6e 67 20 74 68 65 20 72 65 74 75 72 6e 20  king the return 
5c40: 76 61 6c 75 65 0a 2a 2a 20 6f 66 20 74 68 69 73  value.** of this
5c50: 20 72 6f 75 74 69 6e 65 20 77 69 74 68 20 30 78   routine with 0x
5c60: 66 66 66 2e 20 20 54 68 65 20 66 6c 61 67 73 20  fff.  The flags 
5c70: 63 61 6e 20 62 65 20 66 6f 75 6e 64 20 62 79 20  can be found by 
5c80: 6d 61 73 6b 69 6e 67 20 74 68 65 0a 2a 2a 20 72  masking the.** r
5c90: 65 74 75 72 6e 20 76 61 6c 75 65 20 77 69 74 68  eturn value with
5ca0: 20 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f 54   EP_Reduced|EP_T
5cb0: 6f 6b 65 6e 4f 6e 6c 79 2e 0a 2a 2a 0a 2a 2a 20  okenOnly..**.** 
5cc0: 4e 6f 74 65 20 74 68 61 74 20 77 69 74 68 20 66  Note that with f
5cd0: 6c 61 67 73 3d 3d 45 58 50 52 44 55 50 5f 52 45  lags==EXPRDUP_RE
5ce0: 44 55 43 45 2c 20 74 68 69 73 20 72 6f 75 74 69  DUCE, this routi
5cf0: 6e 65 73 20 77 6f 72 6b 73 20 6f 6e 20 66 75 6c  nes works on ful
5d00: 6c 2d 73 69 7a 65 0a 2a 2a 20 28 75 6e 72 65 64  l-size.** (unred
5d10: 75 63 65 64 29 20 45 78 70 72 20 6f 62 6a 65 63  uced) Expr objec
5d20: 74 73 20 61 73 20 74 68 65 79 20 6f 72 20 6f 72  ts as they or or
5d30: 69 67 69 6e 61 6c 6c 79 20 63 6f 6e 73 74 72 75  iginally constru
5d40: 63 74 65 64 20 62 79 20 74 68 65 20 70 61 72 73  cted by the pars
5d50: 65 72 2e 0a 2a 2a 20 44 75 72 69 6e 67 20 65 78  er..** During ex
5d60: 70 72 65 73 73 69 6f 6e 20 61 6e 61 6c 79 73 69  pression analysi
5d70: 73 2c 20 65 78 74 72 61 20 69 6e 66 6f 72 6d 61  s, extra informa
5d80: 74 69 6f 6e 20 69 73 20 63 6f 6d 70 75 74 65 64  tion is computed
5d90: 20 61 6e 64 20 6d 6f 76 65 64 20 69 6e 74 6f 0a   and moved into.
5da0: 2a 2a 20 6c 61 74 65 72 20 70 61 72 74 73 20 6f  ** later parts o
5db0: 66 20 74 65 68 20 45 78 70 72 20 6f 62 6a 65 63  f teh Expr objec
5dc0: 74 20 61 6e 64 20 74 68 61 74 20 65 78 74 72 61  t and that extra
5dd0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6d 69 67   information mig
5de0: 68 74 20 67 65 74 20 63 68 6f 70 70 65 64 0a 2a  ht get chopped.*
5df0: 2a 20 6f 66 66 20 69 66 20 74 68 65 20 65 78 70  * off if the exp
5e00: 72 65 73 73 69 6f 6e 20 69 73 20 72 65 64 75 63  ression is reduc
5e10: 65 64 2e 20 20 4e 6f 74 65 20 61 6c 73 6f 20 74  ed.  Note also t
5e20: 68 61 74 20 69 74 20 64 6f 65 73 20 6e 6f 74 20  hat it does not 
5e30: 77 6f 72 6b 20 74 6f 0a 2a 2a 20 6d 61 6b 65 20  work to.** make 
5e40: 61 6e 20 45 58 50 52 44 55 50 5f 52 45 44 55 43  an EXPRDUP_REDUC
5e50: 45 20 63 6f 70 79 20 6f 66 20 61 20 72 65 64 75  E copy of a redu
5e60: 63 65 64 20 65 78 70 72 65 73 73 69 6f 6e 2e 20  ced expression. 
5e70: 20 49 74 20 69 73 20 6f 6e 6c 79 20 6c 65 67 61   It is only lega
5e80: 6c 0a 2a 2a 20 74 6f 20 72 65 64 75 63 65 20 61  l.** to reduce a
5e90: 20 70 72 69 73 74 69 6e 65 20 65 78 70 72 65 73   pristine expres
5ea0: 73 69 6f 6e 20 74 72 65 65 20 66 72 6f 6d 20 74  sion tree from t
5eb0: 68 65 20 70 61 72 73 65 72 2e 20 20 54 68 65 20  he parser.  The 
5ec0: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 0a 2a  implementation.*
5ed0: 2a 20 6f 66 20 64 75 70 65 64 45 78 70 72 53 74  * of dupedExprSt
5ee0: 72 75 63 74 53 69 7a 65 28 29 20 63 6f 6e 74 61  ructSize() conta
5ef0: 69 6e 20 6d 75 6c 74 69 70 6c 65 20 61 73 73 65  in multiple asse
5f00: 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20  rt() statements 
5f10: 74 68 61 74 20 61 74 74 65 6d 70 74 0a 2a 2a 20  that attempt.** 
5f20: 74 6f 20 65 6e 66 6f 72 63 65 20 74 68 69 73 20  to enforce this 
5f30: 63 6f 6e 73 74 72 61 69 6e 74 2e 0a 2a 2f 0a 73  constraint..*/.s
5f40: 74 61 74 69 63 20 69 6e 74 20 64 75 70 65 64 45  tatic int dupedE
5f50: 78 70 72 53 74 72 75 63 74 53 69 7a 65 28 45 78  xprStructSize(Ex
5f60: 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73  pr *p, int flags
5f70: 29 7b 0a 20 20 69 6e 74 20 6e 53 69 7a 65 3b 0a  ){.  int nSize;.
5f80: 20 20 61 73 73 65 72 74 28 20 66 6c 61 67 73 3d    assert( flags=
5f90: 3d 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 20  =EXPRDUP_REDUCE 
5fa0: 7c 7c 20 66 6c 61 67 73 3d 3d 30 20 29 3b 20 2f  || flags==0 ); /
5fb0: 2a 20 4f 6e 6c 79 20 6f 6e 65 20 66 6c 61 67 20  * Only one flag 
5fc0: 76 61 6c 75 65 20 61 6c 6c 6f 77 65 64 20 2a 2f  value allowed */
5fd0: 0a 20 20 61 73 73 65 72 74 28 20 45 58 50 52 5f  .  assert( EXPR_
5fe0: 46 55 4c 4c 53 49 5a 45 3c 3d 30 78 66 66 66 20  FULLSIZE<=0xfff 
5ff0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 30 78  );.  assert( (0x
6000: 66 66 66 20 26 20 28 45 50 5f 52 65 64 75 63 65  fff & (EP_Reduce
6010: 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 29  d|EP_TokenOnly))
6020: 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 30 3d 3d  ==0 );.  if( 0==
6030: 28 66 6c 61 67 73 26 45 58 50 52 44 55 50 5f 52  (flags&EXPRDUP_R
6040: 45 44 55 43 45 29 20 29 7b 0a 20 20 20 20 6e 53  EDUCE) ){.    nS
6050: 69 7a 65 20 3d 20 45 58 50 52 5f 46 55 4c 4c 53  ize = EXPR_FULLS
6060: 49 5a 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  IZE;.  }else{.  
6070: 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
6080: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
6090: 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65  _TokenOnly|EP_Re
60a0: 64 75 63 65 64 29 20 29 3b 0a 20 20 20 20 61 73  duced) );.    as
60b0: 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
60c0: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 46 72 6f  operty(p, EP_Fro
60d0: 6d 4a 6f 69 6e 29 20 29 3b 20 0a 20 20 20 20 61  mJoin) ); .    a
60e0: 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
60f0: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 4d 65  roperty(p, EP_Me
6100: 6d 54 6f 6b 65 6e 29 20 29 3b 0a 20 20 20 20 61  mToken) );.    a
6110: 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
6120: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 4e 6f  roperty(p, EP_No
6130: 52 65 64 75 63 65 29 20 29 3b 0a 20 20 20 20 69  Reduce) );.    i
6140: 66 28 20 70 2d 3e 70 4c 65 66 74 20 7c 7c 20 70  f( p->pLeft || p
6150: 2d 3e 78 2e 70 4c 69 73 74 20 29 7b 0a 20 20 20  ->x.pList ){.   
6160: 20 20 20 6e 53 69 7a 65 20 3d 20 45 58 50 52 5f     nSize = EXPR_
6170: 52 45 44 55 43 45 44 53 49 5a 45 20 7c 20 45 50  REDUCEDSIZE | EP
6180: 5f 52 65 64 75 63 65 64 3b 0a 20 20 20 20 7d 65  _Reduced;.    }e
6190: 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
61a0: 74 28 20 70 2d 3e 70 52 69 67 68 74 3d 3d 30 20  t( p->pRight==0 
61b0: 29 3b 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d  );.      nSize =
61c0: 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53   EXPR_TOKENONLYS
61d0: 49 5a 45 20 7c 20 45 50 5f 54 6f 6b 65 6e 4f 6e  IZE | EP_TokenOn
61e0: 6c 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ly;.    }.  }.  
61f0: 72 65 74 75 72 6e 20 6e 53 69 7a 65 3b 0a 7d 0a  return nSize;.}.
6200: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
6210: 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65  tion returns the
6220: 20 73 70 61 63 65 20 69 6e 20 62 79 74 65 73 20   space in bytes 
6230: 72 65 71 75 69 72 65 64 20 74 6f 20 73 74 6f 72  required to stor
6240: 65 20 74 68 65 20 63 6f 70 79 20 0a 2a 2a 20 6f  e the copy .** o
6250: 66 20 74 68 65 20 45 78 70 72 20 73 74 72 75 63  f the Expr struc
6260: 74 75 72 65 20 61 6e 64 20 61 20 63 6f 70 79 20  ture and a copy 
6270: 6f 66 20 74 68 65 20 45 78 70 72 2e 75 2e 7a 54  of the Expr.u.zT
6280: 6f 6b 65 6e 20 73 74 72 69 6e 67 20 28 69 66 20  oken string (if 
6290: 74 68 61 74 0a 2a 2a 20 73 74 72 69 6e 67 20 69  that.** string i
62a0: 73 20 64 65 66 69 6e 65 64 2e 29 0a 2a 2f 0a 73  s defined.).*/.s
62b0: 74 61 74 69 63 20 69 6e 74 20 64 75 70 65 64 45  tatic int dupedE
62c0: 78 70 72 4e 6f 64 65 53 69 7a 65 28 45 78 70 72  xprNodeSize(Expr
62d0: 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b   *p, int flags){
62e0: 0a 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 64  .  int nByte = d
62f0: 75 70 65 64 45 78 70 72 53 74 72 75 63 74 53 69  upedExprStructSi
6300: 7a 65 28 70 2c 20 66 6c 61 67 73 29 20 26 20 30  ze(p, flags) & 0
6310: 78 66 66 66 3b 0a 20 20 69 66 28 20 21 45 78 70  xfff;.  if( !Exp
6320: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
6330: 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 26 26 20  EP_IntValue) && 
6340: 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 29 7b 0a 20  p->u.zToken ){. 
6350: 20 20 20 6e 42 79 74 65 20 2b 3d 20 73 71 6c 69     nByte += sqli
6360: 74 65 33 53 74 72 6c 65 6e 33 30 28 70 2d 3e 75  te3Strlen30(p->u
6370: 2e 7a 54 6f 6b 65 6e 29 2b 31 3b 0a 20 20 7d 0a  .zToken)+1;.  }.
6380: 20 20 72 65 74 75 72 6e 20 52 4f 55 4e 44 38 28    return ROUND8(
6390: 6e 42 79 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  nByte);.}../*.**
63a0: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
63b0: 65 72 20 6f 66 20 62 79 74 65 73 20 72 65 71 75  er of bytes requ
63c0: 69 72 65 64 20 74 6f 20 63 72 65 61 74 65 20 61  ired to create a
63d0: 20 64 75 70 6c 69 63 61 74 65 20 6f 66 20 74 68   duplicate of th
63e0: 65 20 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  e .** expression
63f0: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66   passed as the f
6400: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 54  irst argument. T
6410: 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
6420: 6e 74 20 69 73 20 61 0a 2a 2a 20 6d 61 73 6b 20  nt is a.** mask 
6430: 63 6f 6e 74 61 69 6e 69 6e 67 20 45 58 50 52 44  containing EXPRD
6440: 55 50 5f 58 58 58 20 66 6c 61 67 73 2e 0a 2a 2a  UP_XXX flags..**
6450: 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65  .** The value re
6460: 74 75 72 6e 65 64 20 69 6e 63 6c 75 64 65 73 20  turned includes 
6470: 73 70 61 63 65 20 74 6f 20 63 72 65 61 74 65 20  space to create 
6480: 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 45 78  a copy of the Ex
6490: 70 72 20 73 74 72 75 63 74 0a 2a 2a 20 69 74 73  pr struct.** its
64a0: 65 6c 66 20 61 6e 64 20 74 68 65 20 62 75 66 66  elf and the buff
64b0: 65 72 20 72 65 66 65 72 72 65 64 20 74 6f 20 62  er referred to b
64c0: 79 20 45 78 70 72 2e 75 2e 7a 54 6f 6b 65 6e 2c  y Expr.u.zToken,
64d0: 20 69 66 20 61 6e 79 2e 0a 2a 2a 0a 2a 2a 20 49   if any..**.** I
64e0: 66 20 74 68 65 20 45 58 50 52 44 55 50 5f 52 45  f the EXPRDUP_RE
64f0: 44 55 43 45 20 66 6c 61 67 20 69 73 20 73 65 74  DUCE flag is set
6500: 2c 20 74 68 65 6e 20 74 68 65 20 72 65 74 75 72  , then the retur
6510: 6e 20 76 61 6c 75 65 20 69 6e 63 6c 75 64 65 73  n value includes
6520: 20 0a 2a 2a 20 73 70 61 63 65 20 74 6f 20 64 75   .** space to du
6530: 70 6c 69 63 61 74 65 20 61 6c 6c 20 45 78 70 72  plicate all Expr
6540: 20 6e 6f 64 65 73 20 69 6e 20 74 68 65 20 74 72   nodes in the tr
6550: 65 65 20 66 6f 72 6d 65 64 20 62 79 20 45 78 70  ee formed by Exp
6560: 72 2e 70 4c 65 66 74 20 0a 2a 2a 20 61 6e 64 20  r.pLeft .** and 
6570: 45 78 70 72 2e 70 52 69 67 68 74 20 76 61 72 69  Expr.pRight vari
6580: 61 62 6c 65 73 20 28 62 75 74 20 6e 6f 74 20 66  ables (but not f
6590: 6f 72 20 61 6e 79 20 73 74 72 75 63 74 75 72 65  or any structure
65a0: 73 20 70 6f 69 6e 74 65 64 20 74 6f 20 6f 72 20  s pointed to or 
65b0: 0a 2a 2a 20 64 65 73 63 65 6e 64 65 64 20 66 72  .** descended fr
65c0: 6f 6d 20 74 68 65 20 45 78 70 72 2e 78 2e 70 4c  om the Expr.x.pL
65d0: 69 73 74 20 6f 72 20 45 78 70 72 2e 78 2e 70 53  ist or Expr.x.pS
65e0: 65 6c 65 63 74 20 76 61 72 69 61 62 6c 65 73 29  elect variables)
65f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
6600: 64 75 70 65 64 45 78 70 72 53 69 7a 65 28 45 78  dupedExprSize(Ex
6610: 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73  pr *p, int flags
6620: 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 20 3d  ){.  int nByte =
6630: 20 30 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20   0;.  if( p ){. 
6640: 20 20 20 6e 42 79 74 65 20 3d 20 64 75 70 65 64     nByte = duped
6650: 45 78 70 72 4e 6f 64 65 53 69 7a 65 28 70 2c 20  ExprNodeSize(p, 
6660: 66 6c 61 67 73 29 3b 0a 20 20 20 20 69 66 28 20  flags);.    if( 
6670: 66 6c 61 67 73 26 45 58 50 52 44 55 50 5f 52 45  flags&EXPRDUP_RE
6680: 44 55 43 45 20 29 7b 0a 20 20 20 20 20 20 6e 42  DUCE ){.      nB
6690: 79 74 65 20 2b 3d 20 64 75 70 65 64 45 78 70 72  yte += dupedExpr
66a0: 53 69 7a 65 28 70 2d 3e 70 4c 65 66 74 2c 20 66  Size(p->pLeft, f
66b0: 6c 61 67 73 29 20 2b 20 64 75 70 65 64 45 78 70  lags) + dupedExp
66c0: 72 53 69 7a 65 28 70 2d 3e 70 52 69 67 68 74 2c  rSize(p->pRight,
66d0: 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 7d 0a 20   flags);.    }. 
66e0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 42 79 74   }.  return nByt
66f0: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  e;.}../*.** This
6700: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 73 69 6d   function is sim
6710: 69 6c 61 72 20 74 6f 20 73 71 6c 69 74 65 33 45  ilar to sqlite3E
6720: 78 70 72 44 75 70 28 29 2c 20 65 78 63 65 70 74  xprDup(), except
6730: 20 74 68 61 74 20 69 66 20 70 7a 42 75 66 66 65   that if pzBuffe
6740: 72 20 0a 2a 2a 20 69 73 20 6e 6f 74 20 4e 55 4c  r .** is not NUL
6750: 4c 20 74 68 65 6e 20 2a 70 7a 42 75 66 66 65 72  L then *pzBuffer
6760: 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20 70   is assumed to p
6770: 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72  oint to a buffer
6780: 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 0a 2a   large enough .*
6790: 2a 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 63  * to store the c
67a0: 6f 70 79 20 6f 66 20 65 78 70 72 65 73 73 69 6f  opy of expressio
67b0: 6e 20 70 2c 20 74 68 65 20 63 6f 70 69 65 73 20  n p, the copies 
67c0: 6f 66 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 0a 2a  of p->u.zToken.*
67d0: 2a 20 28 69 66 20 61 70 70 6c 69 63 61 62 6c 65  * (if applicable
67e0: 29 2c 20 61 6e 64 20 74 68 65 20 63 6f 70 69 65  ), and the copie
67f0: 73 20 6f 66 20 74 68 65 20 70 2d 3e 70 4c 65 66  s of the p->pLef
6800: 74 20 61 6e 64 20 70 2d 3e 70 52 69 67 68 74 20  t and p->pRight 
6810: 65 78 70 72 65 73 73 69 6f 6e 73 2c 0a 2a 2a 20  expressions,.** 
6820: 69 66 20 61 6e 79 2e 20 42 65 66 6f 72 65 20 72  if any. Before r
6830: 65 74 75 72 6e 69 6e 67 2c 20 2a 70 7a 42 75 66  eturning, *pzBuf
6840: 66 65 72 20 69 73 20 73 65 74 20 74 6f 20 74 68  fer is set to th
6850: 65 20 66 69 72 73 74 20 62 79 74 65 20 70 61 73  e first byte pas
6860: 74 20 74 68 65 0a 2a 2a 20 70 6f 72 74 69 6f 6e  t the.** portion
6870: 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 63   of the buffer c
6880: 6f 70 69 65 64 20 69 6e 74 6f 20 62 79 20 74 68  opied into by th
6890: 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  is function..*/.
68a0: 73 74 61 74 69 63 20 45 78 70 72 20 2a 65 78 70  static Expr *exp
68b0: 72 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62  rDup(sqlite3 *db
68c0: 2c 20 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66  , Expr *p, int f
68d0: 6c 61 67 73 2c 20 75 38 20 2a 2a 70 7a 42 75 66  lags, u8 **pzBuf
68e0: 66 65 72 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e  fer){.  Expr *pN
68f0: 65 77 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ew = 0;         
6900: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6910: 56 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20  Value to return 
6920: 2a 2f 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  */.  if( p ){.  
6930: 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 52 65    const int isRe
6940: 64 75 63 65 64 20 3d 20 28 66 6c 61 67 73 26 45  duced = (flags&E
6950: 58 50 52 44 55 50 5f 52 45 44 55 43 45 29 3b 0a  XPRDUP_REDUCE);.
6960: 20 20 20 20 75 38 20 2a 7a 41 6c 6c 6f 63 3b 0a      u8 *zAlloc;.
6970: 20 20 20 20 75 33 32 20 73 74 61 74 69 63 46 6c      u32 staticFl
6980: 61 67 20 3d 20 30 3b 0a 0a 20 20 20 20 61 73 73  ag = 0;..    ass
6990: 65 72 74 28 20 70 7a 42 75 66 66 65 72 3d 3d 30  ert( pzBuffer==0
69a0: 20 7c 7c 20 69 73 52 65 64 75 63 65 64 20 29 3b   || isReduced );
69b0: 0a 0a 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20  ..    /* Figure 
69c0: 6f 75 74 20 77 68 65 72 65 20 74 6f 20 77 72 69  out where to wri
69d0: 74 65 20 74 68 65 20 6e 65 77 20 45 78 70 72 20  te the new Expr 
69e0: 73 74 72 75 63 74 75 72 65 2e 20 2a 2f 0a 20 20  structure. */.  
69f0: 20 20 69 66 28 20 70 7a 42 75 66 66 65 72 20 29    if( pzBuffer )
6a00: 7b 0a 20 20 20 20 20 20 7a 41 6c 6c 6f 63 20 3d  {.      zAlloc =
6a10: 20 2a 70 7a 42 75 66 66 65 72 3b 0a 20 20 20 20   *pzBuffer;.    
6a20: 20 20 73 74 61 74 69 63 46 6c 61 67 20 3d 20 45    staticFlag = E
6a30: 50 5f 53 74 61 74 69 63 3b 0a 20 20 20 20 7d 65  P_Static;.    }e
6a40: 6c 73 65 7b 0a 20 20 20 20 20 20 7a 41 6c 6c 6f  lse{.      zAllo
6a50: 63 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  c = sqlite3DbMal
6a60: 6c 6f 63 52 61 77 28 64 62 2c 20 64 75 70 65 64  locRaw(db, duped
6a70: 45 78 70 72 53 69 7a 65 28 70 2c 20 66 6c 61 67  ExprSize(p, flag
6a80: 73 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  s));.    }.    p
6a90: 4e 65 77 20 3d 20 28 45 78 70 72 20 2a 29 7a 41  New = (Expr *)zA
6aa0: 6c 6c 6f 63 3b 0a 0a 20 20 20 20 69 66 28 20 70  lloc;..    if( p
6ab0: 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  New ){.      /* 
6ac0: 53 65 74 20 6e 4e 65 77 53 69 7a 65 20 74 6f 20  Set nNewSize to 
6ad0: 74 68 65 20 73 69 7a 65 20 61 6c 6c 6f 63 61 74  the size allocat
6ae0: 65 64 20 66 6f 72 20 74 68 65 20 73 74 72 75 63  ed for the struc
6af0: 74 75 72 65 20 70 6f 69 6e 74 65 64 20 74 6f 0a  ture pointed to.
6b00: 20 20 20 20 20 20 2a 2a 20 62 79 20 70 4e 65 77        ** by pNew
6b10: 2e 20 54 68 69 73 20 69 73 20 65 69 74 68 65 72  . This is either
6b20: 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 2c 20   EXPR_FULLSIZE, 
6b30: 45 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45  EXPR_REDUCEDSIZE
6b40: 20 6f 72 0a 20 20 20 20 20 20 2a 2a 20 45 58 50   or.      ** EXP
6b50: 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 2e  R_TOKENONLYSIZE.
6b60: 20 6e 54 6f 6b 65 6e 20 69 73 20 73 65 74 20 74   nToken is set t
6b70: 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  o the number of 
6b80: 62 79 74 65 73 20 63 6f 6e 73 75 6d 65 64 0a 20  bytes consumed. 
6b90: 20 20 20 20 20 2a 2a 20 62 79 20 74 68 65 20 63       ** by the c
6ba0: 6f 70 79 20 6f 66 20 74 68 65 20 70 2d 3e 75 2e  opy of the p->u.
6bb0: 7a 54 6f 6b 65 6e 20 73 74 72 69 6e 67 20 28 69  zToken string (i
6bc0: 66 20 61 6e 79 29 2e 0a 20 20 20 20 20 20 2a 2f  f any)..      */
6bd0: 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 75 6e 73  .      const uns
6be0: 69 67 6e 65 64 20 6e 53 74 72 75 63 74 53 69 7a  igned nStructSiz
6bf0: 65 20 3d 20 64 75 70 65 64 45 78 70 72 53 74 72  e = dupedExprStr
6c00: 75 63 74 53 69 7a 65 28 70 2c 20 66 6c 61 67 73  uctSize(p, flags
6c10: 29 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 69  );.      const i
6c20: 6e 74 20 6e 4e 65 77 53 69 7a 65 20 3d 20 6e 53  nt nNewSize = nS
6c30: 74 72 75 63 74 53 69 7a 65 20 26 20 30 78 66 66  tructSize & 0xff
6c40: 66 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 54 6f  f;.      int nTo
6c50: 6b 65 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 21  ken;.      if( !
6c60: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
6c70: 70 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20  p, EP_IntValue) 
6c80: 26 26 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 29  && p->u.zToken )
6c90: 7b 0a 20 20 20 20 20 20 20 20 6e 54 6f 6b 65 6e  {.        nToken
6ca0: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
6cb0: 33 30 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 20  30(p->u.zToken) 
6cc0: 2b 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  + 1;.      }else
6cd0: 7b 0a 20 20 20 20 20 20 20 20 6e 54 6f 6b 65 6e  {.        nToken
6ce0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
6cf0: 20 20 20 20 69 66 28 20 69 73 52 65 64 75 63 65      if( isReduce
6d00: 64 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  d ){.        ass
6d10: 65 72 74 28 20 45 78 70 72 48 61 73 50 72 6f 70  ert( ExprHasProp
6d20: 65 72 74 79 28 70 2c 20 45 50 5f 52 65 64 75 63  erty(p, EP_Reduc
6d30: 65 64 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ed)==0 );.      
6d40: 20 20 6d 65 6d 63 70 79 28 7a 41 6c 6c 6f 63 2c    memcpy(zAlloc,
6d50: 20 70 2c 20 6e 4e 65 77 53 69 7a 65 29 3b 0a 20   p, nNewSize);. 
6d60: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
6d70: 20 20 20 20 69 6e 74 20 6e 53 69 7a 65 20 3d 20      int nSize = 
6d80: 65 78 70 72 53 74 72 75 63 74 53 69 7a 65 28 70  exprStructSize(p
6d90: 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  );.        memcp
6da0: 79 28 7a 41 6c 6c 6f 63 2c 20 70 2c 20 6e 53 69  y(zAlloc, p, nSi
6db0: 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  ze);.        mem
6dc0: 73 65 74 28 26 7a 41 6c 6c 6f 63 5b 6e 53 69 7a  set(&zAlloc[nSiz
6dd0: 65 5d 2c 20 30 2c 20 45 58 50 52 5f 46 55 4c 4c  e], 0, EXPR_FULL
6de0: 53 49 5a 45 2d 6e 53 69 7a 65 29 3b 0a 20 20 20  SIZE-nSize);.   
6df0: 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 53     }..      /* S
6e00: 65 74 20 74 68 65 20 45 50 5f 52 65 64 75 63 65  et the EP_Reduce
6e10: 64 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 2c  d, EP_TokenOnly,
6e20: 20 61 6e 64 20 45 50 5f 53 74 61 74 69 63 20 66   and EP_Static f
6e30: 6c 61 67 73 20 61 70 70 72 6f 70 72 69 61 74 65  lags appropriate
6e40: 6c 79 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65  ly. */.      pNe
6e50: 77 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 28 45 50  w->flags &= ~(EP
6e60: 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65  _Reduced|EP_Toke
6e70: 6e 4f 6e 6c 79 7c 45 50 5f 53 74 61 74 69 63 7c  nOnly|EP_Static|
6e80: 45 50 5f 4d 65 6d 54 6f 6b 65 6e 29 3b 0a 20 20  EP_MemToken);.  
6e90: 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20      pNew->flags 
6ea0: 7c 3d 20 6e 53 74 72 75 63 74 53 69 7a 65 20 26  |= nStructSize &
6eb0: 20 28 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f   (EP_Reduced|EP_
6ec0: 54 6f 6b 65 6e 4f 6e 6c 79 29 3b 0a 20 20 20 20  TokenOnly);.    
6ed0: 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d    pNew->flags |=
6ee0: 20 73 74 61 74 69 63 46 6c 61 67 3b 0a 0a 20 20   staticFlag;..  
6ef0: 20 20 20 20 2f 2a 20 43 6f 70 79 20 74 68 65 20      /* Copy the 
6f00: 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 73 74 72 69  p->u.zToken stri
6f10: 6e 67 2c 20 69 66 20 61 6e 79 2e 20 2a 2f 0a 20  ng, if any. */. 
6f20: 20 20 20 20 20 69 66 28 20 6e 54 6f 6b 65 6e 20       if( nToken 
6f30: 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
6f40: 2a 7a 54 6f 6b 65 6e 20 3d 20 70 4e 65 77 2d 3e  *zToken = pNew->
6f50: 75 2e 7a 54 6f 6b 65 6e 20 3d 20 28 63 68 61 72  u.zToken = (char
6f60: 2a 29 26 7a 41 6c 6c 6f 63 5b 6e 4e 65 77 53 69  *)&zAlloc[nNewSi
6f70: 7a 65 5d 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  ze];.        mem
6f80: 63 70 79 28 7a 54 6f 6b 65 6e 2c 20 70 2d 3e 75  cpy(zToken, p->u
6f90: 2e 7a 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 29  .zToken, nToken)
6fa0: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
6fb0: 20 69 66 28 20 30 3d 3d 28 28 70 2d 3e 66 6c 61   if( 0==((p->fla
6fc0: 67 73 7c 70 4e 65 77 2d 3e 66 6c 61 67 73 29 20  gs|pNew->flags) 
6fd0: 26 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20  & EP_TokenOnly) 
6fe0: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 69  ){.        /* Fi
6ff0: 6c 6c 20 69 6e 20 74 68 65 20 70 4e 65 77 2d 3e  ll in the pNew->
7000: 78 2e 70 53 65 6c 65 63 74 20 6f 72 20 70 4e 65  x.pSelect or pNe
7010: 77 2d 3e 78 2e 70 4c 69 73 74 20 6d 65 6d 62 65  w->x.pList membe
7020: 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66  r. */.        if
7030: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
7040: 79 28 70 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  y(p, EP_xIsSelec
7050: 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  t) ){.          
7060: 70 4e 65 77 2d 3e 78 2e 70 53 65 6c 65 63 74 20  pNew->x.pSelect 
7070: 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  = sqlite3SelectD
7080: 75 70 28 64 62 2c 20 70 2d 3e 78 2e 70 53 65 6c  up(db, p->x.pSel
7090: 65 63 74 2c 20 69 73 52 65 64 75 63 65 64 29 3b  ect, isReduced);
70a0: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
70b0: 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
70c0: 78 2e 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65  x.pList = sqlite
70d0: 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c  3ExprListDup(db,
70e0: 20 70 2d 3e 78 2e 70 4c 69 73 74 2c 20 69 73 52   p->x.pList, isR
70f0: 65 64 75 63 65 64 29 3b 0a 20 20 20 20 20 20 20  educed);.       
7100: 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20   }.      }..    
7110: 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 70 4e 65    /* Fill in pNe
7120: 77 2d 3e 70 4c 65 66 74 20 61 6e 64 20 70 4e 65  w->pLeft and pNe
7130: 77 2d 3e 70 52 69 67 68 74 2e 20 2a 2f 0a 20 20  w->pRight. */.  
7140: 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50      if( ExprHasP
7150: 72 6f 70 65 72 74 79 28 70 4e 65 77 2c 20 45 50  roperty(pNew, EP
7160: 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65  _Reduced|EP_Toke
7170: 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20  nOnly) ){.      
7180: 20 20 7a 41 6c 6c 6f 63 20 2b 3d 20 64 75 70 65    zAlloc += dupe
7190: 64 45 78 70 72 4e 6f 64 65 53 69 7a 65 28 70 2c  dExprNodeSize(p,
71a0: 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 20   flags);.       
71b0: 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
71c0: 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 52 65  erty(pNew, EP_Re
71d0: 64 75 63 65 64 29 20 29 7b 0a 20 20 20 20 20 20  duced) ){.      
71e0: 20 20 20 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20      pNew->pLeft 
71f0: 3d 20 65 78 70 72 44 75 70 28 64 62 2c 20 70 2d  = exprDup(db, p-
7200: 3e 70 4c 65 66 74 2c 20 45 58 50 52 44 55 50 5f  >pLeft, EXPRDUP_
7210: 52 45 44 55 43 45 2c 20 26 7a 41 6c 6c 6f 63 29  REDUCE, &zAlloc)
7220: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77  ;.          pNew
7230: 2d 3e 70 52 69 67 68 74 20 3d 20 65 78 70 72 44  ->pRight = exprD
7240: 75 70 28 64 62 2c 20 70 2d 3e 70 52 69 67 68 74  up(db, p->pRight
7250: 2c 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 45  , EXPRDUP_REDUCE
7260: 2c 20 26 7a 41 6c 6c 6f 63 29 3b 0a 20 20 20 20  , &zAlloc);.    
7270: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
7280: 28 20 70 7a 42 75 66 66 65 72 20 29 7b 0a 20 20  ( pzBuffer ){.  
7290: 20 20 20 20 20 20 20 20 2a 70 7a 42 75 66 66 65          *pzBuffe
72a0: 72 20 3d 20 7a 41 6c 6c 6f 63 3b 0a 20 20 20 20  r = zAlloc;.    
72b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
72c0: 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  e{.        if( !
72d0: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
72e0: 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29  p, EP_TokenOnly)
72f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e   ){.          pN
7300: 65 77 2d 3e 70 4c 65 66 74 20 3d 20 73 71 6c 69  ew->pLeft = sqli
7310: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
7320: 2d 3e 70 4c 65 66 74 2c 20 30 29 3b 0a 20 20 20  ->pLeft, 0);.   
7330: 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 52 69         pNew->pRi
7340: 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ght = sqlite3Exp
7350: 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 52 69 67  rDup(db, p->pRig
7360: 68 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ht, 0);.        
7370: 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 7d  }.      }..    }
7380: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e  .  }.  return pN
7390: 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65  ew;.}../*.** Cre
73a0: 61 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61  ate and return a
73b0: 20 64 65 65 70 20 63 6f 70 79 20 6f 66 20 74 68   deep copy of th
73c0: 65 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20  e object passed 
73d0: 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 0a 2a  as the second .*
73e0: 2a 20 61 72 67 75 6d 65 6e 74 2e 20 49 66 20 61  * argument. If a
73f0: 6e 20 4f 4f 4d 20 63 6f 6e 64 69 74 69 6f 6e 20  n OOM condition 
7400: 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20  is encountered, 
7410: 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64  NULL is returned
7420: 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 62 2d 3e  .** and the db->
7430: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61  mallocFailed fla
7440: 67 20 73 65 74 2e 0a 2a 2f 0a 23 69 66 6e 64 65  g set..*/.#ifnde
7450: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54  f SQLITE_OMIT_CT
7460: 45 0a 73 74 61 74 69 63 20 57 69 74 68 20 2a 77  E.static With *w
7470: 69 74 68 44 75 70 28 73 71 6c 69 74 65 33 20 2a  ithDup(sqlite3 *
7480: 64 62 2c 20 57 69 74 68 20 2a 70 29 7b 0a 20 20  db, With *p){.  
7490: 57 69 74 68 20 2a 70 52 65 74 20 3d 20 30 3b 0a  With *pRet = 0;.
74a0: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69    if( p ){.    i
74b0: 6e 74 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f  nt nByte = sizeo
74c0: 66 28 2a 70 29 20 2b 20 73 69 7a 65 6f 66 28 70  f(*p) + sizeof(p
74d0: 2d 3e 61 5b 30 5d 29 20 2a 20 28 70 2d 3e 6e 43  ->a[0]) * (p->nC
74e0: 74 65 2d 31 29 3b 0a 20 20 20 20 70 52 65 74 20  te-1);.    pRet 
74f0: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
7500: 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74 65 29  cZero(db, nByte)
7510: 3b 0a 20 20 20 20 69 66 28 20 70 52 65 74 20 29  ;.    if( pRet )
7520: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  {.      int i;. 
7530: 20 20 20 20 20 70 52 65 74 2d 3e 6e 43 74 65 20       pRet->nCte 
7540: 3d 20 70 2d 3e 6e 43 74 65 3b 0a 20 20 20 20 20  = p->nCte;.     
7550: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
7560: 43 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Cte; i++){.     
7570: 20 20 20 70 52 65 74 2d 3e 61 5b 69 5d 2e 70 53     pRet->a[i].pS
7580: 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53  elect = sqlite3S
7590: 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 2d 3e  electDup(db, p->
75a0: 61 5b 69 5d 2e 70 53 65 6c 65 63 74 2c 20 30 29  a[i].pSelect, 0)
75b0: 3b 0a 20 20 20 20 20 20 20 20 70 52 65 74 2d 3e  ;.        pRet->
75c0: 61 5b 69 5d 2e 70 43 6f 6c 73 20 3d 20 73 71 6c  a[i].pCols = sql
75d0: 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
75e0: 64 62 2c 20 70 2d 3e 61 5b 69 5d 2e 70 43 6f 6c  db, p->a[i].pCol
75f0: 73 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70  s, 0);.        p
7600: 52 65 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20  Ret->a[i].zName 
7610: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
7620: 70 28 64 62 2c 20 70 2d 3e 61 5b 69 5d 2e 7a 4e  p(db, p->a[i].zN
7630: 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ame);.      }.  
7640: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
7650: 20 70 52 65 74 3b 0a 7d 0a 23 65 6c 73 65 0a 23   pRet;.}.#else.#
7660: 20 64 65 66 69 6e 65 20 77 69 74 68 44 75 70 28   define withDup(
7670: 78 2c 79 29 20 30 0a 23 65 6e 64 69 66 0a 0a 2f  x,y) 0.#endif../
7680: 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
7690: 6e 67 20 67 72 6f 75 70 20 6f 66 20 72 6f 75 74  ng group of rout
76a0: 69 6e 65 73 20 6d 61 6b 65 20 64 65 65 70 20 63  ines make deep c
76b0: 6f 70 69 65 73 20 6f 66 20 65 78 70 72 65 73 73  opies of express
76c0: 69 6f 6e 73 2c 0a 2a 2a 20 65 78 70 72 65 73 73  ions,.** express
76d0: 69 6f 6e 20 6c 69 73 74 73 2c 20 49 44 20 6c 69  ion lists, ID li
76e0: 73 74 73 2c 20 61 6e 64 20 73 65 6c 65 63 74 20  sts, and select 
76f0: 73 74 61 74 65 6d 65 6e 74 73 2e 20 20 54 68 65  statements.  The
7700: 20 63 6f 70 69 65 73 20 63 61 6e 0a 2a 2a 20 62   copies can.** b
7710: 65 20 64 65 6c 65 74 65 64 20 28 62 79 20 62 65  e deleted (by be
7720: 69 6e 67 20 70 61 73 73 65 64 20 74 6f 20 74 68  ing passed to th
7730: 65 69 72 20 72 65 73 70 65 63 74 69 76 65 20 2e  eir respective .
7740: 2e 2e 44 65 6c 65 74 65 28 29 20 72 6f 75 74 69  ..Delete() routi
7750: 6e 65 73 29 0a 2a 2a 20 77 69 74 68 6f 75 74 20  nes).** without 
7760: 65 66 66 65 63 74 69 6e 67 20 74 68 65 20 6f 72  effecting the or
7770: 69 67 69 6e 61 6c 73 2e 0a 2a 2a 0a 2a 2a 20 54  iginals..**.** T
7780: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  he expression li
7790: 73 74 2c 20 49 44 2c 20 61 6e 64 20 73 6f 75 72  st, ID, and sour
77a0: 63 65 20 6c 69 73 74 73 20 72 65 74 75 72 6e 20  ce lists return 
77b0: 62 79 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  by sqlite3ExprLi
77c0: 73 74 44 75 70 28 29 2c 0a 2a 2a 20 73 71 6c 69  stDup(),.** sqli
77d0: 74 65 33 49 64 4c 69 73 74 44 75 70 28 29 2c 20  te3IdListDup(), 
77e0: 61 6e 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69  and sqlite3SrcLi
77f0: 73 74 44 75 70 28 29 20 63 61 6e 20 6e 6f 74 20  stDup() can not 
7800: 62 65 20 66 75 72 74 68 65 72 20 65 78 70 61 6e  be further expan
7810: 64 65 64 20 0a 2a 2a 20 62 79 20 73 75 62 73 65  ded .** by subse
7820: 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20 73  quent calls to s
7830: 71 6c 69 74 65 2a 4c 69 73 74 41 70 70 65 6e 64  qlite*ListAppend
7840: 28 29 20 72 6f 75 74 69 6e 65 73 2e 0a 2a 2a 0a  () routines..**.
7850: 2a 2a 20 41 6e 79 20 74 61 62 6c 65 73 20 74 68  ** Any tables th
7860: 61 74 20 74 68 65 20 53 72 63 4c 69 73 74 20 6d  at the SrcList m
7870: 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 61 72  ight point to ar
7880: 65 20 6e 6f 74 20 64 75 70 6c 69 63 61 74 65 64  e not duplicated
7890: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c 61 67  ..**.** The flag
78a0: 73 20 70 61 72 61 6d 65 74 65 72 20 63 6f 6e 74  s parameter cont
78b0: 61 69 6e 73 20 61 20 63 6f 6d 62 69 6e 61 74 69  ains a combinati
78c0: 6f 6e 20 6f 66 20 74 68 65 20 45 58 50 52 44 55  on of the EXPRDU
78d0: 50 5f 58 58 58 20 66 6c 61 67 73 2e 0a 2a 2a 20  P_XXX flags..** 
78e0: 49 66 20 74 68 65 20 45 58 50 52 44 55 50 5f 52  If the EXPRDUP_R
78f0: 45 44 55 43 45 20 66 6c 61 67 20 69 73 20 73 65  EDUCE flag is se
7900: 74 2c 20 74 68 65 6e 20 74 68 65 20 73 74 72 75  t, then the stru
7910: 63 74 75 72 65 20 72 65 74 75 72 6e 65 64 20 69  cture returned i
7920: 73 20 61 0a 2a 2a 20 74 72 75 6e 63 61 74 65 64  s a.** truncated
7930: 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20   version of the 
7940: 75 73 75 61 6c 20 45 78 70 72 20 73 74 72 75 63  usual Expr struc
7950: 74 75 72 65 20 74 68 61 74 20 77 69 6c 6c 20 62  ture that will b
7960: 65 20 73 74 6f 72 65 64 20 61 73 0a 2a 2a 20 70  e stored as.** p
7970: 61 72 74 20 6f 66 20 74 68 65 20 69 6e 2d 6d 65  art of the in-me
7980: 6d 6f 72 79 20 72 65 70 72 65 73 65 6e 74 61 74  mory representat
7990: 69 6f 6e 20 6f 66 20 74 68 65 20 64 61 74 61 62  ion of the datab
79a0: 61 73 65 20 73 63 68 65 6d 61 2e 0a 2a 2f 0a 45  ase schema..*/.E
79b0: 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72  xpr *sqlite3Expr
79c0: 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  Dup(sqlite3 *db,
79d0: 20 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c   Expr *p, int fl
79e0: 61 67 73 29 7b 0a 20 20 72 65 74 75 72 6e 20 65  ags){.  return e
79f0: 78 70 72 44 75 70 28 64 62 2c 20 70 2c 20 66 6c  xprDup(db, p, fl
7a00: 61 67 73 2c 20 30 29 3b 0a 7d 0a 45 78 70 72 4c  ags, 0);.}.ExprL
7a10: 69 73 74 20 2a 73 71 6c 69 74 65 33 45 78 70 72  ist *sqlite3Expr
7a20: 4c 69 73 74 44 75 70 28 73 71 6c 69 74 65 33 20  ListDup(sqlite3 
7a30: 2a 64 62 2c 20 45 78 70 72 4c 69 73 74 20 2a 70  *db, ExprList *p
7a40: 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20  , int flags){.  
7a50: 45 78 70 72 4c 69 73 74 20 2a 70 4e 65 77 3b 0a  ExprList *pNew;.
7a60: 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
7a70: 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 2c 20 2a  t_item *pItem, *
7a80: 70 4f 6c 64 49 74 65 6d 3b 0a 20 20 69 6e 74 20  pOldItem;.  int 
7a90: 69 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  i;.  if( p==0 ) 
7aa0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77  return 0;.  pNew
7ab0: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
7ac0: 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66  ocRaw(db, sizeof
7ad0: 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20 69 66 28  (*pNew) );.  if(
7ae0: 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72   pNew==0 ) retur
7af0: 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e 45 78  n 0;.  pNew->nEx
7b00: 70 72 20 3d 20 69 20 3d 20 70 2d 3e 6e 45 78 70  pr = i = p->nExp
7b10: 72 3b 0a 20 20 69 66 28 20 28 66 6c 61 67 73 20  r;.  if( (flags 
7b20: 26 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 45  & EXPRDUP_REDUCE
7b30: 29 3d 3d 30 20 29 20 66 6f 72 28 69 3d 31 3b 20  )==0 ) for(i=1; 
7b40: 69 3c 70 2d 3e 6e 45 78 70 72 3b 20 69 2b 3d 69  i<p->nExpr; i+=i
7b50: 29 7b 7d 0a 20 20 70 4e 65 77 2d 3e 61 20 3d 20  ){}.  pNew->a = 
7b60: 70 49 74 65 6d 20 3d 20 73 71 6c 69 74 65 33 44  pItem = sqlite3D
7b70: 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 20  bMallocRaw(db,  
7b80: 69 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d  i*sizeof(p->a[0]
7b90: 29 20 29 3b 0a 20 20 69 66 28 20 70 49 74 65 6d  ) );.  if( pItem
7ba0: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
7bb0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4e 65  e3DbFree(db, pNe
7bc0: 77 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  w);.    return 0
7bd0: 3b 0a 20 20 7d 20 0a 20 20 70 4f 6c 64 49 74 65  ;.  } .  pOldIte
7be0: 6d 20 3d 20 70 2d 3e 61 3b 0a 20 20 66 6f 72 28  m = p->a;.  for(
7bf0: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 45 78 70 72 3b  i=0; i<p->nExpr;
7c00: 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 2c 20 70   i++, pItem++, p
7c10: 4f 6c 64 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  OldItem++){.    
7c20: 45 78 70 72 20 2a 70 4f 6c 64 45 78 70 72 20 3d  Expr *pOldExpr =
7c30: 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 45 78 70 72   pOldItem->pExpr
7c40: 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 70 45 78  ;.    pItem->pEx
7c50: 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pr = sqlite3Expr
7c60: 44 75 70 28 64 62 2c 20 70 4f 6c 64 45 78 70 72  Dup(db, pOldExpr
7c70: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 49  , flags);.    pI
7c80: 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c  tem->zName = sql
7c90: 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
7ca0: 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65   pOldItem->zName
7cb0: 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 53  );.    pItem->zS
7cc0: 70 61 6e 20 3d 20 73 71 6c 69 74 65 33 44 62 53  pan = sqlite3DbS
7cd0: 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74  trDup(db, pOldIt
7ce0: 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a 20 20 20 20  em->zSpan);.    
7cf0: 70 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72  pItem->sortOrder
7d00: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 73 6f 72   = pOldItem->sor
7d10: 74 4f 72 64 65 72 3b 0a 20 20 20 20 70 49 74 65  tOrder;.    pIte
7d20: 6d 2d 3e 64 6f 6e 65 20 3d 20 30 3b 0a 20 20 20  m->done = 0;.   
7d30: 20 70 49 74 65 6d 2d 3e 62 53 70 61 6e 49 73 54   pItem->bSpanIsT
7d40: 61 62 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 62  ab = pOldItem->b
7d50: 53 70 61 6e 49 73 54 61 62 3b 0a 20 20 20 20 70  SpanIsTab;.    p
7d60: 49 74 65 6d 2d 3e 75 20 3d 20 70 4f 6c 64 49 74  Item->u = pOldIt
7d70: 65 6d 2d 3e 75 3b 0a 20 20 7d 0a 20 20 72 65 74  em->u;.  }.  ret
7d80: 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a  urn pNew;.}../*.
7d90: 2a 2a 20 49 66 20 63 75 72 73 6f 72 73 2c 20 74  ** If cursors, t
7da0: 72 69 67 67 65 72 73 2c 20 76 69 65 77 73 20 61  riggers, views a
7db0: 6e 64 20 73 75 62 71 75 65 72 69 65 73 20 61 72  nd subqueries ar
7dc0: 65 20 61 6c 6c 20 6f 6d 69 74 74 65 64 20 66 72  e all omitted fr
7dd0: 6f 6d 0a 2a 2a 20 74 68 65 20 62 75 69 6c 64 2c  om.** the build,
7de0: 20 74 68 65 6e 20 6e 6f 6e 65 20 6f 66 20 74 68   then none of th
7df0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74  e following rout
7e00: 69 6e 65 73 2c 20 65 78 63 65 70 74 20 66 6f 72  ines, except for
7e10: 20 0a 2a 2a 20 73 71 6c 69 74 65 33 53 65 6c 65   .** sqlite3Sele
7e20: 63 74 44 75 70 28 29 2c 20 63 61 6e 20 62 65 20  ctDup(), can be 
7e30: 63 61 6c 6c 65 64 2e 20 73 71 6c 69 74 65 33 53  called. sqlite3S
7e40: 65 6c 65 63 74 44 75 70 28 29 20 69 73 20 73 6f  electDup() is so
7e50: 6d 65 74 69 6d 65 73 0a 2a 2a 20 63 61 6c 6c 65  metimes.** calle
7e60: 64 20 77 69 74 68 20 61 20 4e 55 4c 4c 20 61 72  d with a NULL ar
7e70: 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 23 69 66 20 21  gument..*/.#if !
7e80: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
7e90: 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65  MIT_VIEW) || !de
7ea0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
7eb0: 54 5f 54 52 49 47 47 45 52 29 20 5c 0a 20 7c 7c  T_TRIGGER) \. ||
7ec0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
7ed0: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 0a  _OMIT_SUBQUERY).
7ee0: 53 72 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 33  SrcList *sqlite3
7ef0: 53 72 63 4c 69 73 74 44 75 70 28 73 71 6c 69 74  SrcListDup(sqlit
7f00: 65 33 20 2a 64 62 2c 20 53 72 63 4c 69 73 74 20  e3 *db, SrcList 
7f10: 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a  *p, int flags){.
7f20: 20 20 53 72 63 4c 69 73 74 20 2a 70 4e 65 77 3b    SrcList *pNew;
7f30: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
7f40: 6e 42 79 74 65 3b 0a 20 20 69 66 28 20 70 3d 3d  nByte;.  if( p==
7f50: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
7f60: 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a  nByte = sizeof(*
7f70: 70 29 20 2b 20 28 70 2d 3e 6e 53 72 63 3e 30 20  p) + (p->nSrc>0 
7f80: 3f 20 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d  ? sizeof(p->a[0]
7f90: 29 20 2a 20 28 70 2d 3e 6e 53 72 63 2d 31 29 20  ) * (p->nSrc-1) 
7fa0: 3a 20 30 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73  : 0);.  pNew = s
7fb0: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
7fc0: 77 28 64 62 2c 20 6e 42 79 74 65 20 29 3b 0a 20  w(db, nByte );. 
7fd0: 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72   if( pNew==0 ) r
7fe0: 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d  eturn 0;.  pNew-
7ff0: 3e 6e 53 72 63 20 3d 20 70 4e 65 77 2d 3e 6e 41  >nSrc = pNew->nA
8000: 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 53 72 63 3b 0a  lloc = p->nSrc;.
8010: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
8020: 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nSrc; i++){.    
8030: 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
8040: 74 65 6d 20 2a 70 4e 65 77 49 74 65 6d 20 3d 20  tem *pNewItem = 
8050: 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b 0a 20 20 20  &pNew->a[i];.   
8060: 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
8070: 69 74 65 6d 20 2a 70 4f 6c 64 49 74 65 6d 20 3d  item *pOldItem =
8080: 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 54   &p->a[i];.    T
8090: 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20  able *pTab;.    
80a0: 70 4e 65 77 49 74 65 6d 2d 3e 70 53 63 68 65 6d  pNewItem->pSchem
80b0: 61 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 53  a = pOldItem->pS
80c0: 63 68 65 6d 61 3b 0a 20 20 20 20 70 4e 65 77 49  chema;.    pNewI
80d0: 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d  tem->zDatabase =
80e0: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
80f0: 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a  (db, pOldItem->z
8100: 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20 70  Database);.    p
8110: 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d  NewItem->zName =
8120: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
8130: 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a  (db, pOldItem->z
8140: 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77 49  Name);.    pNewI
8150: 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 73 71  tem->zAlias = sq
8160: 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
8170: 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 41 6c 69  , pOldItem->zAli
8180: 61 73 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  as);.    pNewIte
8190: 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20 3d 20 70 4f  m->jointype = pO
81a0: 6c 64 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65  ldItem->jointype
81b0: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
81c0: 69 43 75 72 73 6f 72 20 3d 20 70 4f 6c 64 49 74  iCursor = pOldIt
81d0: 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20  em->iCursor;.   
81e0: 20 70 4e 65 77 49 74 65 6d 2d 3e 61 64 64 72 46   pNewItem->addrF
81f0: 69 6c 6c 53 75 62 20 3d 20 70 4f 6c 64 49 74 65  illSub = pOldIte
8200: 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 3b 0a  m->addrFillSub;.
8210: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 72 65      pNewItem->re
8220: 67 52 65 74 75 72 6e 20 3d 20 70 4f 6c 64 49 74  gReturn = pOldIt
8230: 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 3b 0a 20  em->regReturn;. 
8240: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 69 73 43     pNewItem->isC
8250: 6f 72 72 65 6c 61 74 65 64 20 3d 20 70 4f 6c 64  orrelated = pOld
8260: 49 74 65 6d 2d 3e 69 73 43 6f 72 72 65 6c 61 74  Item->isCorrelat
8270: 65 64 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  ed;.    pNewItem
8280: 2d 3e 76 69 61 43 6f 72 6f 75 74 69 6e 65 20 3d  ->viaCoroutine =
8290: 20 70 4f 6c 64 49 74 65 6d 2d 3e 76 69 61 43 6f   pOldItem->viaCo
82a0: 72 6f 75 74 69 6e 65 3b 0a 20 20 20 20 70 4e 65  routine;.    pNe
82b0: 77 49 74 65 6d 2d 3e 69 73 52 65 63 75 72 73 69  wItem->isRecursi
82c0: 76 65 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69  ve = pOldItem->i
82d0: 73 52 65 63 75 72 73 69 76 65 3b 0a 20 20 20 20  sRecursive;.    
82e0: 70 4e 65 77 49 74 65 6d 2d 3e 7a 49 6e 64 65 78  pNewItem->zIndex
82f0: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
8300: 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d  up(db, pOldItem-
8310: 3e 7a 49 6e 64 65 78 29 3b 0a 20 20 20 20 70 4e  >zIndex);.    pN
8320: 65 77 49 74 65 6d 2d 3e 6e 6f 74 49 6e 64 65 78  ewItem->notIndex
8330: 65 64 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 6e  ed = pOldItem->n
8340: 6f 74 49 6e 64 65 78 65 64 3b 0a 20 20 20 20 70  otIndexed;.    p
8350: 4e 65 77 49 74 65 6d 2d 3e 70 49 6e 64 65 78 20  NewItem->pIndex 
8360: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 49 6e 64  = pOldItem->pInd
8370: 65 78 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 70  ex;.    pTab = p
8380: 4e 65 77 49 74 65 6d 2d 3e 70 54 61 62 20 3d 20  NewItem->pTab = 
8390: 70 4f 6c 64 49 74 65 6d 2d 3e 70 54 61 62 3b 0a  pOldItem->pTab;.
83a0: 20 20 20 20 69 66 28 20 70 54 61 62 20 29 7b 0a      if( pTab ){.
83b0: 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 52 65 66        pTab->nRef
83c0: 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e  ++;.    }.    pN
83d0: 65 77 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20  ewItem->pSelect 
83e0: 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  = sqlite3SelectD
83f0: 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d  up(db, pOldItem-
8400: 3e 70 53 65 6c 65 63 74 2c 20 66 6c 61 67 73 29  >pSelect, flags)
8410: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
8420: 70 4f 6e 20 3d 20 73 71 6c 69 74 65 33 45 78 70  pOn = sqlite3Exp
8430: 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65  rDup(db, pOldIte
8440: 6d 2d 3e 70 4f 6e 2c 20 66 6c 61 67 73 29 3b 0a  m->pOn, flags);.
8450: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 55      pNewItem->pU
8460: 73 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 49 64  sing = sqlite3Id
8470: 4c 69 73 74 44 75 70 28 64 62 2c 20 70 4f 6c 64  ListDup(db, pOld
8480: 49 74 65 6d 2d 3e 70 55 73 69 6e 67 29 3b 0a 20  Item->pUsing);. 
8490: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 63 6f 6c     pNewItem->col
84a0: 55 73 65 64 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  Used = pOldItem-
84b0: 3e 63 6f 6c 55 73 65 64 3b 0a 20 20 7d 0a 20 20  >colUsed;.  }.  
84c0: 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 49  return pNew;.}.I
84d0: 64 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 49 64  dList *sqlite3Id
84e0: 4c 69 73 74 44 75 70 28 73 71 6c 69 74 65 33 20  ListDup(sqlite3 
84f0: 2a 64 62 2c 20 49 64 4c 69 73 74 20 2a 70 29 7b  *db, IdList *p){
8500: 0a 20 20 49 64 4c 69 73 74 20 2a 70 4e 65 77 3b  .  IdList *pNew;
8510: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
8520: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  p==0 ) return 0;
8530: 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  .  pNew = sqlite
8540: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c  3DbMallocRaw(db,
8550: 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29   sizeof(*pNew) )
8560: 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20  ;.  if( pNew==0 
8570: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e  ) return 0;.  pN
8580: 65 77 2d 3e 6e 49 64 20 3d 20 70 2d 3e 6e 49 64  ew->nId = p->nId
8590: 3b 0a 20 20 70 4e 65 77 2d 3e 61 20 3d 20 73 71  ;.  pNew->a = sq
85a0: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
85b0: 28 64 62 2c 20 70 2d 3e 6e 49 64 2a 73 69 7a 65  (db, p->nId*size
85c0: 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20  of(p->a[0]) );. 
85d0: 20 69 66 28 20 70 4e 65 77 2d 3e 61 3d 3d 30 20   if( pNew->a==0 
85e0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  ){.    sqlite3Db
85f0: 46 72 65 65 28 64 62 2c 20 70 4e 65 77 29 3b 0a  Free(db, pNew);.
8600: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
8610: 7d 0a 20 20 2f 2a 20 4e 6f 74 65 20 74 68 61 74  }.  /* Note that
8620: 20 62 65 63 61 75 73 65 20 74 68 65 20 73 69 7a   because the siz
8630: 65 20 6f 66 20 74 68 65 20 61 6c 6c 6f 63 61 74  e of the allocat
8640: 69 6f 6e 20 66 6f 72 20 70 2d 3e 61 5b 5d 20 69  ion for p->a[] i
8650: 73 20 6e 6f 74 0a 20 20 2a 2a 20 6e 65 63 65 73  s not.  ** neces
8660: 73 61 72 69 6c 79 20 61 20 70 6f 77 65 72 20 6f  sarily a power o
8670: 66 20 74 77 6f 2c 20 73 71 6c 69 74 65 33 49 64  f two, sqlite3Id
8680: 4c 69 73 74 41 70 70 65 6e 64 28 29 20 6d 61 79  ListAppend() may
8690: 20 6e 6f 74 20 62 65 20 63 61 6c 6c 65 64 0a 20   not be called. 
86a0: 20 2a 2a 20 6f 6e 20 74 68 65 20 64 75 70 6c 69   ** on the dupli
86b0: 63 61 74 65 20 63 72 65 61 74 65 64 20 62 79 20  cate created by 
86c0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 2a  this function. *
86d0: 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  /.  for(i=0; i<p
86e0: 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nId; i++){.   
86f0: 20 73 74 72 75 63 74 20 49 64 4c 69 73 74 5f 69   struct IdList_i
8700: 74 65 6d 20 2a 70 4e 65 77 49 74 65 6d 20 3d 20  tem *pNewItem = 
8710: 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b 0a 20 20 20  &pNew->a[i];.   
8720: 20 73 74 72 75 63 74 20 49 64 4c 69 73 74 5f 69   struct IdList_i
8730: 74 65 6d 20 2a 70 4f 6c 64 49 74 65 6d 20 3d 20  tem *pOldItem = 
8740: 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 70 4e  &p->a[i];.    pN
8750: 65 77 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20  ewItem->zName = 
8760: 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
8770: 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e  db, pOldItem->zN
8780: 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77 49 74  ame);.    pNewIt
8790: 65 6d 2d 3e 69 64 78 20 3d 20 70 4f 6c 64 49 74  em->idx = pOldIt
87a0: 65 6d 2d 3e 69 64 78 3b 0a 20 20 7d 0a 20 20 72  em->idx;.  }.  r
87b0: 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 53 65  eturn pNew;.}.Se
87c0: 6c 65 63 74 20 2a 73 71 6c 69 74 65 33 53 65 6c  lect *sqlite3Sel
87d0: 65 63 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a  ectDup(sqlite3 *
87e0: 64 62 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69  db, Select *p, i
87f0: 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 53 65 6c  nt flags){.  Sel
8800: 65 63 74 20 2a 70 4e 65 77 2c 20 2a 70 50 72 69  ect *pNew, *pPri
8810: 6f 72 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29  or;.  if( p==0 )
8820: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65   return 0;.  pNe
8830: 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  w = sqlite3DbMal
8840: 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f  locRaw(db, sizeo
8850: 66 28 2a 70 29 20 29 3b 0a 20 20 69 66 28 20 70  f(*p) );.  if( p
8860: 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  New==0 ) return 
8870: 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 45 4c 69 73  0;.  pNew->pELis
8880: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  t = sqlite3ExprL
8890: 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 45  istDup(db, p->pE
88a0: 4c 69 73 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20  List, flags);.  
88b0: 70 4e 65 77 2d 3e 70 53 72 63 20 3d 20 73 71 6c  pNew->pSrc = sql
88c0: 69 74 65 33 53 72 63 4c 69 73 74 44 75 70 28 64  ite3SrcListDup(d
88d0: 62 2c 20 70 2d 3e 70 53 72 63 2c 20 66 6c 61 67  b, p->pSrc, flag
88e0: 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 57 68 65  s);.  pNew->pWhe
88f0: 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  re = sqlite3Expr
8900: 44 75 70 28 64 62 2c 20 70 2d 3e 70 57 68 65 72  Dup(db, p->pWher
8910: 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65  e, flags);.  pNe
8920: 77 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71  w->pGroupBy = sq
8930: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
8940: 28 64 62 2c 20 70 2d 3e 70 47 72 6f 75 70 42 79  (db, p->pGroupBy
8950: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77  , flags);.  pNew
8960: 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 71 6c 69  ->pHaving = sqli
8970: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
8980: 2d 3e 70 48 61 76 69 6e 67 2c 20 66 6c 61 67 73  ->pHaving, flags
8990: 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65  );.  pNew->pOrde
89a0: 72 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70  rBy = sqlite3Exp
89b0: 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e  rListDup(db, p->
89c0: 70 4f 72 64 65 72 42 79 2c 20 66 6c 61 67 73 29  pOrderBy, flags)
89d0: 3b 0a 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 70  ;.  pNew->op = p
89e0: 2d 3e 6f 70 3b 0a 20 20 70 4e 65 77 2d 3e 70 50  ->op;.  pNew->pP
89f0: 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 20 3d 20  rior = pPrior = 
8a00: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70  sqlite3SelectDup
8a10: 28 64 62 2c 20 70 2d 3e 70 50 72 69 6f 72 2c 20  (db, p->pPrior, 
8a20: 66 6c 61 67 73 29 3b 0a 20 20 69 66 28 20 70 50  flags);.  if( pP
8a30: 72 69 6f 72 20 29 20 70 50 72 69 6f 72 2d 3e 70  rior ) pPrior->p
8a40: 4e 65 78 74 20 3d 20 70 4e 65 77 3b 0a 20 20 70  Next = pNew;.  p
8a50: 4e 65 77 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a  New->pNext = 0;.
8a60: 20 20 70 4e 65 77 2d 3e 70 4c 69 6d 69 74 20 3d    pNew->pLimit =
8a70: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
8a80: 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 2c 20 66  db, p->pLimit, f
8a90: 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 70  lags);.  pNew->p
8aa0: 4f 66 66 73 65 74 20 3d 20 73 71 6c 69 74 65 33  Offset = sqlite3
8ab0: 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70  ExprDup(db, p->p
8ac0: 4f 66 66 73 65 74 2c 20 66 6c 61 67 73 29 3b 0a  Offset, flags);.
8ad0: 20 20 70 4e 65 77 2d 3e 69 4c 69 6d 69 74 20 3d    pNew->iLimit =
8ae0: 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 69 4f 66 66   0;.  pNew->iOff
8af0: 73 65 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d  set = 0;.  pNew-
8b00: 3e 73 65 6c 46 6c 61 67 73 20 3d 20 70 2d 3e 73  >selFlags = p->s
8b10: 65 6c 46 6c 61 67 73 20 26 20 7e 53 46 5f 55 73  elFlags & ~SF_Us
8b20: 65 73 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20 70  esEphemeral;.  p
8b30: 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68  New->addrOpenEph
8b40: 6d 5b 30 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e 65  m[0] = -1;.  pNe
8b50: 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  w->addrOpenEphm[
8b60: 31 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d  1] = -1;.  pNew-
8b70: 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 70 2d  >nSelectRow = p-
8b80: 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 70  >nSelectRow;.  p
8b90: 4e 65 77 2d 3e 70 57 69 74 68 20 3d 20 77 69 74  New->pWith = wit
8ba0: 68 44 75 70 28 64 62 2c 20 70 2d 3e 70 57 69 74  hDup(db, p->pWit
8bb0: 68 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c  h);.  sqlite3Sel
8bc0: 65 63 74 53 65 74 4e 61 6d 65 28 70 4e 65 77 2c  ectSetName(pNew,
8bd0: 20 70 2d 3e 7a 53 65 6c 4e 61 6d 65 29 3b 0a 20   p->zSelName);. 
8be0: 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a   return pNew;.}.
8bf0: 23 65 6c 73 65 0a 53 65 6c 65 63 74 20 2a 73 71  #else.Select *sq
8c00: 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 73  lite3SelectDup(s
8c10: 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 65 6c 65  qlite3 *db, Sele
8c20: 63 74 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73  ct *p, int flags
8c30: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 3d 3d  ){.  assert( p==
8c40: 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b  0 );.  return 0;
8c50: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  .}.#endif.../*.*
8c60: 2a 20 41 64 64 20 61 20 6e 65 77 20 65 6c 65 6d  * Add a new elem
8c70: 65 6e 74 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  ent to the end o
8c80: 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  f an expression 
8c90: 6c 69 73 74 2e 20 20 49 66 20 70 4c 69 73 74 20  list.  If pList 
8ca0: 69 73 0a 2a 2a 20 69 6e 69 74 69 61 6c 6c 79 20  is.** initially 
8cb0: 4e 55 4c 4c 2c 20 74 68 65 6e 20 63 72 65 61 74  NULL, then creat
8cc0: 65 20 61 20 6e 65 77 20 65 78 70 72 65 73 73 69  e a new expressi
8cd0: 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49  on list..**.** I
8ce0: 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  f a memory alloc
8cf0: 61 74 69 6f 6e 20 65 72 72 6f 72 20 6f 63 63 75  ation error occu
8d00: 72 73 2c 20 74 68 65 20 65 6e 74 69 72 65 20 6c  rs, the entire l
8d10: 69 73 74 20 69 73 20 66 72 65 65 64 20 61 6e 64  ist is freed and
8d20: 0a 2a 2a 20 4e 55 4c 4c 20 69 73 20 72 65 74 75  .** NULL is retu
8d30: 72 6e 65 64 2e 20 20 49 66 20 6e 6f 6e 2d 4e 55  rned.  If non-NU
8d40: 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20  LL is returned, 
8d50: 74 68 65 6e 20 69 74 20 69 73 20 67 75 61 72 61  then it is guara
8d60: 6e 74 65 65 64 0a 2a 2a 20 74 68 61 74 20 74 68  nteed.** that th
8d70: 65 20 6e 65 77 20 65 6e 74 72 79 20 77 61 73 20  e new entry was 
8d80: 73 75 63 63 65 73 73 66 75 6c 6c 79 20 61 70 70  successfully app
8d90: 65 6e 64 65 64 2e 0a 2a 2f 0a 45 78 70 72 4c 69  ended..*/.ExprLi
8da0: 73 74 20 2a 73 71 6c 69 74 65 33 45 78 70 72 4c  st *sqlite3ExprL
8db0: 69 73 74 41 70 70 65 6e 64 28 0a 20 20 50 61 72  istAppend(.  Par
8dc0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
8dd0: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
8de0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
8df0: 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20  rList *pList,   
8e00: 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20       /* List to 
8e10: 77 68 69 63 68 20 74 6f 20 61 70 70 65 6e 64 2e  which to append.
8e20: 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a   Might be NULL *
8e30: 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 20  /.  Expr *pExpr 
8e40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
8e50: 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 62 65 20  xpression to be 
8e60: 61 70 70 65 6e 64 65 64 2e 20 4d 69 67 68 74 20  appended. Might 
8e70: 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20  be NULL */.){.  
8e80: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
8e90: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20  arse->db;.  if( 
8ea0: 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pList==0 ){.    
8eb0: 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 44  pList = sqlite3D
8ec0: 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
8ed0: 73 69 7a 65 6f 66 28 45 78 70 72 4c 69 73 74 29  sizeof(ExprList)
8ee0: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73   );.    if( pLis
8ef0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f  t==0 ){.      go
8f00: 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 7d  to no_mem;.    }
8f10: 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 20 3d 20  .    pList->a = 
8f20: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
8f30: 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 70 4c  aw(db, sizeof(pL
8f40: 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 20  ist->a[0]));.   
8f50: 20 69 66 28 20 70 4c 69 73 74 2d 3e 61 3d 3d 30   if( pList->a==0
8f60: 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a   ) goto no_mem;.
8f70: 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 4c 69    }else if( (pLi
8f80: 73 74 2d 3e 6e 45 78 70 72 20 26 20 28 70 4c 69  st->nExpr & (pLi
8f90: 73 74 2d 3e 6e 45 78 70 72 2d 31 29 29 3d 3d 30  st->nExpr-1))==0
8fa0: 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45   ){.    struct E
8fb0: 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 3b  xprList_item *a;
8fc0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69  .    assert( pLi
8fd0: 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20  st->nExpr>0 );. 
8fe0: 20 20 20 61 20 3d 20 73 71 6c 69 74 65 33 44 62     a = sqlite3Db
8ff0: 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70 4c 69 73  Realloc(db, pLis
9000: 74 2d 3e 61 2c 20 70 4c 69 73 74 2d 3e 6e 45 78  t->a, pList->nEx
9010: 70 72 2a 32 2a 73 69 7a 65 6f 66 28 70 4c 69 73  pr*2*sizeof(pLis
9020: 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 20 20 69  t->a[0]));.    i
9030: 66 28 20 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( a==0 ){.     
9040: 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20   goto no_mem;.  
9050: 20 20 7d 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61    }.    pList->a
9060: 20 3d 20 61 3b 0a 20 20 7d 0a 20 20 61 73 73 65   = a;.  }.  asse
9070: 72 74 28 20 70 4c 69 73 74 2d 3e 61 21 3d 30 20  rt( pList->a!=0 
9080: 29 3b 0a 20 20 69 66 28 20 31 20 29 7b 0a 20 20  );.  if( 1 ){.  
9090: 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
90a0: 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20  t_item *pItem = 
90b0: 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d  &pList->a[pList-
90c0: 3e 6e 45 78 70 72 2b 2b 5d 3b 0a 20 20 20 20 6d  >nExpr++];.    m
90d0: 65 6d 73 65 74 28 70 49 74 65 6d 2c 20 30 2c 20  emset(pItem, 0, 
90e0: 73 69 7a 65 6f 66 28 2a 70 49 74 65 6d 29 29 3b  sizeof(*pItem));
90f0: 0a 20 20 20 20 70 49 74 65 6d 2d 3e 70 45 78 70  .    pItem->pExp
9100: 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 7d 0a 20  r = pExpr;.  }. 
9110: 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 0a   return pList;..
9120: 6e 6f 5f 6d 65 6d 3a 20 20 20 20 20 0a 20 20 2f  no_mem:     .  /
9130: 2a 20 41 76 6f 69 64 20 6c 65 61 6b 69 6e 67 20  * Avoid leaking 
9140: 6d 65 6d 6f 72 79 20 69 66 20 6d 61 6c 6c 6f 63  memory if malloc
9150: 20 68 61 73 20 66 61 69 6c 65 64 2e 20 2a 2f 0a   has failed. */.
9160: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
9170: 65 74 65 28 64 62 2c 20 70 45 78 70 72 29 3b 0a  ete(db, pExpr);.
9180: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
9190: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69 73  tDelete(db, pLis
91a0: 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a  t);.  return 0;.
91b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
91c0: 20 45 78 70 72 4c 69 73 74 2e 61 5b 5d 2e 7a 4e   ExprList.a[].zN
91d0: 61 6d 65 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74  ame element of t
91e0: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
91f0: 20 61 64 64 65 64 20 69 74 65 6d 0a 2a 2a 20 6f   added item.** o
9200: 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  n the expression
9210: 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69   list..**.** pLi
9220: 73 74 20 6d 69 67 68 74 20 62 65 20 4e 55 4c 4c  st might be NULL
9230: 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 6e 20 4f 4f   following an OO
9240: 4d 20 65 72 72 6f 72 2e 20 20 42 75 74 20 70 4e  M error.  But pN
9250: 61 6d 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72  ame should never
9260: 20 62 65 0a 2a 2a 20 4e 55 4c 4c 2e 20 20 49 66   be.** NULL.  If
9270: 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61   a memory alloca
9280: 74 69 6f 6e 20 66 61 69 6c 73 2c 20 74 68 65 20  tion fails, the 
9290: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
92a0: 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 0a 2a 2a  ocFailed flag.**
92b0: 20 69 73 20 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64   is set..*/.void
92c0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
92d0: 53 65 74 4e 61 6d 65 28 0a 20 20 50 61 72 73 65  SetName(.  Parse
92e0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
92f0: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
9300: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c  ntext */.  ExprL
9310: 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20  ist *pList,     
9320: 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 77 68     /* List to wh
9330: 69 63 68 20 74 6f 20 61 64 64 20 74 68 65 20 73  ich to add the s
9340: 70 61 6e 2e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  pan. */.  Token 
9350: 2a 70 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 20  *pName,         
9360: 20 20 2f 2a 20 4e 61 6d 65 20 74 6f 20 62 65 20    /* Name to be 
9370: 61 64 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 64  added */.  int d
9380: 65 71 75 6f 74 65 20 20 20 20 20 20 20 20 20 20  equote          
9390: 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 63 61     /* True to ca
93a0: 75 73 65 20 74 68 65 20 6e 61 6d 65 20 74 6f 20  use the name to 
93b0: 62 65 20 64 65 71 75 6f 74 65 64 20 2a 2f 0a 29  be dequoted */.)
93c0: 7b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73  {.  assert( pLis
93d0: 74 21 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e  t!=0 || pParse->
93e0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
93f0: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 4c 69  !=0 );.  if( pLi
9400: 73 74 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74  st ){.    struct
9410: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
9420: 70 49 74 65 6d 3b 0a 20 20 20 20 61 73 73 65 72  pItem;.    asser
9430: 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3e  t( pList->nExpr>
9440: 30 20 29 3b 0a 20 20 20 20 70 49 74 65 6d 20 3d  0 );.    pItem =
9450: 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74   &pList->a[pList
9460: 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20 20 20 20  ->nExpr-1];.    
9470: 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 7a  assert( pItem->z
9480: 4e 61 6d 65 3d 3d 30 20 29 3b 0a 20 20 20 20 70  Name==0 );.    p
9490: 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71  Item->zName = sq
94a0: 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70 28 70  lite3DbStrNDup(p
94b0: 50 61 72 73 65 2d 3e 64 62 2c 20 70 4e 61 6d 65  Parse->db, pName
94c0: 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a  ->z, pName->n);.
94d0: 20 20 20 20 69 66 28 20 64 65 71 75 6f 74 65 20      if( dequote 
94e0: 26 26 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20  && pItem->zName 
94f0: 29 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65  ) sqlite3Dequote
9500: 28 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a  (pItem->zName);.
9510: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74    }.}../*.** Set
9520: 20 74 68 65 20 45 78 70 72 4c 69 73 74 2e 61 5b   the ExprList.a[
9530: 5d 2e 7a 53 70 61 6e 20 65 6c 65 6d 65 6e 74 20  ].zSpan element 
9540: 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  of the most rece
9550: 6e 74 6c 79 20 61 64 64 65 64 20 69 74 65 6d 0a  ntly added item.
9560: 2a 2a 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73  ** on the expres
9570: 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a  sion list..**.**
9580: 20 70 4c 69 73 74 20 6d 69 67 68 74 20 62 65 20   pList might be 
9590: 4e 55 4c 4c 20 66 6f 6c 6c 6f 77 69 6e 67 20 61  NULL following a
95a0: 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e 20 20 42 75  n OOM error.  Bu
95b0: 74 20 70 53 70 61 6e 20 73 68 6f 75 6c 64 20 6e  t pSpan should n
95c0: 65 76 65 72 20 62 65 0a 2a 2a 20 4e 55 4c 4c 2e  ever be.** NULL.
95d0: 20 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c    If a memory al
95e0: 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c 20  location fails, 
95f0: 74 68 65 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  the pParse->db->
9600: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61  mallocFailed fla
9610: 67 0a 2a 2a 20 69 73 20 73 65 74 2e 0a 2a 2f 0a  g.** is set..*/.
9620: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
9630: 4c 69 73 74 53 65 74 53 70 61 6e 28 0a 20 20 50  ListSetSpan(.  P
9640: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
9650: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
9660: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
9670: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
9680: 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74         /* List t
9690: 6f 20 77 68 69 63 68 20 74 6f 20 61 64 64 20 74  o which to add t
96a0: 68 65 20 73 70 61 6e 2e 20 2a 2f 0a 20 20 45 78  he span. */.  Ex
96b0: 70 72 53 70 61 6e 20 2a 70 53 70 61 6e 20 20 20  prSpan *pSpan   
96c0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 70 61        /* The spa
96d0: 6e 20 74 6f 20 62 65 20 61 64 64 65 64 20 2a 2f  n to be added */
96e0: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
96f0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
9700: 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 21    assert( pList!
9710: 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  =0 || db->malloc
9720: 46 61 69 6c 65 64 21 3d 30 20 29 3b 0a 20 20 69  Failed!=0 );.  i
9730: 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  f( pList ){.    
9740: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
9750: 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70  item *pItem = &p
9760: 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e  List->a[pList->n
9770: 45 78 70 72 2d 31 5d 3b 0a 20 20 20 20 61 73 73  Expr-1];.    ass
9780: 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70  ert( pList->nExp
9790: 72 3e 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  r>0 );.    asser
97a0: 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  t( db->mallocFai
97b0: 6c 65 64 20 7c 7c 20 70 49 74 65 6d 2d 3e 70 45  led || pItem->pE
97c0: 78 70 72 3d 3d 70 53 70 61 6e 2d 3e 70 45 78 70  xpr==pSpan->pExp
97d0: 72 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  r );.    sqlite3
97e0: 44 62 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d  DbFree(db, pItem
97f0: 2d 3e 7a 53 70 61 6e 29 3b 0a 20 20 20 20 70 49  ->zSpan);.    pI
9800: 74 65 6d 2d 3e 7a 53 70 61 6e 20 3d 20 73 71 6c  tem->zSpan = sql
9810: 69 74 65 33 44 62 53 74 72 4e 44 75 70 28 64 62  ite3DbStrNDup(db
9820: 2c 20 28 63 68 61 72 2a 29 70 53 70 61 6e 2d 3e  , (char*)pSpan->
9830: 7a 53 74 61 72 74 2c 0a 20 20 20 20 20 20 20 20  zStart,.        
9840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9850: 20 20 20 20 20 20 20 20 20 20 20 20 28 69 6e 74              (int
9860: 29 28 70 53 70 61 6e 2d 3e 7a 45 6e 64 20 2d 20  )(pSpan->zEnd - 
9870: 70 53 70 61 6e 2d 3e 7a 53 74 61 72 74 29 29 3b  pSpan->zStart));
9880: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  .  }.}../*.** If
9890: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
98a0: 6c 69 73 74 20 70 45 4c 69 73 74 20 63 6f 6e 74  list pEList cont
98b0: 61 69 6e 73 20 6d 6f 72 65 20 74 68 61 6e 20 69  ains more than i
98c0: 4c 69 6d 69 74 20 65 6c 65 6d 65 6e 74 73 2c 0a  Limit elements,.
98d0: 2a 2a 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f  ** leave an erro
98e0: 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61  r message in pPa
98f0: 72 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  rse..*/.void sql
9900: 69 74 65 33 45 78 70 72 4c 69 73 74 43 68 65 63  ite3ExprListChec
9910: 6b 4c 65 6e 67 74 68 28 0a 20 20 50 61 72 73 65  kLength(.  Parse
9920: 20 2a 70 50 61 72 73 65 2c 0a 20 20 45 78 70 72   *pParse,.  Expr
9930: 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 0a 20 20  List *pEList,.  
9940: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 62 6a  const char *zObj
9950: 65 63 74 0a 29 7b 0a 20 20 69 6e 74 20 6d 78 20  ect.){.  int mx 
9960: 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 4c  = pParse->db->aL
9970: 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
9980: 54 5f 43 4f 4c 55 4d 4e 5d 3b 0a 20 20 74 65 73  T_COLUMN];.  tes
9990: 74 63 61 73 65 28 20 70 45 4c 69 73 74 20 26 26  tcase( pEList &&
99a0: 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d   pEList->nExpr==
99b0: 6d 78 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  mx );.  testcase
99c0: 28 20 70 45 4c 69 73 74 20 26 26 20 70 45 4c 69  ( pEList && pELi
99d0: 73 74 2d 3e 6e 45 78 70 72 3d 3d 6d 78 2b 31 20  st->nExpr==mx+1 
99e0: 29 3b 0a 20 20 69 66 28 20 70 45 4c 69 73 74 20  );.  if( pEList 
99f0: 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  && pEList->nExpr
9a00: 3e 6d 78 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  >mx ){.    sqlit
9a10: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
9a20: 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c  e, "too many col
9a30: 75 6d 6e 73 20 69 6e 20 25 73 22 2c 20 7a 4f 62  umns in %s", zOb
9a40: 6a 65 63 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ject);.  }.}../*
9a50: 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e  .** Delete an en
9a60: 74 69 72 65 20 65 78 70 72 65 73 73 69 6f 6e 20  tire expression 
9a70: 6c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  list..*/.void sq
9a80: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
9a90: 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ete(sqlite3 *db,
9aa0: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
9ab0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74  ){.  int i;.  st
9ac0: 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
9ad0: 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 66 28  em *pItem;.  if(
9ae0: 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75   pList==0 ) retu
9af0: 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c  rn;.  assert( pL
9b00: 69 73 74 2d 3e 61 21 3d 30 20 7c 7c 20 70 4c 69  ist->a!=0 || pLi
9b10: 73 74 2d 3e 6e 45 78 70 72 3d 3d 30 20 29 3b 0a  st->nExpr==0 );.
9b20: 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73    for(pItem=pLis
9b30: 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70 4c 69  t->a, i=0; i<pLi
9b40: 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20  st->nExpr; i++, 
9b50: 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 73 71  pItem++){.    sq
9b60: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
9b70: 64 62 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72  db, pItem->pExpr
9b80: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
9b90: 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e  Free(db, pItem->
9ba0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69  zName);.    sqli
9bb0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49  te3DbFree(db, pI
9bc0: 74 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a 20 20 7d  tem->zSpan);.  }
9bd0: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
9be0: 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61 29 3b 0a  (db, pList->a);.
9bf0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
9c00: 64 62 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f  db, pList);.}../
9c10: 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69  *.** These routi
9c20: 6e 65 73 20 61 72 65 20 57 61 6c 6b 65 72 20 63  nes are Walker c
9c30: 61 6c 6c 62 61 63 6b 73 2e 20 20 57 61 6c 6b 65  allbacks.  Walke
9c40: 72 2e 75 2e 70 69 20 69 73 20 61 20 70 6f 69 6e  r.u.pi is a poin
9c50: 74 65 72 0a 2a 2a 20 74 6f 20 61 6e 20 69 6e 74  ter.** to an int
9c60: 65 67 65 72 2e 20 20 54 68 65 73 65 20 72 6f 75  eger.  These rou
9c70: 74 69 6e 65 73 20 61 72 65 20 63 68 65 63 6b 69  tines are checki
9c80: 6e 67 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  ng an expression
9c90: 20 74 6f 20 73 65 65 0a 2a 2a 20 69 66 20 69 74   to see.** if it
9ca0: 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74 2e 20   is a constant. 
9cb0: 20 53 65 74 20 2a 57 61 6c 6b 65 72 2e 75 2e 69   Set *Walker.u.i
9cc0: 20 74 6f 20 30 20 69 66 20 74 68 65 20 65 78 70   to 0 if the exp
9cd0: 72 65 73 73 69 6f 6e 20 69 73 0a 2a 2a 20 6e 6f  ression is.** no
9ce0: 74 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2a 0a 2a  t constant..**.*
9cf0: 2a 20 54 68 65 73 65 20 63 61 6c 6c 62 61 63 6b  * These callback
9d00: 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73   routines are us
9d10: 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  ed to implement 
9d20: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a  the following:.*
9d30: 2a 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33  *.**     sqlite3
9d40: 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 29  ExprIsConstant()
9d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d60: 20 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 3d 3d    pWalker->u.i==
9d70: 31 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33  1.**     sqlite3
9d80: 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f  ExprIsConstantNo
9d90: 74 4a 6f 69 6e 28 29 20 20 20 20 20 20 20 20 20  tJoin()         
9da0: 20 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 3d 3d    pWalker->u.i==
9db0: 32 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33  2.**     sqlite3
9dc0: 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72  ExprIsConstantOr
9dd0: 46 75 6e 63 74 69 6f 6e 28 29 20 20 20 20 20 20  Function()      
9de0: 20 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 3d 3d    pWalker->u.i==
9df0: 33 20 6f 72 20 34 0a 2a 2a 0a 2a 2a 20 54 68 65  3 or 4.**.** The
9e00: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
9e10: 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f 6e  nstantOrFunction
9e20: 28 29 20 69 73 20 75 73 65 64 20 66 6f 72 20 65  () is used for e
9e30: 76 61 6c 75 61 74 69 6e 67 20 65 78 70 72 65 73  valuating expres
9e40: 73 69 6f 6e 73 0a 2a 2a 20 69 6e 20 61 20 43 52  sions.** in a CR
9e50: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
9e60: 6d 65 6e 74 2e 20 20 54 68 65 20 57 61 6c 6b 65  ment.  The Walke
9e70: 72 2e 75 2e 69 20 76 61 6c 75 65 20 69 73 20 34  r.u.i value is 4
9e80: 20 77 68 65 6e 20 70 61 72 73 69 6e 67 0a 2a 2a   when parsing.**
9e90: 20 61 6e 20 65 78 69 73 74 69 6e 67 20 73 63 68   an existing sch
9ea0: 65 6d 61 20 61 6e 64 20 33 20 77 68 65 6e 20 70  ema and 3 when p
9eb0: 72 6f 63 65 73 73 69 6e 67 20 61 20 6e 65 77 20  rocessing a new 
9ec0: 73 74 61 74 65 6d 65 6e 74 2e 20 20 41 20 62 6f  statement.  A bo
9ed0: 75 6e 64 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72  und.** parameter
9ee0: 20 72 61 69 73 65 73 20 61 6e 20 65 72 72 6f 72   raises an error
9ef0: 20 66 6f 72 20 6e 65 77 20 73 74 61 74 65 6d 65   for new stateme
9f00: 6e 74 73 2c 20 62 75 74 20 69 73 20 73 69 6c 65  nts, but is sile
9f10: 6e 74 6c 79 20 63 6f 6e 76 65 72 74 65 64 0a 2a  ntly converted.*
9f20: 2a 20 74 6f 20 4e 55 4c 4c 20 66 6f 72 20 65 78  * to NULL for ex
9f30: 69 73 74 69 6e 67 20 73 63 68 65 6d 61 73 2e 20  isting schemas. 
9f40: 20 54 68 69 73 20 61 6c 6c 6f 77 73 20 73 71 6c   This allows sql
9f50: 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
9f60: 73 20 74 68 61 74 20 0a 2a 2a 20 63 6f 6e 74 61  s that .** conta
9f70: 69 6e 20 61 20 62 6f 75 6e 64 20 70 61 72 61 6d  in a bound param
9f80: 65 74 65 72 20 62 65 63 61 75 73 65 20 74 68 65  eter because the
9f90: 79 20 77 65 72 65 20 67 65 6e 65 72 61 74 65 64  y were generated
9fa0: 20 62 79 20 6f 6c 64 65 72 20 76 65 72 73 69 6f   by older versio
9fb0: 6e 73 0a 2a 2a 20 6f 66 20 53 51 4c 69 74 65 20  ns.** of SQLite 
9fc0: 74 6f 20 62 65 20 70 61 72 73 65 64 20 62 79 20  to be parsed by 
9fd0: 6e 65 77 65 72 20 76 65 72 73 69 6f 6e 73 20 6f  newer versions o
9fe0: 66 20 53 51 4c 69 74 65 20 77 69 74 68 6f 75 74  f SQLite without
9ff0: 20 72 61 69 73 69 6e 67 20 61 0a 2a 2a 20 6d 61   raising a.** ma
a000: 6c 66 6f 72 6d 65 64 20 73 63 68 65 6d 61 20 65  lformed schema e
a010: 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rror..*/.static 
a020: 69 6e 74 20 65 78 70 72 4e 6f 64 65 49 73 43 6f  int exprNodeIsCo
a030: 6e 73 74 61 6e 74 28 57 61 6c 6b 65 72 20 2a 70  nstant(Walker *p
a040: 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45  Walker, Expr *pE
a050: 78 70 72 29 7b 0a 0a 20 20 2f 2a 20 49 66 20 70  xpr){..  /* If p
a060: 57 61 6c 6b 65 72 2d 3e 75 2e 69 20 69 73 20 32  Walker->u.i is 2
a070: 20 74 68 65 6e 20 61 6e 79 20 74 65 72 6d 20 6f   then any term o
a080: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
a090: 20 74 68 61 74 20 63 6f 6d 65 73 20 66 72 6f 6d   that comes from
a0a0: 0a 20 20 2a 2a 20 74 68 65 20 4f 4e 20 6f 72 20  .  ** the ON or 
a0b0: 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20 6f 66  USING clauses of
a0c0: 20 61 20 6a 6f 69 6e 20 64 69 73 71 75 61 6c 69   a join disquali
a0d0: 66 69 65 73 20 74 68 65 20 65 78 70 72 65 73 73  fies the express
a0e0: 69 6f 6e 0a 20 20 2a 2a 20 66 72 6f 6d 20 62 65  ion.  ** from be
a0f0: 69 6e 67 20 63 6f 6e 73 69 64 65 72 65 64 20 63  ing considered c
a100: 6f 6e 73 74 61 6e 74 2e 20 2a 2f 0a 20 20 69 66  onstant. */.  if
a110: 28 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 3d 3d  ( pWalker->u.i==
a120: 32 20 26 26 20 45 78 70 72 48 61 73 50 72 6f 70  2 && ExprHasProp
a130: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46  erty(pExpr, EP_F
a140: 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20  romJoin) ){.    
a150: 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 20 3d 20 30  pWalker->u.i = 0
a160: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43  ;.    return WRC
a170: 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 0a 20 20 73  _Abort;.  }..  s
a180: 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70  witch( pExpr->op
a190: 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 6e 73 69   ){.    /* Consi
a1a0: 64 65 72 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f  der functions to
a1b0: 20 62 65 20 63 6f 6e 73 74 61 6e 74 20 69 66 20   be constant if 
a1c0: 61 6c 6c 20 74 68 65 69 72 20 61 72 67 75 6d 65  all their argume
a1d0: 6e 74 73 20 61 72 65 20 63 6f 6e 73 74 61 6e 74  nts are constant
a1e0: 0a 20 20 20 20 2a 2a 20 61 6e 64 20 65 69 74 68  .    ** and eith
a1f0: 65 72 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 3d  er pWalker->u.i=
a200: 3d 33 20 6f 72 20 34 20 6f 72 20 74 68 65 20 66  =3 or 4 or the f
a210: 75 6e 63 74 69 6f 6e 20 61 73 20 74 68 65 20 53  unction as the S
a220: 51 4c 49 54 45 5f 46 55 4e 43 5f 43 4f 4e 53 54  QLITE_FUNC_CONST
a230: 0a 20 20 20 20 2a 2a 20 66 6c 61 67 2e 20 2a 2f  .    ** flag. */
a240: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e  .    case TK_FUN
a250: 43 54 49 4f 4e 3a 0a 20 20 20 20 20 20 69 66 28  CTION:.      if(
a260: 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 3e 3d 33   pWalker->u.i>=3
a270: 20 7c 7c 20 45 78 70 72 48 61 73 50 72 6f 70 65   || ExprHasPrope
a280: 72 74 79 28 70 45 78 70 72 2c 45 50 5f 43 6f 6e  rty(pExpr,EP_Con
a290: 73 74 61 6e 74 29 20 29 7b 0a 20 20 20 20 20 20  stant) ){.      
a2a0: 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e    return WRC_Con
a2b0: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20  tinue;.      }. 
a2c0: 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72       /* Fall thr
a2d0: 6f 75 67 68 20 2a 2f 0a 20 20 20 20 63 61 73 65  ough */.    case
a2e0: 20 54 4b 5f 49 44 3a 0a 20 20 20 20 63 61 73 65   TK_ID:.    case
a2f0: 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20   TK_COLUMN:.    
a300: 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43  case TK_AGG_FUNC
a310: 54 49 4f 4e 3a 0a 20 20 20 20 63 61 73 65 20 54  TION:.    case T
a320: 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20  K_AGG_COLUMN:.  
a330: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
a340: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29  xpr->op==TK_ID )
a350: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
a360: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
a370: 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20  COLUMN );.      
a380: 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
a390: 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43  >op==TK_AGG_FUNC
a3a0: 54 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 74 65  TION );.      te
a3b0: 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
a3c0: 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  p==TK_AGG_COLUMN
a3d0: 20 29 3b 0a 20 20 20 20 20 20 70 57 61 6c 6b 65   );.      pWalke
a3e0: 72 2d 3e 75 2e 69 20 3d 20 30 3b 0a 20 20 20 20  r->u.i = 0;.    
a3f0: 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f    return WRC_Abo
a400: 72 74 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  rt;.    case TK_
a410: 56 41 52 49 41 42 4c 45 3a 0a 20 20 20 20 20 20  VARIABLE:.      
a420: 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 69  if( pWalker->u.i
a430: 3d 3d 34 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ==4 ){.        /
a440: 2a 20 53 69 6c 65 6e 74 6c 79 20 63 6f 6e 76 65  * Silently conve
a450: 72 74 20 62 6f 75 6e 64 20 70 61 72 61 6d 65 74  rt bound paramet
a460: 65 72 73 20 74 68 61 74 20 61 70 70 65 61 72 20  ers that appear 
a470: 69 6e 73 69 64 65 20 6f 66 20 43 52 45 41 54 45  inside of CREATE
a480: 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 74 61 74  .        ** stat
a490: 65 6d 65 6e 74 73 20 69 6e 74 6f 20 61 20 4e 55  ements into a NU
a4a0: 4c 4c 20 77 68 65 6e 20 70 61 72 73 69 6e 67 20  LL when parsing 
a4b0: 74 68 65 20 43 52 45 41 54 45 20 73 74 61 74 65  the CREATE state
a4c0: 6d 65 6e 74 20 74 65 78 74 20 6f 75 74 0a 20 20  ment text out.  
a4d0: 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20        ** of the 
a4e0: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
a4f0: 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 70  ble */.        p
a500: 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 4e 55  Expr->op = TK_NU
a510: 4c 4c 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  LL;.      }else 
a520: 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 69  if( pWalker->u.i
a530: 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ==3 ){.        /
a540: 2a 20 41 20 62 6f 75 6e 64 20 70 61 72 61 6d 65  * A bound parame
a550: 74 65 72 20 69 6e 20 61 20 43 52 45 41 54 45 20  ter in a CREATE 
a560: 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 6f  statement that o
a570: 72 69 67 69 6e 61 74 65 73 20 66 72 6f 6d 0a 20  riginates from. 
a580: 20 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65         ** sqlite
a590: 33 5f 70 72 65 70 61 72 65 28 29 20 63 61 75 73  3_prepare() caus
a5a0: 65 73 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 20  es an error */. 
a5b0: 20 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e         pWalker->
a5c0: 75 2e 69 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  u.i = 0;.       
a5d0: 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
a5e0: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
a5f0: 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67 68   /* Fall through
a600: 20 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c 74 3a   */.    default:
a610: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
a620: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53   pExpr->op==TK_S
a630: 45 4c 45 43 54 20 29 3b 20 2f 2a 20 73 65 6c 65  ELECT ); /* sele
a640: 63 74 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74  ctNodeIsConstant
a650: 20 77 69 6c 6c 20 64 69 73 61 6c 6c 6f 77 20 2a   will disallow *
a660: 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  /.      testcase
a670: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
a680: 45 58 49 53 54 53 20 29 3b 20 2f 2a 20 73 65 6c  EXISTS ); /* sel
a690: 65 63 74 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e  ectNodeIsConstan
a6a0: 74 20 77 69 6c 6c 20 64 69 73 61 6c 6c 6f 77 20  t will disallow 
a6b0: 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
a6c0: 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20  WRC_Continue;.  
a6d0: 7d 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 73  }.}.static int s
a6e0: 65 6c 65 63 74 4e 6f 64 65 49 73 43 6f 6e 73 74  electNodeIsConst
a6f0: 61 6e 74 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c  ant(Walker *pWal
a700: 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 4e 6f 74  ker, Select *Not
a710: 55 73 65 64 29 7b 0a 20 20 55 4e 55 53 45 44 5f  Used){.  UNUSED_
a720: 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
a730: 64 29 3b 0a 20 20 70 57 61 6c 6b 65 72 2d 3e 75  d);.  pWalker->u
a740: 2e 69 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  .i = 0;.  return
a750: 20 57 52 43 5f 41 62 6f 72 74 3b 0a 7d 0a 73 74   WRC_Abort;.}.st
a760: 61 74 69 63 20 69 6e 74 20 65 78 70 72 49 73 43  atic int exprIsC
a770: 6f 6e 73 74 28 45 78 70 72 20 2a 70 2c 20 69 6e  onst(Expr *p, in
a780: 74 20 69 6e 69 74 46 6c 61 67 29 7b 0a 20 20 57  t initFlag){.  W
a790: 61 6c 6b 65 72 20 77 3b 0a 20 20 6d 65 6d 73 65  alker w;.  memse
a7a0: 74 28 26 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28  t(&w, 0, sizeof(
a7b0: 77 29 29 3b 0a 20 20 77 2e 75 2e 69 20 3d 20 69  w));.  w.u.i = i
a7c0: 6e 69 74 46 6c 61 67 3b 0a 20 20 77 2e 78 45 78  nitFlag;.  w.xEx
a7d0: 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70  prCallback = exp
a7e0: 72 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 3b  rNodeIsConstant;
a7f0: 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c  .  w.xSelectCall
a800: 62 61 63 6b 20 3d 20 73 65 6c 65 63 74 4e 6f 64  back = selectNod
a810: 65 49 73 43 6f 6e 73 74 61 6e 74 3b 0a 20 20 73  eIsConstant;.  s
a820: 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26  qlite3WalkExpr(&
a830: 77 2c 20 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  w, p);.  return 
a840: 77 2e 75 2e 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  w.u.i;.}../*.** 
a850: 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69  Walk an expressi
a860: 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e  on tree.  Return
a870: 20 31 20 69 66 20 74 68 65 20 65 78 70 72 65 73   1 if the expres
a880: 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74  sion is constant
a890: 0a 2a 2a 20 61 6e 64 20 30 20 69 66 20 69 74 20  .** and 0 if it 
a8a0: 69 6e 76 6f 6c 76 65 73 20 76 61 72 69 61 62 6c  involves variabl
a8b0: 65 73 20 6f 72 20 66 75 6e 63 74 69 6f 6e 20 63  es or function c
a8c0: 61 6c 6c 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  alls..**.** For 
a8d0: 74 68 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20  the purposes of 
a8e0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61  this function, a
a8f0: 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65 64 20 73   double-quoted s
a900: 74 72 69 6e 67 20 28 65 78 3a 20 22 61 62 63 22  tring (ex: "abc"
a910: 29 0a 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65 72  ).** is consider
a920: 65 64 20 61 20 76 61 72 69 61 62 6c 65 20 62 75  ed a variable bu
a930: 74 20 61 20 73 69 6e 67 6c 65 2d 71 75 6f 74 65  t a single-quote
a940: 64 20 73 74 72 69 6e 67 20 28 65 78 3a 20 27 61  d string (ex: 'a
a950: 62 63 27 29 20 69 73 0a 2a 2a 20 61 20 63 6f 6e  bc') is.** a con
a960: 73 74 61 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  stant..*/.int sq
a970: 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
a980: 61 6e 74 28 45 78 70 72 20 2a 70 29 7b 0a 20 20  ant(Expr *p){.  
a990: 72 65 74 75 72 6e 20 65 78 70 72 49 73 43 6f 6e  return exprIsCon
a9a0: 73 74 28 70 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a  st(p, 1);.}../*.
a9b0: 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65  ** Walk an expre
a9c0: 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74  ssion tree.  Ret
a9d0: 75 72 6e 20 31 20 69 66 20 74 68 65 20 65 78 70  urn 1 if the exp
a9e0: 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74  ression is const
a9f0: 61 6e 74 0a 2a 2a 20 74 68 61 74 20 64 6f 65 73  ant.** that does
aa00: 20 6e 6f 20 6f 72 69 67 69 6e 61 74 65 20 66 72   no originate fr
aa10: 6f 6d 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49  om the ON or USI
aa20: 4e 47 20 63 6c 61 75 73 65 73 20 6f 66 20 61 20  NG clauses of a 
aa30: 6a 6f 69 6e 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  join..** Return 
aa40: 30 20 69 66 20 69 74 20 69 6e 76 6f 6c 76 65 73  0 if it involves
aa50: 20 76 61 72 69 61 62 6c 65 73 20 6f 72 20 66 75   variables or fu
aa60: 6e 63 74 69 6f 6e 20 63 61 6c 6c 73 20 6f 72 20  nction calls or 
aa70: 74 65 72 6d 73 20 66 72 6f 6d 0a 2a 2a 20 61 6e  terms from.** an
aa80: 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61   ON or USING cla
aa90: 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  use..*/.int sqli
aaa0: 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
aab0: 74 4e 6f 74 4a 6f 69 6e 28 45 78 70 72 20 2a 70  tNotJoin(Expr *p
aac0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72  ){.  return expr
aad0: 49 73 43 6f 6e 73 74 28 70 2c 20 32 29 3b 0a 7d  IsConst(p, 2);.}
aae0: 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20  ../*.** Walk an 
aaf0: 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e  expression tree.
ab00: 20 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68    Return 1 if th
ab10: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
ab20: 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 6f 72 20 61  constant.** or a
ab30: 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 77   function call w
ab40: 69 74 68 20 63 6f 6e 73 74 61 6e 74 20 61 72 67  ith constant arg
ab50: 75 6d 65 6e 74 73 2e 20 20 52 65 74 75 72 6e 20  uments.  Return 
ab60: 61 6e 64 20 30 20 69 66 20 74 68 65 72 65 0a 2a  and 0 if there.*
ab70: 2a 20 61 72 65 20 61 6e 79 20 76 61 72 69 61 62  * are any variab
ab80: 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74  les..**.** For t
ab90: 68 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74  he purposes of t
aba0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20  his function, a 
abb0: 64 6f 75 62 6c 65 2d 71 75 6f 74 65 64 20 73 74  double-quoted st
abc0: 72 69 6e 67 20 28 65 78 3a 20 22 61 62 63 22 29  ring (ex: "abc")
abd0: 0a 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65 72 65  .** is considere
abe0: 64 20 61 20 76 61 72 69 61 62 6c 65 20 62 75 74  d a variable but
abf0: 20 61 20 73 69 6e 67 6c 65 2d 71 75 6f 74 65 64   a single-quoted
ac00: 20 73 74 72 69 6e 67 20 28 65 78 3a 20 27 61 62   string (ex: 'ab
ac10: 63 27 29 20 69 73 0a 2a 2a 20 61 20 63 6f 6e 73  c') is.** a cons
ac20: 74 61 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tant..*/.int sql
ac30: 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
ac40: 6e 74 4f 72 46 75 6e 63 74 69 6f 6e 28 45 78 70  ntOrFunction(Exp
ac50: 72 20 2a 70 2c 20 75 38 20 69 73 49 6e 69 74 29  r *p, u8 isInit)
ac60: 7b 0a 20 20 61 73 73 65 72 74 28 20 69 73 49 6e  {.  assert( isIn
ac70: 69 74 3d 3d 30 20 7c 7c 20 69 73 49 6e 69 74 3d  it==0 || isInit=
ac80: 3d 31 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 65  =1 );.  return e
ac90: 78 70 72 49 73 43 6f 6e 73 74 28 70 2c 20 33 2b  xprIsConst(p, 3+
aca0: 69 73 49 6e 69 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  isInit);.}../*.*
acb0: 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73  * If the express
acc0: 69 6f 6e 20 70 20 63 6f 64 65 73 20 61 20 63 6f  ion p codes a co
acd0: 6e 73 74 61 6e 74 20 69 6e 74 65 67 65 72 20 74  nstant integer t
ace0: 68 61 74 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f  hat is small eno
acf0: 75 67 68 0a 2a 2a 20 74 6f 20 66 69 74 20 69 6e  ugh.** to fit in
ad00: 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65   a 32-bit intege
ad10: 72 2c 20 72 65 74 75 72 6e 20 31 20 61 6e 64 20  r, return 1 and 
ad20: 70 75 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66  put the value of
ad30: 20 74 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20   the integer.** 
ad40: 69 6e 20 2a 70 56 61 6c 75 65 2e 20 20 49 66 20  in *pValue.  If 
ad50: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
ad60: 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65 72  s not an integer
ad70: 20 6f 72 20 69 66 20 69 74 20 69 73 20 74 6f 6f   or if it is too
ad80: 20 62 69 67 0a 2a 2a 20 74 6f 20 66 69 74 20 69   big.** to fit i
ad90: 6e 20 61 20 73 69 67 6e 65 64 20 33 32 2d 62 69  n a signed 32-bi
ada0: 74 20 69 6e 74 65 67 65 72 2c 20 72 65 74 75 72  t integer, retur
adb0: 6e 20 30 20 61 6e 64 20 6c 65 61 76 65 20 2a 70  n 0 and leave *p
adc0: 56 61 6c 75 65 20 75 6e 63 68 61 6e 67 65 64 2e  Value unchanged.
add0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
ade0: 78 70 72 49 73 49 6e 74 65 67 65 72 28 45 78 70  xprIsInteger(Exp
adf0: 72 20 2a 70 2c 20 69 6e 74 20 2a 70 56 61 6c 75  r *p, int *pValu
ae00: 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30  e){.  int rc = 0
ae10: 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 78  ;..  /* If an ex
ae20: 70 72 65 73 73 69 6f 6e 20 69 73 20 61 6e 20 69  pression is an i
ae30: 6e 74 65 67 65 72 20 6c 69 74 65 72 61 6c 20 74  nteger literal t
ae40: 68 61 74 20 66 69 74 73 20 69 6e 20 61 20 73 69  hat fits in a si
ae50: 67 6e 65 64 20 33 32 2d 62 69 74 0a 20 20 2a 2a  gned 32-bit.  **
ae60: 20 69 6e 74 65 67 65 72 2c 20 74 68 65 6e 20 74   integer, then t
ae70: 68 65 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 66  he EP_IntValue f
ae80: 6c 61 67 20 77 69 6c 6c 20 68 61 76 65 20 61 6c  lag will have al
ae90: 72 65 61 64 79 20 62 65 65 6e 20 73 65 74 20 2a  ready been set *
aea0: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f  /.  assert( p->o
aeb0: 70 21 3d 54 4b 5f 49 4e 54 45 47 45 52 20 7c 7c  p!=TK_INTEGER ||
aec0: 20 28 70 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f   (p->flags & EP_
aed0: 49 6e 74 56 61 6c 75 65 29 21 3d 30 0a 20 20 20  IntValue)!=0.   
aee0: 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74          || sqlit
aef0: 65 33 47 65 74 49 6e 74 33 32 28 70 2d 3e 75 2e  e3GetInt32(p->u.
af00: 7a 54 6f 6b 65 6e 2c 20 26 72 63 29 3d 3d 30 20  zToken, &rc)==0 
af10: 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 66 6c 61  );..  if( p->fla
af20: 67 73 20 26 20 45 50 5f 49 6e 74 56 61 6c 75 65  gs & EP_IntValue
af30: 20 29 7b 0a 20 20 20 20 2a 70 56 61 6c 75 65 20   ){.    *pValue 
af40: 3d 20 70 2d 3e 75 2e 69 56 61 6c 75 65 3b 0a 20  = p->u.iValue;. 
af50: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
af60: 0a 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70  .  switch( p->op
af70: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
af80: 55 50 4c 55 53 3a 20 7b 0a 20 20 20 20 20 20 72  UPLUS: {.      r
af90: 63 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 49  c = sqlite3ExprI
afa0: 73 49 6e 74 65 67 65 72 28 70 2d 3e 70 4c 65 66  sInteger(p->pLef
afb0: 74 2c 20 70 56 61 6c 75 65 29 3b 0a 20 20 20 20  t, pValue);.    
afc0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
afd0: 20 20 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55     case TK_UMINU
afe0: 53 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 76  S: {.      int v
aff0: 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  ;.      if( sqli
b000: 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72  te3ExprIsInteger
b010: 28 70 2d 3e 70 4c 65 66 74 2c 20 26 76 29 20 29  (p->pLeft, &v) )
b020: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
b030: 28 20 76 21 3d 28 2d 32 31 34 37 34 38 33 36 34  ( v!=(-214748364
b040: 37 2d 31 29 20 29 3b 0a 20 20 20 20 20 20 20 20  7-1) );.        
b050: 2a 70 56 61 6c 75 65 20 3d 20 2d 76 3b 0a 20 20  *pValue = -v;.  
b060: 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
b070: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
b080: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66  k;.    }.    def
b090: 61 75 6c 74 3a 20 62 72 65 61 6b 3b 0a 20 20 7d  ault: break;.  }
b0a0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
b0b0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 46 41  ./*.** Return FA
b0c0: 4c 53 45 20 69 66 20 74 68 65 72 65 20 69 73 20  LSE if there is 
b0d0: 6e 6f 20 63 68 61 6e 63 65 20 74 68 61 74 20 74  no chance that t
b0e0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 63 61  he expression ca
b0f0: 6e 20 62 65 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  n be NULL..**.**
b100: 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69   If the expressi
b110: 6f 6e 20 6d 69 67 68 74 20 62 65 20 4e 55 4c 4c  on might be NULL
b120: 20 6f 72 20 69 66 20 74 68 65 20 65 78 70 72 65   or if the expre
b130: 73 73 69 6f 6e 20 69 73 20 74 6f 6f 20 63 6f 6d  ssion is too com
b140: 70 6c 65 78 0a 2a 2a 20 74 6f 20 74 65 6c 6c 20  plex.** to tell 
b150: 72 65 74 75 72 6e 20 54 52 55 45 2e 20 20 0a 2a  return TRUE.  .*
b160: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
b170: 65 20 69 73 20 75 73 65 64 20 61 73 20 61 6e 20  e is used as an 
b180: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 74 6f  optimization, to
b190: 20 73 6b 69 70 20 4f 50 5f 49 73 4e 75 6c 6c 20   skip OP_IsNull 
b1a0: 6f 70 63 6f 64 65 73 0a 2a 2a 20 77 68 65 6e 20  opcodes.** when 
b1b0: 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 61 20 76  we know that a v
b1c0: 61 6c 75 65 20 63 61 6e 6e 6f 74 20 62 65 20 4e  alue cannot be N
b1d0: 55 4c 4c 2e 20 20 48 65 6e 63 65 2c 20 61 20 66  ULL.  Hence, a f
b1e0: 61 6c 73 65 20 70 6f 73 69 74 69 76 65 0a 2a 2a  alse positive.**
b1f0: 20 28 72 65 74 75 72 6e 69 6e 67 20 54 52 55 45   (returning TRUE
b200: 20 77 68 65 6e 20 69 6e 20 66 61 63 74 20 74 68   when in fact th
b210: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 63 61 6e  e expression can
b220: 20 6e 65 76 65 72 20 62 65 20 4e 55 4c 4c 29 20   never be NULL) 
b230: 6d 69 67 68 74 0a 2a 2a 20 62 65 20 61 20 73 6d  might.** be a sm
b240: 61 6c 6c 20 70 65 72 66 6f 72 6d 61 6e 63 65 20  all performance 
b250: 68 69 74 20 62 75 74 20 69 73 20 6f 74 68 65 72  hit but is other
b260: 77 69 73 65 20 68 61 72 6d 6c 65 73 73 2e 20 20  wise harmless.  
b270: 4f 6e 20 74 68 65 20 6f 74 68 65 72 0a 2a 2a 20  On the other.** 
b280: 68 61 6e 64 2c 20 61 20 66 61 6c 73 65 20 6e 65  hand, a false ne
b290: 67 61 74 69 76 65 20 28 72 65 74 75 72 6e 69 6e  gative (returnin
b2a0: 67 20 46 41 4c 53 45 20 77 68 65 6e 20 74 68 65  g FALSE when the
b2b0: 20 72 65 73 75 6c 74 20 63 6f 75 6c 64 20 62 65   result could be
b2c0: 20 4e 55 4c 4c 29 0a 2a 2a 20 77 69 6c 6c 20 6c   NULL).** will l
b2d0: 69 6b 65 6c 79 20 72 65 73 75 6c 74 20 69 6e 20  ikely result in 
b2e0: 61 6e 20 69 6e 63 6f 72 72 65 63 74 20 61 6e 73  an incorrect ans
b2f0: 77 65 72 2e 20 20 53 6f 20 77 68 65 6e 20 69 6e  wer.  So when in
b300: 20 64 6f 75 62 74 2c 20 72 65 74 75 72 6e 0a 2a   doubt, return.*
b310: 2a 20 54 52 55 45 2e 0a 2a 2f 0a 69 6e 74 20 73  * TRUE..*/.int s
b320: 71 6c 69 74 65 33 45 78 70 72 43 61 6e 42 65 4e  qlite3ExprCanBeN
b330: 75 6c 6c 28 63 6f 6e 73 74 20 45 78 70 72 20 2a  ull(const Expr *
b340: 70 29 7b 0a 20 20 75 38 20 6f 70 3b 0a 20 20 77  p){.  u8 op;.  w
b350: 68 69 6c 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  hile( p->op==TK_
b360: 55 50 4c 55 53 20 7c 7c 20 70 2d 3e 6f 70 3d 3d  UPLUS || p->op==
b370: 54 4b 5f 55 4d 49 4e 55 53 20 29 7b 20 70 20 3d  TK_UMINUS ){ p =
b380: 20 70 2d 3e 70 4c 65 66 74 3b 20 7d 0a 20 20 6f   p->pLeft; }.  o
b390: 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 69 66 28  p = p->op;.  if(
b3a0: 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52   op==TK_REGISTER
b3b0: 20 29 20 6f 70 20 3d 20 70 2d 3e 6f 70 32 3b 0a   ) op = p->op2;.
b3c0: 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a    switch( op ){.
b3d0: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45      case TK_INTE
b3e0: 47 45 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  GER:.    case TK
b3f0: 5f 53 54 52 49 4e 47 3a 0a 20 20 20 20 63 61 73  _STRING:.    cas
b400: 65 20 54 4b 5f 46 4c 4f 41 54 3a 0a 20 20 20 20  e TK_FLOAT:.    
b410: 63 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 0a 20 20  case TK_BLOB:.  
b420: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
b430: 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e    case TK_COLUMN
b440: 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  :.      assert( 
b450: 70 2d 3e 70 54 61 62 21 3d 30 20 29 3b 0a 20 20  p->pTab!=0 );.  
b460: 20 20 20 20 72 65 74 75 72 6e 20 70 2d 3e 69 43      return p->iC
b470: 6f 6c 75 6d 6e 3e 3d 30 20 26 26 20 70 2d 3e 70  olumn>=0 && p->p
b480: 54 61 62 2d 3e 61 43 6f 6c 5b 70 2d 3e 69 43 6f  Tab->aCol[p->iCo
b490: 6c 75 6d 6e 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30  lumn].notNull==0
b4a0: 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20  ;.    default:. 
b4b0: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
b4c0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75   }.}../*.** Retu
b4d0: 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 67  rn TRUE if the g
b4e0: 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  iven expression 
b4f0: 69 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 77 68  is a constant wh
b500: 69 63 68 20 77 6f 75 6c 64 20 62 65 0a 2a 2a 20  ich would be.** 
b510: 75 6e 63 68 61 6e 67 65 64 20 62 79 20 4f 50 5f  unchanged by OP_
b520: 41 66 66 69 6e 69 74 79 20 77 69 74 68 20 74 68  Affinity with th
b530: 65 20 61 66 66 69 6e 69 74 79 20 67 69 76 65 6e  e affinity given
b540: 20 69 6e 20 74 68 65 20 73 65 63 6f 6e 64 0a 2a   in the second.*
b550: 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a  * argument..**.*
b560: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
b570: 73 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d  s used to determ
b580: 69 6e 65 20 69 66 20 74 68 65 20 4f 50 5f 41 66  ine if the OP_Af
b590: 66 69 6e 69 74 79 20 6f 70 65 72 61 74 69 6f 6e  finity operation
b5a0: 0a 2a 2a 20 63 61 6e 20 62 65 20 6f 6d 69 74 74  .** can be omitt
b5b0: 65 64 2e 20 20 57 68 65 6e 20 69 6e 20 64 6f 75  ed.  When in dou
b5c0: 62 74 20 72 65 74 75 72 6e 20 46 41 4c 53 45 2e  bt return FALSE.
b5d0: 20 20 41 20 66 61 6c 73 65 20 6e 65 67 61 74 69    A false negati
b5e0: 76 65 0a 2a 2a 20 69 73 20 68 61 72 6d 6c 65 73  ve.** is harmles
b5f0: 73 2e 20 20 41 20 66 61 6c 73 65 20 70 6f 73 69  s.  A false posi
b600: 74 69 76 65 2c 20 68 6f 77 65 76 65 72 2c 20 63  tive, however, c
b610: 61 6e 20 72 65 73 75 6c 74 20 69 6e 20 74 68 65  an result in the
b620: 20 77 72 6f 6e 67 0a 2a 2a 20 61 6e 73 77 65 72   wrong.** answer
b630: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
b640: 45 78 70 72 4e 65 65 64 73 4e 6f 41 66 66 69 6e  ExprNeedsNoAffin
b650: 69 74 79 43 68 61 6e 67 65 28 63 6f 6e 73 74 20  ityChange(const 
b660: 45 78 70 72 20 2a 70 2c 20 63 68 61 72 20 61 66  Expr *p, char af
b670: 66 29 7b 0a 20 20 75 38 20 6f 70 3b 0a 20 20 69  f){.  u8 op;.  i
b680: 66 28 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41  f( aff==SQLITE_A
b690: 46 46 5f 4e 4f 4e 45 20 29 20 72 65 74 75 72 6e  FF_NONE ) return
b6a0: 20 31 3b 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e   1;.  while( p->
b6b0: 6f 70 3d 3d 54 4b 5f 55 50 4c 55 53 20 7c 7c 20  op==TK_UPLUS || 
b6c0: 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4d 49 4e 55 53  p->op==TK_UMINUS
b6d0: 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4c 65 66 74   ){ p = p->pLeft
b6e0: 3b 20 7d 0a 20 20 6f 70 20 3d 20 70 2d 3e 6f 70  ; }.  op = p->op
b6f0: 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 52  ;.  if( op==TK_R
b700: 45 47 49 53 54 45 52 20 29 20 6f 70 20 3d 20 70  EGISTER ) op = p
b710: 2d 3e 6f 70 32 3b 0a 20 20 73 77 69 74 63 68 28  ->op2;.  switch(
b720: 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20   op ){.    case 
b730: 54 4b 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20  TK_INTEGER: {.  
b740: 20 20 20 20 72 65 74 75 72 6e 20 61 66 66 3d 3d      return aff==
b750: 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47  SQLITE_AFF_INTEG
b760: 45 52 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54  ER || aff==SQLIT
b770: 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20  E_AFF_NUMERIC;. 
b780: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
b790: 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20  _FLOAT: {.      
b7a0: 72 65 74 75 72 6e 20 61 66 66 3d 3d 53 51 4c 49  return aff==SQLI
b7b0: 54 45 5f 41 46 46 5f 52 45 41 4c 20 7c 7c 20 61  TE_AFF_REAL || a
b7c0: 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ff==SQLITE_AFF_N
b7d0: 55 4d 45 52 49 43 3b 0a 20 20 20 20 7d 0a 20 20  UMERIC;.    }.  
b7e0: 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47    case TK_STRING
b7f0: 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  : {.      return
b800: 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46   aff==SQLITE_AFF
b810: 5f 54 45 58 54 3b 0a 20 20 20 20 7d 0a 20 20 20  _TEXT;.    }.   
b820: 20 63 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 20 7b   case TK_BLOB: {
b830: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
b840: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
b850: 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20  TK_COLUMN: {.   
b860: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 54     assert( p->iT
b870: 61 62 6c 65 3e 3d 30 20 29 3b 20 20 2f 2a 20 70  able>=0 );  /* p
b880: 20 63 61 6e 6e 6f 74 20 62 65 20 70 61 72 74 20   cannot be part 
b890: 6f 66 20 61 20 43 48 45 43 4b 20 63 6f 6e 73 74  of a CHECK const
b8a0: 72 61 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20 72  raint */.      r
b8b0: 65 74 75 72 6e 20 70 2d 3e 69 43 6f 6c 75 6d 6e  eturn p->iColumn
b8c0: 3c 30 0a 20 20 20 20 20 20 20 20 20 20 26 26 20  <0.          && 
b8d0: 28 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46  (aff==SQLITE_AFF
b8e0: 5f 49 4e 54 45 47 45 52 20 7c 7c 20 61 66 66 3d  _INTEGER || aff=
b8f0: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45  =SQLITE_AFF_NUME
b900: 52 49 43 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RIC);.    }.    
b910: 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
b920: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
b930: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
b940: 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
b950: 20 67 69 76 65 6e 20 73 74 72 69 6e 67 20 69 73   given string is
b960: 20 61 20 72 6f 77 2d 69 64 20 63 6f 6c 75 6d 6e   a row-id column
b970: 20 6e 61 6d 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71   name..*/.int sq
b980: 6c 69 74 65 33 49 73 52 6f 77 69 64 28 63 6f 6e  lite3IsRowid(con
b990: 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69  st char *z){.  i
b9a0: 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
b9b0: 70 28 7a 2c 20 22 5f 52 4f 57 49 44 5f 22 29 3d  p(z, "_ROWID_")=
b9c0: 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  =0 ) return 1;. 
b9d0: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
b9e0: 43 6d 70 28 7a 2c 20 22 52 4f 57 49 44 22 29 3d  Cmp(z, "ROWID")=
b9f0: 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  =0 ) return 1;. 
ba00: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
ba10: 43 6d 70 28 7a 2c 20 22 4f 49 44 22 29 3d 3d 30  Cmp(z, "OID")==0
ba20: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 72   ) return 1;.  r
ba30: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
ba40: 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
ba50: 20 77 65 20 61 72 65 20 61 62 6c 65 20 74 6f 20   we are able to 
ba60: 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20  the IN operator 
ba70: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6f 6e 20  optimization on 
ba80: 61 0a 2a 2a 20 71 75 65 72 79 20 6f 66 20 74 68  a.** query of th
ba90: 65 20 66 6f 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20  e form.**.**    
baa0: 20 20 20 78 20 49 4e 20 28 53 45 4c 45 43 54 20     x IN (SELECT 
bab0: 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 57 68 65 72 65  ...).**.** Where
bac0: 20 74 68 65 20 53 45 4c 45 43 54 2e 2e 2e 20 63   the SELECT... c
bad0: 6c 61 75 73 65 20 69 73 20 61 73 20 73 70 65 63  lause is as spec
bae0: 69 66 69 65 64 20 62 79 20 74 68 65 20 70 61 72  ified by the par
baf0: 61 6d 65 74 65 72 20 74 6f 20 74 68 69 73 0a 2a  ameter to this.*
bb00: 2a 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a  * routine..**.**
bb10: 20 54 68 65 20 53 65 6c 65 63 74 20 6f 62 6a 65   The Select obje
bb20: 63 74 20 70 61 73 73 65 64 20 69 6e 20 68 61 73  ct passed in has
bb30: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 70 72   already been pr
bb40: 65 70 72 6f 63 65 73 73 65 64 20 61 6e 64 20 6e  eprocessed and n
bb50: 6f 0a 2a 2a 20 65 72 72 6f 72 73 20 68 61 76 65  o.** errors have
bb60: 20 62 65 65 6e 20 66 6f 75 6e 64 2e 0a 2a 2f 0a   been found..*/.
bb70: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
bb80: 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 73 74 61  MIT_SUBQUERY.sta
bb90: 74 69 63 20 69 6e 74 20 69 73 43 61 6e 64 69 64  tic int isCandid
bba0: 61 74 65 46 6f 72 49 6e 4f 70 74 28 53 65 6c 65  ateForInOpt(Sele
bbb0: 63 74 20 2a 70 29 7b 0a 20 20 53 72 63 4c 69 73  ct *p){.  SrcLis
bbc0: 74 20 2a 70 53 72 63 3b 0a 20 20 45 78 70 72 4c  t *pSrc;.  ExprL
bbd0: 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 54  ist *pEList;.  T
bbe0: 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 69 66  able *pTab;.  if
bbf0: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( p==0 ) return 
bc00: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
bc10: 20 20 20 20 20 2f 2a 20 72 69 67 68 74 2d 68 61       /* right-ha
bc20: 6e 64 20 73 69 64 65 20 6f 66 20 49 4e 20 69 73  nd side of IN is
bc30: 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 69 66 28   SELECT */.  if(
bc40: 20 70 2d 3e 70 50 72 69 6f 72 20 29 20 72 65 74   p->pPrior ) ret
bc50: 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
bc60: 20 20 20 20 2f 2a 20 4e 6f 74 20 61 20 63 6f 6d      /* Not a com
bc70: 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 2a 2f 0a  pound SELECT */.
bc80: 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67    if( p->selFlag
bc90: 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74  s & (SF_Distinct
bca0: 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29 20 29  |SF_Aggregate) )
bcb0: 7b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  {.    testcase( 
bcc0: 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28  (p->selFlags & (
bcd0: 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41  SF_Distinct|SF_A
bce0: 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 44  ggregate))==SF_D
bcf0: 69 73 74 69 6e 63 74 20 29 3b 0a 20 20 20 20 74  istinct );.    t
bd00: 65 73 74 63 61 73 65 28 20 28 70 2d 3e 73 65 6c  estcase( (p->sel
bd10: 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74  Flags & (SF_Dist
bd20: 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74  inct|SF_Aggregat
bd30: 65 29 29 3d 3d 53 46 5f 41 67 67 72 65 67 61 74  e))==SF_Aggregat
bd40: 65 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  e );.    return 
bd50: 30 3b 20 2f 2a 20 4e 6f 20 44 49 53 54 49 4e 43  0; /* No DISTINC
bd60: 54 20 6b 65 79 77 6f 72 64 20 61 6e 64 20 6e 6f  T keyword and no
bd70: 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
bd80: 69 6f 6e 73 20 2a 2f 0a 20 20 7d 0a 20 20 61 73  ions */.  }.  as
bd90: 73 65 72 74 28 20 70 2d 3e 70 47 72 6f 75 70 42  sert( p->pGroupB
bda0: 79 3d 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20  y==0 );         
bdb0: 20 20 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20 47       /* Has no G
bdc0: 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 2a  ROUP BY clause *
bdd0: 2f 0a 20 20 69 66 28 20 70 2d 3e 70 4c 69 6d 69  /.  if( p->pLimi
bde0: 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  t ) return 0;   
bdf0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61             /* Ha
be00: 73 20 6e 6f 20 4c 49 4d 49 54 20 63 6c 61 75 73  s no LIMIT claus
be10: 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  e */.  assert( p
be20: 2d 3e 70 4f 66 66 73 65 74 3d 3d 30 20 29 3b 20  ->pOffset==0 ); 
be30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
be40: 20 4e 6f 20 4c 49 4d 49 54 20 6d 65 61 6e 73 20   No LIMIT means 
be50: 6e 6f 20 4f 46 46 53 45 54 20 2a 2f 0a 20 20 69  no OFFSET */.  i
be60: 66 28 20 70 2d 3e 70 57 68 65 72 65 20 29 20 72  f( p->pWhere ) r
be70: 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
be80: 20 20 20 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20        /* Has no 
be90: 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
bea0: 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63    pSrc = p->pSrc
beb0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 72 63  ;.  assert( pSrc
bec0: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 53 72  !=0 );.  if( pSr
bed0: 63 2d 3e 6e 53 72 63 21 3d 31 20 29 20 72 65 74  c->nSrc!=1 ) ret
bee0: 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
bef0: 2f 2a 20 53 69 6e 67 6c 65 20 74 65 72 6d 20 69  /* Single term i
bf00: 6e 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f  n FROM clause */
bf10: 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 61 5b 30  .  if( pSrc->a[0
bf20: 5d 2e 70 53 65 6c 65 63 74 20 29 20 72 65 74 75  ].pSelect ) retu
bf30: 72 6e 20 30 3b 20 20 20 20 20 2f 2a 20 46 52 4f  rn 0;     /* FRO
bf40: 4d 20 69 73 20 6e 6f 74 20 61 20 73 75 62 71 75  M is not a subqu
bf50: 65 72 79 20 6f 72 20 76 69 65 77 20 2a 2f 0a 20  ery or view */. 
bf60: 20 70 54 61 62 20 3d 20 70 53 72 63 2d 3e 61 5b   pTab = pSrc->a[
bf70: 30 5d 2e 70 54 61 62 3b 0a 20 20 69 66 28 20 4e  0].pTab;.  if( N
bf80: 45 56 45 52 28 70 54 61 62 3d 3d 30 29 20 29 20  EVER(pTab==0) ) 
bf90: 72 65 74 75 72 6e 20 30 3b 0a 20 20 61 73 73 65  return 0;.  asse
bfa0: 72 74 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63  rt( pTab->pSelec
bfb0: 74 3d 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20  t==0 );         
bfc0: 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73     /* FROM claus
bfd0: 65 20 69 73 20 6e 6f 74 20 61 20 76 69 65 77 20  e is not a view 
bfe0: 2a 2f 0a 20 20 69 66 28 20 49 73 56 69 72 74 75  */.  if( IsVirtu
bff0: 61 6c 28 70 54 61 62 29 20 29 20 72 65 74 75 72  al(pTab) ) retur
c000: 6e 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 46  n 0;        /* F
c010: 52 4f 4d 20 63 6c 61 75 73 65 20 6e 6f 74 20 61  ROM clause not a
c020: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 2a   virtual table *
c030: 2f 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e  /.  pEList = p->
c040: 70 45 4c 69 73 74 3b 0a 20 20 69 66 28 20 70 45  pEList;.  if( pE
c050: 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29  List->nExpr!=1 )
c060: 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
c070: 20 2f 2a 20 4f 6e 65 20 63 6f 6c 75 6d 6e 20 69   /* One column i
c080: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
c090: 20 2a 2f 0a 20 20 69 66 28 20 70 45 4c 69 73 74   */.  if( pEList
c0a0: 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70  ->a[0].pExpr->op
c0b0: 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 72 65  !=TK_COLUMN ) re
c0c0: 74 75 72 6e 20 30 3b 20 2f 2a 20 52 65 73 75 6c  turn 0; /* Resul
c0d0: 74 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 2a 2f  t is a column */
c0e0: 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23  .  return 1;.}.#
c0f0: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
c100: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f  OMIT_SUBQUERY */
c110: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20  ../*.** Code an 
c120: 4f 50 5f 4f 6e 63 65 20 69 6e 73 74 72 75 63 74  OP_Once instruct
c130: 69 6f 6e 20 61 6e 64 20 61 6c 6c 6f 63 61 74 65  ion and allocate
c140: 20 73 70 61 63 65 20 66 6f 72 20 69 74 73 20 66   space for its f
c150: 6c 61 67 2e 20 52 65 74 75 72 6e 20 74 68 65 20  lag. Return the 
c160: 0a 2a 2a 20 61 64 64 72 65 73 73 20 6f 66 20 74  .** address of t
c170: 68 65 20 6e 65 77 20 69 6e 73 74 72 75 63 74 69  he new instructi
c180: 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  on..*/.int sqlit
c190: 65 33 43 6f 64 65 4f 6e 63 65 28 50 61 72 73 65  e3CodeOnce(Parse
c1a0: 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 56 64 62   *pParse){.  Vdb
c1b0: 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65  e *v = sqlite3Ge
c1c0: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 20 20  tVdbe(pParse);  
c1d0: 20 20 20 20 2f 2a 20 56 69 72 74 75 61 6c 20 6d      /* Virtual m
c1e0: 61 63 68 69 6e 65 20 62 65 69 6e 67 20 63 6f 64  achine being cod
c1f0: 65 64 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 73  ed */.  return s
c200: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
c210: 28 76 2c 20 4f 50 5f 4f 6e 63 65 2c 20 70 50 61  (v, OP_Once, pPa
c220: 72 73 65 2d 3e 6e 4f 6e 63 65 2b 2b 29 3b 0a 7d  rse->nOnce++);.}
c230: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
c240: 20 63 6f 64 65 20 74 68 61 74 20 63 68 65 63 6b   code that check
c250: 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20  s the left-most 
c260: 63 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78 20  column of index 
c270: 74 61 62 6c 65 20 69 43 75 72 20 74 6f 20 73 65  table iCur to se
c280: 65 20 69 66 0a 2a 2a 20 69 74 20 63 6f 6e 74 61  e if.** it conta
c290: 69 6e 73 20 61 6e 79 20 4e 55 4c 4c 20 65 6e 74  ins any NULL ent
c2a0: 72 69 65 73 2e 20 20 43 61 75 73 65 20 74 68 65  ries.  Cause the
c2b0: 20 72 65 67 69 73 74 65 72 20 61 74 20 72 65 67   register at reg
c2c0: 48 61 73 4e 75 6c 6c 20 74 6f 20 62 65 20 73 65  HasNull to be se
c2d0: 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 4e 55  t.** to a non-NU
c2e0: 4c 4c 20 76 61 6c 75 65 20 69 66 20 69 43 75 72  LL value if iCur
c2f0: 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 4e 55 4c   contains no NUL
c300: 4c 73 2e 20 20 43 61 75 73 65 20 72 65 67 69 73  Ls.  Cause regis
c310: 74 65 72 20 72 65 67 48 61 73 4e 75 6c 6c 0a 2a  ter regHasNull.*
c320: 2a 20 74 6f 20 62 65 20 73 65 74 20 74 6f 20 4e  * to be set to N
c330: 55 4c 4c 20 69 66 20 69 43 75 72 20 63 6f 6e 74  ULL if iCur cont
c340: 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  ains one or more
c350: 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2e 0a 2a 2f   NULL values..*/
c360: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c  .static void sql
c370: 69 74 65 33 53 65 74 48 61 73 4e 75 6c 6c 46 6c  ite3SetHasNullFl
c380: 61 67 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20  ag(Vdbe *v, int 
c390: 69 43 75 72 2c 20 69 6e 74 20 72 65 67 48 61 73  iCur, int regHas
c3a0: 4e 75 6c 6c 29 7b 0a 20 20 69 6e 74 20 6a 31 3b  Null){.  int j1;
c3b0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
c3c0: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
c3d0: 65 72 2c 20 30 2c 20 72 65 67 48 61 73 4e 75 6c  er, 0, regHasNul
c3e0: 6c 29 3b 0a 20 20 6a 31 20 3d 20 73 71 6c 69 74  l);.  j1 = sqlit
c3f0: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
c400: 4f 50 5f 52 65 77 69 6e 64 2c 20 69 43 75 72 29  OP_Rewind, iCur)
c410: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
c420: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
c430: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
c440: 75 6d 6e 2c 20 69 43 75 72 2c 20 30 2c 20 72 65  umn, iCur, 0, re
c450: 67 48 61 73 4e 75 6c 6c 29 3b 0a 20 20 73 71 6c  gHasNull);.  sql
c460: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
c470: 28 76 2c 20 4f 50 46 4c 41 47 5f 54 59 50 45 4f  (v, OPFLAG_TYPEO
c480: 46 41 52 47 29 3b 0a 20 20 56 64 62 65 43 6f 6d  FARG);.  VdbeCom
c490: 6d 65 6e 74 28 28 76 2c 20 22 66 69 72 73 74 5f  ment((v, "first_
c4a0: 65 6e 74 72 79 5f 69 6e 28 25 64 29 22 2c 20 69  entry_in(%d)", i
c4b0: 43 75 72 29 29 3b 0a 20 20 73 71 6c 69 74 65 33  Cur));.  sqlite3
c4c0: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
c4d0: 6a 31 29 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66  j1);.}...#ifndef
c4e0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
c4f0: 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 54 68 65 20  QUERY./*.** The 
c500: 61 72 67 75 6d 65 6e 74 20 69 73 20 61 6e 20 49  argument is an I
c510: 4e 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68 20  N operator with 
c520: 61 20 6c 69 73 74 20 28 6e 6f 74 20 61 20 73 75  a list (not a su
c530: 62 71 75 65 72 79 29 20 6f 6e 20 74 68 65 20 0a  bquery) on the .
c540: 2a 2a 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69  ** right-hand si
c550: 64 65 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45  de.  Return TRUE
c560: 20 69 66 20 74 68 61 74 20 6c 69 73 74 20 69 73   if that list is
c570: 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a 73 74   constant..*/.st
c580: 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33  atic int sqlite3
c590: 49 6e 52 68 73 49 73 43 6f 6e 73 74 61 6e 74 28  InRhsIsConstant(
c5a0: 45 78 70 72 20 2a 70 49 6e 29 7b 0a 20 20 45 78  Expr *pIn){.  Ex
c5b0: 70 72 20 2a 70 4c 48 53 3b 0a 20 20 69 6e 74 20  pr *pLHS;.  int 
c5c0: 72 65 73 3b 0a 20 20 61 73 73 65 72 74 28 20 21  res;.  assert( !
c5d0: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
c5e0: 70 49 6e 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  pIn, EP_xIsSelec
c5f0: 74 29 20 29 3b 0a 20 20 70 4c 48 53 20 3d 20 70  t) );.  pLHS = p
c600: 49 6e 2d 3e 70 4c 65 66 74 3b 0a 20 20 70 49 6e  In->pLeft;.  pIn
c610: 2d 3e 70 4c 65 66 74 20 3d 20 30 3b 0a 20 20 72  ->pLeft = 0;.  r
c620: 65 73 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  es = sqlite3Expr
c630: 49 73 43 6f 6e 73 74 61 6e 74 28 70 49 6e 29 3b  IsConstant(pIn);
c640: 0a 20 20 70 49 6e 2d 3e 70 4c 65 66 74 20 3d 20  .  pIn->pLeft = 
c650: 70 4c 48 53 3b 0a 20 20 72 65 74 75 72 6e 20 72  pLHS;.  return r
c660: 65 73 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  es;.}.#endif../*
c670: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
c680: 6e 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65  n is used by the
c690: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
c6a0: 6f 66 20 74 68 65 20 49 4e 20 28 2e 2e 2e 29 20  of the IN (...) 
c6b0: 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 20 54 68 65  operator..** The
c6c0: 20 70 58 20 70 61 72 61 6d 65 74 65 72 20 69 73   pX parameter is
c6d0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
c6e0: 6f 6e 20 74 68 65 20 52 48 53 20 6f 66 20 74 68  on the RHS of th
c6f0: 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 2c 20 77  e IN operator, w
c700: 68 69 63 68 0a 2a 2a 20 6d 69 67 68 74 20 62 65  hich.** might be
c710: 20 65 69 74 68 65 72 20 61 20 6c 69 73 74 20 6f   either a list o
c720: 66 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6f 72  f expressions or
c730: 20 61 20 73 75 62 71 75 65 72 79 2e 0a 2a 2a 0a   a subquery..**.
c740: 2a 2a 20 54 68 65 20 6a 6f 62 20 6f 66 20 74 68  ** The job of th
c750: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 6f  is routine is to
c760: 20 66 69 6e 64 20 6f 72 20 63 72 65 61 74 65 20   find or create 
c770: 61 20 62 2d 74 72 65 65 20 6f 62 6a 65 63 74 20  a b-tree object 
c780: 74 68 61 74 20 63 61 6e 0a 2a 2a 20 62 65 20 75  that can.** be u
c790: 73 65 64 20 65 69 74 68 65 72 20 74 6f 20 74 65  sed either to te
c7a0: 73 74 20 66 6f 72 20 6d 65 6d 62 65 72 73 68 69  st for membershi
c7b0: 70 20 69 6e 20 74 68 65 20 52 48 53 20 73 65 74  p in the RHS set
c7c0: 20 6f 72 20 74 6f 20 69 74 65 72 61 74 65 20 74   or to iterate t
c7d0: 68 72 6f 75 67 68 0a 2a 2a 20 61 6c 6c 20 6d 65  hrough.** all me
c7e0: 6d 62 65 72 73 20 6f 66 20 74 68 65 20 52 48 53  mbers of the RHS
c7f0: 20 73 65 74 2c 20 73 6b 69 70 70 69 6e 67 20 64   set, skipping d
c800: 75 70 6c 69 63 61 74 65 73 2e 0a 2a 2a 0a 2a 2a  uplicates..**.**
c810: 20 41 20 63 75 72 73 6f 72 20 69 73 20 6f 70 65   A cursor is ope
c820: 6e 65 64 20 6f 6e 20 74 68 65 20 62 2d 74 72 65  ned on the b-tre
c830: 65 20 6f 62 6a 65 63 74 20 74 68 61 74 20 69 73  e object that is
c840: 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 65 20   the RHS of the 
c850: 49 4e 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 61  IN operator.** a
c860: 6e 64 20 70 58 2d 3e 69 54 61 62 6c 65 20 69 73  nd pX->iTable is
c870: 20 73 65 74 20 74 6f 20 74 68 65 20 69 6e 64 65   set to the inde
c880: 78 20 6f 66 20 74 68 61 74 20 63 75 72 73 6f 72  x of that cursor
c890: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75  ..**.** The retu
c8a0: 72 6e 65 64 20 76 61 6c 75 65 20 6f 66 20 74 68  rned value of th
c8b0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 6e 64 69  is function indi
c8c0: 63 61 74 65 73 20 74 68 65 20 62 2d 74 72 65 65  cates the b-tree
c8d0: 20 74 79 70 65 2c 20 61 73 20 66 6f 6c 6c 6f 77   type, as follow
c8e0: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 49 4e 5f 49 4e  s:.**.**   IN_IN
c8f0: 44 45 58 5f 52 4f 57 49 44 20 20 20 20 20 20 2d  DEX_ROWID      -
c900: 20 54 68 65 20 63 75 72 73 6f 72 20 77 61 73 20   The cursor was 
c910: 6f 70 65 6e 65 64 20 6f 6e 20 61 20 64 61 74 61  opened on a data
c920: 62 61 73 65 20 74 61 62 6c 65 2e 0a 2a 2a 20 20  base table..**  
c930: 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f   IN_INDEX_INDEX_
c940: 41 53 43 20 20 2d 20 54 68 65 20 63 75 72 73 6f  ASC  - The curso
c950: 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20  r was opened on 
c960: 61 6e 20 61 73 63 65 6e 64 69 6e 67 20 69 6e 64  an ascending ind
c970: 65 78 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45  ex..**   IN_INDE
c980: 58 5f 49 4e 44 45 58 5f 44 45 53 43 20 2d 20 54  X_INDEX_DESC - T
c990: 68 65 20 63 75 72 73 6f 72 20 77 61 73 20 6f 70  he cursor was op
c9a0: 65 6e 65 64 20 6f 6e 20 61 20 64 65 73 63 65 6e  ened on a descen
c9b0: 64 69 6e 67 20 69 6e 64 65 78 2e 0a 2a 2a 20 20  ding index..**  
c9c0: 20 49 4e 5f 49 4e 44 45 58 5f 45 50 48 20 20 20   IN_INDEX_EPH   
c9d0: 20 20 20 20 20 2d 20 54 68 65 20 63 75 72 73 6f       - The curso
c9e0: 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20  r was opened on 
c9f0: 61 20 73 70 65 63 69 61 6c 6c 79 20 63 72 65 61  a specially crea
ca00: 74 65 64 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20  ted and.**      
ca10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca20: 20 20 20 70 6f 70 75 6c 61 74 65 64 20 65 70 68     populated eph
ca30: 65 72 65 6d 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a  eremal table..**
ca40: 20 20 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50     IN_INDEX_NOOP
ca50: 20 20 20 20 20 20 20 2d 20 4e 6f 20 63 75 72 73         - No curs
ca60: 6f 72 20 77 61 73 20 61 6c 6c 6f 63 61 74 65 64  or was allocated
ca70: 2e 20 20 54 68 65 20 49 4e 20 6f 70 65 72 61 74  .  The IN operat
ca80: 6f 72 20 6d 75 73 74 20 62 65 0a 2a 2a 20 20 20  or must be.**   
ca90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
caa0: 20 20 20 20 20 20 69 6d 70 6c 65 6d 65 6e 74 65        implemente
cab0: 64 20 61 73 20 61 20 73 65 71 75 65 6e 63 65 20  d as a sequence 
cac0: 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e 73 2e 0a  of comparisons..
cad0: 2a 2a 0a 2a 2a 20 41 6e 20 65 78 69 73 74 69 6e  **.** An existin
cae0: 67 20 62 2d 74 72 65 65 20 6d 69 67 68 74 20 62  g b-tree might b
caf0: 65 20 75 73 65 64 20 69 66 20 74 68 65 20 52 48  e used if the RH
cb00: 53 20 65 78 70 72 65 73 73 69 6f 6e 20 70 58 20  S expression pX 
cb10: 69 73 20 61 20 73 69 6d 70 6c 65 0a 2a 2a 20 73  is a simple.** s
cb20: 75 62 71 75 65 72 79 20 73 75 63 68 20 61 73 3a  ubquery such as:
cb30: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43  .**.**     SELEC
cb40: 54 20 3c 63 6f 6c 75 6d 6e 3e 20 46 52 4f 4d 20  T <column> FROM 
cb50: 3c 74 61 62 6c 65 3e 0a 2a 2a 0a 2a 2a 20 49 66  <table>.**.** If
cb60: 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 65 20   the RHS of the 
cb70: 49 4e 20 6f 70 65 72 61 74 6f 72 20 69 73 20 61  IN operator is a
cb80: 20 6c 69 73 74 20 6f 72 20 61 20 6d 6f 72 65 20   list or a more 
cb90: 63 6f 6d 70 6c 65 78 20 73 75 62 71 75 65 72 79  complex subquery
cba0: 2c 20 74 68 65 6e 0a 2a 2a 20 61 6e 20 65 70 68  , then.** an eph
cbb0: 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 6d 69 67  emeral table mig
cbc0: 68 74 20 6e 65 65 64 20 74 6f 20 62 65 20 67 65  ht need to be ge
cbd0: 6e 65 72 61 74 65 64 20 66 72 6f 6d 20 74 68 65  nerated from the
cbe0: 20 52 48 53 20 61 6e 64 20 74 68 65 6e 0a 2a 2a   RHS and then.**
cbf0: 20 70 58 2d 3e 69 54 61 62 6c 65 20 6d 61 64 65   pX->iTable made
cc00: 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   to point to the
cc10: 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65   ephemeral table
cc20: 20 69 6e 73 74 65 61 64 20 6f 66 20 61 6e 0a 2a   instead of an.*
cc30: 2a 20 65 78 69 73 74 69 6e 67 20 74 61 62 6c 65  * existing table
cc40: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 46 6c  ..**.** The inFl
cc50: 61 67 73 20 70 61 72 61 6d 65 74 65 72 20 6d 75  ags parameter mu
cc60: 73 74 20 63 6f 6e 74 61 69 6e 20 65 78 61 63 74  st contain exact
cc70: 6c 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 62 69  ly one of the bi
cc80: 74 73 0a 2a 2a 20 49 4e 5f 49 4e 44 45 58 5f 4d  ts.** IN_INDEX_M
cc90: 45 4d 42 45 52 53 48 49 50 20 6f 72 20 49 4e 5f  EMBERSHIP or IN_
cca0: 49 4e 44 45 58 5f 4c 4f 4f 50 2e 20 20 49 66 20  INDEX_LOOP.  If 
ccb0: 69 6e 46 6c 61 67 73 20 63 6f 6e 74 61 69 6e 73  inFlags contains
ccc0: 0a 2a 2a 20 49 4e 5f 49 4e 44 45 58 5f 4d 45 4d  .** IN_INDEX_MEM
ccd0: 42 45 52 53 48 49 50 2c 20 74 68 65 6e 20 74 68  BERSHIP, then th
cce0: 65 20 67 65 6e 65 72 61 74 65 64 20 74 61 62 6c  e generated tabl
ccf0: 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 66  e will be used f
cd00: 6f 72 20 61 0a 2a 2a 20 66 61 73 74 20 6d 65 6d  or a.** fast mem
cd10: 62 65 72 73 68 69 70 20 74 65 73 74 2e 20 20 57  bership test.  W
cd20: 68 65 6e 20 74 68 65 20 49 4e 5f 49 4e 44 45 58  hen the IN_INDEX
cd30: 5f 4c 4f 4f 50 20 62 69 74 20 69 73 20 73 65 74  _LOOP bit is set
cd40: 2c 20 74 68 65 0a 2a 2a 20 49 4e 20 69 6e 64 65  , the.** IN inde
cd50: 78 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74  x will be used t
cd60: 6f 20 6c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20  o loop over all 
cd70: 76 61 6c 75 65 73 20 6f 66 20 74 68 65 20 52 48  values of the RH
cd80: 53 20 6f 66 20 74 68 65 0a 2a 2a 20 49 4e 20 6f  S of the.** IN o
cd90: 70 65 72 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 57  perator..**.** W
cda0: 68 65 6e 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f  hen IN_INDEX_LOO
cdb0: 50 20 69 73 20 75 73 65 64 20 28 61 6e 64 20 74  P is used (and t
cdc0: 68 65 20 62 2d 74 72 65 65 20 77 69 6c 6c 20 62  he b-tree will b
cdd0: 65 20 75 73 65 64 20 74 6f 20 69 74 65 72 61 74  e used to iterat
cde0: 65 0a 2a 2a 20 74 68 72 6f 75 67 68 20 74 68 65  e.** through the
cdf0: 20 73 65 74 20 6d 65 6d 62 65 72 73 29 20 74 68   set members) th
ce00: 65 6e 20 74 68 65 20 62 2d 74 72 65 65 20 6d 75  en the b-tree mu
ce10: 73 74 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 64  st not contain d
ce20: 75 70 6c 69 63 61 74 65 73 2e 0a 2a 2a 20 41 6e  uplicates..** An
ce30: 20 65 70 68 65 72 65 6d 61 6c 20 74 61 62 6c 65   epheremal table
ce40: 20 6d 75 73 74 20 62 65 20 75 73 65 64 20 75 6e   must be used un
ce50: 6c 65 73 73 20 74 68 65 20 73 65 6c 65 63 74 65  less the selecte
ce60: 64 20 3c 63 6f 6c 75 6d 6e 3e 20 69 73 20 67 75  d <column> is gu
ce70: 61 72 61 6e 74 65 65 64 0a 2a 2a 20 74 6f 20 62  aranteed.** to b
ce80: 65 20 75 6e 69 71 75 65 20 2d 20 65 69 74 68 65  e unique - eithe
ce90: 72 20 62 65 63 61 75 73 65 20 69 74 20 69 73 20  r because it is 
cea0: 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  an INTEGER PRIMA
ceb0: 52 59 20 4b 45 59 20 6f 72 20 69 74 0a 2a 2a 20  RY KEY or it.** 
cec0: 68 61 73 20 61 20 55 4e 49 51 55 45 20 63 6f 6e  has a UNIQUE con
ced0: 73 74 72 61 69 6e 74 20 6f 72 20 55 4e 49 51 55  straint or UNIQU
cee0: 45 20 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 57  E index..**.** W
cef0: 68 65 6e 20 49 4e 5f 49 4e 44 45 58 5f 4d 45 4d  hen IN_INDEX_MEM
cf00: 42 45 52 53 48 49 50 20 69 73 20 75 73 65 64 20  BERSHIP is used 
cf10: 28 61 6e 64 20 74 68 65 20 62 2d 74 72 65 65 20  (and the b-tree 
cf20: 77 69 6c 6c 20 62 65 20 75 73 65 64 20 0a 2a 2a  will be used .**
cf30: 20 66 6f 72 20 66 61 73 74 20 73 65 74 20 6d 65   for fast set me
cf40: 6d 62 65 72 73 68 69 70 20 74 65 73 74 73 29 20  mbership tests) 
cf50: 74 68 65 6e 20 61 6e 20 65 70 68 65 72 65 6d 61  then an epherema
cf60: 6c 20 74 61 62 6c 65 20 6d 75 73 74 20 0a 2a 2a  l table must .**
cf70: 20 62 65 20 75 73 65 64 20 75 6e 6c 65 73 73 20   be used unless 
cf80: 3c 63 6f 6c 75 6d 6e 3e 20 69 73 20 61 6e 20 49  <column> is an I
cf90: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
cfa0: 45 59 20 6f 72 20 61 6e 20 69 6e 64 65 78 20 63  EY or an index c
cfb0: 61 6e 20 0a 2a 2a 20 62 65 20 66 6f 75 6e 64 20  an .** be found 
cfc0: 77 69 74 68 20 3c 63 6f 6c 75 6d 6e 3e 20 61 73  with <column> as
cfd0: 20 69 74 73 20 6c 65 66 74 2d 6d 6f 73 74 20 63   its left-most c
cfe0: 6f 6c 75 6d 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  olumn..**.** If 
cff0: 74 68 65 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f  the IN_INDEX_NOO
d000: 50 5f 4f 4b 20 61 6e 64 20 49 4e 5f 49 4e 44 45  P_OK and IN_INDE
d010: 58 5f 4d 45 4d 42 45 52 53 48 49 50 20 61 72 65  X_MEMBERSHIP are
d020: 20 62 6f 74 68 20 73 65 74 20 61 6e 64 0a 2a 2a   both set and.**
d030: 20 69 66 20 74 68 65 20 52 48 53 20 6f 66 20 74   if the RHS of t
d040: 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 69  he IN operator i
d050: 73 20 61 20 6c 69 73 74 20 28 6e 6f 74 20 61 20  s a list (not a 
d060: 73 75 62 71 75 65 72 79 29 20 74 68 65 6e 20 74  subquery) then t
d070: 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 6d  his.** routine m
d080: 69 67 68 74 20 64 65 63 69 64 65 20 74 68 61 74  ight decide that
d090: 20 63 72 65 61 74 69 6e 67 20 61 6e 20 65 70 68   creating an eph
d0a0: 65 6d 65 72 61 6c 20 62 2d 74 72 65 65 20 66 6f  emeral b-tree fo
d0b0: 72 20 6d 65 6d 62 65 72 73 68 69 70 0a 2a 2a 20  r membership.** 
d0c0: 74 65 73 74 69 6e 67 20 69 73 20 74 6f 6f 20 65  testing is too e
d0d0: 78 70 65 6e 73 69 76 65 20 61 6e 64 20 72 65 74  xpensive and ret
d0e0: 75 72 6e 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f  urn IN_INDEX_NOO
d0f0: 50 2e 20 20 49 6e 20 74 68 61 74 20 63 61 73 65  P.  In that case
d100: 2c 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67  , the.** calling
d110: 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20   routine should 
d120: 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 49 4e  implement the IN
d130: 20 6f 70 65 72 61 74 6f 72 20 75 73 69 6e 67 20   operator using 
d140: 61 20 73 65 71 75 65 6e 63 65 0a 2a 2a 20 6f 66  a sequence.** of
d150: 20 45 71 20 6f 72 20 4e 65 20 63 6f 6d 70 61 72   Eq or Ne compar
d160: 69 73 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 73 2e  ison operations.
d170: 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 65 20  .**.** When the 
d180: 62 2d 74 72 65 65 20 69 73 20 62 65 69 6e 67 20  b-tree is being 
d190: 75 73 65 64 20 66 6f 72 20 6d 65 6d 62 65 72 73  used for members
d1a0: 68 69 70 20 74 65 73 74 73 2c 20 74 68 65 20 63  hip tests, the c
d1b0: 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a  alling function.
d1c0: 2a 2a 20 6d 69 67 68 74 20 6e 65 65 64 20 74 6f  ** might need to
d1d0: 20 6b 6e 6f 77 20 77 68 65 74 68 65 72 20 6f 72   know whether or
d1e0: 20 6e 6f 74 20 74 68 65 20 52 48 53 20 73 69 64   not the RHS sid
d1f0: 65 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72  e of the IN oper
d200: 61 74 6f 72 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73  ator.** contains
d210: 20 61 20 4e 55 4c 4c 2e 20 20 49 66 20 70 72 52   a NULL.  If prR
d220: 68 73 48 61 73 4e 75 6c 6c 20 69 73 20 6e 6f 74  hsHasNull is not
d230: 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20   a NULL pointer 
d240: 61 6e 64 20 0a 2a 2a 20 69 66 20 74 68 65 72 65  and .** if there
d250: 20 69 73 20 61 6e 79 20 63 68 61 6e 63 65 20 74   is any chance t
d260: 68 61 74 20 74 68 65 20 28 2e 2e 2e 29 20 6d 69  hat the (...) mi
d270: 67 68 74 20 63 6f 6e 74 61 69 6e 20 61 20 4e 55  ght contain a NU
d280: 4c 4c 20 76 61 6c 75 65 20 61 74 0a 2a 2a 20 72  LL value at.** r
d290: 75 6e 74 69 6d 65 2c 20 74 68 65 6e 20 61 20 72  untime, then a r
d2a0: 65 67 69 73 74 65 72 20 69 73 20 61 6c 6c 6f 63  egister is alloc
d2b0: 61 74 65 64 20 61 6e 64 20 74 68 65 20 72 65 67  ated and the reg
d2c0: 69 73 74 65 72 20 6e 75 6d 62 65 72 20 77 72 69  ister number wri
d2d0: 74 74 65 6e 0a 2a 2a 20 74 6f 20 2a 70 72 52 68  tten.** to *prRh
d2e0: 73 48 61 73 4e 75 6c 6c 2e 20 49 66 20 74 68 65  sHasNull. If the
d2f0: 72 65 20 69 73 20 6e 6f 20 63 68 61 6e 63 65 20  re is no chance 
d300: 74 68 61 74 20 74 68 65 20 28 2e 2e 2e 29 20 63  that the (...) c
d310: 6f 6e 74 61 69 6e 73 20 61 0a 2a 2a 20 4e 55 4c  ontains a.** NUL
d320: 4c 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 2a 70  L value, then *p
d330: 72 52 68 73 48 61 73 4e 75 6c 6c 20 69 73 20 6c  rRhsHasNull is l
d340: 65 66 74 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a  eft unchanged..*
d350: 2a 0a 2a 2a 20 49 66 20 61 20 72 65 67 69 73 74  *.** If a regist
d360: 65 72 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20  er is allocated 
d370: 61 6e 64 20 69 74 73 20 6c 6f 63 61 74 69 6f 6e  and its location
d380: 20 73 74 6f 72 65 64 20 69 6e 20 2a 70 72 52 68   stored in *prRh
d390: 73 48 61 73 4e 75 6c 6c 2c 20 74 68 65 6e 0a 2a  sHasNull, then.*
d3a0: 2a 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 74  * the value in t
d3b0: 68 61 74 20 72 65 67 69 73 74 65 72 20 77 69 6c  hat register wil
d3c0: 6c 20 62 65 20 4e 55 4c 4c 20 69 66 20 74 68 65  l be NULL if the
d3d0: 20 62 2d 74 72 65 65 20 63 6f 6e 74 61 69 6e 73   b-tree contains
d3e0: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20   one or more.** 
d3f0: 4e 55 4c 4c 20 76 61 6c 75 65 73 2c 20 61 6e 64  NULL values, and
d400: 20 69 74 20 77 69 6c 6c 20 62 65 20 73 6f 6d 65   it will be some
d410: 20 6e 6f 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65 20   non-NULL value 
d420: 69 66 20 74 68 65 20 62 2d 74 72 65 65 20 63 6f  if the b-tree co
d430: 6e 74 61 69 6e 73 20 6e 6f 0a 2a 2a 20 4e 55 4c  ntains no.** NUL
d440: 4c 20 76 61 6c 75 65 73 2e 0a 2a 2f 0a 23 69 66  L values..*/.#if
d450: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
d460: 5f 53 55 42 51 55 45 52 59 0a 69 6e 74 20 73 71  _SUBQUERY.int sq
d470: 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e 64 65 78  lite3FindInIndex
d480: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
d490: 45 78 70 72 20 2a 70 58 2c 20 75 33 32 20 69 6e  Expr *pX, u32 in
d4a0: 46 6c 61 67 73 2c 20 69 6e 74 20 2a 70 72 52 68  Flags, int *prRh
d4b0: 73 48 61 73 4e 75 6c 6c 29 7b 0a 20 20 53 65 6c  sHasNull){.  Sel
d4c0: 65 63 74 20 2a 70 3b 20 20 20 20 20 20 20 20 20  ect *p;         
d4d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d4e0: 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 74 6f 20     /* SELECT to 
d4f0: 74 68 65 20 72 69 67 68 74 20 6f 66 20 49 4e 20  the right of IN 
d500: 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e  operator */.  in
d510: 74 20 65 54 79 70 65 20 3d 20 30 3b 20 20 20 20  t eType = 0;    
d520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d530: 20 20 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 52      /* Type of R
d540: 48 53 20 74 61 62 6c 65 2e 20 49 4e 5f 49 4e 44  HS table. IN_IND
d550: 45 58 5f 2a 20 2a 2f 0a 20 20 69 6e 74 20 69 54  EX_* */.  int iT
d560: 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  ab = pParse->nTa
d570: 62 2b 2b 3b 20 20 20 20 20 20 20 20 20 20 20 20  b++;            
d580: 2f 2a 20 43 75 72 73 6f 72 20 6f 66 20 74 68 65  /* Cursor of the
d590: 20 52 48 53 20 74 61 62 6c 65 20 2a 2f 0a 20 20   RHS table */.  
d5a0: 69 6e 74 20 6d 75 73 74 42 65 55 6e 69 71 75 65  int mustBeUnique
d5b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
d5c0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
d5d0: 20 52 48 53 20 6d 75 73 74 20 62 65 20 75 6e 69   RHS must be uni
d5e0: 71 75 65 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  que */.  Vdbe *v
d5f0: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
d600: 65 28 70 50 61 72 73 65 29 3b 20 20 20 20 20 2f  e(pParse);     /
d610: 2a 20 56 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  * Virtual machin
d620: 65 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f  e being coded */
d630: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 58 2d 3e  ..  assert( pX->
d640: 6f 70 3d 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20 6d  op==TK_IN );.  m
d650: 75 73 74 42 65 55 6e 69 71 75 65 20 3d 20 28 69  ustBeUnique = (i
d660: 6e 46 6c 61 67 73 20 26 20 49 4e 5f 49 4e 44 45  nFlags & IN_INDE
d670: 58 5f 4c 4f 4f 50 29 21 3d 30 3b 0a 0a 20 20 2f  X_LOOP)!=0;..  /
d680: 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
d690: 66 20 61 6e 20 65 78 69 73 74 69 6e 67 20 74 61  f an existing ta
d6a0: 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 63 61 6e  ble or index can
d6b0: 20 62 65 20 75 73 65 64 20 74 6f 0a 20 20 2a 2a   be used to.  **
d6c0: 20 73 61 74 69 73 66 79 20 74 68 65 20 71 75 65   satisfy the que
d6d0: 72 79 2e 20 20 54 68 69 73 20 69 73 20 70 72 65  ry.  This is pre
d6e0: 66 65 72 61 62 6c 65 20 74 6f 20 67 65 6e 65 72  ferable to gener
d6f0: 61 74 69 6e 67 20 61 20 6e 65 77 20 0a 20 20 2a  ating a new .  *
d700: 2a 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c  * ephemeral tabl
d710: 65 2e 0a 20 20 2a 2f 0a 20 20 70 20 3d 20 28 45  e..  */.  p = (E
d720: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
d730: 58 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  X, EP_xIsSelect)
d740: 20 3f 20 70 58 2d 3e 78 2e 70 53 65 6c 65 63 74   ? pX->x.pSelect
d750: 20 3a 20 30 29 3b 0a 20 20 69 66 28 20 41 4c 57   : 0);.  if( ALW
d760: 41 59 53 28 70 50 61 72 73 65 2d 3e 6e 45 72 72  AYS(pParse->nErr
d770: 3d 3d 30 29 20 26 26 20 69 73 43 61 6e 64 69 64  ==0) && isCandid
d780: 61 74 65 46 6f 72 49 6e 4f 70 74 28 70 29 20 29  ateForInOpt(p) )
d790: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64  {.    sqlite3 *d
d7a0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20  b = pParse->db; 
d7b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d7c0: 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
d7d0: 69 6f 6e 20 2a 2f 0a 20 20 20 20 54 61 62 6c 65  ion */.    Table
d7e0: 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20 20   *pTab;         
d7f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d800: 20 20 2f 2a 20 54 61 62 6c 65 20 3c 74 61 62 6c    /* Table <tabl
d810: 65 3e 2e 20 2a 2f 0a 20 20 20 20 45 78 70 72 20  e>. */.    Expr 
d820: 2a 70 45 78 70 72 3b 20 20 20 20 20 20 20 20 20  *pExpr;         
d830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d840: 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20    /* Expression 
d850: 3c 63 6f 6c 75 6d 6e 3e 20 2a 2f 0a 20 20 20 20  <column> */.    
d860: 69 31 36 20 69 43 6f 6c 3b 20 20 20 20 20 20 20  i16 iCol;       
d870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d880: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
d890: 6f 66 20 63 6f 6c 75 6d 6e 20 3c 63 6f 6c 75 6d  of column <colum
d8a0: 6e 3e 20 2a 2f 0a 20 20 20 20 69 31 36 20 69 44  n> */.    i16 iD
d8b0: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
d8c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d8d0: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 69 64 78   /* Database idx
d8e0: 20 66 6f 72 20 70 54 61 62 20 2a 2f 0a 0a 20 20   for pTab */..  
d8f0: 20 20 61 73 73 65 72 74 28 20 70 20 29 3b 20 20    assert( p );  
d900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d910: 20 20 20 20 20 20 2f 2a 20 42 65 63 61 75 73 65        /* Because
d920: 20 6f 66 20 69 73 43 61 6e 64 69 64 61 74 65 46   of isCandidateF
d930: 6f 72 49 6e 4f 70 74 28 70 29 20 2a 2f 0a 20 20  orInOpt(p) */.  
d940: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c    assert( p->pEL
d950: 69 73 74 21 3d 30 20 29 3b 20 20 20 20 20 20 20  ist!=0 );       
d960: 20 20 20 20 20 20 2f 2a 20 42 65 63 61 75 73 65        /* Because
d970: 20 6f 66 20 69 73 43 61 6e 64 69 64 61 74 65 46   of isCandidateF
d980: 6f 72 49 6e 4f 70 74 28 70 29 20 2a 2f 0a 20 20  orInOpt(p) */.  
d990: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c    assert( p->pEL
d9a0: 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 21  ist->a[0].pExpr!
d9b0: 3d 30 20 29 3b 20 2f 2a 20 42 65 63 61 75 73 65  =0 ); /* Because
d9c0: 20 6f 66 20 69 73 43 61 6e 64 69 64 61 74 65 46   of isCandidateF
d9d0: 6f 72 49 6e 4f 70 74 28 70 29 20 2a 2f 0a 20 20  orInOpt(p) */.  
d9e0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 53 72    assert( p->pSr
d9f0: 63 21 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20  c!=0 );         
da00: 20 20 20 20 20 20 2f 2a 20 42 65 63 61 75 73 65        /* Because
da10: 20 6f 66 20 69 73 43 61 6e 64 69 64 61 74 65 46   of isCandidateF
da20: 6f 72 49 6e 4f 70 74 28 70 29 20 2a 2f 0a 20 20  orInOpt(p) */.  
da30: 20 20 70 54 61 62 20 3d 20 70 2d 3e 70 53 72 63    pTab = p->pSrc
da40: 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 20 20 20  ->a[0].pTab;.   
da50: 20 70 45 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69   pExpr = p->pELi
da60: 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a  st->a[0].pExpr;.
da70: 20 20 20 20 69 43 6f 6c 20 3d 20 28 69 31 36 29      iCol = (i16)
da80: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a  pExpr->iColumn;.
da90: 20 20 20 0a 20 20 20 20 2f 2a 20 43 6f 64 65 20     .    /* Code 
daa0: 61 6e 20 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f  an OP_Transactio
dab0: 6e 20 61 6e 64 20 4f 50 5f 54 61 62 6c 65 4c 6f  n and OP_TableLo
dac0: 63 6b 20 66 6f 72 20 3c 74 61 62 6c 65 3e 2e 20  ck for <table>. 
dad0: 2a 2f 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c  */.    iDb = sql
dae0: 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
daf0: 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68  x(db, pTab->pSch
db00: 65 6d 61 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ema);.    sqlite
db10: 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d  3CodeVerifySchem
db20: 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a  a(pParse, iDb);.
db30: 20 20 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65      sqlite3Table
db40: 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69 44 62  Lock(pParse, iDb
db50: 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c  , pTab->tnum, 0,
db60: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a   pTab->zName);..
db70: 20 20 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63      /* This func
db80: 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 63 61 6c  tion is only cal
db90: 6c 65 64 20 66 72 6f 6d 20 74 77 6f 20 70 6c 61  led from two pla
dba0: 63 65 73 2e 20 49 6e 20 62 6f 74 68 20 63 61 73  ces. In both cas
dbb0: 65 73 20 74 68 65 20 76 64 62 65 0a 20 20 20 20  es the vdbe.    
dbc0: 2a 2a 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  ** has already b
dbd0: 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2e 20 53  een allocated. S
dbe0: 6f 20 61 73 73 75 6d 65 20 73 71 6c 69 74 65 33  o assume sqlite3
dbf0: 47 65 74 56 64 62 65 28 29 20 69 73 20 61 6c 77  GetVdbe() is alw
dc00: 61 79 73 0a 20 20 20 20 2a 2a 20 73 75 63 63 65  ays.    ** succe
dc10: 73 73 66 75 6c 20 68 65 72 65 2e 0a 20 20 20 20  ssful here..    
dc20: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 76 29  */.    assert(v)
dc30: 3b 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30  ;.    if( iCol<0
dc40: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 41   ){.      int iA
dc50: 64 64 72 20 3d 20 73 71 6c 69 74 65 33 43 6f 64  ddr = sqlite3Cod
dc60: 65 4f 6e 63 65 28 70 50 61 72 73 65 29 3b 0a 20  eOnce(pParse);. 
dc70: 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
dc80: 65 28 76 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c  e(v);..      sql
dc90: 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50  ite3OpenTable(pP
dca0: 61 72 73 65 2c 20 69 54 61 62 2c 20 69 44 62 2c  arse, iTab, iDb,
dcb0: 20 70 54 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65   pTab, OP_OpenRe
dcc0: 61 64 29 3b 0a 20 20 20 20 20 20 65 54 79 70 65  ad);.      eType
dcd0: 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49   = IN_INDEX_ROWI
dce0: 44 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65  D;..      sqlite
dcf0: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
dd00: 20 69 41 64 64 72 29 3b 0a 20 20 20 20 7d 65 6c   iAddr);.    }el
dd10: 73 65 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20  se{.      Index 
dd20: 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20 20 20  *pIdx;          
dd30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
dd40: 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72 69 61  * Iterator varia
dd50: 62 6c 65 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a  ble */..      /*
dd60: 20 54 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   The collation s
dd70: 65 71 75 65 6e 63 65 20 75 73 65 64 20 62 79 20  equence used by 
dd80: 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20  the comparison. 
dd90: 49 66 20 61 6e 20 69 6e 64 65 78 20 69 73 20 74  If an index is t
dda0: 6f 0a 20 20 20 20 20 20 2a 2a 20 62 65 20 75 73  o.      ** be us
ddb0: 65 64 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 61  ed in place of a
ddc0: 20 74 65 6d 70 2d 74 61 62 6c 65 2c 20 69 74 20   temp-table, it 
ddd0: 6d 75 73 74 20 62 65 20 6f 72 64 65 72 65 64 20  must be ordered 
dde0: 61 63 63 6f 72 64 69 6e 67 0a 20 20 20 20 20 20  according.      
ddf0: 2a 2a 20 74 6f 20 74 68 69 73 20 63 6f 6c 6c 61  ** to this colla
de00: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 2e 20 20  tion sequence.  
de10: 2a 2f 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71  */.      CollSeq
de20: 20 2a 70 52 65 71 20 3d 20 73 71 6c 69 74 65 33   *pReq = sqlite3
de30: 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c  BinaryCompareCol
de40: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 58 2d  lSeq(pParse, pX-
de50: 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 29 3b 0a  >pLeft, pExpr);.
de60: 0a 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  .      /* Check 
de70: 74 68 61 74 20 74 68 65 20 61 66 66 69 6e 69 74  that the affinit
de80: 79 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 75  y that will be u
de90: 73 65 64 20 74 6f 20 70 65 72 66 6f 72 6d 20 74  sed to perform t
dea0: 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6d  he .      ** com
deb0: 70 61 72 69 73 6f 6e 20 69 73 20 74 68 65 20 73  parison is the s
dec0: 61 6d 65 20 61 73 20 74 68 65 20 61 66 66 69 6e  ame as the affin
ded0: 69 74 79 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  ity of the colum
dee0: 6e 2e 20 49 66 0a 20 20 20 20 20 20 2a 2a 20 69  n. If.      ** i
def0: 74 20 69 73 20 6e 6f 74 2c 20 69 74 20 69 73 20  t is not, it is 
df00: 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20  not possible to 
df10: 75 73 65 20 61 6e 79 20 69 6e 64 65 78 2e 0a 20  use any index.. 
df20: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e       */.      in
df30: 74 20 61 66 66 69 6e 69 74 79 5f 6f 6b 20 3d 20  t affinity_ok = 
df40: 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69  sqlite3IndexAffi
df50: 6e 69 74 79 4f 6b 28 70 58 2c 20 70 54 61 62 2d  nityOk(pX, pTab-
df60: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 61 66 66 69  >aCol[iCol].affi
df70: 6e 69 74 79 29 3b 0a 0a 20 20 20 20 20 20 66 6f  nity);..      fo
df80: 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  r(pIdx=pTab->pIn
df90: 64 65 78 3b 20 70 49 64 78 20 26 26 20 65 54 79  dex; pIdx && eTy
dfa0: 70 65 3d 3d 30 20 26 26 20 61 66 66 69 6e 69 74  pe==0 && affinit
dfb0: 79 5f 6f 6b 3b 20 70 49 64 78 3d 70 49 64 78 2d  y_ok; pIdx=pIdx-
dfc0: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20  >pNext){.       
dfd0: 20 69 66 28 20 28 70 49 64 78 2d 3e 61 69 43 6f   if( (pIdx->aiCo
dfe0: 6c 75 6d 6e 5b 30 5d 3d 3d 69 43 6f 6c 29 0a 20  lumn[0]==iCol). 
dff0: 20 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74          && sqlit
e000: 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62  e3FindCollSeq(db
e010: 2c 20 45 4e 43 28 64 62 29 2c 20 70 49 64 78 2d  , ENC(db), pIdx-
e020: 3e 61 7a 43 6f 6c 6c 5b 30 5d 2c 20 30 29 3d 3d  >azColl[0], 0)==
e030: 70 52 65 71 0a 20 20 20 20 20 20 20 20 20 26 26  pReq.         &&
e040: 20 28 21 6d 75 73 74 42 65 55 6e 69 71 75 65 20   (!mustBeUnique 
e050: 7c 7c 20 28 70 49 64 78 2d 3e 6e 4b 65 79 43 6f  || (pIdx->nKeyCo
e060: 6c 3d 3d 31 20 26 26 20 49 73 55 6e 69 71 75 65  l==1 && IsUnique
e070: 49 6e 64 65 78 28 70 49 64 78 29 29 29 0a 20 20  Index(pIdx))).  
e080: 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
e090: 20 20 20 69 6e 74 20 69 41 64 64 72 20 3d 20 73     int iAddr = s
e0a0: 71 6c 69 74 65 33 43 6f 64 65 4f 6e 63 65 28 70  qlite3CodeOnce(p
e0b0: 50 61 72 73 65 29 3b 20 56 64 62 65 43 6f 76 65  Parse); VdbeCove
e0c0: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
e0d0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
e0e0: 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 52  dOp3(v, OP_OpenR
e0f0: 65 61 64 2c 20 69 54 61 62 2c 20 70 49 64 78 2d  ead, iTab, pIdx-
e100: 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20 20  >tnum, iDb);.   
e110: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
e120: 62 65 53 65 74 50 34 4b 65 79 49 6e 66 6f 28 70  beSetP4KeyInfo(p
e130: 50 61 72 73 65 2c 20 70 49 64 78 29 3b 0a 20 20  Parse, pIdx);.  
e140: 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d          VdbeComm
e150: 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70 49  ent((v, "%s", pI
e160: 64 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20  dx->zName));.   
e170: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 49         assert( I
e180: 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 44 45  N_INDEX_INDEX_DE
e190: 53 43 20 3d 3d 20 49 4e 5f 49 4e 44 45 58 5f 49  SC == IN_INDEX_I
e1a0: 4e 44 45 58 5f 41 53 43 2b 31 20 29 3b 0a 20 20  NDEX_ASC+1 );.  
e1b0: 20 20 20 20 20 20 20 20 65 54 79 70 65 20 3d 20          eType = 
e1c0: 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 41  IN_INDEX_INDEX_A
e1d0: 53 43 20 2b 20 70 49 64 78 2d 3e 61 53 6f 72 74  SC + pIdx->aSort
e1e0: 4f 72 64 65 72 5b 30 5d 3b 0a 0a 20 20 20 20 20  Order[0];..     
e1f0: 20 20 20 20 20 69 66 28 20 70 72 52 68 73 48 61       if( prRhsHa
e200: 73 4e 75 6c 6c 20 26 26 20 21 70 54 61 62 2d 3e  sNull && !pTab->
e210: 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 6e 6f 74 4e 75  aCol[iCol].notNu
e220: 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ll ){.          
e230: 20 20 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c 20    *prRhsHasNull 
e240: 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
e250: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
e260: 6c 69 74 65 33 53 65 74 48 61 73 4e 75 6c 6c 46  lite3SetHasNullF
e270: 6c 61 67 28 76 2c 20 69 54 61 62 2c 20 2a 70 72  lag(v, iTab, *pr
e280: 52 68 73 48 61 73 4e 75 6c 6c 29 3b 0a 20 20 20  RhsHasNull);.   
e290: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
e2a0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
e2b0: 6d 70 48 65 72 65 28 76 2c 20 69 41 64 64 72 29  mpHere(v, iAddr)
e2c0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
e2d0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
e2e0: 20 2f 2a 20 49 66 20 6e 6f 20 70 72 65 65 78 69   /* If no preexi
e2f0: 73 74 69 6e 67 20 69 6e 64 65 78 20 69 73 20 61  sting index is a
e300: 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 74 68 65  vailable for the
e310: 20 49 4e 20 63 6c 61 75 73 65 0a 20 20 2a 2a 20   IN clause.  ** 
e320: 61 6e 64 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f  and IN_INDEX_NOO
e330: 50 20 69 73 20 61 6e 20 61 6c 6c 6f 77 65 64 20  P is an allowed 
e340: 72 65 70 6c 79 0a 20 20 2a 2a 20 61 6e 64 20 74  reply.  ** and t
e350: 68 65 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e  he RHS of the IN
e360: 20 6f 70 65 72 61 74 6f 72 20 69 73 20 61 20 6c   operator is a l
e370: 69 73 74 2c 20 6e 6f 74 20 61 20 73 75 62 71 75  ist, not a subqu
e380: 65 72 79 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65  ery.  ** and the
e390: 20 52 48 53 20 69 73 20 6e 6f 74 20 63 6f 6e 74   RHS is not cont
e3a0: 61 6e 74 20 6f 72 20 68 61 73 20 74 77 6f 20 6f  ant or has two o
e3b0: 72 20 66 65 77 65 72 20 74 65 72 6d 73 2c 0a 20  r fewer terms,. 
e3c0: 20 2a 2a 20 74 68 65 6e 20 69 74 20 69 73 20 6e   ** then it is n
e3d0: 6f 74 20 77 6f 72 74 68 20 63 72 65 61 74 69 6e  ot worth creatin
e3e0: 67 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 74  g an ephemeral t
e3f0: 61 62 6c 65 20 74 6f 20 65 76 61 6c 75 61 74 65  able to evaluate
e400: 0a 20 20 2a 2a 20 74 68 65 20 49 4e 20 6f 70 65  .  ** the IN ope
e410: 72 61 74 6f 72 20 73 6f 20 72 65 74 75 72 6e 20  rator so return 
e420: 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 2e 0a 20  IN_INDEX_NOOP.. 
e430: 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65 3d   */.  if( eType=
e440: 3d 30 0a 20 20 20 26 26 20 28 69 6e 46 6c 61 67  =0.   && (inFlag
e450: 73 20 26 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f  s & IN_INDEX_NOO
e460: 50 5f 4f 4b 29 0a 20 20 20 26 26 20 21 45 78 70  P_OK).   && !Exp
e470: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 58 2c  rHasProperty(pX,
e480: 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 0a 20   EP_xIsSelect). 
e490: 20 20 26 26 20 28 21 73 71 6c 69 74 65 33 49 6e    && (!sqlite3In
e4a0: 52 68 73 49 73 43 6f 6e 73 74 61 6e 74 28 70 58  RhsIsConstant(pX
e4b0: 29 20 7c 7c 20 70 58 2d 3e 78 2e 70 4c 69 73 74  ) || pX->x.pList
e4c0: 2d 3e 6e 45 78 70 72 3c 3d 32 29 0a 20 20 29 7b  ->nExpr<=2).  ){
e4d0: 0a 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f  .    eType = IN_
e4e0: 49 4e 44 45 58 5f 4e 4f 4f 50 3b 0a 20 20 7d 0a  INDEX_NOOP;.  }.
e4f0: 20 20 20 20 20 0a 0a 20 20 69 66 28 20 65 54 79       ..  if( eTy
e500: 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  pe==0 ){.    /* 
e510: 43 6f 75 6c 64 20 6e 6f 74 20 66 69 6e 64 20 61  Could not find a
e520: 6e 20 65 78 69 73 74 69 6e 67 20 74 61 62 6c 65  n existing table
e530: 20 6f 72 20 69 6e 64 65 78 20 74 6f 20 75 73 65   or index to use
e540: 20 61 73 20 74 68 65 20 52 48 53 20 62 2d 74 72   as the RHS b-tr
e550: 65 65 2e 0a 20 20 20 20 2a 2a 20 57 65 20 77 69  ee..    ** We wi
e560: 6c 6c 20 68 61 76 65 20 74 6f 20 67 65 6e 65 72  ll have to gener
e570: 61 74 65 20 61 6e 20 65 70 68 65 6d 65 72 61 6c  ate an ephemeral
e580: 20 74 61 62 6c 65 20 74 6f 20 64 6f 20 74 68 65   table to do the
e590: 20 6a 6f 62 2e 0a 20 20 20 20 2a 2f 0a 20 20 20   job..    */.   
e5a0: 20 75 33 32 20 73 61 76 65 64 4e 51 75 65 72 79   u32 savedNQuery
e5b0: 4c 6f 6f 70 20 3d 20 70 50 61 72 73 65 2d 3e 6e  Loop = pParse->n
e5c0: 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 20 20 69  QueryLoop;.    i
e5d0: 6e 74 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20  nt rMayHaveNull 
e5e0: 3d 20 30 3b 0a 20 20 20 20 65 54 79 70 65 20 3d  = 0;.    eType =
e5f0: 20 49 4e 5f 49 4e 44 45 58 5f 45 50 48 3b 0a 20   IN_INDEX_EPH;. 
e600: 20 20 20 69 66 28 20 69 6e 46 6c 61 67 73 20 26     if( inFlags &
e610: 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 20 29   IN_INDEX_LOOP )
e620: 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  {.      pParse->
e630: 6e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 30 3b 0a  nQueryLoop = 0;.
e640: 20 20 20 20 20 20 69 66 28 20 70 58 2d 3e 70 4c        if( pX->pL
e650: 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 26  eft->iColumn<0 &
e660: 26 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  & !ExprHasProper
e670: 74 79 28 70 58 2c 20 45 50 5f 78 49 73 53 65 6c  ty(pX, EP_xIsSel
e680: 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ect) ){.        
e690: 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58  eType = IN_INDEX
e6a0: 5f 52 4f 57 49 44 3b 0a 20 20 20 20 20 20 7d 0a  _ROWID;.      }.
e6b0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 72      }else if( pr
e6c0: 52 68 73 48 61 73 4e 75 6c 6c 20 29 7b 0a 20 20  RhsHasNull ){.  
e6d0: 20 20 20 20 2a 70 72 52 68 73 48 61 73 4e 75 6c      *prRhsHasNul
e6e0: 6c 20 3d 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c  l = rMayHaveNull
e6f0: 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
e700: 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  m;.    }.    sql
e710: 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63  ite3CodeSubselec
e720: 74 28 70 50 61 72 73 65 2c 20 70 58 2c 20 72 4d  t(pParse, pX, rM
e730: 61 79 48 61 76 65 4e 75 6c 6c 2c 20 65 54 79 70  ayHaveNull, eTyp
e740: 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49  e==IN_INDEX_ROWI
e750: 44 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  D);.    pParse->
e760: 6e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 73 61 76  nQueryLoop = sav
e770: 65 64 4e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20  edNQueryLoop;.  
e780: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 58 2d 3e 69  }else{.    pX->i
e790: 54 61 62 6c 65 20 3d 20 69 54 61 62 3b 0a 20 20  Table = iTab;.  
e7a0: 7d 0a 20 20 72 65 74 75 72 6e 20 65 54 79 70 65  }.  return eType
e7b0: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
e7c0: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
e7d0: 66 6f 72 20 73 63 61 6c 61 72 20 73 75 62 71 75  for scalar subqu
e7e0: 65 72 69 65 73 20 75 73 65 64 20 61 73 20 61 20  eries used as a 
e7f0: 73 75 62 71 75 65 72 79 20 65 78 70 72 65 73 73  subquery express
e800: 69 6f 6e 2c 20 45 58 49 53 54 53 2c 0a 2a 2a 20  ion, EXISTS,.** 
e810: 6f 72 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 2e  or IN operators.
e820: 20 20 45 78 61 6d 70 6c 65 73 3a 0a 2a 2a 0a 2a    Examples:.**.*
e830: 2a 20 20 20 20 20 28 53 45 4c 45 43 54 20 61 20  *     (SELECT a 
e840: 46 52 4f 4d 20 62 29 20 20 20 20 20 20 20 20 20  FROM b)         
e850: 20 2d 2d 20 73 75 62 71 75 65 72 79 0a 2a 2a 20   -- subquery.** 
e860: 20 20 20 20 45 58 49 53 54 53 20 28 53 45 4c 45      EXISTS (SELE
e870: 43 54 20 61 20 46 52 4f 4d 20 62 29 20 20 20 2d  CT a FROM b)   -
e880: 2d 20 45 58 49 53 54 53 20 73 75 62 71 75 65 72  - EXISTS subquer
e890: 79 0a 2a 2a 20 20 20 20 20 78 20 49 4e 20 28 34  y.**     x IN (4
e8a0: 2c 35 2c 31 31 29 20 20 20 20 20 20 20 20 20 20  ,5,11)          
e8b0: 20 20 20 20 2d 2d 20 49 4e 20 6f 70 65 72 61 74      -- IN operat
e8c0: 6f 72 20 77 69 74 68 20 6c 69 73 74 20 6f 6e 20  or with list on 
e8d0: 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 0a  right-hand side.
e8e0: 2a 2a 20 20 20 20 20 78 20 49 4e 20 28 53 45 4c  **     x IN (SEL
e8f0: 45 43 54 20 61 20 46 52 4f 4d 20 62 29 20 20 20  ECT a FROM b)   
e900: 20 20 2d 2d 20 49 4e 20 6f 70 65 72 61 74 6f 72    -- IN operator
e910: 20 77 69 74 68 20 73 75 62 71 75 65 72 79 20 6f   with subquery o
e920: 6e 20 74 68 65 20 72 69 67 68 74 0a 2a 2a 0a 2a  n the right.**.*
e930: 2a 20 54 68 65 20 70 45 78 70 72 20 70 61 72 61  * The pExpr para
e940: 6d 65 74 65 72 20 64 65 73 63 72 69 62 65 73 20  meter describes 
e950: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74  the expression t
e960: 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
e970: 20 49 4e 0a 2a 2a 20 6f 70 65 72 61 74 6f 72 20   IN.** operator 
e980: 6f 72 20 73 75 62 71 75 65 72 79 2e 0a 2a 2a 0a  or subquery..**.
e990: 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72 20  ** If parameter 
e9a0: 69 73 52 6f 77 69 64 20 69 73 20 6e 6f 6e 2d 7a  isRowid is non-z
e9b0: 65 72 6f 2c 20 74 68 65 6e 20 65 78 70 72 65 73  ero, then expres
e9c0: 73 69 6f 6e 20 70 45 78 70 72 20 69 73 20 67 75  sion pExpr is gu
e9d0: 61 72 61 6e 74 65 65 64 0a 2a 2a 20 74 6f 20 62  aranteed.** to b
e9e0: 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3c  e of the form "<
e9f0: 72 6f 77 69 64 3e 20 49 4e 20 28 3f 2c 20 3f 2c  rowid> IN (?, ?,
ea00: 20 3f 29 22 2c 20 77 68 65 72 65 20 3c 72 6f 77   ?)", where <row
ea10: 69 64 3e 20 69 73 20 61 20 72 65 66 65 72 65 6e  id> is a referen
ea20: 63 65 0a 2a 2a 20 74 6f 20 73 6f 6d 65 20 69 6e  ce.** to some in
ea30: 74 65 67 65 72 20 6b 65 79 20 63 6f 6c 75 6d 6e  teger key column
ea40: 20 6f 66 20 61 20 74 61 62 6c 65 20 42 2d 54 72   of a table B-Tr
ea50: 65 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ee. In this case
ea60: 2c 20 75 73 65 20 61 6e 0a 2a 2a 20 69 6e 74 6b  , use an.** intk
ea70: 65 79 20 42 2d 54 72 65 65 20 74 6f 20 73 74 6f  ey B-Tree to sto
ea80: 72 65 20 74 68 65 20 73 65 74 20 6f 66 20 49 4e  re the set of IN
ea90: 28 2e 2e 2e 29 20 76 61 6c 75 65 73 20 69 6e 73  (...) values ins
eaa0: 74 65 61 64 20 6f 66 20 74 68 65 20 75 73 75 61  tead of the usua
eab0: 6c 0a 2a 2a 20 28 73 6c 6f 77 65 72 29 20 76 61  l.** (slower) va
eac0: 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 6b 65  riable length ke
ead0: 79 73 20 42 2d 54 72 65 65 2e 0a 2a 2a 0a 2a 2a  ys B-Tree..**.**
eae0: 20 49 66 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c   If rMayHaveNull
eaf0: 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
eb00: 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  at means that th
eb10: 65 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 61  e operation is a
eb20: 6e 20 49 4e 0a 2a 2a 20 28 6e 6f 74 20 61 20 53  n IN.** (not a S
eb30: 45 4c 45 43 54 20 6f 72 20 45 58 49 53 54 53 29  ELECT or EXISTS)
eb40: 20 61 6e 64 20 74 68 61 74 20 74 68 65 20 52 48   and that the RH
eb50: 53 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 73  S might contains
eb60: 20 4e 55 4c 4c 73 2e 0a 2a 2a 20 41 6c 6c 20 74   NULLs..** All t
eb70: 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73  his routine does
eb80: 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 20 74   is initialize t
eb90: 68 65 20 72 65 67 69 73 74 65 72 20 67 69 76 65  he register give
eba0: 6e 20 62 79 20 72 4d 61 79 48 61 76 65 4e 75 6c  n by rMayHaveNul
ebb0: 6c 0a 2a 2a 20 74 6f 20 4e 55 4c 4c 2e 20 20 43  l.** to NULL.  C
ebc0: 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 73 20  alling routines 
ebd0: 77 69 6c 6c 20 74 61 6b 65 20 63 61 72 65 20 6f  will take care o
ebe0: 66 20 63 68 61 6e 67 69 6e 67 20 74 68 69 73 20  f changing this 
ebf0: 72 65 67 69 73 74 65 72 0a 2a 2a 20 76 61 6c 75  register.** valu
ec00: 65 20 74 6f 20 6e 6f 6e 2d 4e 55 4c 4c 20 69 66  e to non-NULL if
ec10: 20 74 68 65 20 52 48 53 20 69 73 20 4e 55 4c 4c   the RHS is NULL
ec20: 2d 66 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  -free..**.** For
ec30: 20 61 20 53 45 4c 45 43 54 20 6f 72 20 45 58 49   a SELECT or EXI
ec40: 53 54 53 20 6f 70 65 72 61 74 6f 72 2c 20 72 65  STS operator, re
ec50: 74 75 72 6e 20 74 68 65 20 72 65 67 69 73 74 65  turn the registe
ec60: 72 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65  r that holds the
ec70: 0a 2a 2a 20 72 65 73 75 6c 74 2e 20 20 46 6f 72  .** result.  For
ec80: 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 20 6f 72   IN operators or
ec90: 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   if an error occ
eca0: 75 72 73 2c 20 74 68 65 20 72 65 74 75 72 6e 20  urs, the return 
ecb0: 76 61 6c 75 65 20 69 73 20 30 2e 0a 2a 2f 0a 23  value is 0..*/.#
ecc0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
ecd0: 49 54 5f 53 55 42 51 55 45 52 59 0a 69 6e 74 20  IT_SUBQUERY.int 
ece0: 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65  sqlite3CodeSubse
ecf0: 6c 65 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70  lect(.  Parse *p
ed00: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
ed10: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
ed20: 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45  xt */.  Expr *pE
ed30: 78 70 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  xpr,            
ed40: 2f 2a 20 54 68 65 20 49 4e 2c 20 53 45 4c 45 43  /* The IN, SELEC
ed50: 54 2c 20 6f 72 20 45 58 49 53 54 53 20 6f 70 65  T, or EXISTS ope
ed60: 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 72  rator */.  int r
ed70: 48 61 73 4e 75 6c 6c 46 6c 61 67 2c 20 20 20 20  HasNullFlag,    
ed80: 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 74     /* Register t
ed90: 68 61 74 20 72 65 63 6f 72 64 73 20 77 68 65 74  hat records whet
eda0: 68 65 72 20 4e 55 4c 4c 73 20 65 78 69 73 74 20  her NULLs exist 
edb0: 69 6e 20 52 48 53 20 2a 2f 0a 20 20 69 6e 74 20  in RHS */.  int 
edc0: 69 73 52 6f 77 69 64 20 20 20 20 20 20 20 20 20  isRowid         
edd0: 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20      /* If true, 
ede0: 4c 48 53 20 6f 66 20 49 4e 20 6f 70 65 72 61 74  LHS of IN operat
edf0: 6f 72 20 69 73 20 61 20 72 6f 77 69 64 20 2a 2f  or is a rowid */
ee00: 0a 29 7b 0a 20 20 69 6e 74 20 6a 6d 70 49 66 44  .){.  int jmpIfD
ee10: 79 6e 61 6d 69 63 20 3d 20 2d 31 3b 20 20 20 20  ynamic = -1;    
ee20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ee30: 20 20 2f 2a 20 4f 6e 65 2d 74 69 6d 65 20 74 65    /* One-time te
ee40: 73 74 20 61 64 64 72 65 73 73 20 2a 2f 0a 20 20  st address */.  
ee50: 69 6e 74 20 72 52 65 67 20 3d 20 30 3b 20 20 20  int rReg = 0;   
ee60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ee70: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73          /* Regis
ee80: 74 65 72 20 73 74 6f 72 69 6e 67 20 72 65 73 75  ter storing resu
ee90: 6c 74 69 6e 67 20 2a 2f 0a 20 20 56 64 62 65 20  lting */.  Vdbe 
eea0: 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  *v = sqlite3GetV
eeb0: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
eec0: 66 28 20 4e 45 56 45 52 28 76 3d 3d 30 29 20 29  f( NEVER(v==0) )
eed0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 71 6c   return 0;.  sql
eee0: 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73  ite3ExprCachePus
eef0: 68 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 2f 2a  h(pParse);..  /*
ef00: 20 54 68 69 73 20 63 6f 64 65 20 6d 75 73 74 20   This code must 
ef10: 62 65 20 72 75 6e 20 69 6e 20 69 74 73 20 65 6e  be run in its en
ef20: 74 69 72 65 74 79 20 65 76 65 72 79 20 74 69 6d  tirety every tim
ef30: 65 20 69 74 20 69 73 20 65 6e 63 6f 75 6e 74 65  e it is encounte
ef40: 72 65 64 0a 20 20 2a 2a 20 69 66 20 61 6e 79 20  red.  ** if any 
ef50: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
ef60: 20 69 73 20 74 72 75 65 3a 0a 20 20 2a 2a 0a 20   is true:.  **. 
ef70: 20 2a 2a 20 20 20 20 2a 20 20 54 68 65 20 72 69   **    *  The ri
ef80: 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 69 73  ght-hand side is
ef90: 20 61 20 63 6f 72 72 65 6c 61 74 65 64 20 73 75   a correlated su
efa0: 62 71 75 65 72 79 0a 20 20 2a 2a 20 20 20 20 2a  bquery.  **    *
efb0: 20 20 54 68 65 20 72 69 67 68 74 2d 68 61 6e 64    The right-hand
efc0: 20 73 69 64 65 20 69 73 20 61 6e 20 65 78 70 72   side is an expr
efd0: 65 73 73 69 6f 6e 20 6c 69 73 74 20 63 6f 6e 74  ession list cont
efe0: 61 69 6e 69 6e 67 20 76 61 72 69 61 62 6c 65 73  aining variables
eff0: 0a 20 20 2a 2a 20 20 20 20 2a 20 20 57 65 20 61  .  **    *  We a
f000: 72 65 20 69 6e 73 69 64 65 20 61 20 74 72 69 67  re inside a trig
f010: 67 65 72 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  ger.  **.  ** If
f020: 20 61 6c 6c 20 6f 66 20 74 68 65 20 61 62 6f 76   all of the abov
f030: 65 20 61 72 65 20 66 61 6c 73 65 2c 20 74 68 65  e are false, the
f040: 6e 20 77 65 20 63 61 6e 20 72 75 6e 20 74 68 69  n we can run thi
f050: 73 20 63 6f 64 65 20 6a 75 73 74 20 6f 6e 63 65  s code just once
f060: 0a 20 20 2a 2a 20 73 61 76 65 20 74 68 65 20 72  .  ** save the r
f070: 65 73 75 6c 74 73 2c 20 61 6e 64 20 72 65 75 73  esults, and reus
f080: 65 20 74 68 65 20 73 61 6d 65 20 72 65 73 75 6c  e the same resul
f090: 74 20 6f 6e 20 73 75 62 73 65 71 75 65 6e 74 20  t on subsequent 
f0a0: 69 6e 76 6f 63 61 74 69 6f 6e 73 2e 0a 20 20 2a  invocations..  *
f0b0: 2f 0a 20 20 69 66 28 20 21 45 78 70 72 48 61 73  /.  if( !ExprHas
f0c0: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
f0d0: 45 50 5f 56 61 72 53 65 6c 65 63 74 29 20 29 7b  EP_VarSelect) ){
f0e0: 0a 20 20 20 20 6a 6d 70 49 66 44 79 6e 61 6d 69  .    jmpIfDynami
f0f0: 63 20 3d 20 73 71 6c 69 74 65 33 43 6f 64 65 4f  c = sqlite3CodeO
f100: 6e 63 65 28 70 50 61 72 73 65 29 3b 20 56 64 62  nce(pParse); Vdb
f110: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
f120: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
f130: 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20  E_OMIT_EXPLAIN. 
f140: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70   if( pParse->exp
f150: 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 63  lain==2 ){.    c
f160: 68 61 72 20 2a 7a 4d 73 67 20 3d 20 73 71 6c 69  har *zMsg = sqli
f170: 74 65 33 4d 50 72 69 6e 74 66 28 0a 20 20 20 20  te3MPrintf(.    
f180: 20 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2c 20      pParse->db, 
f190: 22 45 58 45 43 55 54 45 20 25 73 25 73 20 53 55  "EXECUTE %s%s SU
f1a0: 42 51 55 45 52 59 20 25 64 22 2c 20 6a 6d 70 49  BQUERY %d", jmpI
f1b0: 66 44 79 6e 61 6d 69 63 3e 3d 30 3f 22 22 3a 22  fDynamic>=0?"":"
f1c0: 43 4f 52 52 45 4c 41 54 45 44 20 22 2c 0a 20 20  CORRELATED ",.  
f1d0: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 3d        pExpr->op=
f1e0: 3d 54 4b 5f 49 4e 3f 22 4c 49 53 54 22 3a 22 53  =TK_IN?"LIST":"S
f1f0: 43 41 4c 41 52 22 2c 20 70 50 61 72 73 65 2d 3e  CALAR", pParse->
f200: 69 4e 65 78 74 53 65 6c 65 63 74 49 64 0a 20 20  iNextSelectId.  
f210: 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33    );.    sqlite3
f220: 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
f230: 5f 45 78 70 6c 61 69 6e 2c 20 70 50 61 72 73 65  _Explain, pParse
f240: 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 30 2c 20  ->iSelectId, 0, 
f250: 30 2c 20 7a 4d 73 67 2c 20 50 34 5f 44 59 4e 41  0, zMsg, P4_DYNA
f260: 4d 49 43 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  MIC);.  }.#endif
f270: 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70  ..  switch( pExp
f280: 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  r->op ){.    cas
f290: 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20  e TK_IN: {.     
f2a0: 20 63 68 61 72 20 61 66 66 69 6e 69 74 79 3b 20   char affinity; 
f2b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f2c0: 41 66 66 69 6e 69 74 79 20 6f 66 20 74 68 65 20  Affinity of the 
f2d0: 4c 48 53 20 6f 66 20 74 68 65 20 49 4e 20 2a 2f  LHS of the IN */
f2e0: 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b  .      int addr;
f2f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f300: 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
f310: 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
f320: 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f  l instruction */
f330: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65  .      Expr *pLe
f340: 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66  ft = pExpr->pLef
f350: 74 3b 20 2f 2a 20 74 68 65 20 4c 48 53 20 6f 66  t; /* the LHS of
f360: 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   the IN operator
f370: 20 2a 2f 0a 20 20 20 20 20 20 4b 65 79 49 6e 66   */.      KeyInf
f380: 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 30 3b  o *pKeyInfo = 0;
f390: 20 20 20 20 20 20 2f 2a 20 4b 65 79 20 69 6e 66        /* Key inf
f3a0: 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 0a 20 20 20  ormation */..   
f3b0: 20 20 20 61 66 66 69 6e 69 74 79 20 3d 20 73 71     affinity = sq
f3c0: 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74  lite3ExprAffinit
f3d0: 79 28 70 4c 65 66 74 29 3b 0a 0a 20 20 20 20 20  y(pLeft);..     
f3e0: 20 2f 2a 20 57 68 65 74 68 65 72 20 74 68 69 73   /* Whether this
f3f0: 20 69 73 20 61 6e 20 27 78 20 49 4e 28 53 45 4c   is an 'x IN(SEL
f400: 45 43 54 2e 2e 2e 29 27 20 6f 72 20 61 6e 20 27  ECT...)' or an '
f410: 78 20 49 4e 28 3c 65 78 70 72 6c 69 73 74 3e 29  x IN(<exprlist>)
f420: 27 0a 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65  '.      ** expre
f430: 73 73 69 6f 6e 20 69 74 20 69 73 20 68 61 6e 64  ssion it is hand
f440: 6c 65 64 20 74 68 65 20 73 61 6d 65 20 77 61 79  led the same way
f450: 2e 20 20 41 6e 20 65 70 68 65 6d 65 72 61 6c 20  .  An ephemeral 
f460: 74 61 62 6c 65 20 69 73 20 0a 20 20 20 20 20 20  table is .      
f470: 2a 2a 20 66 69 6c 6c 65 64 20 77 69 74 68 20 73  ** filled with s
f480: 69 6e 67 6c 65 2d 66 69 65 6c 64 20 69 6e 64 65  ingle-field inde
f490: 78 20 6b 65 79 73 20 72 65 70 72 65 73 65 6e 74  x keys represent
f4a0: 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74 73 0a  ing the results.
f4b0: 20 20 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68        ** from th
f4c0: 65 20 53 45 4c 45 43 54 20 6f 72 20 74 68 65 20  e SELECT or the 
f4d0: 3c 65 78 70 72 6c 69 73 74 3e 2e 0a 20 20 20 20  <exprlist>..    
f4e0: 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66    **.      ** If
f4f0: 20 74 68 65 20 27 78 27 20 65 78 70 72 65 73 73   the 'x' express
f500: 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20  ion is a column 
f510: 76 61 6c 75 65 2c 20 6f 72 20 74 68 65 20 53 45  value, or the SE
f520: 4c 45 43 54 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a  LECT....      **
f530: 20 73 74 61 74 65 6d 65 6e 74 20 72 65 74 75 72   statement retur
f540: 6e 73 20 61 20 63 6f 6c 75 6d 6e 20 76 61 6c 75  ns a column valu
f550: 65 2c 20 74 68 65 6e 20 74 68 65 20 61 66 66 69  e, then the affi
f560: 6e 69 74 79 20 6f 66 20 74 68 61 74 0a 20 20 20  nity of that.   
f570: 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 69 73 20     ** column is 
f580: 75 73 65 64 20 74 6f 20 62 75 69 6c 64 20 74 68  used to build th
f590: 65 20 69 6e 64 65 78 20 6b 65 79 73 2e 20 49 66  e index keys. If
f5a0: 20 62 6f 74 68 20 27 78 27 20 61 6e 64 20 74 68   both 'x' and th
f5b0: 65 0a 20 20 20 20 20 20 2a 2a 20 53 45 4c 45 43  e.      ** SELEC
f5c0: 54 2e 2e 2e 20 73 74 61 74 65 6d 65 6e 74 20 61  T... statement a
f5d0: 72 65 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e  re columns, then
f5e0: 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e 69 74   numeric affinit
f5f0: 79 20 69 73 20 75 73 65 64 0a 20 20 20 20 20 20  y is used.      
f600: 2a 2a 20 69 66 20 65 69 74 68 65 72 20 63 6f 6c  ** if either col
f610: 75 6d 6e 20 68 61 73 20 4e 55 4d 45 52 49 43 20  umn has NUMERIC 
f620: 6f 72 20 49 4e 54 45 47 45 52 20 61 66 66 69 6e  or INTEGER affin
f630: 69 74 79 2e 20 49 66 20 6e 65 69 74 68 65 72 0a  ity. If neither.
f640: 20 20 20 20 20 20 2a 2a 20 27 78 27 20 6e 6f 72        ** 'x' nor
f650: 20 74 68 65 20 53 45 4c 45 43 54 2e 2e 2e 20 73   the SELECT... s
f660: 74 61 74 65 6d 65 6e 74 20 61 72 65 20 63 6f 6c  tatement are col
f670: 75 6d 6e 73 2c 20 74 68 65 6e 20 6e 75 6d 65 72  umns, then numer
f680: 69 63 20 61 66 66 69 6e 69 74 79 0a 20 20 20 20  ic affinity.    
f690: 20 20 2a 2a 20 69 73 20 75 73 65 64 2e 0a 20 20    ** is used..  
f6a0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 45 78      */.      pEx
f6b0: 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 50 61  pr->iTable = pPa
f6c0: 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
f6d0: 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
f6e0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
f6f0: 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
f700: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
f710: 21 69 73 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  !isRowid);.     
f720: 20 70 4b 65 79 49 6e 66 6f 20 3d 20 69 73 52 6f   pKeyInfo = isRo
f730: 77 69 64 20 3f 20 30 20 3a 20 73 71 6c 69 74 65  wid ? 0 : sqlite
f740: 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 70 50  3KeyInfoAlloc(pP
f750: 61 72 73 65 2d 3e 64 62 2c 20 31 2c 20 31 29 3b  arse->db, 1, 1);
f760: 0a 0a 20 20 20 20 20 20 69 66 28 20 45 78 70 72  ..      if( Expr
f770: 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
f780: 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
f790: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43   ){.        /* C
f7a0: 61 73 65 20 31 3a 20 20 20 20 20 65 78 70 72 20  ase 1:     expr 
f7b0: 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 0a  IN (SELECT ...).
f7c0: 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
f7d0: 20 20 20 2a 2a 20 47 65 6e 65 72 61 74 65 20 63     ** Generate c
f7e0: 6f 64 65 20 74 6f 20 77 72 69 74 65 20 74 68 65  ode to write the
f7f0: 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20   results of the 
f800: 73 65 6c 65 63 74 20 69 6e 74 6f 20 74 68 65 20  select into the 
f810: 74 65 6d 70 6f 72 61 72 79 0a 20 20 20 20 20 20  temporary.      
f820: 20 20 2a 2a 20 74 61 62 6c 65 20 61 6c 6c 6f 63    ** table alloc
f830: 61 74 65 64 20 61 6e 64 20 6f 70 65 6e 65 64 20  ated and opened 
f840: 61 62 6f 76 65 2e 0a 20 20 20 20 20 20 20 20 2a  above..        *
f850: 2f 0a 20 20 20 20 20 20 20 20 53 65 6c 65 63 74  /.        Select
f860: 20 2a 70 53 65 6c 65 63 74 20 3d 20 70 45 78 70   *pSelect = pExp
f870: 72 2d 3e 78 2e 70 53 65 6c 65 63 74 3b 0a 20 20  r->x.pSelect;.  
f880: 20 20 20 20 20 20 53 65 6c 65 63 74 44 65 73 74        SelectDest
f890: 20 64 65 73 74 3b 0a 20 20 20 20 20 20 20 20 45   dest;.        E
f8a0: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b  xprList *pEList;
f8b0: 0a 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ..        assert
f8c0: 28 20 21 69 73 52 6f 77 69 64 20 29 3b 0a 20 20  ( !isRowid );.  
f8d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
f8e0: 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73  ectDestInit(&des
f8f0: 74 2c 20 53 52 54 5f 53 65 74 2c 20 70 45 78 70  t, SRT_Set, pExp
f900: 72 2d 3e 69 54 61 62 6c 65 29 3b 0a 20 20 20 20  r->iTable);.    
f910: 20 20 20 20 64 65 73 74 2e 61 66 66 53 64 73 74      dest.affSdst
f920: 20 3d 20 28 75 38 29 61 66 66 69 6e 69 74 79 3b   = (u8)affinity;
f930: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
f940: 20 28 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 26   (pExpr->iTable&
f950: 30 78 30 30 30 30 46 46 46 46 29 3d 3d 70 45 78  0x0000FFFF)==pEx
f960: 70 72 2d 3e 69 54 61 62 6c 65 20 29 3b 0a 20 20  pr->iTable );.  
f970: 20 20 20 20 20 20 70 53 65 6c 65 63 74 2d 3e 69        pSelect->i
f980: 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20  Limit = 0;.     
f990: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 53 65     testcase( pSe
f9a0: 6c 65 63 74 2d 3e 73 65 6c 46 6c 61 67 73 20 26  lect->selFlags &
f9b0: 20 53 46 5f 44 69 73 74 69 6e 63 74 20 29 3b 0a   SF_Distinct );.
f9c0: 20 20 20 20 20 20 20 20 70 53 65 6c 65 63 74 2d          pSelect-
f9d0: 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46  >selFlags &= ~SF
f9e0: 5f 44 69 73 74 69 6e 63 74 3b 0a 20 20 20 20 20  _Distinct;.     
f9f0: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4b 65     testcase( pKe
fa00: 79 49 6e 66 6f 3d 3d 30 20 29 3b 20 2f 2a 20 43  yInfo==0 ); /* C
fa10: 61 75 73 65 64 20 62 79 20 4f 4f 4d 20 69 6e 20  aused by OOM in 
fa20: 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c  sqlite3KeyInfoAl
fa30: 6c 6f 63 28 29 20 2a 2f 0a 20 20 20 20 20 20 20  loc() */.       
fa40: 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65   if( sqlite3Sele
fa50: 63 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65  ct(pParse, pSele
fa60: 63 74 2c 20 26 64 65 73 74 29 20 29 7b 0a 20 20  ct, &dest) ){.  
fa70: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4b          sqlite3K
fa80: 65 79 49 6e 66 6f 55 6e 72 65 66 28 70 4b 65 79  eyInfoUnref(pKey
fa90: 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 20  Info);.         
faa0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
fab0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 45 4c     }.        pEL
fac0: 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70  ist = pSelect->p
fad0: 45 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 61  EList;.        a
fae0: 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 21  ssert( pKeyInfo!
faf0: 3d 30 20 29 3b 20 2f 2a 20 4f 4f 4d 20 77 69 6c  =0 ); /* OOM wil
fb00: 6c 20 63 61 75 73 65 20 65 78 69 74 20 61 66 74  l cause exit aft
fb10: 65 72 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  er sqlite3Select
fb20: 28 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73  () */.        as
fb30: 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20  sert( pEList!=0 
fb40: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
fb50: 74 28 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  t( pEList->nExpr
fb60: 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  >0 );.        as
fb70: 73 65 72 74 28 20 73 71 6c 69 74 65 33 4b 65 79  sert( sqlite3Key
fb80: 49 6e 66 6f 49 73 57 72 69 74 65 61 62 6c 65 28  InfoIsWriteable(
fb90: 70 4b 65 79 49 6e 66 6f 29 20 29 3b 0a 20 20 20  pKeyInfo) );.   
fba0: 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 61       pKeyInfo->a
fbb0: 43 6f 6c 6c 5b 30 5d 20 3d 20 73 71 6c 69 74 65  Coll[0] = sqlite
fbc0: 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f  3BinaryCompareCo
fbd0: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 45  llSeq(pParse, pE
fbe0: 78 70 72 2d 3e 70 4c 65 66 74 2c 0a 20 20 20 20  xpr->pLeft,.    
fbf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc20: 20 20 20 20 20 70 45 4c 69 73 74 2d 3e 61 5b 30       pEList->a[0
fc30: 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
fc40: 7d 65 6c 73 65 20 69 66 28 20 41 4c 57 41 59 53  }else if( ALWAYS
fc50: 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 21  (pExpr->x.pList!
fc60: 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  =0) ){.        /
fc70: 2a 20 43 61 73 65 20 32 3a 20 20 20 20 20 65 78  * Case 2:     ex
fc80: 70 72 20 49 4e 20 28 65 78 70 72 6c 69 73 74 29  pr IN (exprlist)
fc90: 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
fca0: 20 20 20 20 2a 2a 20 46 6f 72 20 65 61 63 68 20      ** For each 
fcb0: 65 78 70 72 65 73 73 69 6f 6e 2c 20 62 75 69 6c  expression, buil
fcc0: 64 20 61 6e 20 69 6e 64 65 78 20 6b 65 79 20 66  d an index key f
fcd0: 72 6f 6d 20 74 68 65 20 65 76 61 6c 75 61 74 69  rom the evaluati
fce0: 6f 6e 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a  on and.        *
fcf0: 2a 20 73 74 6f 72 65 20 69 74 20 69 6e 20 74 68  * store it in th
fd00: 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  e temporary tabl
fd10: 65 2e 20 49 66 20 3c 65 78 70 72 3e 20 69 73 20  e. If <expr> is 
fd20: 61 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e 20 75  a column, then u
fd30: 73 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  se.        ** th
fd40: 61 74 20 63 6f 6c 75 6d 6e 73 20 61 66 66 69 6e  at columns affin
fd50: 69 74 79 20 77 68 65 6e 20 62 75 69 6c 64 69 6e  ity when buildin
fd60: 67 20 69 6e 64 65 78 20 6b 65 79 73 2e 20 49 66  g index keys. If
fd70: 20 3c 65 78 70 72 3e 20 69 73 20 6e 6f 74 0a 20   <expr> is not. 
fd80: 20 20 20 20 20 20 20 2a 2a 20 61 20 63 6f 6c 75         ** a colu
fd90: 6d 6e 2c 20 75 73 65 20 6e 75 6d 65 72 69 63 20  mn, use numeric 
fda0: 61 66 66 69 6e 69 74 79 2e 0a 20 20 20 20 20 20  affinity..      
fdb0: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74    */.        int
fdc0: 20 69 3b 0a 20 20 20 20 20 20 20 20 45 78 70 72   i;.        Expr
fdd0: 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 45  List *pList = pE
fde0: 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20  xpr->x.pList;.  
fdf0: 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70        struct Exp
fe00: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
fe10: 6d 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  m;.        int r
fe20: 31 2c 20 72 32 2c 20 72 33 3b 0a 0a 20 20 20 20  1, r2, r3;..    
fe30: 20 20 20 20 69 66 28 20 21 61 66 66 69 6e 69 74      if( !affinit
fe40: 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  y ){.          a
fe50: 66 66 69 6e 69 74 79 20 3d 20 53 51 4c 49 54 45  ffinity = SQLITE
fe60: 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20  _AFF_NONE;.     
fe70: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
fe80: 20 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20   pKeyInfo ){.   
fe90: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73         assert( s
fea0: 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49 73 57  qlite3KeyInfoIsW
feb0: 72 69 74 65 61 62 6c 65 28 70 4b 65 79 49 6e 66  riteable(pKeyInf
fec0: 6f 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  o) );.          
fed0: 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b  pKeyInfo->aColl[
fee0: 30 5d 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  0] = sqlite3Expr
fef0: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
ff00: 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
ff10: 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
ff20: 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67    /* Loop throug
ff30: 68 20 65 61 63 68 20 65 78 70 72 65 73 73 69 6f  h each expressio
ff40: 6e 20 69 6e 20 3c 65 78 70 72 6c 69 73 74 3e 2e  n in <exprlist>.
ff50: 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 31 20 3d   */.        r1 =
ff60: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
ff70: 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
ff80: 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33      r2 = sqlite3
ff90: 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
ffa0: 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
ffb0: 69 73 52 6f 77 69 64 20 29 20 73 71 6c 69 74 65  isRowid ) sqlite
ffc0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
ffd0: 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 32 29 3b 0a  P_Null, 0, r2);.
ffe0: 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 70 4c          for(i=pL
fff0: 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65  ist->nExpr, pIte
10000 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3e 30 3b  m=pList->a; i>0;
10010 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i--, pItem++){.
10020 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a            Expr *
10030 70 45 32 20 3d 20 70 49 74 65 6d 2d 3e 70 45 78  pE2 = pItem->pEx
10040 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  pr;.          in
10050 74 20 69 56 61 6c 54 6f 49 6e 73 3b 0a 0a 20 20  t iValToIns;..  
10060 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
10070 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
10080 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 20 74 68 65  not constant the
10090 6e 20 77 65 20 77 69 6c 6c 20 6e 65 65 64 20 74  n we will need t
100a0 6f 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 64  o.          ** d
100b0 69 73 61 62 6c 65 20 74 68 65 20 74 65 73 74 20  isable the test 
100c0 74 68 61 74 20 77 61 73 20 67 65 6e 65 72 61 74  that was generat
100d0 65 64 20 61 62 6f 76 65 20 74 68 61 74 20 6d 61  ed above that ma
100e0 6b 65 73 20 73 75 72 65 0a 20 20 20 20 20 20 20  kes sure.       
100f0 20 20 20 2a 2a 20 74 68 69 73 20 63 6f 64 65 20     ** this code 
10100 6f 6e 6c 79 20 65 78 65 63 75 74 65 73 20 6f 6e  only executes on
10110 63 65 2e 20 20 42 65 63 61 75 73 65 20 66 6f 72  ce.  Because for
10120 20 61 20 6e 6f 6e 2d 63 6f 6e 73 74 61 6e 74 0a   a non-constant.
10130 20 20 20 20 20 20 20 20 20 20 2a 2a 20 65 78 70            ** exp
10140 72 65 73 73 69 6f 6e 20 77 65 20 6e 65 65 64 20  ression we need 
10150 74 6f 20 72 65 72 75 6e 20 74 68 69 73 20 63 6f  to rerun this co
10160 64 65 20 65 61 63 68 20 74 69 6d 65 2e 0a 20 20  de each time..  
10170 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
10180 20 20 20 20 20 69 66 28 20 6a 6d 70 49 66 44 79       if( jmpIfDy
10190 6e 61 6d 69 63 3e 3d 30 20 26 26 20 21 73 71 6c  namic>=0 && !sql
101a0 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
101b0 6e 74 28 70 45 32 29 20 29 7b 0a 20 20 20 20 20  nt(pE2) ){.     
101c0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
101d0 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76  beChangeToNoop(v
101e0 2c 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63 29 3b  , jmpIfDynamic);
101f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a 6d 70  .            jmp
10200 49 66 44 79 6e 61 6d 69 63 20 3d 20 2d 31 3b 0a  IfDynamic = -1;.
10210 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20            }..   
10220 20 20 20 20 20 20 20 2f 2a 20 45 76 61 6c 75 61         /* Evalua
10230 74 65 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  te the expressio
10240 6e 20 61 6e 64 20 69 6e 73 65 72 74 20 69 74 20  n and insert it 
10250 69 6e 74 6f 20 74 68 65 20 74 65 6d 70 20 74 61  into the temp ta
10260 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ble */.         
10270 20 69 66 28 20 69 73 52 6f 77 69 64 20 26 26 20   if( isRowid && 
10280 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74  sqlite3ExprIsInt
10290 65 67 65 72 28 70 45 32 2c 20 26 69 56 61 6c 54  eger(pE2, &iValT
102a0 6f 49 6e 73 29 20 29 7b 0a 20 20 20 20 20 20 20  oIns) ){.       
102b0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
102c0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73  AddOp3(v, OP_Ins
102d0 65 72 74 49 6e 74 2c 20 70 45 78 70 72 2d 3e 69  ertInt, pExpr->i
102e0 54 61 62 6c 65 2c 20 72 32 2c 20 69 56 61 6c 54  Table, r2, iValT
102f0 6f 49 6e 73 29 3b 0a 20 20 20 20 20 20 20 20 20  oIns);.         
10300 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
10310 20 20 20 20 72 33 20 3d 20 73 71 6c 69 74 65 33      r3 = sqlite3
10320 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70  ExprCodeTarget(p
10330 50 61 72 73 65 2c 20 70 45 32 2c 20 72 31 29 3b  Parse, pE2, r1);
10340 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
10350 20 69 73 52 6f 77 69 64 20 29 7b 0a 20 20 20 20   isRowid ){.    
10360 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
10370 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
10380 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 72 33 2c  P_MustBeInt, r3,
10390 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
103a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
103b0 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
103c0 65 6e 74 41 64 64 72 28 76 29 2b 32 29 3b 0a 20  entAddr(v)+2);. 
103d0 20 20 20 20 20 20 20 20 20 20 20 20 20 56 64 62               Vdb
103e0 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
103f0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
10400 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
10410 20 4f 50 5f 49 6e 73 65 72 74 2c 20 70 45 78 70   OP_Insert, pExp
10420 72 2d 3e 69 54 61 62 6c 65 2c 20 72 32 2c 20 72  r->iTable, r2, r
10430 33 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  3);.            
10440 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
10450 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
10460 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b  AddOp4(v, OP_Mak
10470 65 52 65 63 6f 72 64 2c 20 72 33 2c 20 31 2c 20  eRecord, r3, 1, 
10480 72 32 2c 20 26 61 66 66 69 6e 69 74 79 2c 20 31  r2, &affinity, 1
10490 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
104a0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
104b0 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  eAffinityChange(
104c0 70 50 61 72 73 65 2c 20 72 33 2c 20 31 29 3b 0a  pParse, r3, 1);.
104d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
104e0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
104f0 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c  v, OP_IdxInsert,
10500 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
10510 72 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  r2);.           
10520 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
10530 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
10540 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
10550 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
10560 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  1);.        sqli
10570 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
10580 67 28 70 50 61 72 73 65 2c 20 72 32 29 3b 0a 20  g(pParse, r2);. 
10590 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
105a0 20 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20   pKeyInfo ){.   
105b0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
105c0 43 68 61 6e 67 65 50 34 28 76 2c 20 61 64 64 72  ChangeP4(v, addr
105d0 2c 20 28 76 6f 69 64 20 2a 29 70 4b 65 79 49 6e  , (void *)pKeyIn
105e0 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b  fo, P4_KEYINFO);
105f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
10600 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
10610 20 63 61 73 65 20 54 4b 5f 45 58 49 53 54 53 3a   case TK_EXISTS:
10620 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c  .    case TK_SEL
10630 45 43 54 3a 0a 20 20 20 20 64 65 66 61 75 6c 74  ECT:.    default
10640 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  : {.      /* If 
10650 74 68 69 73 20 68 61 73 20 74 6f 20 62 65 20 61  this has to be a
10660 20 73 63 61 6c 61 72 20 53 45 4c 45 43 54 2e 20   scalar SELECT. 
10670 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
10680 6f 20 70 75 74 20 74 68 65 0a 20 20 20 20 20 20  o put the.      
10690 2a 2a 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73  ** value of this
106a0 20 73 65 6c 65 63 74 20 69 6e 20 61 20 6d 65 6d   select in a mem
106b0 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20 72 65 63  ory cell and rec
106c0 6f 72 64 20 74 68 65 20 6e 75 6d 62 65 72 0a 20  ord the number. 
106d0 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 6d       ** of the m
106e0 65 6d 6f 72 79 20 63 65 6c 6c 20 69 6e 20 69 43  emory cell in iC
106f0 6f 6c 75 6d 6e 2e 20 20 49 66 20 74 68 69 73 20  olumn.  If this 
10700 69 73 20 61 6e 20 45 58 49 53 54 53 2c 20 77 72  is an EXISTS, wr
10710 69 74 65 0a 20 20 20 20 20 20 2a 2a 20 61 6e 20  ite.      ** an 
10720 69 6e 74 65 67 65 72 20 30 20 28 6e 6f 74 20 65  integer 0 (not e
10730 78 69 73 74 73 29 20 6f 72 20 31 20 28 65 78 69  xists) or 1 (exi
10740 73 74 73 29 20 69 6e 74 6f 20 61 20 6d 65 6d 6f  sts) into a memo
10750 72 79 20 63 65 6c 6c 0a 20 20 20 20 20 20 2a 2a  ry cell.      **
10760 20 61 6e 64 20 72 65 63 6f 72 64 20 74 68 61 74   and record that
10770 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 69 6e 20   memory cell in 
10780 69 43 6f 6c 75 6d 6e 2e 0a 20 20 20 20 20 20 2a  iColumn..      *
10790 2f 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a  /.      Select *
107a0 70 53 65 6c 3b 20 20 20 20 20 20 20 20 20 20 20  pSel;           
107b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
107c0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
107d0 74 20 74 6f 20 65 6e 63 6f 64 65 20 2a 2f 0a 20  t to encode */. 
107e0 20 20 20 20 20 53 65 6c 65 63 74 44 65 73 74 20       SelectDest 
107f0 64 65 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  dest;           
10800 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f             /* Ho
10810 77 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 53  w to deal with S
10820 45 4c 45 43 74 20 72 65 73 75 6c 74 20 2a 2f 0a  ELECt result */.
10830 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
10840 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45   pExpr->op==TK_E
10850 58 49 53 54 53 20 29 3b 0a 20 20 20 20 20 20 74  XISTS );.      t
10860 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
10870 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b  op==TK_SELECT );
10880 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
10890 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 49  Expr->op==TK_EXI
108a0 53 54 53 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70  STS || pExpr->op
108b0 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 0a  ==TK_SELECT );..
108c0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 45 78        assert( Ex
108d0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
108e0 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  xpr, EP_xIsSelec
108f0 74 29 20 29 3b 0a 20 20 20 20 20 20 70 53 65 6c  t) );.      pSel
10900 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c   = pExpr->x.pSel
10910 65 63 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ect;.      sqlit
10920 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74  e3SelectDestInit
10930 28 26 64 65 73 74 2c 20 30 2c 20 2b 2b 70 50 61  (&dest, 0, ++pPa
10940 72 73 65 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 20 20  rse->nMem);.    
10950 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d    if( pExpr->op=
10960 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a 20 20  =TK_SELECT ){.  
10970 20 20 20 20 20 20 64 65 73 74 2e 65 44 65 73 74        dest.eDest
10980 20 3d 20 53 52 54 5f 4d 65 6d 3b 0a 20 20 20 20   = SRT_Mem;.    
10990 20 20 20 20 64 65 73 74 2e 69 53 64 73 74 20 3d      dest.iSdst =
109a0 20 64 65 73 74 2e 69 53 44 50 61 72 6d 3b 0a 20   dest.iSDParm;. 
109b0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
109c0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
109d0 75 6c 6c 2c 20 30 2c 20 64 65 73 74 2e 69 53 44  ull, 0, dest.iSD
109e0 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 20 20 56  Parm);.        V
109f0 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
10a00 49 6e 69 74 20 73 75 62 71 75 65 72 79 20 72 65  Init subquery re
10a10 73 75 6c 74 22 29 29 3b 0a 20 20 20 20 20 20 7d  sult"));.      }
10a20 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 64 65  else{.        de
10a30 73 74 2e 65 44 65 73 74 20 3d 20 53 52 54 5f 45  st.eDest = SRT_E
10a40 78 69 73 74 73 3b 0a 20 20 20 20 20 20 20 20 73  xists;.        s
10a50 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
10a60 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
10a70 30 2c 20 64 65 73 74 2e 69 53 44 50 61 72 6d 29  0, dest.iSDParm)
10a80 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
10a90 6d 6d 65 6e 74 28 28 76 2c 20 22 49 6e 69 74 20  mment((v, "Init 
10aa0 45 58 49 53 54 53 20 72 65 73 75 6c 74 22 29 29  EXISTS result"))
10ab0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
10ac0 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
10ad0 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 53  e(pParse->db, pS
10ae0 65 6c 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20  el->pLimit);.   
10af0 20 20 20 70 53 65 6c 2d 3e 70 4c 69 6d 69 74 20     pSel->pLimit 
10b00 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
10b10 50 61 72 73 65 2c 20 54 4b 5f 49 4e 54 45 47 45  Parse, TK_INTEGE
10b20 52 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20  R, 0, 0,.       
10b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10b40 20 20 20 20 20 20 20 20 20 20 20 26 73 71 6c 69             &sqli
10b50 74 65 33 49 6e 74 54 6f 6b 65 6e 73 5b 31 5d 29  te3IntTokens[1])
10b60 3b 0a 20 20 20 20 20 20 70 53 65 6c 2d 3e 69 4c  ;.      pSel->iL
10b70 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  imit = 0;.      
10b80 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63  if( sqlite3Selec
10b90 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 2c 20  t(pParse, pSel, 
10ba0 26 64 65 73 74 29 20 29 7b 0a 20 20 20 20 20 20  &dest) ){.      
10bb0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
10bc0 20 20 7d 0a 20 20 20 20 20 20 72 52 65 67 20 3d    }.      rReg =
10bd0 20 64 65 73 74 2e 69 53 44 50 61 72 6d 3b 0a 20   dest.iSDParm;. 
10be0 20 20 20 20 20 45 78 70 72 53 65 74 56 56 41 50       ExprSetVVAP
10bf0 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
10c00 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a 20 20 20  P_NoReduce);.   
10c10 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
10c20 20 20 7d 0a 0a 20 20 69 66 28 20 72 48 61 73 4e    }..  if( rHasN
10c30 75 6c 6c 46 6c 61 67 20 29 7b 0a 20 20 20 20 73  ullFlag ){.    s
10c40 71 6c 69 74 65 33 53 65 74 48 61 73 4e 75 6c 6c  qlite3SetHasNull
10c50 46 6c 61 67 28 76 2c 20 70 45 78 70 72 2d 3e 69  Flag(v, pExpr->i
10c60 54 61 62 6c 65 2c 20 72 48 61 73 4e 75 6c 6c 46  Table, rHasNullF
10c70 6c 61 67 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  lag);.  }..  if(
10c80 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63 3e 3d 30   jmpIfDynamic>=0
10c90 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
10ca0 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a  dbeJumpHere(v, j
10cb0 6d 70 49 66 44 79 6e 61 6d 69 63 29 3b 0a 20 20  mpIfDynamic);.  
10cc0 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43  }.  sqlite3ExprC
10cd0 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b  achePop(pParse);
10ce0 0a 0a 20 20 72 65 74 75 72 6e 20 72 52 65 67 3b  ..  return rReg;
10cf0 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
10d00 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
10d10 59 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  Y */..#ifndef SQ
10d20 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
10d30 52 59 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  RY./*.** Generat
10d40 65 20 63 6f 64 65 20 66 6f 72 20 61 6e 20 49 4e  e code for an IN
10d50 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a   expression..**.
10d60 2a 2a 20 20 20 20 20 20 78 20 49 4e 20 28 53 45  **      x IN (SE
10d70 4c 45 43 54 20 2e 2e 2e 29 0a 2a 2a 20 20 20 20  LECT ...).**    
10d80 20 20 78 20 49 4e 20 28 76 61 6c 75 65 2c 20 76    x IN (value, v
10d90 61 6c 75 65 2c 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a  alue, ...).**.**
10da0 20 54 68 65 20 6c 65 66 74 2d 68 61 6e 64 20 73   The left-hand s
10db0 69 64 65 20 28 4c 48 53 29 20 69 73 20 61 20 73  ide (LHS) is a s
10dc0 63 61 6c 61 72 20 65 78 70 72 65 73 73 69 6f 6e  calar expression
10dd0 2e 20 20 54 68 65 20 72 69 67 68 74 2d 68 61 6e  .  The right-han
10de0 64 20 73 69 64 65 20 28 52 48 53 29 0a 2a 2a 20  d side (RHS).** 
10df0 69 73 20 61 6e 20 61 72 72 61 79 20 6f 66 20 7a  is an array of z
10e00 65 72 6f 20 6f 72 20 6d 6f 72 65 20 76 61 6c 75  ero or more valu
10e10 65 73 2e 20 20 54 68 65 20 65 78 70 72 65 73 73  es.  The express
10e20 69 6f 6e 20 69 73 20 74 72 75 65 20 69 66 20 74  ion is true if t
10e30 68 65 20 4c 48 53 20 69 73 0a 2a 2a 20 63 6f 6e  he LHS is.** con
10e40 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20 74 68  tained within th
10e50 65 20 52 48 53 2e 20 20 54 68 65 20 76 61 6c 75  e RHS.  The valu
10e60 65 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73  e of the express
10e70 69 6f 6e 20 69 73 20 75 6e 6b 6e 6f 77 6e 20 28  ion is unknown (
10e80 4e 55 4c 4c 29 0a 2a 2a 20 69 66 20 74 68 65 20  NULL).** if the 
10e90 4c 48 53 20 69 73 20 4e 55 4c 4c 20 6f 72 20 69  LHS is NULL or i
10ea0 66 20 74 68 65 20 4c 48 53 20 69 73 20 6e 6f 74  f the LHS is not
10eb0 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69   contained withi
10ec0 6e 20 74 68 65 20 52 48 53 20 61 6e 64 20 74 68  n the RHS and th
10ed0 65 0a 2a 2a 20 52 48 53 20 63 6f 6e 74 61 69 6e  e.** RHS contain
10ee0 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 4e 55  s one or more NU
10ef0 4c 4c 20 76 61 6c 75 65 73 2e 0a 2a 2a 0a 2a 2a  LL values..**.**
10f00 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65   This routine ge
10f10 6e 65 72 61 74 65 73 20 63 6f 64 65 20 74 68 61  nerates code tha
10f20 74 20 6a 75 6d 70 73 20 74 6f 20 64 65 73 74 49  t jumps to destI
10f30 66 46 61 6c 73 65 20 69 66 20 74 68 65 20 4c 48  fFalse if the LH
10f40 53 20 69 73 20 6e 6f 74 20 0a 2a 2a 20 63 6f 6e  S is not .** con
10f50 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20 74 68  tained within th
10f60 65 20 52 48 53 2e 20 20 49 66 20 64 75 65 20 74  e RHS.  If due t
10f70 6f 20 4e 55 4c 4c 73 20 77 65 20 63 61 6e 6e 6f  o NULLs we canno
10f80 74 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74  t determine if t
10f90 68 65 20 4c 48 53 0a 2a 2a 20 69 73 20 63 6f 6e  he LHS.** is con
10fa0 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 52 48  tained in the RH
10fb0 53 20 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20 64  S then jump to d
10fc0 65 73 74 49 66 4e 75 6c 6c 2e 20 20 49 66 20 74  estIfNull.  If t
10fd0 68 65 20 4c 48 53 20 69 73 20 63 6f 6e 74 61 69  he LHS is contai
10fe0 6e 65 64 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68  ned.** within th
10ff0 65 20 52 48 53 20 74 68 65 6e 20 66 61 6c 6c 20  e RHS then fall 
11000 74 68 72 6f 75 67 68 2e 0a 2a 2f 0a 73 74 61 74  through..*/.stat
11010 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 45  ic void sqlite3E
11020 78 70 72 43 6f 64 65 49 4e 28 0a 20 20 50 61 72  xprCodeIN(.  Par
11030 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
11040 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e     /* Parsing an
11050 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e  d code generatin
11060 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
11070 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20  xpr *pExpr,     
11080 20 20 20 20 20 2f 2a 20 54 68 65 20 49 4e 20 65       /* The IN e
11090 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69  xpression */.  i
110a0 6e 74 20 64 65 73 74 49 66 46 61 6c 73 65 2c 20  nt destIfFalse, 
110b0 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72       /* Jump her
110c0 65 20 69 66 20 4c 48 53 20 69 73 20 6e 6f 74 20  e if LHS is not 
110d0 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65  contained in the
110e0 20 52 48 53 20 2a 2f 0a 20 20 69 6e 74 20 64 65   RHS */.  int de
110f0 73 74 49 66 4e 75 6c 6c 20 20 20 20 20 20 20 20  stIfNull        
11100 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20  /* Jump here if 
11110 74 68 65 20 72 65 73 75 6c 74 73 20 61 72 65 20  the results are 
11120 75 6e 6b 6e 6f 77 6e 20 64 75 65 20 74 6f 20 4e  unknown due to N
11130 55 4c 4c 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ULLs */.){.  int
11140 20 72 52 68 73 48 61 73 4e 75 6c 6c 20 3d 20 30   rRhsHasNull = 0
11150 3b 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 74  ;  /* Register t
11160 68 61 74 20 69 73 20 74 72 75 65 20 69 66 20 52  hat is true if R
11170 48 53 20 63 6f 6e 74 61 69 6e 73 20 4e 55 4c 4c  HS contains NULL
11180 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 63 68 61   values */.  cha
11190 72 20 61 66 66 69 6e 69 74 79 3b 20 20 20 20 20  r affinity;     
111a0 20 20 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e     /* Comparison
111b0 20 61 66 66 69 6e 69 74 79 20 74 6f 20 75 73 65   affinity to use
111c0 20 2a 2f 0a 20 20 69 6e 74 20 65 54 79 70 65 3b   */.  int eType;
111d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
111e0 79 70 65 20 6f 66 20 74 68 65 20 52 48 53 20 2a  ype of the RHS *
111f0 2f 0a 20 20 69 6e 74 20 72 31 3b 20 20 20 20 20  /.  int r1;     
11200 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d            /* Tem
11210 70 6f 72 61 72 79 20 75 73 65 20 72 65 67 69 73  porary use regis
11220 74 65 72 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  ter */.  Vdbe *v
11230 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
11240 2a 20 53 74 61 74 65 6d 65 6e 74 20 75 6e 64 65  * Statement unde
11250 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a  r construction *
11260 2f 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20  /..  /* Compute 
11270 74 68 65 20 52 48 53 2e 20 20 20 41 66 74 65 72  the RHS.   After
11280 20 74 68 69 73 20 73 74 65 70 2c 20 74 68 65 20   this step, the 
11290 74 61 62 6c 65 20 77 69 74 68 20 63 75 72 73 6f  table with curso
112a0 72 0a 20 20 2a 2a 20 70 45 78 70 72 2d 3e 69 54  r.  ** pExpr->iT
112b0 61 62 6c 65 20 77 69 6c 6c 20 63 6f 6e 74 61 69  able will contai
112c0 6e 73 20 74 68 65 20 76 61 6c 75 65 73 20 74 68  ns the values th
112d0 61 74 20 6d 61 6b 65 20 75 70 20 74 68 65 20 52  at make up the R
112e0 48 53 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 70  HS..  */.  v = p
112f0 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
11300 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 20  assert( v!=0 ); 
11310 20 20 20 20 20 20 2f 2a 20 4f 4f 4d 20 64 65 74        /* OOM det
11320 65 63 74 65 64 20 70 72 69 6f 72 20 74 6f 20 74  ected prior to t
11330 68 69 73 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 20  his routine */. 
11340 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74   VdbeNoopComment
11350 28 28 76 2c 20 22 62 65 67 69 6e 20 49 4e 20 65  ((v, "begin IN e
11360 78 70 72 22 29 29 3b 0a 20 20 65 54 79 70 65 20  xpr"));.  eType 
11370 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 49  = sqlite3FindInI
11380 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 45 78  ndex(pParse, pEx
11390 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  pr,.            
113a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
113b0 20 49 4e 5f 49 4e 44 45 58 5f 4d 45 4d 42 45 52   IN_INDEX_MEMBER
113c0 53 48 49 50 20 7c 20 49 4e 5f 49 4e 44 45 58 5f  SHIP | IN_INDEX_
113d0 4e 4f 4f 50 5f 4f 4b 2c 0a 20 20 20 20 20 20 20  NOOP_OK,.       
113e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
113f0 20 20 20 20 20 20 64 65 73 74 49 66 46 61 6c 73        destIfFals
11400 65 3d 3d 64 65 73 74 49 66 4e 75 6c 6c 20 3f 20  e==destIfNull ? 
11410 30 20 3a 20 26 72 52 68 73 48 61 73 4e 75 6c 6c  0 : &rRhsHasNull
11420 29 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20  );..  /* Figure 
11430 6f 75 74 20 74 68 65 20 61 66 66 69 6e 69 74 79  out the affinity
11440 20 74 6f 20 75 73 65 20 74 6f 20 63 72 65 61 74   to use to creat
11450 65 20 61 20 6b 65 79 20 66 72 6f 6d 20 74 68 65  e a key from the
11460 20 72 65 73 75 6c 74 73 0a 20 20 2a 2a 20 6f 66   results.  ** of
11470 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 2e   the expression.
11480 20 61 66 66 69 6e 69 74 79 53 74 72 20 73 74 6f   affinityStr sto
11490 72 65 73 20 61 20 73 74 61 74 69 63 20 73 74 72  res a static str
114a0 69 6e 67 20 73 75 69 74 61 62 6c 65 20 66 6f 72  ing suitable for
114b0 0a 20 20 2a 2a 20 50 34 20 6f 66 20 4f 50 5f 4d  .  ** P4 of OP_M
114c0 61 6b 65 52 65 63 6f 72 64 2e 0a 20 20 2a 2f 0a  akeRecord..  */.
114d0 20 20 61 66 66 69 6e 69 74 79 20 3d 20 63 6f 6d    affinity = com
114e0 70 61 72 69 73 6f 6e 41 66 66 69 6e 69 74 79 28  parisonAffinity(
114f0 70 45 78 70 72 29 3b 0a 0a 20 20 2f 2a 20 43 6f  pExpr);..  /* Co
11500 64 65 20 74 68 65 20 4c 48 53 2c 20 74 68 65 20  de the LHS, the 
11510 3c 65 78 70 72 3e 20 66 72 6f 6d 20 22 3c 65 78  <expr> from "<ex
11520 70 72 3e 20 49 4e 20 28 2e 2e 2e 29 22 2e 0a 20  pr> IN (...)".. 
11530 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 78 70   */.  sqlite3Exp
11540 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73  rCachePush(pPars
11550 65 29 3b 0a 20 20 72 31 20 3d 20 73 71 6c 69 74  e);.  r1 = sqlit
11560 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
11570 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  rse);.  sqlite3E
11580 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
11590 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 72 31  pExpr->pLeft, r1
115a0 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 73 71 6c 69  );..  /* If sqli
115b0 74 65 33 46 69 6e 64 49 6e 49 6e 64 65 78 28 29  te3FindInIndex()
115c0 20 64 69 64 20 6e 6f 74 20 66 69 6e 64 20 6f 72   did not find or
115d0 20 63 72 65 61 74 65 20 61 6e 20 69 6e 64 65 78   create an index
115e0 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 73 75   that is.  ** su
115f0 69 74 61 62 6c 65 20 66 6f 72 20 65 76 61 6c 75  itable for evalu
11600 61 74 69 6e 67 20 74 68 65 20 49 4e 20 6f 70 65  ating the IN ope
11610 72 61 74 6f 72 2c 20 74 68 65 6e 20 65 76 61 6c  rator, then eval
11620 75 61 74 65 20 75 73 69 6e 67 20 61 0a 20 20 2a  uate using a.  *
11630 2a 20 73 65 71 75 65 6e 63 65 20 6f 66 20 63 6f  * sequence of co
11640 6d 70 61 72 69 73 6f 6e 73 2e 0a 20 20 2a 2f 0a  mparisons..  */.
11650 20 20 69 66 28 20 65 54 79 70 65 3d 3d 49 4e 5f    if( eType==IN_
11660 49 4e 44 45 58 5f 4e 4f 4f 50 20 29 7b 0a 20 20  INDEX_NOOP ){.  
11670 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
11680 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  t = pExpr->x.pLi
11690 73 74 3b 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20  st;.    CollSeq 
116a0 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33  *pColl = sqlite3
116b0 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
116c0 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
116d0 29 3b 0a 20 20 20 20 69 6e 74 20 6c 61 62 65 6c  );.    int label
116e0 4f 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  Ok = sqlite3Vdbe
116f0 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
11700 20 20 69 6e 74 20 72 32 2c 20 72 65 67 54 6f 46    int r2, regToF
11710 72 65 65 3b 0a 20 20 20 20 69 6e 74 20 72 65 67  ree;.    int reg
11720 43 6b 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20  CkNull = 0;.    
11730 69 6e 74 20 69 69 3b 0a 20 20 20 20 61 73 73 65  int ii;.    asse
11740 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
11750 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78  erty(pExpr, EP_x
11760 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20  IsSelect) );.   
11770 20 69 66 28 20 64 65 73 74 49 66 4e 75 6c 6c 21   if( destIfNull!
11780 3d 64 65 73 74 49 66 46 61 6c 73 65 20 29 7b 0a  =destIfFalse ){.
11790 20 20 20 20 20 20 72 65 67 43 6b 4e 75 6c 6c 20        regCkNull 
117a0 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
117b0 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
117c0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
117d0 64 4f 70 33 28 76 2c 20 4f 50 5f 42 69 74 41 6e  dOp3(v, OP_BitAn
117e0 64 2c 20 72 31 2c 20 72 31 2c 20 72 65 67 43 6b  d, r1, r1, regCk
117f0 4e 75 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Null);.    }.   
11800 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 4c   for(ii=0; ii<pL
11810 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 69 2b 2b  ist->nExpr; ii++
11820 29 7b 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71  ){.      r2 = sq
11830 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
11840 70 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2d  p(pParse, pList-
11850 3e 61 5b 69 69 5d 2e 70 45 78 70 72 2c 20 26 72  >a[ii].pExpr, &r
11860 65 67 54 6f 46 72 65 65 29 3b 0a 20 20 20 20 20  egToFree);.     
11870 20 69 66 28 20 72 65 67 43 6b 4e 75 6c 6c 20 26   if( regCkNull &
11880 26 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 6e  & sqlite3ExprCan
11890 42 65 4e 75 6c 6c 28 70 4c 69 73 74 2d 3e 61 5b  BeNull(pList->a[
118a0 69 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20  ii].pExpr) ){.  
118b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
118c0 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 42 69  eAddOp3(v, OP_Bi
118d0 74 41 6e 64 2c 20 72 65 67 43 6b 4e 75 6c 6c 2c  tAnd, regCkNull,
118e0 20 72 32 2c 20 72 65 67 43 6b 4e 75 6c 6c 29 3b   r2, regCkNull);
118f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
11900 66 28 20 69 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  f( ii<pList->nEx
11910 70 72 2d 31 20 7c 7c 20 64 65 73 74 49 66 4e 75  pr-1 || destIfNu
11920 6c 6c 21 3d 64 65 73 74 49 66 46 61 6c 73 65 20  ll!=destIfFalse 
11930 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
11940 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
11950 4f 50 5f 45 71 2c 20 72 31 2c 20 6c 61 62 65 6c  OP_Eq, r1, label
11960 4f 6b 2c 20 72 32 2c 0a 20 20 20 20 20 20 20 20  Ok, r2,.        
11970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11980 20 20 28 76 6f 69 64 2a 29 70 43 6f 6c 6c 2c 20    (void*)pColl, 
11990 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20  P4_COLLSEQ);.   
119a0 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
119b0 65 49 66 28 76 2c 20 69 69 3c 70 4c 69 73 74 2d  eIf(v, ii<pList-
119c0 3e 6e 45 78 70 72 2d 31 29 3b 0a 20 20 20 20 20  >nExpr-1);.     
119d0 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
119e0 66 28 76 2c 20 69 69 3d 3d 70 4c 69 73 74 2d 3e  f(v, ii==pList->
119f0 6e 45 78 70 72 2d 31 29 3b 0a 20 20 20 20 20 20  nExpr-1);.      
11a00 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
11a10 6e 67 65 50 35 28 76 2c 20 61 66 66 69 6e 69 74  ngeP5(v, affinit
11a20 79 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  y);.      }else{
11a30 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
11a40 20 64 65 73 74 49 66 4e 75 6c 6c 3d 3d 64 65 73   destIfNull==des
11a50 74 49 66 46 61 6c 73 65 20 29 3b 0a 20 20 20 20  tIfFalse );.    
11a60 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
11a70 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4e 65 2c 20  ddOp4(v, OP_Ne, 
11a80 72 31 2c 20 64 65 73 74 49 66 46 61 6c 73 65 2c  r1, destIfFalse,
11a90 20 72 32 2c 0a 20 20 20 20 20 20 20 20 20 20 20   r2,.           
11aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
11ab0 76 6f 69 64 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f  void*)pColl, P4_
11ac0 43 4f 4c 4c 53 45 51 29 3b 20 56 64 62 65 43 6f  COLLSEQ); VdbeCo
11ad0 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
11ae0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
11af0 61 6e 67 65 50 35 28 76 2c 20 61 66 66 69 6e 69  angeP5(v, affini
11b00 74 79 20 7c 20 53 51 4c 49 54 45 5f 4a 55 4d 50  ty | SQLITE_JUMP
11b10 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 7d  IFNULL);.      }
11b20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
11b30 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
11b40 72 73 65 2c 20 72 65 67 54 6f 46 72 65 65 29 3b  rse, regToFree);
11b50 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
11b60 65 67 43 6b 4e 75 6c 6c 20 29 7b 0a 20 20 20 20  egCkNull ){.    
11b70 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
11b80 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c  Op2(v, OP_IsNull
11b90 2c 20 72 65 67 43 6b 4e 75 6c 6c 2c 20 64 65 73  , regCkNull, des
11ba0 74 49 66 4e 75 6c 6c 29 3b 20 56 64 62 65 43 6f  tIfNull); VdbeCo
11bb0 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
11bc0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
11bd0 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
11be0 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a  , destIfFalse);.
11bf0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
11c00 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
11c10 6c 28 76 2c 20 6c 61 62 65 6c 4f 6b 29 3b 0a 20  l(v, labelOk);. 
11c20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
11c30 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
11c40 20 72 65 67 43 6b 4e 75 6c 6c 29 3b 0a 20 20 7d   regCkNull);.  }
11c50 65 6c 73 65 7b 0a 20 20 0a 20 20 20 20 2f 2a 20  else{.  .    /* 
11c60 49 66 20 74 68 65 20 4c 48 53 20 69 73 20 4e 55  If the LHS is NU
11c70 4c 4c 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73  LL, then the res
11c80 75 6c 74 20 69 73 20 65 69 74 68 65 72 20 66 61  ult is either fa
11c90 6c 73 65 20 6f 72 20 4e 55 4c 4c 20 64 65 70 65  lse or NULL depe
11ca0 6e 64 69 6e 67 0a 20 20 20 20 2a 2a 20 6f 6e 20  nding.    ** on 
11cb0 77 68 65 74 68 65 72 20 74 68 65 20 52 48 53 20  whether the RHS 
11cc0 69 73 20 65 6d 70 74 79 20 6f 72 20 6e 6f 74 2c  is empty or not,
11cd0 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 0a 20   respectively.. 
11ce0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71     */.    if( sq
11cf0 6c 69 74 65 33 45 78 70 72 43 61 6e 42 65 4e 75  lite3ExprCanBeNu
11d00 6c 6c 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  ll(pExpr->pLeft)
11d10 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 64 65   ){.      if( de
11d20 73 74 49 66 4e 75 6c 6c 3d 3d 64 65 73 74 49 66  stIfNull==destIf
11d30 46 61 6c 73 65 20 29 7b 0a 20 20 20 20 20 20 20  False ){.       
11d40 20 2f 2a 20 53 68 6f 72 74 63 75 74 20 66 6f 72   /* Shortcut for
11d50 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65   the common case
11d60 20 77 68 65 72 65 20 74 68 65 20 66 61 6c 73 65   where the false
11d70 20 61 6e 64 20 4e 55 4c 4c 20 6f 75 74 63 6f 6d   and NULL outcom
11d80 65 73 20 61 72 65 0a 20 20 20 20 20 20 20 20 2a  es are.        *
11d90 2a 20 74 68 65 20 73 61 6d 65 2e 20 2a 2f 0a 20  * the same. */. 
11da0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
11db0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
11dc0 73 4e 75 6c 6c 2c 20 72 31 2c 20 64 65 73 74 49  sNull, r1, destI
11dd0 66 4e 75 6c 6c 29 3b 20 56 64 62 65 43 6f 76 65  fNull); VdbeCove
11de0 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 7d  rage(v);.      }
11df0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e  else{.        in
11e00 74 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65  t addr1 = sqlite
11e10 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
11e20 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 72 31 29 3b 20  P_NotNull, r1); 
11e30 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
11e40 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
11e50 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
11e60 5f 52 65 77 69 6e 64 2c 20 70 45 78 70 72 2d 3e  _Rewind, pExpr->
11e70 69 54 61 62 6c 65 2c 20 64 65 73 74 49 66 46 61  iTable, destIfFa
11e80 6c 73 65 29 3b 0a 20 20 20 20 20 20 20 20 56 64  lse);.        Vd
11e90 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
11ea0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
11eb0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
11ec0 6f 74 6f 2c 20 30 2c 20 64 65 73 74 49 66 4e 75  oto, 0, destIfNu
11ed0 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ll);.        sql
11ee0 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
11ef0 28 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 20 20  (v, addr1);.    
11f00 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20    }.    }.  .   
11f10 20 69 66 28 20 65 54 79 70 65 3d 3d 49 4e 5f 49   if( eType==IN_I
11f20 4e 44 45 58 5f 52 4f 57 49 44 20 29 7b 0a 20 20  NDEX_ROWID ){.  
11f30 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 63      /* In this c
11f40 61 73 65 2c 20 74 68 65 20 52 48 53 20 69 73 20  ase, the RHS is 
11f50 74 68 65 20 52 4f 57 49 44 20 6f 66 20 74 61 62  the ROWID of tab
11f60 6c 65 20 62 2d 74 72 65 65 0a 20 20 20 20 20 20  le b-tree.      
11f70 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
11f80 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
11f90 5f 4d 75 73 74 42 65 49 6e 74 2c 20 72 31 2c 20  _MustBeInt, r1, 
11fa0 64 65 73 74 49 66 46 61 6c 73 65 29 3b 20 56 64  destIfFalse); Vd
11fb0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
11fc0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
11fd0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 6f 74  AddOp3(v, OP_Not
11fe0 45 78 69 73 74 73 2c 20 70 45 78 70 72 2d 3e 69  Exists, pExpr->i
11ff0 54 61 62 6c 65 2c 20 64 65 73 74 49 66 46 61 6c  Table, destIfFal
12000 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 56  se, r1);.      V
12010 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
12020 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
12030 20 2f 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65   /* In this case
12040 2c 20 74 68 65 20 52 48 53 20 69 73 20 61 6e 20  , the RHS is an 
12050 69 6e 64 65 78 20 62 2d 74 72 65 65 2e 0a 20 20  index b-tree..  
12060 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c      */.      sql
12070 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
12080 2c 20 4f 50 5f 41 66 66 69 6e 69 74 79 2c 20 72  , OP_Affinity, r
12090 31 2c 20 31 2c 20 30 2c 20 26 61 66 66 69 6e 69  1, 1, 0, &affini
120a0 74 79 2c 20 31 29 3b 0a 20 20 0a 20 20 20 20 20  ty, 1);.  .     
120b0 20 2f 2a 20 49 66 20 74 68 65 20 73 65 74 20 6d   /* If the set m
120c0 65 6d 62 65 72 73 68 69 70 20 74 65 73 74 20 66  embership test f
120d0 61 69 6c 73 2c 20 74 68 65 6e 20 74 68 65 20 72  ails, then the r
120e0 65 73 75 6c 74 20 6f 66 20 74 68 65 20 0a 20 20  esult of the .  
120f0 20 20 20 20 2a 2a 20 22 78 20 49 4e 20 28 2e 2e      ** "x IN (..
12100 2e 29 22 20 65 78 70 72 65 73 73 69 6f 6e 20 6d  .)" expression m
12110 75 73 74 20 62 65 20 65 69 74 68 65 72 20 30 20  ust be either 0 
12120 6f 72 20 4e 55 4c 4c 2e 20 49 66 20 74 68 65 20  or NULL. If the 
12130 73 65 74 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e  set.      ** con
12140 74 61 69 6e 73 20 6e 6f 20 4e 55 4c 4c 20 76 61  tains no NULL va
12150 6c 75 65 73 2c 20 74 68 65 6e 20 74 68 65 20 72  lues, then the r
12160 65 73 75 6c 74 20 69 73 20 30 2e 20 49 66 20 74  esult is 0. If t
12170 68 65 20 73 65 74 20 0a 20 20 20 20 20 20 2a 2a  he set .      **
12180 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72   contains one or
12190 20 6d 6f 72 65 20 4e 55 4c 4c 20 76 61 6c 75 65   more NULL value
121a0 73 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73 75  s, then the resu
121b0 6c 74 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20  lt of the.      
121c0 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  ** expression is
121d0 20 61 6c 73 6f 20 4e 55 4c 4c 2e 0a 20 20 20 20   also NULL..    
121e0 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72    */.      asser
121f0 74 28 20 64 65 73 74 49 66 46 61 6c 73 65 21 3d  t( destIfFalse!=
12200 64 65 73 74 49 66 4e 75 6c 6c 20 7c 7c 20 72 52  destIfNull || rR
12210 68 73 48 61 73 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  hsHasNull==0 );.
12220 20 20 20 20 20 20 69 66 28 20 72 52 68 73 48 61        if( rRhsHa
12230 73 4e 75 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  sNull==0 ){.    
12240 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e      /* This bran
12250 63 68 20 72 75 6e 73 20 69 66 20 69 74 20 69 73  ch runs if it is
12260 20 6b 6e 6f 77 6e 20 61 74 20 63 6f 6d 70 69 6c   known at compil
12270 65 20 74 69 6d 65 20 74 68 61 74 20 74 68 65 20  e time that the 
12280 52 48 53 0a 20 20 20 20 20 20 20 20 2a 2a 20 63  RHS.        ** c
12290 61 6e 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 4e 55  annot contain NU
122a0 4c 4c 20 76 61 6c 75 65 73 2e 20 54 68 69 73 20  LL values. This 
122b0 68 61 70 70 65 6e 73 20 61 73 20 74 68 65 20 72  happens as the r
122c0 65 73 75 6c 74 0a 20 20 20 20 20 20 20 20 2a 2a  esult.        **
122d0 20 6f 66 20 61 20 22 4e 4f 54 20 4e 55 4c 4c 22   of a "NOT NULL"
122e0 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 6e 20 74   constraint in t
122f0 68 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65  he database sche
12300 6d 61 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  ma..        **. 
12310 20 20 20 20 20 20 20 2a 2a 20 41 6c 73 6f 20 72         ** Also r
12320 75 6e 20 74 68 69 73 20 62 72 61 6e 63 68 20 69  un this branch i
12330 66 20 4e 55 4c 4c 20 69 73 20 65 71 75 69 76 61  f NULL is equiva
12340 6c 65 6e 74 20 74 6f 20 46 41 4c 53 45 0a 20 20  lent to FALSE.  
12350 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 69        ** for thi
12360 73 20 70 61 72 74 69 63 75 6c 61 72 20 49 4e 20  s particular IN 
12370 6f 70 65 72 61 74 6f 72 2e 0a 20 20 20 20 20 20  operator..      
12380 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c    */.        sql
12390 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
123a0 74 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64  t(v, OP_NotFound
123b0 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
123c0 20 64 65 73 74 49 66 46 61 6c 73 65 2c 20 72 31   destIfFalse, r1
123d0 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 56 64  , 1);.        Vd
123e0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
123f0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
12400 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 62      /* In this b
12410 72 61 6e 63 68 2c 20 74 68 65 20 52 48 53 20 6f  ranch, the RHS o
12420 66 20 74 68 65 20 49 4e 20 6d 69 67 68 74 20 63  f the IN might c
12430 6f 6e 74 61 69 6e 20 61 20 4e 55 4c 4c 20 61 6e  ontain a NULL an
12440 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  d.        ** the
12450 20 70 72 65 73 65 6e 63 65 20 6f 66 20 61 20 4e   presence of a N
12460 55 4c 4c 20 6f 6e 20 74 68 65 20 52 48 53 20 6d  ULL on the RHS m
12470 61 6b 65 73 20 61 20 64 69 66 66 65 72 65 6e 63  akes a differenc
12480 65 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20 20  e in the.       
12490 20 2a 2a 20 6f 75 74 63 6f 6d 65 2e 0a 20 20 20   ** outcome..   
124a0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
124b0 69 6e 74 20 6a 31 3b 0a 20 20 0a 20 20 20 20 20  int j1;.  .     
124c0 20 20 20 2f 2a 20 46 69 72 73 74 20 63 68 65 63     /* First chec
124d0 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20  k to see if the 
124e0 4c 48 53 20 69 73 20 63 6f 6e 74 61 69 6e 65 64  LHS is contained
124f0 20 69 6e 20 74 68 65 20 52 48 53 2e 20 20 49 66   in the RHS.  If
12500 20 73 6f 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20   so,.        ** 
12510 74 68 65 6e 20 74 68 65 20 61 6e 73 77 65 72 20  then the answer 
12520 69 73 20 54 52 55 45 20 74 68 65 20 70 72 65 73  is TRUE the pres
12530 65 6e 63 65 20 6f 66 20 4e 55 4c 4c 73 20 69 6e  ence of NULLs in
12540 20 74 68 65 20 52 48 53 20 64 6f 65 73 0a 20 20   the RHS does.  
12550 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20 6d 61 74        ** not mat
12560 74 65 72 2e 20 20 49 66 20 74 68 65 20 4c 48 53  ter.  If the LHS
12570 20 69 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65   is not containe
12580 64 20 69 6e 20 74 68 65 20 52 48 53 2c 20 74 68  d in the RHS, th
12590 65 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  en the.        *
125a0 2a 20 61 6e 73 77 65 72 20 69 73 20 4e 55 4c 4c  * answer is NULL
125b0 20 69 66 20 74 68 65 20 52 48 53 20 63 6f 6e 74   if the RHS cont
125c0 61 69 6e 73 20 4e 55 4c 4c 73 20 61 6e 64 20 74  ains NULLs and t
125d0 68 65 20 61 6e 73 77 65 72 20 69 73 0a 20 20 20  he answer is.   
125e0 20 20 20 20 20 2a 2a 20 46 41 4c 53 45 20 69 66       ** FALSE if
125f0 20 74 68 65 20 52 48 53 20 69 73 20 4e 55 4c 4c   the RHS is NULL
12600 2d 66 72 65 65 2e 0a 20 20 20 20 20 20 20 20 2a  -free..        *
12610 2f 0a 20 20 20 20 20 20 20 20 6a 31 20 3d 20 73  /.        j1 = s
12620 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
12630 49 6e 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c  Int(v, OP_Found,
12640 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
12650 30 2c 20 72 31 2c 20 31 29 3b 0a 20 20 20 20 20  0, r1, 1);.     
12660 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
12670 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  v);.        sqli
12680 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
12690 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 52 68 73   OP_IsNull, rRhs
126a0 48 61 73 4e 75 6c 6c 2c 20 64 65 73 74 49 66 4e  HasNull, destIfN
126b0 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 56 64  ull);.        Vd
126c0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
126d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
126e0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
126f0 6f 74 6f 2c 20 30 2c 20 64 65 73 74 49 66 46 61  oto, 0, destIfFa
12700 6c 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71  lse);.        sq
12710 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
12720 65 28 76 2c 20 6a 31 29 3b 0a 20 20 20 20 20 20  e(v, j1);.      
12730 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  }.    }.  }.  sq
12740 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
12750 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b  Reg(pParse, r1);
12760 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  .  sqlite3ExprCa
12770 63 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a  chePop(pParse);.
12780 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
12790 2c 20 22 65 6e 64 20 49 4e 20 65 78 70 72 22 29  , "end IN expr")
127a0 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  );.}.#endif /* S
127b0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
127c0 45 52 59 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 44 75  ERY */../*.** Du
127d0 70 6c 69 63 61 74 65 20 61 6e 20 38 2d 62 79 74  plicate an 8-byt
127e0 65 20 76 61 6c 75 65 0a 2a 2f 0a 73 74 61 74 69  e value.*/.stati
127f0 63 20 63 68 61 72 20 2a 64 75 70 38 62 79 74 65  c char *dup8byte
12800 73 28 56 64 62 65 20 2a 76 2c 20 63 6f 6e 73 74  s(Vdbe *v, const
12810 20 63 68 61 72 20 2a 69 6e 29 7b 0a 20 20 63 68   char *in){.  ch
12820 61 72 20 2a 6f 75 74 20 3d 20 73 71 6c 69 74 65  ar *out = sqlite
12830 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 73 71 6c  3DbMallocRaw(sql
12840 69 74 65 33 56 64 62 65 44 62 28 76 29 2c 20 38  ite3VdbeDb(v), 8
12850 29 3b 0a 20 20 69 66 28 20 6f 75 74 20 29 7b 0a  );.  if( out ){.
12860 20 20 20 20 6d 65 6d 63 70 79 28 6f 75 74 2c 20      memcpy(out, 
12870 69 6e 2c 20 38 29 3b 0a 20 20 7d 0a 20 20 72 65  in, 8);.  }.  re
12880 74 75 72 6e 20 6f 75 74 3b 0a 7d 0a 0a 23 69 66  turn out;.}..#if
12890 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
128a0 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a  _FLOATING_POINT.
128b0 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61  /*.** Generate a
128c0 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 68  n instruction th
128d0 61 74 20 77 69 6c 6c 20 70 75 74 20 74 68 65 20  at will put the 
128e0 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 0a 2a  floating point.*
128f0 2a 20 76 61 6c 75 65 20 64 65 73 63 72 69 62 65  * value describe
12900 64 20 62 79 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 69  d by z[0..n-1] i
12910 6e 74 6f 20 72 65 67 69 73 74 65 72 20 69 4d 65  nto register iMe
12920 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 5b 5d  m..**.** The z[]
12930 20 73 74 72 69 6e 67 20 77 69 6c 6c 20 70 72 6f   string will pro
12940 62 61 62 6c 79 20 6e 6f 74 20 62 65 20 7a 65 72  bably not be zer
12950 6f 2d 74 65 72 6d 69 6e 61 74 65 64 2e 20 20 42  o-terminated.  B
12960 75 74 20 74 68 65 20 0a 2a 2a 20 7a 5b 6e 5d 20  ut the .** z[n] 
12970 63 68 61 72 61 63 74 65 72 20 69 73 20 67 75 61  character is gua
12980 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 73 6f  ranteed to be so
12990 6d 65 74 68 69 6e 67 20 74 68 61 74 20 64 6f 65  mething that doe
129a0 73 20 6e 6f 74 20 6c 6f 6f 6b 0a 2a 2a 20 6c 69  s not look.** li
129b0 6b 65 20 74 68 65 20 63 6f 6e 74 69 6e 75 61 74  ke the continuat
129c0 69 6f 6e 20 6f 66 20 74 68 65 20 6e 75 6d 62 65  ion of the numbe
129d0 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  r..*/.static voi
129e0 64 20 63 6f 64 65 52 65 61 6c 28 56 64 62 65 20  d codeReal(Vdbe 
129f0 2a 76 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  *v, const char *
12a00 7a 2c 20 69 6e 74 20 6e 65 67 61 74 65 46 6c 61  z, int negateFla
12a10 67 2c 20 69 6e 74 20 69 4d 65 6d 29 7b 0a 20 20  g, int iMem){.  
12a20 69 66 28 20 41 4c 57 41 59 53 28 7a 21 3d 30 29  if( ALWAYS(z!=0)
12a30 20 29 7b 0a 20 20 20 20 64 6f 75 62 6c 65 20 76   ){.    double v
12a40 61 6c 75 65 3b 0a 20 20 20 20 63 68 61 72 20 2a  alue;.    char *
12a50 7a 56 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 41  zV;.    sqlite3A
12a60 74 6f 46 28 7a 2c 20 26 76 61 6c 75 65 2c 20 73  toF(z, &value, s
12a70 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
12a80 29 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3b  ), SQLITE_UTF8);
12a90 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 73 71  .    assert( !sq
12aa0 6c 69 74 65 33 49 73 4e 61 4e 28 76 61 6c 75 65  lite3IsNaN(value
12ab0 29 20 29 3b 20 2f 2a 20 54 68 65 20 6e 65 77 20  ) ); /* The new 
12ac0 41 74 6f 46 20 6e 65 76 65 72 20 72 65 74 75 72  AtoF never retur
12ad0 6e 73 20 4e 61 4e 20 2a 2f 0a 20 20 20 20 69 66  ns NaN */.    if
12ae0 28 20 6e 65 67 61 74 65 46 6c 61 67 20 29 20 76  ( negateFlag ) v
12af0 61 6c 75 65 20 3d 20 2d 76 61 6c 75 65 3b 0a 20  alue = -value;. 
12b00 20 20 20 7a 56 20 3d 20 64 75 70 38 62 79 74 65     zV = dup8byte
12b10 73 28 76 2c 20 28 63 68 61 72 2a 29 26 76 61 6c  s(v, (char*)&val
12b20 75 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ue);.    sqlite3
12b30 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
12b40 5f 52 65 61 6c 2c 20 30 2c 20 69 4d 65 6d 2c 20  _Real, 0, iMem, 
12b50 30 2c 20 7a 56 2c 20 50 34 5f 52 45 41 4c 29 3b  0, zV, P4_REAL);
12b60 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a  .  }.}.#endif...
12b70 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61  /*.** Generate a
12b80 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 68  n instruction th
12b90 61 74 20 77 69 6c 6c 20 70 75 74 20 74 68 65 20  at will put the 
12ba0 69 6e 74 65 67 65 72 20 64 65 73 63 72 69 62 65  integer describe
12bb0 20 62 79 0a 2a 2a 20 74 65 78 74 20 7a 5b 30 2e   by.** text z[0.
12bc0 2e 6e 2d 31 5d 20 69 6e 74 6f 20 72 65 67 69 73  .n-1] into regis
12bd0 74 65 72 20 69 4d 65 6d 2e 0a 2a 2a 0a 2a 2a 20  ter iMem..**.** 
12be0 45 78 70 72 2e 75 2e 7a 54 6f 6b 65 6e 20 69 73  Expr.u.zToken is
12bf0 20 61 6c 77 61 79 73 20 55 54 46 38 20 61 6e 64   always UTF8 and
12c00 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74 65 64   zero-terminated
12c10 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
12c20 20 63 6f 64 65 49 6e 74 65 67 65 72 28 50 61 72   codeInteger(Par
12c30 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
12c40 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 6e 65 67   *pExpr, int neg
12c50 46 6c 61 67 2c 20 69 6e 74 20 69 4d 65 6d 29 7b  Flag, int iMem){
12c60 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
12c70 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 66  rse->pVdbe;.  if
12c80 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26  ( pExpr->flags &
12c90 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 29 7b 0a   EP_IntValue ){.
12ca0 20 20 20 20 69 6e 74 20 69 20 3d 20 70 45 78 70      int i = pExp
12cb0 72 2d 3e 75 2e 69 56 61 6c 75 65 3b 0a 20 20 20  r->u.iValue;.   
12cc0 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20 29 3b   assert( i>=0 );
12cd0 0a 20 20 20 20 69 66 28 20 6e 65 67 46 6c 61 67  .    if( negFlag
12ce0 20 29 20 69 20 3d 20 2d 69 3b 0a 20 20 20 20 73   ) i = -i;.    s
12cf0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
12d00 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
12d10 69 2c 20 69 4d 65 6d 29 3b 0a 20 20 7d 65 6c 73  i, iMem);.  }els
12d20 65 7b 0a 20 20 20 20 69 6e 74 20 63 3b 0a 20 20  e{.    int c;.  
12d30 20 20 69 36 34 20 76 61 6c 75 65 3b 0a 20 20 20    i64 value;.   
12d40 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d   const char *z =
12d50 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
12d60 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 7a 21  ;.    assert( z!
12d70 3d 30 20 29 3b 0a 20 20 20 20 63 20 3d 20 73 71  =0 );.    c = sq
12d80 6c 69 74 65 33 44 65 63 4f 72 48 65 78 54 6f 49  lite3DecOrHexToI
12d90 36 34 28 7a 2c 20 26 76 61 6c 75 65 29 3b 0a 20  64(z, &value);. 
12da0 20 20 20 69 66 28 20 63 3d 3d 30 20 7c 7c 20 28     if( c==0 || (
12db0 63 3d 3d 32 20 26 26 20 6e 65 67 46 6c 61 67 29  c==2 && negFlag)
12dc0 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a   ){.      char *
12dd0 7a 56 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 65  zV;.      if( ne
12de0 67 46 6c 61 67 20 29 7b 20 76 61 6c 75 65 20 3d  gFlag ){ value =
12df0 20 63 3d 3d 32 20 3f 20 53 4d 41 4c 4c 45 53 54   c==2 ? SMALLEST
12e00 5f 49 4e 54 36 34 20 3a 20 2d 76 61 6c 75 65 3b  _INT64 : -value;
12e10 20 7d 0a 20 20 20 20 20 20 7a 56 20 3d 20 64 75   }.      zV = du
12e20 70 38 62 79 74 65 73 28 76 2c 20 28 63 68 61 72  p8bytes(v, (char
12e30 2a 29 26 76 61 6c 75 65 29 3b 0a 20 20 20 20 20  *)&value);.     
12e40 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12e50 70 34 28 76 2c 20 4f 50 5f 49 6e 74 36 34 2c 20  p4(v, OP_Int64, 
12e60 30 2c 20 69 4d 65 6d 2c 20 30 2c 20 7a 56 2c 20  0, iMem, 0, zV, 
12e70 50 34 5f 49 4e 54 36 34 29 3b 0a 20 20 20 20 7d  P4_INT64);.    }
12e80 65 6c 73 65 7b 0a 23 69 66 64 65 66 20 53 51 4c  else{.#ifdef SQL
12e90 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e  ITE_OMIT_FLOATIN
12ea0 47 5f 50 4f 49 4e 54 0a 20 20 20 20 20 20 73 71  G_POINT.      sq
12eb0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
12ec0 61 72 73 65 2c 20 22 6f 76 65 72 73 69 7a 65 64  arse, "oversized
12ed0 20 69 6e 74 65 67 65 72 3a 20 25 73 25 73 22 2c   integer: %s%s",
12ee0 20 6e 65 67 46 6c 61 67 20 3f 20 22 2d 22 20 3a   negFlag ? "-" :
12ef0 20 22 22 2c 20 7a 29 3b 0a 23 65 6c 73 65 0a 23   "", z);.#else.#
12f00 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
12f10 49 54 5f 48 45 58 5f 49 4e 54 45 47 45 52 0a 20  IT_HEX_INTEGER. 
12f20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
12f30 5f 73 74 72 6e 69 63 6d 70 28 7a 2c 22 30 78 22  _strnicmp(z,"0x"
12f40 2c 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ,2)==0 ){.      
12f50 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
12f60 67 28 70 50 61 72 73 65 2c 20 22 68 65 78 20 6c  g(pParse, "hex l
12f70 69 74 65 72 61 6c 20 74 6f 6f 20 62 69 67 3a 20  iteral too big: 
12f80 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 7d  %s", z);.      }
12f90 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20  else.#endif.    
12fa0 20 20 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65    {.        code
12fb0 52 65 61 6c 28 76 2c 20 7a 2c 20 6e 65 67 46 6c  Real(v, z, negFl
12fc0 61 67 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20 20  ag, iMem);.     
12fd0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a   }.#endif.    }.
12fe0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65    }.}../*.** Cle
12ff0 61 72 20 61 20 63 61 63 68 65 20 65 6e 74 72 79  ar a cache entry
13000 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
13010 20 63 61 63 68 65 45 6e 74 72 79 43 6c 65 61 72   cacheEntryClear
13020 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
13030 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65  struct yColCache
13040 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 74   *p){.  if( p->t
13050 65 6d 70 52 65 67 20 29 7b 0a 20 20 20 20 69 66  empReg ){.    if
13060 28 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52  ( pParse->nTempR
13070 65 67 3c 41 72 72 61 79 53 69 7a 65 28 70 50 61  eg<ArraySize(pPa
13080 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 29 20 29  rse->aTempReg) )
13090 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  {.      pParse->
130a0 61 54 65 6d 70 52 65 67 5b 70 50 61 72 73 65 2d  aTempReg[pParse-
130b0 3e 6e 54 65 6d 70 52 65 67 2b 2b 5d 20 3d 20 70  >nTempReg++] = p
130c0 2d 3e 69 52 65 67 3b 0a 20 20 20 20 7d 0a 20 20  ->iReg;.    }.  
130d0 20 20 70 2d 3e 74 65 6d 70 52 65 67 20 3d 20 30    p->tempReg = 0
130e0 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  ;.  }.}.../*.** 
130f0 52 65 63 6f 72 64 20 69 6e 20 74 68 65 20 63 6f  Record in the co
13100 6c 75 6d 6e 20 63 61 63 68 65 20 74 68 61 74 20  lumn cache that 
13110 61 20 70 61 72 74 69 63 75 6c 61 72 20 63 6f 6c  a particular col
13120 75 6d 6e 20 66 72 6f 6d 20 61 0a 2a 2a 20 70 61  umn from a.** pa
13130 72 74 69 63 75 6c 61 72 20 74 61 62 6c 65 20 69  rticular table i
13140 73 20 73 74 6f 72 65 64 20 69 6e 20 61 20 70 61  s stored in a pa
13150 72 74 69 63 75 6c 61 72 20 72 65 67 69 73 74 65  rticular registe
13160 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  r..*/.void sqlit
13170 65 33 45 78 70 72 43 61 63 68 65 53 74 6f 72 65  e3ExprCacheStore
13180 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
13190 69 6e 74 20 69 54 61 62 2c 20 69 6e 74 20 69 43  int iTab, int iC
131a0 6f 6c 2c 20 69 6e 74 20 69 52 65 67 29 7b 0a 20  ol, int iReg){. 
131b0 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6d 69   int i;.  int mi
131c0 6e 4c 72 75 3b 0a 20 20 69 6e 74 20 69 64 78 4c  nLru;.  int idxL
131d0 72 75 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f  ru;.  struct yCo
131e0 6c 43 61 63 68 65 20 2a 70 3b 0a 0a 20 20 61 73  lCache *p;..  as
131f0 73 65 72 74 28 20 69 52 65 67 3e 30 20 29 3b 20  sert( iReg>0 ); 
13200 20 2f 2a 20 52 65 67 69 73 74 65 72 20 6e 75 6d   /* Register num
13210 62 65 72 73 20 61 72 65 20 61 6c 77 61 79 73 20  bers are always 
13220 70 6f 73 69 74 69 76 65 20 2a 2f 0a 20 20 61 73  positive */.  as
13230 73 65 72 74 28 20 69 43 6f 6c 3e 3d 2d 31 20 26  sert( iCol>=-1 &
13240 26 20 69 43 6f 6c 3c 33 32 37 36 38 20 29 3b 20  & iCol<32768 ); 
13250 20 2f 2a 20 46 69 6e 69 74 65 20 63 6f 6c 75 6d   /* Finite colum
13260 6e 20 6e 75 6d 62 65 72 73 20 2a 2f 0a 0a 20 20  n numbers */..  
13270 2f 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 43 6f  /* The SQLITE_Co
13280 6c 75 6d 6e 43 61 63 68 65 20 66 6c 61 67 20 64  lumnCache flag d
13290 69 73 61 62 6c 65 73 20 74 68 65 20 63 6f 6c 75  isables the colu
132a0 6d 6e 20 63 61 63 68 65 2e 20 20 54 68 69 73 20  mn cache.  This 
132b0 69 73 20 75 73 65 64 0a 20 20 2a 2a 20 66 6f 72  is used.  ** for
132c0 20 74 65 73 74 69 6e 67 20 6f 6e 6c 79 20 2d 20   testing only - 
132d0 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20 53  to verify that S
132e0 51 4c 69 74 65 20 61 6c 77 61 79 73 20 67 65 74  QLite always get
132f0 73 20 74 68 65 20 73 61 6d 65 20 61 6e 73 77 65  s the same answe
13300 72 0a 20 20 2a 2a 20 77 69 74 68 20 61 6e 64 20  r.  ** with and 
13310 77 69 74 68 6f 75 74 20 74 68 65 20 63 6f 6c 75  without the colu
13320 6d 6e 20 63 61 63 68 65 2e 0a 20 20 2a 2f 0a 20  mn cache..  */. 
13330 20 69 66 28 20 4f 70 74 69 6d 69 7a 61 74 69 6f   if( Optimizatio
13340 6e 44 69 73 61 62 6c 65 64 28 70 50 61 72 73 65  nDisabled(pParse
13350 2d 3e 64 62 2c 20 53 51 4c 49 54 45 5f 43 6f 6c  ->db, SQLITE_Col
13360 75 6d 6e 43 61 63 68 65 29 20 29 20 72 65 74 75  umnCache) ) retu
13370 72 6e 3b 0a 0a 20 20 2f 2a 20 46 69 72 73 74 20  rn;..  /* First 
13380 72 65 70 6c 61 63 65 20 61 6e 79 20 65 78 69 73  replace any exis
13390 74 69 6e 67 20 65 6e 74 72 79 2e 0a 20 20 2a 2a  ting entry..  **
133a0 0a 20 20 2a 2a 20 41 63 74 75 61 6c 6c 79 2c 20  .  ** Actually, 
133b0 74 68 65 20 77 61 79 20 74 68 65 20 63 6f 6c 75  the way the colu
133c0 6d 6e 20 63 61 63 68 65 20 69 73 20 63 75 72 72  mn cache is curr
133d0 65 6e 74 6c 79 20 75 73 65 64 2c 20 77 65 20 61  ently used, we a
133e0 72 65 20 67 75 61 72 61 6e 74 65 65 64 0a 20 20  re guaranteed.  
133f0 2a 2a 20 74 68 61 74 20 74 68 65 20 6f 62 6a 65  ** that the obje
13400 63 74 20 77 69 6c 6c 20 6e 65 76 65 72 20 61 6c  ct will never al
13410 72 65 61 64 79 20 62 65 20 69 6e 20 63 61 63 68  ready be in cach
13420 65 2e 20 20 56 65 72 69 66 79 20 74 68 69 73 20  e.  Verify this 
13430 67 75 61 72 61 6e 74 65 65 2e 0a 20 20 2a 2f 0a  guarantee..  */.
13440 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
13450 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72   for(i=0, p=pPar
13460 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69  se->aColCache; i
13470 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43  <SQLITE_N_COLCAC
13480 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20  HE; i++, p++){. 
13490 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 52     assert( p->iR
134a0 65 67 3d 3d 30 20 7c 7c 20 70 2d 3e 69 54 61 62  eg==0 || p->iTab
134b0 6c 65 21 3d 69 54 61 62 20 7c 7c 20 70 2d 3e 69  le!=iTab || p->i
134c0 43 6f 6c 75 6d 6e 21 3d 69 43 6f 6c 20 29 3b 0a  Column!=iCol );.
134d0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
134e0 20 46 69 6e 64 20 61 6e 20 65 6d 70 74 79 20 73   Find an empty s
134f0 6c 6f 74 20 61 6e 64 20 72 65 70 6c 61 63 65 20  lot and replace 
13500 69 74 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c  it */.  for(i=0,
13510 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43   p=pParse->aColC
13520 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e  ache; i<SQLITE_N
13530 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20  _COLCACHE; i++, 
13540 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  p++){.    if( p-
13550 3e 69 52 65 67 3d 3d 30 20 29 7b 0a 20 20 20 20  >iReg==0 ){.    
13560 20 20 70 2d 3e 69 4c 65 76 65 6c 20 3d 20 70 50    p->iLevel = pP
13570 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65  arse->iCacheLeve
13580 6c 3b 0a 20 20 20 20 20 20 70 2d 3e 69 54 61 62  l;.      p->iTab
13590 6c 65 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 20  le = iTab;.     
135a0 20 70 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69 43   p->iColumn = iC
135b0 6f 6c 3b 0a 20 20 20 20 20 20 70 2d 3e 69 52 65  ol;.      p->iRe
135c0 67 20 3d 20 69 52 65 67 3b 0a 20 20 20 20 20 20  g = iReg;.      
135d0 70 2d 3e 74 65 6d 70 52 65 67 20 3d 20 30 3b 0a  p->tempReg = 0;.
135e0 20 20 20 20 20 20 70 2d 3e 6c 72 75 20 3d 20 70        p->lru = p
135f0 50 61 72 73 65 2d 3e 69 43 61 63 68 65 43 6e 74  Parse->iCacheCnt
13600 2b 2b 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ++;.      return
13610 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
13620 2a 20 52 65 70 6c 61 63 65 20 74 68 65 20 6c 61  * Replace the la
13630 73 74 20 72 65 63 65 6e 74 6c 79 20 75 73 65 64  st recently used
13640 20 2a 2f 0a 20 20 6d 69 6e 4c 72 75 20 3d 20 30   */.  minLru = 0
13650 78 37 66 66 66 66 66 66 66 3b 0a 20 20 69 64 78  x7fffffff;.  idx
13660 4c 72 75 20 3d 20 2d 31 3b 0a 20 20 66 6f 72 28  Lru = -1;.  for(
13670 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61  i=0, p=pParse->a
13680 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49  ColCache; i<SQLI
13690 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69  TE_N_COLCACHE; i
136a0 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66  ++, p++){.    if
136b0 28 20 70 2d 3e 6c 72 75 3c 6d 69 6e 4c 72 75 20  ( p->lru<minLru 
136c0 29 7b 0a 20 20 20 20 20 20 69 64 78 4c 72 75 20  ){.      idxLru 
136d0 3d 20 69 3b 0a 20 20 20 20 20 20 6d 69 6e 4c 72  = i;.      minLr
136e0 75 20 3d 20 70 2d 3e 6c 72 75 3b 0a 20 20 20 20  u = p->lru;.    
136f0 7d 0a 20 20 7d 0a 20 20 69 66 28 20 41 4c 57 41  }.  }.  if( ALWA
13700 59 53 28 69 64 78 4c 72 75 3e 3d 30 29 20 29 7b  YS(idxLru>=0) ){
13710 0a 20 20 20 20 70 20 3d 20 26 70 50 61 72 73 65  .    p = &pParse
13720 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 69 64 78 4c  ->aColCache[idxL
13730 72 75 5d 3b 0a 20 20 20 20 70 2d 3e 69 4c 65 76  ru];.    p->iLev
13740 65 6c 20 3d 20 70 50 61 72 73 65 2d 3e 69 43 61  el = pParse->iCa
13750 63 68 65 4c 65 76 65 6c 3b 0a 20 20 20 20 70 2d  cheLevel;.    p-
13760 3e 69 54 61 62 6c 65 20 3d 20 69 54 61 62 3b 0a  >iTable = iTab;.
13770 20 20 20 20 70 2d 3e 69 43 6f 6c 75 6d 6e 20 3d      p->iColumn =
13780 20 69 43 6f 6c 3b 0a 20 20 20 20 70 2d 3e 69 52   iCol;.    p->iR
13790 65 67 20 3d 20 69 52 65 67 3b 0a 20 20 20 20 70  eg = iReg;.    p
137a0 2d 3e 74 65 6d 70 52 65 67 20 3d 20 30 3b 0a 20  ->tempReg = 0;. 
137b0 20 20 20 70 2d 3e 6c 72 75 20 3d 20 70 50 61 72     p->lru = pPar
137c0 73 65 2d 3e 69 43 61 63 68 65 43 6e 74 2b 2b 3b  se->iCacheCnt++;
137d0 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
137e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64 69 63 61  .}../*.** Indica
137f0 74 65 20 74 68 61 74 20 72 65 67 69 73 74 65 72  te that register
13800 73 20 62 65 74 77 65 65 6e 20 69 52 65 67 2e 2e  s between iReg..
13810 69 52 65 67 2b 6e 52 65 67 2d 31 20 61 72 65 20  iReg+nReg-1 are 
13820 62 65 69 6e 67 20 6f 76 65 72 77 72 69 74 74 65  being overwritte
13830 6e 2e 0a 2a 2a 20 50 75 72 67 65 20 74 68 65 20  n..** Purge the 
13840 72 61 6e 67 65 20 6f 66 20 72 65 67 69 73 74 65  range of registe
13850 72 73 20 66 72 6f 6d 20 74 68 65 20 63 6f 6c 75  rs from the colu
13860 6d 6e 20 63 61 63 68 65 2e 0a 2a 2f 0a 76 6f 69  mn cache..*/.voi
13870 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63  d sqlite3ExprCac
13880 68 65 52 65 6d 6f 76 65 28 50 61 72 73 65 20 2a  heRemove(Parse *
13890 70 50 61 72 73 65 2c 20 69 6e 74 20 69 52 65 67  pParse, int iReg
138a0 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20 69  , int nReg){.  i
138b0 6e 74 20 69 3b 0a 20 20 69 6e 74 20 69 4c 61 73  nt i;.  int iLas
138c0 74 20 3d 20 69 52 65 67 20 2b 20 6e 52 65 67 20  t = iReg + nReg 
138d0 2d 20 31 3b 0a 20 20 73 74 72 75 63 74 20 79 43  - 1;.  struct yC
138e0 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20 66 6f  olCache *p;.  fo
138f0 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d  r(i=0, p=pParse-
13900 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51  >aColCache; i<SQ
13910 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b  LITE_N_COLCACHE;
13920 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20   i++, p++){.    
13930 69 6e 74 20 72 20 3d 20 70 2d 3e 69 52 65 67 3b  int r = p->iReg;
13940 0a 20 20 20 20 69 66 28 20 72 3e 3d 69 52 65 67  .    if( r>=iReg
13950 20 26 26 20 72 3c 3d 69 4c 61 73 74 20 29 7b 0a   && r<=iLast ){.
13960 20 20 20 20 20 20 63 61 63 68 65 45 6e 74 72 79        cacheEntry
13970 43 6c 65 61 72 28 70 50 61 72 73 65 2c 20 70 29  Clear(pParse, p)
13980 3b 0a 20 20 20 20 20 20 70 2d 3e 69 52 65 67 20  ;.      p->iReg 
13990 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  = 0;.    }.  }.}
139a0 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 65 6d 62 65 72  ../*.** Remember
139b0 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6c   the current col
139c0 75 6d 6e 20 63 61 63 68 65 20 63 6f 6e 74 65 78  umn cache contex
139d0 74 2e 20 20 41 6e 79 20 6e 65 77 20 65 6e 74 72  t.  Any new entr
139e0 69 65 73 20 61 64 64 65 64 0a 2a 2a 20 61 64 64  ies added.** add
139f0 65 64 20 74 6f 20 74 68 65 20 63 6f 6c 75 6d 6e  ed to the column
13a00 20 63 61 63 68 65 20 61 66 74 65 72 20 74 68 69   cache after thi
13a10 73 20 63 61 6c 6c 20 61 72 65 20 72 65 6d 6f 76  s call are remov
13a20 65 64 20 77 68 65 6e 20 74 68 65 0a 2a 2a 20 63  ed when the.** c
13a30 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 70 6f 70  orresponding pop
13a40 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 76 6f 69 64   occurs..*/.void
13a50 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
13a60 65 50 75 73 68 28 50 61 72 73 65 20 2a 70 50 61  ePush(Parse *pPa
13a70 72 73 65 29 7b 0a 20 20 70 50 61 72 73 65 2d 3e  rse){.  pParse->
13a80 69 43 61 63 68 65 4c 65 76 65 6c 2b 2b 3b 0a 23  iCacheLevel++;.#
13a90 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
13aa0 55 47 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  UG.  if( pParse-
13ab0 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  >db->flags & SQL
13ac0 49 54 45 5f 56 64 62 65 41 64 64 6f 70 54 72 61  ITE_VdbeAddopTra
13ad0 63 65 20 29 7b 0a 20 20 20 20 70 72 69 6e 74 66  ce ){.    printf
13ae0 28 22 50 55 53 48 20 74 6f 20 25 64 5c 6e 22 2c  ("PUSH to %d\n",
13af0 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c   pParse->iCacheL
13b00 65 76 65 6c 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  evel);.  }.#endi
13b10 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76  f.}../*.** Remov
13b20 65 20 66 72 6f 6d 20 74 68 65 20 63 6f 6c 75 6d  e from the colum
13b30 6e 20 63 61 63 68 65 20 61 6e 79 20 65 6e 74 72  n cache any entr
13b40 69 65 73 20 74 68 61 74 20 77 65 72 65 20 61 64  ies that were ad
13b50 64 65 64 20 73 69 6e 63 65 20 74 68 65 0a 2a 2a  ded since the.**
13b60 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 73 71   the previous sq
13b70 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75  lite3ExprCachePu
13b80 73 68 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 49  sh operation.  I
13b90 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 72  n other words, r
13ba0 65 73 74 6f 72 65 0a 2a 2a 20 74 68 65 20 63 61  estore.** the ca
13bb0 63 68 65 20 74 6f 20 74 68 65 20 73 74 61 74 65  che to the state
13bc0 20 69 74 20 77 61 73 20 69 6e 20 70 72 69 6f 72   it was in prior
13bd0 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
13be0 20 50 75 73 68 2e 0a 2a 2f 0a 76 6f 69 64 20 73   Push..*/.void s
13bf0 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
13c00 6f 70 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  op(Parse *pParse
13c10 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74  ){.  int i;.  st
13c20 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a  ruct yColCache *
13c30 70 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  p;.  assert( pPa
13c40 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c  rse->iCacheLevel
13c50 3e 3d 31 20 29 3b 0a 20 20 70 50 61 72 73 65 2d  >=1 );.  pParse-
13c60 3e 69 43 61 63 68 65 4c 65 76 65 6c 2d 2d 3b 0a  >iCacheLevel--;.
13c70 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
13c80 42 55 47 0a 20 20 69 66 28 20 70 50 61 72 73 65  BUG.  if( pParse
13c90 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ->db->flags & SQ
13ca0 4c 49 54 45 5f 56 64 62 65 41 64 64 6f 70 54 72  LITE_VdbeAddopTr
13cb0 61 63 65 20 29 7b 0a 20 20 20 20 70 72 69 6e 74  ace ){.    print
13cc0 66 28 22 50 4f 50 20 20 74 6f 20 25 64 5c 6e 22  f("POP  to %d\n"
13cd0 2c 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65  , pParse->iCache
13ce0 4c 65 76 65 6c 29 3b 0a 20 20 7d 0a 23 65 6e 64  Level);.  }.#end
13cf0 69 66 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d  if.  for(i=0, p=
13d00 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68  pParse->aColCach
13d10 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f  e; i<SQLITE_N_CO
13d20 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b  LCACHE; i++, p++
13d30 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 52  ){.    if( p->iR
13d40 65 67 20 26 26 20 70 2d 3e 69 4c 65 76 65 6c 3e  eg && p->iLevel>
13d50 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65  pParse->iCacheLe
13d60 76 65 6c 20 29 7b 0a 20 20 20 20 20 20 63 61 63  vel ){.      cac
13d70 68 65 45 6e 74 72 79 43 6c 65 61 72 28 70 50 61  heEntryClear(pPa
13d80 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 20 20 70  rse, p);.      p
13d90 2d 3e 69 52 65 67 20 3d 20 30 3b 0a 20 20 20 20  ->iReg = 0;.    
13da0 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  }.  }.}../*.** W
13db0 68 65 6e 20 61 20 63 61 63 68 65 64 20 63 6f 6c  hen a cached col
13dc0 75 6d 6e 20 69 73 20 72 65 75 73 65 64 2c 20 6d  umn is reused, m
13dd0 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 69 74  ake sure that it
13de0 73 20 72 65 67 69 73 74 65 72 20 69 73 0a 2a 2a  s register is.**
13df0 20 6e 6f 20 6c 6f 6e 67 65 72 20 61 76 61 69 6c   no longer avail
13e00 61 62 6c 65 20 61 73 20 61 20 74 65 6d 70 20 72  able as a temp r
13e10 65 67 69 73 74 65 72 2e 20 20 74 69 63 6b 65 74  egister.  ticket
13e20 20 23 33 38 37 39 3a 20 20 74 68 61 74 20 73 61   #3879:  that sa
13e30 6d 65 0a 2a 2a 20 72 65 67 69 73 74 65 72 20 6d  me.** register m
13e40 69 67 68 74 20 62 65 20 69 6e 20 74 68 65 20 63  ight be in the c
13e50 61 63 68 65 20 69 6e 20 6d 75 6c 74 69 70 6c 65  ache in multiple
13e60 20 70 6c 61 63 65 73 2c 20 73 6f 20 62 65 20 73   places, so be s
13e70 75 72 65 20 74 6f 0a 2a 2a 20 67 65 74 20 74 68  ure to.** get th
13e80 65 6d 20 61 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69  em all..*/.stati
13e90 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  c void sqlite3Ex
13ea0 70 72 43 61 63 68 65 50 69 6e 52 65 67 69 73 74  prCachePinRegist
13eb0 65 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  er(Parse *pParse
13ec0 2c 20 69 6e 74 20 69 52 65 67 29 7b 0a 20 20 69  , int iReg){.  i
13ed0 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 79  nt i;.  struct y
13ee0 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20 66  ColCache *p;.  f
13ef0 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65  or(i=0, p=pParse
13f00 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53  ->aColCache; i<S
13f10 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45  QLITE_N_COLCACHE
13f20 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20  ; i++, p++){.   
13f30 20 69 66 28 20 70 2d 3e 69 52 65 67 3d 3d 69 52   if( p->iReg==iR
13f40 65 67 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 74  eg ){.      p->t
13f50 65 6d 70 52 65 67 20 3d 20 30 3b 0a 20 20 20 20  empReg = 0;.    
13f60 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  }.  }.}../*.** G
13f70 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
13f80 65 78 74 72 61 63 74 20 74 68 65 20 76 61 6c 75  extract the valu
13f90 65 20 6f 66 20 74 68 65 20 69 43 6f 6c 2d 74 68  e of the iCol-th
13fa0 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 20 74 61 62   column of a tab
13fb0 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  le..*/.void sqli
13fc0 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f  te3ExprCodeGetCo
13fd0 6c 75 6d 6e 4f 66 54 61 62 6c 65 28 0a 20 20 56  lumnOfTable(.  V
13fe0 64 62 65 20 2a 76 2c 20 20 20 20 20 20 20 20 2f  dbe *v,        /
13ff0 2a 20 54 68 65 20 56 44 42 45 20 75 6e 64 65 72  * The VDBE under
14000 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f   construction */
14010 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20  .  Table *pTab, 
14020 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20     /* The table 
14030 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 76  containing the v
14040 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54  alue */.  int iT
14050 61 62 43 75 72 2c 20 20 20 20 2f 2a 20 54 68 65  abCur,    /* The
14060 20 74 61 62 6c 65 20 63 75 72 73 6f 72 2e 20 20   table cursor.  
14070 4f 72 20 74 68 65 20 50 4b 20 63 75 72 73 6f 72  Or the PK cursor
14080 20 66 6f 72 20 57 49 54 48 4f 55 54 20 52 4f 57   for WITHOUT ROW
14090 49 44 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c  ID */.  int iCol
140a0 2c 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78  ,       /* Index
140b0 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74   of the column t
140c0 6f 20 65 78 74 72 61 63 74 20 2a 2f 0a 20 20 69  o extract */.  i
140d0 6e 74 20 72 65 67 4f 75 74 20 20 20 20 20 20 2f  nt regOut      /
140e0 2a 20 45 78 74 72 61 63 74 20 74 68 65 20 76 61  * Extract the va
140f0 6c 75 65 20 69 6e 74 6f 20 74 68 69 73 20 72 65  lue into this re
14100 67 69 73 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 69  gister */.){.  i
14110 66 28 20 69 43 6f 6c 3c 30 20 7c 7c 20 69 43 6f  f( iCol<0 || iCo
14120 6c 3d 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20 29  l==pTab->iPKey )
14130 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
14140 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f  eAddOp2(v, OP_Ro
14150 77 69 64 2c 20 69 54 61 62 43 75 72 2c 20 72 65  wid, iTabCur, re
14160 67 4f 75 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  gOut);.  }else{.
14170 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 49 73 56      int op = IsV
14180 69 72 74 75 61 6c 28 70 54 61 62 29 20 3f 20 4f  irtual(pTab) ? O
14190 50 5f 56 43 6f 6c 75 6d 6e 20 3a 20 4f 50 5f 43  P_VColumn : OP_C
141a0 6f 6c 75 6d 6e 3b 0a 20 20 20 20 69 6e 74 20 78  olumn;.    int x
141b0 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 69 66 28   = iCol;.    if(
141c0 20 21 48 61 73 52 6f 77 69 64 28 70 54 61 62 29   !HasRowid(pTab)
141d0 20 29 7b 0a 20 20 20 20 20 20 78 20 3d 20 73 71   ){.      x = sq
141e0 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64  lite3ColumnOfInd
141f0 65 78 28 73 71 6c 69 74 65 33 50 72 69 6d 61 72  ex(sqlite3Primar
14200 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29 2c  yKeyIndex(pTab),
14210 20 69 43 6f 6c 29 3b 0a 20 20 20 20 7d 0a 20 20   iCol);.    }.  
14220 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
14230 4f 70 33 28 76 2c 20 6f 70 2c 20 69 54 61 62 43  Op3(v, op, iTabC
14240 75 72 2c 20 78 2c 20 72 65 67 4f 75 74 29 3b 0a  ur, x, regOut);.
14250 20 20 7d 0a 20 20 69 66 28 20 69 43 6f 6c 3e 3d    }.  if( iCol>=
14260 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
14270 43 6f 6c 75 6d 6e 44 65 66 61 75 6c 74 28 76 2c  ColumnDefault(v,
14280 20 70 54 61 62 2c 20 69 43 6f 6c 2c 20 72 65 67   pTab, iCol, reg
14290 4f 75 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Out);.    sqlite
142a0 33 56 64 62 65 4f 70 74 69 6d 69 7a 65 43 6f 6c  3VdbeOptimizeCol
142b0 75 6d 6e 4f 70 63 6f 64 65 73 28 76 29 3b 0a 20  umnOpcodes(v);. 
142c0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65   }.}../*.** Gene
142d0 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77  rate code that w
142e0 69 6c 6c 20 65 78 74 72 61 63 74 20 74 68 65 20  ill extract the 
142f0 69 43 6f 6c 75 6d 6e 2d 74 68 20 63 6f 6c 75 6d  iColumn-th colum
14300 6e 20 66 72 6f 6d 0a 2a 2a 20 74 61 62 6c 65 20  n from.** table 
14310 70 54 61 62 20 61 6e 64 20 73 74 6f 72 65 20 74  pTab and store t
14320 68 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20  he column value 
14330 69 6e 20 61 20 72 65 67 69 73 74 65 72 2e 20 20  in a register.  
14340 41 6e 20 65 66 66 6f 72 74 0a 2a 2a 20 69 73 20  An effort.** is 
14350 6d 61 64 65 20 74 6f 20 73 74 6f 72 65 20 74 68  made to store th
14360 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69  e column value i
14370 6e 20 72 65 67 69 73 74 65 72 20 69 52 65 67 2c  n register iReg,
14380 20 62 75 74 20 74 68 69 73 20 69 73 0a 2a 2a 20   but this is.** 
14390 6e 6f 74 20 67 75 61 72 61 6e 74 65 65 64 2e 20  not guaranteed. 
143a0 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66   The location of
143b0 20 74 68 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75   the column valu
143c0 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  e is returned..*
143d0 2a 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73 74 20  *.** There must 
143e0 62 65 20 61 6e 20 6f 70 65 6e 20 63 75 72 73 6f  be an open curso
143f0 72 20 74 6f 20 70 54 61 62 20 69 6e 20 69 54 61  r to pTab in iTa
14400 62 6c 65 20 77 68 65 6e 20 74 68 69 73 20 72 6f  ble when this ro
14410 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c  utine.** is call
14420 65 64 2e 20 20 49 66 20 69 43 6f 6c 75 6d 6e 3c  ed.  If iColumn<
14430 30 20 74 68 65 6e 20 63 6f 64 65 20 69 73 20 67  0 then code is g
14440 65 6e 65 72 61 74 65 64 20 74 68 61 74 20 65 78  enerated that ex
14450 74 72 61 63 74 73 20 74 68 65 20 72 6f 77 69 64  tracts the rowid
14460 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
14470 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d  ExprCodeGetColum
14480 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  n(.  Parse *pPar
14490 73 65 2c 20 20 20 2f 2a 20 50 61 72 73 69 6e 67  se,   /* Parsing
144a0 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61   and code genera
144b0 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  ting context */.
144c0 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20    Table *pTab,  
144d0 20 20 20 2f 2a 20 44 65 73 63 72 69 70 74 69 6f     /* Descriptio
144e0 6e 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 77  n of the table w
144f0 65 20 61 72 65 20 72 65 61 64 69 6e 67 20 66 72  e are reading fr
14500 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c  om */.  int iCol
14510 75 6d 6e 2c 20 20 20 20 20 2f 2a 20 49 6e 64 65  umn,     /* Inde
14520 78 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 63  x of the table c
14530 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  olumn */.  int i
14540 54 61 62 6c 65 2c 20 20 20 20 20 20 2f 2a 20 54  Table,      /* T
14550 68 65 20 63 75 72 73 6f 72 20 70 6f 69 6e 74 69  he cursor pointi
14560 6e 67 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20  ng to the table 
14570 2a 2f 0a 20 20 69 6e 74 20 69 52 65 67 2c 20 20  */.  int iReg,  
14580 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 72        /* Store r
14590 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 20  esults here */. 
145a0 20 75 38 20 70 35 20 20 20 20 20 20 20 20 20 20   u8 p5          
145b0 20 20 2f 2a 20 50 35 20 76 61 6c 75 65 20 66 6f    /* P5 value fo
145c0 72 20 4f 50 5f 43 6f 6c 75 6d 6e 20 2a 2f 0a 29  r OP_Column */.)
145d0 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
145e0 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
145f0 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 79  nt i;.  struct y
14600 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 0a 20 20  ColCache *p;..  
14610 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73  for(i=0, p=pPars
14620 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c  e->aColCache; i<
14630 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48  SQLITE_N_COLCACH
14640 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20  E; i++, p++){.  
14650 20 20 69 66 28 20 70 2d 3e 69 52 65 67 3e 30 20    if( p->iReg>0 
14660 26 26 20 70 2d 3e 69 54 61 62 6c 65 3d 3d 69 54  && p->iTable==iT
14670 61 62 6c 65 20 26 26 20 70 2d 3e 69 43 6f 6c 75  able && p->iColu
14680 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20  mn==iColumn ){. 
14690 20 20 20 20 20 70 2d 3e 6c 72 75 20 3d 20 70 50       p->lru = pP
146a0 61 72 73 65 2d 3e 69 43 61 63 68 65 43 6e 74 2b  arse->iCacheCnt+
146b0 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  +;.      sqlite3
146c0 45 78 70 72 43 61 63 68 65 50 69 6e 52 65 67 69  ExprCachePinRegi
146d0 73 74 65 72 28 70 50 61 72 73 65 2c 20 70 2d 3e  ster(pParse, p->
146e0 69 52 65 67 29 3b 0a 20 20 20 20 20 20 72 65 74  iReg);.      ret
146f0 75 72 6e 20 70 2d 3e 69 52 65 67 3b 0a 20 20 20  urn p->iReg;.   
14700 20 7d 0a 20 20 7d 20 20 0a 20 20 61 73 73 65 72   }.  }  .  asser
14710 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 73 71 6c  t( v!=0 );.  sql
14720 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43  ite3ExprCodeGetC
14730 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65 28 76 2c 20  olumnOfTable(v, 
14740 70 54 61 62 2c 20 69 54 61 62 6c 65 2c 20 69 43  pTab, iTable, iC
14750 6f 6c 75 6d 6e 2c 20 69 52 65 67 29 3b 0a 20 20  olumn, iReg);.  
14760 69 66 28 20 70 35 20 29 7b 0a 20 20 20 20 73 71  if( p5 ){.    sq
14770 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
14780 35 28 76 2c 20 70 35 29 3b 0a 20 20 7d 65 6c 73  5(v, p5);.  }els
14790 65 7b 20 20 20 0a 20 20 20 20 73 71 6c 69 74 65  e{   .    sqlite
147a0 33 45 78 70 72 43 61 63 68 65 53 74 6f 72 65 28  3ExprCacheStore(
147b0 70 50 61 72 73 65 2c 20 69 54 61 62 6c 65 2c 20  pParse, iTable, 
147c0 69 43 6f 6c 75 6d 6e 2c 20 69 52 65 67 29 3b 0a  iColumn, iReg);.
147d0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 52 65    }.  return iRe
147e0 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61  g;.}../*.** Clea
147f0 72 20 61 6c 6c 20 63 6f 6c 75 6d 6e 20 63 61 63  r all column cac
14800 68 65 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 76  he entries..*/.v
14810 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43  oid sqlite3ExprC
14820 61 63 68 65 43 6c 65 61 72 28 50 61 72 73 65 20  acheClear(Parse 
14830 2a 70 50 61 72 73 65 29 7b 0a 20 20 69 6e 74 20  *pParse){.  int 
14840 69 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c  i;.  struct yCol
14850 43 61 63 68 65 20 2a 70 3b 0a 0a 23 69 66 20 53  Cache *p;..#if S
14860 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69 66  QLITE_DEBUG.  if
14870 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c  ( pParse->db->fl
14880 61 67 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62  ags & SQLITE_Vdb
14890 65 41 64 64 6f 70 54 72 61 63 65 20 29 7b 0a 20  eAddopTrace ){. 
148a0 20 20 20 70 72 69 6e 74 66 28 22 43 4c 45 41 52     printf("CLEAR
148b0 5c 6e 22 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  \n");.  }.#endif
148c0 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50  .  for(i=0, p=pP
148d0 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b  arse->aColCache;
148e0 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43   i<SQLITE_N_COLC
148f0 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b  ACHE; i++, p++){
14900 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 52 65 67  .    if( p->iReg
14910 20 29 7b 0a 20 20 20 20 20 20 63 61 63 68 65 45   ){.      cacheE
14920 6e 74 72 79 43 6c 65 61 72 28 70 50 61 72 73 65  ntryClear(pParse
14930 2c 20 70 29 3b 0a 20 20 20 20 20 20 70 2d 3e 69  , p);.      p->i
14940 52 65 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  Reg = 0;.    }. 
14950 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f   }.}../*.** Reco
14960 72 64 20 74 68 65 20 66 61 63 74 20 74 68 61 74  rd the fact that
14970 20 61 6e 20 61 66 66 69 6e 69 74 79 20 63 68 61   an affinity cha
14980 6e 67 65 20 68 61 73 20 6f 63 63 75 72 72 65 64  nge has occurred
14990 20 6f 6e 20 69 43 6f 75 6e 74 0a 2a 2a 20 72 65   on iCount.** re
149a0 67 69 73 74 65 72 73 20 73 74 61 72 74 69 6e 67  gisters starting
149b0 20 77 69 74 68 20 69 53 74 61 72 74 2e 0a 2a 2f   with iStart..*/
149c0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
149d0 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68  rCacheAffinityCh
149e0 61 6e 67 65 28 50 61 72 73 65 20 2a 70 50 61 72  ange(Parse *pPar
149f0 73 65 2c 20 69 6e 74 20 69 53 74 61 72 74 2c 20  se, int iStart, 
14a00 69 6e 74 20 69 43 6f 75 6e 74 29 7b 0a 20 20 73  int iCount){.  s
14a10 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 52  qlite3ExprCacheR
14a20 65 6d 6f 76 65 28 70 50 61 72 73 65 2c 20 69 53  emove(pParse, iS
14a30 74 61 72 74 2c 20 69 43 6f 75 6e 74 29 3b 0a 7d  tart, iCount);.}
14a40 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
14a50 20 63 6f 64 65 20 74 6f 20 6d 6f 76 65 20 63 6f   code to move co
14a60 6e 74 65 6e 74 20 66 72 6f 6d 20 72 65 67 69 73  ntent from regis
14a70 74 65 72 73 20 69 46 72 6f 6d 2e 2e 2e 69 46 72  ters iFrom...iFr
14a80 6f 6d 2b 6e 52 65 67 2d 31 0a 2a 2a 20 6f 76 65  om+nReg-1.** ove
14a90 72 20 74 6f 20 69 54 6f 2e 2e 69 54 6f 2b 6e 52  r to iTo..iTo+nR
14aa0 65 67 2d 31 2e 20 4b 65 65 70 20 74 68 65 20 63  eg-1. Keep the c
14ab0 6f 6c 75 6d 6e 20 63 61 63 68 65 20 75 70 2d 74  olumn cache up-t
14ac0 6f 2d 64 61 74 65 2e 0a 2a 2f 0a 76 6f 69 64 20  o-date..*/.void 
14ad0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d  sqlite3ExprCodeM
14ae0 6f 76 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ove(Parse *pPars
14af0 65 2c 20 69 6e 74 20 69 46 72 6f 6d 2c 20 69 6e  e, int iFrom, in
14b00 74 20 69 54 6f 2c 20 69 6e 74 20 6e 52 65 67 29  t iTo, int nReg)
14b10 7b 0a 20 20 61 73 73 65 72 74 28 20 69 46 72 6f  {.  assert( iFro
14b20 6d 3e 3d 69 54 6f 2b 6e 52 65 67 20 7c 7c 20 69  m>=iTo+nReg || i
14b30 46 72 6f 6d 2b 6e 52 65 67 3c 3d 69 54 6f 20 29  From+nReg<=iTo )
14b40 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
14b50 64 64 4f 70 33 28 70 50 61 72 73 65 2d 3e 70 56  ddOp3(pParse->pV
14b60 64 62 65 2c 20 4f 50 5f 4d 6f 76 65 2c 20 69 46  dbe, OP_Move, iF
14b70 72 6f 6d 2c 20 69 54 6f 2c 20 6e 52 65 67 29 3b  rom, iTo, nReg);
14b80 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  .  sqlite3ExprCa
14b90 63 68 65 52 65 6d 6f 76 65 28 70 50 61 72 73 65  cheRemove(pParse
14ba0 2c 20 69 46 72 6f 6d 2c 20 6e 52 65 67 29 3b 0a  , iFrom, nReg);.
14bb0 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  }..#if defined(S
14bc0 51 4c 49 54 45 5f 44 45 42 55 47 29 20 7c 7c 20  QLITE_DEBUG) || 
14bd0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 43  defined(SQLITE_C
14be0 4f 56 45 52 41 47 45 5f 54 45 53 54 29 0a 2f 2a  OVERAGE_TEST)./*
14bf0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
14c00 69 66 20 61 6e 79 20 72 65 67 69 73 74 65 72 20  if any register 
14c10 69 6e 20 74 68 65 20 72 61 6e 67 65 20 69 46 72  in the range iFr
14c20 6f 6d 2e 2e 69 54 6f 20 28 69 6e 63 6c 75 73 69  om..iTo (inclusi
14c30 76 65 29 0a 2a 2a 20 69 73 20 75 73 65 64 20 61  ve).** is used a
14c40 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 63 6f  s part of the co
14c50 6c 75 6d 6e 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a  lumn cache..**.*
14c60 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
14c70 73 20 75 73 65 64 20 77 69 74 68 69 6e 20 61 73  s used within as
14c80 73 65 72 74 28 29 20 61 6e 64 20 74 65 73 74 63  sert() and testc
14c90 61 73 65 28 29 20 6d 61 63 72 6f 73 20 6f 6e 6c  ase() macros onl
14ca0 79 0a 2a 2a 20 61 6e 64 20 64 6f 65 73 20 6e 6f  y.** and does no
14cb0 74 20 61 70 70 65 61 72 20 69 6e 20 61 20 6e 6f  t appear in a no
14cc0 72 6d 61 6c 20 62 75 69 6c 64 2e 0a 2a 2f 0a 73  rmal build..*/.s
14cd0 74 61 74 69 63 20 69 6e 74 20 75 73 65 64 41 73  tatic int usedAs
14ce0 43 6f 6c 75 6d 6e 43 61 63 68 65 28 50 61 72 73  ColumnCache(Pars
14cf0 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
14d00 46 72 6f 6d 2c 20 69 6e 74 20 69 54 6f 29 7b 0a  From, int iTo){.
14d10 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63    int i;.  struc
14d20 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a  t yColCache *p;.
14d30 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61    for(i=0, p=pPa
14d40 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20  rse->aColCache; 
14d50 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41  i<SQLITE_N_COLCA
14d60 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a  CHE; i++, p++){.
14d70 20 20 20 20 69 6e 74 20 72 20 3d 20 70 2d 3e 69      int r = p->i
14d80 52 65 67 3b 0a 20 20 20 20 69 66 28 20 72 3e 3d  Reg;.    if( r>=
14d90 69 46 72 6f 6d 20 26 26 20 72 3c 3d 69 54 6f 20  iFrom && r<=iTo 
14da0 29 20 72 65 74 75 72 6e 20 31 3b 20 20 20 20 2f  ) return 1;    /
14db0 2a 4e 4f 5f 54 45 53 54 2a 2f 0a 20 20 7d 0a 20  *NO_TEST*/.  }. 
14dc0 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e   return 0;.}.#en
14dd0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45  dif /* SQLITE_DE
14de0 42 55 47 20 7c 7c 20 53 51 4c 49 54 45 5f 43 4f  BUG || SQLITE_CO
14df0 56 45 52 41 47 45 5f 54 45 53 54 20 2a 2f 0a 0a  VERAGE_TEST */..
14e00 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 6e  /*.** Convert an
14e10 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65   expression node
14e20 20 74 6f 20 61 20 54 4b 5f 52 45 47 49 53 54 45   to a TK_REGISTE
14e30 52 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  R.*/.static void
14e40 20 65 78 70 72 54 6f 52 65 67 69 73 74 65 72 28   exprToRegister(
14e50 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 69 52 65  Expr *p, int iRe
14e60 67 29 7b 0a 20 20 70 2d 3e 6f 70 32 20 3d 20 70  g){.  p->op2 = p
14e70 2d 3e 6f 70 3b 0a 20 20 70 2d 3e 6f 70 20 3d 20  ->op;.  p->op = 
14e80 54 4b 5f 52 45 47 49 53 54 45 52 3b 0a 20 20 70  TK_REGISTER;.  p
14e90 2d 3e 69 54 61 62 6c 65 20 3d 20 69 52 65 67 3b  ->iTable = iReg;
14ea0 0a 20 20 45 78 70 72 43 6c 65 61 72 50 72 6f 70  .  ExprClearProp
14eb0 65 72 74 79 28 70 2c 20 45 50 5f 53 6b 69 70 29  erty(p, EP_Skip)
14ec0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
14ed0 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68  ate code into th
14ee0 65 20 63 75 72 72 65 6e 74 20 56 64 62 65 20 74  e current Vdbe t
14ef0 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65 20 67  o evaluate the g
14f00 69 76 65 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69  iven.** expressi
14f10 6f 6e 2e 20 20 41 74 74 65 6d 70 74 20 74 6f 20  on.  Attempt to 
14f20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  store the result
14f30 73 20 69 6e 20 72 65 67 69 73 74 65 72 20 22 74  s in register "t
14f40 61 72 67 65 74 22 2e 0a 2a 2a 20 52 65 74 75 72  arget"..** Retur
14f50 6e 20 74 68 65 20 72 65 67 69 73 74 65 72 20 77  n the register w
14f60 68 65 72 65 20 72 65 73 75 6c 74 73 20 61 72 65  here results are
14f70 20 73 74 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 57   stored..**.** W
14f80 69 74 68 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ith this routine
14f90 2c 20 74 68 65 72 65 20 69 73 20 6e 6f 20 67 75  , there is no gu
14fa0 61 72 61 6e 74 65 65 20 74 68 61 74 20 72 65 73  arantee that res
14fb0 75 6c 74 73 20 77 69 6c 6c 0a 2a 2a 20 62 65 20  ults will.** be 
14fc0 73 74 6f 72 65 64 20 69 6e 20 74 61 72 67 65 74  stored in target
14fd0 2e 20 20 54 68 65 20 72 65 73 75 6c 74 20 6d 69  .  The result mi
14fe0 67 68 74 20 62 65 20 73 74 6f 72 65 64 20 69 6e  ght be stored in
14ff0 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 72   some other.** r
15000 65 67 69 73 74 65 72 20 69 66 20 69 74 20 69 73  egister if it is
15010 20 63 6f 6e 76 65 6e 69 65 6e 74 20 74 6f 20 64   convenient to d
15020 6f 20 73 6f 2e 20 20 54 68 65 20 63 61 6c 6c 69  o so.  The calli
15030 6e 67 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d  ng function.** m
15040 75 73 74 20 63 68 65 63 6b 20 74 68 65 20 72 65  ust check the re
15050 74 75 72 6e 20 63 6f 64 65 20 61 6e 64 20 6d 6f  turn code and mo
15060 76 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 74  ve the results t
15070 6f 20 74 68 65 20 64 65 73 69 72 65 64 0a 2a 2a  o the desired.**
15080 20 72 65 67 69 73 74 65 72 2e 0a 2a 2f 0a 69 6e   register..*/.in
15090 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  t sqlite3ExprCod
150a0 65 54 61 72 67 65 74 28 50 61 72 73 65 20 2a 70  eTarget(Parse *p
150b0 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
150c0 70 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29 7b  pr, int target){
150d0 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
150e0 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 2f 2a 20  rse->pVdbe;  /* 
150f0 54 68 65 20 56 4d 20 75 6e 64 65 72 20 63 6f 6e  The VM under con
15100 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69  struction */.  i
15110 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20  nt op;          
15120 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
15130 6f 70 63 6f 64 65 20 62 65 69 6e 67 20 63 6f 64  opcode being cod
15140 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 52 65  ed */.  int inRe
15150 67 20 3d 20 74 61 72 67 65 74 3b 20 20 20 20 20  g = target;     
15160 20 20 2f 2a 20 52 65 73 75 6c 74 73 20 73 74 6f    /* Results sto
15170 72 65 64 20 69 6e 20 72 65 67 69 73 74 65 72 20  red in register 
15180 69 6e 52 65 67 20 2a 2f 0a 20 20 69 6e 74 20 72  inReg */.  int r
15190 65 67 46 72 65 65 31 20 3d 20 30 3b 20 20 20 20  egFree1 = 0;    
151a0 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a       /* If non-z
151b0 65 72 6f 20 66 72 65 65 20 74 68 69 73 20 74 65  ero free this te
151c0 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72  mporary register
151d0 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 46 72 65   */.  int regFre
151e0 65 32 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  e2 = 0;         
151f0 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20 66  /* If non-zero f
15200 72 65 65 20 74 68 69 73 20 74 65 6d 70 6f 72 61  ree this tempora
15210 72 79 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20  ry register */. 
15220 20 69 6e 74 20 72 31 2c 20 72 32 2c 20 72 33 2c   int r1, r2, r3,
15230 20 72 34 3b 20 20 20 20 20 20 20 2f 2a 20 56 61   r4;       /* Va
15240 72 69 6f 75 73 20 72 65 67 69 73 74 65 72 20 6e  rious register n
15250 75 6d 62 65 72 73 20 2a 2f 0a 20 20 73 71 6c 69  umbers */.  sqli
15260 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
15270 2d 3e 64 62 3b 20 2f 2a 20 54 68 65 20 64 61 74  ->db; /* The dat
15280 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
15290 20 2a 2f 0a 20 20 45 78 70 72 20 74 65 6d 70 58   */.  Expr tempX
152a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
152b0 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 65 78 70  /* Temporary exp
152c0 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 2a 2f 0a  ression node */.
152d0 0a 20 20 61 73 73 65 72 74 28 20 74 61 72 67 65  .  assert( targe
152e0 74 3e 30 20 26 26 20 74 61 72 67 65 74 3c 3d 70  t>0 && target<=p
152f0 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 29 3b 0a 20  Parse->nMem );. 
15300 20 69 66 28 20 76 3d 3d 30 20 29 7b 0a 20 20 20   if( v==0 ){.   
15310 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
15320 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
15330 64 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  d );.    return 
15340 30 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 45  0;.  }..  if( pE
15350 78 70 72 3d 3d 30 20 29 7b 0a 20 20 20 20 6f 70  xpr==0 ){.    op
15360 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 7d 65   = TK_NULL;.  }e
15370 6c 73 65 7b 0a 20 20 20 20 6f 70 20 3d 20 70 45  lse{.    op = pE
15380 78 70 72 2d 3e 6f 70 3b 0a 20 20 7d 0a 20 20 73  xpr->op;.  }.  s
15390 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20  witch( op ){.   
153a0 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c   case TK_AGG_COL
153b0 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 41 67 67  UMN: {.      Agg
153c0 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 20 3d  Info *pAggInfo =
153d0 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f   pExpr->pAggInfo
153e0 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 41  ;.      struct A
153f0 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c  ggInfo_col *pCol
15400 20 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e 61 43   = &pAggInfo->aC
15410 6f 6c 5b 70 45 78 70 72 2d 3e 69 41 67 67 5d 3b  ol[pExpr->iAgg];
15420 0a 20 20 20 20 20 20 69 66 28 20 21 70 41 67 67  .      if( !pAgg
15430 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65  Info->directMode
15440 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
15450 72 74 28 20 70 43 6f 6c 2d 3e 69 4d 65 6d 3e 30  rt( pCol->iMem>0
15460 20 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 52 65   );.        inRe
15470 67 20 3d 20 70 43 6f 6c 2d 3e 69 4d 65 6d 3b 0a  g = pCol->iMem;.
15480 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
15490 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
154a0 41 67 67 49 6e 66 6f 2d 3e 75 73 65 53 6f 72 74  AggInfo->useSort
154b0 69 6e 67 49 64 78 20 29 7b 0a 20 20 20 20 20 20  ingIdx ){.      
154c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
154d0 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  Op3(v, OP_Column
154e0 2c 20 70 41 67 67 49 6e 66 6f 2d 3e 73 6f 72 74  , pAggInfo->sort
154f0 69 6e 67 49 64 78 50 54 61 62 2c 0a 20 20 20 20  ingIdxPTab,.    
15500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15510 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e            pCol->
15520 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 2c 20 74  iSorterColumn, t
15530 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20  arget);.        
15540 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
15550 20 20 20 20 20 2f 2a 20 4f 74 68 65 72 77 69 73       /* Otherwis
15560 65 2c 20 66 61 6c 6c 20 74 68 72 75 20 69 6e 74  e, fall thru int
15570 6f 20 74 68 65 20 54 4b 5f 43 4f 4c 55 4d 4e 20  o the TK_COLUMN 
15580 63 61 73 65 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  case */.    }.  
15590 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e    case TK_COLUMN
155a0 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 54  : {.      int iT
155b0 61 62 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62  ab = pExpr->iTab
155c0 6c 65 3b 0a 20 20 20 20 20 20 69 66 28 20 69 54  le;.      if( iT
155d0 61 62 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ab<0 ){.        
155e0 69 66 28 20 70 50 61 72 73 65 2d 3e 63 6b 42 61  if( pParse->ckBa
155f0 73 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  se>0 ){.        
15600 20 20 2f 2a 20 47 65 6e 65 72 61 74 69 6e 67 20    /* Generating 
15610 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74  CHECK constraint
15620 73 20 6f 72 20 69 6e 73 65 72 74 69 6e 67 20 69  s or inserting i
15630 6e 74 6f 20 70 61 72 74 69 61 6c 20 69 6e 64 65  nto partial inde
15640 78 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69  x */.          i
15650 6e 52 65 67 20 3d 20 70 45 78 70 72 2d 3e 69 43  nReg = pExpr->iC
15660 6f 6c 75 6d 6e 20 2b 20 70 50 61 72 73 65 2d 3e  olumn + pParse->
15670 63 6b 42 61 73 65 3b 0a 20 20 20 20 20 20 20 20  ckBase;.        
15680 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
15690 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
156a0 20 20 2f 2a 20 44 65 6c 65 74 69 6e 67 20 66 72    /* Deleting fr
156b0 6f 6d 20 61 20 70 61 72 74 69 61 6c 20 69 6e 64  om a partial ind
156c0 65 78 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ex */.          
156d0 69 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 69  iTab = pParse->i
156e0 50 61 72 74 49 64 78 54 61 62 3b 0a 20 20 20 20  PartIdxTab;.    
156f0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
15700 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69      inReg = sqli
15710 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f  te3ExprCodeGetCo
15720 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20 70 45 78  lumn(pParse, pEx
15730 70 72 2d 3e 70 54 61 62 2c 0a 20 20 20 20 20 20  pr->pTab,.      
15740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15750 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
15760 69 43 6f 6c 75 6d 6e 2c 20 69 54 61 62 2c 20 74  iColumn, iTab, t
15770 61 72 67 65 74 2c 0a 20 20 20 20 20 20 20 20 20  arget,.         
15780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15790 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 32        pExpr->op2
157a0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
157b0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
157c0 4b 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20  K_INTEGER: {.   
157d0 20 20 20 63 6f 64 65 49 6e 74 65 67 65 72 28 70     codeInteger(p
157e0 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 30 2c  Parse, pExpr, 0,
157f0 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
15800 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66  break;.    }.#if
15810 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
15820 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a  _FLOATING_POINT.
15830 20 20 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41      case TK_FLOA
15840 54 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  T: {.      asser
15850 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
15860 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e  rty(pExpr, EP_In
15870 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20  tValue) );.     
15880 20 63 6f 64 65 52 65 61 6c 28 76 2c 20 70 45 78   codeReal(v, pEx
15890 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30 2c  pr->u.zToken, 0,
158a0 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
158b0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
158c0 64 69 66 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  dif.    case TK_
158d0 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20  STRING: {.      
158e0 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
158f0 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
15900 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a  EP_IntValue) );.
15910 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
15920 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53 74  eAddOp4(v, OP_St
15930 72 69 6e 67 38 2c 20 30 2c 20 74 61 72 67 65 74  ring8, 0, target
15940 2c 20 30 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54  , 0, pExpr->u.zT
15950 6f 6b 65 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20  oken, 0);.      
15960 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
15970 20 63 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a 20 7b   case TK_NULL: {
15980 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
15990 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
159a0 75 6c 6c 2c 20 30 2c 20 74 61 72 67 65 74 29 3b  ull, 0, target);
159b0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
159c0 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
159d0 54 45 5f 4f 4d 49 54 5f 42 4c 4f 42 5f 4c 49 54  TE_OMIT_BLOB_LIT
159e0 45 52 41 4c 0a 20 20 20 20 63 61 73 65 20 54 4b  ERAL.    case TK
159f0 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20 69  _BLOB: {.      i
15a00 6e 74 20 6e 3b 0a 20 20 20 20 20 20 63 6f 6e 73  nt n;.      cons
15a10 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 20  t char *z;.     
15a20 20 63 68 61 72 20 2a 7a 42 6c 6f 62 3b 0a 20 20   char *zBlob;.  
15a30 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
15a40 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
15a50 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  pr, EP_IntValue)
15a60 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
15a70 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  ( pExpr->u.zToke
15a80 6e 5b 30 5d 3d 3d 27 78 27 20 7c 7c 20 70 45 78  n[0]=='x' || pEx
15a90 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d  pr->u.zToken[0]=
15aa0 3d 27 58 27 20 29 3b 0a 20 20 20 20 20 20 61 73  ='X' );.      as
15ab0 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a  sert( pExpr->u.z
15ac0 54 6f 6b 65 6e 5b 31 5d 3d 3d 27 5c 27 27 20 29  Token[1]=='\'' )
15ad0 3b 0a 20 20 20 20 20 20 7a 20 3d 20 26 70 45 78  ;.      z = &pEx
15ae0 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 32 5d 3b  pr->u.zToken[2];
15af0 0a 20 20 20 20 20 20 6e 20 3d 20 73 71 6c 69 74  .      n = sqlit
15b00 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 20 2d 20  e3Strlen30(z) - 
15b10 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  1;.      assert(
15b20 20 7a 5b 6e 5d 3d 3d 27 5c 27 27 20 29 3b 0a 20   z[n]=='\'' );. 
15b30 20 20 20 20 20 7a 42 6c 6f 62 20 3d 20 73 71 6c       zBlob = sql
15b40 69 74 65 33 48 65 78 54 6f 42 6c 6f 62 28 73 71  ite3HexToBlob(sq
15b50 6c 69 74 65 33 56 64 62 65 44 62 28 76 29 2c 20  lite3VdbeDb(v), 
15b60 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c  z, n);.      sql
15b70 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
15b80 2c 20 4f 50 5f 42 6c 6f 62 2c 20 6e 2f 32 2c 20  , OP_Blob, n/2, 
15b90 74 61 72 67 65 74 2c 20 30 2c 20 7a 42 6c 6f 62  target, 0, zBlob
15ba0 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  , P4_DYNAMIC);. 
15bb0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
15bc0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73  }.#endif.    cas
15bd0 65 20 54 4b 5f 56 41 52 49 41 42 4c 45 3a 20 7b  e TK_VARIABLE: {
15be0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
15bf0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
15c00 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c  pExpr, EP_IntVal
15c10 75 65 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ue) );.      ass
15c20 65 72 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54  ert( pExpr->u.zT
15c30 6f 6b 65 6e 21 3d 30 20 29 3b 0a 20 20 20 20 20  oken!=0 );.     
15c40 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
15c50 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 21 3d 30 20 29  u.zToken[0]!=0 )
15c60 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
15c70 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
15c80 56 61 72 69 61 62 6c 65 2c 20 70 45 78 70 72 2d  Variable, pExpr-
15c90 3e 69 43 6f 6c 75 6d 6e 2c 20 74 61 72 67 65 74  >iColumn, target
15ca0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78  );.      if( pEx
15cb0 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 31 5d 21  pr->u.zToken[1]!
15cc0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  =0 ){.        as
15cd0 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a  sert( pExpr->u.z
15ce0 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 3f 27 20 0a 20  Token[0]=='?' . 
15cf0 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73              || s
15d00 74 72 63 6d 70 28 70 45 78 70 72 2d 3e 75 2e 7a  trcmp(pExpr->u.z
15d10 54 6f 6b 65 6e 2c 20 70 50 61 72 73 65 2d 3e 61  Token, pParse->a
15d20 7a 56 61 72 5b 70 45 78 70 72 2d 3e 69 43 6f 6c  zVar[pExpr->iCol
15d30 75 6d 6e 2d 31 5d 29 3d 3d 30 20 29 3b 0a 20 20  umn-1])==0 );.  
15d40 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
15d50 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c  eChangeP4(v, -1,
15d60 20 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 5b 70   pParse->azVar[p
15d70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2d 31 5d  Expr->iColumn-1]
15d80 2c 20 50 34 5f 53 54 41 54 49 43 29 3b 0a 20 20  , P4_STATIC);.  
15d90 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
15da0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
15db0 65 20 54 4b 5f 52 45 47 49 53 54 45 52 3a 20 7b  e TK_REGISTER: {
15dc0 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 70  .      inReg = p
15dd0 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20  Expr->iTable;.  
15de0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
15df0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 53 3a  .    case TK_AS:
15e00 20 7b 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d   {.      inReg =
15e10 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
15e20 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70  Target(pParse, p
15e30 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 74 61 72  Expr->pLeft, tar
15e40 67 65 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61  get);.      brea
15e50 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  k;.    }.#ifndef
15e60 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53   SQLITE_OMIT_CAS
15e70 54 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 41  T.    case TK_CA
15e80 53 54 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45  ST: {.      /* E
15e90 78 70 72 65 73 73 69 6f 6e 73 20 6f 66 20 74 68  xpressions of th
15ea0 65 20 66 6f 72 6d 3a 20 20 20 43 41 53 54 28 70  e form:   CAST(p
15eb0 4c 65 66 74 20 41 53 20 74 6f 6b 65 6e 29 20 2a  Left AS token) *
15ec0 2f 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20  /.      inReg = 
15ed0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
15ee0 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 45  arget(pParse, pE
15ef0 78 70 72 2d 3e 70 4c 65 66 74 2c 20 74 61 72 67  xpr->pLeft, targ
15f00 65 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69  et);.      if( i
15f10 6e 52 65 67 21 3d 74 61 72 67 65 74 20 29 7b 0a  nReg!=target ){.
15f20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
15f30 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
15f40 53 43 6f 70 79 2c 20 69 6e 52 65 67 2c 20 74 61  SCopy, inReg, ta
15f50 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 69  rget);.        i
15f60 6e 52 65 67 20 3d 20 74 61 72 67 65 74 3b 0a 20  nReg = target;. 
15f70 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
15f80 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
15f90 2c 20 4f 50 5f 43 61 73 74 2c 20 74 61 72 67 65  , OP_Cast, targe
15fa0 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
15fb0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
15fc0 65 33 41 66 66 69 6e 69 74 79 54 79 70 65 28 70  e3AffinityType(p
15fd0 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20  Expr->u.zToken, 
15fe0 30 29 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  0));.      testc
15ff0 61 73 65 28 20 75 73 65 64 41 73 43 6f 6c 75 6d  ase( usedAsColum
16000 6e 43 61 63 68 65 28 70 50 61 72 73 65 2c 20 69  nCache(pParse, i
16010 6e 52 65 67 2c 20 69 6e 52 65 67 29 20 29 3b 0a  nReg, inReg) );.
16020 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
16030 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68  rCacheAffinityCh
16040 61 6e 67 65 28 70 50 61 72 73 65 2c 20 69 6e 52  ange(pParse, inR
16050 65 67 2c 20 31 29 3b 0a 20 20 20 20 20 20 62 72  eg, 1);.      br
16060 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
16070 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
16080 5f 43 41 53 54 20 2a 2f 0a 20 20 20 20 63 61 73  _CAST */.    cas
16090 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73  e TK_LT:.    cas
160a0 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73  e TK_LE:.    cas
160b0 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73  e TK_GT:.    cas
160c0 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73  e TK_GE:.    cas
160d0 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73  e TK_NE:.    cas
160e0 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20  e TK_EQ: {.     
160f0 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r1 = sqlite3Exp
16100 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
16110 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
16120 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20  &regFree1);.    
16130 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78    r2 = sqlite3Ex
16140 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
16150 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  e, pExpr->pRight
16160 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20  , &regFree2);.  
16170 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28      codeCompare(
16180 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
16190 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69  Left, pExpr->pRi
161a0 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20  ght, op,.       
161b0 20 20 20 20 20 20 20 20 20 20 20 72 31 2c 20 72             r1, r
161c0 32 2c 20 69 6e 52 65 67 2c 20 53 51 4c 49 54 45  2, inReg, SQLITE
161d0 5f 53 54 4f 52 45 50 32 29 3b 0a 20 20 20 20 20  _STOREP2);.     
161e0 20 61 73 73 65 72 74 28 54 4b 5f 4c 54 3d 3d 4f   assert(TK_LT==O
161f0 50 5f 4c 74 29 3b 20 74 65 73 74 63 61 73 65 28  P_Lt); testcase(
16200 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 20 56 64 62 65  op==OP_Lt); Vdbe
16210 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d  CoverageIf(v,op=
16220 3d 4f 50 5f 4c 74 29 3b 0a 20 20 20 20 20 20 61  =OP_Lt);.      a
16230 73 73 65 72 74 28 54 4b 5f 4c 45 3d 3d 4f 50 5f  ssert(TK_LE==OP_
16240 4c 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70  Le); testcase(op
16250 3d 3d 4f 50 5f 4c 65 29 3b 20 56 64 62 65 43 6f  ==OP_Le); VdbeCo
16260 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f  verageIf(v,op==O
16270 50 5f 4c 65 29 3b 0a 20 20 20 20 20 20 61 73 73  P_Le);.      ass
16280 65 72 74 28 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74  ert(TK_GT==OP_Gt
16290 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d  ); testcase(op==
162a0 4f 50 5f 47 74 29 3b 20 56 64 62 65 43 6f 76 65  OP_Gt); VdbeCove
162b0 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f  rageIf(v,op==OP_
162c0 47 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Gt);.      asser
162d0 74 28 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65 29 3b  t(TK_GE==OP_Ge);
162e0 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50   testcase(op==OP
162f0 5f 47 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61  _Ge); VdbeCovera
16300 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 65  geIf(v,op==OP_Ge
16310 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
16320 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71 29 3b 20 74  TK_EQ==OP_Eq); t
16330 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 45  estcase(op==OP_E
16340 71 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  q); VdbeCoverage
16350 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 45 71 29 3b  If(v,op==OP_Eq);
16360 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b  .      assert(TK
16370 5f 4e 45 3d 3d 4f 50 5f 4e 65 29 3b 20 74 65 73  _NE==OP_Ne); tes
16380 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4e 65 29  tcase(op==OP_Ne)
16390 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66  ; VdbeCoverageIf
163a0 28 76 2c 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 0a 20  (v,op==OP_Ne);. 
163b0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
163c0 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
163d0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
163e0 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20  gFree2==0 );.   
163f0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
16400 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 3a 0a      case TK_IS:.
16410 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f      case TK_ISNO
16420 54 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63  T: {.      testc
16430 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 20 29  ase( op==TK_IS )
16440 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
16450 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29  ( op==TK_ISNOT )
16460 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  ;.      r1 = sql
16470 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
16480 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
16490 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31  pLeft, &regFree1
164a0 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71  );.      r2 = sq
164b0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
164c0 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
164d0 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46 72 65  >pRight, &regFre
164e0 65 32 29 3b 0a 20 20 20 20 20 20 6f 70 20 3d 20  e2);.      op = 
164f0 28 6f 70 3d 3d 54 4b 5f 49 53 29 20 3f 20 54 4b  (op==TK_IS) ? TK
16500 5f 45 51 20 3a 20 54 4b 5f 4e 45 3b 0a 20 20 20  _EQ : TK_NE;.   
16510 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70     codeCompare(p
16520 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
16530 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  eft, pExpr->pRig
16540 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20 20  ht, op,.        
16550 20 20 20 20 20 20 20 20 20 20 72 31 2c 20 72 32            r1, r2
16560 2c 20 69 6e 52 65 67 2c 20 53 51 4c 49 54 45 5f  , inReg, SQLITE_
16570 53 54 4f 52 45 50 32 20 7c 20 53 51 4c 49 54 45  STOREP2 | SQLITE
16580 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20  _NULLEQ);.      
16590 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
165a0 2c 20 6f 70 3d 3d 54 4b 5f 45 51 29 3b 0a 20 20  , op==TK_EQ);.  
165b0 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
165c0 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4e 45 29  If(v, op==TK_NE)
165d0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
165e0 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  ( regFree1==0 );
165f0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
16600 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a   regFree2==0 );.
16610 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
16620 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41   }.    case TK_A
16630 4e 44 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ND:.    case TK_
16640 4f 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  OR:.    case TK_
16650 50 4c 55 53 3a 0a 20 20 20 20 63 61 73 65 20 54  PLUS:.    case T
16660 4b 5f 53 54 41 52 3a 0a 20 20 20 20 63 61 73 65  K_STAR:.    case
16670 20 54 4b 5f 4d 49 4e 55 53 3a 0a 20 20 20 20 63   TK_MINUS:.    c
16680 61 73 65 20 54 4b 5f 52 45 4d 3a 0a 20 20 20 20  ase TK_REM:.    
16690 63 61 73 65 20 54 4b 5f 42 49 54 41 4e 44 3a 0a  case TK_BITAND:.
166a0 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4f      case TK_BITO
166b0 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53  R:.    case TK_S
166c0 4c 41 53 48 3a 0a 20 20 20 20 63 61 73 65 20 54  LASH:.    case T
166d0 4b 5f 4c 53 48 49 46 54 3a 0a 20 20 20 20 63 61  K_LSHIFT:.    ca
166e0 73 65 20 54 4b 5f 52 53 48 49 46 54 3a 20 0a 20  se TK_RSHIFT: . 
166f0 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4e 43 41     case TK_CONCA
16700 54 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  T: {.      asser
16710 74 28 20 54 4b 5f 41 4e 44 3d 3d 4f 50 5f 41 6e  t( TK_AND==OP_An
16720 64 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  d );            
16730 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
16740 5f 41 4e 44 20 29 3b 0a 20 20 20 20 20 20 61 73  _AND );.      as
16750 73 65 72 74 28 20 54 4b 5f 4f 52 3d 3d 4f 50 5f  sert( TK_OR==OP_
16760 4f 72 20 29 3b 20 20 20 20 20 20 20 20 20 20 20  Or );           
16770 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
16780 3d 54 4b 5f 4f 52 20 29 3b 0a 20 20 20 20 20 20  =TK_OR );.      
16790 61 73 73 65 72 74 28 20 54 4b 5f 50 4c 55 53 3d  assert( TK_PLUS=
167a0 3d 4f 50 5f 41 64 64 20 29 3b 20 20 20 20 20 20  =OP_Add );      
167b0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
167c0 70 3d 3d 54 4b 5f 50 4c 55 53 20 29 3b 0a 20 20  p==TK_PLUS );.  
167d0 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4d      assert( TK_M
167e0 49 4e 55 53 3d 3d 4f 50 5f 53 75 62 74 72 61 63  INUS==OP_Subtrac
167f0 74 20 29 3b 20 20 20 20 20 74 65 73 74 63 61 73  t );     testcas
16800 65 28 20 6f 70 3d 3d 54 4b 5f 4d 49 4e 55 53 20  e( op==TK_MINUS 
16810 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
16820 20 54 4b 5f 52 45 4d 3d 3d 4f 50 5f 52 65 6d 61   TK_REM==OP_Rema
16830 69 6e 64 65 72 20 29 3b 20 20 20 20 20 20 74 65  inder );      te
16840 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 52  stcase( op==TK_R
16850 45 4d 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  EM );.      asse
16860 72 74 28 20 54 4b 5f 42 49 54 41 4e 44 3d 3d 4f  rt( TK_BITAND==O
16870 50 5f 42 69 74 41 6e 64 20 29 3b 20 20 20 20 20  P_BitAnd );     
16880 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
16890 4b 5f 42 49 54 41 4e 44 20 29 3b 0a 20 20 20 20  K_BITAND );.    
168a0 20 20 61 73 73 65 72 74 28 20 54 4b 5f 42 49 54    assert( TK_BIT
168b0 4f 52 3d 3d 4f 50 5f 42 69 74 4f 72 20 29 3b 20  OR==OP_BitOr ); 
168c0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
168d0 20 6f 70 3d 3d 54 4b 5f 42 49 54 4f 52 20 29 3b   op==TK_BITOR );
168e0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
168f0 4b 5f 53 4c 41 53 48 3d 3d 4f 50 5f 44 69 76 69  K_SLASH==OP_Divi
16900 64 65 20 29 3b 20 20 20 20 20 20 20 74 65 73 74  de );       test
16910 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 53 4c 41  case( op==TK_SLA
16920 53 48 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  SH );.      asse
16930 72 74 28 20 54 4b 5f 4c 53 48 49 46 54 3d 3d 4f  rt( TK_LSHIFT==O
16940 50 5f 53 68 69 66 74 4c 65 66 74 20 29 3b 20 20  P_ShiftLeft );  
16950 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
16960 4b 5f 4c 53 48 49 46 54 20 29 3b 0a 20 20 20 20  K_LSHIFT );.    
16970 20 20 61 73 73 65 72 74 28 20 54 4b 5f 52 53 48    assert( TK_RSH
16980 49 46 54 3d 3d 4f 50 5f 53 68 69 66 74 52 69 67  IFT==OP_ShiftRig
16990 68 74 20 29 3b 20 20 74 65 73 74 63 61 73 65 28  ht );  testcase(
169a0 20 6f 70 3d 3d 54 4b 5f 52 53 48 49 46 54 20 29   op==TK_RSHIFT )
169b0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
169c0 54 4b 5f 43 4f 4e 43 41 54 3d 3d 4f 50 5f 43 6f  TK_CONCAT==OP_Co
169d0 6e 63 61 74 20 29 3b 20 20 20 20 20 20 74 65 73  ncat );      tes
169e0 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 43 4f  tcase( op==TK_CO
169f0 4e 43 41 54 20 29 3b 0a 20 20 20 20 20 20 72 31  NCAT );.      r1
16a00 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
16a10 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
16a20 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65  Expr->pLeft, &re
16a30 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 72  gFree1);.      r
16a40 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  2 = sqlite3ExprC
16a50 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
16a60 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26  pExpr->pRight, &
16a70 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20  regFree2);.     
16a80 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
16a90 70 33 28 76 2c 20 6f 70 2c 20 72 32 2c 20 72 31  p3(v, op, r2, r1
16aa0 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
16ab0 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
16ac0 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee1==0 );.      
16ad0 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
16ae0 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62  e2==0 );.      b
16af0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
16b00 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20  case TK_UMINUS: 
16b10 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c  {.      Expr *pL
16b20 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65  eft = pExpr->pLe
16b30 66 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ft;.      assert
16b40 28 20 70 4c 65 66 74 20 29 3b 0a 20 20 20 20 20  ( pLeft );.     
16b50 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d   if( pLeft->op==
16b60 54 4b 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20 20  TK_INTEGER ){.  
16b70 20 20 20 20 20 20 63 6f 64 65 49 6e 74 65 67 65        codeIntege
16b80 72 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c  r(pParse, pLeft,
16b90 20 31 2c 20 74 61 72 67 65 74 29 3b 0a 23 69 66   1, target);.#if
16ba0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
16bb0 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a  _FLOATING_POINT.
16bc0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
16bd0 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c  pLeft->op==TK_FL
16be0 4f 41 54 20 29 7b 0a 20 20 20 20 20 20 20 20 61  OAT ){.        a
16bf0 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
16c00 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
16c10 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20  P_IntValue) );. 
16c20 20 20 20 20 20 20 20 63 6f 64 65 52 65 61 6c 28         codeReal(
16c30 76 2c 20 70 4c 65 66 74 2d 3e 75 2e 7a 54 6f 6b  v, pLeft->u.zTok
16c40 65 6e 2c 20 31 2c 20 74 61 72 67 65 74 29 3b 0a  en, 1, target);.
16c50 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 65 6c  #endif.      }el
16c60 73 65 7b 0a 20 20 20 20 20 20 20 20 74 65 6d 70  se{.        temp
16c70 58 2e 6f 70 20 3d 20 54 4b 5f 49 4e 54 45 47 45  X.op = TK_INTEGE
16c80 52 3b 0a 20 20 20 20 20 20 20 20 74 65 6d 70 58  R;.        tempX
16c90 2e 66 6c 61 67 73 20 3d 20 45 50 5f 49 6e 74 56  .flags = EP_IntV
16ca0 61 6c 75 65 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  alue|EP_TokenOnl
16cb0 79 3b 0a 20 20 20 20 20 20 20 20 74 65 6d 70 58  y;.        tempX
16cc0 2e 75 2e 69 56 61 6c 75 65 20 3d 20 30 3b 0a 20  .u.iValue = 0;. 
16cd0 20 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69         r1 = sqli
16ce0 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
16cf0 70 50 61 72 73 65 2c 20 26 74 65 6d 70 58 2c 20  pParse, &tempX, 
16d00 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20  &regFree1);.    
16d10 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33      r2 = sqlite3
16d20 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
16d30 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
16d40 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20  t, &regFree2);. 
16d50 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
16d60 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53  beAddOp3(v, OP_S
16d70 75 62 74 72 61 63 74 2c 20 72 32 2c 20 72 31 2c  ubtract, r2, r1,
16d80 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
16d90 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
16da0 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree2==0 );.     
16db0 20 7d 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d   }.      inReg =
16dc0 20 74 61 72 67 65 74 3b 0a 20 20 20 20 20 20 62   target;.      b
16dd0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
16de0 63 61 73 65 20 54 4b 5f 42 49 54 4e 4f 54 3a 0a  case TK_BITNOT:.
16df0 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a      case TK_NOT:
16e00 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
16e10 20 54 4b 5f 42 49 54 4e 4f 54 3d 3d 4f 50 5f 42   TK_BITNOT==OP_B
16e20 69 74 4e 6f 74 20 29 3b 20 20 20 74 65 73 74 63  itNot );   testc
16e30 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 42 49 54 4e  ase( op==TK_BITN
16e40 4f 54 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  OT );.      asse
16e50 72 74 28 20 54 4b 5f 4e 4f 54 3d 3d 4f 50 5f 4e  rt( TK_NOT==OP_N
16e60 6f 74 20 29 3b 20 20 20 20 20 20 20 20 20 74 65  ot );         te
16e70 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e  stcase( op==TK_N
16e80 4f 54 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d  OT );.      r1 =
16e90 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
16ea0 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
16eb0 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46  pr->pLeft, &regF
16ec0 72 65 65 31 29 3b 0a 20 20 20 20 20 20 74 65 73  ree1);.      tes
16ed0 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
16ee0 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 6e 52 65  =0 );.      inRe
16ef0 67 20 3d 20 74 61 72 67 65 74 3b 0a 20 20 20 20  g = target;.    
16f00 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
16f10 4f 70 32 28 76 2c 20 6f 70 2c 20 72 31 2c 20 69  Op2(v, op, r1, i
16f20 6e 52 65 67 29 3b 0a 20 20 20 20 20 20 62 72 65  nReg);.      bre
16f30 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
16f40 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20  se TK_ISNULL:.  
16f50 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c    case TK_NOTNUL
16f60 4c 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 61  L: {.      int a
16f70 64 64 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ddr;.      asser
16f80 74 28 20 54 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f 50  t( TK_ISNULL==OP
16f90 5f 49 73 4e 75 6c 6c 20 29 3b 20 20 20 74 65 73  _IsNull );   tes
16fa0 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53  tcase( op==TK_IS
16fb0 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 61 73  NULL );.      as
16fc0 73 65 72 74 28 20 54 4b 5f 4e 4f 54 4e 55 4c 4c  sert( TK_NOTNULL
16fd0 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 20  ==OP_NotNull ); 
16fe0 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
16ff0 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 0a 20 20 20 20  _NOTNULL );.    
17000 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
17010 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
17020 72 2c 20 31 2c 20 74 61 72 67 65 74 29 3b 0a 20  r, 1, target);. 
17030 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
17040 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
17050 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
17060 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  ft, &regFree1);.
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 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
17090 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69       addr = sqli
170a0 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
170b0 20 6f 70 2c 20 72 31 29 3b 0a 20 20 20 20 20 20   op, r1);.      
170c0 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
170d0 2c 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 29  , op==TK_ISNULL)
170e0 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
170f0 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b  rageIf(v, op==TK
17100 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  _NOTNULL);.     
17110 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
17120 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
17130 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  , 0, target);.  
17140 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
17150 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 29  umpHere(v, addr)
17160 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
17170 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
17180 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b  _AGG_FUNCTION: {
17190 0a 20 20 20 20 20 20 41 67 67 49 6e 66 6f 20 2a  .      AggInfo *
171a0 70 49 6e 66 6f 20 3d 20 70 45 78 70 72 2d 3e 70  pInfo = pExpr->p
171b0 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 69  AggInfo;.      i
171c0 66 28 20 70 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20  f( pInfo==0 ){. 
171d0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
171e0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
171f0 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c  pExpr, EP_IntVal
17200 75 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 73  ue) );.        s
17210 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
17220 50 61 72 73 65 2c 20 22 6d 69 73 75 73 65 20 6f  Parse, "misuse o
17230 66 20 61 67 67 72 65 67 61 74 65 3a 20 25 73 28  f aggregate: %s(
17240 29 22 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  )", pExpr->u.zTo
17250 6b 65 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ken);.      }els
17260 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 52 65 67  e{.        inReg
17270 20 3d 20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b   = pInfo->aFunc[
17280 70 45 78 70 72 2d 3e 69 41 67 67 5d 2e 69 4d 65  pExpr->iAgg].iMe
17290 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  m;.      }.     
172a0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
172b0 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54 49    case TK_FUNCTI
172c0 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72  ON: {.      Expr
172d0 4c 69 73 74 20 2a 70 46 61 72 67 3b 20 20 20 20  List *pFarg;    
172e0 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 75     /* List of fu
172f0 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73  nction arguments
17300 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 46   */.      int nF
17310 61 72 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  arg;            
17320 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 75   /* Number of fu
17330 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73  nction arguments
17340 20 2a 2f 0a 20 20 20 20 20 20 46 75 6e 63 44 65   */.      FuncDe
17350 66 20 2a 70 44 65 66 3b 20 20 20 20 20 20 20 20  f *pDef;        
17360 20 2f 2a 20 54 68 65 20 66 75 6e 63 74 69 6f 6e   /* The function
17370 20 64 65 66 69 6e 69 74 69 6f 6e 20 6f 62 6a 65   definition obje
17380 63 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ct */.      int 
17390 6e 49 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  nId;            
173a0 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20     /* Length of 
173b0 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d  the function nam
173c0 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  e in bytes */.  
173d0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
173e0 7a 49 64 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  zId;       /* Th
173f0 65 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20  e function name 
17400 2a 2f 0a 20 20 20 20 20 20 75 33 32 20 63 6f 6e  */.      u32 con
17410 73 74 4d 61 73 6b 20 3d 20 30 3b 20 20 20 20 20  stMask = 0;     
17420 2f 2a 20 4d 61 73 6b 20 6f 66 20 66 75 6e 63 74  /* Mask of funct
17430 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 74 68  ion arguments th
17440 61 74 20 61 72 65 20 63 6f 6e 73 74 61 6e 74 20  at are constant 
17450 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 20  */.      int i; 
17460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17470 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
17480 2a 2f 0a 20 20 20 20 20 20 75 38 20 65 6e 63 20  */.      u8 enc 
17490 3d 20 45 4e 43 28 64 62 29 3b 20 20 20 20 20 20  = ENC(db);      
174a0 2f 2a 20 54 68 65 20 74 65 78 74 20 65 6e 63 6f  /* The text enco
174b0 64 69 6e 67 20 75 73 65 64 20 62 79 20 74 68 69  ding used by thi
174c0 73 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  s database */.  
174d0 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
174e0 6c 6c 20 3d 20 30 3b 20 20 20 20 2f 2a 20 41 20  ll = 0;    /* A 
174f0 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
17500 63 65 20 2a 2f 0a 0a 20 20 20 20 20 20 61 73 73  ce */..      ass
17510 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
17520 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
17530 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20  xIsSelect) );.  
17540 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50      if( ExprHasP
17550 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
17560 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a  P_TokenOnly) ){.
17570 20 20 20 20 20 20 20 20 70 46 61 72 67 20 3d 20          pFarg = 
17580 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  0;.      }else{.
17590 20 20 20 20 20 20 20 20 70 46 61 72 67 20 3d 20          pFarg = 
175a0 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a  pExpr->x.pList;.
175b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 46        }.      nF
175c0 61 72 67 20 3d 20 70 46 61 72 67 20 3f 20 70 46  arg = pFarg ? pF
175d0 61 72 67 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 0a  arg->nExpr : 0;.
175e0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
175f0 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
17600 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75  Expr, EP_IntValu
17610 65 29 20 29 3b 0a 20 20 20 20 20 20 7a 49 64 20  e) );.      zId 
17620 3d 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  = pExpr->u.zToke
17630 6e 3b 0a 20 20 20 20 20 20 6e 49 64 20 3d 20 73  n;.      nId = s
17640 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
17650 49 64 29 3b 0a 20 20 20 20 20 20 70 44 65 66 20  Id);.      pDef 
17660 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e  = sqlite3FindFun
17670 63 74 69 6f 6e 28 64 62 2c 20 7a 49 64 2c 20 6e  ction(db, zId, n
17680 49 64 2c 20 6e 46 61 72 67 2c 20 65 6e 63 2c 20  Id, nFarg, enc, 
17690 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44  0);.      if( pD
176a0 65 66 3d 3d 30 20 7c 7c 20 70 44 65 66 2d 3e 78  ef==0 || pDef->x
176b0 46 75 6e 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Func==0 ){.     
176c0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
176d0 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e 6b 6e  sg(pParse, "unkn
176e0 6f 77 6e 20 66 75 6e 63 74 69 6f 6e 3a 20 25 2e  own function: %.
176f0 2a 73 28 29 22 2c 20 6e 49 64 2c 20 7a 49 64 29  *s()", nId, zId)
17700 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
17710 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
17720 2f 2a 20 41 74 74 65 6d 70 74 20 61 20 64 69 72  /* Attempt a dir
17730 65 63 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ect implementati
17740 6f 6e 20 6f 66 20 74 68 65 20 62 75 69 6c 74 2d  on of the built-
17750 69 6e 20 43 4f 41 4c 45 53 43 45 28 29 20 61 6e  in COALESCE() an
17760 64 0a 20 20 20 20 20 20 2a 2a 20 49 46 4e 55 4c  d.      ** IFNUL
17770 4c 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20  L() functions.  
17780 54 68 69 73 20 61 76 6f 69 64 73 20 75 6e 6e 65  This avoids unne
17790 63 65 73 73 61 72 79 20 65 76 61 6c 75 61 74 69  cessary evaluati
177a0 6f 6e 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 61  on of.      ** a
177b0 72 67 75 6d 65 6e 74 73 20 70 61 73 74 20 74 68  rguments past th
177c0 65 20 66 69 72 73 74 20 6e 6f 6e 2d 4e 55 4c 4c  e first non-NULL
177d0 20 61 72 67 75 6d 65 6e 74 2e 0a 20 20 20 20 20   argument..     
177e0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 44   */.      if( pD
177f0 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20  ef->funcFlags & 
17800 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43 4f 41 4c  SQLITE_FUNC_COAL
17810 45 53 43 45 20 29 7b 0a 20 20 20 20 20 20 20 20  ESCE ){.        
17820 69 6e 74 20 65 6e 64 43 6f 61 6c 65 73 63 65 20  int endCoalesce 
17830 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
17840 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
17850 20 20 20 61 73 73 65 72 74 28 20 6e 46 61 72 67     assert( nFarg
17860 3e 3d 32 20 29 3b 0a 20 20 20 20 20 20 20 20 73  >=2 );.        s
17870 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
17880 50 61 72 73 65 2c 20 70 46 61 72 67 2d 3e 61 5b  Parse, pFarg->a[
17890 30 5d 2e 70 45 78 70 72 2c 20 74 61 72 67 65 74  0].pExpr, target
178a0 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  );.        for(i
178b0 3d 31 3b 20 69 3c 6e 46 61 72 67 3b 20 69 2b 2b  =1; i<nFarg; i++
178c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
178d0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
178e0 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 74 61  , OP_NotNull, ta
178f0 72 67 65 74 2c 20 65 6e 64 43 6f 61 6c 65 73 63  rget, endCoalesc
17900 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 56 64  e);.          Vd
17910 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
17920 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
17930 45 78 70 72 43 61 63 68 65 52 65 6d 6f 76 65 28  ExprCacheRemove(
17940 70 50 61 72 73 65 2c 20 74 61 72 67 65 74 2c 20  pParse, target, 
17950 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  1);.          sq
17960 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75  lite3ExprCachePu
17970 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  sh(pParse);.    
17980 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
17990 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 46  rCode(pParse, pF
179a0 61 72 67 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c  arg->a[i].pExpr,
179b0 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
179c0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
179d0 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b  achePop(pParse);
179e0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
179f0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
17a00 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65 6e  solveLabel(v, en
17a10 64 43 6f 61 6c 65 73 63 65 29 3b 0a 20 20 20 20  dCoalesce);.    
17a20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
17a30 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65   }..      /* The
17a40 20 55 4e 4c 49 4b 45 4c 59 28 29 20 66 75 6e 63   UNLIKELY() func
17a50 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
17a60 20 20 54 68 65 20 72 65 73 75 6c 74 20 69 73 20    The result is 
17a70 74 68 65 20 76 61 6c 75 65 0a 20 20 20 20 20 20  the value.      
17a80 2a 2a 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  ** of the first 
17a90 61 72 67 75 6d 65 6e 74 2e 0a 20 20 20 20 20 20  argument..      
17aa0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 44 65  */.      if( pDe
17ab0 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53  f->funcFlags & S
17ac0 51 4c 49 54 45 5f 46 55 4e 43 5f 55 4e 4c 49 4b  QLITE_FUNC_UNLIK
17ad0 45 4c 59 20 29 7b 0a 20 20 20 20 20 20 20 20 61  ELY ){.        a
17ae0 73 73 65 72 74 28 20 6e 46 61 72 67 3e 3d 31 20  ssert( nFarg>=1 
17af0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
17b00 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
17b10 65 2c 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70  e, pFarg->a[0].p
17b20 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20  Expr, target);. 
17b30 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
17b40 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 66 6f 72      }..      for
17b50 28 69 3d 30 3b 20 69 3c 6e 46 61 72 67 3b 20 69  (i=0; i<nFarg; i
17b60 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
17b70 20 69 3c 33 32 20 26 26 20 73 71 6c 69 74 65 33   i<32 && sqlite3
17b80 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70  ExprIsConstant(p
17b90 46 61 72 67 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  Farg->a[i].pExpr
17ba0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74  ) ){.          t
17bb0 65 73 74 63 61 73 65 28 20 69 3d 3d 33 31 20 29  estcase( i==31 )
17bc0 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73  ;.          cons
17bd0 74 4d 61 73 6b 20 7c 3d 20 4d 41 53 4b 42 49 54  tMask |= MASKBIT
17be0 33 32 28 69 29 3b 0a 20 20 20 20 20 20 20 20 7d  32(i);.        }
17bf0 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70 44  .        if( (pD
17c00 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20  ef->funcFlags & 
17c10 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45 44  SQLITE_FUNC_NEED
17c20 43 4f 4c 4c 29 21 3d 30 20 26 26 20 21 70 43 6f  COLL)!=0 && !pCo
17c30 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ll ){.          
17c40 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
17c50 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
17c60 65 2c 20 70 46 61 72 67 2d 3e 61 5b 69 5d 2e 70  e, pFarg->a[i].p
17c70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 7d  Expr);.        }
17c80 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
17c90 66 28 20 70 46 61 72 67 20 29 7b 0a 20 20 20 20  f( pFarg ){.    
17ca0 20 20 20 20 69 66 28 20 63 6f 6e 73 74 4d 61 73      if( constMas
17cb0 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  k ){.          r
17cc0 31 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  1 = pParse->nMem
17cd0 2b 31 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50  +1;.          pP
17ce0 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 46  arse->nMem += nF
17cf0 61 72 67 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  arg;.        }el
17d00 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72 31  se{.          r1
17d10 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
17d20 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e  pRange(pParse, n
17d30 46 61 72 67 29 3b 0a 20 20 20 20 20 20 20 20 7d  Farg);.        }
17d40 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72  ..        /* For
17d50 20 6c 65 6e 67 74 68 28 29 20 61 6e 64 20 74 79   length() and ty
17d60 70 65 6f 66 28 29 20 66 75 6e 63 74 69 6f 6e 73  peof() functions
17d70 20 77 69 74 68 20 61 20 63 6f 6c 75 6d 6e 20 61   with a column a
17d80 72 67 75 6d 65 6e 74 2c 0a 20 20 20 20 20 20 20  rgument,.       
17d90 20 2a 2a 20 73 65 74 20 74 68 65 20 50 35 20 70   ** set the P5 p
17da0 61 72 61 6d 65 74 65 72 20 74 6f 20 74 68 65 20  arameter to the 
17db0 4f 50 5f 43 6f 6c 75 6d 6e 20 6f 70 63 6f 64 65  OP_Column opcode
17dc0 20 74 6f 20 4f 50 46 4c 41 47 5f 4c 45 4e 47 54   to OPFLAG_LENGT
17dd0 48 41 52 47 0a 20 20 20 20 20 20 20 20 2a 2a 20  HARG.        ** 
17de0 6f 72 20 4f 50 46 4c 41 47 5f 54 59 50 45 4f 46  or OPFLAG_TYPEOF
17df0 41 52 47 20 72 65 73 70 65 63 74 69 76 65 6c 79  ARG respectively
17e00 2c 20 74 6f 20 61 76 6f 69 64 20 75 6e 6e 65 63  , to avoid unnec
17e10 65 73 73 61 72 79 20 64 61 74 61 0a 20 20 20 20  essary data.    
17e20 20 20 20 20 2a 2a 20 6c 6f 61 64 69 6e 67 2e 0a      ** loading..
17e30 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
17e40 20 20 20 69 66 28 20 28 70 44 65 66 2d 3e 66 75     if( (pDef->fu
17e50 6e 63 46 6c 61 67 73 20 26 20 28 53 51 4c 49 54  ncFlags & (SQLIT
17e60 45 5f 46 55 4e 43 5f 4c 45 4e 47 54 48 7c 53 51  E_FUNC_LENGTH|SQ
17e70 4c 49 54 45 5f 46 55 4e 43 5f 54 59 50 45 4f 46  LITE_FUNC_TYPEOF
17e80 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ))!=0 ){.       
17e90 20 20 20 75 38 20 65 78 70 72 4f 70 3b 0a 20 20     u8 exprOp;.  
17ea0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
17eb0 6e 46 61 72 67 3d 3d 31 20 29 3b 0a 20 20 20 20  nFarg==1 );.    
17ec0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 46        assert( pF
17ed0 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 21  arg->a[0].pExpr!
17ee0 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  =0 );.          
17ef0 65 78 70 72 4f 70 20 3d 20 70 46 61 72 67 2d 3e  exprOp = pFarg->
17f00 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 3b 0a  a[0].pExpr->op;.
17f10 20 20 20 20 20 20 20 20 20 20 69 66 28 20 65 78            if( ex
17f20 70 72 4f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  prOp==TK_COLUMN 
17f30 7c 7c 20 65 78 70 72 4f 70 3d 3d 54 4b 5f 41 47  || exprOp==TK_AG
17f40 47 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20  G_COLUMN ){.    
17f50 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
17f60 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4c 45 4e 47  SQLITE_FUNC_LENG
17f70 54 48 3d 3d 4f 50 46 4c 41 47 5f 4c 45 4e 47 54  TH==OPFLAG_LENGT
17f80 48 41 52 47 20 29 3b 0a 20 20 20 20 20 20 20 20  HARG );.        
17f90 20 20 20 20 61 73 73 65 72 74 28 20 53 51 4c 49      assert( SQLI
17fa0 54 45 5f 46 55 4e 43 5f 54 59 50 45 4f 46 3d 3d  TE_FUNC_TYPEOF==
17fb0 4f 50 46 4c 41 47 5f 54 59 50 45 4f 46 41 52 47  OPFLAG_TYPEOFARG
17fc0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
17fd0 74 65 73 74 63 61 73 65 28 20 70 44 65 66 2d 3e  testcase( pDef->
17fe0 66 75 6e 63 46 6c 61 67 73 20 26 20 4f 50 46 4c  funcFlags & OPFL
17ff0 41 47 5f 4c 45 4e 47 54 48 41 52 47 20 29 3b 0a  AG_LENGTHARG );.
18000 20 20 20 20 20 20 20 20 20 20 20 20 70 46 61 72              pFar
18010 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f  g->a[0].pExpr->o
18020 70 32 20 3d 20 0a 20 20 20 20 20 20 20 20 20 20  p2 = .          
18030 20 20 20 20 20 20 20 20 70 44 65 66 2d 3e 66 75          pDef->fu
18040 6e 63 46 6c 61 67 73 20 26 20 28 4f 50 46 4c 41  ncFlags & (OPFLA
18050 47 5f 4c 45 4e 47 54 48 41 52 47 7c 4f 50 46 4c  G_LENGTHARG|OPFL
18060 41 47 5f 54 59 50 45 4f 46 41 52 47 29 3b 0a 20  AG_TYPEOFARG);. 
18070 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
18080 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 73 71     }..        sq
18090 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75  lite3ExprCachePu
180a0 73 68 28 70 50 61 72 73 65 29 3b 20 20 20 20 20  sh(pParse);     
180b0 2f 2a 20 54 69 63 6b 65 74 20 32 65 61 32 34 32  /* Ticket 2ea242
180c0 35 64 33 34 62 65 20 2a 2f 0a 20 20 20 20 20 20  5d34be */.      
180d0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
180e0 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  eExprList(pParse
180f0 2c 20 70 46 61 72 67 2c 20 72 31 2c 0a 20 20 20  , pFarg, r1,.   
18100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18110 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
18120 49 54 45 5f 45 43 45 4c 5f 44 55 50 7c 53 51 4c  ITE_ECEL_DUP|SQL
18130 49 54 45 5f 45 43 45 4c 5f 46 41 43 54 4f 52 29  ITE_ECEL_FACTOR)
18140 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
18150 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50  3ExprCachePop(pP
18160 61 72 73 65 29 3b 20 20 20 20 20 20 2f 2a 20 54  arse);      /* T
18170 69 63 6b 65 74 20 32 65 61 32 34 32 35 64 33 34  icket 2ea2425d34
18180 62 65 20 2a 2f 0a 20 20 20 20 20 20 7d 65 6c 73  be */.      }els
18190 65 7b 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20  e{.        r1 = 
181a0 30 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64  0;.      }.#ifnd
181b0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
181c0 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20  IRTUALTABLE.    
181d0 20 20 2f 2a 20 50 6f 73 73 69 62 6c 79 20 6f 76    /* Possibly ov
181e0 65 72 6c 6f 61 64 20 74 68 65 20 66 75 6e 63 74  erload the funct
181f0 69 6f 6e 20 69 66 20 74 68 65 20 66 69 72 73 74  ion if the first
18200 20 61 72 67 75 6d 65 6e 74 20 69 73 0a 20 20 20   argument is.   
18210 20 20 20 2a 2a 20 61 20 76 69 72 74 75 61 6c 20     ** a virtual 
18220 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 2e 0a 20 20  table column..  
18230 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
18240 46 6f 72 20 69 6e 66 69 78 20 66 75 6e 63 74 69  For infix functi
18250 6f 6e 73 20 28 4c 49 4b 45 2c 20 47 4c 4f 42 2c  ons (LIKE, GLOB,
18260 20 52 45 47 45 58 50 2c 20 61 6e 64 20 4d 41 54   REGEXP, and MAT
18270 43 48 29 20 75 73 65 20 74 68 65 0a 20 20 20 20  CH) use the.    
18280 20 20 2a 2a 20 73 65 63 6f 6e 64 20 61 72 67 75    ** second argu
18290 6d 65 6e 74 2c 20 6e 6f 74 20 74 68 65 20 66 69  ment, not the fi
182a0 72 73 74 2c 20 61 73 20 74 68 65 20 61 72 67 75  rst, as the argu
182b0 6d 65 6e 74 20 74 6f 20 74 65 73 74 20 74 6f 0a  ment to test to.
182c0 20 20 20 20 20 20 2a 2a 20 73 65 65 20 69 66 20        ** see if 
182d0 69 74 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 69  it is a column i
182e0 6e 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c  n a virtual tabl
182f0 65 2e 20 20 54 68 69 73 20 69 73 20 64 6f 6e 65  e.  This is done
18300 20 62 65 63 61 75 73 65 0a 20 20 20 20 20 20 2a   because.      *
18310 2a 20 74 68 65 20 6c 65 66 74 20 6f 70 65 72 61  * the left opera
18320 6e 64 20 6f 66 20 69 6e 66 69 78 20 66 75 6e 63  nd of infix func
18330 74 69 6f 6e 73 20 28 74 68 65 20 6f 70 65 72 61  tions (the opera
18340 6e 64 20 77 65 20 77 61 6e 74 20 74 6f 0a 20 20  nd we want to.  
18350 20 20 20 20 2a 2a 20 63 6f 6e 74 72 6f 6c 20 6f      ** control o
18360 76 65 72 6c 6f 61 64 69 6e 67 29 20 65 6e 64 73  verloading) ends
18370 20 75 70 20 61 73 20 74 68 65 20 73 65 63 6f 6e   up as the secon
18380 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  d argument to th
18390 65 0a 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74  e.      ** funct
183a0 69 6f 6e 2e 20 20 54 68 65 20 65 78 70 72 65 73  ion.  The expres
183b0 73 69 6f 6e 20 22 41 20 67 6c 6f 62 20 42 22 20  sion "A glob B" 
183c0 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f  is equivalent to
183d0 20 0a 20 20 20 20 20 20 2a 2a 20 22 67 6c 6f 62   .      ** "glob
183e0 28 42 2c 41 29 2e 20 20 57 65 20 77 61 6e 74 20  (B,A).  We want 
183f0 74 6f 20 75 73 65 20 74 68 65 20 41 20 69 6e 20  to use the A in 
18400 22 41 20 67 6c 6f 62 20 42 22 20 74 6f 20 74 65  "A glob B" to te
18410 73 74 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20  st.      ** for 
18420 66 75 6e 63 74 69 6f 6e 20 6f 76 65 72 6c 6f 61  function overloa
18430 64 69 6e 67 2e 20 20 42 75 74 20 77 65 20 75 73  ding.  But we us
18440 65 20 74 68 65 20 42 20 74 65 72 6d 20 69 6e 20  e the B term in 
18450 22 67 6c 6f 62 28 42 2c 41 29 22 2e 0a 20 20 20  "glob(B,A)"..   
18460 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
18470 6e 46 61 72 67 3e 3d 32 20 26 26 20 28 70 45 78  nFarg>=2 && (pEx
18480 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 49  pr->flags & EP_I
18490 6e 66 69 78 46 75 6e 63 29 20 29 7b 0a 20 20 20  nfixFunc) ){.   
184a0 20 20 20 20 20 70 44 65 66 20 3d 20 73 71 6c 69       pDef = sqli
184b0 74 65 33 56 74 61 62 4f 76 65 72 6c 6f 61 64 46  te3VtabOverloadF
184c0 75 6e 63 74 69 6f 6e 28 64 62 2c 20 70 44 65 66  unction(db, pDef
184d0 2c 20 6e 46 61 72 67 2c 20 70 46 61 72 67 2d 3e  , nFarg, pFarg->
184e0 61 5b 31 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[1].pExpr);.   
184f0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 46 61     }else if( nFa
18500 72 67 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  rg>0 ){.        
18510 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33 56 74  pDef = sqlite3Vt
18520 61 62 4f 76 65 72 6c 6f 61 64 46 75 6e 63 74 69  abOverloadFuncti
18530 6f 6e 28 64 62 2c 20 70 44 65 66 2c 20 6e 46 61  on(db, pDef, nFa
18540 72 67 2c 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e  rg, pFarg->a[0].
18550 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a  pExpr);.      }.
18560 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28  #endif.      if(
18570 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73   pDef->funcFlags
18580 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4e   & SQLITE_FUNC_N
18590 45 45 44 43 4f 4c 4c 20 29 7b 0a 20 20 20 20 20  EEDCOLL ){.     
185a0 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 20     if( !pColl ) 
185b0 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c  pColl = db->pDfl
185c0 74 43 6f 6c 6c 3b 20 0a 20 20 20 20 20 20 20 20  tColl; .        
185d0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
185e0 34 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c  4(v, OP_CollSeq,
185f0 20 30 2c 20 30 2c 20 30 2c 20 28 63 68 61 72 20   0, 0, 0, (char 
18600 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c  *)pColl, P4_COLL
18610 53 45 51 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  SEQ);.      }.  
18620 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
18630 64 64 4f 70 34 28 76 2c 20 4f 50 5f 46 75 6e 63  ddOp4(v, OP_Func
18640 74 69 6f 6e 2c 20 63 6f 6e 73 74 4d 61 73 6b 2c  tion, constMask,
18650 20 72 31 2c 20 74 61 72 67 65 74 2c 0a 20 20 20   r1, target,.   
18660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18670 20 20 20 20 20 28 63 68 61 72 2a 29 70 44 65 66       (char*)pDef
18680 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20  , P4_FUNCDEF);. 
18690 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
186a0 43 68 61 6e 67 65 50 35 28 76 2c 20 28 75 38 29  ChangeP5(v, (u8)
186b0 6e 46 61 72 67 29 3b 0a 20 20 20 20 20 20 69 66  nFarg);.      if
186c0 28 20 6e 46 61 72 67 20 26 26 20 63 6f 6e 73 74  ( nFarg && const
186d0 4d 61 73 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Mask==0 ){.     
186e0 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
186f0 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  eTempRange(pPars
18700 65 2c 20 72 31 2c 20 6e 46 61 72 67 29 3b 0a 20  e, r1, nFarg);. 
18710 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
18720 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  ak;.    }.#ifnde
18730 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
18740 42 51 55 45 52 59 0a 20 20 20 20 63 61 73 65 20  BQUERY.    case 
18750 54 4b 5f 45 58 49 53 54 53 3a 0a 20 20 20 20 63  TK_EXISTS:.    c
18760 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b  ase TK_SELECT: {
18770 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
18780 20 6f 70 3d 3d 54 4b 5f 45 58 49 53 54 53 20 29   op==TK_EXISTS )
18790 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
187a0 28 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ( op==TK_SELECT 
187b0 29 3b 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d  );.      inReg =
187c0 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73   sqlite3CodeSubs
187d0 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 45  elect(pParse, pE
187e0 78 70 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  xpr, 0, 0);.    
187f0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
18800 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b     case TK_IN: {
18810 0a 20 20 20 20 20 20 69 6e 74 20 64 65 73 74 49  .      int destI
18820 66 46 61 6c 73 65 20 3d 20 73 71 6c 69 74 65 33  fFalse = sqlite3
18830 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
18840 3b 0a 20 20 20 20 20 20 69 6e 74 20 64 65 73 74  ;.      int dest
18850 49 66 4e 75 6c 6c 20 3d 20 73 71 6c 69 74 65 33  IfNull = sqlite3
18860 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
18870 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
18880 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
18890 4e 75 6c 6c 2c 20 30 2c 20 74 61 72 67 65 74 29  Null, 0, target)
188a0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
188b0 78 70 72 43 6f 64 65 49 4e 28 70 50 61 72 73 65  xprCodeIN(pParse
188c0 2c 20 70 45 78 70 72 2c 20 64 65 73 74 49 66 46  , pExpr, destIfF
188d0 61 6c 73 65 2c 20 64 65 73 74 49 66 4e 75 6c 6c  alse, destIfNull
188e0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
188f0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
18900 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 74 61 72  _Integer, 1, tar
18910 67 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  get);.      sqli
18920 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
18930 62 65 6c 28 76 2c 20 64 65 73 74 49 66 46 61 6c  bel(v, destIfFal
18940 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  se);.      sqlit
18950 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
18960 4f 50 5f 41 64 64 49 6d 6d 2c 20 74 61 72 67 65  OP_AddImm, targe
18970 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  t, 0);.      sql
18980 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
18990 61 62 65 6c 28 76 2c 20 64 65 73 74 49 66 4e 75  abel(v, destIfNu
189a0 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ll);.      break
189b0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f  ;.    }.#endif /
189c0 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  * SQLITE_OMIT_SU
189d0 42 51 55 45 52 59 20 2a 2f 0a 0a 0a 20 20 20 20  BQUERY */...    
189e0 2f 2a 0a 20 20 20 20 2a 2a 20 20 20 20 78 20 42  /*.    **    x B
189f0 45 54 57 45 45 4e 20 79 20 41 4e 44 20 7a 0a 20  ETWEEN y AND z. 
18a00 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69     **.    ** Thi
18a10 73 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20  s is equivalent 
18a20 74 6f 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  to.    **.    **
18a30 20 20 20 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d      x>=y AND x<=
18a40 7a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  z.    **.    ** 
18a50 58 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70  X is stored in p
18a60 45 78 70 72 2d 3e 70 4c 65 66 74 2e 0a 20 20 20  Expr->pLeft..   
18a70 20 2a 2a 20 59 20 69 73 20 73 74 6f 72 65 64 20   ** Y is stored 
18a80 69 6e 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d  in pExpr->pList-
18a90 3e 61 5b 30 5d 2e 70 45 78 70 72 2e 0a 20 20 20  >a[0].pExpr..   
18aa0 20 2a 2a 20 5a 20 69 73 20 73 74 6f 72 65 64 20   ** Z is stored 
18ab0 69 6e 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d  in pExpr->pList-
18ac0 3e 61 5b 31 5d 2e 70 45 78 70 72 2e 0a 20 20 20  >a[1].pExpr..   
18ad0 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   */.    case TK_
18ae0 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20  BETWEEN: {.     
18af0 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70   Expr *pLeft = p
18b00 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20  Expr->pLeft;.   
18b10 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
18b20 73 74 5f 69 74 65 6d 20 2a 70 4c 49 74 65 6d 20  st_item *pLItem 
18b30 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  = pExpr->x.pList
18b40 2d 3e 61 3b 0a 20 20 20 20 20 20 45 78 70 72 20  ->a;.      Expr 
18b50 2a 70 52 69 67 68 74 20 3d 20 70 4c 49 74 65 6d  *pRight = pLItem
18b60 2d 3e 70 45 78 70 72 3b 0a 0a 20 20 20 20 20 20  ->pExpr;..      
18b70 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
18b80 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
18b90 20 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65   pLeft, &regFree
18ba0 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73  1);.      r2 = s
18bb0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
18bc0 6d 70 28 70 50 61 72 73 65 2c 20 70 52 69 67 68  mp(pParse, pRigh
18bd0 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20  t, &regFree2);. 
18be0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
18bf0 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
18c00 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
18c10 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20  gFree2==0 );.   
18c20 20 20 20 72 33 20 3d 20 73 71 6c 69 74 65 33 47     r3 = sqlite3G
18c30 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
18c40 29 3b 0a 20 20 20 20 20 20 72 34 20 3d 20 73 71  );.      r4 = sq
18c50 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
18c60 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 63  pParse);.      c
18c70 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73  odeCompare(pPars
18c80 65 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74  e, pLeft, pRight
18c90 2c 20 4f 50 5f 47 65 2c 0a 20 20 20 20 20 20 20  , OP_Ge,.       
18ca0 20 20 20 20 20 20 20 20 20 20 20 72 31 2c 20 72             r1, r
18cb0 32 2c 20 72 33 2c 20 53 51 4c 49 54 45 5f 53 54  2, r3, SQLITE_ST
18cc0 4f 52 45 50 32 29 3b 20 20 56 64 62 65 43 6f 76  OREP2);  VdbeCov
18cd0 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
18ce0 70 4c 49 74 65 6d 2b 2b 3b 0a 20 20 20 20 20 20  pLItem++;.      
18cf0 70 52 69 67 68 74 20 3d 20 70 4c 49 74 65 6d 2d  pRight = pLItem-
18d00 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 73 71  >pExpr;.      sq
18d10 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
18d20 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46  Reg(pParse, regF
18d30 72 65 65 32 29 3b 0a 20 20 20 20 20 20 72 32 20  ree2);.      r2 
18d40 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
18d50 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 52  eTemp(pParse, pR
18d60 69 67 68 74 2c 20 26 72 65 67 46 72 65 65 32 29  ight, &regFree2)
18d70 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
18d80 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b  ( regFree2==0 );
18d90 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61  .      codeCompa
18da0 72 65 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74  re(pParse, pLeft
18db0 2c 20 70 52 69 67 68 74 2c 20 4f 50 5f 4c 65 2c  , pRight, OP_Le,
18dc0 20 72 31 2c 20 72 32 2c 20 72 34 2c 20 53 51 4c   r1, r2, r4, SQL
18dd0 49 54 45 5f 53 54 4f 52 45 50 32 29 3b 0a 20 20  ITE_STOREP2);.  
18de0 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
18df0 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (v);.      sqlit
18e00 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
18e10 4f 50 5f 41 6e 64 2c 20 72 33 2c 20 72 34 2c 20  OP_And, r3, r4, 
18e20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 73  target);.      s
18e30 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
18e40 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 33 29  pReg(pParse, r3)
18e50 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  ;.      sqlite3R
18e60 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
18e70 61 72 73 65 2c 20 72 34 29 3b 0a 20 20 20 20 20  arse, r4);.     
18e80 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
18e90 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 4c 41 54    case TK_COLLAT
18ea0 45 3a 20 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  E: .    case TK_
18eb0 55 50 4c 55 53 3a 20 7b 0a 20 20 20 20 20 20 69  UPLUS: {.      i
18ec0 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78  nReg = sqlite3Ex
18ed0 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61  prCodeTarget(pPa
18ee0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
18ef0 74 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  t, target);.    
18f00 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
18f10 20 20 20 20 63 61 73 65 20 54 4b 5f 54 52 49 47      case TK_TRIG
18f20 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  GER: {.      /* 
18f30 49 66 20 74 68 65 20 6f 70 63 6f 64 65 20 69 73  If the opcode is
18f40 20 54 4b 5f 54 52 49 47 47 45 52 2c 20 74 68 65   TK_TRIGGER, the
18f50 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  n the expression
18f60 20 69 73 20 61 20 72 65 66 65 72 65 6e 63 65 0a   is a reference.
18f70 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 20 63 6f        ** to a co
18f80 6c 75 6d 6e 20 69 6e 20 74 68 65 20 6e 65 77 2e  lumn in the new.
18f90 2a 20 6f 72 20 6f 6c 64 2e 2a 20 70 73 65 75 64  * or old.* pseud
18fa0 6f 2d 74 61 62 6c 65 73 20 61 76 61 69 6c 61 62  o-tables availab
18fb0 6c 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74  le to.      ** t
18fc0 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d 73 2e  rigger programs.
18fd0 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 45 78   In this case Ex
18fe0 70 72 2e 69 54 61 62 6c 65 20 69 73 20 73 65 74  pr.iTable is set
18ff0 20 74 6f 20 31 20 66 6f 72 20 74 68 65 0a 20 20   to 1 for the.  
19000 20 20 20 20 2a 2a 20 6e 65 77 2e 2a 20 70 73 65      ** new.* pse
19010 75 64 6f 2d 74 61 62 6c 65 2c 20 6f 72 20 30 20  udo-table, or 0 
19020 66 6f 72 20 74 68 65 20 6f 6c 64 2e 2a 20 70 73  for the old.* ps
19030 65 75 64 6f 2d 74 61 62 6c 65 2e 20 45 78 70 72  eudo-table. Expr
19040 2e 69 43 6f 6c 75 6d 6e 0a 20 20 20 20 20 20 2a  .iColumn.      *
19050 2a 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  * is set to the 
19060 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 70 73  column of the ps
19070 65 75 64 6f 2d 74 61 62 6c 65 20 74 6f 20 72 65  eudo-table to re
19080 61 64 2c 20 6f 72 20 74 6f 20 2d 31 20 74 6f 0a  ad, or to -1 to.
19090 20 20 20 20 20 20 2a 2a 20 72 65 61 64 20 74 68        ** read th
190a0 65 20 72 6f 77 69 64 20 66 69 65 6c 64 2e 0a 20  e rowid field.. 
190b0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
190c0 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
190d0 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 75  is implemented u
190e0 73 69 6e 67 20 61 6e 20 4f 50 5f 50 61 72 61 6d  sing an OP_Param
190f0 20 6f 70 63 6f 64 65 2e 20 54 68 65 20 70 31 0a   opcode. The p1.
19100 20 20 20 20 20 20 2a 2a 20 70 61 72 61 6d 65 74        ** paramet
19110 65 72 20 69 73 20 73 65 74 20 74 6f 20 30 20 66  er is set to 0 f
19120 6f 72 20 61 6e 20 6f 6c 64 2e 72 6f 77 69 64 20  or an old.rowid 
19130 72 65 66 65 72 65 6e 63 65 2c 20 6f 72 20 74 6f  reference, or to
19140 20 28 69 2b 31 29 0a 20 20 20 20 20 20 2a 2a 20   (i+1).      ** 
19150 74 6f 20 72 65 66 65 72 65 6e 63 65 20 61 6e 6f  to reference ano
19160 74 68 65 72 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  ther column of t
19170 68 65 20 6f 6c 64 2e 2a 20 70 73 65 75 64 6f 2d  he old.* pseudo-
19180 74 61 62 6c 65 2c 20 77 68 65 72 65 20 0a 20 20  table, where .  
19190 20 20 20 20 2a 2a 20 69 20 69 73 20 74 68 65 20      ** i is the 
191a0 69 6e 64 65 78 20 6f 66 20 74 68 65 20 63 6f 6c  index of the col
191b0 75 6d 6e 2e 20 46 6f 72 20 61 20 6e 65 77 2e 72  umn. For a new.r
191c0 6f 77 69 64 20 72 65 66 65 72 65 6e 63 65 2c 20  owid reference, 
191d0 70 31 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 73  p1 is.      ** s
191e0 65 74 20 74 6f 20 28 6e 2b 31 29 2c 20 77 68 65  et to (n+1), whe
191f0 72 65 20 6e 20 69 73 20 74 68 65 20 6e 75 6d 62  re n is the numb
19200 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
19210 20 65 61 63 68 20 70 73 65 75 64 6f 2d 74 61 62   each pseudo-tab
19220 6c 65 2e 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72  le..      ** For
19230 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
19240 61 6e 79 20 6f 74 68 65 72 20 63 6f 6c 75 6d 6e  any other column
19250 20 69 6e 20 74 68 65 20 6e 65 77 2e 2a 20 70 73   in the new.* ps
19260 65 75 64 6f 2d 74 61 62 6c 65 2c 20 70 31 0a 20  eudo-table, p1. 
19270 20 20 20 20 20 2a 2a 20 69 73 20 73 65 74 20 74       ** is set t
19280 6f 20 28 6e 2b 32 2b 69 29 2c 20 77 68 65 72 65  o (n+2+i), where
19290 20 6e 20 61 6e 64 20 69 20 61 72 65 20 61 73 20   n and i are as 
192a0 64 65 66 69 6e 65 64 20 70 72 65 76 69 6f 75 73  defined previous
192b0 6c 79 2e 20 46 6f 72 0a 20 20 20 20 20 20 2a 2a  ly. For.      **
192c0 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65   example, if the
192d0 20 74 61 62 6c 65 20 6f 6e 20 77 68 69 63 68 20   table on which 
192e0 74 72 69 67 67 65 72 73 20 61 72 65 20 62 65 69  triggers are bei
192f0 6e 67 20 66 69 72 65 64 20 69 73 0a 20 20 20 20  ng fired is.    
19300 20 20 2a 2a 20 64 65 63 6c 61 72 65 64 20 61 73    ** declared as
19310 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  :.      **.     
19320 20 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41 42   **   CREATE TAB
19330 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20  LE t1(a, b);.   
19340 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54     **.      ** T
19350 68 65 6e 20 70 31 20 69 73 20 69 6e 74 65 72 70  hen p1 is interp
19360 72 65 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73  reted as follows
19370 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  :.      **.     
19380 20 2a 2a 20 20 20 70 31 3d 3d 30 20 20 20 2d 3e   **   p1==0   ->
19390 20 20 20 20 6f 6c 64 2e 72 6f 77 69 64 20 20 20      old.rowid   
193a0 20 20 70 31 3d 3d 33 20 20 20 2d 3e 20 20 20 20    p1==3   ->    
193b0 6e 65 77 2e 72 6f 77 69 64 0a 20 20 20 20 20 20  new.rowid.      
193c0 2a 2a 20 20 20 70 31 3d 3d 31 20 20 20 2d 3e 20  **   p1==1   -> 
193d0 20 20 20 6f 6c 64 2e 61 20 20 20 20 20 20 20 20     old.a        
193e0 20 70 31 3d 3d 34 20 20 20 2d 3e 20 20 20 20 6e   p1==4   ->    n
193f0 65 77 2e 61 0a 20 20 20 20 20 20 2a 2a 20 20 20  ew.a.      **   
19400 70 31 3d 3d 32 20 20 20 2d 3e 20 20 20 20 6f 6c  p1==2   ->    ol
19410 64 2e 62 20 20 20 20 20 20 20 20 20 70 31 3d 3d  d.b         p1==
19420 35 20 20 20 2d 3e 20 20 20 20 6e 65 77 2e 62 20  5   ->    new.b 
19430 20 20 20 20 20 20 0a 20 20 20 20 20 20 2a 2f 0a        .      */.
19440 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61        Table *pTa
19450 62 20 3d 20 70 45 78 70 72 2d 3e 70 54 61 62 3b  b = pExpr->pTab;
19460 0a 20 20 20 20 20 20 69 6e 74 20 70 31 20 3d 20  .      int p1 = 
19470 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 2a 20  pExpr->iTable * 
19480 28 70 54 61 62 2d 3e 6e 43 6f 6c 2b 31 29 20 2b  (pTab->nCol+1) +
19490 20 31 20 2b 20 70 45 78 70 72 2d 3e 69 43 6f 6c   1 + pExpr->iCol
194a0 75 6d 6e 3b 0a 0a 20 20 20 20 20 20 61 73 73 65  umn;..      asse
194b0 72 74 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  rt( pExpr->iTabl
194c0 65 3d 3d 30 20 7c 7c 20 70 45 78 70 72 2d 3e 69  e==0 || pExpr->i
194d0 54 61 62 6c 65 3d 3d 31 20 29 3b 0a 20 20 20 20  Table==1 );.    
194e0 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
194f0 3e 69 43 6f 6c 75 6d 6e 3e 3d 2d 31 20 26 26 20  >iColumn>=-1 && 
19500 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70  pExpr->iColumn<p
19510 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20  Tab->nCol );.   
19520 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62 2d     assert( pTab-
19530 3e 69 50 4b 65 79 3c 30 20 7c 7c 20 70 45 78 70  >iPKey<0 || pExp
19540 72 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70 54 61 62  r->iColumn!=pTab
19550 2d 3e 69 50 4b 65 79 20 29 3b 0a 20 20 20 20 20  ->iPKey );.     
19560 20 61 73 73 65 72 74 28 20 70 31 3e 3d 30 20 26   assert( p1>=0 &
19570 26 20 70 31 3c 28 70 54 61 62 2d 3e 6e 43 6f 6c  & p1<(pTab->nCol
19580 2a 32 2b 32 29 20 29 3b 0a 0a 20 20 20 20 20 20  *2+2) );..      
19590 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
195a0 32 28 76 2c 20 4f 50 5f 50 61 72 61 6d 2c 20 70  2(v, OP_Param, p
195b0 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  1, target);.    
195c0 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
195d0 2c 20 22 25 73 2e 25 73 20 2d 3e 20 24 25 64 22  , "%s.%s -> $%d"
195e0 2c 0a 20 20 20 20 20 20 20 20 28 70 45 78 70 72  ,.        (pExpr
195f0 2d 3e 69 54 61 62 6c 65 20 3f 20 22 6e 65 77 22  ->iTable ? "new"
19600 20 3a 20 22 6f 6c 64 22 29 2c 0a 20 20 20 20 20   : "old"),.     
19610 20 20 20 28 70 45 78 70 72 2d 3e 69 43 6f 6c 75     (pExpr->iColu
19620 6d 6e 3c 30 20 3f 20 22 72 6f 77 69 64 22 20 3a  mn<0 ? "rowid" :
19630 20 70 45 78 70 72 2d 3e 70 54 61 62 2d 3e 61 43   pExpr->pTab->aC
19640 6f 6c 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  ol[pExpr->iColum
19650 6e 5d 2e 7a 4e 61 6d 65 29 2c 0a 20 20 20 20 20  n].zName),.     
19660 20 20 20 74 61 72 67 65 74 0a 20 20 20 20 20 20     target.      
19670 29 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ));..#ifndef SQL
19680 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e  ITE_OMIT_FLOATIN
19690 47 5f 50 4f 49 4e 54 0a 20 20 20 20 20 20 2f 2a  G_POINT.      /*
196a0 20 49 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 68   If the column h
196b0 61 73 20 52 45 41 4c 20 61 66 66 69 6e 69 74 79  as REAL affinity
196c0 2c 20 69 74 20 6d 61 79 20 63 75 72 72 65 6e 74  , it may current
196d0 6c 79 20 62 65 20 73 74 6f 72 65 64 20 61 73 20  ly be stored as 
196e0 61 6e 0a 20 20 20 20 20 20 2a 2a 20 69 6e 74 65  an.      ** inte
196f0 67 65 72 2e 20 55 73 65 20 4f 50 5f 52 65 61 6c  ger. Use OP_Real
19700 41 66 66 69 6e 69 74 79 20 74 6f 20 6d 61 6b 65  Affinity to make
19710 20 73 75 72 65 20 69 74 20 69 73 20 72 65 61 6c   sure it is real
19720 6c 79 20 72 65 61 6c 2e 20 20 2a 2f 0a 20 20 20  ly real.  */.   
19730 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43     if( pExpr->iC
19740 6f 6c 75 6d 6e 3e 3d 30 20 0a 20 20 20 20 20 20  olumn>=0 .      
19750 20 26 26 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70   && pTab->aCol[p
19760 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 61  Expr->iColumn].a
19770 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f  ffinity==SQLITE_
19780 41 46 46 5f 52 45 41 4c 0a 20 20 20 20 20 20 29  AFF_REAL.      )
19790 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
197a0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
197b0 50 5f 52 65 61 6c 41 66 66 69 6e 69 74 79 2c 20  P_RealAffinity, 
197c0 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 7d  target);.      }
197d0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 62 72  .#endif.      br
197e0 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 0a 20 20 20  eak;.    }...   
197f0 20 2f 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 6d 20   /*.    ** Form 
19800 41 3a 0a 20 20 20 20 2a 2a 20 20 20 43 41 53 45  A:.    **   CASE
19810 20 78 20 57 48 45 4e 20 65 31 20 54 48 45 4e 20   x WHEN e1 THEN 
19820 72 31 20 57 48 45 4e 20 65 32 20 54 48 45 4e 20  r1 WHEN e2 THEN 
19830 72 32 20 2e 2e 2e 20 57 48 45 4e 20 65 4e 20 54  r2 ... WHEN eN T
19840 48 45 4e 20 72 4e 20 45 4c 53 45 20 79 20 45 4e  HEN rN ELSE y EN
19850 44 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  D.    **.    ** 
19860 46 6f 72 6d 20 42 3a 0a 20 20 20 20 2a 2a 20 20  Form B:.    **  
19870 20 43 41 53 45 20 57 48 45 4e 20 65 31 20 54 48   CASE WHEN e1 TH
19880 45 4e 20 72 31 20 57 48 45 4e 20 65 32 20 54 48  EN r1 WHEN e2 TH
19890 45 4e 20 72 32 20 2e 2e 2e 20 57 48 45 4e 20 65  EN r2 ... WHEN e
198a0 4e 20 54 48 45 4e 20 72 4e 20 45 4c 53 45 20 79  N THEN rN ELSE y
198b0 20 45 4e 44 0a 20 20 20 20 2a 2a 0a 20 20 20 20   END.    **.    
198c0 2a 2a 20 46 6f 72 6d 20 41 20 69 73 20 63 61 6e  ** Form A is can
198d0 20 62 65 20 74 72 61 6e 73 66 6f 72 6d 65 64 20   be transformed 
198e0 69 6e 74 6f 20 74 68 65 20 65 71 75 69 76 61 6c  into the equival
198f0 65 6e 74 20 66 6f 72 6d 20 42 20 61 73 20 66 6f  ent form B as fo
19900 6c 6c 6f 77 73 3a 0a 20 20 20 20 2a 2a 20 20 20  llows:.    **   
19910 43 41 53 45 20 57 48 45 4e 20 78 3d 65 31 20 54  CASE WHEN x=e1 T
19920 48 45 4e 20 72 31 20 57 48 45 4e 20 78 3d 65 32  HEN r1 WHEN x=e2
19930 20 54 48 45 4e 20 72 32 20 2e 2e 2e 0a 20 20 20   THEN r2 ....   
19940 20 2a 2a 20 20 20 20 20 20 20 20 57 48 45 4e 20   **        WHEN 
19950 78 3d 65 4e 20 54 48 45 4e 20 72 4e 20 45 4c 53  x=eN THEN rN ELS
19960 45 20 79 20 45 4e 44 0a 20 20 20 20 2a 2a 0a 20  E y END.    **. 
19970 20 20 20 2a 2a 20 58 20 28 69 66 20 69 74 20 65     ** X (if it e
19980 78 69 73 74 73 29 20 69 73 20 69 6e 20 70 45 78  xists) is in pEx
19990 70 72 2d 3e 70 4c 65 66 74 2e 0a 20 20 20 20 2a  pr->pLeft..    *
199a0 2a 20 59 20 69 73 20 69 6e 20 74 68 65 20 6c 61  * Y is in the la
199b0 73 74 20 65 6c 65 6d 65 6e 74 20 6f 66 20 70 45  st element of pE
199c0 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20 69 66 20  xpr->x.pList if 
199d0 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e  pExpr->x.pList->
199e0 6e 45 78 70 72 20 69 73 0a 20 20 20 20 2a 2a 20  nExpr is.    ** 
199f0 6f 64 64 2e 20 20 54 68 65 20 59 20 69 73 20 61  odd.  The Y is a
19a00 6c 73 6f 20 6f 70 74 69 6f 6e 61 6c 2e 20 20 49  lso optional.  I
19a10 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
19a20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 78 2e 70 4c  elements in x.pL
19a30 69 73 74 0a 20 20 20 20 2a 2a 20 69 73 20 65 76  ist.    ** is ev
19a40 65 6e 2c 20 74 68 65 6e 20 59 20 69 73 20 6f 6d  en, then Y is om
19a50 69 74 74 65 64 20 61 6e 64 20 74 68 65 20 22 6f  itted and the "o
19a60 74 68 65 72 77 69 73 65 22 20 72 65 73 75 6c 74  therwise" result
19a70 20 69 73 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2a   is NULL..    **
19a80 20 45 69 20 69 73 20 69 6e 20 70 45 78 70 72 2d   Ei is in pExpr-
19a90 3e 70 4c 69 73 74 2d 3e 61 5b 69 2a 32 5d 20 61  >pList->a[i*2] a
19aa0 6e 64 20 52 69 20 69 73 20 70 45 78 70 72 2d 3e  nd Ri is pExpr->
19ab0 70 4c 69 73 74 2d 3e 61 5b 69 2a 32 2b 31 5d 2e  pList->a[i*2+1].
19ac0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
19ad0 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65  he result of the
19ae0 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74   expression is t
19af0 68 65 20 52 69 20 66 6f 72 20 74 68 65 20 66 69  he Ri for the fi
19b00 72 73 74 20 6d 61 74 63 68 69 6e 67 20 45 69 2c  rst matching Ei,
19b10 0a 20 20 20 20 2a 2a 20 6f 72 20 69 66 20 74 68  .    ** or if th
19b20 65 72 65 20 69 73 20 6e 6f 20 6d 61 74 63 68 69  ere is no matchi
19b30 6e 67 20 45 69 2c 20 74 68 65 20 45 4c 53 45 20  ng Ei, the ELSE 
19b40 74 65 72 6d 20 59 2c 20 6f 72 20 69 66 20 74 68  term Y, or if th
19b50 65 72 65 20 69 73 0a 20 20 20 20 2a 2a 20 6e 6f  ere is.    ** no
19b60 20 45 4c 53 45 20 74 65 72 6d 2c 20 4e 55 4c 4c   ELSE term, NULL
19b70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 65 66  ..    */.    def
19b80 61 75 6c 74 3a 20 61 73 73 65 72 74 28 20 6f 70  ault: assert( op
19b90 3d 3d 54 4b 5f 43 41 53 45 20 29 3b 20 7b 0a 20  ==TK_CASE ); {. 
19ba0 20 20 20 20 20 69 6e 74 20 65 6e 64 4c 61 62 65       int endLabe
19bb0 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
19bc0 20 20 20 20 20 20 20 2f 2a 20 47 4f 54 4f 20 6c         /* GOTO l
19bd0 61 62 65 6c 20 66 6f 72 20 65 6e 64 20 6f 66 20  abel for end of 
19be0 43 41 53 45 20 73 74 6d 74 20 2a 2f 0a 20 20 20  CASE stmt */.   
19bf0 20 20 20 69 6e 74 20 6e 65 78 74 43 61 73 65 3b     int nextCase;
19c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19c10 20 20 20 20 20 2f 2a 20 47 4f 54 4f 20 6c 61 62       /* GOTO lab
19c20 65 6c 20 66 6f 72 20 6e 65 78 74 20 57 48 45 4e  el for next WHEN
19c30 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20   clause */.     
19c40 20 69 6e 74 20 6e 45 78 70 72 3b 20 20 20 20 20   int nExpr;     
19c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19c60 20 20 20 2f 2a 20 32 78 20 6e 75 6d 62 65 72 20     /* 2x number 
19c70 6f 66 20 57 48 45 4e 20 74 65 72 6d 73 20 2a 2f  of WHEN terms */
19c80 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 20 20 20  .      int i;   
19c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19ca0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
19cb0 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20   counter */.    
19cc0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
19cd0 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  st;             
19ce0 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 57      /* List of W
19cf0 48 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20  HEN terms */.   
19d00 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
19d10 73 74 5f 69 74 65 6d 20 2a 61 4c 69 73 74 65 6c  st_item *aListel
19d20 65 6d 3b 20 20 2f 2a 20 41 72 72 61 79 20 6f 66  em;  /* Array of
19d30 20 57 48 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20   WHEN terms */. 
19d40 20 20 20 20 20 45 78 70 72 20 6f 70 43 6f 6d 70       Expr opComp
19d50 61 72 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  are;            
19d60 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 58 3d         /* The X=
19d70 3d 45 69 20 65 78 70 72 65 73 73 69 6f 6e 20 2a  =Ei expression *
19d80 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 58  /.      Expr *pX
19d90 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
19da0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
19db0 20 58 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f   X expression */
19dc0 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 54 65  .      Expr *pTe
19dd0 73 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  st = 0;         
19de0 20 20 20 20 20 20 20 20 20 2f 2a 20 58 3d 3d 45           /* X==E
19df0 69 20 28 66 6f 72 6d 20 41 29 20 6f 72 20 6a 75  i (form A) or ju
19e00 73 74 20 45 69 20 28 66 6f 72 6d 20 42 29 20 2a  st Ei (form B) *
19e10 2f 0a 20 20 20 20 20 20 56 56 41 5f 4f 4e 4c 59  /.      VVA_ONLY
19e20 28 20 69 6e 74 20 69 43 61 63 68 65 4c 65 76 65  ( int iCacheLeve
19e30 6c 20 3d 20 70 50 61 72 73 65 2d 3e 69 43 61 63  l = pParse->iCac
19e40 68 65 4c 65 76 65 6c 3b 20 29 0a 0a 20 20 20 20  heLevel; )..    
19e50 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
19e60 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
19e70 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
19e80 26 26 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73  && pExpr->x.pLis
19e90 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  t );.      asser
19ea0 74 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  t(pExpr->x.pList
19eb0 2d 3e 6e 45 78 70 72 20 3e 20 30 29 3b 0a 20 20  ->nExpr > 0);.  
19ec0 20 20 20 20 70 45 4c 69 73 74 20 3d 20 70 45 78      pEList = pEx
19ed0 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20  pr->x.pList;.   
19ee0 20 20 20 61 4c 69 73 74 65 6c 65 6d 20 3d 20 70     aListelem = p
19ef0 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20  EList->a;.      
19f00 6e 45 78 70 72 20 3d 20 70 45 4c 69 73 74 2d 3e  nExpr = pEList->
19f10 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 65 6e 64  nExpr;.      end
19f20 4c 61 62 65 6c 20 3d 20 73 71 6c 69 74 65 33 56  Label = sqlite3V
19f30 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
19f40 0a 20 20 20 20 20 20 69 66 28 20 28 70 58 20 3d  .      if( (pX =
19f50 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 21 3d   pExpr->pLeft)!=
19f60 30 20 29 7b 0a 20 20 20 20 20 20 20 20 74 65 6d  0 ){.        tem
19f70 70 58 20 3d 20 2a 70 58 3b 0a 20 20 20 20 20 20  pX = *pX;.      
19f80 20 20 74 65 73 74 63 61 73 65 28 20 70 58 2d 3e    testcase( pX->
19f90 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b  op==TK_COLUMN );
19fa0 0a 20 20 20 20 20 20 20 20 65 78 70 72 54 6f 52  .        exprToR
19fb0 65 67 69 73 74 65 72 28 26 74 65 6d 70 58 2c 20  egister(&tempX, 
19fc0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
19fd0 65 6d 70 28 70 50 61 72 73 65 2c 20 70 58 2c 20  emp(pParse, pX, 
19fe0 26 72 65 67 46 72 65 65 31 29 29 3b 0a 20 20 20  &regFree1));.   
19ff0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
1a000 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
1a010 20 20 20 20 20 20 6f 70 43 6f 6d 70 61 72 65 2e        opCompare.
1a020 6f 70 20 3d 20 54 4b 5f 45 51 3b 0a 20 20 20 20  op = TK_EQ;.    
1a030 20 20 20 20 6f 70 43 6f 6d 70 61 72 65 2e 70 4c      opCompare.pL
1a040 65 66 74 20 3d 20 26 74 65 6d 70 58 3b 0a 20 20  eft = &tempX;.  
1a050 20 20 20 20 20 20 70 54 65 73 74 20 3d 20 26 6f        pTest = &o
1a060 70 43 6f 6d 70 61 72 65 3b 0a 20 20 20 20 20 20  pCompare;.      
1a070 20 20 2f 2a 20 54 69 63 6b 65 74 20 62 33 35 31    /* Ticket b351
1a080 64 39 35 66 39 63 64 35 65 66 31 37 65 39 64 39  d95f9cd5ef17e9d9
1a090 64 62 61 65 31 38 66 35 63 61 38 36 31 31 31 39  dbae18f5ca861119
1a0a0 30 30 30 31 3a 0a 20 20 20 20 20 20 20 20 2a 2a  0001:.        **
1a0b0 20 54 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65   The value in re
1a0c0 67 46 72 65 65 31 20 6d 69 67 68 74 20 67 65 74  gFree1 might get
1a0d0 20 53 43 6f 70 79 2d 65 64 20 69 6e 74 6f 20 74   SCopy-ed into t
1a0e0 68 65 20 66 69 6c 65 20 72 65 73 75 6c 74 2e 0a  he file result..
1a0f0 20 20 20 20 20 20 20 20 2a 2a 20 53 6f 20 6d 61          ** So ma
1a100 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65  ke sure that the
1a110 20 72 65 67 46 72 65 65 31 20 72 65 67 69 73 74   regFree1 regist
1a120 65 72 20 69 73 20 6e 6f 74 20 72 65 75 73 65 64  er is not reused
1a130 20 66 6f 72 20 6f 74 68 65 72 0a 20 20 20 20 20   for other.     
1a140 20 20 20 2a 2a 20 70 75 72 70 6f 73 65 73 20 61     ** purposes a
1a150 6e 64 20 70 6f 73 73 69 62 6c 79 20 6f 76 65 72  nd possibly over
1a160 77 72 69 74 74 65 6e 2e 20 20 2a 2f 0a 20 20 20  written.  */.   
1a170 20 20 20 20 20 72 65 67 46 72 65 65 31 20 3d 20       regFree1 = 
1a180 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
1a190 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70   for(i=0; i<nExp
1a1a0 72 2d 31 3b 20 69 3d 69 2b 32 29 7b 0a 20 20 20  r-1; i=i+2){.   
1a1b0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1a1c0 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65  CachePush(pParse
1a1d0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
1a1e0 58 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  X ){.          a
1a1f0 73 73 65 72 74 28 20 70 54 65 73 74 21 3d 30 20  ssert( pTest!=0 
1a200 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6f 70 43  );.          opC
1a210 6f 6d 70 61 72 65 2e 70 52 69 67 68 74 20 3d 20  ompare.pRight = 
1a220 61 4c 69 73 74 65 6c 65 6d 5b 69 5d 2e 70 45 78  aListelem[i].pEx
1a230 70 72 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  pr;.        }els
1a240 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 54 65  e{.          pTe
1a250 73 74 20 3d 20 61 4c 69 73 74 65 6c 65 6d 5b 69  st = aListelem[i
1a260 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ].pExpr;.       
1a270 20 7d 0a 20 20 20 20 20 20 20 20 6e 65 78 74 43   }.        nextC
1a280 61 73 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ase = sqlite3Vdb
1a290 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
1a2a0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
1a2b0 20 70 54 65 73 74 2d 3e 6f 70 3d 3d 54 4b 5f 43   pTest->op==TK_C
1a2c0 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 20  OLUMN );.       
1a2d0 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
1a2e0 6c 73 65 28 70 50 61 72 73 65 2c 20 70 54 65 73  lse(pParse, pTes
1a2f0 74 2c 20 6e 65 78 74 43 61 73 65 2c 20 53 51 4c  t, nextCase, SQL
1a300 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b  ITE_JUMPIFNULL);
1a310 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
1a320 65 28 20 61 4c 69 73 74 65 6c 65 6d 5b 69 2b 31  e( aListelem[i+1
1a330 5d 2e 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ].pExpr->op==TK_
1a340 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20  COLUMN );.      
1a350 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
1a360 65 28 70 50 61 72 73 65 2c 20 61 4c 69 73 74 65  e(pParse, aListe
1a370 6c 65 6d 5b 69 2b 31 5d 2e 70 45 78 70 72 2c 20  lem[i+1].pExpr, 
1a380 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20  target);.       
1a390 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1a3a0 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
1a3b0 2c 20 65 6e 64 4c 61 62 65 6c 29 3b 0a 20 20 20  , endLabel);.   
1a3c0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1a3d0 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 29  CachePop(pParse)
1a3e0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
1a3f0 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
1a400 6c 28 76 2c 20 6e 65 78 74 43 61 73 65 29 3b 0a  l(v, nextCase);.
1a410 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
1a420 28 20 28 6e 45 78 70 72 26 31 29 21 3d 30 20 29  ( (nExpr&1)!=0 )
1a430 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1a440 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70  3ExprCachePush(p
1a450 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
1a460 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
1a470 70 50 61 72 73 65 2c 20 70 45 4c 69 73 74 2d 3e  pParse, pEList->
1a480 61 5b 6e 45 78 70 72 2d 31 5d 2e 70 45 78 70 72  a[nExpr-1].pExpr
1a490 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
1a4a0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
1a4b0 63 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a  chePop(pParse);.
1a4c0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1a4d0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1a4e0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp2(v, OP_Nul
1a4f0 6c 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20  l, 0, target);. 
1a500 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
1a510 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ert( db->mallocF
1a520 61 69 6c 65 64 20 7c 7c 20 70 50 61 72 73 65 2d  ailed || pParse-
1a530 3e 6e 45 72 72 3e 30 20 0a 20 20 20 20 20 20 20  >nErr>0 .       
1a540 20 20 20 20 7c 7c 20 70 50 61 72 73 65 2d 3e 69      || pParse->i
1a550 43 61 63 68 65 4c 65 76 65 6c 3d 3d 69 43 61 63  CacheLevel==iCac
1a560 68 65 4c 65 76 65 6c 20 29 3b 0a 20 20 20 20 20  heLevel );.     
1a570 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
1a580 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65 6e 64 4c  lveLabel(v, endL
1a590 61 62 65 6c 29 3b 0a 20 20 20 20 20 20 62 72 65  abel);.      bre
1a5a0 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  ak;.    }.#ifnde
1a5b0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  f SQLITE_OMIT_TR
1a5c0 49 47 47 45 52 0a 20 20 20 20 63 61 73 65 20 54  IGGER.    case T
1a5d0 4b 5f 52 41 49 53 45 3a 20 7b 0a 20 20 20 20 20  K_RAISE: {.     
1a5e0 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
1a5f0 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 52 6f 6c  affinity==OE_Rol
1a600 6c 62 61 63 6b 20 0a 20 20 20 20 20 20 20 20 20  lback .         
1a610 20 20 7c 7c 20 70 45 78 70 72 2d 3e 61 66 66 69    || pExpr->affi
1a620 6e 69 74 79 3d 3d 4f 45 5f 41 62 6f 72 74 0a 20  nity==OE_Abort. 
1a630 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 45 78            || pEx
1a640 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45  pr->affinity==OE
1a650 5f 46 61 69 6c 0a 20 20 20 20 20 20 20 20 20 20  _Fail.          
1a660 20 7c 7c 20 70 45 78 70 72 2d 3e 61 66 66 69 6e   || pExpr->affin
1a670 69 74 79 3d 3d 4f 45 5f 49 67 6e 6f 72 65 0a 20  ity==OE_Ignore. 
1a680 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 69 66       );.      if
1a690 28 20 21 70 50 61 72 73 65 2d 3e 70 54 72 69 67  ( !pParse->pTrig
1a6a0 67 65 72 54 61 62 20 29 7b 0a 20 20 20 20 20 20  gerTab ){.      
1a6b0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
1a6c0 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  g(pParse,.      
1a6d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a6e0 20 22 52 41 49 53 45 28 29 20 6d 61 79 20 6f 6e   "RAISE() may on
1a6f0 6c 79 20 62 65 20 75 73 65 64 20 77 69 74 68 69  ly be used withi
1a700 6e 20 61 20 74 72 69 67 67 65 72 2d 70 72 6f 67  n a trigger-prog
1a710 72 61 6d 22 29 3b 0a 20 20 20 20 20 20 20 20 72  ram");.        r
1a720 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d  eturn 0;.      }
1a730 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
1a740 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 41  ->affinity==OE_A
1a750 62 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20  bort ){.        
1a760 73 71 6c 69 74 65 33 4d 61 79 41 62 6f 72 74 28  sqlite3MayAbort(
1a770 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 7d  pParse);.      }
1a780 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
1a790 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
1a7a0 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c  pExpr, EP_IntVal
1a7b0 75 65 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ue) );.      if(
1a7c0 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79   pExpr->affinity
1a7d0 3d 3d 4f 45 5f 49 67 6e 6f 72 65 20 29 7b 0a 20  ==OE_Ignore ){. 
1a7e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
1a7f0 62 65 41 64 64 4f 70 34 28 0a 20 20 20 20 20 20  beAddOp4(.      
1a800 20 20 20 20 20 20 76 2c 20 4f 50 5f 48 61 6c 74        v, OP_Halt
1a810 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 4f 45 5f  , SQLITE_OK, OE_
1a820 49 67 6e 6f 72 65 2c 20 30 2c 20 70 45 78 70 72  Ignore, 0, pExpr
1a830 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 30 29 3b 0a 20  ->u.zToken,0);. 
1a840 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
1a850 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 7d 65  age(v);.      }e
1a860 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
1a870 69 74 65 33 48 61 6c 74 43 6f 6e 73 74 72 61 69  ite3HaltConstrai
1a880 6e 74 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  nt(pParse, SQLIT
1a890 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 54 52 49  E_CONSTRAINT_TRI
1a8a0 47 47 45 52 2c 0a 20 20 20 20 20 20 20 20 20 20  GGER,.          
1a8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a8c0 20 20 20 20 70 45 78 70 72 2d 3e 61 66 66 69 6e      pExpr->affin
1a8d0 69 74 79 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54  ity, pExpr->u.zT
1a8e0 6f 6b 65 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 20  oken, 0, 0);.   
1a8f0 20 20 20 7d 0a 0a 20 20 20 20 20 20 62 72 65 61     }..      brea
1a900 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
1a910 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c    }.  sqlite3Rel
1a920 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
1a930 73 65 2c 20 72 65 67 46 72 65 65 31 29 3b 0a 20  se, regFree1);. 
1a940 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
1a950 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
1a960 65 67 46 72 65 65 32 29 3b 0a 20 20 72 65 74 75  egFree2);.  retu
1a970 72 6e 20 69 6e 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a  rn inReg;.}../*.
1a980 2a 2a 20 46 61 63 74 6f 72 20 6f 75 74 20 74 68  ** Factor out th
1a990 65 20 63 6f 64 65 20 6f 66 20 74 68 65 20 67 69  e code of the gi
1a9a0 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74  ven expression t
1a9b0 6f 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  o initialization
1a9c0 20 74 69 6d 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73   time..*/.void s
1a9d0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 41 74  qlite3ExprCodeAt
1a9e0 49 6e 69 74 28 0a 20 20 50 61 72 73 65 20 2a 70  Init(.  Parse *p
1a9f0 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72  Parse,    /* Par
1aa00 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
1aa10 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20    Expr *pExpr,  
1aa20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65      /* The expre
1aa30 73 73 69 6f 6e 20 74 6f 20 63 6f 64 65 20 77 68  ssion to code wh
1aa40 65 6e 20 74 68 65 20 56 44 42 45 20 69 6e 69 74  en the VDBE init
1aa50 69 61 6c 69 7a 65 73 20 2a 2f 0a 20 20 69 6e 74  ializes */.  int
1aa60 20 72 65 67 44 65 73 74 2c 20 20 20 20 20 20 2f   regDest,      /
1aa70 2a 20 53 74 6f 72 65 20 74 68 65 20 76 61 6c 75  * Store the valu
1aa80 65 20 69 6e 20 74 68 69 73 20 72 65 67 69 73 74  e in this regist
1aa90 65 72 20 2a 2f 0a 20 20 75 38 20 72 65 75 73 61  er */.  u8 reusa
1aaa0 62 6c 65 20 20 20 20 20 20 20 2f 2a 20 54 72 75  ble       /* Tru
1aab0 65 20 69 66 20 74 68 69 73 20 65 78 70 72 65 73  e if this expres
1aac0 73 69 6f 6e 20 69 73 20 72 65 75 73 61 62 6c 65  sion is reusable
1aad0 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 4c 69 73   */.){.  ExprLis
1aae0 74 20 2a 70 3b 0a 20 20 61 73 73 65 72 74 28 20  t *p;.  assert( 
1aaf0 43 6f 6e 73 74 46 61 63 74 6f 72 4f 6b 28 70 50  ConstFactorOk(pP
1ab00 61 72 73 65 29 20 29 3b 0a 20 20 70 20 3d 20 70  arse) );.  p = p
1ab10 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74 45 78 70  Parse->pConstExp
1ab20 72 3b 0a 20 20 70 45 78 70 72 20 3d 20 73 71 6c  r;.  pExpr = sql
1ab30 69 74 65 33 45 78 70 72 44 75 70 28 70 50 61 72  ite3ExprDup(pPar
1ab40 73 65 2d 3e 64 62 2c 20 70 45 78 70 72 2c 20 30  se->db, pExpr, 0
1ab50 29 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33  );.  p = sqlite3
1ab60 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
1ab70 50 61 72 73 65 2c 20 70 2c 20 70 45 78 70 72 29  Parse, p, pExpr)
1ab80 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  ;.  if( p ){.   
1ab90 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
1aba0 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20  t_item *pItem = 
1abb0 26 70 2d 3e 61 5b 70 2d 3e 6e 45 78 70 72 2d 31  &p->a[p->nExpr-1
1abc0 5d 3b 0a 20 20 20 20 20 70 49 74 65 6d 2d 3e 75  ];.     pItem->u
1abd0 2e 69 43 6f 6e 73 74 45 78 70 72 52 65 67 20 3d  .iConstExprReg =
1abe0 20 72 65 67 44 65 73 74 3b 0a 20 20 20 20 20 70   regDest;.     p
1abf0 49 74 65 6d 2d 3e 72 65 75 73 61 62 6c 65 20 3d  Item->reusable =
1ac00 20 72 65 75 73 61 62 6c 65 3b 0a 20 20 7d 0a 20   reusable;.  }. 
1ac10 20 70 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74 45   pParse->pConstE
1ac20 78 70 72 20 3d 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  xpr = p;.}../*.*
1ac30 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
1ac40 74 6f 20 65 76 61 6c 75 61 74 65 20 61 6e 20 65  to evaluate an e
1ac50 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 73 74  xpression and st
1ac60 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 0a  ore the results.
1ac70 2a 2a 20 69 6e 74 6f 20 61 20 72 65 67 69 73 74  ** into a regist
1ac80 65 72 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  er.  Return the 
1ac90 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72 20  register number 
1aca0 77 68 65 72 65 20 74 68 65 20 72 65 73 75 6c 74  where the result
1acb0 73 0a 2a 2a 20 61 72 65 20 73 74 6f 72 65 64 2e  s.** are stored.
1acc0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65  .**.** If the re
1acd0 67 69 73 74 65 72 20 69 73 20 61 20 74 65 6d 70  gister is a temp
1ace0 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 20 74  orary register t
1acf0 68 61 74 20 63 61 6e 20 62 65 20 64 65 61 6c 6c  hat can be deall
1ad00 6f 63 61 74 65 64 2c 0a 2a 2a 20 74 68 65 6e 20  ocated,.** then 
1ad10 77 72 69 74 65 20 69 74 73 20 6e 75 6d 62 65 72  write its number
1ad20 20 69 6e 74 6f 20 2a 70 52 65 67 2e 20 20 49 66   into *pReg.  If
1ad30 20 74 68 65 20 72 65 73 75 6c 74 20 72 65 67 69   the result regi
1ad40 73 74 65 72 20 69 73 20 6e 6f 74 0a 2a 2a 20 61  ster is not.** a
1ad50 20 74 65 6d 70 6f 72 61 72 79 2c 20 74 68 65 6e   temporary, then
1ad60 20 73 65 74 20 2a 70 52 65 67 20 74 6f 20 7a 65   set *pReg to ze
1ad70 72 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78  ro..**.** If pEx
1ad80 70 72 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74  pr is a constant
1ad90 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74  , then this rout
1ada0 69 6e 65 20 6d 69 67 68 74 20 67 65 6e 65 72 61  ine might genera
1adb0 74 65 20 74 68 69 73 0a 2a 2a 20 63 6f 64 65 20  te this.** code 
1adc0 74 6f 20 66 69 6c 6c 20 74 68 65 20 72 65 67 69  to fill the regi
1add0 73 74 65 72 20 69 6e 20 74 68 65 20 69 6e 69 74  ster in the init
1ade0 69 61 6c 69 7a 61 74 69 6f 6e 20 73 65 63 74 69  ialization secti
1adf0 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a 20 56 44 42  on of the.** VDB
1ae00 45 20 70 72 6f 67 72 61 6d 2c 20 69 6e 20 6f 72  E program, in or
1ae10 64 65 72 20 74 6f 20 66 61 63 74 6f 72 20 69 74  der to factor it
1ae20 20 6f 75 74 20 6f 66 20 74 68 65 20 65 76 61 6c   out of the eval
1ae30 75 61 74 69 6f 6e 20 6c 6f 6f 70 2e 0a 2a 2f 0a  uation loop..*/.
1ae40 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43  int sqlite3ExprC
1ae50 6f 64 65 54 65 6d 70 28 50 61 72 73 65 20 2a 70  odeTemp(Parse *p
1ae60 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
1ae70 70 72 2c 20 69 6e 74 20 2a 70 52 65 67 29 7b 0a  pr, int *pReg){.
1ae80 20 20 69 6e 74 20 72 32 3b 0a 20 20 70 45 78 70    int r2;.  pExp
1ae90 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53  r = sqlite3ExprS
1aea0 6b 69 70 43 6f 6c 6c 61 74 65 28 70 45 78 70 72  kipCollate(pExpr
1aeb0 29 3b 0a 20 20 69 66 28 20 43 6f 6e 73 74 46 61  );.  if( ConstFa
1aec0 63 74 6f 72 4f 6b 28 70 50 61 72 73 65 29 0a 20  ctorOk(pParse). 
1aed0 20 20 26 26 20 70 45 78 70 72 2d 3e 6f 70 21 3d    && pExpr->op!=
1aee0 54 4b 5f 52 45 47 49 53 54 45 52 0a 20 20 20 26  TK_REGISTER.   &
1aef0 26 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43  & sqlite3ExprIsC
1af00 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 70  onstantNotJoin(p
1af10 45 78 70 72 29 0a 20 20 29 7b 0a 20 20 20 20 45  Expr).  ){.    E
1af20 78 70 72 4c 69 73 74 20 2a 70 20 3d 20 70 50 61  xprList *p = pPa
1af30 72 73 65 2d 3e 70 43 6f 6e 73 74 45 78 70 72 3b  rse->pConstExpr;
1af40 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
1af50 2a 70 52 65 67 20 20 3d 20 30 3b 0a 20 20 20 20  *pReg  = 0;.    
1af60 69 66 28 20 70 20 29 7b 0a 20 20 20 20 20 20 73  if( p ){.      s
1af70 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
1af80 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20  tem *pItem;.    
1af90 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 2d 3e 61    for(pItem=p->a
1afa0 2c 20 69 3d 70 2d 3e 6e 45 78 70 72 3b 20 69 3e  , i=p->nExpr; i>
1afb0 30 3b 20 70 49 74 65 6d 2b 2b 2c 20 69 2d 2d 29  0; pItem++, i--)
1afc0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49  {.        if( pI
1afd0 74 65 6d 2d 3e 72 65 75 73 61 62 6c 65 20 26 26  tem->reusable &&
1afe0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70   sqlite3ExprComp
1aff0 61 72 65 28 70 49 74 65 6d 2d 3e 70 45 78 70 72  are(pItem->pExpr
1b000 2c 70 45 78 70 72 2c 2d 31 29 3d 3d 30 20 29 7b  ,pExpr,-1)==0 ){
1b010 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
1b020 6e 20 70 49 74 65 6d 2d 3e 75 2e 69 43 6f 6e 73  n pItem->u.iCons
1b030 74 45 78 70 72 52 65 67 3b 0a 20 20 20 20 20 20  tExprReg;.      
1b040 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1b050 7d 0a 20 20 20 20 72 32 20 3d 20 2b 2b 70 50 61  }.    r2 = ++pPa
1b060 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73  rse->nMem;.    s
1b070 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 41 74  qlite3ExprCodeAt
1b080 49 6e 69 74 28 70 50 61 72 73 65 2c 20 70 45 78  Init(pParse, pEx
1b090 70 72 2c 20 72 32 2c 20 31 29 3b 0a 20 20 7d 65  pr, r2, 1);.  }e
1b0a0 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 72 31 20  lse{.    int r1 
1b0b0 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
1b0c0 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
1b0d0 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r2 = sqlite3Exp
1b0e0 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72  rCodeTarget(pPar
1b0f0 73 65 2c 20 70 45 78 70 72 2c 20 72 31 29 3b 0a  se, pExpr, r1);.
1b100 20 20 20 20 69 66 28 20 72 32 3d 3d 72 31 20 29      if( r2==r1 )
1b110 7b 0a 20 20 20 20 20 20 2a 70 52 65 67 20 3d 20  {.      *pReg = 
1b120 72 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  r1;.    }else{. 
1b130 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
1b140 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
1b150 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 2a 70  e, r1);.      *p
1b160 52 65 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  Reg = 0;.    }. 
1b170 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 32 3b 0a   }.  return r2;.
1b180 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
1b190 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
1b1a0 20 65 76 61 6c 75 61 74 65 20 65 78 70 72 65 73   evaluate expres
1b1b0 73 69 6f 6e 20 70 45 78 70 72 20 61 6e 64 20 73  sion pExpr and s
1b1c0 74 6f 72 65 20 74 68 65 0a 2a 2a 20 72 65 73 75  tore the.** resu
1b1d0 6c 74 73 20 69 6e 20 72 65 67 69 73 74 65 72 20  lts in register 
1b1e0 74 61 72 67 65 74 2e 20 20 54 68 65 20 72 65 73  target.  The res
1b1f0 75 6c 74 73 20 61 72 65 20 67 75 61 72 61 6e 74  ults are guarant
1b200 65 65 64 20 74 6f 20 61 70 70 65 61 72 0a 2a 2a  eed to appear.**
1b210 20 69 6e 20 72 65 67 69 73 74 65 72 20 74 61 72   in register tar
1b220 67 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  get..*/.void sql
1b230 69 74 65 33 45 78 70 72 43 6f 64 65 28 50 61 72  ite3ExprCode(Par
1b240 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
1b250 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 74 61 72   *pExpr, int tar
1b260 67 65 74 29 7b 0a 20 20 69 6e 74 20 69 6e 52 65  get){.  int inRe
1b270 67 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 74 61  g;..  assert( ta
1b280 72 67 65 74 3e 30 20 26 26 20 74 61 72 67 65 74  rget>0 && target
1b290 3c 3d 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 29  <=pParse->nMem )
1b2a0 3b 0a 20 20 69 66 28 20 70 45 78 70 72 20 26 26  ;.  if( pExpr &&
1b2b0 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 52   pExpr->op==TK_R
1b2c0 45 47 49 53 54 45 52 20 29 7b 0a 20 20 20 20 73  EGISTER ){.    s
1b2d0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1b2e0 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20  (pParse->pVdbe, 
1b2f0 4f 50 5f 43 6f 70 79 2c 20 70 45 78 70 72 2d 3e  OP_Copy, pExpr->
1b300 69 54 61 62 6c 65 2c 20 74 61 72 67 65 74 29 3b  iTable, target);
1b310 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
1b320 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Reg = sqlite3Exp
1b330 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72  rCodeTarget(pPar
1b340 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65  se, pExpr, targe
1b350 74 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  t);.    assert( 
1b360 70 50 61 72 73 65 2d 3e 70 56 64 62 65 20 7c 7c  pParse->pVdbe ||
1b370 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
1b380 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20  locFailed );.   
1b390 20 69 66 28 20 69 6e 52 65 67 21 3d 74 61 72 67   if( inReg!=targ
1b3a0 65 74 20 26 26 20 70 50 61 72 73 65 2d 3e 70 56  et && pParse->pV
1b3b0 64 62 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  dbe ){.      sql
1b3c0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 70  ite3VdbeAddOp2(p
1b3d0 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50  Parse->pVdbe, OP
1b3e0 5f 53 43 6f 70 79 2c 20 69 6e 52 65 67 2c 20 74  _SCopy, inReg, t
1b3f0 61 72 67 65 74 29 3b 0a 20 20 20 20 7d 0a 20 20  arget);.    }.  
1b400 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  }.}../*.** Gener
1b410 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69  ate code that wi
1b420 6c 6c 20 65 76 61 6c 75 61 74 65 20 65 78 70 72  ll evaluate expr
1b430 65 73 73 69 6f 6e 20 70 45 78 70 72 20 61 6e 64  ession pExpr and
1b440 20 73 74 6f 72 65 20 74 68 65 0a 2a 2a 20 72 65   store the.** re
1b450 73 75 6c 74 73 20 69 6e 20 72 65 67 69 73 74 65  sults in registe
1b460 72 20 74 61 72 67 65 74 2e 20 20 54 68 65 20 72  r target.  The r
1b470 65 73 75 6c 74 73 20 61 72 65 20 67 75 61 72 61  esults are guara
1b480 6e 74 65 65 64 20 74 6f 20 61 70 70 65 61 72 0a  nteed to appear.
1b490 2a 2a 20 69 6e 20 72 65 67 69 73 74 65 72 20 74  ** in register t
1b4a0 61 72 67 65 74 2e 20 20 49 66 20 74 68 65 20 65  arget.  If the e
1b4b0 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e  xpression is con
1b4c0 73 74 61 6e 74 2c 20 74 68 65 6e 20 74 68 69 73  stant, then this
1b4d0 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 6d 69 67 68   routine.** migh
1b4e0 74 20 63 68 6f 6f 73 65 20 74 6f 20 63 6f 64 65  t choose to code
1b4f0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
1b500 61 74 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  at initializatio
1b510 6e 20 74 69 6d 65 2e 0a 2a 2f 0a 76 6f 69 64 20  n time..*/.void 
1b520 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 46  sqlite3ExprCodeF
1b530 61 63 74 6f 72 61 62 6c 65 28 50 61 72 73 65 20  actorable(Parse 
1b540 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
1b550 45 78 70 72 2c 20 69 6e 74 20 74 61 72 67 65 74  Expr, int target
1b560 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  ){.  if( pParse-
1b570 3e 6f 6b 43 6f 6e 73 74 46 61 63 74 6f 72 20 26  >okConstFactor &
1b580 26 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43  & sqlite3ExprIsC
1b590 6f 6e 73 74 61 6e 74 28 70 45 78 70 72 29 20 29  onstant(pExpr) )
1b5a0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
1b5b0 72 43 6f 64 65 41 74 49 6e 69 74 28 70 50 61 72  rCodeAtInit(pPar
1b5c0 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65  se, pExpr, targe
1b5d0 74 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  t, 0);.  }else{.
1b5e0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
1b5f0 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
1b600 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 7d 0a  r, target);.  }.
1b610 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
1b620 65 20 63 6f 64 65 20 74 68 61 74 20 65 76 61 6c  e code that eval
1b630 75 61 74 65 73 20 74 68 65 20 67 69 76 65 6e 20  uates the given 
1b640 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 70  expression and p
1b650 75 74 73 20 74 68 65 20 72 65 73 75 6c 74 0a 2a  uts the result.*
1b660 2a 20 69 6e 20 72 65 67 69 73 74 65 72 20 74 61  * in register ta
1b670 72 67 65 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f  rget..**.** Also
1b680 20 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20   make a copy of 
1b690 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 72  the expression r
1b6a0 65 73 75 6c 74 73 20 69 6e 74 6f 20 61 6e 6f 74  esults into anot
1b6b0 68 65 72 20 22 63 61 63 68 65 22 20 72 65 67 69  her "cache" regi
1b6c0 73 74 65 72 0a 2a 2a 20 61 6e 64 20 6d 6f 64 69  ster.** and modi
1b6d0 66 79 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  fy the expressio
1b6e0 6e 20 73 6f 20 74 68 61 74 20 74 68 65 20 6e 65  n so that the ne
1b6f0 78 74 20 74 69 6d 65 20 69 74 20 69 73 20 65 76  xt time it is ev
1b700 61 6c 75 61 74 65 64 2c 0a 2a 2a 20 74 68 65 20  aluated,.** the 
1b710 72 65 73 75 6c 74 20 69 73 20 61 20 63 6f 70 79  result is a copy
1b720 20 6f 66 20 74 68 65 20 63 61 63 68 65 20 72 65   of the cache re
1b730 67 69 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  gister..**.** Th
1b740 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
1b750 65 64 20 66 6f 72 20 65 78 70 72 65 73 73 69 6f  ed for expressio
1b760 6e 73 20 74 68 61 74 20 61 72 65 20 75 73 65 64  ns that are used
1b770 20 6d 75 6c 74 69 70 6c 65 20 0a 2a 2a 20 74 69   multiple .** ti
1b780 6d 65 73 2e 20 20 54 68 65 79 20 61 72 65 20 65  mes.  They are e
1b790 76 61 6c 75 61 74 65 64 20 6f 6e 63 65 20 61 6e  valuated once an
1b7a0 64 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66  d the results of
1b7b0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a   the expression.
1b7c0 2a 2a 20 61 72 65 20 72 65 75 73 65 64 2e 0a 2a  ** are reused..*
1b7d0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
1b7e0 70 72 43 6f 64 65 41 6e 64 43 61 63 68 65 28 50  prCodeAndCache(P
1b7f0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
1b800 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 74  pr *pExpr, int t
1b810 61 72 67 65 74 29 7b 0a 20 20 56 64 62 65 20 2a  arget){.  Vdbe *
1b820 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
1b830 65 3b 0a 20 20 69 6e 74 20 69 4d 65 6d 3b 0a 0a  e;.  int iMem;..
1b840 20 20 61 73 73 65 72 74 28 20 74 61 72 67 65 74    assert( target
1b850 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
1b860 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 52 45  pExpr->op!=TK_RE
1b870 47 49 53 54 45 52 20 29 3b 0a 20 20 73 71 6c 69  GISTER );.  sqli
1b880 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
1b890 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65  se, pExpr, targe
1b8a0 74 29 3b 0a 20 20 69 4d 65 6d 20 3d 20 2b 2b 70  t);.  iMem = ++p
1b8b0 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 73  Parse->nMem;.  s
1b8c0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1b8d0 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 74 61 72  (v, OP_Copy, tar
1b8e0 67 65 74 2c 20 69 4d 65 6d 29 3b 0a 20 20 65 78  get, iMem);.  ex
1b8f0 70 72 54 6f 52 65 67 69 73 74 65 72 28 70 45 78  prToRegister(pEx
1b900 70 72 2c 20 69 4d 65 6d 29 3b 0a 7d 0a 0a 23 69  pr, iMem);.}..#i
1b910 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
1b920 5f 45 4e 41 42 4c 45 5f 54 52 45 45 5f 45 58 50  _ENABLE_TREE_EXP
1b930 4c 41 49 4e 29 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  LAIN)./*.** Gene
1b940 72 61 74 65 20 61 20 68 75 6d 61 6e 2d 72 65 61  rate a human-rea
1b950 64 61 62 6c 65 20 65 78 70 6c 61 6e 61 74 69 6f  dable explanatio
1b960 6e 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69  n of an expressi
1b970 6f 6e 20 74 72 65 65 2e 0a 2a 2f 0a 76 6f 69 64  on tree..*/.void
1b980 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45   sqlite3ExplainE
1b990 78 70 72 28 56 64 62 65 20 2a 70 4f 75 74 2c 20  xpr(Vdbe *pOut, 
1b9a0 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
1b9b0 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20  int op;         
1b9c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1b9d0 20 6f 70 63 6f 64 65 20 62 65 69 6e 67 20 63 6f   opcode being co
1b9e0 64 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ded */.  const c
1b9f0 68 61 72 20 2a 7a 42 69 6e 4f 70 20 3d 20 30 3b  har *zBinOp = 0;
1ba00 20 20 20 2f 2a 20 42 69 6e 61 72 79 20 6f 70 65     /* Binary ope
1ba10 72 61 74 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73 74  rator */.  const
1ba20 20 63 68 61 72 20 2a 7a 55 6e 69 4f 70 20 3d 20   char *zUniOp = 
1ba30 30 3b 20 20 20 2f 2a 20 55 6e 61 72 79 20 6f 70  0;   /* Unary op
1ba40 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69 66 28 20  erator */.  if( 
1ba50 70 45 78 70 72 3d 3d 30 20 29 7b 0a 20 20 20 20  pExpr==0 ){.    
1ba60 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20  op = TK_NULL;.  
1ba70 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 70 20 3d 20  }else{.    op = 
1ba80 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 7d 0a 20  pExpr->op;.  }. 
1ba90 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20   switch( op ){. 
1baa0 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 43     case TK_AGG_C
1bab0 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 73  OLUMN: {.      s
1bac0 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69  qlite3ExplainPri
1bad0 6e 74 66 28 70 4f 75 74 2c 20 22 41 47 47 7b 25  ntf(pOut, "AGG{%
1bae0 64 3a 25 64 7d 22 2c 0a 20 20 20 20 20 20 20 20  d:%d}",.        
1baf0 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c      pExpr->iTabl
1bb00 65 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  e, pExpr->iColum
1bb10 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  n);.      break;
1bb20 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1bb30 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20  TK_COLUMN: {.   
1bb40 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 54     if( pExpr->iT
1bb50 61 62 6c 65 3c 30 20 29 7b 0a 20 20 20 20 20 20  able<0 ){.      
1bb60 20 20 2f 2a 20 54 68 69 73 20 6f 6e 6c 79 20 68    /* This only h
1bb70 61 70 70 65 6e 73 20 77 68 65 6e 20 63 6f 64 69  appens when codi
1bb80 6e 67 20 63 68 65 63 6b 20 63 6f 6e 73 74 72 61  ng check constra
1bb90 69 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  ints */.        
1bba0 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
1bbb0 69 6e 74 66 28 70 4f 75 74 2c 20 22 43 4f 4c 55  intf(pOut, "COLU
1bbc0 4d 4e 28 25 64 29 22 2c 20 70 45 78 70 72 2d 3e  MN(%d)", pExpr->
1bbd0 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20  iColumn);.      
1bbe0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
1bbf0 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69  qlite3ExplainPri
1bc00 6e 74 66 28 70 4f 75 74 2c 20 22 7b 25 64 3a 25  ntf(pOut, "{%d:%
1bc10 64 7d 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  d}",.           
1bc20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bc30 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c    pExpr->iTable,
1bc40 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29   pExpr->iColumn)
1bc50 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1bc60 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1bc70 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52   case TK_INTEGER
1bc80 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45  : {.      if( pE
1bc90 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  xpr->flags & EP_
1bca0 49 6e 74 56 61 6c 75 65 20 29 7b 0a 20 20 20 20  IntValue ){.    
1bcb0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
1bcc0 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22  inPrintf(pOut, "
1bcd0 25 64 22 2c 20 70 45 78 70 72 2d 3e 75 2e 69 56  %d", pExpr->u.iV
1bce0 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c  alue);.      }el
1bcf0 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
1bd00 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
1bd10 28 70 4f 75 74 2c 20 22 25 73 22 2c 20 70 45 78  (pOut, "%s", pEx
1bd20 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20  pr->u.zToken);. 
1bd30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
1bd40 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  ak;.    }.#ifnde
1bd50 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c  f SQLITE_OMIT_FL
1bd60 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20  OATING_POINT.   
1bd70 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 20   case TK_FLOAT: 
1bd80 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
1bd90 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75  xplainPrintf(pOu
1bda0 74 2c 22 25 73 22 2c 20 70 45 78 70 72 2d 3e 75  t,"%s", pExpr->u
1bdb0 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20  .zToken);.      
1bdc0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
1bdd0 64 69 66 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  dif.    case TK_
1bde0 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20  STRING: {.      
1bdf0 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
1be00 69 6e 74 66 28 70 4f 75 74 2c 22 25 51 22 2c 20  intf(pOut,"%Q", 
1be10 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29  pExpr->u.zToken)
1be20 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1be30 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
1be40 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 73  _NULL: {.      s
1be50 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69  qlite3ExplainPri
1be60 6e 74 66 28 70 4f 75 74 2c 22 4e 55 4c 4c 22 29  ntf(pOut,"NULL")
1be70 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1be80 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
1be90 49 54 45 5f 4f 4d 49 54 5f 42 4c 4f 42 5f 4c 49  ITE_OMIT_BLOB_LI
1bea0 54 45 52 41 4c 0a 20 20 20 20 63 61 73 65 20 54  TERAL.    case T
1beb0 4b 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20  K_BLOB: {.      
1bec0 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
1bed0 69 6e 74 66 28 70 4f 75 74 2c 22 25 73 22 2c 20  intf(pOut,"%s", 
1bee0 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29  pExpr->u.zToken)
1bef0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1bf00 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
1bf10 63 61 73 65 20 54 4b 5f 56 41 52 49 41 42 4c 45  case TK_VARIABLE
1bf20 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
1bf30 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70  3ExplainPrintf(p
1bf40 4f 75 74 2c 22 56 41 52 49 41 42 4c 45 28 25 73  Out,"VARIABLE(%s
1bf50 2c 25 64 29 22 2c 0a 20 20 20 20 20 20 20 20 20  ,%d)",.         
1bf60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bf70 20 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65    pExpr->u.zToke
1bf80 6e 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  n, pExpr->iColum
1bf90 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  n);.      break;
1bfa0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1bfb0 54 4b 5f 52 45 47 49 53 54 45 52 3a 20 7b 0a 20  TK_REGISTER: {. 
1bfc0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c       sqlite3Expl
1bfd0 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 22  ainPrintf(pOut,"
1bfe0 52 45 47 49 53 54 45 52 28 25 64 29 22 2c 20 70  REGISTER(%d)", p
1bff0 45 78 70 72 2d 3e 69 54 61 62 6c 65 29 3b 0a 20  Expr->iTable);. 
1c000 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1c010 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 53  }.    case TK_AS
1c020 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
1c030 33 45 78 70 6c 61 69 6e 45 78 70 72 28 70 4f 75  3ExplainExpr(pOu
1c040 74 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  t, pExpr->pLeft)
1c050 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1c060 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
1c070 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54 0a 20 20  ITE_OMIT_CAST.  
1c080 20 20 63 61 73 65 20 54 4b 5f 43 41 53 54 3a 20    case TK_CAST: 
1c090 7b 0a 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65  {.      /* Expre
1c0a0 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 66 6f  ssions of the fo
1c0b0 72 6d 3a 20 20 20 43 41 53 54 28 70 4c 65 66 74  rm:   CAST(pLeft
1c0c0 20 41 53 20 74 6f 6b 65 6e 29 20 2a 2f 0a 20 20   AS token) */.  
1c0d0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
1c0e0 7a 41 66 66 20 3d 20 22 75 6e 6b 22 3b 0a 20 20  zAff = "unk";.  
1c0f0 20 20 20 20 73 77 69 74 63 68 28 20 73 71 6c 69      switch( sqli
1c100 74 65 33 41 66 66 69 6e 69 74 79 54 79 70 65 28  te3AffinityType(
1c110 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  pExpr->u.zToken,
1c120 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63   0) ){.        c
1c130 61 73 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 54  ase SQLITE_AFF_T
1c140 45 58 54 3a 20 20 20 20 7a 41 66 66 20 3d 20 22  EXT:    zAff = "
1c150 54 45 58 54 22 3b 20 20 20 20 20 62 72 65 61 6b  TEXT";     break
1c160 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 53  ;.        case S
1c170 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3a 20  QLITE_AFF_NONE: 
1c180 20 20 20 7a 41 66 66 20 3d 20 22 4e 4f 4e 45 22     zAff = "NONE"
1c190 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ;     break;.   
1c1a0 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
1c1b0 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3a 20 7a 41  _AFF_NUMERIC: zA
1c1c0 66 66 20 3d 20 22 4e 55 4d 45 52 49 43 22 3b 20  ff = "NUMERIC"; 
1c1d0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
1c1e0 63 61 73 65 20 53 51 4c 49 54 45 5f 41 46 46 5f  case SQLITE_AFF_
1c1f0 49 4e 54 45 47 45 52 3a 20 7a 41 66 66 20 3d 20  INTEGER: zAff = 
1c200 22 49 4e 54 45 47 45 52 22 3b 20 20 62 72 65 61  "INTEGER";  brea
1c210 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  k;.        case 
1c220 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 3a  SQLITE_AFF_REAL:
1c230 20 20 20 20 7a 41 66 66 20 3d 20 22 52 45 41 4c      zAff = "REAL
1c240 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ";     break;.  
1c250 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
1c260 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
1c270 28 70 4f 75 74 2c 20 22 43 41 53 54 2d 25 73 28  (pOut, "CAST-%s(
1c280 22 2c 20 7a 41 66 66 29 3b 0a 20 20 20 20 20 20  ", zAff);.      
1c290 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78  sqlite3ExplainEx
1c2a0 70 72 28 70 4f 75 74 2c 20 70 45 78 70 72 2d 3e  pr(pOut, pExpr->
1c2b0 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71  pLeft);.      sq
1c2c0 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e  lite3ExplainPrin
1c2d0 74 66 28 70 4f 75 74 2c 20 22 29 22 29 3b 0a 20  tf(pOut, ")");. 
1c2e0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1c2f0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
1c300 54 45 5f 4f 4d 49 54 5f 43 41 53 54 20 2a 2f 0a  TE_OMIT_CAST */.
1c310 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 20      case TK_LT: 
1c320 20 20 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22 4c       zBinOp = "L
1c330 54 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  T";     break;. 
1c340 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 20 20     case TK_LE:  
1c350 20 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22 4c 45      zBinOp = "LE
1c360 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ";     break;.  
1c370 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 20 20 20    case TK_GT:   
1c380 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22 47 54 22     zBinOp = "GT"
1c390 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ;     break;.   
1c3a0 20 63 61 73 65 20 54 4b 5f 47 45 3a 20 20 20 20   case TK_GE:    
1c3b0 20 20 7a 42 69 6e 4f 70 20 3d 20 22 47 45 22 3b    zBinOp = "GE";
1c3c0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1c3d0 63 61 73 65 20 54 4b 5f 4e 45 3a 20 20 20 20 20  case TK_NE:     
1c3e0 20 7a 42 69 6e 4f 70 20 3d 20 22 4e 45 22 3b 20   zBinOp = "NE"; 
1c3f0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
1c400 61 73 65 20 54 4b 5f 45 51 3a 20 20 20 20 20 20  ase TK_EQ:      
1c410 7a 42 69 6e 4f 70 20 3d 20 22 45 51 22 3b 20 20  zBinOp = "EQ";  
1c420 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
1c430 73 65 20 54 4b 5f 49 53 3a 20 20 20 20 20 20 7a  se TK_IS:      z
1c440 42 69 6e 4f 70 20 3d 20 22 49 53 22 3b 20 20 20  BinOp = "IS";   
1c450 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
1c460 65 20 54 4b 5f 49 53 4e 4f 54 3a 20 20 20 7a 42  e TK_ISNOT:   zB
1c470 69 6e 4f 70 20 3d 20 22 49 53 4e 4f 54 22 3b 20  inOp = "ISNOT"; 
1c480 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
1c490 20 54 4b 5f 41 4e 44 3a 20 20 20 20 20 7a 42 69   TK_AND:     zBi
1c4a0 6e 4f 70 20 3d 20 22 41 4e 44 22 3b 20 20 20 20  nOp = "AND";    
1c4b0 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
1c4c0 54 4b 5f 4f 52 3a 20 20 20 20 20 20 7a 42 69 6e  TK_OR:      zBin
1c4d0 4f 70 20 3d 20 22 4f 52 22 3b 20 20 20 20 20 62  Op = "OR";     b
1c4e0 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
1c4f0 4b 5f 50 4c 55 53 3a 20 20 20 20 7a 42 69 6e 4f  K_PLUS:    zBinO
1c500 70 20 3d 20 22 41 44 44 22 3b 20 20 20 20 62 72  p = "ADD";    br
1c510 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
1c520 5f 53 54 41 52 3a 20 20 20 20 7a 42 69 6e 4f 70  _STAR:    zBinOp
1c530 20 3d 20 22 4d 55 4c 22 3b 20 20 20 20 62 72 65   = "MUL";    bre
1c540 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
1c550 4d 49 4e 55 53 3a 20 20 20 7a 42 69 6e 4f 70 20  MINUS:   zBinOp 
1c560 3d 20 22 53 55 42 22 3b 20 20 20 20 62 72 65 61  = "SUB";    brea
1c570 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52  k;.    case TK_R
1c580 45 4d 3a 20 20 20 20 20 7a 42 69 6e 4f 70 20 3d  EM:     zBinOp =
1c590 20 22 52 45 4d 22 3b 20 20 20 20 62 72 65 61 6b   "REM";    break
1c5a0 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49  ;.    case TK_BI
1c5b0 54 41 4e 44 3a 20 20 7a 42 69 6e 4f 70 20 3d 20  TAND:  zBinOp = 
1c5c0 22 42 49 54 41 4e 44 22 3b 20 62 72 65 61 6b 3b  "BITAND"; break;
1c5d0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54  .    case TK_BIT
1c5e0 4f 52 3a 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22  OR:   zBinOp = "
1c5f0 42 49 54 4f 52 22 3b 20 20 62 72 65 61 6b 3b 0a  BITOR";  break;.
1c600 20 20 20 20 63 61 73 65 20 54 4b 5f 53 4c 41 53      case TK_SLAS
1c610 48 3a 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22 44  H:   zBinOp = "D
1c620 49 56 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20  IV";    break;. 
1c630 20 20 20 63 61 73 65 20 54 4b 5f 4c 53 48 49 46     case TK_LSHIF
1c640 54 3a 20 20 7a 42 69 6e 4f 70 20 3d 20 22 4c 53  T:  zBinOp = "LS
1c650 48 49 46 54 22 3b 20 62 72 65 61 6b 3b 0a 20 20  HIFT"; break;.  
1c660 20 20 63 61 73 65 20 54 4b 5f 52 53 48 49 46 54    case TK_RSHIFT
1c670 3a 20 20 7a 42 69 6e 4f 70 20 3d 20 22 52 53 48  :  zBinOp = "RSH
1c680 49 46 54 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  IFT"; break;.   
1c690 20 63 61 73 65 20 54 4b 5f 43 4f 4e 43 41 54 3a   case TK_CONCAT:
1c6a0 20 20 7a 42 69 6e 4f 70 20 3d 20 22 43 4f 4e 43    zBinOp = "CONC
1c6b0 41 54 22 3b 20 62 72 65 61 6b 3b 0a 0a 20 20 20  AT"; break;..   
1c6c0 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a   case TK_UMINUS:
1c6d0 20 20 7a 55 6e 69 4f 70 20 3d 20 22 55 4d 49 4e    zUniOp = "UMIN
1c6e0 55 53 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  US"; break;.    
1c6f0 63 61 73 65 20 54 4b 5f 55 50 4c 55 53 3a 20 20  case TK_UPLUS:  
1c700 20 7a 55 6e 69 4f 70 20 3d 20 22 55 50 4c 55 53   zUniOp = "UPLUS
1c710 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  ";  break;.    c
1c720 61 73 65 20 54 4b 5f 42 49 54 4e 4f 54 3a 20 20  ase TK_BITNOT:  
1c730 7a 55 6e 69 4f 70 20 3d 20 22 42 49 54 4e 4f 54  zUniOp = "BITNOT
1c740 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
1c750 73 65 20 54 4b 5f 4e 4f 54 3a 20 20 20 20 20 7a  se TK_NOT:     z
1c760 55 6e 69 4f 70 20 3d 20 22 4e 4f 54 22 3b 20 20  UniOp = "NOT";  
1c770 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
1c780 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 20 20 7a 55  e TK_ISNULL:  zU
1c790 6e 69 4f 70 20 3d 20 22 49 53 4e 55 4c 4c 22 3b  niOp = "ISNULL";
1c7a0 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
1c7b0 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7a 55 6e   TK_NOTNULL: zUn
1c7c0 69 4f 70 20 3d 20 22 4e 4f 54 4e 55 4c 4c 22 3b  iOp = "NOTNULL";
1c7d0 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73   break;..    cas
1c7e0 65 20 54 4b 5f 43 4f 4c 4c 41 54 45 3a 20 7b 0a  e TK_COLLATE: {.
1c7f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1c800 6c 61 69 6e 45 78 70 72 28 70 4f 75 74 2c 20 70  lainExpr(pOut, p
1c810 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
1c820 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
1c830 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 22 2e  inPrintf(pOut,".
1c840 43 4f 4c 4c 41 54 45 28 25 73 29 22 2c 70 45 78  COLLATE(%s)",pEx
1c850 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20  pr->u.zToken);. 
1c860 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1c870 7d 0a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41  }..    case TK_A
1c880 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20  GG_FUNCTION:.   
1c890 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f   case TK_FUNCTIO
1c8a0 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72 4c  N: {.      ExprL
1c8b0 69 73 74 20 2a 70 46 61 72 67 3b 20 20 20 20 20  ist *pFarg;     
1c8c0 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 75 6e    /* List of fun
1c8d0 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20  ction arguments 
1c8e0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 45 78 70  */.      if( Exp
1c8f0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
1c900 70 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  pr, EP_TokenOnly
1c910 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 61  ) ){.        pFa
1c920 72 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65  rg = 0;.      }e
1c930 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 46 61  lse{.        pFa
1c940 72 67 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c  rg = pExpr->x.pL
1c950 69 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ist;.      }.   
1c960 20 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 47     if( op==TK_AG
1c970 47 5f 46 55 4e 43 54 49 4f 4e 20 29 7b 0a 20 20  G_FUNCTION ){.  
1c980 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1c990 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c  lainPrintf(pOut,
1c9a0 20 22 41 47 47 5f 46 55 4e 43 54 49 4f 4e 25 64   "AGG_FUNCTION%d
1c9b0 3a 25 73 28 22 2c 0a 20 20 20 20 20 20 20 20 20  :%s(",.         
1c9c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c9d0 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 32 2c 20      pExpr->op2, 
1c9e0 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29  pExpr->u.zToken)
1c9f0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1ca00 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
1ca10 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74  plainPrintf(pOut
1ca20 2c 20 22 46 55 4e 43 54 49 4f 4e 3a 25 73 28 22  , "FUNCTION:%s("
1ca30 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  , pExpr->u.zToke
1ca40 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  n);.      }.    
1ca50 20 20 69 66 28 20 70 46 61 72 67 20 29 7b 0a 20    if( pFarg ){. 
1ca60 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
1ca70 70 6c 61 69 6e 45 78 70 72 4c 69 73 74 28 70 4f  plainExprList(pO
1ca80 75 74 2c 20 70 46 61 72 67 29 3b 0a 20 20 20 20  ut, pFarg);.    
1ca90 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
1caa0 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70  3ExplainPrintf(p
1cab0 4f 75 74 2c 20 22 29 22 29 3b 0a 20 20 20 20 20  Out, ")");.     
1cac0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69   break;.    }.#i
1cad0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1cae0 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 63  T_SUBQUERY.    c
1caf0 61 73 65 20 54 4b 5f 45 58 49 53 54 53 3a 20 7b  ase TK_EXISTS: {
1cb00 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1cb10 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74  plainPrintf(pOut
1cb20 2c 20 22 45 58 49 53 54 53 28 22 29 3b 0a 20 20  , "EXISTS(");.  
1cb30 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
1cb40 69 6e 53 65 6c 65 63 74 28 70 4f 75 74 2c 20 70  inSelect(pOut, p
1cb50 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 29  Expr->x.pSelect)
1cb60 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1cb70 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75  xplainPrintf(pOu
1cb80 74 2c 22 29 22 29 3b 0a 20 20 20 20 20 20 62 72  t,")");.      br
1cb90 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
1cba0 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b  ase TK_SELECT: {
1cbb0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1cbc0 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74  plainPrintf(pOut
1cbd0 2c 20 22 28 22 29 3b 0a 20 20 20 20 20 20 73 71  , "(");.      sq
1cbe0 6c 69 74 65 33 45 78 70 6c 61 69 6e 53 65 6c 65  lite3ExplainSele
1cbf0 63 74 28 70 4f 75 74 2c 20 70 45 78 70 72 2d 3e  ct(pOut, pExpr->
1cc00 78 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  x.pSelect);.    
1cc10 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
1cc20 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 29 22  Printf(pOut, ")"
1cc30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1cc40 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
1cc50 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 73 71  K_IN: {.      sq
1cc60 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e  lite3ExplainPrin
1cc70 74 66 28 70 4f 75 74 2c 20 22 49 4e 28 22 29 3b  tf(pOut, "IN(");
1cc80 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1cc90 70 6c 61 69 6e 45 78 70 72 28 70 4f 75 74 2c 20  plainExpr(pOut, 
1cca0 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
1ccb0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c       sqlite3Expl
1ccc0 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20  ainPrintf(pOut, 
1ccd0 22 2c 22 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ",");.      if( 
1cce0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
1ccf0 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
1cd00 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ect) ){.        
1cd10 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 53 65  sqlite3ExplainSe
1cd20 6c 65 63 74 28 70 4f 75 74 2c 20 70 45 78 70 72  lect(pOut, pExpr
1cd30 2d 3e 78 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20  ->x.pSelect);.  
1cd40 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1cd50 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
1cd60 6e 45 78 70 72 4c 69 73 74 28 70 4f 75 74 2c 20  nExprList(pOut, 
1cd70 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 29 3b  pExpr->x.pList);
1cd80 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
1cd90 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69  qlite3ExplainPri
1cda0 6e 74 66 28 70 4f 75 74 2c 20 22 29 22 29 3b 0a  ntf(pOut, ")");.
1cdb0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1cdc0 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
1cdd0 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
1cde0 59 20 2a 2f 0a 0a 20 20 20 20 2f 2a 0a 20 20 20  Y */..    /*.   
1cdf0 20 2a 2a 20 20 20 20 78 20 42 45 54 57 45 45 4e   **    x BETWEEN
1ce00 20 79 20 41 4e 44 20 7a 0a 20 20 20 20 2a 2a 0a   y AND z.    **.
1ce10 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 65      ** This is e
1ce20 71 75 69 76 61 6c 65 6e 74 20 74 6f 0a 20 20 20  quivalent to.   
1ce30 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 78 3e   **.    **    x>
1ce40 3d 79 20 41 4e 44 20 78 3c 3d 7a 0a 20 20 20 20  =y AND x<=z.    
1ce50 2a 2a 0a 20 20 20 20 2a 2a 20 58 20 69 73 20 73  **.    ** X is s
1ce60 74 6f 72 65 64 20 69 6e 20 70 45 78 70 72 2d 3e  tored in pExpr->
1ce70 70 4c 65 66 74 2e 0a 20 20 20 20 2a 2a 20 59 20  pLeft..    ** Y 
1ce80 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70 45 78  is stored in pEx
1ce90 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e  pr->pList->a[0].
1cea0 70 45 78 70 72 2e 0a 20 20 20 20 2a 2a 20 5a 20  pExpr..    ** Z 
1ceb0 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70 45 78  is stored in pEx
1cec0 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e  pr->pList->a[1].
1ced0 70 45 78 70 72 2e 0a 20 20 20 20 2a 2f 0a 20 20  pExpr..    */.  
1cee0 20 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45    case TK_BETWEE
1cef0 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72 20  N: {.      Expr 
1cf00 2a 70 58 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65  *pX = pExpr->pLe
1cf10 66 74 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  ft;.      Expr *
1cf20 70 59 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c  pY = pExpr->x.pL
1cf30 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b  ist->a[0].pExpr;
1cf40 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 5a 20  .      Expr *pZ 
1cf50 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  = pExpr->x.pList
1cf60 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[1].pExpr;.  
1cf70 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
1cf80 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22  inPrintf(pOut, "
1cf90 42 45 54 57 45 45 4e 28 22 29 3b 0a 20 20 20 20  BETWEEN(");.    
1cfa0 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
1cfb0 45 78 70 72 28 70 4f 75 74 2c 20 70 58 29 3b 0a  Expr(pOut, pX);.
1cfc0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1cfd0 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c  lainPrintf(pOut,
1cfe0 20 22 2c 22 29 3b 0a 20 20 20 20 20 20 73 71 6c   ",");.      sql
1cff0 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72 28  ite3ExplainExpr(
1d000 70 4f 75 74 2c 20 70 59 29 3b 0a 20 20 20 20 20  pOut, pY);.     
1d010 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
1d020 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 2c 22 29  rintf(pOut, ",")
1d030 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1d040 78 70 6c 61 69 6e 45 78 70 72 28 70 4f 75 74 2c  xplainExpr(pOut,
1d050 20 70 5a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   pZ);.      sqli
1d060 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
1d070 28 70 4f 75 74 2c 20 22 29 22 29 3b 0a 20 20 20  (pOut, ")");.   
1d080 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1d090 20 20 20 20 63 61 73 65 20 54 4b 5f 54 52 49 47      case TK_TRIG
1d0a0 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  GER: {.      /* 
1d0b0 49 66 20 74 68 65 20 6f 70 63 6f 64 65 20 69 73  If the opcode is
1d0c0 20 54 4b 5f 54 52 49 47 47 45 52 2c 20 74 68 65   TK_TRIGGER, the
1d0d0 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  n the expression
1d0e0 20 69 73 20 61 20 72 65 66 65 72 65 6e 63 65 0a   is a reference.
1d0f0 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 20 63 6f        ** to a co
1d100 6c 75 6d 6e 20 69 6e 20 74 68 65 20 6e 65 77 2e  lumn in the new.
1d110 2a 20 6f 72 20 6f 6c 64 2e 2a 20 70 73 65 75 64  * or old.* pseud
1d120 6f 2d 74 61 62 6c 65 73 20 61 76 61 69 6c 61 62  o-tables availab
1d130 6c 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74  le to.      ** t
1d140 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d 73 2e  rigger programs.
1d150 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 45 78   In this case Ex
1d160 70 72 2e 69 54 61 62 6c 65 20 69 73 20 73 65 74  pr.iTable is set
1d170 20 74 6f 20 31 20 66 6f 72 20 74 68 65 0a 20 20   to 1 for the.  
1d180 20 20 20 20 2a 2a 20 6e 65 77 2e 2a 20 70 73 65      ** new.* pse
1d190 75 64 6f 2d 74 61 62 6c 65 2c 20 6f 72 20 30 20  udo-table, or 0 
1d1a0 66 6f 72 20 74 68 65 20 6f 6c 64 2e 2a 20 70 73  for the old.* ps
1d1b0 65 75 64 6f 2d 74 61 62 6c 65 2e 20 45 78 70 72  eudo-table. Expr
1d1c0 2e 69 43 6f 6c 75 6d 6e 0a 20 20 20 20 20 20 2a  .iColumn.      *
1d1d0 2a 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  * is set to the 
1d1e0 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 70 73  column of the ps
1d1f0 65 75 64 6f 2d 74 61 62 6c 65 20 74 6f 20 72 65  eudo-table to re
1d200 61 64 2c 20 6f 72 20 74 6f 20 2d 31 20 74 6f 0a  ad, or to -1 to.
1d210 20 20 20 20 20 20 2a 2a 20 72 65 61 64 20 74 68        ** read th
1d220 65 20 72 6f 77 69 64 20 66 69 65 6c 64 2e 0a 20  e rowid field.. 
1d230 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
1d240 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e  lite3ExplainPrin
1d250 74 66 28 70 4f 75 74 2c 20 22 25 73 28 25 64 29  tf(pOut, "%s(%d)
1d260 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 70 45  ", .          pE
1d270 78 70 72 2d 3e 69 54 61 62 6c 65 20 3f 20 22 4e  xpr->iTable ? "N
1d280 45 57 22 20 3a 20 22 4f 4c 44 22 2c 20 70 45 78  EW" : "OLD", pEx
1d290 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20  pr->iColumn);.  
1d2a0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1d2b0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 41 53  .    case TK_CAS
1d2c0 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  E: {.      sqlit
1d2d0 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28  e3ExplainPrintf(
1d2e0 70 4f 75 74 2c 20 22 43 41 53 45 28 22 29 3b 0a  pOut, "CASE(");.
1d2f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1d300 6c 61 69 6e 45 78 70 72 28 70 4f 75 74 2c 20 70  lainExpr(pOut, p
1d310 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
1d320 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
1d330 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22  inPrintf(pOut, "
1d340 2c 22 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ,");.      sqlit
1d350 65 33 45 78 70 6c 61 69 6e 45 78 70 72 4c 69 73  e3ExplainExprLis
1d360 74 28 70 4f 75 74 2c 20 70 45 78 70 72 2d 3e 78  t(pOut, pExpr->x
1d370 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 62  .pList);.      b
1d380 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  reak;.    }.#ifn
1d390 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1d3a0 54 52 49 47 47 45 52 0a 20 20 20 20 63 61 73 65  TRIGGER.    case
1d3b0 20 54 4b 5f 52 41 49 53 45 3a 20 7b 0a 20 20 20   TK_RAISE: {.   
1d3c0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
1d3d0 54 79 70 65 20 3d 20 22 75 6e 6b 22 3b 0a 20 20  Type = "unk";.  
1d3e0 20 20 20 20 73 77 69 74 63 68 28 20 70 45 78 70      switch( pExp
1d3f0 72 2d 3e 61 66 66 69 6e 69 74 79 20 29 7b 0a 20  r->affinity ){. 
1d400 20 20 20 20 20 20 20 63 61 73 65 20 4f 45 5f 52         case OE_R
1d410 6f 6c 6c 62 61 63 6b 3a 20 20 20 7a 54 79 70 65  ollback:   zType
1d420 20 3d 20 22 72 6f 6c 6c 62 61 63 6b 22 3b 20 20   = "rollback";  
1d430 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63  break;.        c
1d440 61 73 65 20 4f 45 5f 41 62 6f 72 74 3a 20 20 20  ase OE_Abort:   
1d450 20 20 20 7a 54 79 70 65 20 3d 20 22 61 62 6f 72     zType = "abor
1d460 74 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  t";     break;. 
1d470 20 20 20 20 20 20 20 63 61 73 65 20 4f 45 5f 46         case OE_F
1d480 61 69 6c 3a 20 20 20 20 20 20 20 7a 54 79 70 65  ail:       zType
1d490 20 3d 20 22 66 61 69 6c 22 3b 20 20 20 20 20 20   = "fail";      
1d4a0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63  break;.        c
1d4b0 61 73 65 20 4f 45 5f 49 67 6e 6f 72 65 3a 20 20  ase OE_Ignore:  
1d4c0 20 20 20 7a 54 79 70 65 20 3d 20 22 69 67 6e 6f     zType = "igno
1d4d0 72 65 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20  re";    break;. 
1d4e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
1d4f0 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74  ite3ExplainPrint
1d500 66 28 70 4f 75 74 2c 20 22 52 41 49 53 45 2d 25  f(pOut, "RAISE-%
1d510 73 28 25 73 29 22 2c 20 7a 54 79 70 65 2c 20 70  s(%s)", zType, p
1d520 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b  Expr->u.zToken);
1d530 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1d540 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20    }.#endif.  }. 
1d550 20 69 66 28 20 7a 42 69 6e 4f 70 20 29 7b 0a 20   if( zBinOp ){. 
1d560 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
1d570 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 22 25 73  nPrintf(pOut,"%s
1d580 28 22 2c 20 7a 42 69 6e 4f 70 29 3b 0a 20 20 20  (", zBinOp);.   
1d590 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45   sqlite3ExplainE
1d5a0 78 70 72 28 70 4f 75 74 2c 20 70 45 78 70 72 2d  xpr(pOut, pExpr-
1d5b0 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 73 71 6c  >pLeft);.    sql
1d5c0 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74  ite3ExplainPrint
1d5d0 66 28 70 4f 75 74 2c 22 2c 22 29 3b 0a 20 20 20  f(pOut,",");.   
1d5e0 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45   sqlite3ExplainE
1d5f0 78 70 72 28 70 4f 75 74 2c 20 70 45 78 70 72 2d  xpr(pOut, pExpr-
1d600 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 73 71  >pRight);.    sq
1d610 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e  lite3ExplainPrin
1d620 74 66 28 70 4f 75 74 2c 22 29 22 29 3b 0a 20 20  tf(pOut,")");.  
1d630 7d 65 6c 73 65 20 69 66 28 20 7a 55 6e 69 4f 70  }else if( zUniOp
1d640 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
1d650 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75  xplainPrintf(pOu
1d660 74 2c 22 25 73 28 22 2c 20 7a 55 6e 69 4f 70 29  t,"%s(", zUniOp)
1d670 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
1d680 6c 61 69 6e 45 78 70 72 28 70 4f 75 74 2c 20 70  lainExpr(pOut, p
1d690 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
1d6a0 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
1d6b0 50 72 69 6e 74 66 28 70 4f 75 74 2c 22 29 22 29  Printf(pOut,")")
1d6c0 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f  ;.  }.}.#endif /
1d6d0 2a 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  * defined(SQLITE
1d6e0 5f 45 4e 41 42 4c 45 5f 54 52 45 45 5f 45 58 50  _ENABLE_TREE_EXP
1d6f0 4c 41 49 4e 29 20 2a 2f 0a 0a 23 69 66 20 64 65  LAIN) */..#if de
1d700 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
1d710 42 4c 45 5f 54 52 45 45 5f 45 58 50 4c 41 49 4e  BLE_TREE_EXPLAIN
1d720 29 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  )./*.** Generate
1d730 20 61 20 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c   a human-readabl
1d740 65 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66  e explanation of
1d750 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c   an expression l
1d760 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ist..*/.void sql
1d770 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72 4c  ite3ExplainExprL
1d780 69 73 74 28 56 64 62 65 20 2a 70 4f 75 74 2c 20  ist(Vdbe *pOut, 
1d790 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29  ExprList *pList)
1d7a0 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
1d7b0 20 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 4c 69   pList==0 || pLi
1d7c0 73 74 2d 3e 6e 45 78 70 72 3d 3d 30 20 29 7b 0a  st->nExpr==0 ){.
1d7d0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
1d7e0 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22  inPrintf(pOut, "
1d7f0 28 65 6d 70 74 79 2d 6c 69 73 74 29 22 29 3b 0a  (empty-list)");.
1d800 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 65      return;.  }e
1d810 6c 73 65 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e  lse if( pList->n
1d820 45 78 70 72 3d 3d 31 20 29 7b 0a 20 20 20 20 73  Expr==1 ){.    s
1d830 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70  qlite3ExplainExp
1d840 72 28 70 4f 75 74 2c 20 70 4c 69 73 74 2d 3e 61  r(pOut, pList->a
1d850 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20 7d 65  [0].pExpr);.  }e
1d860 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
1d870 45 78 70 6c 61 69 6e 50 75 73 68 28 70 4f 75 74  ExplainPush(pOut
1d880 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
1d890 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  i<pList->nExpr; 
1d8a0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  i++){.      sqli
1d8b0 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
1d8c0 28 70 4f 75 74 2c 20 22 69 74 65 6d 5b 25 64 5d  (pOut, "item[%d]
1d8d0 20 3d 20 22 2c 20 69 29 3b 0a 20 20 20 20 20 20   = ", i);.      
1d8e0 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 75  sqlite3ExplainPu
1d8f0 73 68 28 70 4f 75 74 29 3b 0a 20 20 20 20 20 20  sh(pOut);.      
1d900 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78  sqlite3ExplainEx
1d910 70 72 28 70 4f 75 74 2c 20 70 4c 69 73 74 2d 3e  pr(pOut, pList->
1d920 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[i].pExpr);.   
1d930 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
1d940 6e 50 6f 70 28 70 4f 75 74 29 3b 0a 20 20 20 20  nPop(pOut);.    
1d950 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 61 5b 69    if( pList->a[i
1d960 5d 2e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20  ].zName ){.     
1d970 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
1d980 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 20  nPrintf(pOut, " 
1d990 41 53 20 25 73 22 2c 20 70 4c 69 73 74 2d 3e 61  AS %s", pList->a
1d9a0 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  [i].zName);.    
1d9b0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 4c    }.      if( pL
1d9c0 69 73 74 2d 3e 61 5b 69 5d 2e 62 53 70 61 6e 49  ist->a[i].bSpanI
1d9d0 73 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20  sTab ){.        
1d9e0 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
1d9f0 69 6e 74 66 28 70 4f 75 74 2c 20 22 20 28 25 73  intf(pOut, " (%s
1da00 29 22 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  )", pList->a[i].
1da10 7a 53 70 61 6e 29 3b 0a 20 20 20 20 20 20 7d 0a  zSpan);.      }.
1da20 20 20 20 20 20 20 69 66 28 20 69 3c 70 4c 69 73        if( i<pLis
1da30 74 2d 3e 6e 45 78 70 72 2d 31 20 29 7b 0a 20 20  t->nExpr-1 ){.  
1da40 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1da50 6c 61 69 6e 4e 4c 28 70 4f 75 74 29 3b 0a 20 20  lainNL(pOut);.  
1da60 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1da70 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 6f  sqlite3ExplainPo
1da80 70 28 70 4f 75 74 29 3b 0a 20 20 7d 0a 7d 0a 23  p(pOut);.  }.}.#
1da90 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
1daa0 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  DEBUG */../*.** 
1dab0 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
1dac0 61 74 20 70 75 73 68 65 73 20 74 68 65 20 76 61  at pushes the va
1dad0 6c 75 65 20 6f 66 20 65 76 65 72 79 20 65 6c 65  lue of every ele
1dae0 6d 65 6e 74 20 6f 66 20 74 68 65 20 67 69 76 65  ment of the give
1daf0 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20  n.** expression 
1db00 6c 69 73 74 20 69 6e 74 6f 20 61 20 73 65 71 75  list into a sequ
1db10 65 6e 63 65 20 6f 66 20 72 65 67 69 73 74 65 72  ence of register
1db20 73 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 74  s beginning at t
1db30 61 72 67 65 74 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  arget..**.** Ret
1db40 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
1db50 66 20 65 6c 65 6d 65 6e 74 73 20 65 76 61 6c 75  f elements evalu
1db60 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ated..**.** The 
1db70 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50 20  SQLITE_ECEL_DUP 
1db80 66 6c 61 67 20 70 72 65 76 65 6e 74 73 20 74 68  flag prevents th
1db90 65 20 61 72 67 75 6d 65 6e 74 73 20 66 72 6f 6d  e arguments from
1dba0 20 62 65 69 6e 67 0a 2a 2a 20 66 69 6c 6c 65 64   being.** filled
1dbb0 20 75 73 69 6e 67 20 4f 50 5f 53 43 6f 70 79 2e   using OP_SCopy.
1dbc0 20 20 4f 50 5f 43 6f 70 79 20 6d 75 73 74 20 62    OP_Copy must b
1dbd0 65 20 75 73 65 64 20 69 6e 73 74 65 61 64 2e 0a  e used instead..
1dbe0 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c 49 54 45  **.** The SQLITE
1dbf0 5f 45 43 45 4c 5f 46 41 43 54 4f 52 20 61 72 67  _ECEL_FACTOR arg
1dc00 75 6d 65 6e 74 20 61 6c 6c 6f 77 73 20 63 6f 6e  ument allows con
1dc10 73 74 61 6e 74 20 61 72 67 75 6d 65 6e 74 73 20  stant arguments 
1dc20 74 6f 20 62 65 0a 2a 2a 20 66 61 63 74 6f 72 65  to be.** factore
1dc30 64 20 6f 75 74 20 69 6e 74 6f 20 69 6e 69 74 69  d out into initi
1dc40 61 6c 69 7a 61 74 69 6f 6e 20 63 6f 64 65 2e 0a  alization code..
1dc50 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
1dc60 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 0a  prCodeExprList(.
1dc70 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
1dc80 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
1dc90 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
1dca0 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20  rList *pList,   
1dcb0 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  /* The expressio
1dcc0 6e 20 6c 69 73 74 20 74 6f 20 62 65 20 63 6f 64  n list to be cod
1dcd0 65 64 20 2a 2f 0a 20 20 69 6e 74 20 74 61 72 67  ed */.  int targ
1dce0 65 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 57 68  et,        /* Wh
1dcf0 65 72 65 20 74 6f 20 77 72 69 74 65 20 72 65 73  ere to write res
1dd00 75 6c 74 73 20 2a 2f 0a 20 20 75 38 20 66 6c 61  ults */.  u8 fla
1dd10 67 73 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  gs           /* 
1dd20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 2a 20 66 6c  SQLITE_ECEL_* fl
1dd30 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75  ags */.){.  stru
1dd40 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
1dd50 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69   *pItem;.  int i
1dd60 2c 20 6e 3b 0a 20 20 75 38 20 63 6f 70 79 4f 70  , n;.  u8 copyOp
1dd70 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49   = (flags & SQLI
1dd80 54 45 5f 45 43 45 4c 5f 44 55 50 29 20 3f 20 4f  TE_ECEL_DUP) ? O
1dd90 50 5f 43 6f 70 79 20 3a 20 4f 50 5f 53 43 6f 70  P_Copy : OP_SCop
1dda0 79 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69  y;.  assert( pLi
1ddb0 73 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  st!=0 );.  asser
1ddc0 74 28 20 74 61 72 67 65 74 3e 30 20 29 3b 0a 20  t( target>0 );. 
1ddd0 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
1dde0 3e 70 56 64 62 65 21 3d 30 20 29 3b 20 20 2f 2a  >pVdbe!=0 );  /*
1ddf0 20 4e 65 76 65 72 20 67 65 74 73 20 74 68 69 73   Never gets this
1de00 20 66 61 72 20 6f 74 68 65 72 77 69 73 65 20 2a   far otherwise *
1de10 2f 0a 20 20 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e  /.  n = pList->n
1de20 45 78 70 72 3b 0a 20 20 69 66 28 20 21 43 6f 6e  Expr;.  if( !Con
1de30 73 74 46 61 63 74 6f 72 4f 6b 28 70 50 61 72 73  stFactorOk(pPars
1de40 65 29 20 29 20 66 6c 61 67 73 20 26 3d 20 7e 53  e) ) flags &= ~S
1de50 51 4c 49 54 45 5f 45 43 45 4c 5f 46 41 43 54 4f  QLITE_ECEL_FACTO
1de60 52 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d 70  R;.  for(pItem=p
1de70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c  List->a, i=0; i<
1de80 6e 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  n; i++, pItem++)
1de90 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70  {.    Expr *pExp
1dea0 72 20 3d 20 70 49 74 65 6d 2d 3e 70 45 78 70 72  r = pItem->pExpr
1deb0 3b 0a 20 20 20 20 69 66 28 20 28 66 6c 61 67 73  ;.    if( (flags
1dec0 20 26 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 46   & SQLITE_ECEL_F
1ded0 41 43 54 4f 52 29 21 3d 30 20 26 26 20 73 71 6c  ACTOR)!=0 && sql
1dee0 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
1def0 6e 74 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20  nt(pExpr) ){.   
1df00 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
1df10 64 65 41 74 49 6e 69 74 28 70 50 61 72 73 65 2c  deAtInit(pParse,
1df20 20 70 45 78 70 72 2c 20 74 61 72 67 65 74 2b 69   pExpr, target+i
1df30 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , 0);.    }else{
1df40 0a 20 20 20 20 20 20 69 6e 74 20 69 6e 52 65 67  .      int inReg
1df50 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1df60 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c  deTarget(pParse,
1df70 20 70 45 78 70 72 2c 20 74 61 72 67 65 74 2b 69   pExpr, target+i
1df80 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 6e 52  );.      if( inR
1df90 65 67 21 3d 74 61 72 67 65 74 2b 69 20 29 7b 0a  eg!=target+i ){.
1dfa0 20 20 20 20 20 20 20 20 56 64 62 65 4f 70 20 2a          VdbeOp *
1dfb0 70 4f 70 3b 0a 20 20 20 20 20 20 20 20 56 64 62  pOp;.        Vdb
1dfc0 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
1dfd0 56 64 62 65 3b 0a 20 20 20 20 20 20 20 20 69 66  Vdbe;.        if
1dfe0 28 20 63 6f 70 79 4f 70 3d 3d 4f 50 5f 43 6f 70  ( copyOp==OP_Cop
1dff0 79 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 70  y.         && (p
1e000 4f 70 3d 73 71 6c 69 74 65 33 56 64 62 65 47 65  Op=sqlite3VdbeGe
1e010 74 4f 70 28 76 2c 20 2d 31 29 29 2d 3e 6f 70 63  tOp(v, -1))->opc
1e020 6f 64 65 3d 3d 4f 50 5f 43 6f 70 79 0a 20 20 20  ode==OP_Copy.   
1e030 20 20 20 20 20 20 26 26 20 70 4f 70 2d 3e 70 31        && pOp->p1
1e040 2b 70 4f 70 2d 3e 70 33 2b 31 3d 3d 69 6e 52 65  +pOp->p3+1==inRe
1e050 67 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 4f  g.         && pO
1e060 70 2d 3e 70 32 2b 70 4f 70 2d 3e 70 33 2b 31 3d  p->p2+pOp->p3+1=
1e070 3d 74 61 72 67 65 74 2b 69 0a 20 20 20 20 20 20  =target+i.      
1e080 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70    ){.          p
1e090 4f 70 2d 3e 70 33 2b 2b 3b 0a 20 20 20 20 20 20  Op->p3++;.      
1e0a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1e0b0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1e0c0 64 4f 70 32 28 76 2c 20 63 6f 70 79 4f 70 2c 20  dOp2(v, copyOp, 
1e0d0 69 6e 52 65 67 2c 20 74 61 72 67 65 74 2b 69 29  inReg, target+i)
1e0e0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1e0f0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
1e100 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a  return n;.}../*.
1e110 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
1e120 20 66 6f 72 20 61 20 42 45 54 57 45 45 4e 20 6f   for a BETWEEN o
1e130 70 65 72 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20  perator..**.**  
1e140 20 20 78 20 42 45 54 57 45 45 4e 20 79 20 41 4e    x BETWEEN y AN
1e150 44 20 7a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 62  D z.**.** The ab
1e160 6f 76 65 20 69 73 20 65 71 75 69 76 61 6c 65 6e  ove is equivalen
1e170 74 20 74 6f 20 0a 2a 2a 0a 2a 2a 20 20 20 20 78  t to .**.**    x
1e180 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 0a 2a 2a 0a  >=y AND x<=z.**.
1e190 2a 2a 20 43 6f 64 65 20 69 74 20 61 73 20 73 75  ** Code it as su
1e1a0 63 68 2c 20 74 61 6b 69 6e 67 20 63 61 72 65 20  ch, taking care 
1e1b0 74 6f 20 64 6f 20 74 68 65 20 63 6f 6d 6d 6f 6e  to do the common
1e1c0 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 0a 2a   subexpression.*
1e1d0 2a 20 65 6c 69 6d 69 6e 61 74 69 6f 6e 20 6f 66  * elimination of
1e1e0 20 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f   x..*/.static vo
1e1f0 69 64 20 65 78 70 72 43 6f 64 65 42 65 74 77 65  id exprCodeBetwe
1e200 65 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  en(.  Parse *pPa
1e210 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69  rse,    /* Parsi
1e220 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65  ng and code gene
1e230 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  rating context *
1e240 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c  /.  Expr *pExpr,
1e250 20 20 20 20 20 20 2f 2a 20 54 68 65 20 42 45 54        /* The BET
1e260 57 45 45 4e 20 65 78 70 72 65 73 73 69 6f 6e 20  WEEN expression 
1e270 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 2c 20 20  */.  int dest,  
1e280 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68         /* Jump h
1e290 65 72 65 20 69 66 20 74 68 65 20 6a 75 6d 70 20  ere if the jump 
1e2a0 69 73 20 74 61 6b 65 6e 20 2a 2f 0a 20 20 69 6e  is taken */.  in
1e2b0 74 20 6a 75 6d 70 49 66 54 72 75 65 2c 20 20 20  t jumpIfTrue,   
1e2c0 2f 2a 20 54 61 6b 65 20 74 68 65 20 6a 75 6d 70  /* Take the jump
1e2d0 20 69 66 20 74 68 65 20 42 45 54 57 45 45 4e 20   if the BETWEEN 
1e2e0 69 73 20 74 72 75 65 20 2a 2f 0a 20 20 69 6e 74  is true */.  int
1e2f0 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 20 20 20 2f   jumpIfNull    /
1e300 2a 20 54 61 6b 65 20 74 68 65 20 6a 75 6d 70 20  * Take the jump 
1e310 69 66 20 74 68 65 20 42 45 54 57 45 45 4e 20 69  if the BETWEEN i
1e320 73 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 45  s NULL */.){.  E
1e330 78 70 72 20 65 78 70 72 41 6e 64 3b 20 20 20 20  xpr exprAnd;    
1e340 20 2f 2a 20 54 68 65 20 41 4e 44 20 6f 70 65 72   /* The AND oper
1e350 61 74 6f 72 20 69 6e 20 20 78 3e 3d 79 20 41 4e  ator in  x>=y AN
1e360 44 20 78 3c 3d 7a 20 20 2a 2f 0a 20 20 45 78 70  D x<=z  */.  Exp
1e370 72 20 63 6f 6d 70 4c 65 66 74 3b 20 20 20 20 2f  r compLeft;    /
1e380 2a 20 54 68 65 20 20 78 3e 3d 79 20 20 74 65 72  * The  x>=y  ter
1e390 6d 20 2a 2f 0a 20 20 45 78 70 72 20 63 6f 6d 70  m */.  Expr comp
1e3a0 52 69 67 68 74 3b 20 20 20 2f 2a 20 54 68 65 20  Right;   /* The 
1e3b0 20 78 3c 3d 7a 20 20 74 65 72 6d 20 2a 2f 0a 20   x<=z  term */. 
1e3c0 20 45 78 70 72 20 65 78 70 72 58 3b 20 20 20 20   Expr exprX;    
1e3d0 20 20 20 2f 2a 20 54 68 65 20 20 78 20 20 73 75     /* The  x  su
1e3e0 62 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20  bexpression */. 
1e3f0 20 69 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20   int regFree1 = 
1e400 30 3b 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20  0; /* Temporary 
1e410 75 73 65 20 72 65 67 69 73 74 65 72 20 2a 2f 0a  use register */.
1e420 0a 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72  .  assert( !Expr
1e430 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
1e440 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
1e450 20 29 3b 0a 20 20 65 78 70 72 58 20 3d 20 2a 70   );.  exprX = *p
1e460 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 65  Expr->pLeft;.  e
1e470 78 70 72 41 6e 64 2e 6f 70 20 3d 20 54 4b 5f 41  xprAnd.op = TK_A
1e480 4e 44 3b 0a 20 20 65 78 70 72 41 6e 64 2e 70 4c  ND;.  exprAnd.pL
1e490 65 66 74 20 3d 20 26 63 6f 6d 70 4c 65 66 74 3b  eft = &compLeft;
1e4a0 0a 20 20 65 78 70 72 41 6e 64 2e 70 52 69 67 68  .  exprAnd.pRigh
1e4b0 74 20 3d 20 26 63 6f 6d 70 52 69 67 68 74 3b 0a  t = &compRight;.
1e4c0 20 20 63 6f 6d 70 4c 65 66 74 2e 6f 70 20 3d 20    compLeft.op = 
1e4d0 54 4b 5f 47 45 3b 0a 20 20 63 6f 6d 70 4c 65 66  TK_GE;.  compLef
1e4e0 74 2e 70 4c 65 66 74 20 3d 20 26 65 78 70 72 58  t.pLeft = &exprX
1e4f0 3b 0a 20 20 63 6f 6d 70 4c 65 66 74 2e 70 52 69  ;.  compLeft.pRi
1e500 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  ght = pExpr->x.p
1e510 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
1e520 3b 0a 20 20 63 6f 6d 70 52 69 67 68 74 2e 6f 70  ;.  compRight.op
1e530 20 3d 20 54 4b 5f 4c 45 3b 0a 20 20 63 6f 6d 70   = TK_LE;.  comp
1e540 52 69 67 68 74 2e 70 4c 65 66 74 20 3d 20 26 65  Right.pLeft = &e
1e550 78 70 72 58 3b 0a 20 20 63 6f 6d 70 52 69 67 68  xprX;.  compRigh
1e560 74 2e 70 52 69 67 68 74 20 3d 20 70 45 78 70 72  t.pRight = pExpr
1e570 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e  ->x.pList->a[1].
1e580 70 45 78 70 72 3b 0a 20 20 65 78 70 72 54 6f 52  pExpr;.  exprToR
1e590 65 67 69 73 74 65 72 28 26 65 78 70 72 58 2c 20  egister(&exprX, 
1e5a0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
1e5b0 65 6d 70 28 70 50 61 72 73 65 2c 20 26 65 78 70  emp(pParse, &exp
1e5c0 72 58 2c 20 26 72 65 67 46 72 65 65 31 29 29 3b  rX, &regFree1));
1e5d0 0a 20 20 69 66 28 20 6a 75 6d 70 49 66 54 72 75  .  if( jumpIfTru
1e5e0 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
1e5f0 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73  ExprIfTrue(pPars
1e600 65 2c 20 26 65 78 70 72 41 6e 64 2c 20 64 65 73  e, &exprAnd, des
1e610 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
1e620 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
1e630 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
1e640 70 50 61 72 73 65 2c 20 26 65 78 70 72 41 6e 64  pParse, &exprAnd
1e650 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
1e660 6c 6c 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ll);.  }.  sqlit
1e670 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
1e680 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65  (pParse, regFree
1e690 31 29 3b 0a 0a 20 20 2f 2a 20 45 6e 73 75 72 65  1);..  /* Ensure
1e6a0 20 61 64 65 71 75 61 74 65 20 74 65 73 74 20 63   adequate test c
1e6b0 6f 76 65 72 61 67 65 20 2a 2f 0a 20 20 74 65 73  overage */.  tes
1e6c0 74 63 61 73 65 28 20 6a 75 6d 70 49 66 54 72 75  tcase( jumpIfTru
1e6d0 65 3d 3d 30 20 26 26 20 6a 75 6d 70 49 66 4e 75  e==0 && jumpIfNu
1e6e0 6c 6c 3d 3d 30 20 26 26 20 72 65 67 46 72 65 65  ll==0 && regFree
1e6f0 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61  1==0 );.  testca
1e700 73 65 28 20 6a 75 6d 70 49 66 54 72 75 65 3d 3d  se( jumpIfTrue==
1e710 30 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  0 && jumpIfNull=
1e720 3d 30 20 26 26 20 72 65 67 46 72 65 65 31 21 3d  =0 && regFree1!=
1e730 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  0 );.  testcase(
1e740 20 6a 75 6d 70 49 66 54 72 75 65 3d 3d 30 20 26   jumpIfTrue==0 &
1e750 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 20  & jumpIfNull!=0 
1e760 26 26 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  && regFree1==0 )
1e770 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6a 75  ;.  testcase( ju
1e780 6d 70 49 66 54 72 75 65 3d 3d 30 20 26 26 20 6a  mpIfTrue==0 && j
1e790 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 20 26 26 20  umpIfNull!=0 && 
1e7a0 72 65 67 46 72 65 65 31 21 3d 30 20 29 3b 0a 20  regFree1!=0 );. 
1e7b0 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
1e7c0 66 54 72 75 65 21 3d 30 20 26 26 20 6a 75 6d 70  fTrue!=0 && jump
1e7d0 49 66 4e 75 6c 6c 3d 3d 30 20 26 26 20 72 65 67  IfNull==0 && reg
1e7e0 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 74 65  Free1==0 );.  te
1e7f0 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 54 72  stcase( jumpIfTr
1e800 75 65 21 3d 30 20 26 26 20 6a 75 6d 70 49 66 4e  ue!=0 && jumpIfN
1e810 75 6c 6c 3d 3d 30 20 26 26 20 72 65 67 46 72 65  ull==0 && regFre
1e820 65 31 21 3d 30 20 29 3b 0a 20 20 74 65 73 74 63  e1!=0 );.  testc
1e830 61 73 65 28 20 6a 75 6d 70 49 66 54 72 75 65 21  ase( jumpIfTrue!
1e840 3d 30 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c  =0 && jumpIfNull
1e850 21 3d 30 20 26 26 20 72 65 67 46 72 65 65 31 3d  !=0 && regFree1=
1e860 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =0 );.  testcase
1e870 28 20 6a 75 6d 70 49 66 54 72 75 65 21 3d 30 20  ( jumpIfTrue!=0 
1e880 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30  && jumpIfNull!=0
1e890 20 26 26 20 72 65 67 46 72 65 65 31 21 3d 30 20   && regFree1!=0 
1e8a0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  );.}../*.** Gene
1e8b0 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20  rate code for a 
1e8c0 62 6f 6f 6c 65 61 6e 20 65 78 70 72 65 73 73 69  boolean expressi
1e8d0 6f 6e 20 73 75 63 68 20 74 68 61 74 20 61 20 6a  on such that a j
1e8e0 75 6d 70 20 69 73 20 6d 61 64 65 0a 2a 2a 20 74  ump is made.** t
1e8f0 6f 20 74 68 65 20 6c 61 62 65 6c 20 22 64 65 73  o the label "des
1e900 74 22 20 69 66 20 74 68 65 20 65 78 70 72 65 73  t" if the expres
1e910 73 69 6f 6e 20 69 73 20 74 72 75 65 20 62 75 74  sion is true but
1e920 20 65 78 65 63 75 74 69 6f 6e 0a 2a 2a 20 63 6f   execution.** co
1e930 6e 74 69 6e 75 65 73 20 73 74 72 61 69 67 68 74  ntinues straight
1e940 20 74 68 72 75 20 69 66 20 74 68 65 20 65 78 70   thru if the exp
1e950 72 65 73 73 69 6f 6e 20 69 73 20 66 61 6c 73 65  ression is false
1e960 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65  ..**.** If the e
1e970 78 70 72 65 73 73 69 6f 6e 20 65 76 61 6c 75 61  xpression evalua
1e980 74 65 73 20 74 6f 20 4e 55 4c 4c 20 28 6e 65 69  tes to NULL (nei
1e990 74 68 65 72 20 74 72 75 65 20 6e 6f 72 20 66 61  ther true nor fa
1e9a0 6c 73 65 29 2c 20 74 68 65 6e 0a 2a 2a 20 74 61  lse), then.** ta
1e9b0 6b 65 20 74 68 65 20 6a 75 6d 70 20 69 66 20 74  ke the jump if t
1e9c0 68 65 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 66 6c  he jumpIfNull fl
1e9d0 61 67 20 69 73 20 53 51 4c 49 54 45 5f 4a 55 4d  ag is SQLITE_JUM
1e9e0 50 49 46 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54  PIFNULL..**.** T
1e9f0 68 69 73 20 63 6f 64 65 20 64 65 70 65 6e 64 73  his code depends
1ea00 20 6f 6e 20 74 68 65 20 66 61 63 74 20 74 68 61   on the fact tha
1ea10 74 20 63 65 72 74 61 69 6e 20 74 6f 6b 65 6e 20  t certain token 
1ea20 76 61 6c 75 65 73 20 28 65 78 3a 20 54 4b 5f 45  values (ex: TK_E
1ea30 51 29 0a 2a 2a 20 61 72 65 20 74 68 65 20 73 61  Q).** are the sa
1ea40 6d 65 20 61 73 20 6f 70 63 6f 64 65 20 76 61 6c  me as opcode val
1ea50 75 65 73 20 28 65 78 3a 20 4f 50 5f 45 71 29 20  ues (ex: OP_Eq) 
1ea60 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 20 74  that implement t
1ea70 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
1ea80 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20  .** operation.  
1ea90 53 70 65 63 69 61 6c 20 63 6f 6d 6d 65 6e 74 73  Special comments
1eaa0 20 69 6e 20 76 64 62 65 2e 63 20 61 6e 64 20 74   in vdbe.c and t
1eab0 68 65 20 6d 6b 6f 70 63 6f 64 65 68 2e 61 77 6b  he mkopcodeh.awk
1eac0 20 73 63 72 69 70 74 20 69 6e 0a 2a 2a 20 74 68   script in.** th
1ead0 65 20 6d 61 6b 65 20 70 72 6f 63 65 73 73 20 63  e make process c
1eae0 61 75 73 65 20 74 68 65 73 65 20 76 61 6c 75 65  ause these value
1eaf0 73 20 74 6f 20 61 6c 69 67 6e 2e 20 20 41 73 73  s to align.  Ass
1eb00 65 72 74 28 29 73 20 69 6e 20 74 68 65 20 63 6f  ert()s in the co
1eb10 64 65 0a 2a 2a 20 62 65 6c 6f 77 20 76 65 72 69  de.** below veri
1eb20 66 79 20 74 68 61 74 20 74 68 65 20 6e 75 6d 62  fy that the numb
1eb30 65 72 73 20 61 72 65 20 61 6c 69 67 6e 65 64 20  ers are aligned 
1eb40 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a 76 6f  correctly..*/.vo
1eb50 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 49 66  id sqlite3ExprIf
1eb60 54 72 75 65 28 50 61 72 73 65 20 2a 70 50 61 72  True(Parse *pPar
1eb70 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c  se, Expr *pExpr,
1eb80 20 69 6e 74 20 64 65 73 74 2c 20 69 6e 74 20 6a   int dest, int j
1eb90 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 56 64  umpIfNull){.  Vd
1eba0 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
1ebb0 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 6f 70 20  pVdbe;.  int op 
1ebc0 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 67 46 72  = 0;.  int regFr
1ebd0 65 65 31 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  ee1 = 0;.  int r
1ebe0 65 67 46 72 65 65 32 20 3d 20 30 3b 0a 20 20 69  egFree2 = 0;.  i
1ebf0 6e 74 20 72 31 2c 20 72 32 3b 0a 0a 20 20 61 73  nt r1, r2;..  as
1ec00 73 65 72 74 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  sert( jumpIfNull
1ec10 3d 3d 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  ==SQLITE_JUMPIFN
1ec20 55 4c 4c 20 7c 7c 20 6a 75 6d 70 49 66 4e 75 6c  ULL || jumpIfNul
1ec30 6c 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 4e 45  l==0 );.  if( NE
1ec40 56 45 52 28 76 3d 3d 30 29 20 29 20 20 20 20 20  VER(v==0) )     
1ec50 72 65 74 75 72 6e 3b 20 20 2f 2a 20 45 78 69 73  return;  /* Exis
1ec60 74 65 6e 63 65 20 6f 66 20 56 44 42 45 20 63 68  tence of VDBE ch
1ec70 65 63 6b 65 64 20 62 79 20 63 61 6c 6c 65 72 20  ecked by caller 
1ec80 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70  */.  if( NEVER(p
1ec90 45 78 70 72 3d 3d 30 29 20 29 20 72 65 74 75 72  Expr==0) ) retur
1eca0 6e 3b 20 20 2f 2a 20 4e 6f 20 77 61 79 20 74 68  n;  /* No way th
1ecb0 69 73 20 63 61 6e 20 68 61 70 70 65 6e 20 2a 2f  is can happen */
1ecc0 0a 20 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f  .  op = pExpr->o
1ecd0 70 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20  p;.  switch( op 
1ece0 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41  ){.    case TK_A
1ecf0 4e 44 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  ND: {.      int 
1ed00 64 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  d2 = sqlite3Vdbe
1ed10 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
1ed20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75      testcase( ju
1ed30 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
1ed40 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1ed50 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
1ed60 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 32  pExpr->pLeft, d2
1ed70 2c 6a 75 6d 70 49 66 4e 75 6c 6c 5e 53 51 4c 49  ,jumpIfNull^SQLI
1ed80 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a  TE_JUMPIFNULL);.
1ed90 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1eda0 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73  rCachePush(pPars
1edb0 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
1edc0 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72  3ExprIfTrue(pPar
1edd0 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
1ede0 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  t, dest, jumpIfN
1edf0 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ull);.      sqli
1ee00 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
1ee10 62 65 6c 28 76 2c 20 64 32 29 3b 0a 20 20 20 20  bel(v, d2);.    
1ee20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
1ee30 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20  hePop(pParse);. 
1ee40 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1ee50 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52  }.    case TK_OR
1ee60 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61  : {.      testca
1ee70 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  se( jumpIfNull==
1ee80 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 );.      sqlit
1ee90 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61  e3ExprIfTrue(pPa
1eea0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
1eeb0 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  t, dest, jumpIfN
1eec0 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ull);.      sqli
1eed0 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68  te3ExprCachePush
1eee0 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
1eef0 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75  sqlite3ExprIfTru
1ef00 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
1ef10 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a  >pRight, dest, j
1ef20 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
1ef30 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
1ef40 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20  hePop(pParse);. 
1ef50 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1ef60 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f  }.    case TK_NO
1ef70 54 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63  T: {.      testc
1ef80 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  ase( jumpIfNull=
1ef90 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =0 );.      sqli
1efa0 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
1efb0 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
1efc0 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49  eft, dest, jumpI
1efd0 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72  fNull);.      br
1efe0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
1eff0 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63  ase TK_LT:.    c
1f000 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63  ase TK_LE:.    c
1f010 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63  ase TK_GT:.    c
1f020 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63  ase TK_GE:.    c
1f030 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63  ase TK_NE:.    c
1f040 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20  ase TK_EQ: {.   
1f050 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d     testcase( jum
1f060 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
1f070 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
1f080 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
1f090 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
1f0a0 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20  t, &regFree1);. 
1f0b0 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65       r2 = sqlite
1f0c0 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
1f0d0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69  arse, pExpr->pRi
1f0e0 67 68 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b  ght, &regFree2);
1f0f0 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61  .      codeCompa
1f100 72 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  re(pParse, pExpr
1f110 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e  ->pLeft, pExpr->
1f120 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20  pRight, op,.    
1f130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 31                r1
1f140 2c 20 72 32 2c 20 64 65 73 74 2c 20 6a 75 6d 70  , r2, dest, jump
1f150 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 61  IfNull);.      a
1f160 73 73 65 72 74 28 54 4b 5f 4c 54 3d 3d 4f 50 5f  ssert(TK_LT==OP_
1f170 4c 74 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70  Lt); testcase(op
1f180 3d 3d 4f 50 5f 4c 74 29 3b 20 56 64 62 65 43 6f  ==OP_Lt); VdbeCo
1f190 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f  verageIf(v,op==O
1f1a0 50 5f 4c 74 29 3b 0a 20 20 20 20 20 20 61 73 73  P_Lt);.      ass
1f1b0 65 72 74 28 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65  ert(TK_LE==OP_Le
1f1c0 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d  ); testcase(op==
1f1d0 4f 50 5f 4c 65 29 3b 20 56 64 62 65 43 6f 76 65  OP_Le); VdbeCove
1f1e0 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f  rageIf(v,op==OP_
1f1f0 4c 65 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Le);.      asser
1f200 74 28 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74 29 3b  t(TK_GT==OP_Gt);
1f210 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50   testcase(op==OP
1f220 5f 47 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61  _Gt); VdbeCovera
1f230 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 74  geIf(v,op==OP_Gt
1f240 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1f250 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65 29 3b 20 74  TK_GE==OP_Ge); t
1f260 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47  estcase(op==OP_G
1f270 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  e); VdbeCoverage
1f280 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 65 29 3b  If(v,op==OP_Ge);
1f290 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b  .      assert(TK
1f2a0 5f 45 51 3d 3d 4f 50 5f 45 71 29 3b 20 74 65 73  _EQ==OP_Eq); tes
1f2b0 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 45 71 29  tcase(op==OP_Eq)
1f2c0 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66  ; VdbeCoverageIf
1f2d0 28 76 2c 6f 70 3d 3d 4f 50 5f 45 71 29 3b 0a 20  (v,op==OP_Eq);. 
1f2e0 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4e       assert(TK_N
1f2f0 45 3d 3d 4f 50 5f 4e 65 29 3b 20 74 65 73 74 63  E==OP_Ne); testc
1f300 61 73 65 28 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 20  ase(op==OP_Ne); 
1f310 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
1f320 2c 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 0a 20 20 20  ,op==OP_Ne);.   
1f330 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
1f340 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
1f350 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
1f360 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree2==0 );.     
1f370 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1f380 20 20 63 61 73 65 20 54 4b 5f 49 53 3a 0a 20 20    case TK_IS:.  
1f390 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a    case TK_ISNOT:
1f3a0 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   {.      testcas
1f3b0 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a  e( op==TK_IS );.
1f3c0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1f3d0 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a  op==TK_ISNOT );.
1f3e0 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
1f3f0 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
1f400 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
1f410 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b  eft, &regFree1);
1f420 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69  .      r2 = sqli
1f430 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
1f440 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
1f450 52 69 67 68 74 2c 20 26 72 65 67 46 72 65 65 32  Right, &regFree2
1f460 29 3b 0a 20 20 20 20 20 20 6f 70 20 3d 20 28 6f  );.      op = (o
1f470 70 3d 3d 54 4b 5f 49 53 29 20 3f 20 54 4b 5f 45  p==TK_IS) ? TK_E
1f480 51 20 3a 20 54 4b 5f 4e 45 3b 0a 20 20 20 20 20  Q : TK_NE;.     
1f490 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61   codeCompare(pPa
1f4a0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
1f4b0 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  t, pExpr->pRight
1f4c0 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20  , op,.          
1f4d0 20 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c 20          r1, r2, 
1f4e0 64 65 73 74 2c 20 53 51 4c 49 54 45 5f 4e 55 4c  dest, SQLITE_NUL
1f4f0 4c 45 51 29 3b 0a 20 20 20 20 20 20 56 64 62 65  LEQ);.      Vdbe
1f500 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70  CoverageIf(v, op
1f510 3d 3d 54 4b 5f 45 51 29 3b 0a 20 20 20 20 20 20  ==TK_EQ);.      
1f520 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
1f530 2c 20 6f 70 3d 3d 54 4b 5f 4e 45 29 3b 0a 20 20  , op==TK_NE);.  
1f540 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
1f550 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20  gFree1==0 );.   
1f560 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
1f570 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20  Free2==0 );.    
1f580 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1f590 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c     case TK_ISNUL
1f5a0 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  L:.    case TK_N
1f5b0 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20  OTNULL: {.      
1f5c0 61 73 73 65 72 74 28 20 54 4b 5f 49 53 4e 55 4c  assert( TK_ISNUL
1f5d0 4c 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 20  L==OP_IsNull ); 
1f5e0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1f5f0 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20  TK_ISNULL );.   
1f600 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f     assert( TK_NO
1f610 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c  TNULL==OP_NotNul
1f620 6c 20 29 3b 20 74 65 73 74 63 61 73 65 28 20 6f  l ); testcase( o
1f630 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b  p==TK_NOTNULL );
1f640 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69  .      r1 = sqli
1f650 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
1f660 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
1f670 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29  Left, &regFree1)
1f680 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1f690 64 62 65 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c  dbeAddOp2(v, op,
1f6a0 20 72 31 2c 20 64 65 73 74 29 3b 0a 20 20 20 20   r1, dest);.    
1f6b0 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
1f6c0 28 76 2c 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c  (v, op==TK_ISNUL
1f6d0 4c 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  L);.      VdbeCo
1f6e0 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
1f6f0 54 4b 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a 20 20 20  TK_NOTNULL);.   
1f700 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
1f710 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
1f720 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1f730 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45     case TK_BETWE
1f740 45 4e 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74  EN: {.      test
1f750 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  case( jumpIfNull
1f760 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 65 78 70  ==0 );.      exp
1f770 72 43 6f 64 65 42 65 74 77 65 65 6e 28 70 50 61  rCodeBetween(pPa
1f780 72 73 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74  rse, pExpr, dest
1f790 2c 20 31 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  , 1, jumpIfNull)
1f7a0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1f7b0 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
1f7c0 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
1f7d0 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e  Y.    case TK_IN
1f7e0 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 65  : {.      int de
1f7f0 73 74 49 66 46 61 6c 73 65 20 3d 20 73 71 6c 69  stIfFalse = sqli
1f800 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
1f810 28 76 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 64  (v);.      int d
1f820 65 73 74 49 66 4e 75 6c 6c 20 3d 20 6a 75 6d 70  estIfNull = jump
1f830 49 66 4e 75 6c 6c 20 3f 20 64 65 73 74 20 3a 20  IfNull ? dest : 
1f840 64 65 73 74 49 66 46 61 6c 73 65 3b 0a 20 20 20  destIfFalse;.   
1f850 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
1f860 64 65 49 4e 28 70 50 61 72 73 65 2c 20 70 45 78  deIN(pParse, pEx
1f870 70 72 2c 20 64 65 73 74 49 66 46 61 6c 73 65 2c  pr, destIfFalse,
1f880 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20   destIfNull);.  
1f890 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1f8a0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
1f8b0 2c 20 30 2c 20 64 65 73 74 29 3b 0a 20 20 20 20  , 0, dest);.    
1f8c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
1f8d0 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 65 73  olveLabel(v, des
1f8e0 74 49 66 46 61 6c 73 65 29 3b 0a 20 20 20 20 20  tIfFalse);.     
1f8f0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
1f900 6e 64 69 66 0a 20 20 20 20 64 65 66 61 75 6c 74  ndif.    default
1f910 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 65 78  : {.      if( ex
1f920 70 72 41 6c 77 61 79 73 54 72 75 65 28 70 45 78  prAlwaysTrue(pEx
1f930 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73  pr) ){.        s
1f940 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1f950 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
1f960 64 65 73 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c  dest);.      }el
1f970 73 65 20 69 66 28 20 65 78 70 72 41 6c 77 61 79  se if( exprAlway
1f980 73 46 61 6c 73 65 28 70 45 78 70 72 29 20 29 7b  sFalse(pExpr) ){
1f990 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 2d 6f  .        /* No-o
1f9a0 70 20 2a 2f 0a 20 20 20 20 20 20 7d 65 6c 73 65  p */.      }else
1f9b0 7b 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20 73  {.        r1 = s
1f9c0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
1f9d0 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
1f9e0 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20  , &regFree1);.  
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 33 28 76 2c 20 4f 50 5f 49 66  eAddOp3(v, OP_If
1fa10 2c 20 72 31 2c 20 64 65 73 74 2c 20 6a 75 6d 70  , r1, dest, jump
1fa20 49 66 4e 75 6c 6c 21 3d 30 29 3b 0a 20 20 20 20  IfNull!=0);.    
1fa30 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
1fa40 28 76 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  (v);.        tes
1fa50 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
1fa60 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65  =0 );.        te
1fa70 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75  stcase( jumpIfNu
1fa80 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d  ll==0 );.      }
1fa90 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1faa0 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
1fab0 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
1fac0 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 31  pParse, regFree1
1fad0 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65  );.  sqlite3Rele
1fae0 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
1faf0 65 2c 20 72 65 67 46 72 65 65 32 29 3b 20 20 0a  e, regFree2);  .
1fb00 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
1fb10 65 20 63 6f 64 65 20 66 6f 72 20 61 20 62 6f 6f  e code for a boo
1fb20 6c 65 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  lean expression 
1fb30 73 75 63 68 20 74 68 61 74 20 61 20 6a 75 6d 70  such that a jump
1fb40 20 69 73 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 74   is made.** to t
1fb50 68 65 20 6c 61 62 65 6c 20 22 64 65 73 74 22 20  he label "dest" 
1fb60 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
1fb70 6e 20 69 73 20 66 61 6c 73 65 20 62 75 74 20 65  n is false but e
1fb80 78 65 63 75 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74  xecution.** cont
1fb90 69 6e 75 65 73 20 73 74 72 61 69 67 68 74 20 74  inues straight t
1fba0 68 72 75 20 69 66 20 74 68 65 20 65 78 70 72 65  hru if the expre
1fbb0 73 73 69 6f 6e 20 69 73 20 74 72 75 65 2e 0a 2a  ssion is true..*
1fbc0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72  *.** If the expr
1fbd0 65 73 73 69 6f 6e 20 65 76 61 6c 75 61 74 65 73  ession evaluates
1fbe0 20 74 6f 20 4e 55 4c 4c 20 28 6e 65 69 74 68 65   to NULL (neithe
1fbf0 72 20 74 72 75 65 20 6e 6f 72 20 66 61 6c 73 65  r true nor false
1fc00 29 20 74 68 65 6e 0a 2a 2a 20 6a 75 6d 70 20 69  ) then.** jump i
1fc10 66 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 69 73 20  f jumpIfNull is 
1fc20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
1fc30 4c 20 6f 72 20 66 61 6c 6c 20 74 68 72 6f 75 67  L or fall throug
1fc40 68 20 69 66 20 6a 75 6d 70 49 66 4e 75 6c 6c 0a  h if jumpIfNull.
1fc50 2a 2a 20 69 73 20 30 2e 0a 2a 2f 0a 76 6f 69 64  ** is 0..*/.void
1fc60 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
1fc70 6c 73 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  lse(Parse *pPars
1fc80 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  e, Expr *pExpr, 
1fc90 69 6e 74 20 64 65 73 74 2c 20 69 6e 74 20 6a 75  int dest, int ju
1fca0 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 56 64 62  mpIfNull){.  Vdb
1fcb0 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
1fcc0 56 64 62 65 3b 0a 20 20 69 6e 74 20 6f 70 20 3d  Vdbe;.  int op =
1fcd0 20 30 3b 0a 20 20 69 6e 74 20 72 65 67 46 72 65   0;.  int regFre
1fce0 65 31 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65  e1 = 0;.  int re
1fcf0 67 46 72 65 65 32 20 3d 20 30 3b 0a 20 20 69 6e  gFree2 = 0;.  in
1fd00 74 20 72 31 2c 20 72 32 3b 0a 0a 20 20 61 73 73  t r1, r2;..  ass
1fd10 65 72 74 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  ert( jumpIfNull=
1fd20 3d 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55  =SQLITE_JUMPIFNU
1fd30 4c 4c 20 7c 7c 20 6a 75 6d 70 49 66 4e 75 6c 6c  LL || jumpIfNull
1fd40 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 4e 45 56  ==0 );.  if( NEV
1fd50 45 52 28 76 3d 3d 30 29 20 29 20 72 65 74 75 72  ER(v==0) ) retur
1fd60 6e 3b 20 2f 2a 20 45 78 69 73 74 65 6e 63 65 20  n; /* Existence 
1fd70 6f 66 20 56 44 42 45 20 63 68 65 63 6b 65 64 20  of VDBE checked 
1fd80 62 79 20 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 69  by caller */.  i
1fd90 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20 20 20  f( pExpr==0 )   
1fda0 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 54   return;..  /* T
1fdb0 68 65 20 76 61 6c 75 65 20 6f 66 20 70 45 78 70  he value of pExp
1fdc0 72 2d 3e 6f 70 20 61 6e 64 20 6f 70 20 61 72 65  r->op and op are
1fdd0 20 72 65 6c 61 74 65 64 20 61 73 20 66 6f 6c 6c   related as foll
1fde0 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  ows:.  **.  **  
1fdf0 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 20       pExpr->op  
1fe00 20 20 20 20 20 20 20 20 20 20 6f 70 0a 20 20 2a            op.  *
1fe10 2a 20 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d  *       --------
1fe20 2d 20 20 20 20 20 20 20 20 20 20 2d 2d 2d 2d 2d  -          -----
1fe30 2d 2d 2d 2d 2d 0a 20 20 2a 2a 20 20 20 20 20 20  -----.  **      
1fe40 20 54 4b 5f 49 53 4e 55 4c 4c 20 20 20 20 20 20   TK_ISNULL      
1fe50 20 20 20 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 0a 20      OP_NotNull. 
1fe60 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4e 4f 54   **       TK_NOT
1fe70 4e 55 4c 4c 20 20 20 20 20 20 20 20 20 4f 50 5f  NULL         OP_
1fe80 49 73 4e 75 6c 6c 0a 20 20 2a 2a 20 20 20 20 20  IsNull.  **     
1fe90 20 20 54 4b 5f 4e 45 20 20 20 20 20 20 20 20 20    TK_NE         
1fea0 20 20 20 20 20 4f 50 5f 45 71 0a 20 20 2a 2a 20       OP_Eq.  ** 
1feb0 20 20 20 20 20 20 54 4b 5f 45 51 20 20 20 20 20        TK_EQ     
1fec0 20 20 20 20 20 20 20 20 20 4f 50 5f 4e 65 0a 20           OP_Ne. 
1fed0 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 47 54 20   **       TK_GT 
1fee0 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f               OP_
1fef0 4c 65 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b  Le.  **       TK
1ff00 5f 4c 45 20 20 20 20 20 20 20 20 20 20 20 20 20  _LE             
1ff10 20 4f 50 5f 47 74 0a 20 20 2a 2a 20 20 20 20 20   OP_Gt.  **     
1ff20 20 20 54 4b 5f 47 45 20 20 20 20 20 20 20 20 20    TK_GE         
1ff30 20 20 20 20 20 4f 50 5f 4c 74 0a 20 20 2a 2a 20       OP_Lt.  ** 
1ff40 20 20 20 20 20 20 54 4b 5f 4c 54 20 20 20 20 20        TK_LT     
1ff50 20 20 20 20 20 20 20 20 20 4f 50 5f 47 65 0a 20           OP_Ge. 
1ff60 20 2a 2a 0a 20 20 2a 2a 20 46 6f 72 20 6f 74 68   **.  ** For oth
1ff70 65 72 20 76 61 6c 75 65 73 20 6f 66 20 70 45 78  er values of pEx
1ff80 70 72 2d 3e 6f 70 2c 20 6f 70 20 69 73 20 75 6e  pr->op, op is un
1ff90 64 65 66 69 6e 65 64 20 61 6e 64 20 75 6e 75 73  defined and unus
1ffa0 65 64 2e 0a 20 20 2a 2a 20 54 68 65 20 76 61 6c  ed..  ** The val
1ffb0 75 65 20 6f 66 20 54 4b 5f 20 61 6e 64 20 4f 50  ue of TK_ and OP
1ffc0 5f 20 63 6f 6e 73 74 61 6e 74 73 20 61 72 65 20  _ constants are 
1ffd0 61 72 72 61 6e 67 65 64 20 73 75 63 68 20 74 68  arranged such th
1ffe0 61 74 20 77 65 0a 20 20 2a 2a 20 63 61 6e 20 63  at we.  ** can c
1fff0 6f 6d 70 75 74 65 20 74 68 65 20 6d 61 70 70 69  ompute the mappi
20000 6e 67 20 61 62 6f 76 65 20 75 73 69 6e 67 20 74  ng above using t
20010 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 78 70  he following exp
20020 72 65 73 73 69 6f 6e 2e 0a 20 20 2a 2a 20 41 73  ression..  ** As
20030 73 65 72 74 28 29 73 20 76 65 72 69 66 79 20 74  sert()s verify t
20040 68 61 74 20 74 68 65 20 63 6f 6d 70 75 74 61 74  hat the computat
20050 69 6f 6e 20 69 73 20 63 6f 72 72 65 63 74 2e 0a  ion is correct..
20060 20 20 2a 2f 0a 20 20 6f 70 20 3d 20 28 28 70 45    */.  op = ((pE
20070 78 70 72 2d 3e 6f 70 2b 28 54 4b 5f 49 53 4e 55  xpr->op+(TK_ISNU
20080 4c 4c 26 31 29 29 5e 31 29 2d 28 54 4b 5f 49 53  LL&1))^1)-(TK_IS
20090 4e 55 4c 4c 26 31 29 3b 0a 0a 20 20 2f 2a 20 56  NULL&1);..  /* V
200a0 65 72 69 66 79 20 63 6f 72 72 65 63 74 20 61 6c  erify correct al
200b0 69 67 6e 6d 65 6e 74 20 6f 66 20 54 4b 5f 20 61  ignment of TK_ a
200c0 6e 64 20 4f 50 5f 20 63 6f 6e 73 74 61 6e 74 73  nd OP_ constants
200d0 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
200e0 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 49 53  pExpr->op!=TK_IS
200f0 4e 55 4c 4c 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4e  NULL || op==OP_N
20100 6f 74 4e 75 6c 6c 20 29 3b 0a 20 20 61 73 73 65  otNull );.  asse
20110 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  rt( pExpr->op!=T
20120 4b 5f 4e 4f 54 4e 55 4c 4c 20 7c 7c 20 6f 70 3d  K_NOTNULL || op=
20130 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 0a 20 20  =OP_IsNull );.  
20140 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
20150 70 21 3d 54 4b 5f 4e 45 20 7c 7c 20 6f 70 3d 3d  p!=TK_NE || op==
20160 4f 50 5f 45 71 20 29 3b 0a 20 20 61 73 73 65 72  OP_Eq );.  asser
20170 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  t( pExpr->op!=TK
20180 5f 45 51 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4e 65  _EQ || op==OP_Ne
20190 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
201a0 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4c 54 20 7c  xpr->op!=TK_LT |
201b0 7c 20 6f 70 3d 3d 4f 50 5f 47 65 20 29 3b 0a 20  | op==OP_Ge );. 
201c0 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
201d0 6f 70 21 3d 54 4b 5f 4c 45 20 7c 7c 20 6f 70 3d  op!=TK_LE || op=
201e0 3d 4f 50 5f 47 74 20 29 3b 0a 20 20 61 73 73 65  =OP_Gt );.  asse
201f0 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  rt( pExpr->op!=T
20200 4b 5f 47 54 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c  K_GT || op==OP_L
20210 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
20220 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 47 45 20  Expr->op!=TK_GE 
20230 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c 74 20 29 3b 0a  || op==OP_Lt );.
20240 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72  .  switch( pExpr
20250 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ->op ){.    case
20260 20 54 4b 5f 41 4e 44 3a 20 7b 0a 20 20 20 20 20   TK_AND: {.     
20270 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
20280 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  fNull==0 );.    
20290 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
202a0 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 78  alse(pParse, pEx
202b0 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c  pr->pLeft, dest,
202c0 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
202d0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
202e0 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29  achePush(pParse)
202f0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
20300 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
20310 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  e, pExpr->pRight
20320 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
20330 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ll);.      sqlit
20340 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70  e3ExprCachePop(p
20350 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 62 72  Parse);.      br
20360 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
20370 61 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20  ase TK_OR: {.   
20380 20 20 20 69 6e 74 20 64 32 20 3d 20 73 71 6c 69     int d2 = sqli
20390 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
203a0 28 76 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  (v);.      testc
203b0 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  ase( jumpIfNull=
203c0 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =0 );.      sqli
203d0 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50  te3ExprIfTrue(pP
203e0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
203f0 66 74 2c 20 64 32 2c 20 6a 75 6d 70 49 66 4e 75  ft, d2, jumpIfNu
20400 6c 6c 5e 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46  ll^SQLITE_JUMPIF
20410 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 71 6c  NULL);.      sql
20420 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73  ite3ExprCachePus
20430 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  h(pParse);.     
20440 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
20450 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  lse(pParse, pExp
20460 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c  r->pRight, dest,
20470 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
20480 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
20490 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64  esolveLabel(v, d
204a0 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  2);.      sqlite
204b0 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50  3ExprCachePop(pP
204c0 61 72 73 65 29 3b 0a 20 20 20 20 20 20 62 72 65  arse);.      bre
204d0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
204e0 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20  se TK_NOT: {.   
204f0 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d     testcase( jum
20500 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
20510 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
20520 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45  fTrue(pParse, pE
20530 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74  xpr->pLeft, dest
20540 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
20550 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
20560 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54  }.    case TK_LT
20570 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45  :.    case TK_LE
20580 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54  :.    case TK_GT
20590 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45  :.    case TK_GE
205a0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45  :.    case TK_NE
205b0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51  :.    case TK_EQ
205c0 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61  : {.      testca
205d0 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  se( jumpIfNull==
205e0 30 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20  0 );.      r1 = 
205f0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
20600 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
20610 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72  r->pLeft, &regFr
20620 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d  ee1);.      r2 =
20630 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
20640 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
20650 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67  pr->pRight, &reg
20660 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 63 6f  Free2);.      co
20670 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65  deCompare(pParse
20680 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
20690 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f  pExpr->pRight, o
206a0 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  p,.             
206b0 20 20 20 20 20 72 31 2c 20 72 32 2c 20 64 65 73       r1, r2, des
206c0 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
206d0 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f        assert(TK_
206e0 4c 54 3d 3d 4f 50 5f 4c 74 29 3b 20 74 65 73 74  LT==OP_Lt); test
206f0 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 74 29 3b  case(op==OP_Lt);
20700 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
20710 76 2c 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a 20 20  v,op==OP_Lt);.  
20720 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4c 45      assert(TK_LE
20730 3d 3d 4f 50 5f 4c 65 29 3b 20 74 65 73 74 63 61  ==OP_Le); testca
20740 73 65 28 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 20 56  se(op==OP_Le); V
20750 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
20760 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 0a 20 20 20 20  op==OP_Le);.    
20770 20 20 61 73 73 65 72 74 28 54 4b 5f 47 54 3d 3d    assert(TK_GT==
20780 4f 50 5f 47 74 29 3b 20 74 65 73 74 63 61 73 65  OP_Gt); testcase
20790 28 6f 70 3d 3d 4f 50 5f 47 74 29 3b 20 56 64 62  (op==OP_Gt); Vdb
207a0 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70  eCoverageIf(v,op
207b0 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20 20 20 20 20  ==OP_Gt);.      
207c0 61 73 73 65 72 74 28 54 4b 5f 47 45 3d 3d 4f 50  assert(TK_GE==OP
207d0 5f 47 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f  _Ge); testcase(o
207e0 70 3d 3d 4f 50 5f 47 65 29 3b 20 56 64 62 65 43  p==OP_Ge); VdbeC
207f0 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d  overageIf(v,op==
20800 4f 50 5f 47 65 29 3b 0a 20 20 20 20 20 20 61 73  OP_Ge);.      as
20810 73 65 72 74 28 54 4b 5f 45 51 3d 3d 4f 50 5f 45  sert(TK_EQ==OP_E
20820 71 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d  q); testcase(op=
20830 3d 4f 50 5f 45 71 29 3b 20 56 64 62 65 43 6f 76  =OP_Eq); VdbeCov
20840 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50  erageIf(v,op==OP
20850 5f 45 71 29 3b 0a 20 20 20 20 20 20 61 73 73 65  _Eq);.      asse
20860 72 74 28 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 29  rt(TK_NE==OP_Ne)
20870 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f  ; testcase(op==O
20880 50 5f 4e 65 29 3b 20 56 64 62 65 43 6f 76 65 72  P_Ne); VdbeCover
20890 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4e  ageIf(v,op==OP_N
208a0 65 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  e);.      testca
208b0 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20  se( regFree1==0 
208c0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
208d0 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29  e( regFree2==0 )
208e0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
208f0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
20900 5f 49 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _IS:.    case TK
20910 5f 49 53 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20  _ISNOT: {.      
20920 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
20930 3e 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20 20  >op==TK_IS );.  
20940 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
20950 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f  xpr->op==TK_ISNO
20960 54 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20  T );.      r1 = 
20970 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
20980 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
20990 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72  r->pLeft, &regFr
209a0 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d  ee1);.      r2 =
209b0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
209c0 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
209d0 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67  pr->pRight, &reg
209e0 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 6f 70  Free2);.      op
209f0 20 3d 20 28 70 45 78 70 72 2d 3e 6f 70 3d 3d 54   = (pExpr->op==T
20a00 4b 5f 49 53 29 20 3f 20 54 4b 5f 4e 45 20 3a 20  K_IS) ? TK_NE : 
20a10 54 4b 5f 45 51 3b 0a 20 20 20 20 20 20 63 6f 64  TK_EQ;.      cod
20a20 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c  eCompare(pParse,
20a30 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70   pExpr->pLeft, p
20a40 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70  Expr->pRight, op
20a50 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
20a60 20 20 20 20 72 31 2c 20 72 32 2c 20 64 65 73 74      r1, r2, dest
20a70 2c 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29  , SQLITE_NULLEQ)
20a80 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
20a90 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b  rageIf(v, op==TK
20aa0 5f 45 51 29 3b 0a 20 20 20 20 20 20 56 64 62 65  _EQ);.      Vdbe
20ab0 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70  CoverageIf(v, op
20ac0 3d 3d 54 4b 5f 4e 45 29 3b 0a 20 20 20 20 20 20  ==TK_NE);.      
20ad0 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
20ae0 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74  e1==0 );.      t
20af0 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
20b00 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72  2==0 );.      br
20b10 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
20b20 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20  ase TK_ISNULL:. 
20b30 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55     case TK_NOTNU
20b40 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 72 31 20 3d  LL: {.      r1 =
20b50 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
20b60 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
20b70 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46  pr->pLeft, &regF
20b80 72 65 65 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  ree1);.      sql
20b90 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
20ba0 2c 20 6f 70 2c 20 72 31 2c 20 64 65 73 74 29 3b  , op, r1, dest);
20bb0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
20bc0 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29   op==TK_ISNULL )
20bd0 3b 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65  ;   VdbeCoverage
20be0 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 49 53 4e  If(v, op==TK_ISN
20bf0 55 4c 4c 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ULL);.      test
20c00 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54  case( op==TK_NOT
20c10 4e 55 4c 4c 20 29 3b 20 20 56 64 62 65 43 6f 76  NULL );  VdbeCov
20c20 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54  erageIf(v, op==T
20c30 4b 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a 20 20 20 20  K_NOTNULL);.    
20c40 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
20c50 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
20c60 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
20c70 20 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45    case TK_BETWEE
20c80 4e 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63  N: {.      testc
20c90 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  ase( jumpIfNull=
20ca0 3d 30 20 29 3b 0a 20 20 20 20 20 20 65 78 70 72  =0 );.      expr
20cb0 43 6f 64 65 42 65 74 77 65 65 6e 28 70 50 61 72  CodeBetween(pPar
20cc0 73 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74 2c  se, pExpr, dest,
20cd0 20 30 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b   0, jumpIfNull);
20ce0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
20cf0 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
20d00 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
20d10 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a  .    case TK_IN:
20d20 20 7b 0a 20 20 20 20 20 20 69 66 28 20 6a 75 6d   {.      if( jum
20d30 70 49 66 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20  pIfNull ){.     
20d40 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
20d50 64 65 49 4e 28 70 50 61 72 73 65 2c 20 70 45 78  deIN(pParse, pEx
20d60 70 72 2c 20 64 65 73 74 2c 20 64 65 73 74 29 3b  pr, dest, dest);
20d70 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
20d80 20 20 20 20 20 20 69 6e 74 20 64 65 73 74 49 66        int destIf
20d90 4e 75 6c 6c 20 3d 20 73 71 6c 69 74 65 33 56 64  Null = sqlite3Vd
20da0 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
20db0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
20dc0 78 70 72 43 6f 64 65 49 4e 28 70 50 61 72 73 65  xprCodeIN(pParse
20dd0 2c 20 70 45 78 70 72 2c 20 64 65 73 74 2c 20 64  , pExpr, dest, d
20de0 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  estIfNull);.    
20df0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
20e00 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64  esolveLabel(v, d
20e10 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  estIfNull);.    
20e20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
20e30 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
20e40 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
20e50 20 20 20 69 66 28 20 65 78 70 72 41 6c 77 61 79     if( exprAlway
20e60 73 46 61 6c 73 65 28 70 45 78 70 72 29 20 29 7b  sFalse(pExpr) ){
20e70 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
20e80 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
20e90 5f 47 6f 74 6f 2c 20 30 2c 20 64 65 73 74 29 3b  _Goto, 0, dest);
20ea0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
20eb0 20 65 78 70 72 41 6c 77 61 79 73 54 72 75 65 28   exprAlwaysTrue(
20ec0 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20  pExpr) ){.      
20ed0 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 20 20    /* no-op */.  
20ee0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
20ef0 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
20f00 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
20f10 73 65 2c 20 70 45 78 70 72 2c 20 26 72 65 67 46  se, pExpr, &regF
20f20 72 65 65 31 29 3b 0a 20 20 20 20 20 20 20 20 73  ree1);.        s
20f30 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
20f40 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 72 31  (v, OP_IfNot, r1
20f50 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
20f60 6c 6c 21 3d 30 29 3b 0a 20 20 20 20 20 20 20 20  ll!=0);.        
20f70 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
20f80 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
20f90 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  e( regFree1==0 )
20fa0 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
20fb0 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  se( jumpIfNull==
20fc0 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  0 );.      }.   
20fd0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
20fe0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c    }.  sqlite3Rel
20ff0 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
21000 73 65 2c 20 72 65 67 46 72 65 65 31 29 3b 0a 20  se, regFree1);. 
21010 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
21020 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
21030 65 67 46 72 65 65 32 29 3b 0a 7d 0a 0a 2f 2a 0a  egFree2);.}../*.
21040 2a 2a 20 44 6f 20 61 20 64 65 65 70 20 63 6f 6d  ** Do a deep com
21050 70 61 72 69 73 6f 6e 20 6f 66 20 74 77 6f 20 65  parison of two e
21060 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 73 2e  xpression trees.
21070 20 20 52 65 74 75 72 6e 20 30 20 69 66 20 74 68    Return 0 if th
21080 65 20 74 77 6f 0a 2a 2a 20 65 78 70 72 65 73 73  e two.** express
21090 69 6f 6e 73 20 61 72 65 20 63 6f 6d 70 6c 65 74  ions are complet
210a0 65 6c 79 20 69 64 65 6e 74 69 63 61 6c 2e 20 20  ely identical.  
210b0 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 79  Return 1 if they
210c0 20 64 69 66 66 65 72 20 6f 6e 6c 79 0a 2a 2a 20   differ only.** 
210d0 62 79 20 61 20 43 4f 4c 4c 41 54 45 20 6f 70 65  by a COLLATE ope
210e0 72 61 74 6f 72 20 61 74 20 74 68 65 20 74 6f 70  rator at the top
210f0 20 6c 65 76 65 6c 2e 20 20 52 65 74 75 72 6e 20   level.  Return 
21100 32 20 69 66 20 74 68 65 72 65 20 61 72 65 20 64  2 if there are d
21110 69 66 66 65 72 65 6e 63 65 73 0a 2a 2a 20 6f 74  ifferences.** ot
21120 68 65 72 20 74 68 61 6e 20 74 68 65 20 74 6f 70  her than the top
21130 2d 6c 65 76 65 6c 20 43 4f 4c 4c 41 54 45 20 6f  -level COLLATE o
21140 70 65 72 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49  perator..**.** I
21150 66 20 61 6e 79 20 73 75 62 65 6c 65 6d 65 6e 74  f any subelement
21160 20 6f 66 20 70 42 20 68 61 73 20 45 78 70 72 2e   of pB has Expr.
21170 69 54 61 62 6c 65 3d 3d 28 2d 31 29 20 74 68 65  iTable==(-1) the
21180 6e 20 69 74 20 69 73 20 61 6c 6c 6f 77 65 64 0a  n it is allowed.
21190 2a 2a 20 74 6f 20 63 6f 6d 70 61 72 65 20 65 71  ** to compare eq
211a0 75 61 6c 20 74 6f 20 61 6e 20 65 71 75 69 76 61  ual to an equiva
211b0 6c 65 6e 74 20 65 6c 65 6d 65 6e 74 20 69 6e 20  lent element in 
211c0 70 41 20 77 69 74 68 20 45 78 70 72 2e 69 54 61  pA with Expr.iTa
211d0 62 6c 65 3d 3d 69 54 61 62 2e 0a 2a 2a 0a 2a 2a  ble==iTab..**.**
211e0 20 54 68 65 20 70 41 20 73 69 64 65 20 6d 69 67   The pA side mig
211f0 68 74 20 62 65 20 75 73 69 6e 67 20 54 4b 5f 52  ht be using TK_R
21200 45 47 49 53 54 45 52 2e 20 20 49 66 20 74 68 61  EGISTER.  If tha
21210 74 20 69 73 20 74 68 65 20 63 61 73 65 20 61 6e  t is the case an
21220 64 20 70 42 20 69 73 0a 2a 2a 20 6e 6f 74 20 75  d pB is.** not u
21230 73 69 6e 67 20 54 4b 5f 52 45 47 49 53 54 45 52  sing TK_REGISTER
21240 20 62 75 74 20 69 73 20 6f 74 68 65 72 77 69 73   but is otherwis
21250 65 20 65 71 75 69 76 61 6c 65 6e 74 2c 20 74 68  e equivalent, th
21260 65 6e 20 73 74 69 6c 6c 20 72 65 74 75 72 6e 20  en still return 
21270 30 2e 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d  0..**.** Sometim
21280 65 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  es this routine 
21290 77 69 6c 6c 20 72 65 74 75 72 6e 20 32 20 65 76  will return 2 ev
212a0 65 6e 20 69 66 20 74 68 65 20 74 77 6f 20 65 78  en if the two ex
212b0 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 72 65 61  pressions.** rea
212c0 6c 6c 79 20 61 72 65 20 65 71 75 69 76 61 6c 65  lly are equivale
212d0 6e 74 2e 20 20 49 66 20 77 65 20 63 61 6e 6e 6f  nt.  If we canno
212e0 74 20 70 72 6f 76 65 20 74 68 61 74 20 74 68 65  t prove that the
212f0 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65   expressions are
21300 0a 2a 2a 20 69 64 65 6e 74 69 63 61 6c 2c 20 77  .** identical, w
21310 65 20 72 65 74 75 72 6e 20 32 20 6a 75 73 74 20  e return 2 just 
21320 74 6f 20 62 65 20 73 61 66 65 2e 20 20 53 6f 20  to be safe.  So 
21330 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  if this routine.
21340 2a 2a 20 72 65 74 75 72 6e 73 20 32 2c 20 74 68  ** returns 2, th
21350 65 6e 20 79 6f 75 20 64 6f 20 6e 6f 74 20 72 65  en you do not re
21360 61 6c 6c 79 20 6b 6e 6f 77 20 66 6f 72 20 63 65  ally know for ce
21370 72 74 61 69 6e 20 69 66 20 74 68 65 20 74 77 6f  rtain if the two
21380 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20  .** expressions 
21390 61 72 65 20 74 68 65 20 73 61 6d 65 2e 20 20 42  are the same.  B
213a0 75 74 20 69 66 20 79 6f 75 20 67 65 74 20 61 20  ut if you get a 
213b0 30 20 6f 72 20 31 20 72 65 74 75 72 6e 2c 20 74  0 or 1 return, t
213c0 68 65 6e 20 79 6f 75 0a 2a 2a 20 63 61 6e 20 62  hen you.** can b
213d0 65 20 73 75 72 65 20 74 68 65 20 65 78 70 72 65  e sure the expre
213e0 73 73 69 6f 6e 73 20 61 72 65 20 74 68 65 20 73  ssions are the s
213f0 61 6d 65 2e 20 20 49 6e 20 74 68 65 20 70 6c 61  ame.  In the pla
21400 63 65 73 20 77 68 65 72 65 0a 2a 2a 20 74 68 69  ces where.** thi
21410 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
21420 64 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 68  d, it does not h
21430 75 72 74 20 74 6f 20 67 65 74 20 61 6e 20 65 78  urt to get an ex
21440 74 72 61 20 32 20 2d 20 74 68 61 74 0a 2a 2a 20  tra 2 - that.** 
21450 6a 75 73 74 20 6d 69 67 68 74 20 72 65 73 75 6c  just might resul
21460 74 20 69 6e 20 73 6f 6d 65 20 73 6c 69 67 68 74  t in some slight
21470 6c 79 20 73 6c 6f 77 65 72 20 63 6f 64 65 2e 20  ly slower code. 
21480 20 42 75 74 20 72 65 74 75 72 6e 69 6e 67 0a 2a   But returning.*
21490 2a 20 61 6e 20 69 6e 63 6f 72 72 65 63 74 20 30  * an incorrect 0
214a0 20 6f 72 20 31 20 63 6f 75 6c 64 20 6c 65 61 64   or 1 could lead
214b0 20 74 6f 20 61 20 6d 61 6c 66 75 6e 63 74 69 6f   to a malfunctio
214c0 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  n..*/.int sqlite
214d0 33 45 78 70 72 43 6f 6d 70 61 72 65 28 45 78 70  3ExprCompare(Exp
214e0 72 20 2a 70 41 2c 20 45 78 70 72 20 2a 70 42 2c  r *pA, Expr *pB,
214f0 20 69 6e 74 20 69 54 61 62 29 7b 0a 20 20 75 33   int iTab){.  u3
21500 32 20 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73 3b  2 combinedFlags;
21510 0a 20 20 69 66 28 20 70 41 3d 3d 30 20 7c 7c 20  .  if( pA==0 || 
21520 70 42 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  pB==0 ){.    ret
21530 75 72 6e 20 70 42 3d 3d 70 41 20 3f 20 30 20 3a  urn pB==pA ? 0 :
21540 20 32 3b 0a 20 20 7d 0a 20 20 63 6f 6d 62 69 6e   2;.  }.  combin
21550 65 64 46 6c 61 67 73 20 3d 20 70 41 2d 3e 66 6c  edFlags = pA->fl
21560 61 67 73 20 7c 20 70 42 2d 3e 66 6c 61 67 73 3b  ags | pB->flags;
21570 0a 20 20 69 66 28 20 63 6f 6d 62 69 6e 65 64 46  .  if( combinedF
21580 6c 61 67 73 20 26 20 45 50 5f 49 6e 74 56 61 6c  lags & EP_IntVal
21590 75 65 20 29 7b 0a 20 20 20 20 69 66 28 20 28 70  ue ){.    if( (p
215a0 41 2d 3e 66 6c 61 67 73 26 70 42 2d 3e 66 6c 61  A->flags&pB->fla
215b0 67 73 26 45 50 5f 49 6e 74 56 61 6c 75 65 29 21  gs&EP_IntValue)!
215c0 3d 30 20 26 26 20 70 41 2d 3e 75 2e 69 56 61 6c  =0 && pA->u.iVal
215d0 75 65 3d 3d 70 42 2d 3e 75 2e 69 56 61 6c 75 65  ue==pB->u.iValue
215e0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
215f0 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65   0;.    }.    re
21600 74 75 72 6e 20 32 3b 0a 20 20 7d 0a 20 20 69 66  turn 2;.  }.  if
21610 28 20 70 41 2d 3e 6f 70 21 3d 70 42 2d 3e 6f 70  ( pA->op!=pB->op
21620 20 29 7b 0a 20 20 20 20 69 66 28 20 70 41 2d 3e   ){.    if( pA->
21630 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 26  op==TK_COLLATE &
21640 26 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  & sqlite3ExprCom
21650 70 61 72 65 28 70 41 2d 3e 70 4c 65 66 74 2c 20  pare(pA->pLeft, 
21660 70 42 2c 20 69 54 61 62 29 3c 32 20 29 7b 0a 20  pB, iTab)<2 ){. 
21670 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
21680 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 42 2d     }.    if( pB-
21690 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20  >op==TK_COLLATE 
216a0 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  && sqlite3ExprCo
216b0 6d 70 61 72 65 28 70 41 2c 20 70 42 2d 3e 70 4c  mpare(pA, pB->pL
216c0 65 66 74 2c 20 69 54 61 62 29 3c 32 20 29 7b 0a  eft, iTab)<2 ){.
216d0 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
216e0 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
216f0 20 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 41   2;.  }.  if( pA
21700 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op!=TK_COLUMN 
21710 26 26 20 41 4c 57 41 59 53 28 70 41 2d 3e 6f 70  && ALWAYS(pA->op
21720 21 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 29  !=TK_AGG_COLUMN)
21730 20 26 26 20 70 41 2d 3e 75 2e 7a 54 6f 6b 65 6e   && pA->u.zToken
21740 20 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63   ){.    if( strc
21750 6d 70 28 70 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  mp(pA->u.zToken,
21760 70 42 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 21 3d 30  pB->u.zToken)!=0
21770 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
21780 20 70 41 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c   pA->op==TK_COLL
21790 41 54 45 20 3f 20 31 20 3a 20 32 3b 0a 20 20 20  ATE ? 1 : 2;.   
217a0 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 41   }.  }.  if( (pA
217b0 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 44 69 73  ->flags & EP_Dis
217c0 74 69 6e 63 74 29 21 3d 28 70 42 2d 3e 66 6c 61  tinct)!=(pB->fla
217d0 67 73 20 26 20 45 50 5f 44 69 73 74 69 6e 63 74  gs & EP_Distinct
217e0 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20  ) ) return 2;.  
217f0 69 66 28 20 41 4c 57 41 59 53 28 28 63 6f 6d 62  if( ALWAYS((comb
21800 69 6e 65 64 46 6c 61 67 73 20 26 20 45 50 5f 54  inedFlags & EP_T
21810 6f 6b 65 6e 4f 6e 6c 79 29 3d 3d 30 29 20 29 7b  okenOnly)==0) ){
21820 0a 20 20 20 20 69 66 28 20 63 6f 6d 62 69 6e 65  .    if( combine
21830 64 46 6c 61 67 73 20 26 20 45 50 5f 78 49 73 53  dFlags & EP_xIsS
21840 65 6c 65 63 74 20 29 20 72 65 74 75 72 6e 20 32  elect ) return 2
21850 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
21860 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 41 2d  3ExprCompare(pA-
21870 3e 70 4c 65 66 74 2c 20 70 42 2d 3e 70 4c 65 66  >pLeft, pB->pLef
21880 74 2c 20 69 54 61 62 29 20 29 20 72 65 74 75 72  t, iTab) ) retur
21890 6e 20 32 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  n 2;.    if( sql
218a0 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28  ite3ExprCompare(
218b0 70 41 2d 3e 70 52 69 67 68 74 2c 20 70 42 2d 3e  pA->pRight, pB->
218c0 70 52 69 67 68 74 2c 20 69 54 61 62 29 20 29 20  pRight, iTab) ) 
218d0 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 69 66  return 2;.    if
218e0 28 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  ( sqlite3ExprLis
218f0 74 43 6f 6d 70 61 72 65 28 70 41 2d 3e 78 2e 70  tCompare(pA->x.p
21900 4c 69 73 74 2c 20 70 42 2d 3e 78 2e 70 4c 69 73  List, pB->x.pLis
21910 74 2c 20 69 54 61 62 29 20 29 20 72 65 74 75 72  t, iTab) ) retur
21920 6e 20 32 3b 0a 20 20 20 20 69 66 28 20 41 4c 57  n 2;.    if( ALW
21930 41 59 53 28 28 63 6f 6d 62 69 6e 65 64 46 6c 61  AYS((combinedFla
21940 67 73 20 26 20 45 50 5f 52 65 64 75 63 65 64 29  gs & EP_Reduced)
21950 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 69 66  ==0) ){.      if
21960 28 20 70 41 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70  ( pA->iColumn!=p
21970 42 2d 3e 69 43 6f 6c 75 6d 6e 20 29 20 72 65 74  B->iColumn ) ret
21980 75 72 6e 20 32 3b 0a 20 20 20 20 20 20 69 66 28  urn 2;.      if(
21990 20 70 41 2d 3e 69 54 61 62 6c 65 21 3d 70 42 2d   pA->iTable!=pB-
219a0 3e 69 54 61 62 6c 65 20 0a 20 20 20 20 20 20 20  >iTable .       
219b0 26 26 20 28 70 41 2d 3e 69 54 61 62 6c 65 21 3d  && (pA->iTable!=
219c0 69 54 61 62 20 7c 7c 20 4e 45 56 45 52 28 70 42  iTab || NEVER(pB
219d0 2d 3e 69 54 61 62 6c 65 3e 3d 30 29 29 20 29 20  ->iTable>=0)) ) 
219e0 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d 0a  return 2;.    }.
219f0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
21a00 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65  }../*.** Compare
21a10 20 74 77 6f 20 45 78 70 72 4c 69 73 74 20 6f 62   two ExprList ob
21a20 6a 65 63 74 73 2e 20 20 52 65 74 75 72 6e 20 30  jects.  Return 0
21a30 20 69 66 20 74 68 65 79 20 61 72 65 20 69 64 65   if they are ide
21a40 6e 74 69 63 61 6c 20 61 6e 64 20 0a 2a 2a 20 6e  ntical and .** n
21a50 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 79 20  on-zero if they 
21a60 64 69 66 66 65 72 20 69 6e 20 61 6e 79 20 77 61  differ in any wa
21a70 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 20  y..**.** If any 
21a80 73 75 62 65 6c 65 6d 65 6e 74 20 6f 66 20 70 42  subelement of pB
21a90 20 68 61 73 20 45 78 70 72 2e 69 54 61 62 6c 65   has Expr.iTable
21aa0 3d 3d 28 2d 31 29 20 74 68 65 6e 20 69 74 20 69  ==(-1) then it i
21ab0 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20  s allowed.** to 
21ac0 63 6f 6d 70 61 72 65 20 65 71 75 61 6c 20 74 6f  compare equal to
21ad0 20 61 6e 20 65 71 75 69 76 61 6c 65 6e 74 20 65   an equivalent e
21ae0 6c 65 6d 65 6e 74 20 69 6e 20 70 41 20 77 69 74  lement in pA wit
21af0 68 20 45 78 70 72 2e 69 54 61 62 6c 65 3d 3d 69  h Expr.iTable==i
21b00 54 61 62 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  Tab..**.** This 
21b10 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 72 65  routine might re
21b20 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 66 6f  turn non-zero fo
21b30 72 20 65 71 75 69 76 61 6c 65 6e 74 20 45 78 70  r equivalent Exp
21b40 72 4c 69 73 74 73 2e 20 20 54 68 65 0a 2a 2a 20  rLists.  The.** 
21b50 6f 6e 6c 79 20 63 6f 6e 73 65 71 75 65 6e 63 65  only consequence
21b60 20 77 69 6c 6c 20 62 65 20 64 69 73 61 62 6c 65   will be disable
21b70 64 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 2e  d optimizations.
21b80 20 20 42 75 74 20 74 68 69 73 20 72 6f 75 74 69    But this routi
21b90 6e 65 0a 2a 2a 20 6d 75 73 74 20 6e 65 76 65 72  ne.** must never
21ba0 20 72 65 74 75 72 6e 20 30 20 69 66 20 74 68 65   return 0 if the
21bb0 20 74 77 6f 20 45 78 70 72 4c 69 73 74 20 6f 62   two ExprList ob
21bc0 6a 65 63 74 73 20 61 72 65 20 64 69 66 66 65 72  jects are differ
21bd0 65 6e 74 2c 20 6f 72 0a 2a 2a 20 61 20 6d 61 6c  ent, or.** a mal
21be0 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 72 65  function will re
21bf0 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 54 77 6f 20  sult..**.** Two 
21c00 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 73 20 61 72  NULL pointers ar
21c10 65 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20  e considered to 
21c20 62 65 20 74 68 65 20 73 61 6d 65 2e 20 20 42 75  be the same.  Bu
21c30 74 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72  t a NULL pointer
21c40 0a 2a 2a 20 61 6c 77 61 79 73 20 64 69 66 66 65  .** always diffe
21c50 72 73 20 66 72 6f 6d 20 61 20 6e 6f 6e 2d 4e 55  rs from a non-NU
21c60 4c 4c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 69  LL pointer..*/.i
21c70 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  nt sqlite3ExprLi
21c80 73 74 43 6f 6d 70 61 72 65 28 45 78 70 72 4c 69  stCompare(ExprLi
21c90 73 74 20 2a 70 41 2c 20 45 78 70 72 4c 69 73 74  st *pA, ExprList
21ca0 20 2a 70 42 2c 20 69 6e 74 20 69 54 61 62 29 7b   *pB, int iTab){
21cb0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
21cc0 70 41 3d 3d 30 20 26 26 20 70 42 3d 3d 30 20 29  pA==0 && pB==0 )
21cd0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
21ce0 20 70 41 3d 3d 30 20 7c 7c 20 70 42 3d 3d 30 20   pA==0 || pB==0 
21cf0 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66  ) return 1;.  if
21d00 28 20 70 41 2d 3e 6e 45 78 70 72 21 3d 70 42 2d  ( pA->nExpr!=pB-
21d10 3e 6e 45 78 70 72 20 29 20 72 65 74 75 72 6e 20  >nExpr ) return 
21d20 31 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  1;.  for(i=0; i<
21d30 70 41 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  pA->nExpr; i++){
21d40 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72  .    Expr *pExpr
21d50 41 20 3d 20 70 41 2d 3e 61 5b 69 5d 2e 70 45 78  A = pA->a[i].pEx
21d60 70 72 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 45  pr;.    Expr *pE
21d70 78 70 72 42 20 3d 20 70 42 2d 3e 61 5b 69 5d 2e  xprB = pB->a[i].
21d80 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70  pExpr;.    if( p
21d90 41 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65  A->a[i].sortOrde
21da0 72 21 3d 70 42 2d 3e 61 5b 69 5d 2e 73 6f 72 74  r!=pB->a[i].sort
21db0 4f 72 64 65 72 20 29 20 72 65 74 75 72 6e 20 31  Order ) return 1
21dc0 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
21dd0 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 45 78  3ExprCompare(pEx
21de0 70 72 41 2c 20 70 45 78 70 72 42 2c 20 69 54 61  prA, pExprB, iTa
21df0 62 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  b) ) return 1;. 
21e00 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
21e10 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
21e20 72 75 65 20 69 66 20 77 65 20 63 61 6e 20 70 72  rue if we can pr
21e30 6f 76 65 20 74 68 65 20 70 45 32 20 77 69 6c 6c  ove the pE2 will
21e40 20 61 6c 77 61 79 73 20 62 65 20 74 72 75 65 20   always be true 
21e50 69 66 20 70 45 31 20 69 73 0a 2a 2a 20 74 72 75  if pE1 is.** tru
21e60 65 2e 20 20 52 65 74 75 72 6e 20 66 61 6c 73 65  e.  Return false
21e70 20 69 66 20 77 65 20 63 61 6e 6e 6f 74 20 63 6f   if we cannot co
21e80 6d 70 6c 65 74 65 20 74 68 65 20 70 72 6f 6f 66  mplete the proof
21e90 20 6f 72 20 69 66 20 70 45 32 20 6d 69 67 68 74   or if pE2 might
21ea0 0a 2a 2a 20 62 65 20 66 61 6c 73 65 2e 20 20 45  .** be false.  E
21eb0 78 61 6d 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  xamples:.**.**  
21ec0 20 20 20 70 45 31 3a 20 78 3d 3d 35 20 20 20 20     pE1: x==5    
21ed0 20 20 20 70 45 32 3a 20 78 3d 3d 35 20 20 20 20     pE2: x==5    
21ee0 20 20 20 20 20 20 20 20 20 52 65 73 75 6c 74 3a           Result:
21ef0 20 74 72 75 65 0a 2a 2a 20 20 20 20 20 70 45 31   true.**     pE1
21f00 3a 20 78 3e 30 20 20 20 20 20 20 20 20 70 45 32  : x>0        pE2
21f10 3a 20 78 3d 3d 35 20 20 20 20 20 20 20 20 20 20  : x==5          
21f20 20 20 20 52 65 73 75 6c 74 3a 20 66 61 6c 73 65     Result: false
21f30 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78 3d 32  .**     pE1: x=2
21f40 31 20 20 20 20 20 20 20 70 45 32 3a 20 78 3d 32  1       pE2: x=2
21f50 31 20 4f 52 20 79 3d 34 33 20 20 20 20 20 52 65  1 OR y=43     Re
21f60 73 75 6c 74 3a 20 74 72 75 65 0a 2a 2a 20 20 20  sult: true.**   
21f70 20 20 70 45 31 3a 20 78 21 3d 31 32 33 20 20 20    pE1: x!=123   
21f80 20 20 70 45 32 3a 20 78 20 49 53 20 4e 4f 54 20    pE2: x IS NOT 
21f90 4e 55 4c 4c 20 20 20 20 52 65 73 75 6c 74 3a 20  NULL    Result: 
21fa0 74 72 75 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a  true.**     pE1:
21fb0 20 78 21 3d 3f 31 20 20 20 20 20 20 70 45 32 3a   x!=?1      pE2:
21fc0 20 78 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20   x IS NOT NULL  
21fd0 20 20 52 65 73 75 6c 74 3a 20 74 72 75 65 0a 2a    Result: true.*
21fe0 2a 20 20 20 20 20 70 45 31 3a 20 78 20 49 53 20  *     pE1: x IS 
21ff0 4e 55 4c 4c 20 20 70 45 32 3a 20 78 20 49 53 20  NULL  pE2: x IS 
22000 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 52 65 73 75  NOT NULL    Resu
22010 6c 74 3a 20 66 61 6c 73 65 0a 2a 2a 20 20 20 20  lt: false.**    
22020 20 70 45 31 3a 20 78 20 49 53 20 3f 32 20 20 20   pE1: x IS ?2   
22030 20 70 45 32 3a 20 78 20 49 53 20 4e 4f 54 20 4e   pE2: x IS NOT N
22040 55 4c 4c 20 20 20 20 52 65 75 73 6c 74 3a 20 66  ULL    Reuslt: f
22050 61 6c 73 65 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  alse.**.** When 
22060 63 6f 6d 70 61 72 69 6e 67 20 54 4b 5f 43 4f 4c  comparing TK_COL
22070 55 4d 4e 20 6e 6f 64 65 73 20 62 65 74 77 65 65  UMN nodes betwee
22080 6e 20 70 45 31 20 61 6e 64 20 70 45 32 2c 20 69  n pE1 and pE2, i
22090 66 20 70 45 32 20 68 61 73 0a 2a 2a 20 45 78 70  f pE2 has.** Exp
220a0 72 2e 69 54 61 62 6c 65 3c 30 20 74 68 65 6e 20  r.iTable<0 then 
220b0 61 73 73 75 6d 65 20 61 20 74 61 62 6c 65 20 6e  assume a table n
220c0 75 6d 62 65 72 20 67 69 76 65 6e 20 62 79 20 69  umber given by i
220d0 54 61 62 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  Tab..**.** When 
220e0 69 6e 20 64 6f 75 62 74 2c 20 72 65 74 75 72 6e  in doubt, return
220f0 20 66 61 6c 73 65 2e 20 20 52 65 74 75 72 6e 69   false.  Returni
22100 6e 67 20 74 72 75 65 20 6d 69 67 68 74 20 67 69  ng true might gi
22110 76 65 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65  ve a performance
22120 0a 2a 2a 20 69 6d 70 72 6f 76 65 6d 65 6e 74 2e  .** improvement.
22130 20 20 52 65 74 75 72 6e 69 6e 67 20 66 61 6c 73    Returning fals
22140 65 20 6d 69 67 68 74 20 63 61 75 73 65 20 61 20  e might cause a 
22150 70 65 72 66 6f 72 6d 61 6e 63 65 20 72 65 64 75  performance redu
22160 63 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20 69 74  ction, but.** it
22170 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 67 69 76   will always giv
22180 65 20 74 68 65 20 63 6f 72 72 65 63 74 20 61 6e  e the correct an
22190 73 77 65 72 20 61 6e 64 20 69 73 20 68 65 6e 63  swer and is henc
221a0 65 20 61 6c 77 61 79 73 20 73 61 66 65 2e 0a 2a  e always safe..*
221b0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
221c0 72 49 6d 70 6c 69 65 73 45 78 70 72 28 45 78 70  rImpliesExpr(Exp
221d0 72 20 2a 70 45 31 2c 20 45 78 70 72 20 2a 70 45  r *pE1, Expr *pE
221e0 32 2c 20 69 6e 74 20 69 54 61 62 29 7b 0a 20 20  2, int iTab){.  
221f0 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43  if( sqlite3ExprC
22200 6f 6d 70 61 72 65 28 70 45 31 2c 20 70 45 32 2c  ompare(pE1, pE2,
22210 20 69 54 61 62 29 3d 3d 30 20 29 7b 0a 20 20 20   iTab)==0 ){.   
22220 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
22230 20 69 66 28 20 70 45 32 2d 3e 6f 70 3d 3d 54 4b   if( pE2->op==TK
22240 5f 4f 52 0a 20 20 20 26 26 20 28 73 71 6c 69 74  _OR.   && (sqlit
22250 65 33 45 78 70 72 49 6d 70 6c 69 65 73 45 78 70  e3ExprImpliesExp
22260 72 28 70 45 31 2c 20 70 45 32 2d 3e 70 4c 65 66  r(pE1, pE2->pLef
22270 74 2c 20 69 54 61 62 29 0a 20 20 20 20 20 20 20  t, iTab).       
22280 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33        || sqlite3
22290 45 78 70 72 49 6d 70 6c 69 65 73 45 78 70 72 28  ExprImpliesExpr(
222a0 70 45 31 2c 20 70 45 32 2d 3e 70 52 69 67 68 74  pE1, pE2->pRight
222b0 2c 20 69 54 61 62 29 20 29 0a 20 20 29 7b 0a 20  , iTab) ).  ){. 
222c0 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
222d0 0a 20 20 69 66 28 20 70 45 32 2d 3e 6f 70 3d 3d  .  if( pE2->op==
222e0 54 4b 5f 4e 4f 54 4e 55 4c 4c 0a 20 20 20 26 26  TK_NOTNULL.   &&
222f0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70   sqlite3ExprComp
22300 61 72 65 28 70 45 31 2d 3e 70 4c 65 66 74 2c 20  are(pE1->pLeft, 
22310 70 45 32 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62  pE2->pLeft, iTab
22320 29 3d 3d 30 0a 20 20 20 26 26 20 28 70 45 31 2d  )==0.   && (pE1-
22330 3e 6f 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20 26  >op!=TK_ISNULL &
22340 26 20 70 45 31 2d 3e 6f 70 21 3d 54 4b 5f 49 53  & pE1->op!=TK_IS
22350 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ).  ){.    retur
22360 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 1;.  }.  retur
22370 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e  n 0;.}../*.** An
22380 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
22390 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
223a0 74 75 72 65 20 69 73 20 75 73 65 64 20 62 79 20  ture is used by 
223b0 74 68 65 20 74 72 65 65 20 77 61 6c 6b 65 72 0a  the tree walker.
223c0 2a 2a 20 74 6f 20 63 6f 75 6e 74 20 72 65 66 65  ** to count refe
223d0 72 65 6e 63 65 73 20 74 6f 20 74 61 62 6c 65 20  rences to table 
223e0 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 61  columns in the a
223f0 72 67 75 6d 65 6e 74 73 20 6f 66 20 61 6e 20 0a  rguments of an .
22400 2a 2a 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  ** aggregate fun
22410 63 74 69 6f 6e 2c 20 69 6e 20 6f 72 64 65 72 20  ction, in order 
22420 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65  to implement the
22430 0a 2a 2a 20 73 71 6c 69 74 65 33 46 75 6e 63 74  .** sqlite3Funct
22440 69 6f 6e 54 68 69 73 53 72 63 28 29 20 72 6f 75  ionThisSrc() rou
22450 74 69 6e 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  tine..*/.struct 
22460 53 72 63 43 6f 75 6e 74 20 7b 0a 20 20 53 72 63  SrcCount {.  Src
22470 4c 69 73 74 20 2a 70 53 72 63 3b 20 20 20 2f 2a  List *pSrc;   /*
22480 20 4f 6e 65 20 70 61 72 74 69 63 75 6c 61 72 20   One particular 
22490 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 6e 20 61  FROM clause in a
224a0 20 6e 65 73 74 65 64 20 71 75 65 72 79 20 2a 2f   nested query */
224b0 0a 20 20 69 6e 74 20 6e 54 68 69 73 3b 20 20 20  .  int nThis;   
224c0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
224d0 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 63   references to c
224e0 6f 6c 75 6d 6e 73 20 69 6e 20 70 53 72 63 4c 69  olumns in pSrcLi
224f0 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 74 68  st */.  int nOth
22500 65 72 3b 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62  er;      /* Numb
22510 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73  er of references
22520 20 74 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 6f   to columns in o
22530 74 68 65 72 20 46 52 4f 4d 20 63 6c 61 75 73 65  ther FROM clause
22540 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43  s */.};../*.** C
22550 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20  ount the number 
22560 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  of references to
22570 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2f 0a 73 74 61   columns..*/.sta
22580 74 69 63 20 69 6e 74 20 65 78 70 72 53 72 63 43  tic int exprSrcC
22590 6f 75 6e 74 28 57 61 6c 6b 65 72 20 2a 70 57 61  ount(Walker *pWa
225a0 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45 78 70  lker, Expr *pExp
225b0 72 29 7b 0a 20 20 2f 2a 20 54 68 65 20 4e 45 56  r){.  /* The NEV
225c0 45 52 28 29 20 6f 6e 20 74 68 65 20 73 65 63 6f  ER() on the seco
225d0 6e 64 20 74 65 72 6d 20 69 73 20 62 65 63 61 75  nd term is becau
225e0 73 65 20 73 71 6c 69 74 65 33 46 75 6e 63 74 69  se sqlite3Functi
225f0 6f 6e 55 73 65 73 54 68 69 73 53 72 63 28 29 0a  onUsesThisSrc().
22600 20 20 2a 2a 20 69 73 20 61 6c 77 61 79 73 20 63    ** is always c
22610 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 73 71 6c  alled before sql
22620 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
22630 67 67 72 65 67 61 74 65 73 28 29 20 61 6e 64 20  ggregates() and 
22640 73 6f 20 74 68 65 0a 20 20 2a 2a 20 54 4b 5f 43  so the.  ** TK_C
22650 4f 4c 55 4d 4e 73 20 68 61 76 65 20 6e 6f 74 20  OLUMNs have not 
22660 79 65 74 20 62 65 65 6e 20 63 6f 6e 76 65 72 74  yet been convert
22670 65 64 20 69 6e 74 6f 20 54 4b 5f 41 47 47 5f 43  ed into TK_AGG_C
22680 4f 4c 55 4d 4e 2e 20 20 49 66 0a 20 20 2a 2a 20  OLUMN.  If.  ** 
22690 73 71 6c 69 74 65 33 46 75 6e 63 74 69 6f 6e 55  sqlite3FunctionU
226a0 73 65 73 54 68 69 73 53 72 63 28 29 20 69 73 20  sesThisSrc() is 
226b0 75 73 65 64 20 64 69 66 66 65 72 65 6e 74 6c 79  used differently
226c0 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 2c 20   in the future, 
226d0 74 68 65 0a 20 20 2a 2a 20 4e 45 56 45 52 28 29  the.  ** NEVER()
226e0 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 62 65   will need to be
226f0 20 72 65 6d 6f 76 65 64 2e 20 2a 2f 0a 20 20 69   removed. */.  i
22700 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  f( pExpr->op==TK
22710 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 4e 45 56 45 52  _COLUMN || NEVER
22720 28 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41  (pExpr->op==TK_A
22730 47 47 5f 43 4f 4c 55 4d 4e 29 20 29 7b 0a 20 20  GG_COLUMN) ){.  
22740 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 73 74 72    int i;.    str
22750 75 63 74 20 53 72 63 43 6f 75 6e 74 20 2a 70 20  uct SrcCount *p 
22760 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 53 72  = pWalker->u.pSr
22770 63 43 6f 75 6e 74 3b 0a 20 20 20 20 53 72 63 4c  cCount;.    SrcL
22780 69 73 74 20 2a 70 53 72 63 20 3d 20 70 2d 3e 70  ist *pSrc = p->p
22790 53 72 63 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  Src;.    for(i=0
227a0 3b 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63 3b 20  ; i<pSrc->nSrc; 
227b0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
227c0 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70  pExpr->iTable==p
227d0 53 72 63 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f  Src->a[i].iCurso
227e0 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d  r ) break;.    }
227f0 0a 20 20 20 20 69 66 28 20 69 3c 70 53 72 63 2d  .    if( i<pSrc-
22800 3e 6e 53 72 63 20 29 7b 0a 20 20 20 20 20 20 70  >nSrc ){.      p
22810 2d 3e 6e 54 68 69 73 2b 2b 3b 0a 20 20 20 20 7d  ->nThis++;.    }
22820 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 6e  else{.      p->n
22830 4f 74 68 65 72 2b 2b 3b 0a 20 20 20 20 7d 0a 20  Other++;.    }. 
22840 20 7d 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f   }.  return WRC_
22850 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a  Continue;.}../*.
22860 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 69 66 20  ** Determine if 
22870 61 6e 79 20 6f 66 20 74 68 65 20 61 72 67 75 6d  any of the argum
22880 65 6e 74 73 20 74 6f 20 74 68 65 20 70 45 78 70  ents to the pExp
22890 72 20 46 75 6e 63 74 69 6f 6e 20 72 65 66 65 72  r Function refer
228a0 65 6e 63 65 0a 2a 2a 20 70 53 72 63 4c 69 73 74  ence.** pSrcList
228b0 2e 20 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  .  Return true i
228c0 66 20 74 68 65 79 20 64 6f 2e 20 20 41 6c 73 6f  f they do.  Also
228d0 20 72 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   return true if 
228e0 74 68 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  the function.** 
228f0 68 61 73 20 6e 6f 20 61 72 67 75 6d 65 6e 74 73  has no arguments
22900 20 6f 72 20 68 61 73 20 6f 6e 6c 79 20 63 6f 6e   or has only con
22910 73 74 61 6e 74 20 61 72 67 75 6d 65 6e 74 73 2e  stant arguments.
22920 20 20 52 65 74 75 72 6e 20 66 61 6c 73 65 20 69    Return false i
22930 66 20 70 45 78 70 72 0a 2a 2a 20 72 65 66 65 72  f pExpr.** refer
22940 65 6e 63 65 73 20 63 6f 6c 75 6d 6e 73 20 62 75  ences columns bu
22950 74 20 6e 6f 74 20 63 6f 6c 75 6d 6e 73 20 6f 66  t not columns of
22960 20 74 61 62 6c 65 73 20 66 6f 75 6e 64 20 69 6e   tables found in
22970 20 70 53 72 63 4c 69 73 74 2e 0a 2a 2f 0a 69 6e   pSrcList..*/.in
22980 74 20 73 71 6c 69 74 65 33 46 75 6e 63 74 69 6f  t sqlite3Functio
22990 6e 55 73 65 73 54 68 69 73 53 72 63 28 45 78 70  nUsesThisSrc(Exp
229a0 72 20 2a 70 45 78 70 72 2c 20 53 72 63 4c 69 73  r *pExpr, SrcLis
229b0 74 20 2a 70 53 72 63 4c 69 73 74 29 7b 0a 20 20  t *pSrcList){.  
229c0 57 61 6c 6b 65 72 20 77 3b 0a 20 20 73 74 72 75  Walker w;.  stru
229d0 63 74 20 53 72 63 43 6f 75 6e 74 20 63 6e 74 3b  ct SrcCount cnt;
229e0 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
229f0 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e  ->op==TK_AGG_FUN
22a00 43 54 49 4f 4e 20 29 3b 0a 20 20 6d 65 6d 73 65  CTION );.  memse
22a10 74 28 26 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28  t(&w, 0, sizeof(
22a20 77 29 29 3b 0a 20 20 77 2e 78 45 78 70 72 43 61  w));.  w.xExprCa
22a30 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72 53 72 63  llback = exprSrc
22a40 43 6f 75 6e 74 3b 0a 20 20 77 2e 75 2e 70 53 72  Count;.  w.u.pSr
22a50 63 43 6f 75 6e 74 20 3d 20 26 63 6e 74 3b 0a 20  cCount = &cnt;. 
22a60 20 63 6e 74 2e 70 53 72 63 20 3d 20 70 53 72 63   cnt.pSrc = pSrc
22a70 4c 69 73 74 3b 0a 20 20 63 6e 74 2e 6e 54 68 69  List;.  cnt.nThi
22a80 73 20 3d 20 30 3b 0a 20 20 63 6e 74 2e 6e 4f 74  s = 0;.  cnt.nOt
22a90 68 65 72 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  her = 0;.  sqlit
22aa0 65 33 57 61 6c 6b 45 78 70 72 4c 69 73 74 28 26  e3WalkExprList(&
22ab0 77 2c 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73  w, pExpr->x.pLis
22ac0 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 63 6e 74  t);.  return cnt
22ad0 2e 6e 54 68 69 73 3e 30 20 7c 7c 20 63 6e 74 2e  .nThis>0 || cnt.
22ae0 6e 4f 74 68 65 72 3d 3d 30 3b 0a 7d 0a 0a 2f 2a  nOther==0;.}../*
22af0 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 65 6c  .** Add a new el
22b00 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 70 41 67  ement to the pAg
22b10 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 61 72  gInfo->aCol[] ar
22b20 72 61 79 2e 20 20 52 65 74 75 72 6e 20 74 68 65  ray.  Return the
22b30 20 69 6e 64 65 78 20 6f 66 0a 2a 2a 20 74 68 65   index of.** the
22b40 20 6e 65 77 20 65 6c 65 6d 65 6e 74 2e 20 20 52   new element.  R
22b50 65 74 75 72 6e 20 61 20 6e 65 67 61 74 69 76 65  eturn a negative
22b60 20 6e 75 6d 62 65 72 20 69 66 20 6d 61 6c 6c 6f   number if mallo
22b70 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74  c fails..*/.stat
22b80 69 63 20 69 6e 74 20 61 64 64 41 67 67 49 6e 66  ic int addAggInf
22b90 6f 43 6f 6c 75 6d 6e 28 73 71 6c 69 74 65 33 20  oColumn(sqlite3 
22ba0 2a 64 62 2c 20 41 67 67 49 6e 66 6f 20 2a 70 49  *db, AggInfo *pI
22bb0 6e 66 6f 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  nfo){.  int i;. 
22bc0 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 20 3d 20 73   pInfo->aCol = s
22bd0 71 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f 63  qlite3ArrayAlloc
22be0 61 74 65 28 0a 20 20 20 20 20 20 20 64 62 2c 0a  ate(.       db,.
22bf0 20 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61 43         pInfo->aC
22c00 6f 6c 2c 0a 20 20 20 20 20 20 20 73 69 7a 65 6f  ol,.       sizeo
22c10 66 28 70 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 30 5d  f(pInfo->aCol[0]
22c20 29 2c 0a 20 20 20 20 20 20 20 26 70 49 6e 66 6f  ),.       &pInfo
22c30 2d 3e 6e 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20  ->nColumn,.     
22c40 20 20 26 69 0a 20 20 29 3b 0a 20 20 72 65 74 75    &i.  );.  retu
22c50 72 6e 20 69 3b 0a 7d 20 20 20 20 0a 0a 2f 2a 0a  rn i;.}    ../*.
22c60 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 65 6c 65  ** Add a new ele
22c70 6d 65 6e 74 20 74 6f 20 74 68 65 20 70 41 67 67  ment to the pAgg
22c80 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 20 61 72  Info->aFunc[] ar
22c90 72 61 79 2e 20 20 52 65 74 75 72 6e 20 74 68 65  ray.  Return the
22ca0 20 69 6e 64 65 78 20 6f 66 0a 2a 2a 20 74 68 65   index of.** the
22cb0 20 6e 65 77 20 65 6c 65 6d 65 6e 74 2e 20 20 52   new element.  R
22cc0 65 74 75 72 6e 20 61 20 6e 65 67 61 74 69 76 65  eturn a negative
22cd0 20 6e 75 6d 62 65 72 20 69 66 20 6d 61 6c 6c 6f   number if mallo
22ce0 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74  c fails..*/.stat
22cf0 69 63 20 69 6e 74 20 61 64 64 41 67 67 49 6e 66  ic int addAggInf
22d00 6f 46 75 6e 63 28 73 71 6c 69 74 65 33 20 2a 64  oFunc(sqlite3 *d
22d10 62 2c 20 41 67 67 49 6e 66 6f 20 2a 70 49 6e 66  b, AggInfo *pInf
22d20 6f 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 70  o){.  int i;.  p
22d30 49 6e 66 6f 2d 3e 61 46 75 6e 63 20 3d 20 73 71  Info->aFunc = sq
22d40 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61  lite3ArrayAlloca
22d50 74 65 28 0a 20 20 20 20 20 20 20 64 62 2c 20 0a  te(.       db, .
22d60 20 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61 46         pInfo->aF
22d70 75 6e 63 2c 0a 20 20 20 20 20 20 20 73 69 7a 65  unc,.       size
22d80 6f 66 28 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b  of(pInfo->aFunc[
22d90 30 5d 29 2c 0a 20 20 20 20 20 20 20 26 70 49 6e  0]),.       &pIn
22da0 66 6f 2d 3e 6e 46 75 6e 63 2c 0a 20 20 20 20 20  fo->nFunc,.     
22db0 20 20 26 69 0a 20 20 29 3b 0a 20 20 72 65 74 75    &i.  );.  retu
22dc0 72 6e 20 69 3b 0a 7d 20 20 20 20 0a 0a 2f 2a 0a  rn i;.}    ../*.
22dd0 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 78  ** This is the x
22de0 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 66 6f 72  ExprCallback for
22df0 20 61 20 74 72 65 65 20 77 61 6c 6b 65 72 2e 20   a tree walker. 
22e00 20 49 74 20 69 73 20 75 73 65 64 20 74 6f 0a 2a   It is used to.*
22e10 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 73 71 6c 69  * implement sqli
22e20 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
22e30 67 72 65 67 61 74 65 73 28 29 2e 20 20 53 65 65  gregates().  See
22e40 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
22e50 79 7a 65 41 67 67 72 65 67 61 74 65 73 0a 2a 2a  yzeAggregates.**
22e60 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20   for additional 
22e70 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a  information..*/.
22e80 73 74 61 74 69 63 20 69 6e 74 20 61 6e 61 6c 79  static int analy
22e90 7a 65 41 67 67 72 65 67 61 74 65 28 57 61 6c 6b  zeAggregate(Walk
22ea0 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70  er *pWalker, Exp
22eb0 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74  r *pExpr){.  int
22ec0 20 69 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78   i;.  NameContex
22ed0 74 20 2a 70 4e 43 20 3d 20 70 57 61 6c 6b 65 72  t *pNC = pWalker
22ee0 2d 3e 75 2e 70 4e 43 3b 0a 20 20 50 61 72 73 65  ->u.pNC;.  Parse
22ef0 20 2a 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e   *pParse = pNC->
22f00 70 50 61 72 73 65 3b 0a 20 20 53 72 63 4c 69 73  pParse;.  SrcLis
22f10 74 20 2a 70 53 72 63 4c 69 73 74 20 3d 20 70 4e  t *pSrcList = pN
22f20 43 2d 3e 70 53 72 63 4c 69 73 74 3b 0a 20 20 41  C->pSrcList;.  A
22f30 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f  ggInfo *pAggInfo
22f40 20 3d 20 70 4e 43 2d 3e 70 41 67 67 49 6e 66 6f   = pNC->pAggInfo
22f50 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45 78  ;..  switch( pEx
22f60 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61  pr->op ){.    ca
22f70 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  se TK_AGG_COLUMN
22f80 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  :.    case TK_CO
22f90 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 74 65  LUMN: {.      te
22fa0 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
22fb0 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  p==TK_AGG_COLUMN
22fc0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
22fd0 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
22fe0 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20  K_COLUMN );.    
22ff0 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65    /* Check to se
23000 65 20 69 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20  e if the column 
23010 69 73 20 69 6e 20 6f 6e 65 20 6f 66 20 74 68 65  is in one of the
23020 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46   tables in the F
23030 52 4f 4d 0a 20 20 20 20 20 20 2a 2a 20 63 6c 61  ROM.      ** cla
23040 75 73 65 20 6f 66 20 74 68 65 20 61 67 67 72 65  use of the aggre
23050 67 61 74 65 20 71 75 65 72 79 20 2a 2f 0a 20 20  gate query */.  
23060 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 70      if( ALWAYS(p
23070 53 72 63 4c 69 73 74 21 3d 30 29 20 29 7b 0a 20  SrcList!=0) ){. 
23080 20 20 20 20 20 20 20 73 74 72 75 63 74 20 53 72         struct Sr
23090 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
230a0 6d 20 3d 20 70 53 72 63 4c 69 73 74 2d 3e 61 3b  m = pSrcList->a;
230b0 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
230c0 3b 20 69 3c 70 53 72 63 4c 69 73 74 2d 3e 6e 53  ; i<pSrcList->nS
230d0 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b  rc; i++, pItem++
230e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 72  ){.          str
230f0 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20  uct AggInfo_col 
23100 2a 70 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20  *pCol;.         
23110 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
23120 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
23130 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50   EP_TokenOnly|EP
23140 5f 52 65 64 75 63 65 64 29 20 29 3b 0a 20 20 20  _Reduced) );.   
23150 20 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72         if( pExpr
23160 2d 3e 69 54 61 62 6c 65 3d 3d 70 49 74 65 6d 2d  ->iTable==pItem-
23170 3e 69 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20  >iCursor ){.    
23180 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65          /* If we
23190 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e   reach this poin
231a0 74 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  t, it means that
231b0 20 70 45 78 70 72 20 72 65 66 65 72 73 20 74 6f   pExpr refers to
231c0 20 61 20 74 61 62 6c 65 0a 20 20 20 20 20 20 20   a table.       
231d0 20 20 20 20 20 2a 2a 20 74 68 61 74 20 69 73 20       ** that is 
231e0 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
231f0 73 65 20 6f 66 20 74 68 65 20 61 67 67 72 65 67  se of the aggreg
23200 61 74 65 20 71 75 65 72 79 2e 20 20 0a 20 20 20  ate query.  .   
23210 20 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20           **.    
23220 20 20 20 20 20 20 20 20 2a 2a 20 4d 61 6b 65 20          ** Make 
23230 61 6e 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65  an entry for the
23240 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 41 67 67 49   column in pAggI
23250 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 69 66 20 74  nfo->aCol[] if t
23260 68 65 72 65 0a 20 20 20 20 20 20 20 20 20 20 20  here.           
23270 20 2a 2a 20 69 73 20 6e 6f 74 20 61 6e 20 65 6e   ** is not an en
23280 74 72 79 20 74 68 65 72 65 20 61 6c 72 65 61 64  try there alread
23290 79 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  y..            *
232a0 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  /.            in
232b0 74 20 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  t k;.           
232c0 20 70 43 6f 6c 20 3d 20 70 41 67 67 49 6e 66 6f   pCol = pAggInfo
232d0 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20  ->aCol;.        
232e0 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70      for(k=0; k<p
232f0 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e  AggInfo->nColumn
23300 3b 20 6b 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a  ; k++, pCol++){.
23310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
23320 28 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 3d 3d  ( pCol->iTable==
23330 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 26 26  pExpr->iTable &&
23340 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
23350 20 20 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e     pCol->iColumn
23360 3d 3d 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ==pExpr->iColumn
23370 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
23380 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
23390 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
233a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
233b0 20 20 20 20 20 69 66 28 20 28 6b 3e 3d 70 41 67       if( (k>=pAg
233c0 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 29 0a  gInfo->nColumn).
233d0 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
233e0 28 6b 20 3d 20 61 64 64 41 67 67 49 6e 66 6f 43  (k = addAggInfoC
233f0 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2d 3e 64 62  olumn(pParse->db
23400 2c 20 70 41 67 67 49 6e 66 6f 29 29 3e 3d 30 20  , pAggInfo))>=0 
23410 0a 20 20 20 20 20 20 20 20 20 20 20 20 29 7b 0a  .            ){.
23420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
23430 6f 6c 20 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e  ol = &pAggInfo->
23440 61 43 6f 6c 5b 6b 5d 3b 0a 20 20 20 20 20 20 20  aCol[k];.       
23450 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 54 61         pCol->pTa
23460 62 20 3d 20 70 45 78 70 72 2d 3e 70 54 61 62 3b  b = pExpr->pTab;
23470 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
23480 43 6f 6c 2d 3e 69 54 61 62 6c 65 20 3d 20 70 45  Col->iTable = pE
23490 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20  xpr->iTable;.   
234a0 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
234b0 3e 69 43 6f 6c 75 6d 6e 20 3d 20 70 45 78 70 72  >iColumn = pExpr
234c0 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  ->iColumn;.     
234d0 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69           pCol->i
234e0 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  Mem = ++pParse->
234f0 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 20 20  nMem;.          
23500 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65      pCol->iSorte
23510 72 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20  rColumn = -1;.  
23520 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
23530 2d 3e 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b  ->pExpr = pExpr;
23540 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
23550 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e 70 47 72  f( pAggInfo->pGr
23560 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20 20  oupBy ){.       
23570 20 20 20 20 20 20 20 20 20 69 6e 74 20 6a 2c 20           int j, 
23580 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n;.             
23590 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47 42     ExprList *pGB
235a0 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 70 47 72   = pAggInfo->pGr
235b0 6f 75 70 42 79 3b 0a 20 20 20 20 20 20 20 20 20  oupBy;.         
235c0 20 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78         struct Ex
235d0 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 65  prList_item *pTe
235e0 72 6d 20 3d 20 70 47 42 2d 3e 61 3b 0a 20 20 20  rm = pGB->a;.   
235f0 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 20 3d               n =
23600 20 70 47 42 2d 3e 6e 45 78 70 72 3b 0a 20 20 20   pGB->nExpr;.   
23610 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72               for
23620 28 6a 3d 30 3b 20 6a 3c 6e 3b 20 6a 2b 2b 2c 20  (j=0; j<n; j++, 
23630 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pTerm++){.      
23640 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72              Expr
23650 20 2a 70 45 20 3d 20 70 54 65 72 6d 2d 3e 70 45   *pE = pTerm->pE
23660 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20  xpr;.           
23670 20 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e 6f         if( pE->o
23680 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20  p==TK_COLUMN && 
23690 70 45 2d 3e 69 54 61 62 6c 65 3d 3d 70 45 78 70  pE->iTable==pExp
236a0 72 2d 3e 69 54 61 62 6c 65 20 26 26 0a 20 20 20  r->iTable &&.   
236b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
236c0 20 20 20 70 45 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d     pE->iColumn==
236d0 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 29  pExpr->iColumn )
236e0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
236f0 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72        pCol->iSor
23700 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 6a 3b 0a 20  terColumn = j;. 
23710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23720 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
23730 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
23740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
23750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
23760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
23770 28 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43  ( pCol->iSorterC
23780 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20  olumn<0 ){.     
23790 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
237a0 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 20 3d  >iSorterColumn =
237b0 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 53 6f 72 74   pAggInfo->nSort
237c0 69 6e 67 43 6f 6c 75 6d 6e 2b 2b 3b 0a 20 20 20  ingColumn++;.   
237d0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
237e0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
237f0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 72 65 20         /* There 
23800 69 73 20 6e 6f 77 20 61 6e 20 65 6e 74 72 79 20  is now an entry 
23810 66 6f 72 20 70 45 78 70 72 20 69 6e 20 70 41 67  for pExpr in pAg
23820 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 28 65  gInfo->aCol[] (e
23830 69 74 68 65 72 0a 20 20 20 20 20 20 20 20 20 20  ither.          
23840 20 20 2a 2a 20 62 65 63 61 75 73 65 20 69 74 20    ** because it 
23850 77 61 73 20 74 68 65 72 65 20 62 65 66 6f 72 65  was there before
23860 20 6f 72 20 62 65 63 61 75 73 65 20 77 65 20 6a   or because we j
23870 75 73 74 20 63 72 65 61 74 65 64 20 69 74 29 2e  ust created it).
23880 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
23890 43 6f 6e 76 65 72 74 20 74 68 65 20 70 45 78 70  Convert the pExp
238a0 72 20 74 6f 20 62 65 20 61 20 54 4b 5f 41 47 47  r to be a TK_AGG
238b0 5f 43 4f 4c 55 4d 4e 20 72 65 66 65 72 72 69 6e  _COLUMN referrin
238c0 67 20 74 6f 20 74 68 61 74 0a 20 20 20 20 20 20  g to that.      
238d0 20 20 20 20 20 20 2a 2a 20 70 41 67 67 49 6e 66        ** pAggInf
238e0 6f 2d 3e 61 43 6f 6c 5b 5d 20 65 6e 74 72 79 2e  o->aCol[] entry.
238f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  .            */.
23900 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72              Expr
23910 53 65 74 56 56 41 50 72 6f 70 65 72 74 79 28 70  SetVVAProperty(p
23920 45 78 70 72 2c 20 45 50 5f 4e 6f 52 65 64 75 63  Expr, EP_NoReduc
23930 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
23940 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f 20  pExpr->pAggInfo 
23950 3d 20 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20  = pAggInfo;.    
23960 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f          pExpr->o
23970 70 20 3d 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  p = TK_AGG_COLUM
23980 4e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  N;.            p
23990 45 78 70 72 2d 3e 69 41 67 67 20 3d 20 28 69 31  Expr->iAgg = (i1
239a0 36 29 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  6)k;.           
239b0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
239c0 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20 70 45 78    } /* endif pEx
239d0 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 49 74 65  pr->iTable==pIte
239e0 6d 2d 3e 69 43 75 72 73 6f 72 20 2a 2f 0a 20 20  m->iCursor */.  
239f0 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64 20 6c        } /* end l
23a00 6f 6f 70 20 6f 76 65 72 20 70 53 72 63 4c 69 73  oop over pSrcLis
23a10 74 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20  t */.      }.   
23a20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72     return WRC_Pr
23a30 75 6e 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  une;.    }.    c
23a40 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54  ase TK_AGG_FUNCT
23a50 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  ION: {.      if(
23a60 20 28 70 4e 43 2d 3e 6e 63 46 6c 61 67 73 20 26   (pNC->ncFlags &
23a70 20 4e 43 5f 49 6e 41 67 67 46 75 6e 63 29 3d 3d   NC_InAggFunc)==
23a80 30 0a 20 20 20 20 20 20 20 26 26 20 70 57 61 6c  0.       && pWal
23a90 6b 65 72 2d 3e 77 61 6c 6b 65 72 44 65 70 74 68  ker->walkerDepth
23aa0 3d 3d 70 45 78 70 72 2d 3e 6f 70 32 0a 20 20 20  ==pExpr->op2.   
23ab0 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a     ){.        /*
23ac0 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
23ad0 20 70 45 78 70 72 20 69 73 20 61 20 64 75 70 6c   pExpr is a dupl
23ae0 69 63 61 74 65 20 6f 66 20 61 6e 6f 74 68 65 72  icate of another
23af0 20 61 67 67 72 65 67 61 74 65 20 0a 20 20 20 20   aggregate .    
23b00 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20      ** function 
23b10 74 68 61 74 20 69 73 20 61 6c 72 65 61 64 79 20  that is already 
23b20 69 6e 20 74 68 65 20 70 41 67 67 49 6e 66 6f 20  in the pAggInfo 
23b30 73 74 72 75 63 74 75 72 65 0a 20 20 20 20 20 20  structure.      
23b40 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 74 72    */.        str
23b50 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63  uct AggInfo_func
23b60 20 2a 70 49 74 65 6d 20 3d 20 70 41 67 67 49 6e   *pItem = pAggIn
23b70 66 6f 2d 3e 61 46 75 6e 63 3b 0a 20 20 20 20 20  fo->aFunc;.     
23b80 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41     for(i=0; i<pA
23b90 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69  ggInfo->nFunc; i
23ba0 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
23bb0 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
23bc0 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70  te3ExprCompare(p
23bd0 49 74 65 6d 2d 3e 70 45 78 70 72 2c 20 70 45 78  Item->pExpr, pEx
23be0 70 72 2c 20 2d 31 29 3d 3d 30 20 29 7b 0a 20 20  pr, -1)==0 ){.  
23bf0 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
23c00 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
23c10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
23c20 66 28 20 69 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e  f( i>=pAggInfo->
23c30 6e 46 75 6e 63 20 29 7b 0a 20 20 20 20 20 20 20  nFunc ){.       
23c40 20 20 20 2f 2a 20 70 45 78 70 72 20 69 73 20 6f     /* pExpr is o
23c50 72 69 67 69 6e 61 6c 2e 20 20 4d 61 6b 65 20 61  riginal.  Make a
23c60 20 6e 65 77 20 65 6e 74 72 79 20 69 6e 20 70 41   new entry in pA
23c70 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 0a  ggInfo->aFunc[].
23c80 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
23c90 20 20 20 20 20 20 20 75 38 20 65 6e 63 20 3d 20         u8 enc = 
23ca0 45 4e 43 28 70 50 61 72 73 65 2d 3e 64 62 29 3b  ENC(pParse->db);
23cb0 0a 20 20 20 20 20 20 20 20 20 20 69 20 3d 20 61  .          i = a
23cc0 64 64 41 67 67 49 6e 66 6f 46 75 6e 63 28 70 50  ddAggInfoFunc(pP
23cd0 61 72 73 65 2d 3e 64 62 2c 20 70 41 67 67 49 6e  arse->db, pAggIn
23ce0 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  fo);.          i
23cf0 66 28 20 69 3e 3d 30 20 29 7b 0a 20 20 20 20 20  f( i>=0 ){.     
23d00 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
23d10 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
23d20 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
23d30 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20 20 20  ect) );.        
23d40 20 20 20 20 70 49 74 65 6d 20 3d 20 26 70 41 67      pItem = &pAg
23d50 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d 3b  gInfo->aFunc[i];
23d60 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74  .            pIt
23d70 65 6d 2d 3e 70 45 78 70 72 20 3d 20 70 45 78 70  em->pExpr = pExp
23d80 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  r;.            p
23d90 49 74 65 6d 2d 3e 69 4d 65 6d 20 3d 20 2b 2b 70  Item->iMem = ++p
23da0 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
23db0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
23dc0 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
23dd0 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56  y(pExpr, EP_IntV
23de0 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 20  alue) );.       
23df0 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 46 75 6e       pItem->pFun
23e00 63 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46  c = sqlite3FindF
23e10 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2d 3e  unction(pParse->
23e20 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  db,.            
23e30 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 75 2e         pExpr->u.
23e40 7a 54 6f 6b 65 6e 2c 20 73 71 6c 69 74 65 33 53  zToken, sqlite3S
23e50 74 72 6c 65 6e 33 30 28 70 45 78 70 72 2d 3e 75  trlen30(pExpr->u
23e60 2e 7a 54 6f 6b 65 6e 29 2c 0a 20 20 20 20 20 20  .zToken),.      
23e70 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
23e80 70 72 2d 3e 78 2e 70 4c 69 73 74 20 3f 20 70 45  pr->x.pList ? pE
23e90 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45  xpr->x.pList->nE
23ea0 78 70 72 20 3a 20 30 2c 20 65 6e 63 2c 20 30 29  xpr : 0, enc, 0)
23eb0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
23ec0 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26  ( pExpr->flags &
23ed0 20 45 50 5f 44 69 73 74 69 6e 63 74 20 29 7b 0a   EP_Distinct ){.
23ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49                pI
23ef0 74 65 6d 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d  tem->iDistinct =
23f00 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
23f10 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c  .            }el
23f20 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
23f30 20 20 70 49 74 65 6d 2d 3e 69 44 69 73 74 69 6e    pItem->iDistin
23f40 63 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20  ct = -1;.       
23f50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
23f60 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
23f70 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 70 45 78       /* Make pEx
23f80 70 72 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  pr point to the 
23f90 61 70 70 72 6f 70 72 69 61 74 65 20 70 41 67 67  appropriate pAgg
23fa0 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 20 65 6e  Info->aFunc[] en
23fb0 74 72 79 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  try.        */. 
23fc0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
23fd0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
23fe0 70 45 78 70 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f  pExpr, EP_TokenO
23ff0 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64 29 20  nly|EP_Reduced) 
24000 29 3b 0a 20 20 20 20 20 20 20 20 45 78 70 72 53  );.        ExprS
24010 65 74 56 56 41 50 72 6f 70 65 72 74 79 28 70 45  etVVAProperty(pE
24020 78 70 72 2c 20 45 50 5f 4e 6f 52 65 64 75 63 65  xpr, EP_NoReduce
24030 29 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72  );.        pExpr
24040 2d 3e 69 41 67 67 20 3d 20 28 69 31 36 29 69 3b  ->iAgg = (i16)i;
24050 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e  .        pExpr->
24060 70 41 67 67 49 6e 66 6f 20 3d 20 70 41 67 67 49  pAggInfo = pAggI
24070 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 72 65 74  nfo;.        ret
24080 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20  urn WRC_Prune;. 
24090 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
240a0 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43      return WRC_C
240b0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d  ontinue;.      }
240c0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
240d0 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
240e0 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 61  ;.}.static int a
240f0 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73  nalyzeAggregates
24100 49 6e 53 65 6c 65 63 74 28 57 61 6c 6b 65 72 20  InSelect(Walker 
24110 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74  *pWalker, Select
24120 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 55 4e   *pSelect){.  UN
24130 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
24140 57 61 6c 6b 65 72 29 3b 0a 20 20 55 4e 55 53 45  Walker);.  UNUSE
24150 44 5f 50 41 52 41 4d 45 54 45 52 28 70 53 65 6c  D_PARAMETER(pSel
24160 65 63 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 57  ect);.  return W
24170 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a  RC_Continue;.}..
24180 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 74 68  /*.** Analyze th
24190 65 20 70 45 78 70 72 20 65 78 70 72 65 73 73 69  e pExpr expressi
241a0 6f 6e 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61  on looking for a
241b0 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
241c0 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f 72 20 76 61  ns and.** for va
241d0 72 69 61 62 6c 65 73 20 74 68 61 74 20 6e 65 65  riables that nee
241e0 64 20 74 6f 20 62 65 20 61 64 64 65 64 20 74 6f  d to be added to
241f0 20 41 67 67 49 6e 66 6f 20 6f 62 6a 65 63 74 20   AggInfo object 
24200 74 68 61 74 20 70 4e 43 2d 3e 70 41 67 67 49 6e  that pNC->pAggIn
24210 66 6f 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 2e  fo.** points to.
24220 20 20 41 64 64 69 74 69 6f 6e 61 6c 20 65 6e 74    Additional ent
24230 72 69 65 73 20 61 72 65 20 6d 61 64 65 20 6f 6e  ries are made on
24240 20 74 68 65 20 41 67 67 49 6e 66 6f 20 6f 62 6a   the AggInfo obj
24250 65 63 74 20 61 73 0a 2a 2a 20 6e 65 63 65 73 73  ect as.** necess
24260 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ary..**.** This 
24270 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 6f  routine should o
24280 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 61 66  nly be called af
24290 74 65 72 20 74 68 65 20 65 78 70 72 65 73 73 69  ter the expressi
242a0 6f 6e 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 61  on has been.** a
242b0 6e 61 6c 79 7a 65 64 20 62 79 20 73 71 6c 69 74  nalyzed by sqlit
242c0 65 33 52 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d  e3ResolveExprNam
242d0 65 73 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  es()..*/.void sq
242e0 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65  lite3ExprAnalyze
242f0 41 67 67 72 65 67 61 74 65 73 28 4e 61 6d 65 43  Aggregates(NameC
24300 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 45 78 70  ontext *pNC, Exp
24310 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 57 61 6c  r *pExpr){.  Wal
24320 6b 65 72 20 77 3b 0a 20 20 6d 65 6d 73 65 74 28  ker w;.  memset(
24330 26 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 29  &w, 0, sizeof(w)
24340 29 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c  );.  w.xExprCall
24350 62 61 63 6b 20 3d 20 61 6e 61 6c 79 7a 65 41 67  back = analyzeAg
24360 67 72 65 67 61 74 65 3b 0a 20 20 77 2e 78 53 65  gregate;.  w.xSe
24370 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 61  lectCallback = a
24380 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73  nalyzeAggregates
24390 49 6e 53 65 6c 65 63 74 3b 0a 20 20 77 2e 75 2e  InSelect;.  w.u.
243a0 70 4e 43 20 3d 20 70 4e 43 3b 0a 20 20 61 73 73  pNC = pNC;.  ass
243b0 65 72 74 28 20 70 4e 43 2d 3e 70 53 72 63 4c 69  ert( pNC->pSrcLi
243c0 73 74 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74  st!=0 );.  sqlit
243d0 65 33 57 61 6c 6b 45 78 70 72 28 26 77 2c 20 70  e3WalkExpr(&w, p
243e0 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Expr);.}../*.** 
243f0 43 61 6c 6c 20 73 71 6c 69 74 65 33 45 78 70 72  Call sqlite3Expr
24400 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  AnalyzeAggregate
24410 73 28 29 20 66 6f 72 20 65 76 65 72 79 20 65 78  s() for every ex
24420 70 72 65 73 73 69 6f 6e 20 69 6e 20 61 6e 0a 2a  pression in an.*
24430 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  * expression lis
24440 74 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e  t.  Return the n
24450 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e  umber of errors.
24460 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
24470 6f 72 20 69 73 20 66 6f 75 6e 64 2c 20 74 68 65  or is found, the
24480 20 61 6e 61 6c 79 73 69 73 20 69 73 20 63 75 74   analysis is cut
24490 20 73 68 6f 72 74 2e 0a 2a 2f 0a 76 6f 69 64 20   short..*/.void 
244a0 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79  sqlite3ExprAnaly
244b0 7a 65 41 67 67 4c 69 73 74 28 4e 61 6d 65 43 6f  zeAggList(NameCo
244c0 6e 74 65 78 74 20 2a 70 4e 43 2c 20 45 78 70 72  ntext *pNC, Expr
244d0 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20  List *pList){.  
244e0 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
244f0 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69  item *pItem;.  i
24500 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73  nt i;.  if( pLis
24510 74 20 29 7b 0a 20 20 20 20 66 6f 72 28 70 49 74  t ){.    for(pIt
24520 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30  em=pList->a, i=0
24530 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ; i<pList->nExpr
24540 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i++, pItem++){
24550 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
24560 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  prAnalyzeAggrega
24570 74 65 73 28 70 4e 43 2c 20 70 49 74 65 6d 2d 3e  tes(pNC, pItem->
24580 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20  pExpr);.    }.  
24590 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  }.}../*.** Alloc
245a0 61 74 65 20 61 20 73 69 6e 67 6c 65 20 6e 65 77  ate a single new
245b0 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 75 73   register for us
245c0 65 20 74 6f 20 68 6f 6c 64 20 73 6f 6d 65 20 69  e to hold some i
245d0 6e 74 65 72 6d 65 64 69 61 74 65 20 72 65 73 75  ntermediate resu
245e0 6c 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  lt..*/.int sqlit
245f0 65 33 47 65 74 54 65 6d 70 52 65 67 28 50 61 72  e3GetTempReg(Par
24600 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 69  se *pParse){.  i
24610 66 28 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70  f( pParse->nTemp
24620 52 65 67 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  Reg==0 ){.    re
24630 74 75 72 6e 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  turn ++pParse->n
24640 4d 65 6d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  Mem;.  }.  retur
24650 6e 20 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52  n pParse->aTempR
24660 65 67 5b 2d 2d 70 50 61 72 73 65 2d 3e 6e 54 65  eg[--pParse->nTe
24670 6d 70 52 65 67 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  mpReg];.}../*.**
24680 20 44 65 61 6c 6c 6f 63 61 74 65 20 61 20 72 65   Deallocate a re
24690 67 69 73 74 65 72 2c 20 6d 61 6b 69 6e 67 20 61  gister, making a
246a0 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 72 65 75  vailable for reu
246b0 73 65 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65  se for some othe
246c0 72 0a 2a 2a 20 70 75 72 70 6f 73 65 2e 0a 2a 2a  r.** purpose..**
246d0 0a 2a 2a 20 49 66 20 61 20 72 65 67 69 73 74 65  .** If a registe
246e0 72 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 62  r is currently b
246f0 65 69 6e 67 20 75 73 65 64 20 62 79 20 74 68 65  eing used by the
24700 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2c 20 74   column cache, t
24710 68 65 6e 0a 2a 2a 20 74 68 65 20 64 65 61 6c 6c  hen.** the deall
24720 6f 63 61 74 69 6f 6e 20 69 73 20 64 65 66 65 72  ocation is defer
24730 72 65 64 20 75 6e 74 69 6c 20 74 68 65 20 63 6f  red until the co
24740 6c 75 6d 6e 20 63 61 63 68 65 20 6c 69 6e 65 20  lumn cache line 
24750 74 68 61 74 20 75 73 65 73 0a 2a 2a 20 74 68 65  that uses.** the
24760 20 72 65 67 69 73 74 65 72 20 62 65 63 6f 6d 65   register become
24770 73 20 73 74 61 6c 65 2e 0a 2a 2f 0a 76 6f 69 64  s stale..*/.void
24780 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
24790 65 6d 70 52 65 67 28 50 61 72 73 65 20 2a 70 50  empReg(Parse *pP
247a0 61 72 73 65 2c 20 69 6e 74 20 69 52 65 67 29 7b  arse, int iReg){
247b0 0a 20 20 69 66 28 20 69 52 65 67 20 26 26 20 70  .  if( iReg && p
247c0 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 3c  Parse->nTempReg<
247d0 41 72 72 61 79 53 69 7a 65 28 70 50 61 72 73 65  ArraySize(pParse
247e0 2d 3e 61 54 65 6d 70 52 65 67 29 20 29 7b 0a 20  ->aTempReg) ){. 
247f0 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 73 74     int i;.    st
24800 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a  ruct yColCache *
24810 70 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20  p;.    for(i=0, 
24820 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61  p=pParse->aColCa
24830 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f  che; i<SQLITE_N_
24840 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70  COLCACHE; i++, p
24850 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ++){.      if( p
24860 2d 3e 69 52 65 67 3d 3d 69 52 65 67 20 29 7b 0a  ->iReg==iReg ){.
24870 20 20 20 20 20 20 20 20 70 2d 3e 74 65 6d 70 52          p->tempR
24880 65 67 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  eg = 1;.        
24890 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a  return;.      }.
248a0 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65      }.    pParse
248b0 2d 3e 61 54 65 6d 70 52 65 67 5b 70 50 61 72 73  ->aTempReg[pPars
248c0 65 2d 3e 6e 54 65 6d 70 52 65 67 2b 2b 5d 20 3d  e->nTempReg++] =
248d0 20 69 52 65 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a   iReg;.  }.}../*
248e0 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6f 72 20  .** Allocate or 
248f0 64 65 61 6c 6c 6f 63 61 74 65 20 61 20 62 6c 6f  deallocate a blo
24900 63 6b 20 6f 66 20 6e 52 65 67 20 63 6f 6e 73 65  ck of nReg conse
24910 63 75 74 69 76 65 20 72 65 67 69 73 74 65 72 73  cutive registers
24920 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 47  .*/.int sqlite3G
24930 65 74 54 65 6d 70 52 61 6e 67 65 28 50 61 72 73  etTempRange(Pars
24940 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 6e  e *pParse, int n
24950 52 65 67 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6e  Reg){.  int i, n
24960 3b 0a 20 20 69 20 3d 20 70 50 61 72 73 65 2d 3e  ;.  i = pParse->
24970 69 52 61 6e 67 65 52 65 67 3b 0a 20 20 6e 20 3d  iRangeReg;.  n =
24980 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52   pParse->nRangeR
24990 65 67 3b 0a 20 20 69 66 28 20 6e 52 65 67 3c 3d  eg;.  if( nReg<=
249a0 6e 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  n ){.    assert(
249b0 20 21 75 73 65 64 41 73 43 6f 6c 75 6d 6e 43 61   !usedAsColumnCa
249c0 63 68 65 28 70 50 61 72 73 65 2c 20 69 2c 20 69  che(pParse, i, i
249d0 2b 6e 2d 31 29 20 29 3b 0a 20 20 20 20 70 50 61  +n-1) );.    pPa
249e0 72 73 65 2d 3e 69 52 61 6e 67 65 52 65 67 20 2b  rse->iRangeReg +
249f0 3d 20 6e 52 65 67 3b 0a 20 20 20 20 70 50 61 72  = nReg;.    pPar
24a00 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20 2d 3d  se->nRangeReg -=
24a10 20 6e 52 65 67 3b 0a 20 20 7d 65 6c 73 65 7b 0a   nReg;.  }else{.
24a20 20 20 20 20 69 20 3d 20 70 50 61 72 73 65 2d 3e      i = pParse->
24a30 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72  nMem+1;.    pPar
24a40 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 67  se->nMem += nReg
24a50 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69  ;.  }.  return i
24a60 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  ;.}.void sqlite3
24a70 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65  ReleaseTempRange
24a80 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
24a90 69 6e 74 20 69 52 65 67 2c 20 69 6e 74 20 6e 52  int iReg, int nR
24aa0 65 67 29 7b 0a 20 20 73 71 6c 69 74 65 33 45 78  eg){.  sqlite3Ex
24ab0 70 72 43 61 63 68 65 52 65 6d 6f 76 65 28 70 50  prCacheRemove(pP
24ac0 61 72 73 65 2c 20 69 52 65 67 2c 20 6e 52 65 67  arse, iReg, nReg
24ad0 29 3b 0a 20 20 69 66 28 20 6e 52 65 67 3e 70 50  );.  if( nReg>pP
24ae0 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20  arse->nRangeReg 
24af0 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  ){.    pParse->n
24b00 52 61 6e 67 65 52 65 67 20 3d 20 6e 52 65 67 3b  RangeReg = nReg;
24b10 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 69 52 61  .    pParse->iRa
24b20 6e 67 65 52 65 67 20 3d 20 69 52 65 67 3b 0a 20  ngeReg = iReg;. 
24b30 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b   }.}../*.** Mark
24b40 20 61 6c 6c 20 74 65 6d 70 6f 72 61 72 79 20 72   all temporary r
24b50 65 67 69 73 74 65 72 73 20 61 73 20 62 65 69 6e  egisters as bein
24b60 67 20 75 6e 61 76 61 69 6c 61 62 6c 65 20 66 6f  g unavailable fo
24b70 72 20 72 65 75 73 65 2e 0a 2a 2f 0a 76 6f 69 64  r reuse..*/.void
24b80 20 73 71 6c 69 74 65 33 43 6c 65 61 72 54 65 6d   sqlite3ClearTem
24b90 70 52 65 67 43 61 63 68 65 28 50 61 72 73 65 20  pRegCache(Parse 
24ba0 2a 70 50 61 72 73 65 29 7b 0a 20 20 70 50 61 72  *pParse){.  pPar
24bb0 73 65 2d 3e 6e 54 65 6d 70 52 65 67 20 3d 20 30  se->nTempReg = 0
24bc0 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e  ;.  pParse->nRan
24bd0 67 65 52 65 67 20 3d 20 30 3b 0a 7d 0a           geReg = 0;.}.