/ Hex Artifact Content
Login

Artifact 38790e65d1219f2b7dc26458f39a5252fe7c60cd:


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 2c 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 20 20  g sequence */.  
09c0: 69 6e 74 20 64 65 71 75 6f 74 65 20 20 20 20 20  int dequote     
09d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
09e0: 20 74 6f 20 64 65 71 75 6f 74 65 20 70 43 6f 6c   to dequote pCol
09f0: 6c 4e 61 6d 65 20 2a 2f 0a 29 7b 0a 20 20 69 66  lName */.){.  if
0a00: 28 20 70 43 6f 6c 6c 4e 61 6d 65 2d 3e 6e 3e 30  ( pCollName->n>0
0a10: 20 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 4e   ){.    Expr *pN
0a20: 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ew = sqlite3Expr
0a30: 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64 62  Alloc(pParse->db
0a40: 2c 20 54 4b 5f 43 4f 4c 4c 41 54 45 2c 20 70 43  , TK_COLLATE, pC
0a50: 6f 6c 6c 4e 61 6d 65 2c 20 64 65 71 75 6f 74 65  ollName, dequote
0a60: 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 20  );.    if( pNew 
0a70: 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70  ){.      pNew->p
0a80: 4c 65 66 74 20 3d 20 70 45 78 70 72 3b 0a 20 20  Left = pExpr;.  
0a90: 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20      pNew->flags 
0aa0: 7c 3d 20 45 50 5f 43 6f 6c 6c 61 74 65 7c 45 50  |= EP_Collate|EP
0ab0: 5f 53 6b 69 70 3b 0a 20 20 20 20 20 20 70 45 78  _Skip;.      pEx
0ac0: 70 72 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 7d  pr = pNew;.    }
0ad0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 45  .  }.  return pE
0ae0: 78 70 72 3b 0a 7d 0a 45 78 70 72 20 2a 73 71 6c  xpr;.}.Expr *sql
0af0: 69 74 65 33 45 78 70 72 41 64 64 43 6f 6c 6c 61  ite3ExprAddColla
0b00: 74 65 53 74 72 69 6e 67 28 50 61 72 73 65 20 2a  teString(Parse *
0b10: 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
0b20: 78 70 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  xpr, const char 
0b30: 2a 7a 43 29 7b 0a 20 20 54 6f 6b 65 6e 20 73 3b  *zC){.  Token s;
0b40: 0a 20 20 61 73 73 65 72 74 28 20 7a 43 21 3d 30  .  assert( zC!=0
0b50: 20 29 3b 0a 20 20 73 2e 7a 20 3d 20 7a 43 3b 0a   );.  s.z = zC;.
0b60: 20 20 73 2e 6e 20 3d 20 73 71 6c 69 74 65 33 53    s.n = sqlite3S
0b70: 74 72 6c 65 6e 33 30 28 73 2e 7a 29 3b 0a 20 20  trlen30(s.z);.  
0b80: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78  return sqlite3Ex
0b90: 70 72 41 64 64 43 6f 6c 6c 61 74 65 54 6f 6b 65  prAddCollateToke
0ba0: 6e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  n(pParse, pExpr,
0bb0: 20 26 73 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   &s, 0);.}../*.*
0bc0: 2a 20 53 6b 69 70 20 6f 76 65 72 20 61 6e 79 20  * Skip over any 
0bd0: 54 4b 5f 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61  TK_COLLATE opera
0be0: 74 6f 72 73 20 61 6e 64 20 61 6e 79 20 75 6e 6c  tors and any unl
0bf0: 69 6b 65 6c 79 28 29 0a 2a 2a 20 6f 72 20 6c 69  ikely().** or li
0c00: 6b 65 6c 69 68 6f 6f 64 28 29 20 66 75 6e 63 74  kelihood() funct
0c10: 69 6f 6e 20 61 74 20 74 68 65 20 72 6f 6f 74 20  ion at the root 
0c20: 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  of an expression
0c30: 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74  ..*/.Expr *sqlit
0c40: 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74  e3ExprSkipCollat
0c50: 65 28 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  e(Expr *pExpr){.
0c60: 20 20 77 68 69 6c 65 28 20 70 45 78 70 72 20 26    while( pExpr &
0c70: 26 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  & ExprHasPropert
0c80: 79 28 70 45 78 70 72 2c 20 45 50 5f 53 6b 69 70  y(pExpr, EP_Skip
0c90: 29 20 29 7b 0a 20 20 20 20 69 66 28 20 45 78 70  ) ){.    if( Exp
0ca0: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
0cb0: 70 72 2c 20 45 50 5f 55 6e 6c 69 6b 65 6c 79 29  pr, EP_Unlikely)
0cc0: 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
0cd0: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
0ce0: 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73  ty(pExpr, EP_xIs
0cf0: 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20  Select) );.     
0d00: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
0d10: 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30  x.pList->nExpr>0
0d20: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
0d30: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
0d40: 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 20 20  FUNCTION );.    
0d50: 20 20 70 45 78 70 72 20 3d 20 70 45 78 70 72 2d    pExpr = pExpr-
0d60: 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  >x.pList->a[0].p
0d70: 45 78 70 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Expr;.    }else{
0d80: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
0d90: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  Expr->op==TK_COL
0da0: 4c 41 54 45 20 29 3b 0a 20 20 20 20 20 20 70 45  LATE );.      pE
0db0: 78 70 72 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65  xpr = pExpr->pLe
0dc0: 66 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 20 20  ft;.    }.  }   
0dd0: 0a 20 20 72 65 74 75 72 6e 20 70 45 78 70 72 3b  .  return pExpr;
0de0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
0df0: 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   the collation s
0e00: 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20  equence for the 
0e10: 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72  expression pExpr
0e20: 2e 20 49 66 0a 2a 2a 20 74 68 65 72 65 20 69 73  . If.** there is
0e30: 20 6e 6f 20 64 65 66 69 6e 65 64 20 63 6f 6c 6c   no defined coll
0e40: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2c 20  ating sequence, 
0e50: 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a  return NULL..**.
0e60: 2a 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69 6e 67  ** The collating
0e70: 20 73 65 71 75 65 6e 63 65 20 6d 69 67 68 74 20   sequence might 
0e80: 62 65 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79  be determined by
0e90: 20 61 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61   a COLLATE opera
0ea0: 74 6f 72 0a 2a 2a 20 6f 72 20 62 79 20 74 68 65  tor.** or by the
0eb0: 20 70 72 65 73 65 6e 63 65 20 6f 66 20 61 20 63   presence of a c
0ec0: 6f 6c 75 6d 6e 20 77 69 74 68 20 61 20 64 65 66  olumn with a def
0ed0: 69 6e 65 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73  ined collating s
0ee0: 65 71 75 65 6e 63 65 2e 0a 2a 2a 20 43 4f 4c 4c  equence..** COLL
0ef0: 41 54 45 20 6f 70 65 72 61 74 6f 72 73 20 74 61  ATE operators ta
0f00: 6b 65 20 66 69 72 73 74 20 70 72 65 63 65 64 65  ke first precede
0f10: 6e 63 65 2e 20 20 4c 65 66 74 20 6f 70 65 72 61  nce.  Left opera
0f20: 6e 64 73 20 74 61 6b 65 0a 2a 2a 20 70 72 65 63  nds take.** prec
0f30: 65 64 65 6e 63 65 20 6f 76 65 72 20 72 69 67 68  edence over righ
0f40: 74 20 6f 70 65 72 61 6e 64 73 2e 0a 2a 2f 0a 43  t operands..*/.C
0f50: 6f 6c 6c 53 65 71 20 2a 73 71 6c 69 74 65 33 45  ollSeq *sqlite3E
0f60: 78 70 72 43 6f 6c 6c 53 65 71 28 50 61 72 73 65  xprCollSeq(Parse
0f70: 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
0f80: 70 45 78 70 72 29 7b 0a 20 20 73 71 6c 69 74 65  pExpr){.  sqlite
0f90: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
0fa0: 64 62 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70  db;.  CollSeq *p
0fb0: 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 45 78 70 72  Coll = 0;.  Expr
0fc0: 20 2a 70 20 3d 20 70 45 78 70 72 3b 0a 20 20 77   *p = pExpr;.  w
0fd0: 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 69  hile( p ){.    i
0fe0: 6e 74 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20  nt op = p->op;. 
0ff0: 20 20 20 69 66 28 20 70 2d 3e 66 6c 61 67 73 20     if( p->flags 
1000: 26 20 45 50 5f 47 65 6e 65 72 69 63 20 29 20 62  & EP_Generic ) b
1010: 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 6f 70  reak;.    if( op
1020: 3d 3d 54 4b 5f 43 41 53 54 20 7c 7c 20 6f 70 3d  ==TK_CAST || op=
1030: 3d 54 4b 5f 55 50 4c 55 53 20 29 7b 0a 20 20 20  =TK_UPLUS ){.   
1040: 20 20 20 70 20 3d 20 70 2d 3e 70 4c 65 66 74 3b     p = p->pLeft;
1050: 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b  .      continue;
1060: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f  .    }.    if( o
1070: 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 7c 7c  p==TK_COLLATE ||
1080: 20 28 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45   (op==TK_REGISTE
1090: 52 20 26 26 20 70 2d 3e 6f 70 32 3d 3d 54 4b 5f  R && p->op2==TK_
10a0: 43 4f 4c 4c 41 54 45 29 20 29 7b 0a 20 20 20 20  COLLATE) ){.    
10b0: 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
10c0: 33 47 65 74 43 6f 6c 6c 53 65 71 28 70 50 61 72  3GetCollSeq(pPar
10d0: 73 65 2c 20 45 4e 43 28 64 62 29 2c 20 30 2c 20  se, ENC(db), 0, 
10e0: 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20  p->u.zToken);.  
10f0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1100: 0a 20 20 20 20 69 66 28 20 28 6f 70 3d 3d 54 4b  .    if( (op==TK
1110: 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 6f  _AGG_COLUMN || o
1120: 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20  p==TK_COLUMN.   
1130: 20 20 20 20 20 20 20 7c 7c 20 6f 70 3d 3d 54 4b         || op==TK
1140: 5f 52 45 47 49 53 54 45 52 20 7c 7c 20 6f 70 3d  _REGISTER || op=
1150: 3d 54 4b 5f 54 52 49 47 47 45 52 29 0a 20 20 20  =TK_TRIGGER).   
1160: 20 20 26 26 20 70 2d 3e 70 54 61 62 21 3d 30 0a    && p->pTab!=0.
1170: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20      ){.      /* 
1180: 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20  op==TK_REGISTER 
1190: 26 26 20 70 2d 3e 70 54 61 62 21 3d 30 20 68 61  && p->pTab!=0 ha
11a0: 70 70 65 6e 73 20 77 68 65 6e 20 70 45 78 70 72  ppens when pExpr
11b0: 20 77 61 73 20 6f 72 69 67 69 6e 61 6c 6c 79 0a   was originally.
11c0: 20 20 20 20 20 20 2a 2a 20 61 20 54 4b 5f 43 4f        ** a TK_CO
11d0: 4c 55 4d 4e 20 62 75 74 20 77 61 73 20 70 72 65  LUMN but was pre
11e0: 76 69 6f 75 73 6c 79 20 65 76 61 6c 75 61 74 65  viously evaluate
11f0: 64 20 61 6e 64 20 63 61 63 68 65 64 20 69 6e 20  d and cached in 
1200: 61 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20  a register */.  
1210: 20 20 20 20 69 6e 74 20 6a 20 3d 20 70 2d 3e 69      int j = p->i
1220: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 69 66  Column;.      if
1230: 28 20 6a 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( j>=0 ){.      
1240: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
1250: 6f 6c 6c 20 3d 20 70 2d 3e 70 54 61 62 2d 3e 61  oll = p->pTab->a
1260: 43 6f 6c 5b 6a 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20  Col[j].zColl;.  
1270: 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71        pColl = sq
1280: 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71  lite3FindCollSeq
1290: 28 64 62 2c 20 45 4e 43 28 64 62 29 2c 20 7a 43  (db, ENC(db), zC
12a0: 6f 6c 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  oll, 0);.      }
12b0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
12c0: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 66    }.    if( p->f
12d0: 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74  lags & EP_Collat
12e0: 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  e ){.      if( p
12f0: 2d 3e 70 4c 65 66 74 20 26 26 20 28 70 2d 3e 70  ->pLeft && (p->p
1300: 4c 65 66 74 2d 3e 66 6c 61 67 73 20 26 20 45 50  Left->flags & EP
1310: 5f 43 6f 6c 6c 61 74 65 29 21 3d 30 20 29 7b 0a  _Collate)!=0 ){.
1320: 20 20 20 20 20 20 20 20 70 20 3d 20 70 2d 3e 70          p = p->p
1330: 4c 65 66 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Left;.      }els
1340: 65 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20  e{.        Expr 
1350: 2a 70 4e 65 78 74 20 20 3d 20 70 2d 3e 70 52 69  *pNext  = p->pRi
1360: 67 68 74 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ght;.        /* 
1370: 54 68 65 20 45 78 70 72 2e 78 20 75 6e 69 6f 6e  The Expr.x union
1380: 20 69 73 20 6e 65 76 65 72 20 75 73 65 64 20 61   is never used a
1390: 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 20  t the same time 
13a0: 61 73 20 45 78 70 72 2e 70 52 69 67 68 74 20 2a  as Expr.pRight *
13b0: 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
13c0: 28 20 70 2d 3e 78 2e 70 4c 69 73 74 3d 3d 30 20  ( p->x.pList==0 
13d0: 7c 7c 20 70 2d 3e 70 52 69 67 68 74 3d 3d 30 20  || p->pRight==0 
13e0: 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 70 2d  );.        /* p-
13f0: 3e 66 6c 61 67 73 20 68 6f 6c 64 73 20 45 50 5f  >flags holds EP_
1400: 43 6f 6c 6c 61 74 65 20 61 6e 64 20 70 2d 3e 70  Collate and p->p
1410: 4c 65 66 74 2d 3e 66 6c 61 67 73 20 64 6f 65 73  Left->flags does
1420: 20 6e 6f 74 2e 20 20 41 6e 64 0a 20 20 20 20 20   not.  And.     
1430: 20 20 20 2a 2a 20 70 2d 3e 78 2e 70 53 65 6c 65     ** p->x.pSele
1440: 63 74 20 63 61 6e 6e 6f 74 2e 20 20 53 6f 20 69  ct cannot.  So i
1450: 66 20 70 2d 3e 78 2e 70 4c 65 66 74 20 65 78 69  f p->x.pLeft exi
1460: 73 74 73 2c 20 69 74 20 6d 75 73 74 20 68 6f 6c  sts, it must hol
1470: 64 20 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20  d at.        ** 
1480: 6c 65 61 73 74 20 6f 6e 65 20 45 50 5f 43 6f 6c  least one EP_Col
1490: 6c 61 74 65 2e 20 54 68 75 73 20 74 68 65 20 66  late. Thus the f
14a0: 6f 6c 6c 6f 77 69 6e 67 20 74 77 6f 20 41 4c 57  ollowing two ALW
14b0: 41 59 53 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  AYS. */.        
14c0: 69 66 28 20 70 2d 3e 78 2e 70 4c 69 73 74 21 3d  if( p->x.pList!=
14d0: 30 20 26 26 20 41 4c 57 41 59 53 28 21 45 78 70  0 && ALWAYS(!Exp
14e0: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
14f0: 45 50 5f 78 49 73 53 65 6c 65 63 74 29 29 20 29  EP_xIsSelect)) )
1500: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
1510: 69 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  i;.          for
1520: 28 69 3d 30 3b 20 41 4c 57 41 59 53 28 69 3c 70  (i=0; ALWAYS(i<p
1530: 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ->x.pList->nExpr
1540: 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  ); i++){.       
1550: 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73       if( ExprHas
1560: 50 72 6f 70 65 72 74 79 28 70 2d 3e 78 2e 70 4c  Property(p->x.pL
1570: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c  ist->a[i].pExpr,
1580: 20 45 50 5f 43 6f 6c 6c 61 74 65 29 20 29 7b 0a   EP_Collate) ){.
1590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4e                pN
15a0: 65 78 74 20 3d 20 70 2d 3e 78 2e 70 4c 69 73 74  ext = p->x.pList
15b0: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
15c0: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
15d0: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  k;.            }
15e0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
15f0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
1600: 20 3d 20 70 4e 65 78 74 3b 0a 20 20 20 20 20 20   = pNext;.      
1610: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
1620: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1630: 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65    }.  if( sqlite
1640: 33 43 68 65 63 6b 43 6f 6c 6c 53 65 71 28 70 50  3CheckCollSeq(pP
1650: 61 72 73 65 2c 20 70 43 6f 6c 6c 29 20 29 7b 20  arse, pColl) ){ 
1660: 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 30 3b 0a  .    pColl = 0;.
1670: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 43 6f    }.  return pCo
1680: 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78  ll;.}../*.** pEx
1690: 70 72 20 69 73 20 61 6e 20 6f 70 65 72 61 6e 64  pr is an operand
16a0: 20 6f 66 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e   of a comparison
16b0: 20 6f 70 65 72 61 74 6f 72 2e 20 20 61 66 66 32   operator.  aff2
16c0: 20 69 73 20 74 68 65 0a 2a 2a 20 74 79 70 65 20   is the.** type 
16d0: 61 66 66 69 6e 69 74 79 20 6f 66 20 74 68 65 20  affinity of the 
16e0: 6f 74 68 65 72 20 6f 70 65 72 61 6e 64 2e 20 20  other operand.  
16f0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  This routine ret
1700: 75 72 6e 73 20 74 68 65 0a 2a 2a 20 74 79 70 65  urns the.** type
1710: 20 61 66 66 69 6e 69 74 79 20 74 68 61 74 20 73   affinity that s
1720: 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20 66 6f  hould be used fo
1730: 72 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  r the comparison
1740: 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2f 0a 63 68   operator..*/.ch
1750: 61 72 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72  ar sqlite3Compar
1760: 65 41 66 66 69 6e 69 74 79 28 45 78 70 72 20 2a  eAffinity(Expr *
1770: 70 45 78 70 72 2c 20 63 68 61 72 20 61 66 66 32  pExpr, char aff2
1780: 29 7b 0a 20 20 63 68 61 72 20 61 66 66 31 20 3d  ){.  char aff1 =
1790: 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69   sqlite3ExprAffi
17a0: 6e 69 74 79 28 70 45 78 70 72 29 3b 0a 20 20 69  nity(pExpr);.  i
17b0: 66 28 20 61 66 66 31 20 26 26 20 61 66 66 32 20  f( aff1 && aff2 
17c0: 29 7b 0a 20 20 20 20 2f 2a 20 42 6f 74 68 20 73  ){.    /* Both s
17d0: 69 64 65 73 20 6f 66 20 74 68 65 20 63 6f 6d 70  ides of the comp
17e0: 61 72 69 73 6f 6e 20 61 72 65 20 63 6f 6c 75 6d  arison are colum
17f0: 6e 73 2e 20 49 66 20 6f 6e 65 20 68 61 73 20 6e  ns. If one has n
1800: 75 6d 65 72 69 63 0a 20 20 20 20 2a 2a 20 61 66  umeric.    ** af
1810: 66 69 6e 69 74 79 2c 20 75 73 65 20 74 68 61 74  finity, use that
1820: 2e 20 4f 74 68 65 72 77 69 73 65 20 75 73 65 20  . Otherwise use 
1830: 6e 6f 20 61 66 66 69 6e 69 74 79 2e 0a 20 20 20  no affinity..   
1840: 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69   */.    if( sqli
1850: 74 65 33 49 73 4e 75 6d 65 72 69 63 41 66 66 69  te3IsNumericAffi
1860: 6e 69 74 79 28 61 66 66 31 29 20 7c 7c 20 73 71  nity(aff1) || sq
1870: 6c 69 74 65 33 49 73 4e 75 6d 65 72 69 63 41 66  lite3IsNumericAf
1880: 66 69 6e 69 74 79 28 61 66 66 32 29 20 29 7b 0a  finity(aff2) ){.
1890: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
18a0: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b  ITE_AFF_NUMERIC;
18b0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
18c0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
18d0: 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 20 20 7d 0a  AFF_BLOB;.    }.
18e0: 20 20 7d 65 6c 73 65 20 69 66 28 20 21 61 66 66    }else if( !aff
18f0: 31 20 26 26 20 21 61 66 66 32 20 29 7b 0a 20 20  1 && !aff2 ){.  
1900: 20 20 2f 2a 20 4e 65 69 74 68 65 72 20 73 69 64    /* Neither sid
1910: 65 20 6f 66 20 74 68 65 20 63 6f 6d 70 61 72 69  e of the compari
1920: 73 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2e  son is a column.
1930: 20 20 43 6f 6d 70 61 72 65 20 74 68 65 0a 20 20    Compare the.  
1940: 20 20 2a 2a 20 72 65 73 75 6c 74 73 20 64 69 72    ** results dir
1950: 65 63 74 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  ectly..    */.  
1960: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1970: 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 7d 65 6c 73  AFF_BLOB;.  }els
1980: 65 7b 0a 20 20 20 20 2f 2a 20 4f 6e 65 20 73 69  e{.    /* One si
1990: 64 65 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20  de is a column, 
19a0: 74 68 65 20 6f 74 68 65 72 20 69 73 20 6e 6f 74  the other is not
19b0: 2e 20 55 73 65 20 74 68 65 20 63 6f 6c 75 6d 6e  . Use the column
19c0: 73 20 61 66 66 69 6e 69 74 79 2e 20 2a 2f 0a 20  s affinity. */. 
19d0: 20 20 20 61 73 73 65 72 74 28 20 61 66 66 31 3d     assert( aff1=
19e0: 3d 30 20 7c 7c 20 61 66 66 32 3d 3d 30 20 29 3b  =0 || aff2==0 );
19f0: 0a 20 20 20 20 72 65 74 75 72 6e 20 28 61 66 66  .    return (aff
1a00: 31 20 2b 20 61 66 66 32 29 3b 0a 20 20 7d 0a 7d  1 + aff2);.  }.}
1a10: 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72 20 69 73  ../*.** pExpr is
1a20: 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70   a comparison op
1a30: 65 72 61 74 6f 72 2e 20 20 52 65 74 75 72 6e 20  erator.  Return 
1a40: 74 68 65 20 74 79 70 65 20 61 66 66 69 6e 69 74  the type affinit
1a50: 79 20 74 68 61 74 20 73 68 6f 75 6c 64 0a 2a 2a  y that should.**
1a60: 20 62 65 20 61 70 70 6c 69 65 64 20 74 6f 20 62   be applied to b
1a70: 6f 74 68 20 6f 70 65 72 61 6e 64 73 20 70 72 69  oth operands pri
1a80: 6f 72 20 74 6f 20 64 6f 69 6e 67 20 74 68 65 20  or to doing the 
1a90: 63 6f 6d 70 61 72 69 73 6f 6e 2e 0a 2a 2f 0a 73  comparison..*/.s
1aa0: 74 61 74 69 63 20 63 68 61 72 20 63 6f 6d 70 61  tatic char compa
1ab0: 72 69 73 6f 6e 41 66 66 69 6e 69 74 79 28 45 78  risonAffinity(Ex
1ac0: 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 63 68  pr *pExpr){.  ch
1ad0: 61 72 20 61 66 66 3b 0a 20 20 61 73 73 65 72 74  ar aff;.  assert
1ae0: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
1af0: 45 51 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d  EQ || pExpr->op=
1b00: 3d 54 4b 5f 49 4e 20 7c 7c 20 70 45 78 70 72 2d  =TK_IN || pExpr-
1b10: 3e 6f 70 3d 3d 54 4b 5f 4c 54 20 7c 7c 0a 20 20  >op==TK_LT ||.  
1b20: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f          pExpr->o
1b30: 70 3d 3d 54 4b 5f 47 54 20 7c 7c 20 70 45 78 70  p==TK_GT || pExp
1b40: 72 2d 3e 6f 70 3d 3d 54 4b 5f 47 45 20 7c 7c 20  r->op==TK_GE || 
1b50: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45  pExpr->op==TK_LE
1b60: 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 70 45   ||.          pE
1b70: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4e 45 20 7c  xpr->op==TK_NE |
1b80: 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  | pExpr->op==TK_
1b90: 49 53 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d  IS || pExpr->op=
1ba0: 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20 20 61  =TK_ISNOT );.  a
1bb0: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 4c  ssert( pExpr->pL
1bc0: 65 66 74 20 29 3b 0a 20 20 61 66 66 20 3d 20 73  eft );.  aff = s
1bd0: 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69  qlite3ExprAffini
1be0: 74 79 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  ty(pExpr->pLeft)
1bf0: 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70  ;.  if( pExpr->p
1c00: 52 69 67 68 74 20 29 7b 0a 20 20 20 20 61 66 66  Right ){.    aff
1c10: 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72   = sqlite3Compar
1c20: 65 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 2d  eAffinity(pExpr-
1c30: 3e 70 52 69 67 68 74 2c 20 61 66 66 29 3b 0a 20  >pRight, aff);. 
1c40: 20 7d 65 6c 73 65 20 69 66 28 20 45 78 70 72 48   }else if( ExprH
1c50: 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
1c60: 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
1c70: 29 7b 0a 20 20 20 20 61 66 66 20 3d 20 73 71 6c  ){.    aff = sql
1c80: 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e  ite3CompareAffin
1c90: 69 74 79 28 70 45 78 70 72 2d 3e 78 2e 70 53 65  ity(pExpr->x.pSe
1ca0: 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b  lect->pEList->a[
1cb0: 30 5d 2e 70 45 78 70 72 2c 20 61 66 66 29 3b 0a  0].pExpr, aff);.
1cc0: 20 20 7d 65 6c 73 65 20 69 66 28 20 21 61 66 66    }else if( !aff
1cd0: 20 29 7b 0a 20 20 20 20 61 66 66 20 3d 20 53 51   ){.    aff = SQ
1ce0: 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20  LITE_AFF_BLOB;. 
1cf0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 61 66 66 3b   }.  return aff;
1d00: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72 20  .}../*.** pExpr 
1d10: 69 73 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20  is a comparison 
1d20: 65 78 70 72 65 73 73 69 6f 6e 2c 20 65 67 2e 20  expression, eg. 
1d30: 27 3d 27 2c 20 27 3c 27 2c 20 49 4e 28 2e 2e 2e  '=', '<', IN(...
1d40: 29 20 65 74 63 2e 0a 2a 2a 20 69 64 78 5f 61 66  ) etc..** idx_af
1d50: 66 69 6e 69 74 79 20 69 73 20 74 68 65 20 61 66  finity is the af
1d60: 66 69 6e 69 74 79 20 6f 66 20 61 6e 20 69 6e 64  finity of an ind
1d70: 65 78 65 64 20 63 6f 6c 75 6d 6e 2e 20 52 65 74  exed column. Ret
1d80: 75 72 6e 20 74 72 75 65 0a 2a 2a 20 69 66 20 74  urn true.** if t
1d90: 68 65 20 69 6e 64 65 78 20 77 69 74 68 20 61 66  he index with af
1da0: 66 69 6e 69 74 79 20 69 64 78 5f 61 66 66 69 6e  finity idx_affin
1db0: 69 74 79 20 6d 61 79 20 62 65 20 75 73 65 64 20  ity may be used 
1dc0: 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 0a 2a 2a 20  to implement.** 
1dd0: 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69  the comparison i
1de0: 6e 20 70 45 78 70 72 2e 0a 2a 2f 0a 69 6e 74 20  n pExpr..*/.int 
1df0: 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69  sqlite3IndexAffi
1e00: 6e 69 74 79 4f 6b 28 45 78 70 72 20 2a 70 45 78  nityOk(Expr *pEx
1e10: 70 72 2c 20 63 68 61 72 20 69 64 78 5f 61 66 66  pr, char idx_aff
1e20: 69 6e 69 74 79 29 7b 0a 20 20 63 68 61 72 20 61  inity){.  char a
1e30: 66 66 20 3d 20 63 6f 6d 70 61 72 69 73 6f 6e 41  ff = comparisonA
1e40: 66 66 69 6e 69 74 79 28 70 45 78 70 72 29 3b 0a  ffinity(pExpr);.
1e50: 20 20 73 77 69 74 63 68 28 20 61 66 66 20 29 7b    switch( aff ){
1e60: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1e70: 5f 41 46 46 5f 42 4c 4f 42 3a 0a 20 20 20 20 20  _AFF_BLOB:.     
1e80: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 63   return 1;.    c
1e90: 61 73 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 54  ase SQLITE_AFF_T
1ea0: 45 58 54 3a 0a 20 20 20 20 20 20 72 65 74 75 72  EXT:.      retur
1eb0: 6e 20 69 64 78 5f 61 66 66 69 6e 69 74 79 3d 3d  n idx_affinity==
1ec0: 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b  SQLITE_AFF_TEXT;
1ed0: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20  .    default:.  
1ee0: 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
1ef0: 65 33 49 73 4e 75 6d 65 72 69 63 41 66 66 69 6e  e3IsNumericAffin
1f00: 69 74 79 28 69 64 78 5f 61 66 66 69 6e 69 74 79  ity(idx_affinity
1f10: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
1f20: 52 65 74 75 72 6e 20 74 68 65 20 50 35 20 76 61  Return the P5 va
1f30: 6c 75 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20  lue that should 
1f40: 62 65 20 75 73 65 64 20 66 6f 72 20 61 20 62 69  be used for a bi
1f50: 6e 61 72 79 20 63 6f 6d 70 61 72 69 73 6f 6e 0a  nary comparison.
1f60: 2a 2a 20 6f 70 63 6f 64 65 20 28 4f 50 5f 45 71  ** opcode (OP_Eq
1f70: 2c 20 4f 50 5f 47 65 20 65 74 63 2e 29 20 75 73  , OP_Ge etc.) us
1f80: 65 64 20 74 6f 20 63 6f 6d 70 61 72 65 20 70 45  ed to compare pE
1f90: 78 70 72 31 20 61 6e 64 20 70 45 78 70 72 32 2e  xpr1 and pExpr2.
1fa0: 0a 2a 2f 0a 73 74 61 74 69 63 20 75 38 20 62 69  .*/.static u8 bi
1fb0: 6e 61 72 79 43 6f 6d 70 61 72 65 50 35 28 45 78  naryCompareP5(Ex
1fc0: 70 72 20 2a 70 45 78 70 72 31 2c 20 45 78 70 72  pr *pExpr1, Expr
1fd0: 20 2a 70 45 78 70 72 32 2c 20 69 6e 74 20 6a 75   *pExpr2, int ju
1fe0: 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 75 38 20  mpIfNull){.  u8 
1ff0: 61 66 66 20 3d 20 28 63 68 61 72 29 73 71 6c 69  aff = (char)sqli
2000: 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28  te3ExprAffinity(
2010: 70 45 78 70 72 32 29 3b 0a 20 20 61 66 66 20 3d  pExpr2);.  aff =
2020: 20 28 75 38 29 73 71 6c 69 74 65 33 43 6f 6d 70   (u8)sqlite3Comp
2030: 61 72 65 41 66 66 69 6e 69 74 79 28 70 45 78 70  areAffinity(pExp
2040: 72 31 2c 20 61 66 66 29 20 7c 20 28 75 38 29 6a  r1, aff) | (u8)j
2050: 75 6d 70 49 66 4e 75 6c 6c 3b 0a 20 20 72 65 74  umpIfNull;.  ret
2060: 75 72 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn aff;.}../*.*
2070: 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
2080: 65 72 20 74 6f 20 74 68 65 20 63 6f 6c 6c 61 74  er to the collat
2090: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 74 68 61  ion sequence tha
20a0: 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64  t should be used
20b0: 20 62 79 0a 2a 2a 20 61 20 62 69 6e 61 72 79 20   by.** a binary 
20c0: 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61  comparison opera
20d0: 74 6f 72 20 63 6f 6d 70 61 72 69 6e 67 20 70 4c  tor comparing pL
20e0: 65 66 74 20 61 6e 64 20 70 52 69 67 68 74 2e 0a  eft and pRight..
20f0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 65 66  **.** If the lef
2100: 74 20 68 61 6e 64 20 65 78 70 72 65 73 73 69 6f  t hand expressio
2110: 6e 20 68 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e  n has a collatin
2120: 67 20 73 65 71 75 65 6e 63 65 20 74 79 70 65 2c  g sequence type,
2130: 20 74 68 65 6e 20 69 74 20 69 73 0a 2a 2a 20 75   then it is.** u
2140: 73 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20 74  sed. Otherwise t
2150: 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  he collation seq
2160: 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20 72 69  uence for the ri
2170: 67 68 74 20 68 61 6e 64 20 65 78 70 72 65 73 73  ght hand express
2180: 69 6f 6e 0a 2a 2a 20 69 73 20 75 73 65 64 2c 20  ion.** is used, 
2190: 6f 72 20 74 68 65 20 64 65 66 61 75 6c 74 20 28  or the default (
21a0: 42 49 4e 41 52 59 29 20 69 66 20 6e 65 69 74 68  BINARY) if neith
21b0: 65 72 20 65 78 70 72 65 73 73 69 6f 6e 20 68 61  er expression ha
21c0: 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a  s a collating.**
21d0: 20 74 79 70 65 2e 0a 2a 2a 0a 2a 2a 20 41 72 67   type..**.** Arg
21e0: 75 6d 65 6e 74 20 70 52 69 67 68 74 20 28 62 75  ument pRight (bu
21f0: 74 20 6e 6f 74 20 70 4c 65 66 74 29 20 6d 61 79  t not pLeft) may
2200: 20 62 65 20 61 20 6e 75 6c 6c 20 70 6f 69 6e 74   be a null point
2210: 65 72 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  er. In this case
2220: 2c 0a 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20 63  ,.** it is not c
2230: 6f 6e 73 69 64 65 72 65 64 2e 0a 2a 2f 0a 43 6f  onsidered..*/.Co
2240: 6c 6c 53 65 71 20 2a 73 71 6c 69 74 65 33 42 69  llSeq *sqlite3Bi
2250: 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53  naryCompareCollS
2260: 65 71 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  eq(.  Parse *pPa
2270: 72 73 65 2c 20 0a 20 20 45 78 70 72 20 2a 70 4c  rse, .  Expr *pL
2280: 65 66 74 2c 20 0a 20 20 45 78 70 72 20 2a 70 52  eft, .  Expr *pR
2290: 69 67 68 74 0a 29 7b 0a 20 20 43 6f 6c 6c 53 65  ight.){.  CollSe
22a0: 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 61 73 73 65  q *pColl;.  asse
22b0: 72 74 28 20 70 4c 65 66 74 20 29 3b 0a 20 20 69  rt( pLeft );.  i
22c0: 66 28 20 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20  f( pLeft->flags 
22d0: 26 20 45 50 5f 43 6f 6c 6c 61 74 65 20 29 7b 0a  & EP_Collate ){.
22e0: 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
22f0: 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
2300: 50 61 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a 20  Parse, pLeft);. 
2310: 20 7d 65 6c 73 65 20 69 66 28 20 70 52 69 67 68   }else if( pRigh
2320: 74 20 26 26 20 28 70 52 69 67 68 74 2d 3e 66 6c  t && (pRight->fl
2330: 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65  ags & EP_Collate
2340: 29 21 3d 30 20 29 7b 0a 20 20 20 20 70 43 6f 6c  )!=0 ){.    pCol
2350: 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
2360: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
2370: 52 69 67 68 74 29 3b 0a 20 20 7d 65 6c 73 65 7b  Right);.  }else{
2380: 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c  .    pColl = sql
2390: 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
23a0: 70 50 61 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a  pParse, pLeft);.
23b0: 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29      if( !pColl )
23c0: 7b 0a 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20  {.      pColl = 
23d0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
23e0: 65 71 28 70 50 61 72 73 65 2c 20 70 52 69 67 68  eq(pParse, pRigh
23f0: 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  t);.    }.  }.  
2400: 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a  return pColl;.}.
2410: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
2420: 63 6f 64 65 20 66 6f 72 20 61 20 63 6f 6d 70 61  code for a compa
2430: 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 0a  rison operator..
2440: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f  */.static int co
2450: 64 65 43 6f 6d 70 61 72 65 28 0a 20 20 50 61 72  deCompare(.  Par
2460: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f  se *pParse,    /
2470: 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 28 61  * The parsing (a
2480: 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69  nd code generati
2490: 6e 67 29 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ng) context */. 
24a0: 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 20 20   Expr *pLeft,   
24b0: 20 20 20 2f 2a 20 54 68 65 20 6c 65 66 74 20 6f     /* The left o
24c0: 70 65 72 61 6e 64 20 2a 2f 0a 20 20 45 78 70 72  perand */.  Expr
24d0: 20 2a 70 52 69 67 68 74 2c 20 20 20 20 20 2f 2a   *pRight,     /*
24e0: 20 54 68 65 20 72 69 67 68 74 20 6f 70 65 72 61   The right opera
24f0: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 63 6f  nd */.  int opco
2500: 64 65 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65  de,       /* The
2510: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 63 6f   comparison opco
2520: 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 31 2c  de */.  int in1,
2530: 20 69 6e 74 20 69 6e 32 2c 20 2f 2a 20 52 65 67   int in2, /* Reg
2540: 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 6f 70  ister holding op
2550: 65 72 61 6e 64 73 20 2a 2f 0a 20 20 69 6e 74 20  erands */.  int 
2560: 64 65 73 74 2c 20 20 20 20 20 20 20 20 20 2f 2a  dest,         /*
2570: 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 74 72   Jump here if tr
2580: 75 65 2e 20 20 2a 2f 0a 20 20 69 6e 74 20 6a 75  ue.  */.  int ju
2590: 6d 70 49 66 4e 75 6c 6c 20 20 20 20 2f 2a 20 49  mpIfNull    /* I
25a0: 66 20 74 72 75 65 2c 20 6a 75 6d 70 20 69 66 20  f true, jump if 
25b0: 65 69 74 68 65 72 20 6f 70 65 72 61 6e 64 20 69  either operand i
25c0: 73 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69  s NULL */.){.  i
25d0: 6e 74 20 70 35 3b 0a 20 20 69 6e 74 20 61 64 64  nt p5;.  int add
25e0: 72 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 34  r;.  CollSeq *p4
25f0: 3b 0a 0a 20 20 70 34 20 3d 20 73 71 6c 69 74 65  ;..  p4 = sqlite
2600: 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f  3BinaryCompareCo
2610: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 4c  llSeq(pParse, pL
2620: 65 66 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20  eft, pRight);.  
2630: 70 35 20 3d 20 62 69 6e 61 72 79 43 6f 6d 70 61  p5 = binaryCompa
2640: 72 65 50 35 28 70 4c 65 66 74 2c 20 70 52 69 67  reP5(pLeft, pRig
2650: 68 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  ht, jumpIfNull);
2660: 0a 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65  .  addr = sqlite
2670: 33 56 64 62 65 41 64 64 4f 70 34 28 70 50 61 72  3VdbeAddOp4(pPar
2680: 73 65 2d 3e 70 56 64 62 65 2c 20 6f 70 63 6f 64  se->pVdbe, opcod
2690: 65 2c 20 69 6e 32 2c 20 64 65 73 74 2c 20 69 6e  e, in2, dest, in
26a0: 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  1,.             
26b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 76                (v
26c0: 6f 69 64 2a 29 70 34 2c 20 50 34 5f 43 4f 4c 4c  oid*)p4, P4_COLL
26d0: 53 45 51 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  SEQ);.  sqlite3V
26e0: 64 62 65 43 68 61 6e 67 65 50 35 28 70 50 61 72  dbeChangeP5(pPar
26f0: 73 65 2d 3e 70 56 64 62 65 2c 20 28 75 38 29 70  se->pVdbe, (u8)p
2700: 35 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 64 64  5);.  return add
2710: 72 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45  r;.}..#if SQLITE
2720: 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48 3e  _MAX_EXPR_DEPTH>
2730: 30 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 68  0./*.** Check th
2740: 61 74 20 61 72 67 75 6d 65 6e 74 20 6e 48 65 69  at argument nHei
2750: 67 68 74 20 69 73 20 6c 65 73 73 20 74 68 61 6e  ght is less than
2760: 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65   or equal to the
2770: 20 6d 61 78 69 6d 75 6d 0a 2a 2a 20 65 78 70 72   maximum.** expr
2780: 65 73 73 69 6f 6e 20 64 65 70 74 68 20 61 6c 6c  ession depth all
2790: 6f 77 65 64 2e 20 49 66 20 69 74 20 69 73 20 6e  owed. If it is n
27a0: 6f 74 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72  ot, leave an err
27b0: 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 0a 2a 2a  or message in.**
27c0: 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 69 6e 74 20   pParse..*/.int 
27d0: 73 71 6c 69 74 65 33 45 78 70 72 43 68 65 63 6b  sqlite3ExprCheck
27e0: 48 65 69 67 68 74 28 50 61 72 73 65 20 2a 70 50  Height(Parse *pP
27f0: 61 72 73 65 2c 20 69 6e 74 20 6e 48 65 69 67 68  arse, int nHeigh
2800: 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  t){.  int rc = S
2810: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
2820: 6d 78 48 65 69 67 68 74 20 3d 20 70 50 61 72 73  mxHeight = pPars
2830: 65 2d 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51  e->db->aLimit[SQ
2840: 4c 49 54 45 5f 4c 49 4d 49 54 5f 45 58 50 52 5f  LITE_LIMIT_EXPR_
2850: 44 45 50 54 48 5d 3b 0a 20 20 69 66 28 20 6e 48  DEPTH];.  if( nH
2860: 65 69 67 68 74 3e 6d 78 48 65 69 67 68 74 20 29  eight>mxHeight )
2870: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
2880: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20  orMsg(pParse, . 
2890: 20 20 20 20 20 20 22 45 78 70 72 65 73 73 69 6f        "Expressio
28a0: 6e 20 74 72 65 65 20 69 73 20 74 6f 6f 20 6c 61  n tree is too la
28b0: 72 67 65 20 28 6d 61 78 69 6d 75 6d 20 64 65 70  rge (maximum dep
28c0: 74 68 20 25 64 29 22 2c 20 6d 78 48 65 69 67 68  th %d)", mxHeigh
28d0: 74 0a 20 20 20 20 29 3b 0a 20 20 20 20 72 63 20  t.    );.    rc 
28e0: 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
28f0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
2900: 0a 7d 0a 0a 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f  .}../* The follo
2910: 77 69 6e 67 20 74 68 72 65 65 20 66 75 6e 63 74  wing three funct
2920: 69 6f 6e 73 2c 20 68 65 69 67 68 74 4f 66 45 78  ions, heightOfEx
2930: 70 72 28 29 2c 20 68 65 69 67 68 74 4f 66 45 78  pr(), heightOfEx
2940: 70 72 4c 69 73 74 28 29 0a 2a 2a 20 61 6e 64 20  prList().** and 
2950: 68 65 69 67 68 74 4f 66 53 65 6c 65 63 74 28 29  heightOfSelect()
2960: 2c 20 61 72 65 20 75 73 65 64 20 74 6f 20 64 65  , are used to de
2970: 74 65 72 6d 69 6e 65 20 74 68 65 20 6d 61 78 69  termine the maxi
2980: 6d 75 6d 20 68 65 69 67 68 74 0a 2a 2a 20 6f 66  mum height.** of
2990: 20 61 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20   any expression 
29a0: 74 72 65 65 20 72 65 66 65 72 65 6e 63 65 64 20  tree referenced 
29b0: 62 79 20 74 68 65 20 73 74 72 75 63 74 75 72 65  by the structure
29c0: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 0a 2a   passed as the.*
29d0: 2a 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  * first argument
29e0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20  ..**.** If this 
29f0: 6d 61 78 69 6d 75 6d 20 68 65 69 67 68 74 20 69  maximum height i
2a00: 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74  s greater than t
2a10: 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65  he current value
2a20: 20 70 6f 69 6e 74 65 64 0a 2a 2a 20 74 6f 20 62   pointed.** to b
2a30: 79 20 70 6e 48 65 69 67 68 74 2c 20 74 68 65 20  y pnHeight, the 
2a40: 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72  second parameter
2a50: 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 6e 48 65  , then set *pnHe
2a60: 69 67 68 74 20 74 6f 20 74 68 61 74 0a 2a 2a 20  ight to that.** 
2a70: 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  value..*/.static
2a80: 20 76 6f 69 64 20 68 65 69 67 68 74 4f 66 45 78   void heightOfEx
2a90: 70 72 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20  pr(Expr *p, int 
2aa0: 2a 70 6e 48 65 69 67 68 74 29 7b 0a 20 20 69 66  *pnHeight){.  if
2ab0: 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ( p ){.    if( p
2ac0: 2d 3e 6e 48 65 69 67 68 74 3e 2a 70 6e 48 65 69  ->nHeight>*pnHei
2ad0: 67 68 74 20 29 7b 0a 20 20 20 20 20 20 2a 70 6e  ght ){.      *pn
2ae0: 48 65 69 67 68 74 20 3d 20 70 2d 3e 6e 48 65 69  Height = p->nHei
2af0: 67 68 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  ght;.    }.  }.}
2b00: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68 65 69  .static void hei
2b10: 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28 45 78  ghtOfExprList(Ex
2b20: 70 72 4c 69 73 74 20 2a 70 2c 20 69 6e 74 20 2a  prList *p, int *
2b30: 70 6e 48 65 69 67 68 74 29 7b 0a 20 20 69 66 28  pnHeight){.  if(
2b40: 20 70 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b   p ){.    int i;
2b50: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
2b60: 70 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  p->nExpr; i++){.
2b70: 20 20 20 20 20 20 68 65 69 67 68 74 4f 66 45 78        heightOfEx
2b80: 70 72 28 70 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  pr(p->a[i].pExpr
2b90: 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20  , pnHeight);.   
2ba0: 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20   }.  }.}.static 
2bb0: 76 6f 69 64 20 68 65 69 67 68 74 4f 66 53 65 6c  void heightOfSel
2bc0: 65 63 74 28 53 65 6c 65 63 74 20 2a 70 2c 20 69  ect(Select *p, i
2bd0: 6e 74 20 2a 70 6e 48 65 69 67 68 74 29 7b 0a 20  nt *pnHeight){. 
2be0: 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 68 65   if( p ){.    he
2bf0: 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 57  ightOfExpr(p->pW
2c00: 68 65 72 65 2c 20 70 6e 48 65 69 67 68 74 29 3b  here, pnHeight);
2c10: 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70  .    heightOfExp
2c20: 72 28 70 2d 3e 70 48 61 76 69 6e 67 2c 20 70 6e  r(p->pHaving, pn
2c30: 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69  Height);.    hei
2c40: 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 4c 69  ghtOfExpr(p->pLi
2c50: 6d 69 74 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a  mit, pnHeight);.
2c60: 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72      heightOfExpr
2c70: 28 70 2d 3e 70 4f 66 66 73 65 74 2c 20 70 6e 48  (p->pOffset, pnH
2c80: 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67  eight);.    heig
2c90: 68 74 4f 66 45 78 70 72 4c 69 73 74 28 70 2d 3e  htOfExprList(p->
2ca0: 70 45 4c 69 73 74 2c 20 70 6e 48 65 69 67 68 74  pEList, pnHeight
2cb0: 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45  );.    heightOfE
2cc0: 78 70 72 4c 69 73 74 28 70 2d 3e 70 47 72 6f 75  xprList(p->pGrou
2cd0: 70 42 79 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a  pBy, pnHeight);.
2ce0: 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72      heightOfExpr
2cf0: 4c 69 73 74 28 70 2d 3e 70 4f 72 64 65 72 42 79  List(p->pOrderBy
2d00: 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20  , pnHeight);.   
2d10: 20 68 65 69 67 68 74 4f 66 53 65 6c 65 63 74 28   heightOfSelect(
2d20: 70 2d 3e 70 50 72 69 6f 72 2c 20 70 6e 48 65 69  p->pPrior, pnHei
2d30: 67 68 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ght);.  }.}../*.
2d40: 2a 2a 20 53 65 74 20 74 68 65 20 45 78 70 72 2e  ** Set the Expr.
2d50: 6e 48 65 69 67 68 74 20 76 61 72 69 61 62 6c 65  nHeight variable
2d60: 20 69 6e 20 74 68 65 20 73 74 72 75 63 74 75 72   in the structur
2d70: 65 20 70 61 73 73 65 64 20 61 73 20 61 6e 20 0a  e passed as an .
2d80: 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 20 41 6e 20  ** argument. An 
2d90: 65 78 70 72 65 73 73 69 6f 6e 20 77 69 74 68 20  expression with 
2da0: 6e 6f 20 63 68 69 6c 64 72 65 6e 2c 20 45 78 70  no children, Exp
2db0: 72 2e 70 4c 69 73 74 20 6f 72 20 0a 2a 2a 20 45  r.pList or .** E
2dc0: 78 70 72 2e 70 53 65 6c 65 63 74 20 6d 65 6d 62  xpr.pSelect memb
2dd0: 65 72 20 68 61 73 20 61 20 68 65 69 67 68 74 20  er has a height 
2de0: 6f 66 20 31 2e 20 41 6e 79 20 6f 74 68 65 72 20  of 1. Any other 
2df0: 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 68 61  expression.** ha
2e00: 73 20 61 20 68 65 69 67 68 74 20 65 71 75 61 6c  s a height equal
2e10: 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 20   to the maximum 
2e20: 68 65 69 67 68 74 20 6f 66 20 61 6e 79 20 6f 74  height of any ot
2e30: 68 65 72 20 0a 2a 2a 20 72 65 66 65 72 65 6e 63  her .** referenc
2e40: 65 64 20 45 78 70 72 20 70 6c 75 73 20 6f 6e 65  ed Expr plus one
2e50: 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 70 72 6f  ..**.** Also pro
2e60: 70 61 67 61 74 65 20 45 50 5f 50 72 6f 70 61 67  pagate EP_Propag
2e70: 61 74 65 20 66 6c 61 67 73 20 75 70 20 66 72 6f  ate flags up fro
2e80: 6d 20 45 78 70 72 2e 78 2e 70 4c 69 73 74 20 74  m Expr.x.pList t
2e90: 6f 20 45 78 70 72 2e 66 6c 61 67 73 2c 0a 2a 2a  o Expr.flags,.**
2ea0: 20 69 66 20 61 70 70 72 6f 70 72 69 61 74 65 2e   if appropriate.
2eb0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
2ec0: 65 78 70 72 53 65 74 48 65 69 67 68 74 28 45 78  exprSetHeight(Ex
2ed0: 70 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 48  pr *p){.  int nH
2ee0: 65 69 67 68 74 20 3d 20 30 3b 0a 20 20 68 65 69  eight = 0;.  hei
2ef0: 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 4c 65  ghtOfExpr(p->pLe
2f00: 66 74 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a 20  ft, &nHeight);. 
2f10: 20 68 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d   heightOfExpr(p-
2f20: 3e 70 52 69 67 68 74 2c 20 26 6e 48 65 69 67 68  >pRight, &nHeigh
2f30: 74 29 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61  t);.  if( ExprHa
2f40: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
2f50: 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20  xIsSelect) ){.  
2f60: 20 20 68 65 69 67 68 74 4f 66 53 65 6c 65 63 74    heightOfSelect
2f70: 28 70 2d 3e 78 2e 70 53 65 6c 65 63 74 2c 20 26  (p->x.pSelect, &
2f80: 6e 48 65 69 67 68 74 29 3b 0a 20 20 7d 65 6c 73  nHeight);.  }els
2f90: 65 20 69 66 28 20 70 2d 3e 78 2e 70 4c 69 73 74  e if( p->x.pList
2fa0: 20 29 7b 0a 20 20 20 20 68 65 69 67 68 74 4f 66   ){.    heightOf
2fb0: 45 78 70 72 4c 69 73 74 28 70 2d 3e 78 2e 70 4c  ExprList(p->x.pL
2fc0: 69 73 74 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a  ist, &nHeight);.
2fd0: 20 20 20 20 70 2d 3e 66 6c 61 67 73 20 7c 3d 20      p->flags |= 
2fe0: 45 50 5f 50 72 6f 70 61 67 61 74 65 20 26 20 73  EP_Propagate & s
2ff0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 46 6c  qlite3ExprListFl
3000: 61 67 73 28 70 2d 3e 78 2e 70 4c 69 73 74 29 3b  ags(p->x.pList);
3010: 0a 20 20 7d 0a 20 20 70 2d 3e 6e 48 65 69 67 68  .  }.  p->nHeigh
3020: 74 20 3d 20 6e 48 65 69 67 68 74 20 2b 20 31 3b  t = nHeight + 1;
3030: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
3040: 65 20 45 78 70 72 2e 6e 48 65 69 67 68 74 20 76  e Expr.nHeight v
3050: 61 72 69 61 62 6c 65 20 75 73 69 6e 67 20 74 68  ariable using th
3060: 65 20 65 78 70 72 53 65 74 48 65 69 67 68 74 28  e exprSetHeight(
3070: 29 20 66 75 6e 63 74 69 6f 6e 2e 20 49 66 0a 2a  ) function. If.*
3080: 2a 20 74 68 65 20 68 65 69 67 68 74 20 69 73 20  * the height is 
3090: 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65  greater than the
30a0: 20 6d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64   maximum allowed
30b0: 20 65 78 70 72 65 73 73 69 6f 6e 20 64 65 70 74   expression dept
30c0: 68 2c 0a 2a 2a 20 6c 65 61 76 65 20 61 6e 20 65  h,.** leave an e
30d0: 72 72 6f 72 20 69 6e 20 70 50 61 72 73 65 2e 0a  rror in pParse..
30e0: 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 70 72 6f 70 61  **.** Also propa
30f0: 67 61 74 65 20 61 6c 6c 20 45 50 5f 50 72 6f 70  gate all EP_Prop
3100: 61 67 61 74 65 20 66 6c 61 67 73 20 66 72 6f 6d  agate flags from
3110: 20 74 68 65 20 45 78 70 72 2e 78 2e 70 4c 69 73   the Expr.x.pLis
3120: 74 20 69 6e 74 6f 0a 2a 2a 20 45 78 70 72 2e 66  t into.** Expr.f
3130: 6c 61 67 73 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73  lags. .*/.void s
3140: 71 6c 69 74 65 33 45 78 70 72 53 65 74 48 65 69  qlite3ExprSetHei
3150: 67 68 74 41 6e 64 46 6c 61 67 73 28 50 61 72 73  ghtAndFlags(Pars
3160: 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
3170: 2a 70 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73  *p){.  if( pPars
3180: 65 2d 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e  e->nErr ) return
3190: 3b 0a 20 20 65 78 70 72 53 65 74 48 65 69 67 68  ;.  exprSetHeigh
31a0: 74 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  t(p);.  sqlite3E
31b0: 78 70 72 43 68 65 63 6b 48 65 69 67 68 74 28 70  xprCheckHeight(p
31c0: 50 61 72 73 65 2c 20 70 2d 3e 6e 48 65 69 67 68  Parse, p->nHeigh
31d0: 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  t);.}../*.** Ret
31e0: 75 72 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  urn the maximum 
31f0: 68 65 69 67 68 74 20 6f 66 20 61 6e 79 20 65 78  height of any ex
3200: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20 72 65  pression tree re
3210: 66 65 72 65 6e 63 65 64 0a 2a 2a 20 62 79 20 74  ferenced.** by t
3220: 68 65 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d  he select statem
3230: 65 6e 74 20 70 61 73 73 65 64 20 61 73 20 61 6e  ent passed as an
3240: 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e   argument..*/.in
3250: 74 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45  t sqlite3SelectE
3260: 78 70 72 48 65 69 67 68 74 28 53 65 6c 65 63 74  xprHeight(Select
3270: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 48 65 69   *p){.  int nHei
3280: 67 68 74 20 3d 20 30 3b 0a 20 20 68 65 69 67 68  ght = 0;.  heigh
3290: 74 4f 66 53 65 6c 65 63 74 28 70 2c 20 26 6e 48  tOfSelect(p, &nH
32a0: 65 69 67 68 74 29 3b 0a 20 20 72 65 74 75 72 6e  eight);.  return
32b0: 20 6e 48 65 69 67 68 74 3b 0a 7d 0a 23 65 6c 73   nHeight;.}.#els
32c0: 65 20 2f 2a 20 41 42 4f 56 45 3a 20 20 48 65 69  e /* ABOVE:  Hei
32d0: 67 68 74 20 65 6e 66 6f 72 63 65 6d 65 6e 74 20  ght enforcement 
32e0: 65 6e 61 62 6c 65 64 2e 20 20 42 45 4c 4f 57 3a  enabled.  BELOW:
32f0: 20 48 65 69 67 68 74 20 65 6e 66 6f 72 63 65 6d   Height enforcem
3300: 65 6e 74 20 6f 66 66 20 2a 2f 0a 2f 2a 0a 2a 2a  ent off */./*.**
3310: 20 50 72 6f 70 61 67 61 74 65 20 61 6c 6c 20 45   Propagate all E
3320: 50 5f 50 72 6f 70 61 67 61 74 65 20 66 6c 61 67  P_Propagate flag
3330: 73 20 66 72 6f 6d 20 74 68 65 20 45 78 70 72 2e  s from the Expr.
3340: 78 2e 70 4c 69 73 74 20 69 6e 74 6f 0a 2a 2a 20  x.pList into.** 
3350: 45 78 70 72 2e 66 6c 61 67 73 2e 20 0a 2a 2f 0a  Expr.flags. .*/.
3360: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
3370: 53 65 74 48 65 69 67 68 74 41 6e 64 46 6c 61 67  SetHeightAndFlag
3380: 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  s(Parse *pParse,
3390: 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28   Expr *p){.  if(
33a0: 20 70 20 26 26 20 70 2d 3e 78 2e 70 4c 69 73 74   p && p->x.pList
33b0: 20 26 26 20 21 45 78 70 72 48 61 73 50 72 6f 70   && !ExprHasProp
33c0: 65 72 74 79 28 70 2c 20 45 50 5f 78 49 73 53 65  erty(p, EP_xIsSe
33d0: 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 70 2d 3e  lect) ){.    p->
33e0: 66 6c 61 67 73 20 7c 3d 20 45 50 5f 50 72 6f 70  flags |= EP_Prop
33f0: 61 67 61 74 65 20 26 20 73 71 6c 69 74 65 33 45  agate & sqlite3E
3400: 78 70 72 4c 69 73 74 46 6c 61 67 73 28 70 2d 3e  xprListFlags(p->
3410: 78 2e 70 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a  x.pList);.  }.}.
3420: 23 64 65 66 69 6e 65 20 65 78 70 72 53 65 74 48  #define exprSetH
3430: 65 69 67 68 74 28 79 29 0a 23 65 6e 64 69 66 20  eight(y).#endif 
3440: 2f 2a 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58  /* SQLITE_MAX_EX
3450: 50 52 5f 44 45 50 54 48 3e 30 20 2a 2f 0a 0a 2f  PR_DEPTH>0 */../
3460: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
3470: 65 20 69 73 20 74 68 65 20 63 6f 72 65 20 61 6c  e is the core al
3480: 6c 6f 63 61 74 6f 72 20 66 6f 72 20 45 78 70 72  locator for Expr
3490: 20 6e 6f 64 65 73 2e 0a 2a 2a 0a 2a 2a 20 43 6f   nodes..**.** Co
34a0: 6e 73 74 72 75 63 74 20 61 20 6e 65 77 20 65 78  nstruct a new ex
34b0: 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 61 6e  pression node an
34c0: 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  d return a point
34d0: 65 72 20 74 6f 20 69 74 2e 20 20 4d 65 6d 6f 72  er to it.  Memor
34e0: 79 0a 2a 2a 20 66 6f 72 20 74 68 69 73 20 6e 6f  y.** for this no
34f0: 64 65 20 61 6e 64 20 66 6f 72 20 74 68 65 20 70  de and for the p
3500: 54 6f 6b 65 6e 20 61 72 67 75 6d 65 6e 74 20 69  Token argument i
3510: 73 20 61 20 73 69 6e 67 6c 65 20 61 6c 6c 6f 63  s a single alloc
3520: 61 74 69 6f 6e 0a 2a 2a 20 6f 62 74 61 69 6e 65  ation.** obtaine
3530: 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 44 62  d from sqlite3Db
3540: 4d 61 6c 6c 6f 63 28 29 2e 20 20 54 68 65 20 63  Malloc().  The c
3550: 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a  alling function.
3560: 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  ** is responsibl
3570: 65 20 66 6f 72 20 6d 61 6b 69 6e 67 20 73 75 72  e for making sur
3580: 65 20 74 68 65 20 6e 6f 64 65 20 65 76 65 6e 74  e the node event
3590: 75 61 6c 6c 79 20 67 65 74 73 20 66 72 65 65 64  ually gets freed
35a0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 65 71 75 6f  ..**.** If dequo
35b0: 74 65 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e  te is true, then
35c0: 20 74 68 65 20 74 6f 6b 65 6e 20 28 69 66 20 69   the token (if i
35d0: 74 20 65 78 69 73 74 73 29 20 69 73 20 64 65 71  t exists) is deq
35e0: 75 6f 74 65 64 2e 0a 2a 2a 20 49 66 20 64 65 71  uoted..** If deq
35f0: 75 6f 74 65 20 69 73 20 66 61 6c 73 65 2c 20 6e  uote is false, n
3600: 6f 20 64 65 71 75 6f 74 69 6e 67 20 69 73 20 70  o dequoting is p
3610: 65 72 66 6f 72 6d 65 64 2e 20 20 54 68 65 20 64  erformed.  The d
3620: 65 51 75 6f 74 65 0a 2a 2a 20 70 61 72 61 6d 65  eQuote.** parame
3630: 74 65 72 20 69 73 20 69 67 6e 6f 72 65 64 20 69  ter is ignored i
3640: 66 20 70 54 6f 6b 65 6e 20 69 73 20 4e 55 4c 4c  f pToken is NULL
3650: 20 6f 72 20 69 66 20 74 68 65 20 74 6f 6b 65 6e   or if the token
3660: 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 61 70 70   does not.** app
3670: 65 61 72 20 74 6f 20 62 65 20 71 75 6f 74 65 64  ear to be quoted
3680: 2e 20 20 49 66 20 74 68 65 20 71 75 6f 74 65 73  .  If the quotes
3690: 20 77 65 72 65 20 6f 66 20 74 68 65 20 66 6f 72   were of the for
36a0: 6d 20 22 2e 2e 2e 22 20 28 64 6f 75 62 6c 65 2d  m "..." (double-
36b0: 71 75 6f 74 65 73 29 0a 2a 2a 20 74 68 65 6e 20  quotes).** then 
36c0: 74 68 65 20 45 50 5f 44 62 6c 51 75 6f 74 65 64  the EP_DblQuoted
36d0: 20 66 6c 61 67 20 69 73 20 73 65 74 20 6f 6e 20   flag is set on 
36e0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6e  the expression n
36f0: 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 53 70 65 63 69  ode..**.** Speci
3700: 61 6c 20 63 61 73 65 3a 20 20 49 66 20 6f 70 3d  al case:  If op=
3710: 3d 54 4b 5f 49 4e 54 45 47 45 52 20 61 6e 64 20  =TK_INTEGER and 
3720: 70 54 6f 6b 65 6e 20 70 6f 69 6e 74 73 20 74 6f  pToken points to
3730: 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 0a 2a   a string that.*
3740: 2a 20 63 61 6e 20 62 65 20 74 72 61 6e 73 6c 61  * can be transla
3750: 74 65 64 20 69 6e 74 6f 20 61 20 33 32 2d 62 69  ted into a 32-bi
3760: 74 20 69 6e 74 65 67 65 72 2c 20 74 68 65 6e 20  t integer, then 
3770: 74 68 65 20 74 6f 6b 65 6e 20 69 73 20 6e 6f 74  the token is not
3780: 0a 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 75 2e  .** stored in u.
3790: 7a 54 6f 6b 65 6e 2e 20 20 49 6e 73 74 65 61 64  zToken.  Instead
37a0: 2c 20 74 68 65 20 69 6e 74 65 67 65 72 20 76 61  , the integer va
37b0: 6c 75 65 73 20 69 73 20 77 72 69 74 74 65 6e 0a  lues is written.
37c0: 2a 2a 20 69 6e 74 6f 20 75 2e 69 56 61 6c 75 65  ** into u.iValue
37d0: 20 61 6e 64 20 74 68 65 20 45 50 5f 49 6e 74 56   and the EP_IntV
37e0: 61 6c 75 65 20 66 6c 61 67 20 69 73 20 73 65 74  alue flag is set
37f0: 2e 20 20 4e 6f 20 65 78 74 72 61 20 73 74 6f 72  .  No extra stor
3800: 61 67 65 0a 2a 2a 20 69 73 20 61 6c 6c 6f 63 61  age.** is alloca
3810: 74 65 64 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ted to hold the 
3820: 69 6e 74 65 67 65 72 20 74 65 78 74 20 61 6e 64  integer text and
3830: 20 74 68 65 20 64 65 71 75 6f 74 65 20 66 6c 61   the dequote fla
3840: 67 20 69 73 20 69 67 6e 6f 72 65 64 2e 0a 2a 2f  g is ignored..*/
3850: 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78  .Expr *sqlite3Ex
3860: 70 72 41 6c 6c 6f 63 28 0a 20 20 73 71 6c 69 74  prAlloc(.  sqlit
3870: 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
3880: 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 66 6f 72     /* Handle for
3890: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
38a0: 5a 65 72 6f 28 29 20 28 6d 61 79 20 62 65 20 6e  Zero() (may be n
38b0: 75 6c 6c 29 20 2a 2f 0a 20 20 69 6e 74 20 6f 70  ull) */.  int op
38c0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
38d0: 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20    /* Expression 
38e0: 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 63 6f 6e 73  opcode */.  cons
38f0: 74 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 2c  t Token *pToken,
3900: 20 20 20 20 2f 2a 20 54 6f 6b 65 6e 20 61 72 67      /* Token arg
3910: 75 6d 65 6e 74 2e 20 20 4d 69 67 68 74 20 62 65  ument.  Might be
3920: 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 64   NULL */.  int d
3930: 65 71 75 6f 74 65 20 20 20 20 20 20 20 20 20 20  equote          
3940: 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 64 65     /* True to de
3950: 71 75 6f 74 65 20 2a 2f 0a 29 7b 0a 20 20 45 78  quote */.){.  Ex
3960: 70 72 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20  pr *pNew;.  int 
3970: 6e 45 78 74 72 61 20 3d 20 30 3b 0a 20 20 69 6e  nExtra = 0;.  in
3980: 74 20 69 56 61 6c 75 65 20 3d 20 30 3b 0a 0a 20  t iValue = 0;.. 
3990: 20 69 66 28 20 70 54 6f 6b 65 6e 20 29 7b 0a 20   if( pToken ){. 
39a0: 20 20 20 69 66 28 20 6f 70 21 3d 54 4b 5f 49 4e     if( op!=TK_IN
39b0: 54 45 47 45 52 20 7c 7c 20 70 54 6f 6b 65 6e 2d  TEGER || pToken-
39c0: 3e 7a 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20  >z==0.          
39d0: 7c 7c 20 73 71 6c 69 74 65 33 47 65 74 49 6e 74  || sqlite3GetInt
39e0: 33 32 28 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 26 69  32(pToken->z, &i
39f0: 56 61 6c 75 65 29 3d 3d 30 20 29 7b 0a 20 20 20  Value)==0 ){.   
3a00: 20 20 20 6e 45 78 74 72 61 20 3d 20 70 54 6f 6b     nExtra = pTok
3a10: 65 6e 2d 3e 6e 2b 31 3b 0a 20 20 20 20 20 20 61  en->n+1;.      a
3a20: 73 73 65 72 74 28 20 69 56 61 6c 75 65 3e 3d 30  ssert( iValue>=0
3a30: 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   );.    }.  }.  
3a40: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62  pNew = sqlite3Db
3a50: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  MallocZero(db, s
3a60: 69 7a 65 6f 66 28 45 78 70 72 29 2b 6e 45 78 74  izeof(Expr)+nExt
3a70: 72 61 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 20  ra);.  if( pNew 
3a80: 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 6f 70 20  ){.    pNew->op 
3a90: 3d 20 28 75 38 29 6f 70 3b 0a 20 20 20 20 70 4e  = (u8)op;.    pN
3aa0: 65 77 2d 3e 69 41 67 67 20 3d 20 2d 31 3b 0a 20  ew->iAgg = -1;. 
3ab0: 20 20 20 69 66 28 20 70 54 6f 6b 65 6e 20 29 7b     if( pToken ){
3ac0: 0a 20 20 20 20 20 20 69 66 28 20 6e 45 78 74 72  .      if( nExtr
3ad0: 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  a==0 ){.        
3ae0: 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45  pNew->flags |= E
3af0: 50 5f 49 6e 74 56 61 6c 75 65 3b 0a 20 20 20 20  P_IntValue;.    
3b00: 20 20 20 20 70 4e 65 77 2d 3e 75 2e 69 56 61 6c      pNew->u.iVal
3b10: 75 65 20 3d 20 69 56 61 6c 75 65 3b 0a 20 20 20  ue = iValue;.   
3b20: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
3b30: 20 20 69 6e 74 20 63 3b 0a 20 20 20 20 20 20 20    int c;.       
3b40: 20 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 20   pNew->u.zToken 
3b50: 3d 20 28 63 68 61 72 2a 29 26 70 4e 65 77 5b 31  = (char*)&pNew[1
3b60: 5d 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ];.        asser
3b70: 74 28 20 70 54 6f 6b 65 6e 2d 3e 7a 21 3d 30 20  t( pToken->z!=0 
3b80: 7c 7c 20 70 54 6f 6b 65 6e 2d 3e 6e 3d 3d 30 20  || pToken->n==0 
3b90: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
3ba0: 54 6f 6b 65 6e 2d 3e 6e 20 29 20 6d 65 6d 63 70  Token->n ) memcp
3bb0: 79 28 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e  y(pNew->u.zToken
3bc0: 2c 20 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 70 54 6f  , pToken->z, pTo
3bd0: 6b 65 6e 2d 3e 6e 29 3b 0a 20 20 20 20 20 20 20  ken->n);.       
3be0: 20 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b   pNew->u.zToken[
3bf0: 70 54 6f 6b 65 6e 2d 3e 6e 5d 20 3d 20 30 3b 0a  pToken->n] = 0;.
3c00: 20 20 20 20 20 20 20 20 69 66 28 20 64 65 71 75          if( dequ
3c10: 6f 74 65 20 26 26 20 6e 45 78 74 72 61 3e 3d 33  ote && nExtra>=3
3c20: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26   .             &
3c30: 26 20 28 28 63 20 3d 20 70 54 6f 6b 65 6e 2d 3e  & ((c = pToken->
3c40: 7a 5b 30 5d 29 3d 3d 27 5c 27 27 20 7c 7c 20 63  z[0])=='\'' || c
3c50: 3d 3d 27 22 27 20 7c 7c 20 63 3d 3d 27 5b 27 20  =='"' || c=='[' 
3c60: 7c 7c 20 63 3d 3d 27 60 27 29 20 29 7b 0a 20 20  || c=='`') ){.  
3c70: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
3c80: 65 71 75 6f 74 65 28 70 4e 65 77 2d 3e 75 2e 7a  equote(pNew->u.z
3c90: 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 20 20  Token);.        
3ca0: 20 20 69 66 28 20 63 3d 3d 27 22 27 20 29 20 70    if( c=='"' ) p
3cb0: 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50  New->flags |= EP
3cc0: 5f 44 62 6c 51 75 6f 74 65 64 3b 0a 20 20 20 20  _DblQuoted;.    
3cd0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
3ce0: 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d    }.#if SQLITE_M
3cf0: 41 58 5f 45 58 50 52 5f 44 45 50 54 48 3e 30 0a  AX_EXPR_DEPTH>0.
3d00: 20 20 20 20 70 4e 65 77 2d 3e 6e 48 65 69 67 68      pNew->nHeigh
3d10: 74 20 3d 20 31 3b 0a 23 65 6e 64 69 66 20 20 0a  t = 1;.#endif  .
3d20: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65    }.  return pNe
3d30: 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  w;.}../*.** Allo
3d40: 63 61 74 65 20 61 20 6e 65 77 20 65 78 70 72 65  cate a new expre
3d50: 73 73 69 6f 6e 20 6e 6f 64 65 20 66 72 6f 6d 20  ssion node from 
3d60: 61 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74 65  a zero-terminate
3d70: 64 20 74 6f 6b 65 6e 20 74 68 61 74 20 68 61 73  d token that has
3d80: 0a 2a 2a 20 61 6c 72 65 61 64 79 20 62 65 65 6e  .** already been
3d90: 20 64 65 71 75 6f 74 65 64 2e 0a 2a 2f 0a 45 78   dequoted..*/.Ex
3da0: 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 28  pr *sqlite3Expr(
3db0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
3dc0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61             /* Ha
3dd0: 6e 64 6c 65 20 66 6f 72 20 73 71 6c 69 74 65 33  ndle for sqlite3
3de0: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 29 20 28  DbMallocZero() (
3df0: 6d 61 79 20 62 65 20 6e 75 6c 6c 29 20 2a 2f 0a  may be null) */.
3e00: 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20    int op,       
3e10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70            /* Exp
3e20: 72 65 73 73 69 6f 6e 20 6f 70 63 6f 64 65 20 2a  ression opcode *
3e30: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
3e40: 7a 54 6f 6b 65 6e 20 20 20 20 20 20 2f 2a 20 54  zToken      /* T
3e50: 6f 6b 65 6e 20 61 72 67 75 6d 65 6e 74 2e 20 20  oken argument.  
3e60: 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f  Might be NULL */
3e70: 0a 29 7b 0a 20 20 54 6f 6b 65 6e 20 78 3b 0a 20  .){.  Token x;. 
3e80: 20 78 2e 7a 20 3d 20 7a 54 6f 6b 65 6e 3b 0a 20   x.z = zToken;. 
3e90: 20 78 2e 6e 20 3d 20 7a 54 6f 6b 65 6e 20 3f 20   x.n = zToken ? 
3ea0: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
3eb0: 7a 54 6f 6b 65 6e 29 20 3a 20 30 3b 0a 20 20 72  zToken) : 0;.  r
3ec0: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70  eturn sqlite3Exp
3ed0: 72 41 6c 6c 6f 63 28 64 62 2c 20 6f 70 2c 20 26  rAlloc(db, op, &
3ee0: 78 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  x, 0);.}../*.** 
3ef0: 41 74 74 61 63 68 20 73 75 62 74 72 65 65 73 20  Attach subtrees 
3f00: 70 4c 65 66 74 20 61 6e 64 20 70 52 69 67 68 74  pLeft and pRight
3f10: 20 74 6f 20 74 68 65 20 45 78 70 72 20 6e 6f 64   to the Expr nod
3f20: 65 20 70 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49  e pRoot..**.** I
3f30: 66 20 70 52 6f 6f 74 3d 3d 4e 55 4c 4c 20 74 68  f pRoot==NULL th
3f40: 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20 61 20  at means that a 
3f50: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
3f60: 6e 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75  n error has occu
3f70: 72 72 65 64 2e 0a 2a 2a 20 49 6e 20 74 68 61 74  rred..** In that
3f80: 20 63 61 73 65 2c 20 64 65 6c 65 74 65 20 74 68   case, delete th
3f90: 65 20 73 75 62 74 72 65 65 73 20 70 4c 65 66 74  e subtrees pLeft
3fa0: 20 61 6e 64 20 70 52 69 67 68 74 2e 0a 2a 2f 0a   and pRight..*/.
3fb0: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
3fc0: 41 74 74 61 63 68 53 75 62 74 72 65 65 73 28 0a  AttachSubtrees(.
3fd0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20    sqlite3 *db,. 
3fe0: 20 45 78 70 72 20 2a 70 52 6f 6f 74 2c 0a 20 20   Expr *pRoot,.  
3ff0: 45 78 70 72 20 2a 70 4c 65 66 74 2c 0a 20 20 45  Expr *pLeft,.  E
4000: 78 70 72 20 2a 70 52 69 67 68 74 0a 29 7b 0a 20  xpr *pRight.){. 
4010: 20 69 66 28 20 70 52 6f 6f 74 3d 3d 30 20 29 7b   if( pRoot==0 ){
4020: 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d  .    assert( db-
4030: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
4040: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
4050: 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 65 66 74  Delete(db, pLeft
4060: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
4070: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 52 69  prDelete(db, pRi
4080: 67 68 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ght);.  }else{. 
4090: 20 20 20 69 66 28 20 70 52 69 67 68 74 20 29 7b     if( pRight ){
40a0: 0a 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e 70 52  .      pRoot->pR
40b0: 69 67 68 74 20 3d 20 70 52 69 67 68 74 3b 0a 20  ight = pRight;. 
40c0: 20 20 20 20 20 70 52 6f 6f 74 2d 3e 66 6c 61 67       pRoot->flag
40d0: 73 20 7c 3d 20 45 50 5f 50 72 6f 70 61 67 61 74  s |= EP_Propagat
40e0: 65 20 26 20 70 52 69 67 68 74 2d 3e 66 6c 61 67  e & pRight->flag
40f0: 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  s;.    }.    if(
4100: 20 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 20 20   pLeft ){.      
4110: 70 52 6f 6f 74 2d 3e 70 4c 65 66 74 20 3d 20 70  pRoot->pLeft = p
4120: 4c 65 66 74 3b 0a 20 20 20 20 20 20 70 52 6f 6f  Left;.      pRoo
4130: 74 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 50  t->flags |= EP_P
4140: 72 6f 70 61 67 61 74 65 20 26 20 70 4c 65 66 74  ropagate & pLeft
4150: 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 7d 0a 20  ->flags;.    }. 
4160: 20 20 20 65 78 70 72 53 65 74 48 65 69 67 68 74     exprSetHeight
4170: 28 70 52 6f 6f 74 29 3b 0a 20 20 7d 0a 7d 0a 0a  (pRoot);.  }.}..
4180: 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61  /*.** Allocate a
4190: 6e 20 45 78 70 72 20 6e 6f 64 65 20 77 68 69 63  n Expr node whic
41a0: 68 20 6a 6f 69 6e 73 20 61 73 20 6d 61 6e 79 20  h joins as many 
41b0: 61 73 20 74 77 6f 20 73 75 62 74 72 65 65 73 2e  as two subtrees.
41c0: 0a 2a 2a 0a 2a 2a 20 4f 6e 65 20 6f 72 20 62 6f  .**.** One or bo
41d0: 74 68 20 6f 66 20 74 68 65 20 73 75 62 74 72 65  th of the subtre
41e0: 65 73 20 63 61 6e 20 62 65 20 4e 55 4c 4c 2e 20  es can be NULL. 
41f0: 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
4200: 72 20 74 6f 20 74 68 65 20 6e 65 77 0a 2a 2a 20  r to the new.** 
4210: 45 78 70 72 20 6e 6f 64 65 2e 20 20 4f 72 2c 20  Expr node.  Or, 
4220: 69 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20  if an OOM error 
4230: 6f 63 63 75 72 73 2c 20 73 65 74 20 70 50 61 72  occurs, set pPar
4240: 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
4250: 69 6c 65 64 2c 0a 2a 2a 20 66 72 65 65 20 74 68  iled,.** free th
4260: 65 20 73 75 62 74 72 65 65 73 20 61 6e 64 20 72  e subtrees and r
4270: 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 45  eturn NULL..*/.E
4280: 78 70 72 20 2a 73 71 6c 69 74 65 33 50 45 78 70  xpr *sqlite3PExp
4290: 72 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  r(.  Parse *pPar
42a0: 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  se,          /* 
42b0: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
42c0: 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20  */.  int op,    
42d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
42e0: 45 78 70 72 65 73 73 69 6f 6e 20 6f 70 63 6f 64  Expression opcod
42f0: 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c 65  e */.  Expr *pLe
4300: 66 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  ft,            /
4310: 2a 20 4c 65 66 74 20 6f 70 65 72 61 6e 64 20 2a  * Left operand *
4320: 2f 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68 74  /.  Expr *pRight
4330: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  ,           /* R
4340: 69 67 68 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a  ight operand */.
4350: 20 20 63 6f 6e 73 74 20 54 6f 6b 65 6e 20 2a 70    const Token *p
4360: 54 6f 6b 65 6e 20 20 20 20 20 2f 2a 20 41 72 67  Token     /* Arg
4370: 75 6d 65 6e 74 20 74 6f 6b 65 6e 20 2a 2f 0a 29  ument token */.)
4380: 7b 0a 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 69  {.  Expr *p;.  i
4390: 66 28 20 6f 70 3d 3d 54 4b 5f 41 4e 44 20 26 26  f( op==TK_AND &&
43a0: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30   pParse->nErr==0
43b0: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 61 6b 65 20   ){.    /* Take 
43c0: 61 64 76 61 6e 74 61 67 65 20 6f 66 20 73 68 6f  advantage of sho
43d0: 72 74 2d 63 69 72 63 75 69 74 20 66 61 6c 73 65  rt-circuit false
43e0: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 66 6f   optimization fo
43f0: 72 20 41 4e 44 20 2a 2f 0a 20 20 20 20 70 20 3d  r AND */.    p =
4400: 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28   sqlite3ExprAnd(
4410: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c 65 66  pParse->db, pLef
4420: 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 7d 65  t, pRight);.  }e
4430: 6c 73 65 7b 0a 20 20 20 20 70 20 3d 20 73 71 6c  lse{.    p = sql
4440: 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 70 50  ite3ExprAlloc(pP
4450: 61 72 73 65 2d 3e 64 62 2c 20 6f 70 20 26 20 54  arse->db, op & T
4460: 4b 46 4c 47 5f 4d 41 53 4b 2c 20 70 54 6f 6b 65  KFLG_MASK, pToke
4470: 6e 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  n, 1);.    sqlit
4480: 65 33 45 78 70 72 41 74 74 61 63 68 53 75 62 74  e3ExprAttachSubt
4490: 72 65 65 73 28 70 50 61 72 73 65 2d 3e 64 62 2c  rees(pParse->db,
44a0: 20 70 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68   p, pLeft, pRigh
44b0: 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 20  t);.  }.  if( p 
44c0: 29 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  ) {.    sqlite3E
44d0: 78 70 72 43 68 65 63 6b 48 65 69 67 68 74 28 70  xprCheckHeight(p
44e0: 50 61 72 73 65 2c 20 70 2d 3e 6e 48 65 69 67 68  Parse, p->nHeigh
44f0: 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  t);.  }.  return
4500: 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20   p;.}../*.** If 
4510: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
4520: 73 20 61 6c 77 61 79 73 20 65 69 74 68 65 72 20  s always either 
4530: 54 52 55 45 20 6f 72 20 46 41 4c 53 45 20 28 72  TRUE or FALSE (r
4540: 65 73 70 65 63 74 69 76 65 6c 79 29 2c 0a 2a 2a  espectively),.**
4550: 20 74 68 65 6e 20 72 65 74 75 72 6e 20 31 2e 20   then return 1. 
4560: 20 49 66 20 6f 6e 65 20 63 61 6e 6e 6f 74 20 64   If one cannot d
4570: 65 74 65 72 6d 69 6e 65 20 74 68 65 20 74 72 75  etermine the tru
4580: 74 68 20 76 61 6c 75 65 20 6f 66 20 74 68 65 0a  th value of the.
4590: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 61 74  ** expression at
45a0: 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 72 65   compile-time re
45b0: 74 75 72 6e 20 30 2e 0a 2a 2a 0a 2a 2a 20 54 68  turn 0..**.** Th
45c0: 69 73 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a  is is an optimiz
45d0: 61 74 69 6f 6e 2e 20 20 49 66 20 69 73 20 4f 4b  ation.  If is OK
45e0: 20 74 6f 20 72 65 74 75 72 6e 20 30 20 68 65 72   to return 0 her
45f0: 65 20 65 76 65 6e 20 69 66 0a 2a 2a 20 74 68 65  e even if.** the
4600: 20 65 78 70 72 65 73 73 69 6f 6e 20 72 65 61 6c   expression real
4610: 6c 79 20 69 73 20 61 6c 77 61 79 73 20 66 61 6c  ly is always fal
4620: 73 65 20 6f 72 20 66 61 6c 73 65 20 28 61 20 66  se or false (a f
4630: 61 6c 73 65 20 6e 65 67 61 74 69 76 65 29 2e 0a  alse negative)..
4640: 2a 2a 20 42 75 74 20 69 74 20 69 73 20 61 20 62  ** But it is a b
4650: 75 67 20 74 6f 20 72 65 74 75 72 6e 20 31 20 69  ug to return 1 i
4660: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
4670: 20 6d 69 67 68 74 20 68 61 76 65 20 64 69 66 66   might have diff
4680: 65 72 65 6e 74 0a 2a 2a 20 62 6f 6f 6c 65 61 6e  erent.** boolean
4690: 20 76 61 6c 75 65 73 20 69 6e 20 64 69 66 66 65   values in diffe
46a0: 72 65 6e 74 20 63 69 72 63 75 6d 73 74 61 6e 63  rent circumstanc
46b0: 65 73 20 28 61 20 66 61 6c 73 65 20 70 6f 73 69  es (a false posi
46c0: 74 69 76 65 2e 29 0a 2a 2a 0a 2a 2a 20 4e 6f 74  tive.).**.** Not
46d0: 65 20 74 68 61 74 20 69 66 20 74 68 65 20 65 78  e that if the ex
46e0: 70 72 65 73 73 69 6f 6e 20 69 73 20 70 61 72 74  pression is part
46f0: 20 6f 66 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20   of conditional 
4700: 66 6f 72 20 61 0a 2a 2a 20 4c 45 46 54 20 4a 4f  for a.** LEFT JO
4710: 49 4e 2c 20 74 68 65 6e 20 77 65 20 63 61 6e 6e  IN, then we cann
4720: 6f 74 20 64 65 74 65 72 6d 69 6e 65 20 61 74 20  ot determine at 
4730: 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 77 68 65  compile-time whe
4740: 74 68 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20 69  ther or not.** i
4750: 73 20 69 74 20 74 72 75 65 20 6f 72 20 66 61 6c  s it true or fal
4760: 73 65 2c 20 73 6f 20 61 6c 77 61 79 73 20 72 65  se, so always re
4770: 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74 69  turn 0..*/.stati
4780: 63 20 69 6e 74 20 65 78 70 72 41 6c 77 61 79 73  c int exprAlways
4790: 54 72 75 65 28 45 78 70 72 20 2a 70 29 7b 0a 20  True(Expr *p){. 
47a0: 20 69 6e 74 20 76 20 3d 20 30 3b 0a 20 20 69 66   int v = 0;.  if
47b0: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
47c0: 79 28 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  y(p, EP_FromJoin
47d0: 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
47e0: 69 66 28 20 21 73 71 6c 69 74 65 33 45 78 70 72  if( !sqlite3Expr
47f0: 49 73 49 6e 74 65 67 65 72 28 70 2c 20 26 76 29  IsInteger(p, &v)
4800: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72   ) return 0;.  r
4810: 65 74 75 72 6e 20 76 21 3d 30 3b 0a 7d 0a 73 74  eturn v!=0;.}.st
4820: 61 74 69 63 20 69 6e 74 20 65 78 70 72 41 6c 77  atic int exprAlw
4830: 61 79 73 46 61 6c 73 65 28 45 78 70 72 20 2a 70  aysFalse(Expr *p
4840: 29 7b 0a 20 20 69 6e 74 20 76 20 3d 20 30 3b 0a  ){.  int v = 0;.
4850: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
4860: 70 65 72 74 79 28 70 2c 20 45 50 5f 46 72 6f 6d  perty(p, EP_From
4870: 4a 6f 69 6e 29 20 29 20 72 65 74 75 72 6e 20 30  Join) ) return 0
4880: 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  ;.  if( !sqlite3
4890: 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 2c  ExprIsInteger(p,
48a0: 20 26 76 29 20 29 20 72 65 74 75 72 6e 20 30 3b   &v) ) return 0;
48b0: 0a 20 20 72 65 74 75 72 6e 20 76 3d 3d 30 3b 0a  .  return v==0;.
48c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 69 6e 20 74 77  }../*.** Join tw
48d0: 6f 20 65 78 70 72 65 73 73 69 6f 6e 73 20 75 73  o expressions us
48e0: 69 6e 67 20 61 6e 20 41 4e 44 20 6f 70 65 72 61  ing an AND opera
48f0: 74 6f 72 2e 20 20 49 66 20 65 69 74 68 65 72 20  tor.  If either 
4900: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 0a 2a 2a  expression is.**
4910: 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 6a 75 73 74   NULL, then just
4920: 20 72 65 74 75 72 6e 20 74 68 65 20 6f 74 68 65   return the othe
4930: 72 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a  r expression..**
4940: 0a 2a 2a 20 49 66 20 6f 6e 65 20 73 69 64 65 20  .** If one side 
4950: 6f 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20  or the other of 
4960: 74 68 65 20 41 4e 44 20 69 73 20 6b 6e 6f 77 6e  the AND is known
4970: 20 74 6f 20 62 65 20 66 61 6c 73 65 2c 20 74 68   to be false, th
4980: 65 6e 20 69 6e 73 74 65 61 64 0a 2a 2a 20 6f 66  en instead.** of
4990: 20 72 65 74 75 72 6e 69 6e 67 20 61 6e 20 41 4e   returning an AN
49a0: 44 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 6a 75  D expression, ju
49b0: 73 74 20 72 65 74 75 72 6e 20 61 20 63 6f 6e 73  st return a cons
49c0: 74 61 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 20  tant expression 
49d0: 77 69 74 68 0a 2a 2a 20 61 20 76 61 6c 75 65 20  with.** a value 
49e0: 6f 66 20 66 61 6c 73 65 2e 0a 2a 2f 0a 45 78 70  of false..*/.Exp
49f0: 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 41 6e  r *sqlite3ExprAn
4a00: 64 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45  d(sqlite3 *db, E
4a10: 78 70 72 20 2a 70 4c 65 66 74 2c 20 45 78 70 72  xpr *pLeft, Expr
4a20: 20 2a 70 52 69 67 68 74 29 7b 0a 20 20 69 66 28   *pRight){.  if(
4a30: 20 70 4c 65 66 74 3d 3d 30 20 29 7b 0a 20 20 20   pLeft==0 ){.   
4a40: 20 72 65 74 75 72 6e 20 70 52 69 67 68 74 3b 0a   return pRight;.
4a50: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 52 69 67    }else if( pRig
4a60: 68 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ht==0 ){.    ret
4a70: 75 72 6e 20 70 4c 65 66 74 3b 0a 20 20 7d 65 6c  urn pLeft;.  }el
4a80: 73 65 20 69 66 28 20 65 78 70 72 41 6c 77 61 79  se if( exprAlway
4a90: 73 46 61 6c 73 65 28 70 4c 65 66 74 29 20 7c 7c  sFalse(pLeft) ||
4aa0: 20 65 78 70 72 41 6c 77 61 79 73 46 61 6c 73 65   exprAlwaysFalse
4ab0: 28 70 52 69 67 68 74 29 20 29 7b 0a 20 20 20 20  (pRight) ){.    
4ac0: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
4ad0: 65 28 64 62 2c 20 70 4c 65 66 74 29 3b 0a 20 20  e(db, pLeft);.  
4ae0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
4af0: 65 74 65 28 64 62 2c 20 70 52 69 67 68 74 29 3b  ete(db, pRight);
4b00: 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69  .    return sqli
4b10: 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c  te3ExprAlloc(db,
4b20: 20 54 4b 5f 49 4e 54 45 47 45 52 2c 20 26 73 71   TK_INTEGER, &sq
4b30: 6c 69 74 65 33 49 6e 74 54 6f 6b 65 6e 73 5b 30  lite3IntTokens[0
4b40: 5d 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ], 0);.  }else{.
4b50: 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 20 3d      Expr *pNew =
4b60: 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f   sqlite3ExprAllo
4b70: 63 28 64 62 2c 20 54 4b 5f 41 4e 44 2c 20 30 2c  c(db, TK_AND, 0,
4b80: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
4b90: 45 78 70 72 41 74 74 61 63 68 53 75 62 74 72 65  ExprAttachSubtre
4ba0: 65 73 28 64 62 2c 20 70 4e 65 77 2c 20 70 4c 65  es(db, pNew, pLe
4bb0: 66 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20  ft, pRight);.   
4bc0: 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 20 20   return pNew;.  
4bd0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74  }.}../*.** Const
4be0: 72 75 63 74 20 61 20 6e 65 77 20 65 78 70 72 65  ruct a new expre
4bf0: 73 73 69 6f 6e 20 6e 6f 64 65 20 66 6f 72 20 61  ssion node for a
4c00: 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 6d   function with m
4c10: 75 6c 74 69 70 6c 65 0a 2a 2a 20 61 72 67 75 6d  ultiple.** argum
4c20: 65 6e 74 73 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73  ents..*/.Expr *s
4c30: 71 6c 69 74 65 33 45 78 70 72 46 75 6e 63 74 69  qlite3ExprFuncti
4c40: 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  on(Parse *pParse
4c50: 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73  , ExprList *pLis
4c60: 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e  t, Token *pToken
4c70: 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65 77 3b  ){.  Expr *pNew;
4c80: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
4c90: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 61   pParse->db;.  a
4ca0: 73 73 65 72 74 28 20 70 54 6f 6b 65 6e 20 29 3b  ssert( pToken );
4cb0: 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  .  pNew = sqlite
4cc0: 33 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54  3ExprAlloc(db, T
4cd0: 4b 5f 46 55 4e 43 54 49 4f 4e 2c 20 70 54 6f 6b  K_FUNCTION, pTok
4ce0: 65 6e 2c 20 31 29 3b 0a 20 20 69 66 28 20 70 4e  en, 1);.  if( pN
4cf0: 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ew==0 ){.    sql
4d00: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
4d10: 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 20 2f  te(db, pList); /
4d20: 2a 20 41 76 6f 69 64 20 6d 65 6d 6f 72 79 20 6c  * Avoid memory l
4d30: 65 61 6b 20 77 68 65 6e 20 6d 61 6c 6c 6f 63 20  eak when malloc 
4d40: 66 61 69 6c 73 20 2a 2f 0a 20 20 20 20 72 65 74  fails */.    ret
4d50: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4e 65  urn 0;.  }.  pNe
4d60: 77 2d 3e 78 2e 70 4c 69 73 74 20 3d 20 70 4c 69  w->x.pList = pLi
4d70: 73 74 3b 0a 20 20 61 73 73 65 72 74 28 20 21 45  st;.  assert( !E
4d80: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
4d90: 4e 65 77 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  New, EP_xIsSelec
4da0: 74 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  t) );.  sqlite3E
4db0: 78 70 72 53 65 74 48 65 69 67 68 74 41 6e 64 46  xprSetHeightAndF
4dc0: 6c 61 67 73 28 70 50 61 72 73 65 2c 20 70 4e 65  lags(pParse, pNe
4dd0: 77 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65  w);.  return pNe
4de0: 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69  w;.}../*.** Assi
4df0: 67 6e 20 61 20 76 61 72 69 61 62 6c 65 20 6e 75  gn a variable nu
4e00: 6d 62 65 72 20 74 6f 20 61 6e 20 65 78 70 72 65  mber to an expre
4e10: 73 73 69 6f 6e 20 74 68 61 74 20 65 6e 63 6f 64  ssion that encod
4e20: 65 73 20 61 20 77 69 6c 64 63 61 72 64 0a 2a 2a  es a wildcard.**
4e30: 20 69 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   in the original
4e40: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20   SQL statement. 
4e50: 20 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72 64   .**.** Wildcard
4e60: 73 20 63 6f 6e 73 69 73 74 69 6e 67 20 6f 66 20  s consisting of 
4e70: 61 20 73 69 6e 67 6c 65 20 22 3f 22 20 61 72 65  a single "?" are
4e80: 20 61 73 73 69 67 6e 65 64 20 74 68 65 20 6e 65   assigned the ne
4e90: 78 74 20 73 65 71 75 65 6e 74 69 61 6c 0a 2a 2a  xt sequential.**
4ea0: 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72   variable number
4eb0: 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72 64  ..**.** Wildcard
4ec0: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3f  s of the form "?
4ed0: 6e 6e 6e 22 20 61 72 65 20 61 73 73 69 67 6e 65  nnn" are assigne
4ee0: 64 20 74 68 65 20 6e 75 6d 62 65 72 20 22 6e 6e  d the number "nn
4ef0: 6e 22 2e 20 20 57 65 20 6d 61 6b 65 0a 2a 2a 20  n".  We make.** 
4f00: 73 75 72 65 20 22 6e 6e 6e 22 20 69 73 20 6e 6f  sure "nnn" is no
4f10: 74 20 74 6f 6f 20 62 65 20 74 6f 20 61 76 6f 69  t too be to avoi
4f20: 64 20 61 20 64 65 6e 69 61 6c 20 6f 66 20 73 65  d a denial of se
4f30: 72 76 69 63 65 20 61 74 74 61 63 6b 20 77 68 65  rvice attack whe
4f40: 6e 0a 2a 2a 20 74 68 65 20 53 51 4c 20 73 74 61  n.** the SQL sta
4f50: 74 65 6d 65 6e 74 20 63 6f 6d 65 73 20 66 72 6f  tement comes fro
4f60: 6d 20 61 6e 20 65 78 74 65 72 6e 61 6c 20 73 6f  m an external so
4f70: 75 72 63 65 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c 64  urce..**.** Wild
4f80: 63 61 72 64 73 20 6f 66 20 74 68 65 20 66 6f 72  cards of the for
4f90: 6d 20 22 3a 61 61 61 22 2c 20 22 40 61 61 61 22  m ":aaa", "@aaa"
4fa0: 2c 20 6f 72 20 22 24 61 61 61 22 20 61 72 65 20  , or "$aaa" are 
4fb0: 61 73 73 69 67 6e 65 64 20 74 68 65 20 73 61 6d  assigned the sam
4fc0: 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 61 73 20 74  e number.** as t
4fd0: 68 65 20 70 72 65 76 69 6f 75 73 20 69 6e 73 74  he previous inst
4fe0: 61 6e 63 65 20 6f 66 20 74 68 65 20 73 61 6d 65  ance of the same
4ff0: 20 77 69 6c 64 63 61 72 64 2e 20 20 4f 72 20 69   wildcard.  Or i
5000: 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69  f this is the fi
5010: 72 73 74 0a 2a 2a 20 69 6e 73 74 61 6e 63 65 20  rst.** instance 
5020: 6f 66 20 74 68 65 20 77 69 6c 64 63 61 72 64 2c  of the wildcard,
5030: 20 74 68 65 20 6e 65 78 74 20 73 65 71 75 65 6e   the next sequen
5040: 74 69 61 6c 20 76 61 72 69 61 62 6c 65 20 6e 75  tial variable nu
5050: 6d 62 65 72 20 69 73 0a 2a 2a 20 61 73 73 69 67  mber is.** assig
5060: 6e 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ned..*/.void sql
5070: 69 74 65 33 45 78 70 72 41 73 73 69 67 6e 56 61  ite3ExprAssignVa
5080: 72 4e 75 6d 62 65 72 28 50 61 72 73 65 20 2a 70  rNumber(Parse *p
5090: 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
50a0: 70 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  pr){.  sqlite3 *
50b0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
50c0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
50d0: 3b 0a 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d  ;..  if( pExpr==
50e0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73  0 ) return;.  as
50f0: 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
5100: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
5110: 5f 49 6e 74 56 61 6c 75 65 7c 45 50 5f 52 65 64  _IntValue|EP_Red
5120: 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  uced|EP_TokenOnl
5130: 79 29 20 29 3b 0a 20 20 7a 20 3d 20 70 45 78 70  y) );.  z = pExp
5140: 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 61  r->u.zToken;.  a
5150: 73 73 65 72 74 28 20 7a 21 3d 30 20 29 3b 0a 20  ssert( z!=0 );. 
5160: 20 61 73 73 65 72 74 28 20 7a 5b 30 5d 21 3d 30   assert( z[0]!=0
5170: 20 29 3b 0a 20 20 69 66 28 20 7a 5b 31 5d 3d 3d   );.  if( z[1]==
5180: 30 20 29 7b 0a 20 20 20 20 2f 2a 20 57 69 6c 64  0 ){.    /* Wild
5190: 63 61 72 64 20 6f 66 20 74 68 65 20 66 6f 72 6d  card of the form
51a0: 20 22 3f 22 2e 20 20 41 73 73 69 67 6e 20 74 68   "?".  Assign th
51b0: 65 20 6e 65 78 74 20 76 61 72 69 61 62 6c 65 20  e next variable 
51c0: 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20 61 73  number */.    as
51d0: 73 65 72 74 28 20 7a 5b 30 5d 3d 3d 27 3f 27 20  sert( z[0]=='?' 
51e0: 29 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 69 43  );.    pExpr->iC
51f0: 6f 6c 75 6d 6e 20 3d 20 28 79 6e 56 61 72 29 28  olumn = (ynVar)(
5200: 2b 2b 70 50 61 72 73 65 2d 3e 6e 56 61 72 29 3b  ++pParse->nVar);
5210: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 79 6e  .  }else{.    yn
5220: 56 61 72 20 78 20 3d 20 30 3b 0a 20 20 20 20 75  Var x = 0;.    u
5230: 33 32 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74  32 n = sqlite3St
5240: 72 6c 65 6e 33 30 28 7a 29 3b 0a 20 20 20 20 69  rlen30(z);.    i
5250: 66 28 20 7a 5b 30 5d 3d 3d 27 3f 27 20 29 7b 0a  f( z[0]=='?' ){.
5260: 20 20 20 20 20 20 2f 2a 20 57 69 6c 64 63 61 72        /* Wildcar
5270: 64 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3f  d of the form "?
5280: 6e 6e 6e 22 2e 20 20 43 6f 6e 76 65 72 74 20 22  nnn".  Convert "
5290: 6e 6e 6e 22 20 74 6f 20 61 6e 20 69 6e 74 65 67  nnn" to an integ
52a0: 65 72 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20  er and.      ** 
52b0: 75 73 65 20 69 74 20 61 73 20 74 68 65 20 76 61  use it as the va
52c0: 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 2a 2f  riable number */
52d0: 0a 20 20 20 20 20 20 69 36 34 20 69 3b 0a 20 20  .      i64 i;.  
52e0: 20 20 20 20 69 6e 74 20 62 4f 6b 20 3d 20 30 3d      int bOk = 0=
52f0: 3d 73 71 6c 69 74 65 33 41 74 6f 69 36 34 28 26  =sqlite3Atoi64(&
5300: 7a 5b 31 5d 2c 20 26 69 2c 20 6e 2d 31 2c 20 53  z[1], &i, n-1, S
5310: 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 20  QLITE_UTF8);.   
5320: 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d     pExpr->iColum
5330: 6e 20 3d 20 78 20 3d 20 28 79 6e 56 61 72 29 69  n = x = (ynVar)i
5340: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
5350: 28 20 69 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ( i==0 );.      
5360: 74 65 73 74 63 61 73 65 28 20 69 3d 3d 31 20 29  testcase( i==1 )
5370: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
5380: 28 20 69 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74 5b  ( i==db->aLimit[
5390: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52  SQLITE_LIMIT_VAR
53a0: 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 2d 31 20  IABLE_NUMBER]-1 
53b0: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
53c0: 65 28 20 69 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74  e( i==db->aLimit
53d0: 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41  [SQLITE_LIMIT_VA
53e0: 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 20 29  RIABLE_NUMBER] )
53f0: 3b 0a 20 20 20 20 20 20 69 66 28 20 62 4f 6b 3d  ;.      if( bOk=
5400: 3d 30 20 7c 7c 20 69 3c 31 20 7c 7c 20 69 3e 64  =0 || i<1 || i>d
5410: 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45  b->aLimit[SQLITE
5420: 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f  _LIMIT_VARIABLE_
5430: 4e 55 4d 42 45 52 5d 20 29 7b 0a 20 20 20 20 20  NUMBER] ){.     
5440: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
5450: 73 67 28 70 50 61 72 73 65 2c 20 22 76 61 72 69  sg(pParse, "vari
5460: 61 62 6c 65 20 6e 75 6d 62 65 72 20 6d 75 73 74  able number must
5470: 20 62 65 20 62 65 74 77 65 65 6e 20 3f 31 20 61   be between ?1 a
5480: 6e 64 20 3f 25 64 22 2c 0a 20 20 20 20 20 20 20  nd ?%d",.       
5490: 20 20 20 20 20 64 62 2d 3e 61 4c 69 6d 69 74 5b       db->aLimit[
54a0: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52  SQLITE_LIMIT_VAR
54b0: 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 29 3b 0a  IABLE_NUMBER]);.
54c0: 20 20 20 20 20 20 20 20 78 20 3d 20 30 3b 0a 20          x = 0;. 
54d0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
54e0: 20 69 3e 70 50 61 72 73 65 2d 3e 6e 56 61 72 20   i>pParse->nVar 
54f0: 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  ){.        pPars
5500: 65 2d 3e 6e 56 61 72 20 3d 20 28 69 6e 74 29 69  e->nVar = (int)i
5510: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
5520: 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 57 69  lse{.      /* Wi
5530: 6c 64 63 61 72 64 73 20 6c 69 6b 65 20 22 3a 61  ldcards like ":a
5540: 61 61 22 2c 20 22 24 61 61 61 22 20 6f 72 20 22  aa", "$aaa" or "
5550: 40 61 61 61 22 2e 20 20 52 65 75 73 65 20 74 68  @aaa".  Reuse th
5560: 65 20 73 61 6d 65 20 76 61 72 69 61 62 6c 65 0a  e same variable.
5570: 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20        ** number 
5580: 61 73 20 74 68 65 20 70 72 69 6f 72 20 61 70 70  as the prior app
5590: 65 61 72 61 6e 63 65 20 6f 66 20 74 68 65 20 73  earance of the s
55a0: 61 6d 65 20 6e 61 6d 65 2c 20 6f 72 20 69 66 20  ame name, or if 
55b0: 74 68 65 20 6e 61 6d 65 0a 20 20 20 20 20 20 2a  the name.      *
55c0: 2a 20 68 61 73 20 6e 65 76 65 72 20 61 70 70 65  * has never appe
55d0: 61 72 65 64 20 62 65 66 6f 72 65 2c 20 72 65 75  ared before, reu
55e0: 73 65 20 74 68 65 20 73 61 6d 65 20 76 61 72 69  se the same vari
55f0: 61 62 6c 65 20 6e 75 6d 62 65 72 0a 20 20 20 20  able number.    
5600: 20 20 2a 2f 0a 20 20 20 20 20 20 79 6e 56 61 72    */.      ynVar
5610: 20 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   i;.      for(i=
5620: 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 7a 56  0; i<pParse->nzV
5630: 61 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ar; i++){.      
5640: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 61 7a    if( pParse->az
5650: 56 61 72 5b 69 5d 20 26 26 20 73 74 72 63 6d 70  Var[i] && strcmp
5660: 28 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 5b 69  (pParse->azVar[i
5670: 5d 2c 7a 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ],z)==0 ){.     
5680: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c       pExpr->iCol
5690: 75 6d 6e 20 3d 20 78 20 3d 20 28 79 6e 56 61 72  umn = x = (ynVar
56a0: 29 69 2b 31 3b 0a 20 20 20 20 20 20 20 20 20 20  )i+1;.          
56b0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
56c0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
56d0: 66 28 20 78 3d 3d 30 20 29 20 78 20 3d 20 70 45  f( x==0 ) x = pE
56e0: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 28  xpr->iColumn = (
56f0: 79 6e 56 61 72 29 28 2b 2b 70 50 61 72 73 65 2d  ynVar)(++pParse-
5700: 3e 6e 56 61 72 29 3b 0a 20 20 20 20 7d 0a 20 20  >nVar);.    }.  
5710: 20 20 69 66 28 20 78 3e 30 20 29 7b 0a 20 20 20    if( x>0 ){.   
5720: 20 20 20 69 66 28 20 78 3e 70 50 61 72 73 65 2d     if( x>pParse-
5730: 3e 6e 7a 56 61 72 20 29 7b 0a 20 20 20 20 20 20  >nzVar ){.      
5740: 20 20 63 68 61 72 20 2a 2a 61 3b 0a 20 20 20 20    char **a;.    
5750: 20 20 20 20 61 20 3d 20 73 71 6c 69 74 65 33 44      a = sqlite3D
5760: 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70 50 61  bRealloc(db, pPa
5770: 72 73 65 2d 3e 61 7a 56 61 72 2c 20 78 2a 73 69  rse->azVar, x*si
5780: 7a 65 6f 66 28 61 5b 30 5d 29 29 3b 0a 20 20 20  zeof(a[0]));.   
5790: 20 20 20 20 20 69 66 28 20 61 3d 3d 30 20 29 20       if( a==0 ) 
57a0: 72 65 74 75 72 6e 3b 20 20 2f 2a 20 45 72 72 6f  return;  /* Erro
57b0: 72 20 72 65 70 6f 72 74 65 64 20 74 68 72 6f 75  r reported throu
57c0: 67 68 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  gh db->mallocFai
57d0: 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 70  led */.        p
57e0: 50 61 72 73 65 2d 3e 61 7a 56 61 72 20 3d 20 61  Parse->azVar = a
57f0: 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74  ;.        memset
5800: 28 26 61 5b 70 50 61 72 73 65 2d 3e 6e 7a 56 61  (&a[pParse->nzVa
5810: 72 5d 2c 20 30 2c 20 28 78 2d 70 50 61 72 73 65  r], 0, (x-pParse
5820: 2d 3e 6e 7a 56 61 72 29 2a 73 69 7a 65 6f 66 28  ->nzVar)*sizeof(
5830: 61 5b 30 5d 29 29 3b 0a 20 20 20 20 20 20 20 20  a[0]));.        
5840: 70 50 61 72 73 65 2d 3e 6e 7a 56 61 72 20 3d 20  pParse->nzVar = 
5850: 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  x;.      }.     
5860: 20 69 66 28 20 7a 5b 30 5d 21 3d 27 3f 27 20 7c   if( z[0]!='?' |
5870: 7c 20 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 5b  | pParse->azVar[
5880: 78 2d 31 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20  x-1]==0 ){.     
5890: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
58a0: 28 64 62 2c 20 70 50 61 72 73 65 2d 3e 61 7a 56  (db, pParse->azV
58b0: 61 72 5b 78 2d 31 5d 29 3b 0a 20 20 20 20 20 20  ar[x-1]);.      
58c0: 20 20 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 5b    pParse->azVar[
58d0: 78 2d 31 5d 20 3d 20 73 71 6c 69 74 65 33 44 62  x-1] = sqlite3Db
58e0: 53 74 72 4e 44 75 70 28 64 62 2c 20 7a 2c 20 6e  StrNDup(db, z, n
58f0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
5900: 0a 20 20 7d 20 0a 20 20 69 66 28 20 21 70 50 61  .  } .  if( !pPa
5910: 72 73 65 2d 3e 6e 45 72 72 20 26 26 20 70 50 61  rse->nErr && pPa
5920: 72 73 65 2d 3e 6e 56 61 72 3e 64 62 2d 3e 61 4c  rse->nVar>db->aL
5930: 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
5940: 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45  T_VARIABLE_NUMBE
5950: 52 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  R] ){.    sqlite
5960: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
5970: 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 53 51 4c 20  , "too many SQL 
5980: 76 61 72 69 61 62 6c 65 73 22 29 3b 0a 20 20 7d  variables");.  }
5990: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 75 72 73  .}../*.** Recurs
59a0: 69 76 65 6c 79 20 64 65 6c 65 74 65 20 61 6e 20  ively delete an 
59b0: 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e  expression tree.
59c0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
59d0: 45 78 70 72 44 65 6c 65 74 65 28 73 71 6c 69 74  ExprDelete(sqlit
59e0: 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 29  e3 *db, Expr *p)
59f0: 7b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  {.  if( p==0 ) r
5a00: 65 74 75 72 6e 3b 0a 20 20 2f 2a 20 53 61 6e 69  eturn;.  /* Sani
5a10: 74 79 20 63 68 65 63 6b 3a 20 41 73 73 65 72 74  ty check: Assert
5a20: 20 74 68 61 74 20 74 68 65 20 49 6e 74 56 61 6c   that the IntVal
5a30: 75 65 20 69 73 20 6e 6f 6e 2d 6e 65 67 61 74 69  ue is non-negati
5a40: 76 65 20 69 66 20 69 74 20 65 78 69 73 74 73 20  ve if it exists 
5a50: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21 45 78  */.  assert( !Ex
5a60: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
5a70: 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 7c 7c   EP_IntValue) ||
5a80: 20 70 2d 3e 75 2e 69 56 61 6c 75 65 3e 3d 30 20   p->u.iValue>=0 
5a90: 29 3b 0a 20 20 69 66 28 20 21 45 78 70 72 48 61  );.  if( !ExprHa
5aa0: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
5ab0: 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20  TokenOnly) ){.  
5ac0: 20 20 2f 2a 20 54 68 65 20 45 78 70 72 2e 78 20    /* The Expr.x 
5ad0: 75 6e 69 6f 6e 20 69 73 20 6e 65 76 65 72 20 75  union is never u
5ae0: 73 65 64 20 61 74 20 74 68 65 20 73 61 6d 65 20  sed at the same 
5af0: 74 69 6d 65 20 61 73 20 45 78 70 72 2e 70 52 69  time as Expr.pRi
5b00: 67 68 74 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ght */.    asser
5b10: 74 28 20 70 2d 3e 78 2e 70 4c 69 73 74 3d 3d 30  t( p->x.pList==0
5b20: 20 7c 7c 20 70 2d 3e 70 52 69 67 68 74 3d 3d 30   || p->pRight==0
5b30: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   );.    sqlite3E
5b40: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  xprDelete(db, p-
5b50: 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 73 71 6c  >pLeft);.    sql
5b60: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
5b70: 62 2c 20 70 2d 3e 70 52 69 67 68 74 29 3b 0a 20  b, p->pRight);. 
5b80: 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72     if( ExprHasPr
5b90: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 4d 65 6d  operty(p, EP_Mem
5ba0: 54 6f 6b 65 6e 29 20 29 20 73 71 6c 69 74 65 33  Token) ) sqlite3
5bb0: 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 75 2e  DbFree(db, p->u.
5bc0: 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 69 66 28  zToken);.    if(
5bd0: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
5be0: 28 70 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  (p, EP_xIsSelect
5bf0: 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
5c00: 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64  e3SelectDelete(d
5c10: 62 2c 20 70 2d 3e 78 2e 70 53 65 6c 65 63 74 29  b, p->x.pSelect)
5c20: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
5c30: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
5c40: 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  stDelete(db, p->
5c50: 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a  x.pList);.    }.
5c60: 20 20 7d 0a 20 20 69 66 28 20 21 45 78 70 72 48    }.  if( !ExprH
5c70: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
5c80: 5f 53 74 61 74 69 63 29 20 29 7b 0a 20 20 20 20  _Static) ){.    
5c90: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
5ca0: 2c 20 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  , p);.  }.}../*.
5cb0: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
5cc0: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 61 6c  mber of bytes al
5cd0: 6c 6f 63 61 74 65 64 20 66 6f 72 20 74 68 65 20  located for the 
5ce0: 65 78 70 72 65 73 73 69 6f 6e 20 73 74 72 75 63  expression struc
5cf0: 74 75 72 65 20 0a 2a 2a 20 70 61 73 73 65 64 20  ture .** passed 
5d00: 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67  as the first arg
5d10: 75 6d 65 6e 74 2e 20 54 68 69 73 20 69 73 20 61  ument. This is a
5d20: 6c 77 61 79 73 20 6f 6e 65 20 6f 66 20 45 58 50  lways one of EXP
5d30: 52 5f 46 55 4c 4c 53 49 5a 45 2c 0a 2a 2a 20 45  R_FULLSIZE,.** E
5d40: 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45 20  XPR_REDUCEDSIZE 
5d50: 6f 72 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c  or EXPR_TOKENONL
5d60: 59 53 49 5a 45 2e 0a 2a 2f 0a 73 74 61 74 69 63  YSIZE..*/.static
5d70: 20 69 6e 74 20 65 78 70 72 53 74 72 75 63 74 53   int exprStructS
5d80: 69 7a 65 28 45 78 70 72 20 2a 70 29 7b 0a 20 20  ize(Expr *p){.  
5d90: 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
5da0: 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f  rty(p, EP_TokenO
5db0: 6e 6c 79 29 20 29 20 72 65 74 75 72 6e 20 45 58  nly) ) return EX
5dc0: 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45  PR_TOKENONLYSIZE
5dd0: 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50  ;.  if( ExprHasP
5de0: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 52 65  roperty(p, EP_Re
5df0: 64 75 63 65 64 29 20 29 20 72 65 74 75 72 6e 20  duced) ) return 
5e00: 45 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45  EXPR_REDUCEDSIZE
5e10: 3b 0a 20 20 72 65 74 75 72 6e 20 45 58 50 52 5f  ;.  return EXPR_
5e20: 46 55 4c 4c 53 49 5a 45 3b 0a 7d 0a 0a 2f 2a 0a  FULLSIZE;.}../*.
5e30: 2a 2a 20 54 68 65 20 64 75 70 65 64 45 78 70 72  ** The dupedExpr
5e40: 2a 53 69 7a 65 28 29 20 72 6f 75 74 69 6e 65 73  *Size() routines
5e50: 20 65 61 63 68 20 72 65 74 75 72 6e 20 74 68 65   each return the
5e60: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
5e70: 20 72 65 71 75 69 72 65 64 0a 2a 2a 20 74 6f 20   required.** to 
5e80: 73 74 6f 72 65 20 61 20 63 6f 70 79 20 6f 66 20  store a copy of 
5e90: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 72  an expression or
5ea0: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
5eb0: 2e 20 20 54 68 65 79 20 64 69 66 66 65 72 20 69  .  They differ i
5ec0: 6e 0a 2a 2a 20 68 6f 77 20 6d 75 63 68 20 6f 66  n.** how much of
5ed0: 20 74 68 65 20 74 72 65 65 20 69 73 20 6d 65 61   the tree is mea
5ee0: 73 75 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  sured..**.**    
5ef0: 20 64 75 70 65 64 45 78 70 72 53 74 72 75 63 74   dupedExprStruct
5f00: 53 69 7a 65 28 29 20 20 20 20 20 53 69 7a 65 20  Size()     Size 
5f10: 6f 66 20 6f 6e 6c 79 20 74 68 65 20 45 78 70 72  of only the Expr
5f20: 20 73 74 72 75 63 74 75 72 65 20 0a 2a 2a 20 20   structure .**  
5f30: 20 20 20 64 75 70 65 64 45 78 70 72 4e 6f 64 65     dupedExprNode
5f40: 53 69 7a 65 28 29 20 20 20 20 20 20 20 53 69 7a  Size()       Siz
5f50: 65 20 6f 66 20 45 78 70 72 20 2b 20 73 70 61 63  e of Expr + spac
5f60: 65 20 66 6f 72 20 74 6f 6b 65 6e 0a 2a 2a 20 20  e for token.**  
5f70: 20 20 20 64 75 70 65 64 45 78 70 72 53 69 7a 65     dupedExprSize
5f80: 28 29 20 20 20 20 20 20 20 20 20 20 20 45 78 70  ()           Exp
5f90: 72 20 2b 20 74 6f 6b 65 6e 20 2b 20 73 75 62 74  r + token + subt
5fa0: 72 65 65 20 63 6f 6d 70 6f 6e 65 6e 74 73 0a 2a  ree components.*
5fb0: 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
5fc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5fd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5fe0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5ff0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
6000: 0a 2a 2a 20 54 68 65 20 64 75 70 65 64 45 78 70  .** The dupedExp
6010: 72 53 74 72 75 63 74 53 69 7a 65 28 29 20 66 75  rStructSize() fu
6020: 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74  nction returns t
6030: 77 6f 20 76 61 6c 75 65 73 20 4f 52 2d 65 64 20  wo values OR-ed 
6040: 74 6f 67 65 74 68 65 72 3a 20 20 0a 2a 2a 20 28  together:  .** (
6050: 31 29 20 74 68 65 20 73 70 61 63 65 20 72 65 71  1) the space req
6060: 75 69 72 65 64 20 66 6f 72 20 61 20 63 6f 70 79  uired for a copy
6070: 20 6f 66 20 74 68 65 20 45 78 70 72 20 73 74 72   of the Expr str
6080: 75 63 74 75 72 65 20 6f 6e 6c 79 20 61 6e 64 20  ucture only and 
6090: 0a 2a 2a 20 28 32 29 20 74 68 65 20 45 50 5f 78  .** (2) the EP_x
60a0: 78 78 20 66 6c 61 67 73 20 74 68 61 74 20 69 6e  xx flags that in
60b0: 64 69 63 61 74 65 20 77 68 61 74 20 74 68 65 20  dicate what the 
60c0: 73 74 72 75 63 74 75 72 65 20 73 69 7a 65 20 73  structure size s
60d0: 68 6f 75 6c 64 20 62 65 2e 0a 2a 2a 20 54 68 65  hould be..** The
60e0: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 73 20 69   return values i
60f0: 73 20 61 6c 77 61 79 73 20 6f 6e 65 20 6f 66 3a  s always one of:
6100: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 45 58 50 52  .**.**      EXPR
6110: 5f 46 55 4c 4c 53 49 5a 45 0a 2a 2a 20 20 20 20  _FULLSIZE.**    
6120: 20 20 45 58 50 52 5f 52 45 44 55 43 45 44 53 49    EXPR_REDUCEDSI
6130: 5a 45 20 20 20 7c 20 45 50 5f 52 65 64 75 63 65  ZE   | EP_Reduce
6140: 64 0a 2a 2a 20 20 20 20 20 20 45 58 50 52 5f 54  d.**      EXPR_T
6150: 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 20 7c 20 45  OKENONLYSIZE | E
6160: 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 0a 2a 2a 0a 2a  P_TokenOnly.**.*
6170: 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68  * The size of th
6180: 65 20 73 74 72 75 63 74 75 72 65 20 63 61 6e 20  e structure can 
6190: 62 65 20 66 6f 75 6e 64 20 62 79 20 6d 61 73 6b  be found by mask
61a0: 69 6e 67 20 74 68 65 20 72 65 74 75 72 6e 20 76  ing the return v
61b0: 61 6c 75 65 0a 2a 2a 20 6f 66 20 74 68 69 73 20  alue.** of this 
61c0: 72 6f 75 74 69 6e 65 20 77 69 74 68 20 30 78 66  routine with 0xf
61d0: 66 66 2e 20 20 54 68 65 20 66 6c 61 67 73 20 63  ff.  The flags c
61e0: 61 6e 20 62 65 20 66 6f 75 6e 64 20 62 79 20 6d  an be found by m
61f0: 61 73 6b 69 6e 67 20 74 68 65 0a 2a 2a 20 72 65  asking the.** re
6200: 74 75 72 6e 20 76 61 6c 75 65 20 77 69 74 68 20  turn value with 
6210: 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f  EP_Reduced|EP_To
6220: 6b 65 6e 4f 6e 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4e  kenOnly..**.** N
6230: 6f 74 65 20 74 68 61 74 20 77 69 74 68 20 66 6c  ote that with fl
6240: 61 67 73 3d 3d 45 58 50 52 44 55 50 5f 52 45 44  ags==EXPRDUP_RED
6250: 55 43 45 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  UCE, this routin
6260: 65 73 20 77 6f 72 6b 73 20 6f 6e 20 66 75 6c 6c  es works on full
6270: 2d 73 69 7a 65 0a 2a 2a 20 28 75 6e 72 65 64 75  -size.** (unredu
6280: 63 65 64 29 20 45 78 70 72 20 6f 62 6a 65 63 74  ced) Expr object
6290: 73 20 61 73 20 74 68 65 79 20 6f 72 20 6f 72 69  s as they or ori
62a0: 67 69 6e 61 6c 6c 79 20 63 6f 6e 73 74 72 75 63  ginally construc
62b0: 74 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65  ted by the parse
62c0: 72 2e 0a 2a 2a 20 44 75 72 69 6e 67 20 65 78 70  r..** During exp
62d0: 72 65 73 73 69 6f 6e 20 61 6e 61 6c 79 73 69 73  ression analysis
62e0: 2c 20 65 78 74 72 61 20 69 6e 66 6f 72 6d 61 74  , extra informat
62f0: 69 6f 6e 20 69 73 20 63 6f 6d 70 75 74 65 64 20  ion is computed 
6300: 61 6e 64 20 6d 6f 76 65 64 20 69 6e 74 6f 0a 2a  and moved into.*
6310: 2a 20 6c 61 74 65 72 20 70 61 72 74 73 20 6f 66  * later parts of
6320: 20 74 65 68 20 45 78 70 72 20 6f 62 6a 65 63 74   teh Expr object
6330: 20 61 6e 64 20 74 68 61 74 20 65 78 74 72 61 20   and that extra 
6340: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6d 69 67 68  information migh
6350: 74 20 67 65 74 20 63 68 6f 70 70 65 64 0a 2a 2a  t get chopped.**
6360: 20 6f 66 66 20 69 66 20 74 68 65 20 65 78 70 72   off if the expr
6370: 65 73 73 69 6f 6e 20 69 73 20 72 65 64 75 63 65  ession is reduce
6380: 64 2e 20 20 4e 6f 74 65 20 61 6c 73 6f 20 74 68  d.  Note also th
6390: 61 74 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 77  at it does not w
63a0: 6f 72 6b 20 74 6f 0a 2a 2a 20 6d 61 6b 65 20 61  ork to.** make a
63b0: 6e 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 45  n EXPRDUP_REDUCE
63c0: 20 63 6f 70 79 20 6f 66 20 61 20 72 65 64 75 63   copy of a reduc
63d0: 65 64 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20  ed expression.  
63e0: 49 74 20 69 73 20 6f 6e 6c 79 20 6c 65 67 61 6c  It is only legal
63f0: 0a 2a 2a 20 74 6f 20 72 65 64 75 63 65 20 61 20  .** to reduce a 
6400: 70 72 69 73 74 69 6e 65 20 65 78 70 72 65 73 73  pristine express
6410: 69 6f 6e 20 74 72 65 65 20 66 72 6f 6d 20 74 68  ion tree from th
6420: 65 20 70 61 72 73 65 72 2e 20 20 54 68 65 20 69  e parser.  The i
6430: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 0a 2a 2a  mplementation.**
6440: 20 6f 66 20 64 75 70 65 64 45 78 70 72 53 74 72   of dupedExprStr
6450: 75 63 74 53 69 7a 65 28 29 20 63 6f 6e 74 61 69  uctSize() contai
6460: 6e 20 6d 75 6c 74 69 70 6c 65 20 61 73 73 65 72  n multiple asser
6470: 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 74  t() statements t
6480: 68 61 74 20 61 74 74 65 6d 70 74 0a 2a 2a 20 74  hat attempt.** t
6490: 6f 20 65 6e 66 6f 72 63 65 20 74 68 69 73 20 63  o enforce this c
64a0: 6f 6e 73 74 72 61 69 6e 74 2e 0a 2a 2f 0a 73 74  onstraint..*/.st
64b0: 61 74 69 63 20 69 6e 74 20 64 75 70 65 64 45 78  atic int dupedEx
64c0: 70 72 53 74 72 75 63 74 53 69 7a 65 28 45 78 70  prStructSize(Exp
64d0: 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29  r *p, int flags)
64e0: 7b 0a 20 20 69 6e 74 20 6e 53 69 7a 65 3b 0a 20  {.  int nSize;. 
64f0: 20 61 73 73 65 72 74 28 20 66 6c 61 67 73 3d 3d   assert( flags==
6500: 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 20 7c  EXPRDUP_REDUCE |
6510: 7c 20 66 6c 61 67 73 3d 3d 30 20 29 3b 20 2f 2a  | flags==0 ); /*
6520: 20 4f 6e 6c 79 20 6f 6e 65 20 66 6c 61 67 20 76   Only one flag v
6530: 61 6c 75 65 20 61 6c 6c 6f 77 65 64 20 2a 2f 0a  alue allowed */.
6540: 20 20 61 73 73 65 72 74 28 20 45 58 50 52 5f 46    assert( EXPR_F
6550: 55 4c 4c 53 49 5a 45 3c 3d 30 78 66 66 66 20 29  ULLSIZE<=0xfff )
6560: 3b 0a 20 20 61 73 73 65 72 74 28 20 28 30 78 66  ;.  assert( (0xf
6570: 66 66 20 26 20 28 45 50 5f 52 65 64 75 63 65 64  ff & (EP_Reduced
6580: 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 29 3d  |EP_TokenOnly))=
6590: 3d 30 20 29 3b 0a 20 20 69 66 28 20 30 3d 3d 28  =0 );.  if( 0==(
65a0: 66 6c 61 67 73 26 45 58 50 52 44 55 50 5f 52 45  flags&EXPRDUP_RE
65b0: 44 55 43 45 29 20 29 7b 0a 20 20 20 20 6e 53 69  DUCE) ){.    nSi
65c0: 7a 65 20 3d 20 45 58 50 52 5f 46 55 4c 4c 53 49  ze = EXPR_FULLSI
65d0: 5a 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ZE;.  }else{.   
65e0: 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
65f0: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
6600: 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64  TokenOnly|EP_Red
6610: 75 63 65 64 29 20 29 3b 0a 20 20 20 20 61 73 73  uced) );.    ass
6620: 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
6630: 70 65 72 74 79 28 70 2c 20 45 50 5f 46 72 6f 6d  perty(p, EP_From
6640: 4a 6f 69 6e 29 20 29 3b 20 0a 20 20 20 20 61 73  Join) ); .    as
6650: 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
6660: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 4d 65 6d  operty(p, EP_Mem
6670: 54 6f 6b 65 6e 29 20 29 3b 0a 20 20 20 20 61 73  Token) );.    as
6680: 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
6690: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 4e 6f 52  operty(p, EP_NoR
66a0: 65 64 75 63 65 29 20 29 3b 0a 20 20 20 20 69 66  educe) );.    if
66b0: 28 20 70 2d 3e 70 4c 65 66 74 20 7c 7c 20 70 2d  ( p->pLeft || p-
66c0: 3e 78 2e 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  >x.pList ){.    
66d0: 20 20 6e 53 69 7a 65 20 3d 20 45 58 50 52 5f 52    nSize = EXPR_R
66e0: 45 44 55 43 45 44 53 49 5a 45 20 7c 20 45 50 5f  EDUCEDSIZE | EP_
66f0: 52 65 64 75 63 65 64 3b 0a 20 20 20 20 7d 65 6c  Reduced;.    }el
6700: 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
6710: 28 20 70 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29  ( p->pRight==0 )
6720: 3b 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20  ;.      nSize = 
6730: 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49  EXPR_TOKENONLYSI
6740: 5a 45 20 7c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  ZE | EP_TokenOnl
6750: 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  y;.    }.  }.  r
6760: 65 74 75 72 6e 20 6e 53 69 7a 65 3b 0a 7d 0a 0a  eturn nSize;.}..
6770: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
6780: 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20  ion returns the 
6790: 73 70 61 63 65 20 69 6e 20 62 79 74 65 73 20 72  space in bytes r
67a0: 65 71 75 69 72 65 64 20 74 6f 20 73 74 6f 72 65  equired to store
67b0: 20 74 68 65 20 63 6f 70 79 20 0a 2a 2a 20 6f 66   the copy .** of
67c0: 20 74 68 65 20 45 78 70 72 20 73 74 72 75 63 74   the Expr struct
67d0: 75 72 65 20 61 6e 64 20 61 20 63 6f 70 79 20 6f  ure and a copy o
67e0: 66 20 74 68 65 20 45 78 70 72 2e 75 2e 7a 54 6f  f the Expr.u.zTo
67f0: 6b 65 6e 20 73 74 72 69 6e 67 20 28 69 66 20 74  ken string (if t
6800: 68 61 74 0a 2a 2a 20 73 74 72 69 6e 67 20 69 73  hat.** string is
6810: 20 64 65 66 69 6e 65 64 2e 29 0a 2a 2f 0a 73 74   defined.).*/.st
6820: 61 74 69 63 20 69 6e 74 20 64 75 70 65 64 45 78  atic int dupedEx
6830: 70 72 4e 6f 64 65 53 69 7a 65 28 45 78 70 72 20  prNodeSize(Expr 
6840: 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a  *p, int flags){.
6850: 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 64 75    int nByte = du
6860: 70 65 64 45 78 70 72 53 74 72 75 63 74 53 69 7a  pedExprStructSiz
6870: 65 28 70 2c 20 66 6c 61 67 73 29 20 26 20 30 78  e(p, flags) & 0x
6880: 66 66 66 3b 0a 20 20 69 66 28 20 21 45 78 70 72  fff;.  if( !Expr
6890: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
68a0: 50 5f 49 6e 74 56 61 6c 75 65 29 20 26 26 20 70  P_IntValue) && p
68b0: 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 29 7b 0a 20 20  ->u.zToken ){.  
68c0: 20 20 6e 42 79 74 65 20 2b 3d 20 73 71 6c 69 74    nByte += sqlit
68d0: 65 33 53 74 72 6c 65 6e 33 30 28 70 2d 3e 75 2e  e3Strlen30(p->u.
68e0: 7a 54 6f 6b 65 6e 29 2b 31 3b 0a 20 20 7d 0a 20  zToken)+1;.  }. 
68f0: 20 72 65 74 75 72 6e 20 52 4f 55 4e 44 38 28 6e   return ROUND8(n
6900: 42 79 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Byte);.}../*.** 
6910: 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
6920: 72 20 6f 66 20 62 79 74 65 73 20 72 65 71 75 69  r of bytes requi
6930: 72 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 20  red to create a 
6940: 64 75 70 6c 69 63 61 74 65 20 6f 66 20 74 68 65  duplicate of the
6950: 20 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20   .** expression 
6960: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69  passed as the fi
6970: 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 54 68  rst argument. Th
6980: 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
6990: 74 20 69 73 20 61 0a 2a 2a 20 6d 61 73 6b 20 63  t is a.** mask c
69a0: 6f 6e 74 61 69 6e 69 6e 67 20 45 58 50 52 44 55  ontaining EXPRDU
69b0: 50 5f 58 58 58 20 66 6c 61 67 73 2e 0a 2a 2a 0a  P_XXX flags..**.
69c0: 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65 74  ** The value ret
69d0: 75 72 6e 65 64 20 69 6e 63 6c 75 64 65 73 20 73  urned includes s
69e0: 70 61 63 65 20 74 6f 20 63 72 65 61 74 65 20 61  pace to create a
69f0: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 45 78 70   copy of the Exp
6a00: 72 20 73 74 72 75 63 74 0a 2a 2a 20 69 74 73 65  r struct.** itse
6a10: 6c 66 20 61 6e 64 20 74 68 65 20 62 75 66 66 65  lf and the buffe
6a20: 72 20 72 65 66 65 72 72 65 64 20 74 6f 20 62 79  r referred to by
6a30: 20 45 78 70 72 2e 75 2e 7a 54 6f 6b 65 6e 2c 20   Expr.u.zToken, 
6a40: 69 66 20 61 6e 79 2e 0a 2a 2a 0a 2a 2a 20 49 66  if any..**.** If
6a50: 20 74 68 65 20 45 58 50 52 44 55 50 5f 52 45 44   the EXPRDUP_RED
6a60: 55 43 45 20 66 6c 61 67 20 69 73 20 73 65 74 2c  UCE flag is set,
6a70: 20 74 68 65 6e 20 74 68 65 20 72 65 74 75 72 6e   then the return
6a80: 20 76 61 6c 75 65 20 69 6e 63 6c 75 64 65 73 20   value includes 
6a90: 0a 2a 2a 20 73 70 61 63 65 20 74 6f 20 64 75 70  .** space to dup
6aa0: 6c 69 63 61 74 65 20 61 6c 6c 20 45 78 70 72 20  licate all Expr 
6ab0: 6e 6f 64 65 73 20 69 6e 20 74 68 65 20 74 72 65  nodes in the tre
6ac0: 65 20 66 6f 72 6d 65 64 20 62 79 20 45 78 70 72  e formed by Expr
6ad0: 2e 70 4c 65 66 74 20 0a 2a 2a 20 61 6e 64 20 45  .pLeft .** and E
6ae0: 78 70 72 2e 70 52 69 67 68 74 20 76 61 72 69 61  xpr.pRight varia
6af0: 62 6c 65 73 20 28 62 75 74 20 6e 6f 74 20 66 6f  bles (but not fo
6b00: 72 20 61 6e 79 20 73 74 72 75 63 74 75 72 65 73  r any structures
6b10: 20 70 6f 69 6e 74 65 64 20 74 6f 20 6f 72 20 0a   pointed to or .
6b20: 2a 2a 20 64 65 73 63 65 6e 64 65 64 20 66 72 6f  ** descended fro
6b30: 6d 20 74 68 65 20 45 78 70 72 2e 78 2e 70 4c 69  m the Expr.x.pLi
6b40: 73 74 20 6f 72 20 45 78 70 72 2e 78 2e 70 53 65  st or Expr.x.pSe
6b50: 6c 65 63 74 20 76 61 72 69 61 62 6c 65 73 29 2e  lect variables).
6b60: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
6b70: 75 70 65 64 45 78 70 72 53 69 7a 65 28 45 78 70  upedExprSize(Exp
6b80: 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29  r *p, int flags)
6b90: 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20  {.  int nByte = 
6ba0: 30 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  0;.  if( p ){.  
6bb0: 20 20 6e 42 79 74 65 20 3d 20 64 75 70 65 64 45    nByte = dupedE
6bc0: 78 70 72 4e 6f 64 65 53 69 7a 65 28 70 2c 20 66  xprNodeSize(p, f
6bd0: 6c 61 67 73 29 3b 0a 20 20 20 20 69 66 28 20 66  lags);.    if( f
6be0: 6c 61 67 73 26 45 58 50 52 44 55 50 5f 52 45 44  lags&EXPRDUP_RED
6bf0: 55 43 45 20 29 7b 0a 20 20 20 20 20 20 6e 42 79  UCE ){.      nBy
6c00: 74 65 20 2b 3d 20 64 75 70 65 64 45 78 70 72 53  te += dupedExprS
6c10: 69 7a 65 28 70 2d 3e 70 4c 65 66 74 2c 20 66 6c  ize(p->pLeft, fl
6c20: 61 67 73 29 20 2b 20 64 75 70 65 64 45 78 70 72  ags) + dupedExpr
6c30: 53 69 7a 65 28 70 2d 3e 70 52 69 67 68 74 2c 20  Size(p->pRight, 
6c40: 66 6c 61 67 73 29 3b 0a 20 20 20 20 7d 0a 20 20  flags);.    }.  
6c50: 7d 0a 20 20 72 65 74 75 72 6e 20 6e 42 79 74 65  }.  return nByte
6c60: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
6c70: 66 75 6e 63 74 69 6f 6e 20 69 73 20 73 69 6d 69  function is simi
6c80: 6c 61 72 20 74 6f 20 73 71 6c 69 74 65 33 45 78  lar to sqlite3Ex
6c90: 70 72 44 75 70 28 29 2c 20 65 78 63 65 70 74 20  prDup(), except 
6ca0: 74 68 61 74 20 69 66 20 70 7a 42 75 66 66 65 72  that if pzBuffer
6cb0: 20 0a 2a 2a 20 69 73 20 6e 6f 74 20 4e 55 4c 4c   .** is not NULL
6cc0: 20 74 68 65 6e 20 2a 70 7a 42 75 66 66 65 72 20   then *pzBuffer 
6cd0: 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20 70 6f  is assumed to po
6ce0: 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72 20  int to a buffer 
6cf0: 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 0a 2a 2a  large enough .**
6d00: 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 63 6f   to store the co
6d10: 70 79 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e  py of expression
6d20: 20 70 2c 20 74 68 65 20 63 6f 70 69 65 73 20 6f   p, the copies o
6d30: 66 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 0a 2a 2a  f p->u.zToken.**
6d40: 20 28 69 66 20 61 70 70 6c 69 63 61 62 6c 65 29   (if applicable)
6d50: 2c 20 61 6e 64 20 74 68 65 20 63 6f 70 69 65 73  , and the copies
6d60: 20 6f 66 20 74 68 65 20 70 2d 3e 70 4c 65 66 74   of the p->pLeft
6d70: 20 61 6e 64 20 70 2d 3e 70 52 69 67 68 74 20 65   and p->pRight e
6d80: 78 70 72 65 73 73 69 6f 6e 73 2c 0a 2a 2a 20 69  xpressions,.** i
6d90: 66 20 61 6e 79 2e 20 42 65 66 6f 72 65 20 72 65  f any. Before re
6da0: 74 75 72 6e 69 6e 67 2c 20 2a 70 7a 42 75 66 66  turning, *pzBuff
6db0: 65 72 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  er is set to the
6dc0: 20 66 69 72 73 74 20 62 79 74 65 20 70 61 73 74   first byte past
6dd0: 20 74 68 65 0a 2a 2a 20 70 6f 72 74 69 6f 6e 20   the.** portion 
6de0: 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 63 6f  of the buffer co
6df0: 70 69 65 64 20 69 6e 74 6f 20 62 79 20 74 68 69  pied into by thi
6e00: 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  s function..*/.s
6e10: 74 61 74 69 63 20 45 78 70 72 20 2a 65 78 70 72  tatic Expr *expr
6e20: 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  Dup(sqlite3 *db,
6e30: 20 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c   Expr *p, int fl
6e40: 61 67 73 2c 20 75 38 20 2a 2a 70 7a 42 75 66 66  ags, u8 **pzBuff
6e50: 65 72 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65  er){.  Expr *pNe
6e60: 77 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  w = 0;          
6e70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
6e80: 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20 2a  alue to return *
6e90: 2f 0a 20 20 61 73 73 65 72 74 28 20 66 6c 61 67  /.  assert( flag
6ea0: 73 3d 3d 30 20 7c 7c 20 66 6c 61 67 73 3d 3d 45  s==0 || flags==E
6eb0: 58 50 52 44 55 50 5f 52 45 44 55 43 45 20 29 3b  XPRDUP_REDUCE );
6ec0: 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
6ed0: 63 6f 6e 73 74 20 69 6e 74 20 69 73 52 65 64 75  const int isRedu
6ee0: 63 65 64 20 3d 20 28 66 6c 61 67 73 26 45 58 50  ced = (flags&EXP
6ef0: 52 44 55 50 5f 52 45 44 55 43 45 29 3b 0a 20 20  RDUP_REDUCE);.  
6f00: 20 20 75 38 20 2a 7a 41 6c 6c 6f 63 3b 0a 20 20    u8 *zAlloc;.  
6f10: 20 20 75 33 32 20 73 74 61 74 69 63 46 6c 61 67    u32 staticFlag
6f20: 20 3d 20 30 3b 0a 0a 20 20 20 20 61 73 73 65 72   = 0;..    asser
6f30: 74 28 20 70 7a 42 75 66 66 65 72 3d 3d 30 20 7c  t( pzBuffer==0 |
6f40: 7c 20 69 73 52 65 64 75 63 65 64 20 29 3b 0a 0a  | isReduced );..
6f50: 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75      /* Figure ou
6f60: 74 20 77 68 65 72 65 20 74 6f 20 77 72 69 74 65  t where to write
6f70: 20 74 68 65 20 6e 65 77 20 45 78 70 72 20 73 74   the new Expr st
6f80: 72 75 63 74 75 72 65 2e 20 2a 2f 0a 20 20 20 20  ructure. */.    
6f90: 69 66 28 20 70 7a 42 75 66 66 65 72 20 29 7b 0a  if( pzBuffer ){.
6fa0: 20 20 20 20 20 20 7a 41 6c 6c 6f 63 20 3d 20 2a        zAlloc = *
6fb0: 70 7a 42 75 66 66 65 72 3b 0a 20 20 20 20 20 20  pzBuffer;.      
6fc0: 73 74 61 74 69 63 46 6c 61 67 20 3d 20 45 50 5f  staticFlag = EP_
6fd0: 53 74 61 74 69 63 3b 0a 20 20 20 20 7d 65 6c 73  Static;.    }els
6fe0: 65 7b 0a 20 20 20 20 20 20 7a 41 6c 6c 6f 63 20  e{.      zAlloc 
6ff0: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
7000: 63 52 61 77 28 64 62 2c 20 64 75 70 65 64 45 78  cRaw(db, dupedEx
7010: 70 72 53 69 7a 65 28 70 2c 20 66 6c 61 67 73 29  prSize(p, flags)
7020: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e 65  );.    }.    pNe
7030: 77 20 3d 20 28 45 78 70 72 20 2a 29 7a 41 6c 6c  w = (Expr *)zAll
7040: 6f 63 3b 0a 0a 20 20 20 20 69 66 28 20 70 4e 65  oc;..    if( pNe
7050: 77 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 53 65  w ){.      /* Se
7060: 74 20 6e 4e 65 77 53 69 7a 65 20 74 6f 20 74 68  t nNewSize to th
7070: 65 20 73 69 7a 65 20 61 6c 6c 6f 63 61 74 65 64  e size allocated
7080: 20 66 6f 72 20 74 68 65 20 73 74 72 75 63 74 75   for the structu
7090: 72 65 20 70 6f 69 6e 74 65 64 20 74 6f 0a 20 20  re pointed to.  
70a0: 20 20 20 20 2a 2a 20 62 79 20 70 4e 65 77 2e 20      ** by pNew. 
70b0: 54 68 69 73 20 69 73 20 65 69 74 68 65 72 20 45  This is either E
70c0: 58 50 52 5f 46 55 4c 4c 53 49 5a 45 2c 20 45 58  XPR_FULLSIZE, EX
70d0: 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45 20 6f  PR_REDUCEDSIZE o
70e0: 72 0a 20 20 20 20 20 20 2a 2a 20 45 58 50 52 5f  r.      ** EXPR_
70f0: 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 2e 20 6e  TOKENONLYSIZE. n
7100: 54 6f 6b 65 6e 20 69 73 20 73 65 74 20 74 6f 20  Token is set to 
7110: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
7120: 74 65 73 20 63 6f 6e 73 75 6d 65 64 0a 20 20 20  tes consumed.   
7130: 20 20 20 2a 2a 20 62 79 20 74 68 65 20 63 6f 70     ** by the cop
7140: 79 20 6f 66 20 74 68 65 20 70 2d 3e 75 2e 7a 54  y of the p->u.zT
7150: 6f 6b 65 6e 20 73 74 72 69 6e 67 20 28 69 66 20  oken string (if 
7160: 61 6e 79 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  any)..      */. 
7170: 20 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67       const unsig
7180: 6e 65 64 20 6e 53 74 72 75 63 74 53 69 7a 65 20  ned nStructSize 
7190: 3d 20 64 75 70 65 64 45 78 70 72 53 74 72 75 63  = dupedExprStruc
71a0: 74 53 69 7a 65 28 70 2c 20 66 6c 61 67 73 29 3b  tSize(p, flags);
71b0: 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74  .      const int
71c0: 20 6e 4e 65 77 53 69 7a 65 20 3d 20 6e 53 74 72   nNewSize = nStr
71d0: 75 63 74 53 69 7a 65 20 26 20 30 78 66 66 66 3b  uctSize & 0xfff;
71e0: 0a 20 20 20 20 20 20 69 6e 74 20 6e 54 6f 6b 65  .      int nToke
71f0: 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 21 45 78  n;.      if( !Ex
7200: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
7210: 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 26 26   EP_IntValue) &&
7220: 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 29 7b 0a   p->u.zToken ){.
7230: 20 20 20 20 20 20 20 20 6e 54 6f 6b 65 6e 20 3d          nToken =
7240: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
7250: 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 20 2b 20  (p->u.zToken) + 
7260: 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  1;.      }else{.
7270: 20 20 20 20 20 20 20 20 6e 54 6f 6b 65 6e 20 3d          nToken =
7280: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
7290: 20 20 69 66 28 20 69 73 52 65 64 75 63 65 64 20    if( isReduced 
72a0: 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
72b0: 74 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  t( ExprHasProper
72c0: 74 79 28 70 2c 20 45 50 5f 52 65 64 75 63 65 64  ty(p, EP_Reduced
72d0: 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  )==0 );.        
72e0: 6d 65 6d 63 70 79 28 7a 41 6c 6c 6f 63 2c 20 70  memcpy(zAlloc, p
72f0: 2c 20 6e 4e 65 77 53 69 7a 65 29 3b 0a 20 20 20  , nNewSize);.   
7300: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
7310: 20 20 75 33 32 20 6e 53 69 7a 65 20 3d 20 28 75    u32 nSize = (u
7320: 33 32 29 65 78 70 72 53 74 72 75 63 74 53 69 7a  32)exprStructSiz
7330: 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 6d 65  e(p);.        me
7340: 6d 63 70 79 28 7a 41 6c 6c 6f 63 2c 20 70 2c 20  mcpy(zAlloc, p, 
7350: 6e 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20  nSize);.        
7360: 69 66 28 20 6e 53 69 7a 65 3c 45 58 50 52 5f 46  if( nSize<EXPR_F
7370: 55 4c 4c 53 49 5a 45 20 29 7b 20 0a 20 20 20 20  ULLSIZE ){ .    
7380: 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 7a 41        memset(&zA
7390: 6c 6c 6f 63 5b 6e 53 69 7a 65 5d 2c 20 30 2c 20  lloc[nSize], 0, 
73a0: 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 2d 6e 53  EXPR_FULLSIZE-nS
73b0: 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ize);.        }.
73c0: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
73d0: 2a 20 53 65 74 20 74 68 65 20 45 50 5f 52 65 64  * Set the EP_Red
73e0: 75 63 65 64 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e  uced, EP_TokenOn
73f0: 6c 79 2c 20 61 6e 64 20 45 50 5f 53 74 61 74 69  ly, and EP_Stati
7400: 63 20 66 6c 61 67 73 20 61 70 70 72 6f 70 72 69  c flags appropri
7410: 61 74 65 6c 79 2e 20 2a 2f 0a 20 20 20 20 20 20  ately. */.      
7420: 70 4e 65 77 2d 3e 66 6c 61 67 73 20 26 3d 20 7e  pNew->flags &= ~
7430: 28 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f 54  (EP_Reduced|EP_T
7440: 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 53 74 61 74  okenOnly|EP_Stat
7450: 69 63 7c 45 50 5f 4d 65 6d 54 6f 6b 65 6e 29 3b  ic|EP_MemToken);
7460: 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61  .      pNew->fla
7470: 67 73 20 7c 3d 20 6e 53 74 72 75 63 74 53 69 7a  gs |= nStructSiz
7480: 65 20 26 20 28 45 50 5f 52 65 64 75 63 65 64 7c  e & (EP_Reduced|
7490: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 3b 0a 20  EP_TokenOnly);. 
74a0: 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73       pNew->flags
74b0: 20 7c 3d 20 73 74 61 74 69 63 46 6c 61 67 3b 0a   |= staticFlag;.
74c0: 0a 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 74  .      /* Copy t
74d0: 68 65 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 73  he p->u.zToken s
74e0: 74 72 69 6e 67 2c 20 69 66 20 61 6e 79 2e 20 2a  tring, if any. *
74f0: 2f 0a 20 20 20 20 20 20 69 66 28 20 6e 54 6f 6b  /.      if( nTok
7500: 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68  en ){.        ch
7510: 61 72 20 2a 7a 54 6f 6b 65 6e 20 3d 20 70 4e 65  ar *zToken = pNe
7520: 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 3d 20 28 63  w->u.zToken = (c
7530: 68 61 72 2a 29 26 7a 41 6c 6c 6f 63 5b 6e 4e 65  har*)&zAlloc[nNe
7540: 77 53 69 7a 65 5d 3b 0a 20 20 20 20 20 20 20 20  wSize];.        
7550: 6d 65 6d 63 70 79 28 7a 54 6f 6b 65 6e 2c 20 70  memcpy(zToken, p
7560: 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 6e 54 6f 6b  ->u.zToken, nTok
7570: 65 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  en);.      }..  
7580: 20 20 20 20 69 66 28 20 30 3d 3d 28 28 70 2d 3e      if( 0==((p->
7590: 66 6c 61 67 73 7c 70 4e 65 77 2d 3e 66 6c 61 67  flags|pNew->flag
75a0: 73 29 20 26 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  s) & EP_TokenOnl
75b0: 79 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  y) ){.        /*
75c0: 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 70 4e 65   Fill in the pNe
75d0: 77 2d 3e 78 2e 70 53 65 6c 65 63 74 20 6f 72 20  w->x.pSelect or 
75e0: 70 4e 65 77 2d 3e 78 2e 70 4c 69 73 74 20 6d 65  pNew->x.pList me
75f0: 6d 62 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20  mber. */.       
7600: 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
7610: 65 72 74 79 28 70 2c 20 45 50 5f 78 49 73 53 65  erty(p, EP_xIsSe
7620: 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20 20  lect) ){.       
7630: 20 20 20 70 4e 65 77 2d 3e 78 2e 70 53 65 6c 65     pNew->x.pSele
7640: 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  ct = sqlite3Sele
7650: 63 74 44 75 70 28 64 62 2c 20 70 2d 3e 78 2e 70  ctDup(db, p->x.p
7660: 53 65 6c 65 63 74 2c 20 69 73 52 65 64 75 63 65  Select, isReduce
7670: 64 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  d);.        }els
7680: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65  e{.          pNe
7690: 77 2d 3e 78 2e 70 4c 69 73 74 20 3d 20 73 71 6c  w->x.pList = sql
76a0: 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
76b0: 64 62 2c 20 70 2d 3e 78 2e 70 4c 69 73 74 2c 20  db, p->x.pList, 
76c0: 69 73 52 65 64 75 63 65 64 29 3b 0a 20 20 20 20  isReduced);.    
76d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20      }.      }.. 
76e0: 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20       /* Fill in 
76f0: 70 4e 65 77 2d 3e 70 4c 65 66 74 20 61 6e 64 20  pNew->pLeft and 
7700: 70 4e 65 77 2d 3e 70 52 69 67 68 74 2e 20 2a 2f  pNew->pRight. */
7710: 0a 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48  .      if( ExprH
7720: 61 73 50 72 6f 70 65 72 74 79 28 70 4e 65 77 2c  asProperty(pNew,
7730: 20 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f 54   EP_Reduced|EP_T
7740: 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20 20  okenOnly) ){.   
7750: 20 20 20 20 20 7a 41 6c 6c 6f 63 20 2b 3d 20 64       zAlloc += d
7760: 75 70 65 64 45 78 70 72 4e 6f 64 65 53 69 7a 65  upedExprNodeSize
7770: 28 70 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20  (p, flags);.    
7780: 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50      if( ExprHasP
7790: 72 6f 70 65 72 74 79 28 70 4e 65 77 2c 20 45 50  roperty(pNew, EP
77a0: 5f 52 65 64 75 63 65 64 29 20 29 7b 0a 20 20 20  _Reduced) ){.   
77b0: 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 4c 65         pNew->pLe
77c0: 66 74 20 3d 20 65 78 70 72 44 75 70 28 64 62 2c  ft = exprDup(db,
77d0: 20 70 2d 3e 70 4c 65 66 74 2c 20 45 58 50 52 44   p->pLeft, EXPRD
77e0: 55 50 5f 52 45 44 55 43 45 2c 20 26 7a 41 6c 6c  UP_REDUCE, &zAll
77f0: 6f 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  oc);.          p
7800: 4e 65 77 2d 3e 70 52 69 67 68 74 20 3d 20 65 78  New->pRight = ex
7810: 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 52 69  prDup(db, p->pRi
7820: 67 68 74 2c 20 45 58 50 52 44 55 50 5f 52 45 44  ght, EXPRDUP_RED
7830: 55 43 45 2c 20 26 7a 41 6c 6c 6f 63 29 3b 0a 20  UCE, &zAlloc);. 
7840: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
7850: 20 69 66 28 20 70 7a 42 75 66 66 65 72 20 29 7b   if( pzBuffer ){
7860: 0a 20 20 20 20 20 20 20 20 20 20 2a 70 7a 42 75  .          *pzBu
7870: 66 66 65 72 20 3d 20 7a 41 6c 6c 6f 63 3b 0a 20  ffer = zAlloc;. 
7880: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
7890: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66  else{.        if
78a0: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
78b0: 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e  ty(p, EP_TokenOn
78c0: 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ly) ){.         
78d0: 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20 73   pNew->pLeft = s
78e0: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
78f0: 2c 20 70 2d 3e 70 4c 65 66 74 2c 20 30 29 3b 0a  , p->pLeft, 0);.
7900: 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
7910: 70 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33  pRight = sqlite3
7920: 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70  ExprDup(db, p->p
7930: 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 20 20 20  Right, 0);.     
7940: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20     }.      }..  
7950: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
7960: 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pNew;.}../*.** 
7970: 43 72 65 61 74 65 20 61 6e 64 20 72 65 74 75 72  Create and retur
7980: 6e 20 61 20 64 65 65 70 20 63 6f 70 79 20 6f 66  n a deep copy of
7990: 20 74 68 65 20 6f 62 6a 65 63 74 20 70 61 73 73   the object pass
79a0: 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
79b0: 20 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 20 49   .** argument. I
79c0: 66 20 61 6e 20 4f 4f 4d 20 63 6f 6e 64 69 74 69  f an OOM conditi
79d0: 6f 6e 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  on is encountere
79e0: 64 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72  d, NULL is retur
79f0: 6e 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64  ned.** and the d
7a00: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
7a10: 66 6c 61 67 20 73 65 74 2e 0a 2a 2f 0a 23 69 66  flag set..*/.#if
7a20: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
7a30: 5f 43 54 45 0a 73 74 61 74 69 63 20 57 69 74 68  _CTE.static With
7a40: 20 2a 77 69 74 68 44 75 70 28 73 71 6c 69 74 65   *withDup(sqlite
7a50: 33 20 2a 64 62 2c 20 57 69 74 68 20 2a 70 29 7b  3 *db, With *p){
7a60: 0a 20 20 57 69 74 68 20 2a 70 52 65 74 20 3d 20  .  With *pRet = 
7a70: 30 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  0;.  if( p ){.  
7a80: 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 73 69    int nByte = si
7a90: 7a 65 6f 66 28 2a 70 29 20 2b 20 73 69 7a 65 6f  zeof(*p) + sizeo
7aa0: 66 28 70 2d 3e 61 5b 30 5d 29 20 2a 20 28 70 2d  f(p->a[0]) * (p-
7ab0: 3e 6e 43 74 65 2d 31 29 3b 0a 20 20 20 20 70 52  >nCte-1);.    pR
7ac0: 65 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  et = sqlite3DbMa
7ad0: 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79  llocZero(db, nBy
7ae0: 74 65 29 3b 0a 20 20 20 20 69 66 28 20 70 52 65  te);.    if( pRe
7af0: 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  t ){.      int i
7b00: 3b 0a 20 20 20 20 20 20 70 52 65 74 2d 3e 6e 43  ;.      pRet->nC
7b10: 74 65 20 3d 20 70 2d 3e 6e 43 74 65 3b 0a 20 20  te = p->nCte;.  
7b20: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
7b30: 2d 3e 6e 43 74 65 3b 20 69 2b 2b 29 7b 0a 20 20  ->nCte; i++){.  
7b40: 20 20 20 20 20 20 70 52 65 74 2d 3e 61 5b 69 5d        pRet->a[i]
7b50: 2e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74  .pSelect = sqlit
7b60: 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20  e3SelectDup(db, 
7b70: 70 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74 2c  p->a[i].pSelect,
7b80: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 52 65   0);.        pRe
7b90: 74 2d 3e 61 5b 69 5d 2e 70 43 6f 6c 73 20 3d 20  t->a[i].pCols = 
7ba0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
7bb0: 75 70 28 64 62 2c 20 70 2d 3e 61 5b 69 5d 2e 70  up(db, p->a[i].p
7bc0: 43 6f 6c 73 2c 20 30 29 3b 0a 20 20 20 20 20 20  Cols, 0);.      
7bd0: 20 20 70 52 65 74 2d 3e 61 5b 69 5d 2e 7a 4e 61    pRet->a[i].zNa
7be0: 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  me = sqlite3DbSt
7bf0: 72 44 75 70 28 64 62 2c 20 70 2d 3e 61 5b 69 5d  rDup(db, p->a[i]
7c00: 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d  .zName);.      }
7c10: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
7c20: 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 23 65 6c 73  urn pRet;.}.#els
7c30: 65 0a 23 20 64 65 66 69 6e 65 20 77 69 74 68 44  e.# define withD
7c40: 75 70 28 78 2c 79 29 20 30 0a 23 65 6e 64 69 66  up(x,y) 0.#endif
7c50: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
7c60: 6f 77 69 6e 67 20 67 72 6f 75 70 20 6f 66 20 72  owing group of r
7c70: 6f 75 74 69 6e 65 73 20 6d 61 6b 65 20 64 65 65  outines make dee
7c80: 70 20 63 6f 70 69 65 73 20 6f 66 20 65 78 70 72  p copies of expr
7c90: 65 73 73 69 6f 6e 73 2c 0a 2a 2a 20 65 78 70 72  essions,.** expr
7ca0: 65 73 73 69 6f 6e 20 6c 69 73 74 73 2c 20 49 44  ession lists, ID
7cb0: 20 6c 69 73 74 73 2c 20 61 6e 64 20 73 65 6c 65   lists, and sele
7cc0: 63 74 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 20  ct statements.  
7cd0: 54 68 65 20 63 6f 70 69 65 73 20 63 61 6e 0a 2a  The copies can.*
7ce0: 2a 20 62 65 20 64 65 6c 65 74 65 64 20 28 62 79  * be deleted (by
7cf0: 20 62 65 69 6e 67 20 70 61 73 73 65 64 20 74 6f   being passed to
7d00: 20 74 68 65 69 72 20 72 65 73 70 65 63 74 69 76   their respectiv
7d10: 65 20 2e 2e 2e 44 65 6c 65 74 65 28 29 20 72 6f  e ...Delete() ro
7d20: 75 74 69 6e 65 73 29 0a 2a 2a 20 77 69 74 68 6f  utines).** witho
7d30: 75 74 20 65 66 66 65 63 74 69 6e 67 20 74 68 65  ut effecting the
7d40: 20 6f 72 69 67 69 6e 61 6c 73 2e 0a 2a 2a 0a 2a   originals..**.*
7d50: 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * The expression
7d60: 20 6c 69 73 74 2c 20 49 44 2c 20 61 6e 64 20 73   list, ID, and s
7d70: 6f 75 72 63 65 20 6c 69 73 74 73 20 72 65 74 75  ource lists retu
7d80: 72 6e 20 62 79 20 73 71 6c 69 74 65 33 45 78 70  rn by sqlite3Exp
7d90: 72 4c 69 73 74 44 75 70 28 29 2c 0a 2a 2a 20 73  rListDup(),.** s
7da0: 71 6c 69 74 65 33 49 64 4c 69 73 74 44 75 70 28  qlite3IdListDup(
7db0: 29 2c 20 61 6e 64 20 73 71 6c 69 74 65 33 53 72  ), and sqlite3Sr
7dc0: 63 4c 69 73 74 44 75 70 28 29 20 63 61 6e 20 6e  cListDup() can n
7dd0: 6f 74 20 62 65 20 66 75 72 74 68 65 72 20 65 78  ot be further ex
7de0: 70 61 6e 64 65 64 20 0a 2a 2a 20 62 79 20 73 75  panded .** by su
7df0: 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74  bsequent calls t
7e00: 6f 20 73 71 6c 69 74 65 2a 4c 69 73 74 41 70 70  o sqlite*ListApp
7e10: 65 6e 64 28 29 20 72 6f 75 74 69 6e 65 73 2e 0a  end() routines..
7e20: 2a 2a 0a 2a 2a 20 41 6e 79 20 74 61 62 6c 65 73  **.** Any tables
7e30: 20 74 68 61 74 20 74 68 65 20 53 72 63 4c 69 73   that the SrcLis
7e40: 74 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f  t might point to
7e50: 20 61 72 65 20 6e 6f 74 20 64 75 70 6c 69 63 61   are not duplica
7e60: 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  ted..**.** The f
7e70: 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 20 63  lags parameter c
7e80: 6f 6e 74 61 69 6e 73 20 61 20 63 6f 6d 62 69 6e  ontains a combin
7e90: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 45 58 50  ation of the EXP
7ea0: 52 44 55 50 5f 58 58 58 20 66 6c 61 67 73 2e 0a  RDUP_XXX flags..
7eb0: 2a 2a 20 49 66 20 74 68 65 20 45 58 50 52 44 55  ** If the EXPRDU
7ec0: 50 5f 52 45 44 55 43 45 20 66 6c 61 67 20 69 73  P_REDUCE flag is
7ed0: 20 73 65 74 2c 20 74 68 65 6e 20 74 68 65 20 73   set, then the s
7ee0: 74 72 75 63 74 75 72 65 20 72 65 74 75 72 6e 65  tructure returne
7ef0: 64 20 69 73 20 61 0a 2a 2a 20 74 72 75 6e 63 61  d is a.** trunca
7f00: 74 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 74  ted version of t
7f10: 68 65 20 75 73 75 61 6c 20 45 78 70 72 20 73 74  he usual Expr st
7f20: 72 75 63 74 75 72 65 20 74 68 61 74 20 77 69 6c  ructure that wil
7f30: 6c 20 62 65 20 73 74 6f 72 65 64 20 61 73 0a 2a  l be stored as.*
7f40: 2a 20 70 61 72 74 20 6f 66 20 74 68 65 20 69 6e  * part of the in
7f50: 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65 73 65 6e  -memory represen
7f60: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 61  tation of the da
7f70: 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 0a 2a  tabase schema..*
7f80: 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45  /.Expr *sqlite3E
7f90: 78 70 72 44 75 70 28 73 71 6c 69 74 65 33 20 2a  xprDup(sqlite3 *
7fa0: 64 62 2c 20 45 78 70 72 20 2a 70 2c 20 69 6e 74  db, Expr *p, int
7fb0: 20 66 6c 61 67 73 29 7b 0a 20 20 61 73 73 65 72   flags){.  asser
7fc0: 74 28 20 66 6c 61 67 73 3d 3d 30 20 7c 7c 20 66  t( flags==0 || f
7fd0: 6c 61 67 73 3d 3d 45 58 50 52 44 55 50 5f 52 45  lags==EXPRDUP_RE
7fe0: 44 55 43 45 20 29 3b 0a 20 20 72 65 74 75 72 6e  DUCE );.  return
7ff0: 20 65 78 70 72 44 75 70 28 64 62 2c 20 70 2c 20   exprDup(db, p, 
8000: 66 6c 61 67 73 2c 20 30 29 3b 0a 7d 0a 45 78 70  flags, 0);.}.Exp
8010: 72 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 45 78  rList *sqlite3Ex
8020: 70 72 4c 69 73 74 44 75 70 28 73 71 6c 69 74 65  prListDup(sqlite
8030: 33 20 2a 64 62 2c 20 45 78 70 72 4c 69 73 74 20  3 *db, ExprList 
8040: 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a  *p, int flags){.
8050: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4e 65 77    ExprList *pNew
8060: 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c  ;.  struct ExprL
8070: 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 2c  ist_item *pItem,
8080: 20 2a 70 4f 6c 64 49 74 65 6d 3b 0a 20 20 69 6e   *pOldItem;.  in
8090: 74 20 69 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  t i;.  if( p==0 
80a0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e  ) return 0;.  pN
80b0: 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ew = sqlite3DbMa
80c0: 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65  llocRaw(db, size
80d0: 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20 69  of(*pNew) );.  i
80e0: 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74  f( pNew==0 ) ret
80f0: 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e  urn 0;.  pNew->n
8100: 45 78 70 72 20 3d 20 69 20 3d 20 70 2d 3e 6e 45  Expr = i = p->nE
8110: 78 70 72 3b 0a 20 20 69 66 28 20 28 66 6c 61 67  xpr;.  if( (flag
8120: 73 20 26 20 45 58 50 52 44 55 50 5f 52 45 44 55  s & EXPRDUP_REDU
8130: 43 45 29 3d 3d 30 20 29 20 66 6f 72 28 69 3d 31  CE)==0 ) for(i=1
8140: 3b 20 69 3c 70 2d 3e 6e 45 78 70 72 3b 20 69 2b  ; i<p->nExpr; i+
8150: 3d 69 29 7b 7d 0a 20 20 70 4e 65 77 2d 3e 61 20  =i){}.  pNew->a 
8160: 3d 20 70 49 74 65 6d 20 3d 20 73 71 6c 69 74 65  = pItem = sqlite
8170: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c  3DbMallocRaw(db,
8180: 20 20 69 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 5b    i*sizeof(p->a[
8190: 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 70 49 74  0]) );.  if( pIt
81a0: 65 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  em==0 ){.    sql
81b0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
81c0: 4e 65 77 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  New);.    return
81d0: 20 30 3b 0a 20 20 7d 20 0a 20 20 70 4f 6c 64 49   0;.  } .  pOldI
81e0: 74 65 6d 20 3d 20 70 2d 3e 61 3b 0a 20 20 66 6f  tem = p->a;.  fo
81f0: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 45 78 70  r(i=0; i<p->nExp
8200: 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 2c  r; i++, pItem++,
8210: 20 70 4f 6c 64 49 74 65 6d 2b 2b 29 7b 0a 20 20   pOldItem++){.  
8220: 20 20 45 78 70 72 20 2a 70 4f 6c 64 45 78 70 72    Expr *pOldExpr
8230: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 45 78   = pOldItem->pEx
8240: 70 72 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 70  pr;.    pItem->p
8250: 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78  Expr = sqlite3Ex
8260: 70 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 45 78  prDup(db, pOldEx
8270: 70 72 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20  pr, flags);.    
8280: 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73  pItem->zName = s
8290: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
82a0: 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61  b, pOldItem->zNa
82b0: 6d 65 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e  me);.    pItem->
82c0: 7a 53 70 61 6e 20 3d 20 73 71 6c 69 74 65 33 44  zSpan = sqlite3D
82d0: 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64  bStrDup(db, pOld
82e0: 49 74 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a 20 20  Item->zSpan);.  
82f0: 20 20 70 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64    pItem->sortOrd
8300: 65 72 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 73  er = pOldItem->s
8310: 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 70 49  ortOrder;.    pI
8320: 74 65 6d 2d 3e 64 6f 6e 65 20 3d 20 30 3b 0a 20  tem->done = 0;. 
8330: 20 20 20 70 49 74 65 6d 2d 3e 62 53 70 61 6e 49     pItem->bSpanI
8340: 73 54 61 62 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  sTab = pOldItem-
8350: 3e 62 53 70 61 6e 49 73 54 61 62 3b 0a 20 20 20  >bSpanIsTab;.   
8360: 20 70 49 74 65 6d 2d 3e 75 20 3d 20 70 4f 6c 64   pItem->u = pOld
8370: 49 74 65 6d 2d 3e 75 3b 0a 20 20 7d 0a 20 20 72  Item->u;.  }.  r
8380: 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f  eturn pNew;.}../
8390: 2a 0a 2a 2a 20 49 66 20 63 75 72 73 6f 72 73 2c  *.** If cursors,
83a0: 20 74 72 69 67 67 65 72 73 2c 20 76 69 65 77 73   triggers, views
83b0: 20 61 6e 64 20 73 75 62 71 75 65 72 69 65 73 20   and subqueries 
83c0: 61 72 65 20 61 6c 6c 20 6f 6d 69 74 74 65 64 20  are all omitted 
83d0: 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 62 75 69 6c  from.** the buil
83e0: 64 2c 20 74 68 65 6e 20 6e 6f 6e 65 20 6f 66 20  d, then none of 
83f0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f  the following ro
8400: 75 74 69 6e 65 73 2c 20 65 78 63 65 70 74 20 66  utines, except f
8410: 6f 72 20 0a 2a 2a 20 73 71 6c 69 74 65 33 53 65  or .** sqlite3Se
8420: 6c 65 63 74 44 75 70 28 29 2c 20 63 61 6e 20 62  lectDup(), can b
8430: 65 20 63 61 6c 6c 65 64 2e 20 73 71 6c 69 74 65  e called. sqlite
8440: 33 53 65 6c 65 63 74 44 75 70 28 29 20 69 73 20  3SelectDup() is 
8450: 73 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20 63 61 6c  sometimes.** cal
8460: 6c 65 64 20 77 69 74 68 20 61 20 4e 55 4c 4c 20  led with a NULL 
8470: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 23 69 66  argument..*/.#if
8480: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
8490: 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21  _OMIT_VIEW) || !
84a0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
84b0: 4d 49 54 5f 54 52 49 47 47 45 52 29 20 5c 0a 20  MIT_TRIGGER) \. 
84c0: 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
84d0: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
84e0: 29 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c 69 74  ).SrcList *sqlit
84f0: 65 33 53 72 63 4c 69 73 74 44 75 70 28 73 71 6c  e3SrcListDup(sql
8500: 69 74 65 33 20 2a 64 62 2c 20 53 72 63 4c 69 73  ite3 *db, SrcLis
8510: 74 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29  t *p, int flags)
8520: 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 4e 65  {.  SrcList *pNe
8530: 77 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  w;.  int i;.  in
8540: 74 20 6e 42 79 74 65 3b 0a 20 20 69 66 28 20 70  t nByte;.  if( p
8550: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
8560: 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66    nByte = sizeof
8570: 28 2a 70 29 20 2b 20 28 70 2d 3e 6e 53 72 63 3e  (*p) + (p->nSrc>
8580: 30 20 3f 20 73 69 7a 65 6f 66 28 70 2d 3e 61 5b  0 ? sizeof(p->a[
8590: 30 5d 29 20 2a 20 28 70 2d 3e 6e 53 72 63 2d 31  0]) * (p->nSrc-1
85a0: 29 20 3a 20 30 29 3b 0a 20 20 70 4e 65 77 20 3d  ) : 0);.  pNew =
85b0: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
85c0: 52 61 77 28 64 62 2c 20 6e 42 79 74 65 20 29 3b  Raw(db, nByte );
85d0: 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29  .  if( pNew==0 )
85e0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65   return 0;.  pNe
85f0: 77 2d 3e 6e 53 72 63 20 3d 20 70 4e 65 77 2d 3e  w->nSrc = pNew->
8600: 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 53 72 63  nAlloc = p->nSrc
8610: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
8620: 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20  ->nSrc; i++){.  
8630: 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
8640: 5f 69 74 65 6d 20 2a 70 4e 65 77 49 74 65 6d 20  _item *pNewItem 
8650: 3d 20 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b 0a 20  = &pNew->a[i];. 
8660: 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73     struct SrcLis
8670: 74 5f 69 74 65 6d 20 2a 70 4f 6c 64 49 74 65 6d  t_item *pOldItem
8680: 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20   = &p->a[i];.   
8690: 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
86a0: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 53 63 68    pNewItem->pSch
86b0: 65 6d 61 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e  ema = pOldItem->
86c0: 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 70 4e 65  pSchema;.    pNe
86d0: 77 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65  wItem->zDatabase
86e0: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
86f0: 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d  up(db, pOldItem-
8700: 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20  >zDatabase);.   
8710: 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61 6d 65   pNewItem->zName
8720: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
8730: 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d  up(db, pOldItem-
8740: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65  >zName);.    pNe
8750: 77 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20  wItem->zAlias = 
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 41  db, pOldItem->zA
8780: 6c 69 61 73 29 3b 0a 20 20 20 20 70 4e 65 77 49  lias);.    pNewI
8790: 74 65 6d 2d 3e 66 67 20 3d 20 70 4f 6c 64 49 74  tem->fg = pOldIt
87a0: 65 6d 2d 3e 66 67 3b 0a 20 20 20 20 70 4e 65 77  em->fg;.    pNew
87b0: 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 3d 20  Item->iCursor = 
87c0: 70 4f 6c 64 49 74 65 6d 2d 3e 69 43 75 72 73 6f  pOldItem->iCurso
87d0: 72 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  r;.    pNewItem-
87e0: 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 3d 20 70  >addrFillSub = p
87f0: 4f 6c 64 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c  OldItem->addrFil
8800: 6c 53 75 62 3b 0a 20 20 20 20 70 4e 65 77 49 74  lSub;.    pNewIt
8810: 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 20 3d 20  em->regReturn = 
8820: 70 4f 6c 64 49 74 65 6d 2d 3e 72 65 67 52 65 74  pOldItem->regRet
8830: 75 72 6e 3b 0a 20 20 20 20 69 66 28 20 70 4e 65  urn;.    if( pNe
8840: 77 49 74 65 6d 2d 3e 66 67 2e 69 73 49 6e 64 65  wItem->fg.isInde
8850: 78 65 64 42 79 20 29 7b 0a 20 20 20 20 20 20 70  xedBy ){.      p
8860: 4e 65 77 49 74 65 6d 2d 3e 75 31 2e 7a 49 6e 64  NewItem->u1.zInd
8870: 65 78 65 64 42 79 20 3d 20 73 71 6c 69 74 65 33  exedBy = sqlite3
8880: 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c  DbStrDup(db, pOl
8890: 64 49 74 65 6d 2d 3e 75 31 2e 7a 49 6e 64 65 78  dItem->u1.zIndex
88a0: 65 64 42 79 29 3b 0a 20 20 20 20 7d 0a 20 20 20  edBy);.    }.   
88b0: 20 70 4e 65 77 49 74 65 6d 2d 3e 70 49 42 49 6e   pNewItem->pIBIn
88c0: 64 65 78 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e  dex = pOldItem->
88d0: 70 49 42 49 6e 64 65 78 3b 0a 20 20 20 20 69 66  pIBIndex;.    if
88e0: 28 20 70 4e 65 77 49 74 65 6d 2d 3e 66 67 2e 69  ( pNewItem->fg.i
88f0: 73 54 61 62 46 75 6e 63 20 29 7b 0a 20 20 20 20  sTabFunc ){.    
8900: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 75 31 2e 70    pNewItem->u1.p
8910: 46 75 6e 63 41 72 67 20 3d 20 0a 20 20 20 20 20  FuncArg = .     
8920: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
8930: 4c 69 73 74 44 75 70 28 64 62 2c 20 70 4f 6c 64  ListDup(db, pOld
8940: 49 74 65 6d 2d 3e 75 31 2e 70 46 75 6e 63 41 72  Item->u1.pFuncAr
8950: 67 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 7d  g, flags);.    }
8960: 0a 20 20 20 20 70 54 61 62 20 3d 20 70 4e 65 77  .    pTab = pNew
8970: 49 74 65 6d 2d 3e 70 54 61 62 20 3d 20 70 4f 6c  Item->pTab = pOl
8980: 64 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20  dItem->pTab;.   
8990: 20 69 66 28 20 70 54 61 62 20 29 7b 0a 20 20 20   if( pTab ){.   
89a0: 20 20 20 70 54 61 62 2d 3e 6e 52 65 66 2b 2b 3b     pTab->nRef++;
89b0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e 65 77 49  .    }.    pNewI
89c0: 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73  tem->pSelect = s
89d0: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28  qlite3SelectDup(
89e0: 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 53  db, pOldItem->pS
89f0: 65 6c 65 63 74 2c 20 66 6c 61 67 73 29 3b 0a 20  elect, flags);. 
8a00: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 4f 6e     pNewItem->pOn
8a10: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
8a20: 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e  p(db, pOldItem->
8a30: 70 4f 6e 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20  pOn, flags);.   
8a40: 20 70 4e 65 77 49 74 65 6d 2d 3e 70 55 73 69 6e   pNewItem->pUsin
8a50: 67 20 3d 20 73 71 6c 69 74 65 33 49 64 4c 69 73  g = sqlite3IdLis
8a60: 74 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65  tDup(db, pOldIte
8a70: 6d 2d 3e 70 55 73 69 6e 67 29 3b 0a 20 20 20 20  m->pUsing);.    
8a80: 70 4e 65 77 49 74 65 6d 2d 3e 63 6f 6c 55 73 65  pNewItem->colUse
8a90: 64 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 63 6f  d = pOldItem->co
8aa0: 6c 55 73 65 64 3b 0a 20 20 7d 0a 20 20 72 65 74  lUsed;.  }.  ret
8ab0: 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 49 64 4c 69  urn pNew;.}.IdLi
8ac0: 73 74 20 2a 73 71 6c 69 74 65 33 49 64 4c 69 73  st *sqlite3IdLis
8ad0: 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62  tDup(sqlite3 *db
8ae0: 2c 20 49 64 4c 69 73 74 20 2a 70 29 7b 0a 20 20  , IdList *p){.  
8af0: 49 64 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20  IdList *pNew;.  
8b00: 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 3d 3d  int i;.  if( p==
8b10: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
8b20: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62  pNew = sqlite3Db
8b30: 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69  MallocRaw(db, si
8b40: 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20  zeof(*pNew) );. 
8b50: 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72   if( pNew==0 ) r
8b60: 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d  eturn 0;.  pNew-
8b70: 3e 6e 49 64 20 3d 20 70 2d 3e 6e 49 64 3b 0a 20  >nId = p->nId;. 
8b80: 20 70 4e 65 77 2d 3e 61 20 3d 20 73 71 6c 69 74   pNew->a = sqlit
8b90: 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62  e3DbMallocRaw(db
8ba0: 2c 20 70 2d 3e 6e 49 64 2a 73 69 7a 65 6f 66 28  , p->nId*sizeof(
8bb0: 70 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 69 66  p->a[0]) );.  if
8bc0: 28 20 70 4e 65 77 2d 3e 61 3d 3d 30 20 29 7b 0a  ( pNew->a==0 ){.
8bd0: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
8be0: 65 28 64 62 2c 20 70 4e 65 77 29 3b 0a 20 20 20  e(db, pNew);.   
8bf0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
8c00: 20 2f 2a 20 4e 6f 74 65 20 74 68 61 74 20 62 65   /* Note that be
8c10: 63 61 75 73 65 20 74 68 65 20 73 69 7a 65 20 6f  cause the size o
8c20: 66 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e  f the allocation
8c30: 20 66 6f 72 20 70 2d 3e 61 5b 5d 20 69 73 20 6e   for p->a[] is n
8c40: 6f 74 0a 20 20 2a 2a 20 6e 65 63 65 73 73 61 72  ot.  ** necessar
8c50: 69 6c 79 20 61 20 70 6f 77 65 72 20 6f 66 20 74  ily a power of t
8c60: 77 6f 2c 20 73 71 6c 69 74 65 33 49 64 4c 69 73  wo, sqlite3IdLis
8c70: 74 41 70 70 65 6e 64 28 29 20 6d 61 79 20 6e 6f  tAppend() may no
8c80: 74 20 62 65 20 63 61 6c 6c 65 64 0a 20 20 2a 2a  t be called.  **
8c90: 20 6f 6e 20 74 68 65 20 64 75 70 6c 69 63 61 74   on the duplicat
8ca0: 65 20 63 72 65 61 74 65 64 20 62 79 20 74 68 69  e created by thi
8cb0: 73 20 66 75 6e 63 74 69 6f 6e 2e 20 2a 2f 0a 20  s function. */. 
8cc0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
8cd0: 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74  Id; i++){.    st
8ce0: 72 75 63 74 20 49 64 4c 69 73 74 5f 69 74 65 6d  ruct IdList_item
8cf0: 20 2a 70 4e 65 77 49 74 65 6d 20 3d 20 26 70 4e   *pNewItem = &pN
8d00: 65 77 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 73 74  ew->a[i];.    st
8d10: 72 75 63 74 20 49 64 4c 69 73 74 5f 69 74 65 6d  ruct IdList_item
8d20: 20 2a 70 4f 6c 64 49 74 65 6d 20 3d 20 26 70 2d   *pOldItem = &p-
8d30: 3e 61 5b 69 5d 3b 0a 20 20 20 20 70 4e 65 77 49  >a[i];.    pNewI
8d40: 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c  tem->zName = sql
8d50: 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
8d60: 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65   pOldItem->zName
8d70: 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  );.    pNewItem-
8d80: 3e 69 64 78 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  >idx = pOldItem-
8d90: 3e 69 64 78 3b 0a 20 20 7d 0a 20 20 72 65 74 75  >idx;.  }.  retu
8da0: 72 6e 20 70 4e 65 77 3b 0a 7d 0a 53 65 6c 65 63  rn pNew;.}.Selec
8db0: 74 20 2a 73 71 6c 69 74 65 33 53 65 6c 65 63 74  t *sqlite3Select
8dc0: 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  Dup(sqlite3 *db,
8dd0: 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20   Select *p, int 
8de0: 66 6c 61 67 73 29 7b 0a 20 20 53 65 6c 65 63 74  flags){.  Select
8df0: 20 2a 70 4e 65 77 2c 20 2a 70 50 72 69 6f 72 3b   *pNew, *pPrior;
8e00: 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
8e10: 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d  turn 0;.  pNew =
8e20: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
8e30: 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a  Raw(db, sizeof(*
8e40: 70 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  p) );.  if( pNew
8e50: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
8e60: 20 20 70 4e 65 77 2d 3e 70 45 4c 69 73 74 20 3d    pNew->pEList =
8e70: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
8e80: 44 75 70 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73  Dup(db, p->pELis
8e90: 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65  t, flags);.  pNe
8ea0: 77 2d 3e 70 53 72 63 20 3d 20 73 71 6c 69 74 65  w->pSrc = sqlite
8eb0: 33 53 72 63 4c 69 73 74 44 75 70 28 64 62 2c 20  3SrcListDup(db, 
8ec0: 70 2d 3e 70 53 72 63 2c 20 66 6c 61 67 73 29 3b  p->pSrc, flags);
8ed0: 0a 20 20 70 4e 65 77 2d 3e 70 57 68 65 72 65 20  .  pNew->pWhere 
8ee0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
8ef0: 28 64 62 2c 20 70 2d 3e 70 57 68 65 72 65 2c 20  (db, p->pWhere, 
8f00: 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e  flags);.  pNew->
8f10: 70 47 72 6f 75 70 42 79 20 3d 20 73 71 6c 69 74  pGroupBy = sqlit
8f20: 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62  e3ExprListDup(db
8f30: 2c 20 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 66  , p->pGroupBy, f
8f40: 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 70  lags);.  pNew->p
8f50: 48 61 76 69 6e 67 20 3d 20 73 71 6c 69 74 65 33  Having = sqlite3
8f60: 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70  ExprDup(db, p->p
8f70: 48 61 76 69 6e 67 2c 20 66 6c 61 67 73 29 3b 0a  Having, flags);.
8f80: 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79    pNew->pOrderBy
8f90: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
8fa0: 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 4f 72  stDup(db, p->pOr
8fb0: 64 65 72 42 79 2c 20 66 6c 61 67 73 29 3b 0a 20  derBy, flags);. 
8fc0: 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 70 2d 3e 6f   pNew->op = p->o
8fd0: 70 3b 0a 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f  p;.  pNew->pPrio
8fe0: 72 20 3d 20 70 50 72 69 6f 72 20 3d 20 73 71 6c  r = pPrior = sql
8ff0: 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62  ite3SelectDup(db
9000: 2c 20 70 2d 3e 70 50 72 69 6f 72 2c 20 66 6c 61  , p->pPrior, fla
9010: 67 73 29 3b 0a 20 20 69 66 28 20 70 50 72 69 6f  gs);.  if( pPrio
9020: 72 20 29 20 70 50 72 69 6f 72 2d 3e 70 4e 65 78  r ) pPrior->pNex
9030: 74 20 3d 20 70 4e 65 77 3b 0a 20 20 70 4e 65 77  t = pNew;.  pNew
9040: 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 70  ->pNext = 0;.  p
9050: 4e 65 77 2d 3e 70 4c 69 6d 69 74 20 3d 20 73 71  New->pLimit = sq
9060: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
9070: 20 70 2d 3e 70 4c 69 6d 69 74 2c 20 66 6c 61 67   p->pLimit, flag
9080: 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 66 66  s);.  pNew->pOff
9090: 73 65 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  set = sqlite3Exp
90a0: 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 4f 66 66  rDup(db, p->pOff
90b0: 73 65 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70  set, flags);.  p
90c0: 4e 65 77 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b  New->iLimit = 0;
90d0: 0a 20 20 70 4e 65 77 2d 3e 69 4f 66 66 73 65 74  .  pNew->iOffset
90e0: 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 73 65   = 0;.  pNew->se
90f0: 6c 46 6c 61 67 73 20 3d 20 70 2d 3e 73 65 6c 46  lFlags = p->selF
9100: 6c 61 67 73 20 26 20 7e 53 46 5f 55 73 65 73 45  lags & ~SF_UsesE
9110: 70 68 65 6d 65 72 61 6c 3b 0a 20 20 70 4e 65 77  phemeral;.  pNew
9120: 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30  ->addrOpenEphm[0
9130: 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e  ] = -1;.  pNew->
9140: 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20  addrOpenEphm[1] 
9150: 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 6e 53  = -1;.  pNew->nS
9160: 65 6c 65 63 74 52 6f 77 20 3d 20 70 2d 3e 6e 53  electRow = p->nS
9170: 65 6c 65 63 74 52 6f 77 3b 0a 20 20 70 4e 65 77  electRow;.  pNew
9180: 2d 3e 70 57 69 74 68 20 3d 20 77 69 74 68 44 75  ->pWith = withDu
9190: 70 28 64 62 2c 20 70 2d 3e 70 57 69 74 68 29 3b  p(db, p->pWith);
91a0: 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
91b0: 53 65 74 4e 61 6d 65 28 70 4e 65 77 2c 20 70 2d  SetName(pNew, p-
91c0: 3e 7a 53 65 6c 4e 61 6d 65 29 3b 0a 20 20 72 65  >zSelName);.  re
91d0: 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 23 65 6c  turn pNew;.}.#el
91e0: 73 65 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69 74  se.Select *sqlit
91f0: 65 33 53 65 6c 65 63 74 44 75 70 28 73 71 6c 69  e3SelectDup(sqli
9200: 74 65 33 20 2a 64 62 2c 20 53 65 6c 65 63 74 20  te3 *db, Select 
9210: 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a  *p, int flags){.
9220: 20 20 61 73 73 65 72 74 28 20 70 3d 3d 30 20 29    assert( p==0 )
9230: 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
9240: 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41  #endif.../*.** A
9250: 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74  dd a new element
9260: 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 61   to the end of a
9270: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  n expression lis
9280: 74 2e 20 20 49 66 20 70 4c 69 73 74 20 69 73 0a  t.  If pList is.
9290: 2a 2a 20 69 6e 69 74 69 61 6c 6c 79 20 4e 55 4c  ** initially NUL
92a0: 4c 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20 61  L, then create a
92b0: 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20   new expression 
92c0: 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  list..**.** If a
92d0: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
92e0: 6f 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  on error occurs,
92f0: 20 74 68 65 20 65 6e 74 69 72 65 20 6c 69 73 74   the entire list
9300: 20 69 73 20 66 72 65 65 64 20 61 6e 64 0a 2a 2a   is freed and.**
9310: 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65   NULL is returne
9320: 64 2e 20 20 49 66 20 6e 6f 6e 2d 4e 55 4c 4c 20  d.  If non-NULL 
9330: 69 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65  is returned, the
9340: 6e 20 69 74 20 69 73 20 67 75 61 72 61 6e 74 65  n it is guarante
9350: 65 64 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 6e  ed.** that the n
9360: 65 77 20 65 6e 74 72 79 20 77 61 73 20 73 75 63  ew entry was suc
9370: 63 65 73 73 66 75 6c 6c 79 20 61 70 70 65 6e 64  cessfully append
9380: 65 64 2e 0a 2a 2f 0a 45 78 70 72 4c 69 73 74 20  ed..*/.ExprList 
9390: 2a 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74  *sqlite3ExprList
93a0: 41 70 70 65 6e 64 28 0a 20 20 50 61 72 73 65 20  Append(.  Parse 
93b0: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
93c0: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
93d0: 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69  text */.  ExprLi
93e0: 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20  st *pList,      
93f0: 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 77 68 69    /* List to whi
9400: 63 68 20 74 6f 20 61 70 70 65 6e 64 2e 20 4d 69  ch to append. Mi
9410: 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  ght be NULL */. 
9420: 20 45 78 70 72 20 2a 70 45 78 70 72 20 20 20 20   Expr *pExpr    
9430: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72           /* Expr
9440: 65 73 73 69 6f 6e 20 74 6f 20 62 65 20 61 70 70  ession to be app
9450: 65 6e 64 65 64 2e 20 4d 69 67 68 74 20 62 65 20  ended. Might be 
9460: 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  NULL */.){.  sql
9470: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
9480: 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 4c 69  e->db;.  if( pLi
9490: 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69  st==0 ){.    pLi
94a0: 73 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  st = sqlite3DbMa
94b0: 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
94c0: 65 6f 66 28 45 78 70 72 4c 69 73 74 29 20 29 3b  eof(ExprList) );
94d0: 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  .    if( pList==
94e0: 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  0 ){.      goto 
94f0: 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20  no_mem;.    }.  
9500: 20 20 70 4c 69 73 74 2d 3e 61 20 3d 20 73 71 6c    pList->a = sql
9510: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28  ite3DbMallocRaw(
9520: 64 62 2c 20 73 69 7a 65 6f 66 28 70 4c 69 73 74  db, sizeof(pList
9530: 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 20 20 69 66  ->a[0]));.    if
9540: 28 20 70 4c 69 73 74 2d 3e 61 3d 3d 30 20 29 20  ( pList->a==0 ) 
9550: 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 7d  goto no_mem;.  }
9560: 65 6c 73 65 20 69 66 28 20 28 70 4c 69 73 74 2d  else if( (pList-
9570: 3e 6e 45 78 70 72 20 26 20 28 70 4c 69 73 74 2d  >nExpr & (pList-
9580: 3e 6e 45 78 70 72 2d 31 29 29 3d 3d 30 20 29 7b  >nExpr-1))==0 ){
9590: 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72  .    struct Expr
95a0: 4c 69 73 74 5f 69 74 65 6d 20 2a 61 3b 0a 20 20  List_item *a;.  
95b0: 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d    assert( pList-
95c0: 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20 20 20  >nExpr>0 );.    
95d0: 61 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61  a = sqlite3DbRea
95e0: 6c 6c 6f 63 28 64 62 2c 20 70 4c 69 73 74 2d 3e  lloc(db, pList->
95f0: 61 2c 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2a  a, pList->nExpr*
9600: 32 2a 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e  2*sizeof(pList->
9610: 61 5b 30 5d 29 29 3b 0a 20 20 20 20 69 66 28 20  a[0]));.    if( 
9620: 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f  a==0 ){.      go
9630: 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 7d  to no_mem;.    }
9640: 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 20 3d 20  .    pList->a = 
9650: 61 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  a;.  }.  assert(
9660: 20 70 4c 69 73 74 2d 3e 61 21 3d 30 20 29 3b 0a   pList->a!=0 );.
9670: 20 20 69 66 28 20 31 20 29 7b 0a 20 20 20 20 73    if( 1 ){.    s
9680: 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
9690: 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 4c  tem *pItem = &pL
96a0: 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45  ist->a[pList->nE
96b0: 78 70 72 2b 2b 5d 3b 0a 20 20 20 20 6d 65 6d 73  xpr++];.    mems
96c0: 65 74 28 70 49 74 65 6d 2c 20 30 2c 20 73 69 7a  et(pItem, 0, siz
96d0: 65 6f 66 28 2a 70 49 74 65 6d 29 29 3b 0a 20 20  eof(*pItem));.  
96e0: 20 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 20 3d    pItem->pExpr =
96f0: 20 70 45 78 70 72 3b 0a 20 20 7d 0a 20 20 72 65   pExpr;.  }.  re
9700: 74 75 72 6e 20 70 4c 69 73 74 3b 0a 0a 6e 6f 5f  turn pList;..no_
9710: 6d 65 6d 3a 20 20 20 20 20 0a 20 20 2f 2a 20 41  mem:     .  /* A
9720: 76 6f 69 64 20 6c 65 61 6b 69 6e 67 20 6d 65 6d  void leaking mem
9730: 6f 72 79 20 69 66 20 6d 61 6c 6c 6f 63 20 68 61  ory if malloc ha
9740: 73 20 66 61 69 6c 65 64 2e 20 2a 2f 0a 20 20 73  s failed. */.  s
9750: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
9760: 28 64 62 2c 20 70 45 78 70 72 29 3b 0a 20 20 73  (db, pExpr);.  s
9770: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
9780: 6c 65 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b  lete(db, pList);
9790: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
97a0: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 73 6f  /*.** Set the so
97b0: 72 74 20 6f 72 64 65 72 20 66 6f 72 20 74 68 65  rt order for the
97c0: 20 6c 61 73 74 20 65 6c 65 6d 65 6e 74 20 6f 6e   last element on
97d0: 20 74 68 65 20 67 69 76 65 6e 20 45 78 70 72 4c   the given ExprL
97e0: 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ist..*/.void sql
97f0: 69 74 65 33 45 78 70 72 4c 69 73 74 53 65 74 53  ite3ExprListSetS
9800: 6f 72 74 4f 72 64 65 72 28 45 78 70 72 4c 69 73  ortOrder(ExprLis
9810: 74 20 2a 70 2c 20 69 6e 74 20 69 53 6f 72 74 4f  t *p, int iSortO
9820: 72 64 65 72 29 7b 0a 20 20 69 66 28 20 70 3d 3d  rder){.  if( p==
9830: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73  0 ) return;.  as
9840: 73 65 72 74 28 20 53 51 4c 49 54 45 5f 53 4f 5f  sert( SQLITE_SO_
9850: 55 4e 44 45 46 49 4e 45 44 3c 30 20 26 26 20 53  UNDEFINED<0 && S
9860: 51 4c 49 54 45 5f 53 4f 5f 41 53 43 3e 3d 30 20  QLITE_SO_ASC>=0 
9870: 26 26 20 53 51 4c 49 54 45 5f 53 4f 5f 44 45 53  && SQLITE_SO_DES
9880: 43 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  C>0 );.  assert(
9890: 20 70 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20   p->nExpr>0 );. 
98a0: 20 69 66 28 20 69 53 6f 72 74 4f 72 64 65 72 3c   if( iSortOrder<
98b0: 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
98c0: 20 70 2d 3e 61 5b 70 2d 3e 6e 45 78 70 72 2d 31   p->a[p->nExpr-1
98d0: 5d 2e 73 6f 72 74 4f 72 64 65 72 3d 3d 53 51 4c  ].sortOrder==SQL
98e0: 49 54 45 5f 53 4f 5f 41 53 43 20 29 3b 0a 20 20  ITE_SO_ASC );.  
98f0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
9900: 70 2d 3e 61 5b 70 2d 3e 6e 45 78 70 72 2d 31 5d  p->a[p->nExpr-1]
9910: 2e 73 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38  .sortOrder = (u8
9920: 29 69 53 6f 72 74 4f 72 64 65 72 3b 0a 7d 0a 0a  )iSortOrder;.}..
9930: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 45 78  /*.** Set the Ex
9940: 70 72 4c 69 73 74 2e 61 5b 5d 2e 7a 4e 61 6d 65  prList.a[].zName
9950: 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20   element of the 
9960: 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64  most recently ad
9970: 64 65 64 20 69 74 65 6d 0a 2a 2a 20 6f 6e 20 74  ded item.** on t
9980: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  he expression li
9990: 73 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20  st..**.** pList 
99a0: 6d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 66 6f  might be NULL fo
99b0: 6c 6c 6f 77 69 6e 67 20 61 6e 20 4f 4f 4d 20 65  llowing an OOM e
99c0: 72 72 6f 72 2e 20 20 42 75 74 20 70 4e 61 6d 65  rror.  But pName
99d0: 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 62 65   should never be
99e0: 0a 2a 2a 20 4e 55 4c 4c 2e 20 20 49 66 20 61 20  .** NULL.  If a 
99f0: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
9a00: 6e 20 66 61 69 6c 73 2c 20 74 68 65 20 70 50 61  n fails, the pPa
9a10: 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
9a20: 61 69 6c 65 64 20 66 6c 61 67 0a 2a 2a 20 69 73  ailed flag.** is
9a30: 20 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71   set..*/.void sq
9a40: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 53 65 74  lite3ExprListSet
9a50: 4e 61 6d 65 28 0a 20 20 50 61 72 73 65 20 2a 70  Name(.  Parse *p
9a60: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
9a70: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
9a80: 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  xt */.  ExprList
9a90: 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20   *pList,        
9aa0: 2f 2a 20 4c 69 73 74 20 74 6f 20 77 68 69 63 68  /* List to which
9ab0: 20 74 6f 20 61 64 64 20 74 68 65 20 73 70 61 6e   to add the span
9ac0: 2e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  . */.  Token *pN
9ad0: 61 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ame,           /
9ae0: 2a 20 4e 61 6d 65 20 74 6f 20 62 65 20 61 64 64  * Name to be add
9af0: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 64 65 71 75  ed */.  int dequ
9b00: 6f 74 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ote             
9b10: 2f 2a 20 54 72 75 65 20 74 6f 20 63 61 75 73 65  /* True to cause
9b20: 20 74 68 65 20 6e 61 6d 65 20 74 6f 20 62 65 20   the name to be 
9b30: 64 65 71 75 6f 74 65 64 20 2a 2f 0a 29 7b 0a 20  dequoted */.){. 
9b40: 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d   assert( pList!=
9b50: 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d  0 || pParse->db-
9b60: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 21 3d 30  >mallocFailed!=0
9b70: 20 29 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20   );.  if( pList 
9b80: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45 78  ){.    struct Ex
9b90: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
9ba0: 65 6d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  em;.    assert( 
9bb0: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29  pList->nExpr>0 )
9bc0: 3b 0a 20 20 20 20 70 49 74 65 6d 20 3d 20 26 70  ;.    pItem = &p
9bd0: 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e  List->a[pList->n
9be0: 45 78 70 72 2d 31 5d 3b 0a 20 20 20 20 61 73 73  Expr-1];.    ass
9bf0: 65 72 74 28 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d  ert( pItem->zNam
9c00: 65 3d 3d 30 20 29 3b 0a 20 20 20 20 70 49 74 65  e==0 );.    pIte
9c10: 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  m->zName = sqlit
9c20: 65 33 44 62 53 74 72 4e 44 75 70 28 70 50 61 72  e3DbStrNDup(pPar
9c30: 73 65 2d 3e 64 62 2c 20 70 4e 61 6d 65 2d 3e 7a  se->db, pName->z
9c40: 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20 20  , pName->n);.   
9c50: 20 69 66 28 20 64 65 71 75 6f 74 65 20 26 26 20   if( dequote && 
9c60: 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 29 20 73  pItem->zName ) s
9c70: 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28 70 49  qlite3Dequote(pI
9c80: 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7d  tem->zName);.  }
9c90: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
9ca0: 65 20 45 78 70 72 4c 69 73 74 2e 61 5b 5d 2e 7a  e ExprList.a[].z
9cb0: 53 70 61 6e 20 65 6c 65 6d 65 6e 74 20 6f 66 20  Span element of 
9cc0: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  the most recentl
9cd0: 79 20 61 64 64 65 64 20 69 74 65 6d 0a 2a 2a 20  y added item.** 
9ce0: 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  on the expressio
9cf0: 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c  n list..**.** pL
9d00: 69 73 74 20 6d 69 67 68 74 20 62 65 20 4e 55 4c  ist might be NUL
9d10: 4c 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 6e 20 4f  L following an O
9d20: 4f 4d 20 65 72 72 6f 72 2e 20 20 42 75 74 20 70  OM error.  But p
9d30: 53 70 61 6e 20 73 68 6f 75 6c 64 20 6e 65 76 65  Span should neve
9d40: 72 20 62 65 0a 2a 2a 20 4e 55 4c 4c 2e 20 20 49  r be.** NULL.  I
9d50: 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  f a memory alloc
9d60: 61 74 69 6f 6e 20 66 61 69 6c 73 2c 20 74 68 65  ation fails, the
9d70: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
9d80: 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 0a 2a  locFailed flag.*
9d90: 2a 20 69 73 20 73 65 74 2e 0a 2a 2f 0a 76 6f 69  * is set..*/.voi
9da0: 64 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  d sqlite3ExprLis
9db0: 74 53 65 74 53 70 61 6e 28 0a 20 20 50 61 72 73  tSetSpan(.  Pars
9dc0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
9dd0: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
9de0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
9df0: 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20  List *pList,    
9e00: 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 77      /* List to w
9e10: 68 69 63 68 20 74 6f 20 61 64 64 20 74 68 65 20  hich to add the 
9e20: 73 70 61 6e 2e 20 2a 2f 0a 20 20 45 78 70 72 53  span. */.  ExprS
9e30: 70 61 6e 20 2a 70 53 70 61 6e 20 20 20 20 20 20  pan *pSpan      
9e40: 20 20 20 2f 2a 20 54 68 65 20 73 70 61 6e 20 74     /* The span t
9e50: 6f 20 62 65 20 61 64 64 65 64 20 2a 2f 0a 29 7b  o be added */.){
9e60: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
9e70: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 61   pParse->db;.  a
9e80: 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30 20  ssert( pList!=0 
9e90: 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
9ea0: 6c 65 64 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  led!=0 );.  if( 
9eb0: 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 73 74 72  pList ){.    str
9ec0: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
9ed0: 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 4c 69 73  m *pItem = &pLis
9ee0: 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45 78 70  t->a[pList->nExp
9ef0: 72 2d 31 5d 3b 0a 20 20 20 20 61 73 73 65 72 74  r-1];.    assert
9f00: 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30  ( pList->nExpr>0
9f10: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
9f20: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
9f30: 20 7c 7c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72   || pItem->pExpr
9f40: 3d 3d 70 53 70 61 6e 2d 3e 70 45 78 70 72 20 29  ==pSpan->pExpr )
9f50: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
9f60: 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a  ree(db, pItem->z
9f70: 53 70 61 6e 29 3b 0a 20 20 20 20 70 49 74 65 6d  Span);.    pItem
9f80: 2d 3e 7a 53 70 61 6e 20 3d 20 73 71 6c 69 74 65  ->zSpan = sqlite
9f90: 33 44 62 53 74 72 4e 44 75 70 28 64 62 2c 20 28  3DbStrNDup(db, (
9fa0: 63 68 61 72 2a 29 70 53 70 61 6e 2d 3e 7a 53 74  char*)pSpan->zSt
9fb0: 61 72 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  art,.           
9fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9fd0: 20 20 20 20 20 20 20 20 20 28 69 6e 74 29 28 70           (int)(p
9fe0: 53 70 61 6e 2d 3e 7a 45 6e 64 20 2d 20 70 53 70  Span->zEnd - pSp
9ff0: 61 6e 2d 3e 7a 53 74 61 72 74 29 29 3b 0a 20 20  an->zStart));.  
a000: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  }.}../*.** If th
a010: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  e expression lis
a020: 74 20 70 45 4c 69 73 74 20 63 6f 6e 74 61 69 6e  t pEList contain
a030: 73 20 6d 6f 72 65 20 74 68 61 6e 20 69 4c 69 6d  s more than iLim
a040: 69 74 20 65 6c 65 6d 65 6e 74 73 2c 0a 2a 2a 20  it elements,.** 
a050: 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d  leave an error m
a060: 65 73 73 61 67 65 20 69 6e 20 70 50 61 72 73 65  essage in pParse
a070: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
a080: 33 45 78 70 72 4c 69 73 74 43 68 65 63 6b 4c 65  3ExprListCheckLe
a090: 6e 67 74 68 28 0a 20 20 50 61 72 73 65 20 2a 70  ngth(.  Parse *p
a0a0: 50 61 72 73 65 2c 0a 20 20 45 78 70 72 4c 69 73  Parse,.  ExprLis
a0b0: 74 20 2a 70 45 4c 69 73 74 2c 0a 20 20 63 6f 6e  t *pEList,.  con
a0c0: 73 74 20 63 68 61 72 20 2a 7a 4f 62 6a 65 63 74  st char *zObject
a0d0: 0a 29 7b 0a 20 20 69 6e 74 20 6d 78 20 3d 20 70  .){.  int mx = p
a0e0: 50 61 72 73 65 2d 3e 64 62 2d 3e 61 4c 69 6d 69  Parse->db->aLimi
a0f0: 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43  t[SQLITE_LIMIT_C
a100: 4f 4c 55 4d 4e 5d 3b 0a 20 20 74 65 73 74 63 61  OLUMN];.  testca
a110: 73 65 28 20 70 45 4c 69 73 74 20 26 26 20 70 45  se( pEList && pE
a120: 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 6d 78 20  List->nExpr==mx 
a130: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  );.  testcase( p
a140: 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d  EList && pEList-
a150: 3e 6e 45 78 70 72 3d 3d 6d 78 2b 31 20 29 3b 0a  >nExpr==mx+1 );.
a160: 20 20 69 66 28 20 70 45 4c 69 73 74 20 26 26 20    if( pEList && 
a170: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 6d 78  pEList->nExpr>mx
a180: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
a190: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
a1a0: 22 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e  "too many column
a1b0: 73 20 69 6e 20 25 73 22 2c 20 7a 4f 62 6a 65 63  s in %s", zObjec
a1c0: 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  t);.  }.}../*.**
a1d0: 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72   Delete an entir
a1e0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  e expression lis
a1f0: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
a200: 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
a210: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78  (sqlite3 *db, Ex
a220: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a  prList *pList){.
a230: 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63    int i;.  struc
a240: 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
a250: 2a 70 49 74 65 6d 3b 0a 20 20 69 66 28 20 70 4c  *pItem;.  if( pL
a260: 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ist==0 ) return;
a270: 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74  .  assert( pList
a280: 2d 3e 61 21 3d 30 20 7c 7c 20 70 4c 69 73 74 2d  ->a!=0 || pList-
a290: 3e 6e 45 78 70 72 3d 3d 30 20 29 3b 0a 20 20 66  >nExpr==0 );.  f
a2a0: 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e  or(pItem=pList->
a2b0: 61 2c 20 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  a, i=0; i<pList-
a2c0: 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74  >nExpr; i++, pIt
a2d0: 65 6d 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74  em++){.    sqlit
a2e0: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
a2f0: 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a   pItem->pExpr);.
a300: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
a310: 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61  e(db, pItem->zNa
a320: 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  me);.    sqlite3
a330: 44 62 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d  DbFree(db, pItem
a340: 2d 3e 7a 53 70 61 6e 29 3b 0a 20 20 7d 0a 20 20  ->zSpan);.  }.  
a350: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
a360: 2c 20 70 4c 69 73 74 2d 3e 61 29 3b 0a 20 20 73  , pList->a);.  s
a370: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
a380: 20 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   pList);.}../*.*
a390: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 62 69 74  * Return the bit
a3a0: 77 69 73 65 2d 4f 52 20 6f 66 20 61 6c 6c 20 45  wise-OR of all E
a3b0: 78 70 72 2e 66 6c 61 67 73 20 66 69 65 6c 64 73  xpr.flags fields
a3c0: 20 69 6e 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a   in the given.**
a3d0: 20 45 78 70 72 4c 69 73 74 2e 0a 2a 2f 0a 75 33   ExprList..*/.u3
a3e0: 32 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  2 sqlite3ExprLis
a3f0: 74 46 6c 61 67 73 28 63 6f 6e 73 74 20 45 78 70  tFlags(const Exp
a400: 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20  rList *pList){. 
a410: 20 69 6e 74 20 69 3b 0a 20 20 75 33 32 20 6d 20   int i;.  u32 m 
a420: 3d 20 30 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  = 0;.  if( pList
a430: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
a440: 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   i<pList->nExpr;
a450: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 45 78   i++){.       Ex
a460: 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4c 69 73  pr *pExpr = pLis
a470: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  t->a[i].pExpr;. 
a480: 20 20 20 20 20 20 69 66 28 20 41 4c 57 41 59 53        if( ALWAYS
a490: 28 70 45 78 70 72 29 20 29 20 6d 20 7c 3d 20 70  (pExpr) ) m |= p
a4a0: 45 78 70 72 2d 3e 66 6c 61 67 73 3b 0a 20 20 20  Expr->flags;.   
a4b0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
a4c0: 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73  m;.}../*.** Thes
a4d0: 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 57  e routines are W
a4e0: 61 6c 6b 65 72 20 63 61 6c 6c 62 61 63 6b 73 20  alker callbacks 
a4f0: 75 73 65 64 20 74 6f 20 63 68 65 63 6b 20 65 78  used to check ex
a500: 70 72 65 73 73 69 6f 6e 73 20 74 6f 0a 2a 2a 20  pressions to.** 
a510: 73 65 65 20 69 66 20 74 68 65 79 20 61 72 65 20  see if they are 
a520: 22 63 6f 6e 73 74 61 6e 74 22 20 66 6f 72 20 73  "constant" for s
a530: 6f 6d 65 20 64 65 66 69 6e 69 74 69 6f 6e 20 6f  ome definition o
a540: 66 20 63 6f 6e 73 74 61 6e 74 2e 20 20 54 68 65  f constant.  The
a550: 0a 2a 2a 20 57 61 6c 6b 65 72 2e 65 43 6f 64 65  .** Walker.eCode
a560: 20 76 61 6c 75 65 20 64 65 74 65 72 6d 69 6e 65   value determine
a570: 73 20 74 68 65 20 74 79 70 65 20 6f 66 20 22 63  s the type of "c
a580: 6f 6e 73 74 61 6e 74 22 20 77 65 20 61 72 65 20  onstant" we are 
a590: 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20 66 6f 72 2e 0a  looking.** for..
a5a0: 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 63 61 6c 6c  **.** These call
a5b0: 62 61 63 6b 20 72 6f 75 74 69 6e 65 73 20 61 72  back routines ar
a5c0: 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d  e used to implem
a5d0: 65 6e 74 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ent the followin
a5e0: 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 73 71 6c  g:.**.**     sql
a5f0: 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
a600: 6e 74 28 29 20 20 20 20 20 20 20 20 20 20 20 20  nt()            
a610: 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65        pWalker->e
a620: 43 6f 64 65 3d 3d 31 0a 2a 2a 20 20 20 20 20 73  Code==1.**     s
a630: 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
a640: 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 29 20 20 20  tantNotJoin()   
a650: 20 20 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d          pWalker-
a660: 3e 65 43 6f 64 65 3d 3d 32 0a 2a 2a 20 20 20 20  >eCode==2.**    
a670: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 54 61   sqlite3ExprIsTa
a680: 62 6c 65 43 6f 6e 73 74 61 6e 74 28 29 20 20 20  bleConstant()   
a690: 20 20 20 20 20 20 20 20 20 20 70 57 61 6c 6b 65            pWalke
a6a0: 72 2d 3e 65 43 6f 64 65 3d 3d 33 0a 2a 2a 20 20  r->eCode==3.**  
a6b0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 73     sqlite3ExprIs
a6c0: 43 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74 69  ConstantOrFuncti
a6d0: 6f 6e 28 29 20 20 20 20 20 20 20 20 70 57 61 6c  on()        pWal
a6e0: 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 34 20 6f 72  ker->eCode==4 or
a6f0: 20 35 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6c 6c 20   5.**.** In all 
a700: 63 61 73 65 73 2c 20 74 68 65 20 63 61 6c 6c 62  cases, the callb
a710: 61 63 6b 73 20 73 65 74 20 57 61 6c 6b 65 72 2e  acks set Walker.
a720: 65 43 6f 64 65 3d 30 20 61 6e 64 20 61 62 6f 72  eCode=0 and abor
a730: 74 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  t if the express
a740: 69 6f 6e 0a 2a 2a 20 69 73 20 66 6f 75 6e 64 20  ion.** is found 
a750: 74 6f 20 6e 6f 74 20 62 65 20 61 20 63 6f 6e 73  to not be a cons
a760: 74 61 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tant..**.** The 
a770: 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
a780: 73 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f 6e 28  stantOrFunction(
a790: 29 20 69 73 20 75 73 65 64 20 66 6f 72 20 65 76  ) is used for ev
a7a0: 61 6c 75 61 74 69 6e 67 20 65 78 70 72 65 73 73  aluating express
a7b0: 69 6f 6e 73 0a 2a 2a 20 69 6e 20 61 20 43 52 45  ions.** in a CRE
a7c0: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
a7d0: 65 6e 74 2e 20 20 54 68 65 20 57 61 6c 6b 65 72  ent.  The Walker
a7e0: 2e 65 43 6f 64 65 20 76 61 6c 75 65 20 69 73 20  .eCode value is 
a7f0: 35 20 77 68 65 6e 20 70 61 72 73 69 6e 67 0a 2a  5 when parsing.*
a800: 2a 20 61 6e 20 65 78 69 73 74 69 6e 67 20 73 63  * an existing sc
a810: 68 65 6d 61 20 61 6e 64 20 34 20 77 68 65 6e 20  hema and 4 when 
a820: 70 72 6f 63 65 73 73 69 6e 67 20 61 20 6e 65 77  processing a new
a830: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 41 20 62   statement.  A b
a840: 6f 75 6e 64 0a 2a 2a 20 70 61 72 61 6d 65 74 65  ound.** paramete
a850: 72 20 72 61 69 73 65 73 20 61 6e 20 65 72 72 6f  r raises an erro
a860: 72 20 66 6f 72 20 6e 65 77 20 73 74 61 74 65 6d  r for new statem
a870: 65 6e 74 73 2c 20 62 75 74 20 69 73 20 73 69 6c  ents, but is sil
a880: 65 6e 74 6c 79 20 63 6f 6e 76 65 72 74 65 64 0a  ently converted.
a890: 2a 2a 20 74 6f 20 4e 55 4c 4c 20 66 6f 72 20 65  ** to NULL for e
a8a0: 78 69 73 74 69 6e 67 20 73 63 68 65 6d 61 73 2e  xisting schemas.
a8b0: 20 20 54 68 69 73 20 61 6c 6c 6f 77 73 20 73 71    This allows sq
a8c0: 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
a8d0: 65 73 20 74 68 61 74 20 0a 2a 2a 20 63 6f 6e 74  es that .** cont
a8e0: 61 69 6e 20 61 20 62 6f 75 6e 64 20 70 61 72 61  ain a bound para
a8f0: 6d 65 74 65 72 20 62 65 63 61 75 73 65 20 74 68  meter because th
a900: 65 79 20 77 65 72 65 20 67 65 6e 65 72 61 74 65  ey were generate
a910: 64 20 62 79 20 6f 6c 64 65 72 20 76 65 72 73 69  d by older versi
a920: 6f 6e 73 0a 2a 2a 20 6f 66 20 53 51 4c 69 74 65  ons.** of SQLite
a930: 20 74 6f 20 62 65 20 70 61 72 73 65 64 20 62 79   to be parsed by
a940: 20 6e 65 77 65 72 20 76 65 72 73 69 6f 6e 73 20   newer versions 
a950: 6f 66 20 53 51 4c 69 74 65 20 77 69 74 68 6f 75  of SQLite withou
a960: 74 20 72 61 69 73 69 6e 67 20 61 0a 2a 2a 20 6d  t raising a.** m
a970: 61 6c 66 6f 72 6d 65 64 20 73 63 68 65 6d 61 20  alformed schema 
a980: 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  error..*/.static
a990: 20 69 6e 74 20 65 78 70 72 4e 6f 64 65 49 73 43   int exprNodeIsC
a9a0: 6f 6e 73 74 61 6e 74 28 57 61 6c 6b 65 72 20 2a  onstant(Walker *
a9b0: 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70  pWalker, Expr *p
a9c0: 45 78 70 72 29 7b 0a 0a 20 20 2f 2a 20 49 66 20  Expr){..  /* If 
a9d0: 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 69  pWalker->eCode i
a9e0: 73 20 32 20 74 68 65 6e 20 61 6e 79 20 74 65 72  s 2 then any ter
a9f0: 6d 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73  m of the express
aa00: 69 6f 6e 20 74 68 61 74 20 63 6f 6d 65 73 20 66  ion that comes f
aa10: 72 6f 6d 0a 20 20 2a 2a 20 74 68 65 20 4f 4e 20  rom.  ** the ON 
aa20: 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73  or USING clauses
aa30: 20 6f 66 20 61 20 6c 65 66 74 20 6a 6f 69 6e 20   of a left join 
aa40: 64 69 73 71 75 61 6c 69 66 69 65 73 20 74 68 65  disqualifies the
aa50: 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 2a 2a   expression.  **
aa60: 20 66 72 6f 6d 20 62 65 69 6e 67 20 63 6f 6e 73   from being cons
aa70: 69 64 65 72 65 64 20 63 6f 6e 73 74 61 6e 74 2e  idered constant.
aa80: 20 2a 2f 0a 20 20 69 66 28 20 70 57 61 6c 6b 65   */.  if( pWalke
aa90: 72 2d 3e 65 43 6f 64 65 3d 3d 32 20 26 26 20 45  r->eCode==2 && E
aaa0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
aab0: 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69  Expr, EP_FromJoi
aac0: 6e 29 20 29 7b 0a 20 20 20 20 70 57 61 6c 6b 65  n) ){.    pWalke
aad0: 72 2d 3e 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20  r->eCode = 0;.  
aae0: 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f    return WRC_Abo
aaf0: 72 74 3b 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63  rt;.  }..  switc
ab00: 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a  h( pExpr->op ){.
ab10: 20 20 20 20 2f 2a 20 43 6f 6e 73 69 64 65 72 20      /* Consider 
ab20: 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20 62 65 20  functions to be 
ab30: 63 6f 6e 73 74 61 6e 74 20 69 66 20 61 6c 6c 20  constant if all 
ab40: 74 68 65 69 72 20 61 72 67 75 6d 65 6e 74 73 20  their arguments 
ab50: 61 72 65 20 63 6f 6e 73 74 61 6e 74 0a 20 20 20  are constant.   
ab60: 20 2a 2a 20 61 6e 64 20 65 69 74 68 65 72 20 70   ** and either p
ab70: 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 34  Walker->eCode==4
ab80: 20 6f 72 20 35 20 6f 72 20 74 68 65 20 66 75 6e   or 5 or the fun
ab90: 63 74 69 6f 6e 20 68 61 73 20 74 68 65 0a 20 20  ction has the.  
aba0: 20 20 2a 2a 20 53 51 4c 49 54 45 5f 46 55 4e 43    ** SQLITE_FUNC
abb0: 5f 43 4f 4e 53 54 20 66 6c 61 67 2e 20 2a 2f 0a  _CONST flag. */.
abc0: 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43      case TK_FUNC
abd0: 54 49 4f 4e 3a 0a 20 20 20 20 20 20 69 66 28 20  TION:.      if( 
abe0: 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3e 3d  pWalker->eCode>=
abf0: 34 20 7c 7c 20 45 78 70 72 48 61 73 50 72 6f 70  4 || ExprHasProp
ac00: 65 72 74 79 28 70 45 78 70 72 2c 45 50 5f 43 6f  erty(pExpr,EP_Co
ac10: 6e 73 74 46 75 6e 63 29 20 29 7b 0a 20 20 20 20  nstFunc) ){.    
ac20: 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43      return WRC_C
ac30: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d  ontinue;.      }
ac40: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 57  else{.        pW
ac50: 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20 30  alker->eCode = 0
ac60: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
ac70: 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20   WRC_Abort;.    
ac80: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
ac90: 49 44 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ID:.    case TK_
aca0: 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65  COLUMN:.    case
acb0: 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e   TK_AGG_FUNCTION
acc0: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47  :.    case TK_AG
acd0: 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 20 20  G_COLUMN:.      
ace0: 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
acf0: 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 3b 0a 20 20  >op==TK_ID );.  
ad00: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
ad10: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  xpr->op==TK_COLU
ad20: 4d 4e 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  MN );.      test
ad30: 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
ad40: 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e  =TK_AGG_FUNCTION
ad50: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
ad60: 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
ad70: 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a  K_AGG_COLUMN );.
ad80: 20 20 20 20 20 20 69 66 28 20 70 57 61 6c 6b 65        if( pWalke
ad90: 72 2d 3e 65 43 6f 64 65 3d 3d 33 20 26 26 20 70  r->eCode==3 && p
ada0: 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 57  Expr->iTable==pW
adb0: 61 6c 6b 65 72 2d 3e 75 2e 69 43 75 72 20 29 7b  alker->u.iCur ){
adc0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
add0: 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20  WRC_Continue;.  
ade0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
adf0: 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64     pWalker->eCod
ae00: 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72  e = 0;.        r
ae10: 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
ae20: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 63 61 73  .      }.    cas
ae30: 65 20 54 4b 5f 56 41 52 49 41 42 4c 45 3a 0a 20  e TK_VARIABLE:. 
ae40: 20 20 20 20 20 69 66 28 20 70 57 61 6c 6b 65 72       if( pWalker
ae50: 2d 3e 65 43 6f 64 65 3d 3d 35 20 29 7b 0a 20 20  ->eCode==5 ){.  
ae60: 20 20 20 20 20 20 2f 2a 20 53 69 6c 65 6e 74 6c        /* Silentl
ae70: 79 20 63 6f 6e 76 65 72 74 20 62 6f 75 6e 64 20  y convert bound 
ae80: 70 61 72 61 6d 65 74 65 72 73 20 74 68 61 74 20  parameters that 
ae90: 61 70 70 65 61 72 20 69 6e 73 69 64 65 20 6f 66  appear inside of
aea0: 20 43 52 45 41 54 45 0a 20 20 20 20 20 20 20 20   CREATE.        
aeb0: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e  ** statements in
aec0: 74 6f 20 61 20 4e 55 4c 4c 20 77 68 65 6e 20 70  to a NULL when p
aed0: 61 72 73 69 6e 67 20 74 68 65 20 43 52 45 41 54  arsing the CREAT
aee0: 45 20 73 74 61 74 65 6d 65 6e 74 20 74 65 78 74  E statement text
aef0: 20 6f 75 74 0a 20 20 20 20 20 20 20 20 2a 2a 20   out.        ** 
af00: 6f 66 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  of the sqlite_ma
af10: 73 74 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20  ster table */.  
af20: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20        pExpr->op 
af30: 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20 20  = TK_NULL;.     
af40: 20 7d 65 6c 73 65 20 69 66 28 20 70 57 61 6c 6b   }else if( pWalk
af50: 65 72 2d 3e 65 43 6f 64 65 3d 3d 34 20 29 7b 0a  er->eCode==4 ){.
af60: 20 20 20 20 20 20 20 20 2f 2a 20 41 20 62 6f 75          /* A bou
af70: 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 6e 20  nd parameter in 
af80: 61 20 43 52 45 41 54 45 20 73 74 61 74 65 6d 65  a CREATE stateme
af90: 6e 74 20 74 68 61 74 20 6f 72 69 67 69 6e 61 74  nt that originat
afa0: 65 73 20 66 72 6f 6d 0a 20 20 20 20 20 20 20 20  es from.        
afb0: 2a 2a 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61  ** sqlite3_prepa
afc0: 72 65 28 29 20 63 61 75 73 65 73 20 61 6e 20 65  re() causes an e
afd0: 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20  rror */.        
afe0: 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d  pWalker->eCode =
aff0: 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75   0;.        retu
b000: 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
b010: 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 46      }.      /* F
b020: 61 6c 6c 20 74 68 72 6f 75 67 68 20 2a 2f 0a 20  all through */. 
b030: 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20     default:.    
b040: 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
b050: 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54  r->op==TK_SELECT
b060: 20 29 3b 20 2f 2a 20 73 65 6c 65 63 74 4e 6f 64   ); /* selectNod
b070: 65 49 73 43 6f 6e 73 74 61 6e 74 20 77 69 6c 6c  eIsConstant will
b080: 20 64 69 73 61 6c 6c 6f 77 20 2a 2f 0a 20 20 20   disallow */.   
b090: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
b0a0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53 54  pr->op==TK_EXIST
b0b0: 53 20 29 3b 20 2f 2a 20 73 65 6c 65 63 74 4e 6f  S ); /* selectNo
b0c0: 64 65 49 73 43 6f 6e 73 74 61 6e 74 20 77 69 6c  deIsConstant wil
b0d0: 6c 20 64 69 73 61 6c 6c 6f 77 20 2a 2f 0a 20 20  l disallow */.  
b0e0: 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43      return WRC_C
b0f0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 7d 0a 7d 0a 73  ontinue;.  }.}.s
b100: 74 61 74 69 63 20 69 6e 74 20 73 65 6c 65 63 74  tatic int select
b110: 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 28 57  NodeIsConstant(W
b120: 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20  alker *pWalker, 
b130: 53 65 6c 65 63 74 20 2a 4e 6f 74 55 73 65 64 29  Select *NotUsed)
b140: 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
b150: 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20  ETER(NotUsed);. 
b160: 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20   pWalker->eCode 
b170: 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 57 52  = 0;.  return WR
b180: 43 5f 41 62 6f 72 74 3b 0a 7d 0a 73 74 61 74 69  C_Abort;.}.stati
b190: 63 20 69 6e 74 20 65 78 70 72 49 73 43 6f 6e 73  c int exprIsCons
b1a0: 74 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 69  t(Expr *p, int i
b1b0: 6e 69 74 46 6c 61 67 2c 20 69 6e 74 20 69 43 75  nitFlag, int iCu
b1c0: 72 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a  r){.  Walker w;.
b1d0: 20 20 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c 20    memset(&w, 0, 
b1e0: 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20 77 2e  sizeof(w));.  w.
b1f0: 65 43 6f 64 65 20 3d 20 69 6e 69 74 46 6c 61 67  eCode = initFlag
b200: 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62  ;.  w.xExprCallb
b210: 61 63 6b 20 3d 20 65 78 70 72 4e 6f 64 65 49 73  ack = exprNodeIs
b220: 43 6f 6e 73 74 61 6e 74 3b 0a 20 20 77 2e 78 53  Constant;.  w.xS
b230: 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20  electCallback = 
b240: 73 65 6c 65 63 74 4e 6f 64 65 49 73 43 6f 6e 73  selectNodeIsCons
b250: 74 61 6e 74 3b 0a 20 20 77 2e 75 2e 69 43 75 72  tant;.  w.u.iCur
b260: 20 3d 20 69 43 75 72 3b 0a 20 20 73 71 6c 69 74   = iCur;.  sqlit
b270: 65 33 57 61 6c 6b 45 78 70 72 28 26 77 2c 20 70  e3WalkExpr(&w, p
b280: 29 3b 0a 20 20 72 65 74 75 72 6e 20 77 2e 65 43  );.  return w.eC
b290: 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61  ode;.}../*.** Wa
b2a0: 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  lk an expression
b2b0: 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20 6e   tree.  Return n
b2c0: 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 65  on-zero if the e
b2d0: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e  xpression is con
b2e0: 73 74 61 6e 74 0a 2a 2a 20 61 6e 64 20 30 20 69  stant.** and 0 i
b2f0: 66 20 69 74 20 69 6e 76 6f 6c 76 65 73 20 76 61  f it involves va
b300: 72 69 61 62 6c 65 73 20 6f 72 20 66 75 6e 63 74  riables or funct
b310: 69 6f 6e 20 63 61 6c 6c 73 2e 0a 2a 2a 0a 2a 2a  ion calls..**.**
b320: 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65   For the purpose
b330: 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  s of this functi
b340: 6f 6e 2c 20 61 20 64 6f 75 62 6c 65 2d 71 75 6f  on, a double-quo
b350: 74 65 64 20 73 74 72 69 6e 67 20 28 65 78 3a 20  ted string (ex: 
b360: 22 61 62 63 22 29 0a 2a 2a 20 69 73 20 63 6f 6e  "abc").** is con
b370: 73 69 64 65 72 65 64 20 61 20 76 61 72 69 61 62  sidered a variab
b380: 6c 65 20 62 75 74 20 61 20 73 69 6e 67 6c 65 2d  le but a single-
b390: 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65  quoted string (e
b3a0: 78 3a 20 27 61 62 63 27 29 20 69 73 0a 2a 2a 20  x: 'abc') is.** 
b3b0: 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a 69  a constant..*/.i
b3c0: 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  nt sqlite3ExprIs
b3d0: 43 6f 6e 73 74 61 6e 74 28 45 78 70 72 20 2a 70  Constant(Expr *p
b3e0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72  ){.  return expr
b3f0: 49 73 43 6f 6e 73 74 28 70 2c 20 31 2c 20 30 29  IsConst(p, 1, 0)
b400: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20  ;.}../*.** Walk 
b410: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  an expression tr
b420: 65 65 2e 20 20 52 65 74 75 72 6e 20 6e 6f 6e 2d  ee.  Return non-
b430: 7a 65 72 6f 20 69 66 20 74 68 65 20 65 78 70 72  zero if the expr
b440: 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61  ession is consta
b450: 6e 74 0a 2a 2a 20 74 68 61 74 20 64 6f 65 73 20  nt.** that does 
b460: 6e 6f 20 6f 72 69 67 69 6e 61 74 65 20 66 72 6f  no originate fro
b470: 6d 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e  m the ON or USIN
b480: 47 20 63 6c 61 75 73 65 73 20 6f 66 20 61 20 6a  G clauses of a j
b490: 6f 69 6e 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 30  oin..** Return 0
b4a0: 20 69 66 20 69 74 20 69 6e 76 6f 6c 76 65 73 20   if it involves 
b4b0: 76 61 72 69 61 62 6c 65 73 20 6f 72 20 66 75 6e  variables or fun
b4c0: 63 74 69 6f 6e 20 63 61 6c 6c 73 20 6f 72 20 74  ction calls or t
b4d0: 65 72 6d 73 20 66 72 6f 6d 0a 2a 2a 20 61 6e 20  erms from.** an 
b4e0: 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75  ON or USING clau
b4f0: 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  se..*/.int sqlit
b500: 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
b510: 4e 6f 74 4a 6f 69 6e 28 45 78 70 72 20 2a 70 29  NotJoin(Expr *p)
b520: 7b 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72 49  {.  return exprI
b530: 73 43 6f 6e 73 74 28 70 2c 20 32 2c 20 30 29 3b  sConst(p, 2, 0);
b540: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61  .}../*.** Walk a
b550: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  n expression tre
b560: 65 2e 20 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a  e.  Return non-z
b570: 65 72 6f 20 69 66 20 74 68 65 20 65 78 70 72 65  ero if the expre
b580: 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e  ssion is constan
b590: 74 0a 2a 2a 20 66 6f 72 20 61 6e 79 20 73 69 6e  t.** for any sin
b5a0: 67 6c 65 20 72 6f 77 20 6f 66 20 74 68 65 20 74  gle row of the t
b5b0: 61 62 6c 65 20 77 69 74 68 20 63 75 72 73 6f 72  able with cursor
b5c0: 20 69 43 75 72 2e 20 20 49 6e 20 6f 74 68 65 72   iCur.  In other
b5d0: 20 77 6f 72 64 73 2c 20 74 68 65 0a 2a 2a 20 65   words, the.** e
b5e0: 78 70 72 65 73 73 69 6f 6e 20 6d 75 73 74 20 6e  xpression must n
b5f0: 6f 74 20 72 65 66 65 72 20 74 6f 20 61 6e 79 20  ot refer to any 
b600: 6e 6f 6e 2d 64 65 74 65 72 6d 69 6e 69 73 74 69  non-deterministi
b610: 63 20 66 75 6e 63 74 69 6f 6e 20 6e 6f 72 20 61  c function nor a
b620: 6e 79 0a 2a 2a 20 74 61 62 6c 65 20 6f 74 68 65  ny.** table othe
b630: 72 20 74 68 61 6e 20 69 43 75 72 2e 0a 2a 2f 0a  r than iCur..*/.
b640: 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 49  int sqlite3ExprI
b650: 73 54 61 62 6c 65 43 6f 6e 73 74 61 6e 74 28 45  sTableConstant(E
b660: 78 70 72 20 2a 70 2c 20 69 6e 74 20 69 43 75 72  xpr *p, int iCur
b670: 29 7b 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72  ){.  return expr
b680: 49 73 43 6f 6e 73 74 28 70 2c 20 33 2c 20 69 43  IsConst(p, 3, iC
b690: 75 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61  ur);.}../*.** Wa
b6a0: 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  lk an expression
b6b0: 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20 6e   tree.  Return n
b6c0: 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 65  on-zero if the e
b6d0: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e  xpression is con
b6e0: 73 74 61 6e 74 0a 2a 2a 20 6f 72 20 61 20 66 75  stant.** or a fu
b6f0: 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 77 69 74 68  nction call with
b700: 20 63 6f 6e 73 74 61 6e 74 20 61 72 67 75 6d 65   constant argume
b710: 6e 74 73 2e 20 20 52 65 74 75 72 6e 20 61 6e 64  nts.  Return and
b720: 20 30 20 69 66 20 74 68 65 72 65 0a 2a 2a 20 61   0 if there.** a
b730: 72 65 20 61 6e 79 20 76 61 72 69 61 62 6c 65 73  re any variables
b740: 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20  ..**.** For the 
b750: 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68 69 73  purposes of this
b760: 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20 64 6f 75   function, a dou
b770: 62 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e  ble-quoted strin
b780: 67 20 28 65 78 3a 20 22 61 62 63 22 29 0a 2a 2a  g (ex: "abc").**
b790: 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61   is considered a
b7a0: 20 76 61 72 69 61 62 6c 65 20 62 75 74 20 61 20   variable but a 
b7b0: 73 69 6e 67 6c 65 2d 71 75 6f 74 65 64 20 73 74  single-quoted st
b7c0: 72 69 6e 67 20 28 65 78 3a 20 27 61 62 63 27 29  ring (ex: 'abc')
b7d0: 20 69 73 0a 2a 2a 20 61 20 63 6f 6e 73 74 61 6e   is.** a constan
b7e0: 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
b7f0: 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f  3ExprIsConstantO
b800: 72 46 75 6e 63 74 69 6f 6e 28 45 78 70 72 20 2a  rFunction(Expr *
b810: 70 2c 20 75 38 20 69 73 49 6e 69 74 29 7b 0a 20  p, u8 isInit){. 
b820: 20 61 73 73 65 72 74 28 20 69 73 49 6e 69 74 3d   assert( isInit=
b830: 3d 30 20 7c 7c 20 69 73 49 6e 69 74 3d 3d 31 20  =0 || isInit==1 
b840: 29 3b 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72  );.  return expr
b850: 49 73 43 6f 6e 73 74 28 70 2c 20 34 2b 69 73 49  IsConst(p, 4+isI
b860: 6e 69 74 2c 20 30 29 3b 0a 7d 0a 0a 23 69 66 64  nit, 0);.}..#ifd
b870: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
b880: 5f 43 55 52 53 4f 52 5f 48 49 4e 54 53 0a 2f 2a  _CURSOR_HINTS./*
b890: 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72  .** Walk an expr
b8a0: 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65  ession tree.  Re
b8b0: 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 65 78  turn 1 if the ex
b8c0: 70 72 65 73 73 69 6f 6e 20 63 6f 6e 74 61 69 6e  pression contain
b8d0: 73 20 61 0a 2a 2a 20 73 75 62 71 75 65 72 79 20  s a.** subquery 
b8e0: 6f 66 20 73 6f 6d 65 20 6b 69 6e 64 2e 20 20 52  of some kind.  R
b8f0: 65 74 75 72 6e 20 30 20 69 66 20 74 68 65 72 65  eturn 0 if there
b900: 20 61 72 65 20 6e 6f 20 73 75 62 71 75 65 72 69   are no subqueri
b910: 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  es..*/.int sqlit
b920: 65 33 45 78 70 72 43 6f 6e 74 61 69 6e 73 53 75  e3ExprContainsSu
b930: 62 71 75 65 72 79 28 45 78 70 72 20 2a 70 29 7b  bquery(Expr *p){
b940: 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 6d  .  Walker w;.  m
b950: 65 6d 73 65 74 28 26 77 2c 20 30 2c 20 73 69 7a  emset(&w, 0, siz
b960: 65 6f 66 28 77 29 29 3b 0a 20 20 77 2e 65 43 6f  eof(w));.  w.eCo
b970: 64 65 20 3d 20 31 3b 0a 20 20 77 2e 78 45 78 70  de = 1;.  w.xExp
b980: 72 43 61 6c 6c 62 61 63 6b 20 3d 20 73 71 6c 69  rCallback = sqli
b990: 74 65 33 45 78 70 72 57 61 6c 6b 4e 6f 6f 70 3b  te3ExprWalkNoop;
b9a0: 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c  .  w.xSelectCall
b9b0: 62 61 63 6b 20 3d 20 73 65 6c 65 63 74 4e 6f 64  back = selectNod
b9c0: 65 49 73 43 6f 6e 73 74 61 6e 74 3b 0a 20 20 73  eIsConstant;.  s
b9d0: 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26  qlite3WalkExpr(&
b9e0: 77 2c 20 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  w, p);.  return 
b9f0: 77 2e 65 43 6f 64 65 3d 3d 30 3b 0a 7d 0a 23 65  w.eCode==0;.}.#e
ba00: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  ndif../*.** If t
ba10: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 20  he expression p 
ba20: 63 6f 64 65 73 20 61 20 63 6f 6e 73 74 61 6e 74  codes a constant
ba30: 20 69 6e 74 65 67 65 72 20 74 68 61 74 20 69 73   integer that is
ba40: 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 0a 2a 2a   small enough.**
ba50: 20 74 6f 20 66 69 74 20 69 6e 20 61 20 33 32 2d   to fit in a 32-
ba60: 62 69 74 20 69 6e 74 65 67 65 72 2c 20 72 65 74  bit integer, ret
ba70: 75 72 6e 20 31 20 61 6e 64 20 70 75 74 20 74 68  urn 1 and put th
ba80: 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 69  e value of the i
ba90: 6e 74 65 67 65 72 0a 2a 2a 20 69 6e 20 2a 70 56  nteger.** in *pV
baa0: 61 6c 75 65 2e 20 20 49 66 20 74 68 65 20 65 78  alue.  If the ex
bab0: 70 72 65 73 73 69 6f 6e 20 69 73 20 6e 6f 74 20  pression is not 
bac0: 61 6e 20 69 6e 74 65 67 65 72 20 6f 72 20 69 66  an integer or if
bad0: 20 69 74 20 69 73 20 74 6f 6f 20 62 69 67 0a 2a   it is too big.*
bae0: 2a 20 74 6f 20 66 69 74 20 69 6e 20 61 20 73 69  * to fit in a si
baf0: 67 6e 65 64 20 33 32 2d 62 69 74 20 69 6e 74 65  gned 32-bit inte
bb00: 67 65 72 2c 20 72 65 74 75 72 6e 20 30 20 61 6e  ger, return 0 an
bb10: 64 20 6c 65 61 76 65 20 2a 70 56 61 6c 75 65 20  d leave *pValue 
bb20: 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e  unchanged..*/.in
bb30: 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49  t sqlite3ExprIsI
bb40: 6e 74 65 67 65 72 28 45 78 70 72 20 2a 70 2c 20  nteger(Expr *p, 
bb50: 69 6e 74 20 2a 70 56 61 6c 75 65 29 7b 0a 20 20  int *pValue){.  
bb60: 69 6e 74 20 72 63 20 3d 20 30 3b 0a 0a 20 20 2f  int rc = 0;..  /
bb70: 2a 20 49 66 20 61 6e 20 65 78 70 72 65 73 73 69  * If an expressi
bb80: 6f 6e 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72  on is an integer
bb90: 20 6c 69 74 65 72 61 6c 20 74 68 61 74 20 66 69   literal that fi
bba0: 74 73 20 69 6e 20 61 20 73 69 67 6e 65 64 20 33  ts in a signed 3
bbb0: 32 2d 62 69 74 0a 20 20 2a 2a 20 69 6e 74 65 67  2-bit.  ** integ
bbc0: 65 72 2c 20 74 68 65 6e 20 74 68 65 20 45 50 5f  er, then the EP_
bbd0: 49 6e 74 56 61 6c 75 65 20 66 6c 61 67 20 77 69  IntValue flag wi
bbe0: 6c 6c 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  ll have already 
bbf0: 62 65 65 6e 20 73 65 74 20 2a 2f 0a 20 20 61 73  been set */.  as
bc00: 73 65 72 74 28 20 70 2d 3e 6f 70 21 3d 54 4b 5f  sert( p->op!=TK_
bc10: 49 4e 54 45 47 45 52 20 7c 7c 20 28 70 2d 3e 66  INTEGER || (p->f
bc20: 6c 61 67 73 20 26 20 45 50 5f 49 6e 74 56 61 6c  lags & EP_IntVal
bc30: 75 65 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20  ue)!=0.         
bc40: 20 20 7c 7c 20 73 71 6c 69 74 65 33 47 65 74 49    || sqlite3GetI
bc50: 6e 74 33 32 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e  nt32(p->u.zToken
bc60: 2c 20 26 72 63 29 3d 3d 30 20 29 3b 0a 0a 20 20  , &rc)==0 );..  
bc70: 69 66 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 45  if( p->flags & E
bc80: 50 5f 49 6e 74 56 61 6c 75 65 20 29 7b 0a 20 20  P_IntValue ){.  
bc90: 20 20 2a 70 56 61 6c 75 65 20 3d 20 70 2d 3e 75    *pValue = p->u
bca0: 2e 69 56 61 6c 75 65 3b 0a 20 20 20 20 72 65 74  .iValue;.    ret
bcb0: 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 73 77 69  urn 1;.  }.  swi
bcc0: 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20  tch( p->op ){.  
bcd0: 20 20 63 61 73 65 20 54 4b 5f 55 50 4c 55 53 3a    case TK_UPLUS:
bce0: 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71   {.      rc = sq
bcf0: 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67  lite3ExprIsInteg
bd00: 65 72 28 70 2d 3e 70 4c 65 66 74 2c 20 70 56 61  er(p->pLeft, pVa
bd10: 6c 75 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61  lue);.      brea
bd20: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
bd30: 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20  e TK_UMINUS: {. 
bd40: 20 20 20 20 20 69 6e 74 20 76 3b 0a 20 20 20 20       int v;.    
bd50: 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
bd60: 72 49 73 49 6e 74 65 67 65 72 28 70 2d 3e 70 4c  rIsInteger(p->pL
bd70: 65 66 74 2c 20 26 76 29 20 29 7b 0a 20 20 20 20  eft, &v) ){.    
bd80: 20 20 20 20 61 73 73 65 72 74 28 20 76 21 3d 28      assert( v!=(
bd90: 2d 32 31 34 37 34 38 33 36 34 37 2d 31 29 20 29  -2147483647-1) )
bda0: 3b 0a 20 20 20 20 20 20 20 20 2a 70 56 61 6c 75  ;.        *pValu
bdb0: 65 20 3d 20 2d 76 3b 0a 20 20 20 20 20 20 20 20  e = -v;.        
bdc0: 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  rc = 1;.      }.
bdd0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
bde0: 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20   }.    default: 
bdf0: 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74  break;.  }.  ret
be00: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
be10: 20 52 65 74 75 72 6e 20 46 41 4c 53 45 20 69 66   Return FALSE if
be20: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 63 68 61   there is no cha
be30: 6e 63 65 20 74 68 61 74 20 74 68 65 20 65 78 70  nce that the exp
be40: 72 65 73 73 69 6f 6e 20 63 61 6e 20 62 65 20 4e  ression can be N
be50: 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ULL..**.** If th
be60: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 69 67  e expression mig
be70: 68 74 20 62 65 20 4e 55 4c 4c 20 6f 72 20 69 66  ht be NULL or if
be80: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
be90: 69 73 20 74 6f 6f 20 63 6f 6d 70 6c 65 78 0a 2a  is too complex.*
bea0: 2a 20 74 6f 20 74 65 6c 6c 20 72 65 74 75 72 6e  * to tell return
beb0: 20 54 52 55 45 2e 20 20 0a 2a 2a 0a 2a 2a 20 54   TRUE.  .**.** T
bec0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
bed0: 73 65 64 20 61 73 20 61 6e 20 6f 70 74 69 6d 69  sed as an optimi
bee0: 7a 61 74 69 6f 6e 2c 20 74 6f 20 73 6b 69 70 20  zation, to skip 
bef0: 4f 50 5f 49 73 4e 75 6c 6c 20 6f 70 63 6f 64 65  OP_IsNull opcode
bf00: 73 0a 2a 2a 20 77 68 65 6e 20 77 65 20 6b 6e 6f  s.** when we kno
bf10: 77 20 74 68 61 74 20 61 20 76 61 6c 75 65 20 63  w that a value c
bf20: 61 6e 6e 6f 74 20 62 65 20 4e 55 4c 4c 2e 20 20  annot be NULL.  
bf30: 48 65 6e 63 65 2c 20 61 20 66 61 6c 73 65 20 70  Hence, a false p
bf40: 6f 73 69 74 69 76 65 0a 2a 2a 20 28 72 65 74 75  ositive.** (retu
bf50: 72 6e 69 6e 67 20 54 52 55 45 20 77 68 65 6e 20  rning TRUE when 
bf60: 69 6e 20 66 61 63 74 20 74 68 65 20 65 78 70 72  in fact the expr
bf70: 65 73 73 69 6f 6e 20 63 61 6e 20 6e 65 76 65 72  ession can never
bf80: 20 62 65 20 4e 55 4c 4c 29 20 6d 69 67 68 74 0a   be NULL) might.
bf90: 2a 2a 20 62 65 20 61 20 73 6d 61 6c 6c 20 70 65  ** be a small pe
bfa0: 72 66 6f 72 6d 61 6e 63 65 20 68 69 74 20 62 75  rformance hit bu
bfb0: 74 20 69 73 20 6f 74 68 65 72 77 69 73 65 20 68  t is otherwise h
bfc0: 61 72 6d 6c 65 73 73 2e 20 20 4f 6e 20 74 68 65  armless.  On the
bfd0: 20 6f 74 68 65 72 0a 2a 2a 20 68 61 6e 64 2c 20   other.** hand, 
bfe0: 61 20 66 61 6c 73 65 20 6e 65 67 61 74 69 76 65  a false negative
bff0: 20 28 72 65 74 75 72 6e 69 6e 67 20 46 41 4c 53   (returning FALS
c000: 45 20 77 68 65 6e 20 74 68 65 20 72 65 73 75 6c  E when the resul
c010: 74 20 63 6f 75 6c 64 20 62 65 20 4e 55 4c 4c 29  t could be NULL)
c020: 0a 2a 2a 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20  .** will likely 
c030: 72 65 73 75 6c 74 20 69 6e 20 61 6e 20 69 6e 63  result in an inc
c040: 6f 72 72 65 63 74 20 61 6e 73 77 65 72 2e 20 20  orrect answer.  
c050: 53 6f 20 77 68 65 6e 20 69 6e 20 64 6f 75 62 74  So when in doubt
c060: 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 54 52 55 45  , return.** TRUE
c070: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
c080: 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28 63 6f  ExprCanBeNull(co
c090: 6e 73 74 20 45 78 70 72 20 2a 70 29 7b 0a 20 20  nst Expr *p){.  
c0a0: 75 38 20 6f 70 3b 0a 20 20 77 68 69 6c 65 28 20  u8 op;.  while( 
c0b0: 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 50 4c 55 53 20  p->op==TK_UPLUS 
c0c0: 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4d 49  || p->op==TK_UMI
c0d0: 4e 55 53 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4c  NUS ){ p = p->pL
c0e0: 65 66 74 3b 20 7d 0a 20 20 6f 70 20 3d 20 70 2d  eft; }.  op = p-
c0f0: 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54  >op;.  if( op==T
c100: 4b 5f 52 45 47 49 53 54 45 52 20 29 20 6f 70 20  K_REGISTER ) op 
c110: 3d 20 70 2d 3e 6f 70 32 3b 0a 20 20 73 77 69 74  = p->op2;.  swit
c120: 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61  ch( op ){.    ca
c130: 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 0a 20  se TK_INTEGER:. 
c140: 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e     case TK_STRIN
c150: 47 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46  G:.    case TK_F
c160: 4c 4f 41 54 3a 0a 20 20 20 20 63 61 73 65 20 54  LOAT:.    case T
c170: 4b 5f 42 4c 4f 42 3a 0a 20 20 20 20 20 20 72 65  K_BLOB:.      re
c180: 74 75 72 6e 20 30 3b 0a 20 20 20 20 63 61 73 65  turn 0;.    case
c190: 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20   TK_COLUMN:.    
c1a0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 54 61    assert( p->pTa
c1b0: 62 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 65  b!=0 );.      re
c1c0: 74 75 72 6e 20 45 78 70 72 48 61 73 50 72 6f 70  turn ExprHasProp
c1d0: 65 72 74 79 28 70 2c 20 45 50 5f 43 61 6e 42 65  erty(p, EP_CanBe
c1e0: 4e 75 6c 6c 29 20 7c 7c 0a 20 20 20 20 20 20 20  Null) ||.       
c1f0: 20 20 20 20 20 20 28 70 2d 3e 69 43 6f 6c 75 6d        (p->iColum
c200: 6e 3e 3d 30 20 26 26 20 70 2d 3e 70 54 61 62 2d  n>=0 && p->pTab-
c210: 3e 61 43 6f 6c 5b 70 2d 3e 69 43 6f 6c 75 6d 6e  >aCol[p->iColumn
c220: 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 29 3b 0a 20  ].notNull==0);. 
c230: 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20     default:.    
c240: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
c250: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
c260: 54 52 55 45 20 69 66 20 74 68 65 20 67 69 76 65  TRUE if the give
c270: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  n expression is 
c280: 61 20 63 6f 6e 73 74 61 6e 74 20 77 68 69 63 68  a constant which
c290: 20 77 6f 75 6c 64 20 62 65 0a 2a 2a 20 75 6e 63   would be.** unc
c2a0: 68 61 6e 67 65 64 20 62 79 20 4f 50 5f 41 66 66  hanged by OP_Aff
c2b0: 69 6e 69 74 79 20 77 69 74 68 20 74 68 65 20 61  inity with the a
c2c0: 66 66 69 6e 69 74 79 20 67 69 76 65 6e 20 69 6e  ffinity given in
c2d0: 20 74 68 65 20 73 65 63 6f 6e 64 0a 2a 2a 20 61   the second.** a
c2e0: 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54  rgument..**.** T
c2f0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
c300: 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  sed to determine
c310: 20 69 66 20 74 68 65 20 4f 50 5f 41 66 66 69 6e   if the OP_Affin
c320: 69 74 79 20 6f 70 65 72 61 74 69 6f 6e 0a 2a 2a  ity operation.**
c330: 20 63 61 6e 20 62 65 20 6f 6d 69 74 74 65 64 2e   can be omitted.
c340: 20 20 57 68 65 6e 20 69 6e 20 64 6f 75 62 74 20    When in doubt 
c350: 72 65 74 75 72 6e 20 46 41 4c 53 45 2e 20 20 41  return FALSE.  A
c360: 20 66 61 6c 73 65 20 6e 65 67 61 74 69 76 65 0a   false negative.
c370: 2a 2a 20 69 73 20 68 61 72 6d 6c 65 73 73 2e 20  ** is harmless. 
c380: 20 41 20 66 61 6c 73 65 20 70 6f 73 69 74 69 76   A false positiv
c390: 65 2c 20 68 6f 77 65 76 65 72 2c 20 63 61 6e 20  e, however, can 
c3a0: 72 65 73 75 6c 74 20 69 6e 20 74 68 65 20 77 72  result in the wr
c3b0: 6f 6e 67 0a 2a 2a 20 61 6e 73 77 65 72 2e 0a 2a  ong.** answer..*
c3c0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
c3d0: 72 4e 65 65 64 73 4e 6f 41 66 66 69 6e 69 74 79  rNeedsNoAffinity
c3e0: 43 68 61 6e 67 65 28 63 6f 6e 73 74 20 45 78 70  Change(const Exp
c3f0: 72 20 2a 70 2c 20 63 68 61 72 20 61 66 66 29 7b  r *p, char aff){
c400: 0a 20 20 75 38 20 6f 70 3b 0a 20 20 69 66 28 20  .  u8 op;.  if( 
c410: 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
c420: 42 4c 4f 42 20 29 20 72 65 74 75 72 6e 20 31 3b  BLOB ) return 1;
c430: 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 6f 70 3d  .  while( p->op=
c440: 3d 54 4b 5f 55 50 4c 55 53 20 7c 7c 20 70 2d 3e  =TK_UPLUS || p->
c450: 6f 70 3d 3d 54 4b 5f 55 4d 49 4e 55 53 20 29 7b  op==TK_UMINUS ){
c460: 20 70 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 20 7d   p = p->pLeft; }
c470: 0a 20 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20  .  op = p->op;. 
c480: 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 52 45 47 49   if( op==TK_REGI
c490: 53 54 45 52 20 29 20 6f 70 20 3d 20 70 2d 3e 6f  STER ) op = p->o
c4a0: 70 32 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70  p2;.  switch( op
c4b0: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
c4c0: 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20 20  INTEGER: {.     
c4d0: 20 72 65 74 75 72 6e 20 61 66 66 3d 3d 53 51 4c   return aff==SQL
c4e0: 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20  ITE_AFF_INTEGER 
c4f0: 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41  || aff==SQLITE_A
c500: 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 20 20  FF_NUMERIC;.    
c510: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 4c  }.    case TK_FL
c520: 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20 72 65 74  OAT: {.      ret
c530: 75 72 6e 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f  urn aff==SQLITE_
c540: 41 46 46 5f 52 45 41 4c 20 7c 7c 20 61 66 66 3d  AFF_REAL || aff=
c550: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45  =SQLITE_AFF_NUME
c560: 52 49 43 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  RIC;.    }.    c
c570: 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 20 7b  ase TK_STRING: {
c580: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 61 66  .      return af
c590: 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45  f==SQLITE_AFF_TE
c5a0: 58 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  XT;.    }.    ca
c5b0: 73 65 20 54 4b 5f 42 4c 4f 42 3a 20 7b 0a 20 20  se TK_BLOB: {.  
c5c0: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
c5d0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
c5e0: 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20  COLUMN: {.      
c5f0: 61 73 73 65 72 74 28 20 70 2d 3e 69 54 61 62 6c  assert( p->iTabl
c600: 65 3e 3d 30 20 29 3b 20 20 2f 2a 20 70 20 63 61  e>=0 );  /* p ca
c610: 6e 6e 6f 74 20 62 65 20 70 61 72 74 20 6f 66 20  nnot be part of 
c620: 61 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69  a CHECK constrai
c630: 6e 74 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75  nt */.      retu
c640: 72 6e 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 0a  rn p->iColumn<0.
c650: 20 20 20 20 20 20 20 20 20 20 26 26 20 28 61 66            && (af
c660: 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e  f==SQLITE_AFF_IN
c670: 54 45 47 45 52 20 7c 7c 20 61 66 66 3d 3d 53 51  TEGER || aff==SQ
c680: 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43  LITE_AFF_NUMERIC
c690: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66  );.    }.    def
c6a0: 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 72 65  ault: {.      re
c6b0: 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
c6c0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  }.}../*.** Retur
c6d0: 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 67 69  n TRUE if the gi
c6e0: 76 65 6e 20 73 74 72 69 6e 67 20 69 73 20 61 20  ven string is a 
c6f0: 72 6f 77 2d 69 64 20 63 6f 6c 75 6d 6e 20 6e 61  row-id column na
c700: 6d 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  me..*/.int sqlit
c710: 65 33 49 73 52 6f 77 69 64 28 63 6f 6e 73 74 20  e3IsRowid(const 
c720: 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 66 28 20  char *z){.  if( 
c730: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
c740: 2c 20 22 5f 52 4f 57 49 44 5f 22 29 3d 3d 30 20  , "_ROWID_")==0 
c750: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66  ) return 1;.  if
c760: 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
c770: 28 7a 2c 20 22 52 4f 57 49 44 22 29 3d 3d 30 20  (z, "ROWID")==0 
c780: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66  ) return 1;.  if
c790: 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
c7a0: 28 7a 2c 20 22 4f 49 44 22 29 3d 3d 30 20 29 20  (z, "OID")==0 ) 
c7b0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 72 65 74 75  return 1;.  retu
c7c0: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  rn 0;.}../*.** R
c7d0: 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 77 65  eturn true if we
c7e0: 20 61 72 65 20 61 62 6c 65 20 74 6f 20 74 68 65   are able to the
c7f0: 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 6f 70 74   IN operator opt
c800: 69 6d 69 7a 61 74 69 6f 6e 20 6f 6e 20 61 0a 2a  imization on a.*
c810: 2a 20 71 75 65 72 79 20 6f 66 20 74 68 65 20 66  * query of the f
c820: 6f 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  orm.**.**       
c830: 78 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e  x IN (SELECT ...
c840: 29 0a 2a 2a 0a 2a 2a 20 57 68 65 72 65 20 74 68  ).**.** Where th
c850: 65 20 53 45 4c 45 43 54 2e 2e 2e 20 63 6c 61 75  e SELECT... clau
c860: 73 65 20 69 73 20 61 73 20 73 70 65 63 69 66 69  se is as specifi
c870: 65 64 20 62 79 20 74 68 65 20 70 61 72 61 6d 65  ed by the parame
c880: 74 65 72 20 74 6f 20 74 68 69 73 0a 2a 2a 20 72  ter to this.** r
c890: 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  outine..**.** Th
c8a0: 65 20 53 65 6c 65 63 74 20 6f 62 6a 65 63 74 20  e Select object 
c8b0: 70 61 73 73 65 64 20 69 6e 20 68 61 73 20 61 6c  passed in has al
c8c0: 72 65 61 64 79 20 62 65 65 6e 20 70 72 65 70 72  ready been prepr
c8d0: 6f 63 65 73 73 65 64 20 61 6e 64 20 6e 6f 0a 2a  ocessed and no.*
c8e0: 2a 20 65 72 72 6f 72 73 20 68 61 76 65 20 62 65  * errors have be
c8f0: 65 6e 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 23 69 66  en found..*/.#if
c900: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
c910: 5f 53 55 42 51 55 45 52 59 0a 73 74 61 74 69 63  _SUBQUERY.static
c920: 20 69 6e 74 20 69 73 43 61 6e 64 69 64 61 74 65   int isCandidate
c930: 46 6f 72 49 6e 4f 70 74 28 53 65 6c 65 63 74 20  ForInOpt(Select 
c940: 2a 70 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a  *p){.  SrcList *
c950: 70 53 72 63 3b 0a 20 20 45 78 70 72 4c 69 73 74  pSrc;.  ExprList
c960: 20 2a 70 45 4c 69 73 74 3b 0a 20 20 54 61 62 6c   *pEList;.  Tabl
c970: 65 20 2a 70 54 61 62 3b 0a 20 20 69 66 28 20 70  e *pTab;.  if( p
c980: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20  ==0 ) return 0; 
c990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c9a0: 20 20 2f 2a 20 72 69 67 68 74 2d 68 61 6e 64 20    /* right-hand 
c9b0: 73 69 64 65 20 6f 66 20 49 4e 20 69 73 20 53 45  side of IN is SE
c9c0: 4c 45 43 54 20 2a 2f 0a 20 20 69 66 28 20 70 2d  LECT */.  if( p-
c9d0: 3e 70 50 72 69 6f 72 20 29 20 72 65 74 75 72 6e  >pPrior ) return
c9e0: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
c9f0: 20 2f 2a 20 4e 6f 74 20 61 20 63 6f 6d 70 6f 75   /* Not a compou
ca00: 6e 64 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 69  nd SELECT */.  i
ca10: 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  f( p->selFlags &
ca20: 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46   (SF_Distinct|SF
ca30: 5f 41 67 67 72 65 67 61 74 65 29 20 29 7b 0a 20  _Aggregate) ){. 
ca40: 20 20 20 74 65 73 74 63 61 73 65 28 20 28 70 2d     testcase( (p-
ca50: 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f  >selFlags & (SF_
ca60: 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72  Distinct|SF_Aggr
ca70: 65 67 61 74 65 29 29 3d 3d 53 46 5f 44 69 73 74  egate))==SF_Dist
ca80: 69 6e 63 74 20 29 3b 0a 20 20 20 20 74 65 73 74  inct );.    test
ca90: 63 61 73 65 28 20 28 70 2d 3e 73 65 6c 46 6c 61  case( (p->selFla
caa0: 67 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63  gs & (SF_Distinc
cab0: 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29 29  t|SF_Aggregate))
cac0: 3d 3d 53 46 5f 41 67 67 72 65 67 61 74 65 20 29  ==SF_Aggregate )
cad0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20  ;.    return 0; 
cae0: 2f 2a 20 4e 6f 20 44 49 53 54 49 4e 43 54 20 6b  /* No DISTINCT k
caf0: 65 79 77 6f 72 64 20 61 6e 64 20 6e 6f 20 61 67  eyword and no ag
cb00: 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
cb10: 73 20 2a 2f 0a 20 20 7d 0a 20 20 61 73 73 65 72  s */.  }.  asser
cb20: 74 28 20 70 2d 3e 70 47 72 6f 75 70 42 79 3d 3d  t( p->pGroupBy==
cb30: 30 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  0 );            
cb40: 20 20 2f 2a 20 48 61 73 20 6e 6f 20 47 52 4f 55    /* Has no GROU
cb50: 50 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20  P BY clause */. 
cb60: 20 69 66 28 20 70 2d 3e 70 4c 69 6d 69 74 20 29   if( p->pLimit )
cb70: 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
cb80: 20 20 20 20 20 20 20 20 2f 2a 20 48 61 73 20 6e          /* Has n
cb90: 6f 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 2a  o LIMIT clause *
cba0: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  /.  assert( p->p
cbb0: 4f 66 66 73 65 74 3d 3d 30 20 29 3b 20 20 20 20  Offset==0 );    
cbc0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f             /* No
cbd0: 20 4c 49 4d 49 54 20 6d 65 61 6e 73 20 6e 6f 20   LIMIT means no 
cbe0: 4f 46 46 53 45 54 20 2a 2f 0a 20 20 69 66 28 20  OFFSET */.  if( 
cbf0: 70 2d 3e 70 57 68 65 72 65 20 29 20 72 65 74 75  p->pWhere ) retu
cc00: 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
cc10: 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20 57 48 45     /* Has no WHE
cc20: 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 70  RE clause */.  p
cc30: 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20  Src = p->pSrc;. 
cc40: 20 61 73 73 65 72 74 28 20 70 53 72 63 21 3d 30   assert( pSrc!=0
cc50: 20 29 3b 0a 20 20 69 66 28 20 70 53 72 63 2d 3e   );.  if( pSrc->
cc60: 6e 53 72 63 21 3d 31 20 29 20 72 65 74 75 72 6e  nSrc!=1 ) return
cc70: 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20   0;          /* 
cc80: 53 69 6e 67 6c 65 20 74 65 72 6d 20 69 6e 20 46  Single term in F
cc90: 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ROM clause */.  
cca0: 69 66 28 20 70 53 72 63 2d 3e 61 5b 30 5d 2e 70  if( pSrc->a[0].p
ccb0: 53 65 6c 65 63 74 20 29 20 72 65 74 75 72 6e 20  Select ) return 
ccc0: 30 3b 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 69  0;     /* FROM i
ccd0: 73 20 6e 6f 74 20 61 20 73 75 62 71 75 65 72 79  s not a subquery
cce0: 20 6f 72 20 76 69 65 77 20 2a 2f 0a 20 20 70 54   or view */.  pT
ccf0: 61 62 20 3d 20 70 53 72 63 2d 3e 61 5b 30 5d 2e  ab = pSrc->a[0].
cd00: 70 54 61 62 3b 0a 20 20 69 66 28 20 4e 45 56 45  pTab;.  if( NEVE
cd10: 52 28 70 54 61 62 3d 3d 30 29 20 29 20 72 65 74  R(pTab==0) ) ret
cd20: 75 72 6e 20 30 3b 0a 20 20 61 73 73 65 72 74 28  urn 0;.  assert(
cd30: 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 3d 3d   pTab->pSelect==
cd40: 30 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  0 );            
cd50: 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69  /* FROM clause i
cd60: 73 20 6e 6f 74 20 61 20 76 69 65 77 20 2a 2f 0a  s not a view */.
cd70: 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28    if( IsVirtual(
cd80: 70 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 30  pTab) ) return 0
cd90: 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 52 4f 4d  ;        /* FROM
cda0: 20 63 6c 61 75 73 65 20 6e 6f 74 20 61 20 76 69   clause not a vi
cdb0: 72 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20  rtual table */. 
cdc0: 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c   pEList = p->pEL
cdd0: 69 73 74 3b 0a 20 20 69 66 28 20 70 45 4c 69 73  ist;.  if( pELis
cde0: 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29 20 72 65  t->nExpr!=1 ) re
cdf0: 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 2f 2a  turn 0;       /*
ce00: 20 4f 6e 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 74   One column in t
ce10: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f  he result set */
ce20: 0a 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 61  .  if( pEList->a
ce30: 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 21 3d 54  [0].pExpr->op!=T
ce40: 4b 5f 43 4f 4c 55 4d 4e 20 29 20 72 65 74 75 72  K_COLUMN ) retur
ce50: 6e 20 30 3b 20 2f 2a 20 52 65 73 75 6c 74 20 69  n 0; /* Result i
ce60: 73 20 61 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20  s a column */.  
ce70: 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64  return 1;.}.#end
ce80: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
ce90: 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 2f  T_SUBQUERY */../
cea0: 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f  *.** Code an OP_
ceb0: 4f 6e 63 65 20 69 6e 73 74 72 75 63 74 69 6f 6e  Once instruction
cec0: 20 61 6e 64 20 61 6c 6c 6f 63 61 74 65 20 73 70   and allocate sp
ced0: 61 63 65 20 66 6f 72 20 69 74 73 20 66 6c 61 67  ace for its flag
cee0: 2e 20 52 65 74 75 72 6e 20 74 68 65 20 0a 2a 2a  . Return the .**
cef0: 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   address of the 
cf00: 6e 65 77 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e  new instruction.
cf10: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 43  .*/.int sqlite3C
cf20: 6f 64 65 4f 6e 63 65 28 50 61 72 73 65 20 2a 70  odeOnce(Parse *p
cf30: 50 61 72 73 65 29 7b 0a 20 20 56 64 62 65 20 2a  Parse){.  Vdbe *
cf40: 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
cf50: 62 65 28 70 50 61 72 73 65 29 3b 20 20 20 20 20  be(pParse);     
cf60: 20 2f 2a 20 56 69 72 74 75 61 6c 20 6d 61 63 68   /* Virtual mach
cf70: 69 6e 65 20 62 65 69 6e 67 20 63 6f 64 65 64 20  ine being coded 
cf80: 2a 2f 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  */.  return sqli
cf90: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
cfa0: 20 4f 50 5f 4f 6e 63 65 2c 20 70 50 61 72 73 65   OP_Once, pParse
cfb0: 2d 3e 6e 4f 6e 63 65 2b 2b 29 3b 0a 7d 0a 0a 2f  ->nOnce++);.}../
cfc0: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
cfd0: 64 65 20 74 68 61 74 20 63 68 65 63 6b 73 20 74  de that checks t
cfe0: 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c  he left-most col
cff0: 75 6d 6e 20 6f 66 20 69 6e 64 65 78 20 74 61 62  umn of index tab
d000: 6c 65 20 69 43 75 72 20 74 6f 20 73 65 65 20 69  le iCur to see i
d010: 66 0a 2a 2a 20 69 74 20 63 6f 6e 74 61 69 6e 73  f.** it contains
d020: 20 61 6e 79 20 4e 55 4c 4c 20 65 6e 74 72 69 65   any NULL entrie
d030: 73 2e 20 20 43 61 75 73 65 20 74 68 65 20 72 65  s.  Cause the re
d040: 67 69 73 74 65 72 20 61 74 20 72 65 67 48 61 73  gister at regHas
d050: 4e 75 6c 6c 20 74 6f 20 62 65 20 73 65 74 0a 2a  Null to be set.*
d060: 2a 20 74 6f 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20  * to a non-NULL 
d070: 76 61 6c 75 65 20 69 66 20 69 43 75 72 20 63 6f  value if iCur co
d080: 6e 74 61 69 6e 73 20 6e 6f 20 4e 55 4c 4c 73 2e  ntains no NULLs.
d090: 20 20 43 61 75 73 65 20 72 65 67 69 73 74 65 72    Cause register
d0a0: 20 72 65 67 48 61 73 4e 75 6c 6c 0a 2a 2a 20 74   regHasNull.** t
d0b0: 6f 20 62 65 20 73 65 74 20 74 6f 20 4e 55 4c 4c  o be set to NULL
d0c0: 20 69 66 20 69 43 75 72 20 63 6f 6e 74 61 69 6e   if iCur contain
d0d0: 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 4e 55  s one or more NU
d0e0: 4c 4c 20 76 61 6c 75 65 73 2e 0a 2a 2f 0a 73 74  LL values..*/.st
d0f0: 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65  atic void sqlite
d100: 33 53 65 74 48 61 73 4e 75 6c 6c 46 6c 61 67 28  3SetHasNullFlag(
d110: 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 69 43 75  Vdbe *v, int iCu
d120: 72 2c 20 69 6e 74 20 72 65 67 48 61 73 4e 75 6c  r, int regHasNul
d130: 6c 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 31 3b  l){.  int addr1;
d140: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
d150: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
d160: 65 72 2c 20 30 2c 20 72 65 67 48 61 73 4e 75 6c  er, 0, regHasNul
d170: 6c 29 3b 0a 20 20 61 64 64 72 31 20 3d 20 73 71  l);.  addr1 = sq
d180: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
d190: 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 43  v, OP_Rewind, iC
d1a0: 75 72 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  ur); VdbeCoverag
d1b0: 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  e(v);.  sqlite3V
d1c0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
d1d0: 43 6f 6c 75 6d 6e 2c 20 69 43 75 72 2c 20 30 2c  Column, iCur, 0,
d1e0: 20 72 65 67 48 61 73 4e 75 6c 6c 29 3b 0a 20 20   regHasNull);.  
d1f0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
d200: 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 54 59  eP5(v, OPFLAG_TY
d210: 50 45 4f 46 41 52 47 29 3b 0a 20 20 56 64 62 65  PEOFARG);.  Vdbe
d220: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 66 69 72  Comment((v, "fir
d230: 73 74 5f 65 6e 74 72 79 5f 69 6e 28 25 64 29 22  st_entry_in(%d)"
d240: 2c 20 69 43 75 72 29 29 3b 0a 20 20 73 71 6c 69  , iCur));.  sqli
d250: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
d260: 76 2c 20 61 64 64 72 31 29 3b 0a 7d 0a 0a 0a 23  v, addr1);.}...#
d270: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
d280: 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a  IT_SUBQUERY./*.*
d290: 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20 69  * The argument i
d2a0: 73 20 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72  s an IN operator
d2b0: 20 77 69 74 68 20 61 20 6c 69 73 74 20 28 6e 6f   with a list (no
d2c0: 74 20 61 20 73 75 62 71 75 65 72 79 29 20 6f 6e  t a subquery) on
d2d0: 20 74 68 65 20 0a 2a 2a 20 72 69 67 68 74 2d 68   the .** right-h
d2e0: 61 6e 64 20 73 69 64 65 2e 20 20 52 65 74 75 72  and side.  Retur
d2f0: 6e 20 54 52 55 45 20 69 66 20 74 68 61 74 20 6c  n TRUE if that l
d300: 69 73 74 20 69 73 20 63 6f 6e 73 74 61 6e 74 2e  ist is constant.
d310: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
d320: 71 6c 69 74 65 33 49 6e 52 68 73 49 73 43 6f 6e  qlite3InRhsIsCon
d330: 73 74 61 6e 74 28 45 78 70 72 20 2a 70 49 6e 29  stant(Expr *pIn)
d340: 7b 0a 20 20 45 78 70 72 20 2a 70 4c 48 53 3b 0a  {.  Expr *pLHS;.
d350: 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 61 73 73    int res;.  ass
d360: 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
d370: 70 65 72 74 79 28 70 49 6e 2c 20 45 50 5f 78 49  perty(pIn, EP_xI
d380: 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 70 4c  sSelect) );.  pL
d390: 48 53 20 3d 20 70 49 6e 2d 3e 70 4c 65 66 74 3b  HS = pIn->pLeft;
d3a0: 0a 20 20 70 49 6e 2d 3e 70 4c 65 66 74 20 3d 20  .  pIn->pLeft = 
d3b0: 30 3b 0a 20 20 72 65 73 20 3d 20 73 71 6c 69 74  0;.  res = sqlit
d3c0: 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
d3d0: 28 70 49 6e 29 3b 0a 20 20 70 49 6e 2d 3e 70 4c  (pIn);.  pIn->pL
d3e0: 65 66 74 20 3d 20 70 4c 48 53 3b 0a 20 20 72 65  eft = pLHS;.  re
d3f0: 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 23 65 6e 64  turn res;.}.#end
d400: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  if../*.** This f
d410: 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
d420: 62 79 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74  by the implement
d430: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 49 4e 20  ation of the IN 
d440: 28 2e 2e 2e 29 20 6f 70 65 72 61 74 6f 72 2e 0a  (...) operator..
d450: 2a 2a 20 54 68 65 20 70 58 20 70 61 72 61 6d 65  ** The pX parame
d460: 74 65 72 20 69 73 20 74 68 65 20 65 78 70 72 65  ter is the expre
d470: 73 73 69 6f 6e 20 6f 6e 20 74 68 65 20 52 48 53  ssion on the RHS
d480: 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61   of the IN opera
d490: 74 6f 72 2c 20 77 68 69 63 68 0a 2a 2a 20 6d 69  tor, which.** mi
d4a0: 67 68 74 20 62 65 20 65 69 74 68 65 72 20 61 20  ght be either a 
d4b0: 6c 69 73 74 20 6f 66 20 65 78 70 72 65 73 73 69  list of expressi
d4c0: 6f 6e 73 20 6f 72 20 61 20 73 75 62 71 75 65 72  ons or a subquer
d4d0: 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 62  y..**.** The job
d4e0: 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   of this routine
d4f0: 20 69 73 20 74 6f 20 66 69 6e 64 20 6f 72 20 63   is to find or c
d500: 72 65 61 74 65 20 61 20 62 2d 74 72 65 65 20 6f  reate a b-tree o
d510: 62 6a 65 63 74 20 74 68 61 74 20 63 61 6e 0a 2a  bject that can.*
d520: 2a 20 62 65 20 75 73 65 64 20 65 69 74 68 65 72  * be used either
d530: 20 74 6f 20 74 65 73 74 20 66 6f 72 20 6d 65 6d   to test for mem
d540: 62 65 72 73 68 69 70 20 69 6e 20 74 68 65 20 52  bership in the R
d550: 48 53 20 73 65 74 20 6f 72 20 74 6f 20 69 74 65  HS set or to ite
d560: 72 61 74 65 20 74 68 72 6f 75 67 68 0a 2a 2a 20  rate through.** 
d570: 61 6c 6c 20 6d 65 6d 62 65 72 73 20 6f 66 20 74  all members of t
d580: 68 65 20 52 48 53 20 73 65 74 2c 20 73 6b 69 70  he RHS set, skip
d590: 70 69 6e 67 20 64 75 70 6c 69 63 61 74 65 73 2e  ping duplicates.
d5a0: 0a 2a 2a 0a 2a 2a 20 41 20 63 75 72 73 6f 72 20  .**.** A cursor 
d5b0: 69 73 20 6f 70 65 6e 65 64 20 6f 6e 20 74 68 65  is opened on the
d5c0: 20 62 2d 74 72 65 65 20 6f 62 6a 65 63 74 20 74   b-tree object t
d5d0: 68 61 74 20 69 73 20 74 68 65 20 52 48 53 20 6f  hat is the RHS o
d5e0: 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f  f the IN operato
d5f0: 72 0a 2a 2a 20 61 6e 64 20 70 58 2d 3e 69 54 61  r.** and pX->iTa
d600: 62 6c 65 20 69 73 20 73 65 74 20 74 6f 20 74 68  ble is set to th
d610: 65 20 69 6e 64 65 78 20 6f 66 20 74 68 61 74 20  e index of that 
d620: 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  cursor..**.** Th
d630: 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65  e returned value
d640: 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   of this functio
d650: 6e 20 69 6e 64 69 63 61 74 65 73 20 74 68 65 20  n indicates the 
d660: 62 2d 74 72 65 65 20 74 79 70 65 2c 20 61 73 20  b-tree type, as 
d670: 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
d680: 20 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 20   IN_INDEX_ROWID 
d690: 20 20 20 20 20 2d 20 54 68 65 20 63 75 72 73 6f       - The curso
d6a0: 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20  r was opened on 
d6b0: 61 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65  a database table
d6c0: 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f  ..**   IN_INDEX_
d6d0: 49 4e 44 45 58 5f 41 53 43 20 20 2d 20 54 68 65  INDEX_ASC  - The
d6e0: 20 63 75 72 73 6f 72 20 77 61 73 20 6f 70 65 6e   cursor was open
d6f0: 65 64 20 6f 6e 20 61 6e 20 61 73 63 65 6e 64 69  ed on an ascendi
d700: 6e 67 20 69 6e 64 65 78 2e 0a 2a 2a 20 20 20 49  ng index..**   I
d710: 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 44 45  N_INDEX_INDEX_DE
d720: 53 43 20 2d 20 54 68 65 20 63 75 72 73 6f 72 20  SC - The cursor 
d730: 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20  was opened on a 
d740: 64 65 73 63 65 6e 64 69 6e 67 20 69 6e 64 65 78  descending index
d750: 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f  ..**   IN_INDEX_
d760: 45 50 48 20 20 20 20 20 20 20 20 2d 20 54 68 65  EPH        - The
d770: 20 63 75 72 73 6f 72 20 77 61 73 20 6f 70 65 6e   cursor was open
d780: 65 64 20 6f 6e 20 61 20 73 70 65 63 69 61 6c 6c  ed on a speciall
d790: 79 20 63 72 65 61 74 65 64 20 61 6e 64 0a 2a 2a  y created and.**
d7a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d7b0: 20 20 20 20 20 20 20 20 20 70 6f 70 75 6c 61 74           populat
d7c0: 65 64 20 65 70 68 65 72 65 6d 61 6c 20 74 61 62  ed epheremal tab
d7d0: 6c 65 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45  le..**   IN_INDE
d7e0: 58 5f 4e 4f 4f 50 20 20 20 20 20 20 20 2d 20 4e  X_NOOP       - N
d7f0: 6f 20 63 75 72 73 6f 72 20 77 61 73 20 61 6c 6c  o cursor was all
d800: 6f 63 61 74 65 64 2e 20 20 54 68 65 20 49 4e 20  ocated.  The IN 
d810: 6f 70 65 72 61 74 6f 72 20 6d 75 73 74 20 62 65  operator must be
d820: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
d830: 20 20 20 20 20 20 20 20 20 20 20 20 69 6d 70 6c              impl
d840: 65 6d 65 6e 74 65 64 20 61 73 20 61 20 73 65 71  emented as a seq
d850: 75 65 6e 63 65 20 6f 66 20 63 6f 6d 70 61 72 69  uence of compari
d860: 73 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65  sons..**.** An e
d870: 78 69 73 74 69 6e 67 20 62 2d 74 72 65 65 20 6d  xisting b-tree m
d880: 69 67 68 74 20 62 65 20 75 73 65 64 20 69 66 20  ight be used if 
d890: 74 68 65 20 52 48 53 20 65 78 70 72 65 73 73 69  the RHS expressi
d8a0: 6f 6e 20 70 58 20 69 73 20 61 20 73 69 6d 70 6c  on pX is a simpl
d8b0: 65 0a 2a 2a 20 73 75 62 71 75 65 72 79 20 73 75  e.** subquery su
d8c0: 63 68 20 61 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  ch as:.**.**    
d8d0: 20 53 45 4c 45 43 54 20 3c 63 6f 6c 75 6d 6e 3e   SELECT <column>
d8e0: 20 46 52 4f 4d 20 3c 74 61 62 6c 65 3e 0a 2a 2a   FROM <table>.**
d8f0: 0a 2a 2a 20 49 66 20 74 68 65 20 52 48 53 20 6f  .** If the RHS o
d900: 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f  f the IN operato
d910: 72 20 69 73 20 61 20 6c 69 73 74 20 6f 72 20 61  r is a list or a
d920: 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20 73 75   more complex su
d930: 62 71 75 65 72 79 2c 20 74 68 65 6e 0a 2a 2a 20  bquery, then.** 
d940: 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62  an ephemeral tab
d950: 6c 65 20 6d 69 67 68 74 20 6e 65 65 64 20 74 6f  le might need to
d960: 20 62 65 20 67 65 6e 65 72 61 74 65 64 20 66 72   be generated fr
d970: 6f 6d 20 74 68 65 20 52 48 53 20 61 6e 64 20 74  om the RHS and t
d980: 68 65 6e 0a 2a 2a 20 70 58 2d 3e 69 54 61 62 6c  hen.** pX->iTabl
d990: 65 20 6d 61 64 65 20 74 6f 20 70 6f 69 6e 74 20  e made to point 
d9a0: 74 6f 20 74 68 65 20 65 70 68 65 6d 65 72 61 6c  to the ephemeral
d9b0: 20 74 61 62 6c 65 20 69 6e 73 74 65 61 64 20 6f   table instead o
d9c0: 66 20 61 6e 0a 2a 2a 20 65 78 69 73 74 69 6e 67  f an.** existing
d9d0: 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68   table..**.** Th
d9e0: 65 20 69 6e 46 6c 61 67 73 20 70 61 72 61 6d 65  e inFlags parame
d9f0: 74 65 72 20 6d 75 73 74 20 63 6f 6e 74 61 69 6e  ter must contain
da00: 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 6f 66 20   exactly one of 
da10: 74 68 65 20 62 69 74 73 0a 2a 2a 20 49 4e 5f 49  the bits.** IN_I
da20: 4e 44 45 58 5f 4d 45 4d 42 45 52 53 48 49 50 20  NDEX_MEMBERSHIP 
da30: 6f 72 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50  or IN_INDEX_LOOP
da40: 2e 20 20 49 66 20 69 6e 46 6c 61 67 73 20 63 6f  .  If inFlags co
da50: 6e 74 61 69 6e 73 0a 2a 2a 20 49 4e 5f 49 4e 44  ntains.** IN_IND
da60: 45 58 5f 4d 45 4d 42 45 52 53 48 49 50 2c 20 74  EX_MEMBERSHIP, t
da70: 68 65 6e 20 74 68 65 20 67 65 6e 65 72 61 74 65  hen the generate
da80: 64 20 74 61 62 6c 65 20 77 69 6c 6c 20 62 65 20  d table will be 
da90: 75 73 65 64 20 66 6f 72 20 61 0a 2a 2a 20 66 61  used for a.** fa
daa0: 73 74 20 6d 65 6d 62 65 72 73 68 69 70 20 74 65  st membership te
dab0: 73 74 2e 20 20 57 68 65 6e 20 74 68 65 20 49 4e  st.  When the IN
dac0: 5f 49 4e 44 45 58 5f 4c 4f 4f 50 20 62 69 74 20  _INDEX_LOOP bit 
dad0: 69 73 20 73 65 74 2c 20 74 68 65 0a 2a 2a 20 49  is set, the.** I
dae0: 4e 20 69 6e 64 65 78 20 77 69 6c 6c 20 62 65 20  N index will be 
daf0: 75 73 65 64 20 74 6f 20 6c 6f 6f 70 20 6f 76 65  used to loop ove
db00: 72 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f 66 20  r all values of 
db10: 74 68 65 20 52 48 53 20 6f 66 20 74 68 65 0a 2a  the RHS of the.*
db20: 2a 20 49 4e 20 6f 70 65 72 61 74 6f 72 2e 0a 2a  * IN operator..*
db30: 2a 0a 2a 2a 20 57 68 65 6e 20 49 4e 5f 49 4e 44  *.** When IN_IND
db40: 45 58 5f 4c 4f 4f 50 20 69 73 20 75 73 65 64 20  EX_LOOP is used 
db50: 28 61 6e 64 20 74 68 65 20 62 2d 74 72 65 65 20  (and the b-tree 
db60: 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f 20  will be used to 
db70: 69 74 65 72 61 74 65 0a 2a 2a 20 74 68 72 6f 75  iterate.** throu
db80: 67 68 20 74 68 65 20 73 65 74 20 6d 65 6d 62 65  gh the set membe
db90: 72 73 29 20 74 68 65 6e 20 74 68 65 20 62 2d 74  rs) then the b-t
dba0: 72 65 65 20 6d 75 73 74 20 6e 6f 74 20 63 6f 6e  ree must not con
dbb0: 74 61 69 6e 20 64 75 70 6c 69 63 61 74 65 73 2e  tain duplicates.
dbc0: 0a 2a 2a 20 41 6e 20 65 70 68 65 72 65 6d 61 6c  .** An epheremal
dbd0: 20 74 61 62 6c 65 20 6d 75 73 74 20 62 65 20 75   table must be u
dbe0: 73 65 64 20 75 6e 6c 65 73 73 20 74 68 65 20 73  sed unless the s
dbf0: 65 6c 65 63 74 65 64 20 3c 63 6f 6c 75 6d 6e 3e  elected <column>
dc00: 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 0a 2a   is guaranteed.*
dc10: 2a 20 74 6f 20 62 65 20 75 6e 69 71 75 65 20 2d  * to be unique -
dc20: 20 65 69 74 68 65 72 20 62 65 63 61 75 73 65 20   either because 
dc30: 69 74 20 69 73 20 61 6e 20 49 4e 54 45 47 45 52  it is an INTEGER
dc40: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20   PRIMARY KEY or 
dc50: 69 74 0a 2a 2a 20 68 61 73 20 61 20 55 4e 49 51  it.** has a UNIQ
dc60: 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 72  UE constraint or
dc70: 20 55 4e 49 51 55 45 20 69 6e 64 65 78 2e 0a 2a   UNIQUE index..*
dc80: 2a 0a 2a 2a 20 57 68 65 6e 20 49 4e 5f 49 4e 44  *.** When IN_IND
dc90: 45 58 5f 4d 45 4d 42 45 52 53 48 49 50 20 69 73  EX_MEMBERSHIP is
dca0: 20 75 73 65 64 20 28 61 6e 64 20 74 68 65 20 62   used (and the b
dcb0: 2d 74 72 65 65 20 77 69 6c 6c 20 62 65 20 75 73  -tree will be us
dcc0: 65 64 20 0a 2a 2a 20 66 6f 72 20 66 61 73 74 20  ed .** for fast 
dcd0: 73 65 74 20 6d 65 6d 62 65 72 73 68 69 70 20 74  set membership t
dce0: 65 73 74 73 29 20 74 68 65 6e 20 61 6e 20 65 70  ests) then an ep
dcf0: 68 65 72 65 6d 61 6c 20 74 61 62 6c 65 20 6d 75  heremal table mu
dd00: 73 74 20 0a 2a 2a 20 62 65 20 75 73 65 64 20 75  st .** be used u
dd10: 6e 6c 65 73 73 20 3c 63 6f 6c 75 6d 6e 3e 20 69  nless <column> i
dd20: 73 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49  s an INTEGER PRI
dd30: 4d 41 52 59 20 4b 45 59 20 6f 72 20 61 6e 20 69  MARY KEY or an i
dd40: 6e 64 65 78 20 63 61 6e 20 0a 2a 2a 20 62 65 20  ndex can .** be 
dd50: 66 6f 75 6e 64 20 77 69 74 68 20 3c 63 6f 6c 75  found with <colu
dd60: 6d 6e 3e 20 61 73 20 69 74 73 20 6c 65 66 74 2d  mn> as its left-
dd70: 6d 6f 73 74 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a 0a  most column..**.
dd80: 2a 2a 20 49 66 20 74 68 65 20 49 4e 5f 49 4e 44  ** If the IN_IND
dd90: 45 58 5f 4e 4f 4f 50 5f 4f 4b 20 61 6e 64 20 49  EX_NOOP_OK and I
dda0: 4e 5f 49 4e 44 45 58 5f 4d 45 4d 42 45 52 53 48  N_INDEX_MEMBERSH
ddb0: 49 50 20 61 72 65 20 62 6f 74 68 20 73 65 74 20  IP are both set 
ddc0: 61 6e 64 0a 2a 2a 20 69 66 20 74 68 65 20 52 48  and.** if the RH
ddd0: 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72  S of the IN oper
dde0: 61 74 6f 72 20 69 73 20 61 20 6c 69 73 74 20 28  ator is a list (
ddf0: 6e 6f 74 20 61 20 73 75 62 71 75 65 72 79 29 20  not a subquery) 
de00: 74 68 65 6e 20 74 68 69 73 0a 2a 2a 20 72 6f 75  then this.** rou
de10: 74 69 6e 65 20 6d 69 67 68 74 20 64 65 63 69 64  tine might decid
de20: 65 20 74 68 61 74 20 63 72 65 61 74 69 6e 67 20  e that creating 
de30: 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 62 2d 74  an ephemeral b-t
de40: 72 65 65 20 66 6f 72 20 6d 65 6d 62 65 72 73 68  ree for membersh
de50: 69 70 0a 2a 2a 20 74 65 73 74 69 6e 67 20 69 73  ip.** testing is
de60: 20 74 6f 6f 20 65 78 70 65 6e 73 69 76 65 20 61   too expensive a
de70: 6e 64 20 72 65 74 75 72 6e 20 49 4e 5f 49 4e 44  nd return IN_IND
de80: 45 58 5f 4e 4f 4f 50 2e 20 20 49 6e 20 74 68 61  EX_NOOP.  In tha
de90: 74 20 63 61 73 65 2c 20 74 68 65 0a 2a 2a 20 63  t case, the.** c
dea0: 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 20 73  alling routine s
deb0: 68 6f 75 6c 64 20 69 6d 70 6c 65 6d 65 6e 74 20  hould implement 
dec0: 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20  the IN operator 
ded0: 75 73 69 6e 67 20 61 20 73 65 71 75 65 6e 63 65  using a sequence
dee0: 0a 2a 2a 20 6f 66 20 45 71 20 6f 72 20 4e 65 20  .** of Eq or Ne 
def0: 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61  comparison opera
df00: 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  tions..**.** Whe
df10: 6e 20 74 68 65 20 62 2d 74 72 65 65 20 69 73 20  n the b-tree is 
df20: 62 65 69 6e 67 20 75 73 65 64 20 66 6f 72 20 6d  being used for m
df30: 65 6d 62 65 72 73 68 69 70 20 74 65 73 74 73 2c  embership tests,
df40: 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e   the calling fun
df50: 63 74 69 6f 6e 0a 2a 2a 20 6d 69 67 68 74 20 6e  ction.** might n
df60: 65 65 64 20 74 6f 20 6b 6e 6f 77 20 77 68 65 74  eed to know whet
df70: 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 52  her or not the R
df80: 48 53 20 73 69 64 65 20 6f 66 20 74 68 65 20 49  HS side of the I
df90: 4e 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 63 6f  N operator.** co
dfa0: 6e 74 61 69 6e 73 20 61 20 4e 55 4c 4c 2e 20 20  ntains a NULL.  
dfb0: 49 66 20 70 72 52 68 73 48 61 73 4e 75 6c 6c 20  If prRhsHasNull 
dfc0: 69 73 20 6e 6f 74 20 61 20 4e 55 4c 4c 20 70 6f  is not a NULL po
dfd0: 69 6e 74 65 72 20 61 6e 64 20 0a 2a 2a 20 69 66  inter and .** if
dfe0: 20 74 68 65 72 65 20 69 73 20 61 6e 79 20 63 68   there is any ch
dff0: 61 6e 63 65 20 74 68 61 74 20 74 68 65 20 28 2e  ance that the (.
e000: 2e 2e 29 20 6d 69 67 68 74 20 63 6f 6e 74 61 69  ..) might contai
e010: 6e 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65 20 61  n a NULL value a
e020: 74 0a 2a 2a 20 72 75 6e 74 69 6d 65 2c 20 74 68  t.** runtime, th
e030: 65 6e 20 61 20 72 65 67 69 73 74 65 72 20 69 73  en a register is
e040: 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74   allocated and t
e050: 68 65 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62  he register numb
e060: 65 72 20 77 72 69 74 74 65 6e 0a 2a 2a 20 74 6f  er written.** to
e070: 20 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c 2e 20   *prRhsHasNull. 
e080: 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 63  If there is no c
e090: 68 61 6e 63 65 20 74 68 61 74 20 74 68 65 20 28  hance that the (
e0a0: 2e 2e 2e 29 20 63 6f 6e 74 61 69 6e 73 20 61 0a  ...) contains a.
e0b0: 2a 2a 20 4e 55 4c 4c 20 76 61 6c 75 65 2c 20 74  ** NULL value, t
e0c0: 68 65 6e 20 2a 70 72 52 68 73 48 61 73 4e 75 6c  hen *prRhsHasNul
e0d0: 6c 20 69 73 20 6c 65 66 74 20 75 6e 63 68 61 6e  l is left unchan
e0e0: 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  ged..**.** If a 
e0f0: 72 65 67 69 73 74 65 72 20 69 73 20 61 6c 6c 6f  register is allo
e100: 63 61 74 65 64 20 61 6e 64 20 69 74 73 20 6c 6f  cated and its lo
e110: 63 61 74 69 6f 6e 20 73 74 6f 72 65 64 20 69 6e  cation stored in
e120: 20 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c 2c 20   *prRhsHasNull, 
e130: 74 68 65 6e 0a 2a 2a 20 74 68 65 20 76 61 6c 75  then.** the valu
e140: 65 20 69 6e 20 74 68 61 74 20 72 65 67 69 73 74  e in that regist
e150: 65 72 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 20  er will be NULL 
e160: 69 66 20 74 68 65 20 62 2d 74 72 65 65 20 63 6f  if the b-tree co
e170: 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f  ntains one or mo
e180: 72 65 0a 2a 2a 20 4e 55 4c 4c 20 76 61 6c 75 65  re.** NULL value
e190: 73 2c 20 61 6e 64 20 69 74 20 77 69 6c 6c 20 62  s, and it will b
e1a0: 65 20 73 6f 6d 65 20 6e 6f 6e 2d 4e 55 4c 4c 20  e some non-NULL 
e1b0: 76 61 6c 75 65 20 69 66 20 74 68 65 20 62 2d 74  value if the b-t
e1c0: 72 65 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 0a  ree contains no.
e1d0: 2a 2a 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2e 0a  ** NULL values..
e1e0: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
e1f0: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
e200: 69 6e 74 20 73 71 6c 69 74 65 33 46 69 6e 64 49  int sqlite3FindI
e210: 6e 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50  nIndex(Parse *pP
e220: 61 72 73 65 2c 20 45 78 70 72 20 2a 70 58 2c 20  arse, Expr *pX, 
e230: 75 33 32 20 69 6e 46 6c 61 67 73 2c 20 69 6e 74  u32 inFlags, int
e240: 20 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c 29 7b   *prRhsHasNull){
e250: 0a 20 20 53 65 6c 65 63 74 20 2a 70 3b 20 20 20  .  Select *p;   
e260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e270: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 45 4c 45           /* SELE
e280: 43 54 20 74 6f 20 74 68 65 20 72 69 67 68 74 20  CT to the right 
e290: 6f 66 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a  of IN operator *
e2a0: 2f 0a 20 20 69 6e 74 20 65 54 79 70 65 20 3d 20  /.  int eType = 
e2b0: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
e2c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 79 70            /* Typ
e2d0: 65 20 6f 66 20 52 48 53 20 74 61 62 6c 65 2e 20  e of RHS table. 
e2e0: 49 4e 5f 49 4e 44 45 58 5f 2a 20 2a 2f 0a 20 20  IN_INDEX_* */.  
e2f0: 69 6e 74 20 69 54 61 62 20 3d 20 70 50 61 72 73  int iTab = pPars
e300: 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20 20 20 20  e->nTab++;      
e310: 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
e320: 6f 66 20 74 68 65 20 52 48 53 20 74 61 62 6c 65  of the RHS table
e330: 20 2a 2f 0a 20 20 69 6e 74 20 6d 75 73 74 42 65   */.  int mustBe
e340: 55 6e 69 71 75 65 3b 20 20 20 20 20 20 20 20 20  Unique;         
e350: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
e360: 72 75 65 20 69 66 20 52 48 53 20 6d 75 73 74 20  rue if RHS must 
e370: 62 65 20 75 6e 69 71 75 65 20 2a 2f 0a 20 20 56  be unique */.  V
e380: 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33  dbe *v = sqlite3
e390: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
e3a0: 20 20 20 20 20 2f 2a 20 56 69 72 74 75 61 6c 20       /* Virtual 
e3b0: 6d 61 63 68 69 6e 65 20 62 65 69 6e 67 20 63 6f  machine being co
e3c0: 64 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ded */..  assert
e3d0: 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20  ( pX->op==TK_IN 
e3e0: 29 3b 0a 20 20 6d 75 73 74 42 65 55 6e 69 71 75  );.  mustBeUniqu
e3f0: 65 20 3d 20 28 69 6e 46 6c 61 67 73 20 26 20 49  e = (inFlags & I
e400: 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 29 21 3d 30  N_INDEX_LOOP)!=0
e410: 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f  ;..  /* Check to
e420: 20 73 65 65 20 69 66 20 61 6e 20 65 78 69 73 74   see if an exist
e430: 69 6e 67 20 74 61 62 6c 65 20 6f 72 20 69 6e 64  ing table or ind
e440: 65 78 20 63 61 6e 20 62 65 20 75 73 65 64 20 74  ex can be used t
e450: 6f 0a 20 20 2a 2a 20 73 61 74 69 73 66 79 20 74  o.  ** satisfy t
e460: 68 65 20 71 75 65 72 79 2e 20 20 54 68 69 73 20  he query.  This 
e470: 69 73 20 70 72 65 66 65 72 61 62 6c 65 20 74 6f  is preferable to
e480: 20 67 65 6e 65 72 61 74 69 6e 67 20 61 20 6e 65   generating a ne
e490: 77 20 0a 20 20 2a 2a 20 65 70 68 65 6d 65 72 61  w .  ** ephemera
e4a0: 6c 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20  l table..  */.  
e4b0: 70 20 3d 20 28 45 78 70 72 48 61 73 50 72 6f 70  p = (ExprHasProp
e4c0: 65 72 74 79 28 70 58 2c 20 45 50 5f 78 49 73 53  erty(pX, EP_xIsS
e4d0: 65 6c 65 63 74 29 20 3f 20 70 58 2d 3e 78 2e 70  elect) ? pX->x.p
e4e0: 53 65 6c 65 63 74 20 3a 20 30 29 3b 0a 20 20 69  Select : 0);.  i
e4f0: 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d  f( pParse->nErr=
e500: 3d 30 20 26 26 20 69 73 43 61 6e 64 69 64 61 74  =0 && isCandidat
e510: 65 46 6f 72 49 6e 4f 70 74 28 70 29 20 29 7b 0a  eForInOpt(p) ){.
e520: 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20      sqlite3 *db 
e530: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20  = pParse->db;   
e540: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
e550: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
e560: 6e 20 2a 2f 0a 20 20 20 20 54 61 62 6c 65 20 2a  n */.    Table *
e570: 70 54 61 62 3b 20 20 20 20 20 20 20 20 20 20 20  pTab;           
e580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e590: 2f 2a 20 54 61 62 6c 65 20 3c 74 61 62 6c 65 3e  /* Table <table>
e5a0: 2e 20 2a 2f 0a 20 20 20 20 45 78 70 72 20 2a 70  . */.    Expr *p
e5b0: 45 78 70 72 3b 20 20 20 20 20 20 20 20 20 20 20  Expr;           
e5c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e5d0: 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 3c 63  /* Expression <c
e5e0: 6f 6c 75 6d 6e 3e 20 2a 2f 0a 20 20 20 20 69 31  olumn> */.    i1
e5f0: 36 20 69 43 6f 6c 3b 20 20 20 20 20 20 20 20 20  6 iCol;         
e600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e610: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
e620: 20 63 6f 6c 75 6d 6e 20 3c 63 6f 6c 75 6d 6e 3e   column <column>
e630: 20 2a 2f 0a 20 20 20 20 69 31 36 20 69 44 62 3b   */.    i16 iDb;
e640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e660: 2a 20 44 61 74 61 62 61 73 65 20 69 64 78 20 66  * Database idx f
e670: 6f 72 20 70 54 61 62 20 2a 2f 0a 0a 20 20 20 20  or pTab */..    
e680: 61 73 73 65 72 74 28 20 70 20 29 3b 20 20 20 20  assert( p );    
e690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e6a0: 20 20 20 20 2f 2a 20 42 65 63 61 75 73 65 20 6f      /* Because o
e6b0: 66 20 69 73 43 61 6e 64 69 64 61 74 65 46 6f 72  f isCandidateFor
e6c0: 49 6e 4f 70 74 28 70 29 20 2a 2f 0a 20 20 20 20  InOpt(p) */.    
e6d0: 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73  assert( p->pELis
e6e0: 74 21 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20  t!=0 );         
e6f0: 20 20 20 20 2f 2a 20 42 65 63 61 75 73 65 20 6f      /* Because o
e700: 66 20 69 73 43 61 6e 64 69 64 61 74 65 46 6f 72  f isCandidateFor
e710: 49 6e 4f 70 74 28 70 29 20 2a 2f 0a 20 20 20 20  InOpt(p) */.    
e720: 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73  assert( p->pELis
e730: 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 21 3d 30  t->a[0].pExpr!=0
e740: 20 29 3b 20 2f 2a 20 42 65 63 61 75 73 65 20 6f   ); /* Because o
e750: 66 20 69 73 43 61 6e 64 69 64 61 74 65 46 6f 72  f isCandidateFor
e760: 49 6e 4f 70 74 28 70 29 20 2a 2f 0a 20 20 20 20  InOpt(p) */.    
e770: 61 73 73 65 72 74 28 20 70 2d 3e 70 53 72 63 21  assert( p->pSrc!
e780: 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20 20 20  =0 );           
e790: 20 20 20 20 2f 2a 20 42 65 63 61 75 73 65 20 6f      /* Because o
e7a0: 66 20 69 73 43 61 6e 64 69 64 61 74 65 46 6f 72  f isCandidateFor
e7b0: 49 6e 4f 70 74 28 70 29 20 2a 2f 0a 20 20 20 20  InOpt(p) */.    
e7c0: 70 54 61 62 20 3d 20 70 2d 3e 70 53 72 63 2d 3e  pTab = p->pSrc->
e7d0: 61 5b 30 5d 2e 70 54 61 62 3b 0a 20 20 20 20 70  a[0].pTab;.    p
e7e0: 45 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69 73 74  Expr = p->pEList
e7f0: 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[0].pExpr;.  
e800: 20 20 69 43 6f 6c 20 3d 20 28 69 31 36 29 70 45    iCol = (i16)pE
e810: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  xpr->iColumn;.  
e820: 20 0a 20 20 20 20 2f 2a 20 43 6f 64 65 20 61 6e   .    /* Code an
e830: 20 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 20   OP_Transaction 
e840: 61 6e 64 20 4f 50 5f 54 61 62 6c 65 4c 6f 63 6b  and OP_TableLock
e850: 20 66 6f 72 20 3c 74 61 62 6c 65 3e 2e 20 2a 2f   for <table>. */
e860: 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74  .    iDb = sqlit
e870: 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
e880: 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d  db, pTab->pSchem
e890: 61 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43  a);.    sqlite3C
e8a0: 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28  odeVerifySchema(
e8b0: 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20  pParse, iDb);.  
e8c0: 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f    sqlite3TableLo
e8d0: 63 6b 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20  ck(pParse, iDb, 
e8e0: 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70  pTab->tnum, 0, p
e8f0: 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20  Tab->zName);..  
e900: 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69    /* This functi
e910: 6f 6e 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65  on is only calle
e920: 64 20 66 72 6f 6d 20 74 77 6f 20 70 6c 61 63 65  d from two place
e930: 73 2e 20 49 6e 20 62 6f 74 68 20 63 61 73 65 73  s. In both cases
e940: 20 74 68 65 20 76 64 62 65 0a 20 20 20 20 2a 2a   the vdbe.    **
e950: 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
e960: 6e 20 61 6c 6c 6f 63 61 74 65 64 2e 20 53 6f 20  n allocated. So 
e970: 61 73 73 75 6d 65 20 73 71 6c 69 74 65 33 47 65  assume sqlite3Ge
e980: 74 56 64 62 65 28 29 20 69 73 20 61 6c 77 61 79  tVdbe() is alway
e990: 73 0a 20 20 20 20 2a 2a 20 73 75 63 63 65 73 73  s.    ** success
e9a0: 66 75 6c 20 68 65 72 65 2e 0a 20 20 20 20 2a 2f  ful here..    */
e9b0: 0a 20 20 20 20 61 73 73 65 72 74 28 76 29 3b 0a  .    assert(v);.
e9c0: 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29      if( iCol<0 )
e9d0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 41 64 64  {.      int iAdd
e9e0: 72 20 3d 20 73 71 6c 69 74 65 33 43 6f 64 65 4f  r = sqlite3CodeO
e9f0: 6e 63 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20  nce(pParse);.   
ea00: 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
ea10: 76 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74  v);..      sqlit
ea20: 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72  e3OpenTable(pPar
ea30: 73 65 2c 20 69 54 61 62 2c 20 69 44 62 2c 20 70  se, iTab, iDb, p
ea40: 54 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64  Tab, OP_OpenRead
ea50: 29 3b 0a 20 20 20 20 20 20 65 54 79 70 65 20 3d  );.      eType =
ea60: 20 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 3b   IN_INDEX_ROWID;
ea70: 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ..      sqlite3V
ea80: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 69  dbeJumpHere(v, i
ea90: 41 64 64 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65  Addr);.    }else
eaa0: 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70  {.      Index *p
eab0: 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  Idx;            
eac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ead0: 49 74 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c  Iterator variabl
eae0: 65 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 54  e */..      /* T
eaf0: 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  he collation seq
eb00: 75 65 6e 63 65 20 75 73 65 64 20 62 79 20 74 68  uence used by th
eb10: 65 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 49 66  e comparison. If
eb20: 20 61 6e 20 69 6e 64 65 78 20 69 73 20 74 6f 0a   an index is to.
eb30: 20 20 20 20 20 20 2a 2a 20 62 65 20 75 73 65 64        ** be used
eb40: 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 61 20 74   in place of a t
eb50: 65 6d 70 2d 74 61 62 6c 65 2c 20 69 74 20 6d 75  emp-table, it mu
eb60: 73 74 20 62 65 20 6f 72 64 65 72 65 64 20 61 63  st be ordered ac
eb70: 63 6f 72 64 69 6e 67 0a 20 20 20 20 20 20 2a 2a  cording.      **
eb80: 20 74 6f 20 74 68 69 73 20 63 6f 6c 6c 61 74 69   to this collati
eb90: 6f 6e 20 73 65 71 75 65 6e 63 65 2e 20 20 2a 2f  on sequence.  */
eba0: 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  .      CollSeq *
ebb0: 70 52 65 71 20 3d 20 73 71 6c 69 74 65 33 42 69  pReq = sqlite3Bi
ebc0: 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53  naryCompareCollS
ebd0: 65 71 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70  eq(pParse, pX->p
ebe0: 4c 65 66 74 2c 20 70 45 78 70 72 29 3b 0a 0a 20  Left, pExpr);.. 
ebf0: 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68       /* Check th
ec00: 61 74 20 74 68 65 20 61 66 66 69 6e 69 74 79 20  at the affinity 
ec10: 74 68 61 74 20 77 69 6c 6c 20 62 65 20 75 73 65  that will be use
ec20: 64 20 74 6f 20 70 65 72 66 6f 72 6d 20 74 68 65  d to perform the
ec30: 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6d 70 61   .      ** compa
ec40: 72 69 73 6f 6e 20 69 73 20 74 68 65 20 73 61 6d  rison is the sam
ec50: 65 20 61 73 20 74 68 65 20 61 66 66 69 6e 69 74  e as the affinit
ec60: 79 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2e  y of the column.
ec70: 20 49 66 0a 20 20 20 20 20 20 2a 2a 20 69 74 20   If.      ** it 
ec80: 69 73 20 6e 6f 74 2c 20 69 74 20 69 73 20 6e 6f  is not, it is no
ec90: 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 75 73  t possible to us
eca0: 65 20 61 6e 79 20 69 6e 64 65 78 2e 0a 20 20 20  e any index..   
ecb0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20     */.      int 
ecc0: 61 66 66 69 6e 69 74 79 5f 6f 6b 20 3d 20 73 71  affinity_ok = sq
ecd0: 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e 69  lite3IndexAffini
ece0: 74 79 4f 6b 28 70 58 2c 20 70 54 61 62 2d 3e 61  tyOk(pX, pTab->a
ecf0: 43 6f 6c 5b 69 43 6f 6c 5d 2e 61 66 66 69 6e 69  Col[iCol].affini
ed00: 74 79 29 3b 0a 0a 20 20 20 20 20 20 66 6f 72 28  ty);..      for(
ed10: 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65  pIdx=pTab->pInde
ed20: 78 3b 20 70 49 64 78 20 26 26 20 65 54 79 70 65  x; pIdx && eType
ed30: 3d 3d 30 20 26 26 20 61 66 66 69 6e 69 74 79 5f  ==0 && affinity_
ed40: 6f 6b 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  ok; pIdx=pIdx->p
ed50: 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 69  Next){.        i
ed60: 66 28 20 28 70 49 64 78 2d 3e 61 69 43 6f 6c 75  f( (pIdx->aiColu
ed70: 6d 6e 5b 30 5d 3d 3d 69 43 6f 6c 29 0a 20 20 20  mn[0]==iCol).   
ed80: 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33        && sqlite3
ed90: 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20  FindCollSeq(db, 
eda0: 45 4e 43 28 64 62 29 2c 20 70 49 64 78 2d 3e 61  ENC(db), pIdx->a
edb0: 7a 43 6f 6c 6c 5b 30 5d 2c 20 30 29 3d 3d 70 52  zColl[0], 0)==pR
edc0: 65 71 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  eq.         && (
edd0: 21 6d 75 73 74 42 65 55 6e 69 71 75 65 20 7c 7c  !mustBeUnique ||
ede0: 20 28 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3d   (pIdx->nKeyCol=
edf0: 3d 31 20 26 26 20 49 73 55 6e 69 71 75 65 49 6e  =1 && IsUniqueIn
ee00: 64 65 78 28 70 49 64 78 29 29 29 0a 20 20 20 20  dex(pIdx))).    
ee10: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
ee20: 20 69 6e 74 20 69 41 64 64 72 20 3d 20 73 71 6c   int iAddr = sql
ee30: 69 74 65 33 43 6f 64 65 4f 6e 63 65 28 70 50 61  ite3CodeOnce(pPa
ee40: 72 73 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61  rse); VdbeCovera
ee50: 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20  ge(v);.         
ee60: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
ee70: 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61  p3(v, OP_OpenRea
ee80: 64 2c 20 69 54 61 62 2c 20 70 49 64 78 2d 3e 74  d, iTab, pIdx->t
ee90: 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20 20 20 20  num, iDb);.     
eea0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
eeb0: 53 65 74 50 34 4b 65 79 49 6e 66 6f 28 70 50 61  SetP4KeyInfo(pPa
eec0: 72 73 65 2c 20 70 49 64 78 29 3b 0a 20 20 20 20  rse, pIdx);.    
eed0: 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
eee0: 74 28 28 76 2c 20 22 25 73 22 2c 20 70 49 64 78  t((v, "%s", pIdx
eef0: 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20  ->zName));.     
ef00: 20 20 20 20 20 61 73 73 65 72 74 28 20 49 4e 5f       assert( IN_
ef10: 49 4e 44 45 58 5f 49 4e 44 45 58 5f 44 45 53 43  INDEX_INDEX_DESC
ef20: 20 3d 3d 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44   == IN_INDEX_IND
ef30: 45 58 5f 41 53 43 2b 31 20 29 3b 0a 20 20 20 20  EX_ASC+1 );.    
ef40: 20 20 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e        eType = IN
ef50: 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 41 53 43  _INDEX_INDEX_ASC
ef60: 20 2b 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72   + pIdx->aSortOr
ef70: 64 65 72 5b 30 5d 3b 0a 0a 20 20 20 20 20 20 20  der[0];..       
ef80: 20 20 20 69 66 28 20 70 72 52 68 73 48 61 73 4e     if( prRhsHasN
ef90: 75 6c 6c 20 26 26 20 21 70 54 61 62 2d 3e 61 43  ull && !pTab->aC
efa0: 6f 6c 5b 69 43 6f 6c 5d 2e 6e 6f 74 4e 75 6c 6c  ol[iCol].notNull
efb0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
efc0: 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 3d 20  *prRhsHasNull = 
efd0: 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
efe0: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
eff0: 74 65 33 53 65 74 48 61 73 4e 75 6c 6c 46 6c 61  te3SetHasNullFla
f000: 67 28 76 2c 20 69 54 61 62 2c 20 2a 70 72 52 68  g(v, iTab, *prRh
f010: 73 48 61 73 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  sHasNull);.     
f020: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
f030: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
f040: 48 65 72 65 28 76 2c 20 69 41 64 64 72 29 3b 0a  Here(v, iAddr);.
f050: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
f060: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
f070: 2a 20 49 66 20 6e 6f 20 70 72 65 65 78 69 73 74  * If no preexist
f080: 69 6e 67 20 69 6e 64 65 78 20 69 73 20 61 76 61  ing index is ava
f090: 69 6c 61 62 6c 65 20 66 6f 72 20 74 68 65 20 49  ilable for the I
f0a0: 4e 20 63 6c 61 75 73 65 0a 20 20 2a 2a 20 61 6e  N clause.  ** an
f0b0: 64 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 20  d IN_INDEX_NOOP 
f0c0: 69 73 20 61 6e 20 61 6c 6c 6f 77 65 64 20 72 65  is an allowed re
f0d0: 70 6c 79 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65  ply.  ** and the
f0e0: 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f   RHS of the IN o
f0f0: 70 65 72 61 74 6f 72 20 69 73 20 61 20 6c 69 73  perator is a lis
f100: 74 2c 20 6e 6f 74 20 61 20 73 75 62 71 75 65 72  t, not a subquer
f110: 79 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 52  y.  ** and the R
f120: 48 53 20 69 73 20 6e 6f 74 20 63 6f 6e 74 61 6e  HS is not contan
f130: 74 20 6f 72 20 68 61 73 20 74 77 6f 20 6f 72 20  t or has two or 
f140: 66 65 77 65 72 20 74 65 72 6d 73 2c 0a 20 20 2a  fewer terms,.  *
f150: 2a 20 74 68 65 6e 20 69 74 20 69 73 20 6e 6f 74  * then it is not
f160: 20 77 6f 72 74 68 20 63 72 65 61 74 69 6e 67 20   worth creating 
f170: 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62  an ephemeral tab
f180: 6c 65 20 74 6f 20 65 76 61 6c 75 61 74 65 0a 20  le to evaluate. 
f190: 20 2a 2a 20 74 68 65 20 49 4e 20 6f 70 65 72 61   ** the IN opera
f1a0: 74 6f 72 20 73 6f 20 72 65 74 75 72 6e 20 49 4e  tor so return IN
f1b0: 5f 49 4e 44 45 58 5f 4e 4f 4f 50 2e 0a 20 20 2a  _INDEX_NOOP..  *
f1c0: 2f 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 30  /.  if( eType==0
f1d0: 0a 20 20 20 26 26 20 28 69 6e 46 6c 61 67 73 20  .   && (inFlags 
f1e0: 26 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 5f  & IN_INDEX_NOOP_
f1f0: 4f 4b 29 0a 20 20 20 26 26 20 21 45 78 70 72 48  OK).   && !ExprH
f200: 61 73 50 72 6f 70 65 72 74 79 28 70 58 2c 20 45  asProperty(pX, E
f210: 50 5f 78 49 73 53 65 6c 65 63 74 29 0a 20 20 20  P_xIsSelect).   
f220: 26 26 20 28 21 73 71 6c 69 74 65 33 49 6e 52 68  && (!sqlite3InRh
f230: 73 49 73 43 6f 6e 73 74 61 6e 74 28 70 58 29 20  sIsConstant(pX) 
f240: 7c 7c 20 70 58 2d 3e 78 2e 70 4c 69 73 74 2d 3e  || pX->x.pList->
f250: 6e 45 78 70 72 3c 3d 32 29 0a 20 20 29 7b 0a 20  nExpr<=2).  ){. 
f260: 20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e     eType = IN_IN
f270: 44 45 58 5f 4e 4f 4f 50 3b 0a 20 20 7d 0a 20 20  DEX_NOOP;.  }.  
f280: 20 20 20 0a 0a 20 20 69 66 28 20 65 54 79 70 65     ..  if( eType
f290: 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f  ==0 ){.    /* Co
f2a0: 75 6c 64 20 6e 6f 74 20 66 69 6e 64 20 61 6e 20  uld not find an 
f2b0: 65 78 69 73 74 69 6e 67 20 74 61 62 6c 65 20 6f  existing table o
f2c0: 72 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20 61  r index to use a
f2d0: 73 20 74 68 65 20 52 48 53 20 62 2d 74 72 65 65  s the RHS b-tree
f2e0: 2e 0a 20 20 20 20 2a 2a 20 57 65 20 77 69 6c 6c  ..    ** We will
f2f0: 20 68 61 76 65 20 74 6f 20 67 65 6e 65 72 61 74   have to generat
f300: 65 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 74  e an ephemeral t
f310: 61 62 6c 65 20 74 6f 20 64 6f 20 74 68 65 20 6a  able to do the j
f320: 6f 62 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 75  ob..    */.    u
f330: 33 32 20 73 61 76 65 64 4e 51 75 65 72 79 4c 6f  32 savedNQueryLo
f340: 6f 70 20 3d 20 70 50 61 72 73 65 2d 3e 6e 51 75  op = pParse->nQu
f350: 65 72 79 4c 6f 6f 70 3b 0a 20 20 20 20 69 6e 74  eryLoop;.    int
f360: 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20 3d 20   rMayHaveNull = 
f370: 30 3b 0a 20 20 20 20 65 54 79 70 65 20 3d 20 49  0;.    eType = I
f380: 4e 5f 49 4e 44 45 58 5f 45 50 48 3b 0a 20 20 20  N_INDEX_EPH;.   
f390: 20 69 66 28 20 69 6e 46 6c 61 67 73 20 26 20 49   if( inFlags & I
f3a0: 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 20 29 7b 0a  N_INDEX_LOOP ){.
f3b0: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 51        pParse->nQ
f3c0: 75 65 72 79 4c 6f 6f 70 20 3d 20 30 3b 0a 20 20  ueryLoop = 0;.  
f3d0: 20 20 20 20 69 66 28 20 70 58 2d 3e 70 4c 65 66      if( pX->pLef
f3e0: 74 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 26 26 20  t->iColumn<0 && 
f3f0: 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
f400: 28 70 58 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  (pX, EP_xIsSelec
f410: 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 65 54  t) ){.        eT
f420: 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 52  ype = IN_INDEX_R
f430: 4f 57 49 44 3b 0a 20 20 20 20 20 20 7d 0a 20 20  OWID;.      }.  
f440: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 72 52 68    }else if( prRh
f450: 73 48 61 73 4e 75 6c 6c 20 29 7b 0a 20 20 20 20  sHasNull ){.    
f460: 20 20 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c 20    *prRhsHasNull 
f470: 3d 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20 3d  = rMayHaveNull =
f480: 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
f490: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
f4a0: 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28  e3CodeSubselect(
f4b0: 70 50 61 72 73 65 2c 20 70 58 2c 20 72 4d 61 79  pParse, pX, rMay
f4c0: 48 61 76 65 4e 75 6c 6c 2c 20 65 54 79 70 65 3d  HaveNull, eType=
f4d0: 3d 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 29  =IN_INDEX_ROWID)
f4e0: 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 51  ;.    pParse->nQ
f4f0: 75 65 72 79 4c 6f 6f 70 20 3d 20 73 61 76 65 64  ueryLoop = saved
f500: 4e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 7d 65  NQueryLoop;.  }e
f510: 6c 73 65 7b 0a 20 20 20 20 70 58 2d 3e 69 54 61  lse{.    pX->iTa
f520: 62 6c 65 20 3d 20 69 54 61 62 3b 0a 20 20 7d 0a  ble = iTab;.  }.
f530: 20 20 72 65 74 75 72 6e 20 65 54 79 70 65 3b 0a    return eType;.
f540: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
f550: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
f560: 72 20 73 63 61 6c 61 72 20 73 75 62 71 75 65 72  r scalar subquer
f570: 69 65 73 20 75 73 65 64 20 61 73 20 61 20 73 75  ies used as a su
f580: 62 71 75 65 72 79 20 65 78 70 72 65 73 73 69 6f  bquery expressio
f590: 6e 2c 20 45 58 49 53 54 53 2c 0a 2a 2a 20 6f 72  n, EXISTS,.** or
f5a0: 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 2e 20 20   IN operators.  
f5b0: 45 78 61 6d 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20  Examples:.**.** 
f5c0: 20 20 20 20 28 53 45 4c 45 43 54 20 61 20 46 52      (SELECT a FR
f5d0: 4f 4d 20 62 29 20 20 20 20 20 20 20 20 20 20 2d  OM b)          -
f5e0: 2d 20 73 75 62 71 75 65 72 79 0a 2a 2a 20 20 20  - subquery.**   
f5f0: 20 20 45 58 49 53 54 53 20 28 53 45 4c 45 43 54    EXISTS (SELECT
f600: 20 61 20 46 52 4f 4d 20 62 29 20 20 20 2d 2d 20   a FROM b)   -- 
f610: 45 58 49 53 54 53 20 73 75 62 71 75 65 72 79 0a  EXISTS subquery.
f620: 2a 2a 20 20 20 20 20 78 20 49 4e 20 28 34 2c 35  **     x IN (4,5
f630: 2c 31 31 29 20 20 20 20 20 20 20 20 20 20 20 20  ,11)            
f640: 20 20 2d 2d 20 49 4e 20 6f 70 65 72 61 74 6f 72    -- IN operator
f650: 20 77 69 74 68 20 6c 69 73 74 20 6f 6e 20 72 69   with list on ri
f660: 67 68 74 2d 68 61 6e 64 20 73 69 64 65 0a 2a 2a  ght-hand side.**
f670: 20 20 20 20 20 78 20 49 4e 20 28 53 45 4c 45 43       x IN (SELEC
f680: 54 20 61 20 46 52 4f 4d 20 62 29 20 20 20 20 20  T a FROM b)     
f690: 2d 2d 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 77  -- IN operator w
f6a0: 69 74 68 20 73 75 62 71 75 65 72 79 20 6f 6e 20  ith subquery on 
f6b0: 74 68 65 20 72 69 67 68 74 0a 2a 2a 0a 2a 2a 20  the right.**.** 
f6c0: 54 68 65 20 70 45 78 70 72 20 70 61 72 61 6d 65  The pExpr parame
f6d0: 74 65 72 20 64 65 73 63 72 69 62 65 73 20 74 68  ter describes th
f6e0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61  e expression tha
f6f0: 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 49  t contains the I
f700: 4e 0a 2a 2a 20 6f 70 65 72 61 74 6f 72 20 6f 72  N.** operator or
f710: 20 73 75 62 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a   subquery..**.**
f720: 20 49 66 20 70 61 72 61 6d 65 74 65 72 20 69 73   If parameter is
f730: 52 6f 77 69 64 20 69 73 20 6e 6f 6e 2d 7a 65 72  Rowid is non-zer
f740: 6f 2c 20 74 68 65 6e 20 65 78 70 72 65 73 73 69  o, then expressi
f750: 6f 6e 20 70 45 78 70 72 20 69 73 20 67 75 61 72  on pExpr is guar
f760: 61 6e 74 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20  anteed.** to be 
f770: 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3c 72 6f  of the form "<ro
f780: 77 69 64 3e 20 49 4e 20 28 3f 2c 20 3f 2c 20 3f  wid> IN (?, ?, ?
f790: 29 22 2c 20 77 68 65 72 65 20 3c 72 6f 77 69 64  )", where <rowid
f7a0: 3e 20 69 73 20 61 20 72 65 66 65 72 65 6e 63 65  > is a reference
f7b0: 0a 2a 2a 20 74 6f 20 73 6f 6d 65 20 69 6e 74 65  .** to some inte
f7c0: 67 65 72 20 6b 65 79 20 63 6f 6c 75 6d 6e 20 6f  ger key column o
f7d0: 66 20 61 20 74 61 62 6c 65 20 42 2d 54 72 65 65  f a table B-Tree
f7e0: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20  . In this case, 
f7f0: 75 73 65 20 61 6e 0a 2a 2a 20 69 6e 74 6b 65 79  use an.** intkey
f800: 20 42 2d 54 72 65 65 20 74 6f 20 73 74 6f 72 65   B-Tree to store
f810: 20 74 68 65 20 73 65 74 20 6f 66 20 49 4e 28 2e   the set of IN(.
f820: 2e 2e 29 20 76 61 6c 75 65 73 20 69 6e 73 74 65  ..) values inste
f830: 61 64 20 6f 66 20 74 68 65 20 75 73 75 61 6c 0a  ad of the usual.
f840: 2a 2a 20 28 73 6c 6f 77 65 72 29 20 76 61 72 69  ** (slower) vari
f850: 61 62 6c 65 20 6c 65 6e 67 74 68 20 6b 65 79 73  able length keys
f860: 20 42 2d 54 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 49   B-Tree..**.** I
f870: 66 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20 69  f rMayHaveNull i
f880: 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 61 74  s non-zero, that
f890: 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
f8a0: 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 61 6e 20  operation is an 
f8b0: 49 4e 0a 2a 2a 20 28 6e 6f 74 20 61 20 53 45 4c  IN.** (not a SEL
f8c0: 45 43 54 20 6f 72 20 45 58 49 53 54 53 29 20 61  ECT or EXISTS) a
f8d0: 6e 64 20 74 68 61 74 20 74 68 65 20 52 48 53 20  nd that the RHS 
f8e0: 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 73 20 4e  might contains N
f8f0: 55 4c 4c 73 2e 0a 2a 2a 20 41 6c 6c 20 74 68 69  ULLs..** All thi
f900: 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 69  s routine does i
f910: 73 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  s initialize the
f920: 20 72 65 67 69 73 74 65 72 20 67 69 76 65 6e 20   register given 
f930: 62 79 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 0a  by rMayHaveNull.
f940: 2a 2a 20 74 6f 20 4e 55 4c 4c 2e 20 20 43 61 6c  ** to NULL.  Cal
f950: 6c 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 77 69  ling routines wi
f960: 6c 6c 20 74 61 6b 65 20 63 61 72 65 20 6f 66 20  ll take care of 
f970: 63 68 61 6e 67 69 6e 67 20 74 68 69 73 20 72 65  changing this re
f980: 67 69 73 74 65 72 0a 2a 2a 20 76 61 6c 75 65 20  gister.** value 
f990: 74 6f 20 6e 6f 6e 2d 4e 55 4c 4c 20 69 66 20 74  to non-NULL if t
f9a0: 68 65 20 52 48 53 20 69 73 20 4e 55 4c 4c 2d 66  he RHS is NULL-f
f9b0: 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61  ree..**.** For a
f9c0: 20 53 45 4c 45 43 54 20 6f 72 20 45 58 49 53 54   SELECT or EXIST
f9d0: 53 20 6f 70 65 72 61 74 6f 72 2c 20 72 65 74 75  S operator, retu
f9e0: 72 6e 20 74 68 65 20 72 65 67 69 73 74 65 72 20  rn the register 
f9f0: 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65 0a 2a  that holds the.*
fa00: 2a 20 72 65 73 75 6c 74 2e 20 20 46 6f 72 20 49  * result.  For I
fa10: 4e 20 6f 70 65 72 61 74 6f 72 73 20 6f 72 20 69  N operators or i
fa20: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
fa30: 73 2c 20 74 68 65 20 72 65 74 75 72 6e 20 76 61  s, the return va
fa40: 6c 75 65 20 69 73 20 30 2e 0a 2a 2f 0a 23 69 66  lue is 0..*/.#if
fa50: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
fa60: 5f 53 55 42 51 55 45 52 59 0a 69 6e 74 20 73 71  _SUBQUERY.int sq
fa70: 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65  lite3CodeSubsele
fa80: 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ct(.  Parse *pPa
fa90: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  rse,          /*
faa0: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
fab0: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70   */.  Expr *pExp
fac0: 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  r,            /*
fad0: 20 54 68 65 20 49 4e 2c 20 53 45 4c 45 43 54 2c   The IN, SELECT,
fae0: 20 6f 72 20 45 58 49 53 54 53 20 6f 70 65 72 61   or EXISTS opera
faf0: 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 72 48 61  tor */.  int rHa
fb00: 73 4e 75 6c 6c 46 6c 61 67 2c 20 20 20 20 20 20  sNullFlag,      
fb10: 20 2f 2a 20 52 65 67 69 73 74 65 72 20 74 68 61   /* Register tha
fb20: 74 20 72 65 63 6f 72 64 73 20 77 68 65 74 68 65  t records whethe
fb30: 72 20 4e 55 4c 4c 73 20 65 78 69 73 74 20 69 6e  r NULLs exist in
fb40: 20 52 48 53 20 2a 2f 0a 20 20 69 6e 74 20 69 73   RHS */.  int is
fb50: 52 6f 77 69 64 20 20 20 20 20 20 20 20 20 20 20  Rowid           
fb60: 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 4c 48    /* If true, LH
fb70: 53 20 6f 66 20 49 4e 20 6f 70 65 72 61 74 6f 72  S of IN operator
fb80: 20 69 73 20 61 20 72 6f 77 69 64 20 2a 2f 0a 29   is a rowid */.)
fb90: 7b 0a 20 20 69 6e 74 20 6a 6d 70 49 66 44 79 6e  {.  int jmpIfDyn
fba0: 61 6d 69 63 20 3d 20 2d 31 3b 20 20 20 20 20 20  amic = -1;      
fbb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fbc0: 2f 2a 20 4f 6e 65 2d 74 69 6d 65 20 74 65 73 74  /* One-time test
fbd0: 20 61 64 64 72 65 73 73 20 2a 2f 0a 20 20 69 6e   address */.  in
fbe0: 74 20 72 52 65 67 20 3d 20 30 3b 20 20 20 20 20  t rReg = 0;     
fbf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc00: 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65        /* Registe
fc10: 72 20 73 74 6f 72 69 6e 67 20 72 65 73 75 6c 74  r storing result
fc20: 69 6e 67 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  ing */.  Vdbe *v
fc30: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
fc40: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
fc50: 20 4e 45 56 45 52 28 76 3d 3d 30 29 20 29 20 72   NEVER(v==0) ) r
fc60: 65 74 75 72 6e 20 30 3b 0a 20 20 73 71 6c 69 74  eturn 0;.  sqlit
fc70: 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28  e3ExprCachePush(
fc80: 70 50 61 72 73 65 29 3b 0a 0a 20 20 2f 2a 20 54  pParse);..  /* T
fc90: 68 69 73 20 63 6f 64 65 20 6d 75 73 74 20 62 65  his code must be
fca0: 20 72 75 6e 20 69 6e 20 69 74 73 20 65 6e 74 69   run in its enti
fcb0: 72 65 74 79 20 65 76 65 72 79 20 74 69 6d 65 20  rety every time 
fcc0: 69 74 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  it is encountere
fcd0: 64 0a 20 20 2a 2a 20 69 66 20 61 6e 79 20 6f 66  d.  ** if any of
fce0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69   the following i
fcf0: 73 20 74 72 75 65 3a 0a 20 20 2a 2a 0a 20 20 2a  s true:.  **.  *
fd00: 2a 20 20 20 20 2a 20 20 54 68 65 20 72 69 67 68  *    *  The righ
fd10: 74 2d 68 61 6e 64 20 73 69 64 65 20 69 73 20 61  t-hand side is a
fd20: 20 63 6f 72 72 65 6c 61 74 65 64 20 73 75 62 71   correlated subq
fd30: 75 65 72 79 0a 20 20 2a 2a 20 20 20 20 2a 20 20  uery.  **    *  
fd40: 54 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73  The right-hand s
fd50: 69 64 65 20 69 73 20 61 6e 20 65 78 70 72 65 73  ide is an expres
fd60: 73 69 6f 6e 20 6c 69 73 74 20 63 6f 6e 74 61 69  sion list contai
fd70: 6e 69 6e 67 20 76 61 72 69 61 62 6c 65 73 0a 20  ning variables. 
fd80: 20 2a 2a 20 20 20 20 2a 20 20 57 65 20 61 72 65   **    *  We are
fd90: 20 69 6e 73 69 64 65 20 61 20 74 72 69 67 67 65   inside a trigge
fda0: 72 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 61  r.  **.  ** If a
fdb0: 6c 6c 20 6f 66 20 74 68 65 20 61 62 6f 76 65 20  ll of the above 
fdc0: 61 72 65 20 66 61 6c 73 65 2c 20 74 68 65 6e 20  are false, then 
fdd0: 77 65 20 63 61 6e 20 72 75 6e 20 74 68 69 73 20  we can run this 
fde0: 63 6f 64 65 20 6a 75 73 74 20 6f 6e 63 65 0a 20  code just once. 
fdf0: 20 2a 2a 20 73 61 76 65 20 74 68 65 20 72 65 73   ** save the res
fe00: 75 6c 74 73 2c 20 61 6e 64 20 72 65 75 73 65 20  ults, and reuse 
fe10: 74 68 65 20 73 61 6d 65 20 72 65 73 75 6c 74 20  the same result 
fe20: 6f 6e 20 73 75 62 73 65 71 75 65 6e 74 20 69 6e  on subsequent in
fe30: 76 6f 63 61 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a  vocations..  */.
fe40: 20 20 69 66 28 20 21 45 78 70 72 48 61 73 50 72    if( !ExprHasPr
fe50: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
fe60: 5f 56 61 72 53 65 6c 65 63 74 29 20 29 7b 0a 20  _VarSelect) ){. 
fe70: 20 20 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63 20     jmpIfDynamic 
fe80: 3d 20 73 71 6c 69 74 65 33 43 6f 64 65 4f 6e 63  = sqlite3CodeOnc
fe90: 65 28 70 50 61 72 73 65 29 3b 20 56 64 62 65 43  e(pParse); VdbeC
fea0: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a  overage(v);.  }.
feb0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
fec0: 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 69  OMIT_EXPLAIN.  i
fed0: 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61  f( pParse->expla
fee0: 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 63 68 61  in==2 ){.    cha
fef0: 72 20 2a 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65  r *zMsg = sqlite
ff00: 33 4d 50 72 69 6e 74 66 28 70 50 61 72 73 65 2d  3MPrintf(pParse-
ff10: 3e 64 62 2c 20 22 45 58 45 43 55 54 45 20 25 73  >db, "EXECUTE %s
ff20: 25 73 20 53 55 42 51 55 45 52 59 20 25 64 22 2c  %s SUBQUERY %d",
ff30: 0a 20 20 20 20 20 20 20 20 6a 6d 70 49 66 44 79  .        jmpIfDy
ff40: 6e 61 6d 69 63 3e 3d 30 3f 22 22 3a 22 43 4f 52  namic>=0?"":"COR
ff50: 52 45 4c 41 54 45 44 20 22 2c 0a 20 20 20 20 20  RELATED ",.     
ff60: 20 20 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b     pExpr->op==TK
ff70: 5f 49 4e 3f 22 4c 49 53 54 22 3a 22 53 43 41 4c  _IN?"LIST":"SCAL
ff80: 41 52 22 2c 0a 20 20 20 20 20 20 20 20 70 50 61  AR",.        pPa
ff90: 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74  rse->iNextSelect
ffa0: 49 64 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71  Id.    );.    sq
ffb0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
ffc0: 76 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 70  v, OP_Explain, p
ffd0: 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64  Parse->iSelectId
ffe0: 2c 20 30 2c 20 30 2c 20 7a 4d 73 67 2c 20 50 34  , 0, 0, zMsg, P4
fff0: 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 23  _DYNAMIC);.  }.#
10000 65 6e 64 69 66 0a 0a 20 20 73 77 69 74 63 68 28  endif..  switch(
10010 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20   pExpr->op ){.  
10020 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a    case TK_IN: {.
10030 20 20 20 20 20 20 63 68 61 72 20 61 66 66 69 6e        char affin
10040 69 74 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  ity;            
10050 20 20 2f 2a 20 41 66 66 69 6e 69 74 79 20 6f 66    /* Affinity of
10060 20 74 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20   the LHS of the 
10070 49 4e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  IN */.      int 
10080 61 64 64 72 3b 20 20 20 20 20 20 20 20 20 20 20  addr;           
10090 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
100a0 73 73 20 6f 66 20 4f 50 5f 4f 70 65 6e 45 70 68  ss of OP_OpenEph
100b0 65 6d 65 72 61 6c 20 69 6e 73 74 72 75 63 74 69  emeral instructi
100c0 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72  on */.      Expr
100d0 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d   *pLeft = pExpr-
100e0 3e 70 4c 65 66 74 3b 20 2f 2a 20 74 68 65 20 4c  >pLeft; /* the L
100f0 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65  HS of the IN ope
10100 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 4b  rator */.      K
10110 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
10120 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4b 65   = 0;      /* Ke
10130 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f  y information */
10140 0a 0a 20 20 20 20 20 20 61 66 66 69 6e 69 74 79  ..      affinity
10150 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 66   = sqlite3ExprAf
10160 66 69 6e 69 74 79 28 70 4c 65 66 74 29 3b 0a 0a  finity(pLeft);..
10170 20 20 20 20 20 20 2f 2a 20 57 68 65 74 68 65 72        /* Whether
10180 20 74 68 69 73 20 69 73 20 61 6e 20 27 78 20 49   this is an 'x I
10190 4e 28 53 45 4c 45 43 54 2e 2e 2e 29 27 20 6f 72  N(SELECT...)' or
101a0 20 61 6e 20 27 78 20 49 4e 28 3c 65 78 70 72 6c   an 'x IN(<exprl
101b0 69 73 74 3e 29 27 0a 20 20 20 20 20 20 2a 2a 20  ist>)'.      ** 
101c0 65 78 70 72 65 73 73 69 6f 6e 20 69 74 20 69 73  expression it is
101d0 20 68 61 6e 64 6c 65 64 20 74 68 65 20 73 61 6d   handled the sam
101e0 65 20 77 61 79 2e 20 20 41 6e 20 65 70 68 65 6d  e way.  An ephem
101f0 65 72 61 6c 20 74 61 62 6c 65 20 69 73 20 0a 20  eral table is . 
10200 20 20 20 20 20 2a 2a 20 66 69 6c 6c 65 64 20 77       ** filled w
10210 69 74 68 20 73 69 6e 67 6c 65 2d 66 69 65 6c 64  ith single-field
10220 20 69 6e 64 65 78 20 6b 65 79 73 20 72 65 70 72   index keys repr
10230 65 73 65 6e 74 69 6e 67 20 74 68 65 20 72 65 73  esenting the res
10240 75 6c 74 73 0a 20 20 20 20 20 20 2a 2a 20 66 72  ults.      ** fr
10250 6f 6d 20 74 68 65 20 53 45 4c 45 43 54 20 6f 72  om the SELECT or
10260 20 74 68 65 20 3c 65 78 70 72 6c 69 73 74 3e 2e   the <exprlist>.
10270 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
10280 2a 2a 20 49 66 20 74 68 65 20 27 78 27 20 65 78  ** If the 'x' ex
10290 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 63 6f  pression is a co
102a0 6c 75 6d 6e 20 76 61 6c 75 65 2c 20 6f 72 20 74  lumn value, or t
102b0 68 65 20 53 45 4c 45 43 54 2e 2e 2e 0a 20 20 20  he SELECT....   
102c0 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20     ** statement 
102d0 72 65 74 75 72 6e 73 20 61 20 63 6f 6c 75 6d 6e  returns a column
102e0 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 74 68 65   value, then the
102f0 20 61 66 66 69 6e 69 74 79 20 6f 66 20 74 68 61   affinity of tha
10300 74 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6c 75 6d  t.      ** colum
10310 6e 20 69 73 20 75 73 65 64 20 74 6f 20 62 75 69  n is used to bui
10320 6c 64 20 74 68 65 20 69 6e 64 65 78 20 6b 65 79  ld the index key
10330 73 2e 20 49 66 20 62 6f 74 68 20 27 78 27 20 61  s. If both 'x' a
10340 6e 64 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  nd the.      ** 
10350 53 45 4c 45 43 54 2e 2e 2e 20 73 74 61 74 65 6d  SELECT... statem
10360 65 6e 74 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2c  ent are columns,
10370 20 74 68 65 6e 20 6e 75 6d 65 72 69 63 20 61 66   then numeric af
10380 66 69 6e 69 74 79 20 69 73 20 75 73 65 64 0a 20  finity is used. 
10390 20 20 20 20 20 2a 2a 20 69 66 20 65 69 74 68 65       ** if eithe
103a0 72 20 63 6f 6c 75 6d 6e 20 68 61 73 20 4e 55 4d  r column has NUM
103b0 45 52 49 43 20 6f 72 20 49 4e 54 45 47 45 52 20  ERIC or INTEGER 
103c0 61 66 66 69 6e 69 74 79 2e 20 49 66 20 6e 65 69  affinity. If nei
103d0 74 68 65 72 0a 20 20 20 20 20 20 2a 2a 20 27 78  ther.      ** 'x
103e0 27 20 6e 6f 72 20 74 68 65 20 53 45 4c 45 43 54  ' nor the SELECT
103f0 2e 2e 2e 20 73 74 61 74 65 6d 65 6e 74 20 61 72  ... statement ar
10400 65 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20  e columns, then 
10410 6e 75 6d 65 72 69 63 20 61 66 66 69 6e 69 74 79  numeric affinity
10420 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 75 73 65  .      ** is use
10430 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  d..      */.    
10440 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20    pExpr->iTable 
10450 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
10460 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73  ;.      addr = s
10470 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
10480 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
10490 65 72 61 6c 2c 20 70 45 78 70 72 2d 3e 69 54 61  eral, pExpr->iTa
104a0 62 6c 65 2c 20 21 69 73 52 6f 77 69 64 29 3b 0a  ble, !isRowid);.
104b0 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d        pKeyInfo =
104c0 20 69 73 52 6f 77 69 64 20 3f 20 30 20 3a 20 73   isRowid ? 0 : s
104d0 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c  qlite3KeyInfoAll
104e0 6f 63 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 31  oc(pParse->db, 1
104f0 2c 20 31 29 3b 0a 0a 20 20 20 20 20 20 69 66 28  , 1);..      if(
10500 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
10510 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  (pExpr, EP_xIsSe
10520 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20 20  lect) ){.       
10530 20 2f 2a 20 43 61 73 65 20 31 3a 20 20 20 20 20   /* Case 1:     
10540 65 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20  expr IN (SELECT 
10550 2e 2e 2e 29 0a 20 20 20 20 20 20 20 20 2a 2a 0a  ...).        **.
10560 20 20 20 20 20 20 20 20 2a 2a 20 47 65 6e 65 72          ** Gener
10570 61 74 65 20 63 6f 64 65 20 74 6f 20 77 72 69 74  ate code to writ
10580 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66  e the results of
10590 20 74 68 65 20 73 65 6c 65 63 74 20 69 6e 74 6f   the select into
105a0 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 0a 20   the temporary. 
105b0 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 20         ** table 
105c0 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 6f 70  allocated and op
105d0 65 6e 65 64 20 61 62 6f 76 65 2e 0a 20 20 20 20  ened above..    
105e0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 53      */.        S
105f0 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 20 3d  elect *pSelect =
10600 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63   pExpr->x.pSelec
10610 74 3b 0a 20 20 20 20 20 20 20 20 53 65 6c 65 63  t;.        Selec
10620 74 44 65 73 74 20 64 65 73 74 3b 0a 20 20 20 20  tDest dest;.    
10630 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45      ExprList *pE
10640 4c 69 73 74 3b 0a 0a 20 20 20 20 20 20 20 20 61  List;..        a
10650 73 73 65 72 74 28 20 21 69 73 52 6f 77 69 64 20  ssert( !isRowid 
10660 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
10670 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74  e3SelectDestInit
10680 28 26 64 65 73 74 2c 20 53 52 54 5f 53 65 74 2c  (&dest, SRT_Set,
10690 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 29 3b   pExpr->iTable);
106a0 0a 20 20 20 20 20 20 20 20 64 65 73 74 2e 61 66  .        dest.af
106b0 66 53 64 73 74 20 3d 20 28 75 38 29 61 66 66 69  fSdst = (u8)affi
106c0 6e 69 74 79 3b 0a 20 20 20 20 20 20 20 20 61 73  nity;.        as
106d0 73 65 72 74 28 20 28 70 45 78 70 72 2d 3e 69 54  sert( (pExpr->iT
106e0 61 62 6c 65 26 30 78 30 30 30 30 46 46 46 46 29  able&0x0000FFFF)
106f0 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20  ==pExpr->iTable 
10700 29 3b 0a 20 20 20 20 20 20 20 20 70 53 65 6c 65  );.        pSele
10710 63 74 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a  ct->iLimit = 0;.
10720 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
10730 28 20 70 53 65 6c 65 63 74 2d 3e 73 65 6c 46 6c  ( pSelect->selFl
10740 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63  ags & SF_Distinc
10750 74 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  t );.        tes
10760 74 63 61 73 65 28 20 70 4b 65 79 49 6e 66 6f 3d  tcase( pKeyInfo=
10770 3d 30 20 29 3b 20 2f 2a 20 43 61 75 73 65 64 20  =0 ); /* Caused 
10780 62 79 20 4f 4f 4d 20 69 6e 20 73 71 6c 69 74 65  by OOM in sqlite
10790 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 29 20  3KeyInfoAlloc() 
107a0 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  */.        if( s
107b0 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
107c0 72 73 65 2c 20 70 53 65 6c 65 63 74 2c 20 26 64  rse, pSelect, &d
107d0 65 73 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  est) ){.        
107e0 20 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f    sqlite3KeyInfo
107f0 55 6e 72 65 66 28 70 4b 65 79 49 6e 66 6f 29 3b  Unref(pKeyInfo);
10800 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
10810 6e 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  n 0;.        }. 
10820 20 20 20 20 20 20 20 70 45 4c 69 73 74 20 3d 20         pEList = 
10830 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b  pSelect->pEList;
10840 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
10850 20 70 4b 65 79 49 6e 66 6f 21 3d 30 20 29 3b 20   pKeyInfo!=0 ); 
10860 2f 2a 20 4f 4f 4d 20 77 69 6c 6c 20 63 61 75 73  /* OOM will caus
10870 65 20 65 78 69 74 20 61 66 74 65 72 20 73 71 6c  e exit after sql
10880 69 74 65 33 53 65 6c 65 63 74 28 29 20 2a 2f 0a  ite3Select() */.
10890 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
108a0 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 20  pEList!=0 );.   
108b0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 4c       assert( pEL
108c0 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a  ist->nExpr>0 );.
108d0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
108e0 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49 73  sqlite3KeyInfoIs
108f0 57 72 69 74 65 61 62 6c 65 28 70 4b 65 79 49 6e  Writeable(pKeyIn
10900 66 6f 29 20 29 3b 0a 20 20 20 20 20 20 20 20 70  fo) );.        p
10910 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 30  KeyInfo->aColl[0
10920 5d 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72  ] = sqlite3Binar
10930 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28  yCompareCollSeq(
10940 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
10950 4c 65 66 74 2c 0a 20 20 20 20 20 20 20 20 20 20  Left,.          
10960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
10990 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  EList->a[0].pExp
109a0 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  r);.      }else 
109b0 69 66 28 20 41 4c 57 41 59 53 28 70 45 78 70 72  if( ALWAYS(pExpr
109c0 2d 3e 78 2e 70 4c 69 73 74 21 3d 30 29 20 29 7b  ->x.pList!=0) ){
109d0 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 61 73 65  .        /* Case
109e0 20 32 3a 20 20 20 20 20 65 78 70 72 20 49 4e 20   2:     expr IN 
109f0 28 65 78 70 72 6c 69 73 74 29 0a 20 20 20 20 20  (exprlist).     
10a00 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
10a10 20 46 6f 72 20 65 61 63 68 20 65 78 70 72 65 73   For each expres
10a20 73 69 6f 6e 2c 20 62 75 69 6c 64 20 61 6e 20 69  sion, build an i
10a30 6e 64 65 78 20 6b 65 79 20 66 72 6f 6d 20 74 68  ndex key from th
10a40 65 20 65 76 61 6c 75 61 74 69 6f 6e 20 61 6e 64  e evaluation and
10a50 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 74 6f 72  .        ** stor
10a60 65 20 69 74 20 69 6e 20 74 68 65 20 74 65 6d 70  e it in the temp
10a70 6f 72 61 72 79 20 74 61 62 6c 65 2e 20 49 66 20  orary table. If 
10a80 3c 65 78 70 72 3e 20 69 73 20 61 20 63 6f 6c 75  <expr> is a colu
10a90 6d 6e 2c 20 74 68 65 6e 20 75 73 65 0a 20 20 20  mn, then use.   
10aa0 20 20 20 20 20 2a 2a 20 74 68 61 74 20 63 6f 6c       ** that col
10ab0 75 6d 6e 73 20 61 66 66 69 6e 69 74 79 20 77 68  umns affinity wh
10ac0 65 6e 20 62 75 69 6c 64 69 6e 67 20 69 6e 64 65  en building inde
10ad0 78 20 6b 65 79 73 2e 20 49 66 20 3c 65 78 70 72  x keys. If <expr
10ae0 3e 20 69 73 20 6e 6f 74 0a 20 20 20 20 20 20 20  > is not.       
10af0 20 2a 2a 20 61 20 63 6f 6c 75 6d 6e 2c 20 75 73   ** a column, us
10b00 65 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e 69  e numeric affini
10b10 74 79 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ty..        */. 
10b20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20         int i;.  
10b30 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a        ExprList *
10b40 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78  pList = pExpr->x
10b50 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20  .pList;.        
10b60 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
10b70 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20  item *pItem;.   
10b80 20 20 20 20 20 69 6e 74 20 72 31 2c 20 72 32 2c       int r1, r2,
10b90 20 72 33 3b 0a 0a 20 20 20 20 20 20 20 20 69 66   r3;..        if
10ba0 28 20 21 61 66 66 69 6e 69 74 79 20 29 7b 0a 20  ( !affinity ){. 
10bb0 20 20 20 20 20 20 20 20 20 61 66 66 69 6e 69 74           affinit
10bc0 79 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 42  y = SQLITE_AFF_B
10bd0 4c 4f 42 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  LOB;.        }. 
10be0 20 20 20 20 20 20 20 69 66 28 20 70 4b 65 79 49         if( pKeyI
10bf0 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 20  nfo ){.         
10c00 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
10c10 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61 62  KeyInfoIsWriteab
10c20 6c 65 28 70 4b 65 79 49 6e 66 6f 29 20 29 3b 0a  le(pKeyInfo) );.
10c30 20 20 20 20 20 20 20 20 20 20 70 4b 65 79 49 6e            pKeyIn
10c40 66 6f 2d 3e 61 43 6f 6c 6c 5b 30 5d 20 3d 20 73  fo->aColl[0] = s
10c50 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
10c60 71 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  q(pParse, pExpr-
10c70 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 20  >pLeft);.       
10c80 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 4c   }..        /* L
10c90 6f 6f 70 20 74 68 72 6f 75 67 68 20 65 61 63 68  oop through each
10ca0 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 3c   expression in <
10cb0 65 78 70 72 6c 69 73 74 3e 2e 20 2a 2f 0a 20 20  exprlist>. */.  
10cc0 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
10cd0 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
10ce0 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 72 32  rse);.        r2
10cf0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
10d00 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
10d10 20 20 20 20 20 20 69 66 28 20 69 73 52 6f 77 69        if( isRowi
10d20 64 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 41  d ) sqlite3VdbeA
10d30 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp2(v, OP_Null
10d40 2c 20 30 2c 20 72 32 29 3b 0a 20 20 20 20 20 20  , 0, r2);.      
10d50 20 20 66 6f 72 28 69 3d 70 4c 69 73 74 2d 3e 6e    for(i=pList->n
10d60 45 78 70 72 2c 20 70 49 74 65 6d 3d 70 4c 69 73  Expr, pItem=pLis
10d70 74 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20  t->a; i>0; i--, 
10d80 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
10d90 20 20 20 20 45 78 70 72 20 2a 70 45 32 20 3d 20      Expr *pE2 = 
10da0 70 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  pItem->pExpr;.  
10db0 20 20 20 20 20 20 20 20 69 6e 74 20 69 56 61 6c          int iVal
10dc0 54 6f 49 6e 73 3b 0a 0a 20 20 20 20 20 20 20 20  ToIns;..        
10dd0 20 20 2f 2a 20 49 66 20 74 68 65 20 65 78 70 72    /* If the expr
10de0 65 73 73 69 6f 6e 20 69 73 20 6e 6f 74 20 63 6f  ession is not co
10df0 6e 73 74 61 6e 74 20 74 68 65 6e 20 77 65 20 77  nstant then we w
10e00 69 6c 6c 20 6e 65 65 64 20 74 6f 0a 20 20 20 20  ill need to.    
10e10 20 20 20 20 20 20 2a 2a 20 64 69 73 61 62 6c 65        ** disable
10e20 20 74 68 65 20 74 65 73 74 20 74 68 61 74 20 77   the test that w
10e30 61 73 20 67 65 6e 65 72 61 74 65 64 20 61 62 6f  as generated abo
10e40 76 65 20 74 68 61 74 20 6d 61 6b 65 73 20 73 75  ve that makes su
10e50 72 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  re.          ** 
10e60 74 68 69 73 20 63 6f 64 65 20 6f 6e 6c 79 20 65  this code only e
10e70 78 65 63 75 74 65 73 20 6f 6e 63 65 2e 20 20 42  xecutes once.  B
10e80 65 63 61 75 73 65 20 66 6f 72 20 61 20 6e 6f 6e  ecause for a non
10e90 2d 63 6f 6e 73 74 61 6e 74 0a 20 20 20 20 20 20  -constant.      
10ea0 20 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f      ** expressio
10eb0 6e 20 77 65 20 6e 65 65 64 20 74 6f 20 72 65 72  n we need to rer
10ec0 75 6e 20 74 68 69 73 20 63 6f 64 65 20 65 61 63  un this code eac
10ed0 68 20 74 69 6d 65 2e 0a 20 20 20 20 20 20 20 20  h time..        
10ee0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69    */.          i
10ef0 66 28 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63 3e  f( jmpIfDynamic>
10f00 3d 30 20 26 26 20 21 73 71 6c 69 74 65 33 45 78  =0 && !sqlite3Ex
10f10 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 45 32  prIsConstant(pE2
10f20 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
10f30 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
10f40 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 6a 6d 70 49  geToNoop(v, jmpI
10f50 66 44 79 6e 61 6d 69 63 29 3b 0a 20 20 20 20 20  fDynamic);.     
10f60 20 20 20 20 20 20 20 6a 6d 70 49 66 44 79 6e 61         jmpIfDyna
10f70 6d 69 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  mic = -1;.      
10f80 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20      }..         
10f90 20 2f 2a 20 45 76 61 6c 75 61 74 65 20 74 68 65   /* Evaluate the
10fa0 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20   expression and 
10fb0 69 6e 73 65 72 74 20 69 74 20 69 6e 74 6f 20 74  insert it into t
10fc0 68 65 20 74 65 6d 70 20 74 61 62 6c 65 20 2a 2f  he temp table */
10fd0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
10fe0 73 52 6f 77 69 64 20 26 26 20 73 71 6c 69 74 65  sRowid && sqlite
10ff0 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70  3ExprIsInteger(p
11000 45 32 2c 20 26 69 56 61 6c 54 6f 49 6e 73 29 20  E2, &iValToIns) 
11010 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
11020 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
11030 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 49 6e 74  (v, OP_InsertInt
11040 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
11050 20 72 32 2c 20 69 56 61 6c 54 6f 49 6e 73 29 3b   r2, iValToIns);
11060 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
11070 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 33  {.            r3
11080 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
11090 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c  deTarget(pParse,
110a0 20 70 45 32 2c 20 72 31 29 3b 0a 20 20 20 20 20   pE2, r1);.     
110b0 20 20 20 20 20 20 20 69 66 28 20 69 73 52 6f 77         if( isRow
110c0 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  id ){.          
110d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
110e0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4d 75 73 74  ddOp2(v, OP_Must
110f0 42 65 49 6e 74 2c 20 72 33 2c 0a 20 20 20 20 20  BeInt, r3,.     
11100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11110 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
11120 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
11130 72 28 76 29 2b 32 29 3b 0a 20 20 20 20 20 20 20  r(v)+2);.       
11140 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
11150 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
11160 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
11170 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e  eAddOp3(v, OP_In
11180 73 65 72 74 2c 20 70 45 78 70 72 2d 3e 69 54 61  sert, pExpr->iTa
11190 62 6c 65 2c 20 72 32 2c 20 72 33 29 3b 0a 20 20  ble, r2, r3);.  
111a0 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
111b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
111c0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
111d0 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
111e0 64 2c 20 72 33 2c 20 31 2c 20 72 32 2c 20 26 61  d, r3, 1, r2, &a
111f0 66 66 69 6e 69 74 79 2c 20 31 29 3b 0a 20 20 20  ffinity, 1);.   
11200 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
11210 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e  e3ExprCacheAffin
11220 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65  ityChange(pParse
11230 2c 20 72 33 2c 20 31 29 3b 0a 20 20 20 20 20 20  , r3, 1);.      
11240 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
11250 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
11260 49 64 78 49 6e 73 65 72 74 2c 20 70 45 78 70 72  IdxInsert, pExpr
11270 2d 3e 69 54 61 62 6c 65 2c 20 72 32 29 3b 0a 20  ->iTable, r2);. 
11280 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
11290 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
112a0 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
112b0 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
112c0 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20  (pParse, r1);.  
112d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
112e0 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
112f0 73 65 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 7d  se, r2);.      }
11300 0a 20 20 20 20 20 20 69 66 28 20 70 4b 65 79 49  .      if( pKeyI
11310 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 73  nfo ){.        s
11320 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
11330 50 34 28 76 2c 20 61 64 64 72 2c 20 28 76 6f 69  P4(v, addr, (voi
11340 64 20 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34  d *)pKeyInfo, P4
11350 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20  _KEYINFO);.     
11360 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
11370 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20      }..    case 
11380 54 4b 5f 45 58 49 53 54 53 3a 0a 20 20 20 20 63  TK_EXISTS:.    c
11390 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 0a 20  ase TK_SELECT:. 
113a0 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
113b0 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 68      /* If this h
113c0 61 73 20 74 6f 20 62 65 20 61 20 73 63 61 6c 61  as to be a scala
113d0 72 20 53 45 4c 45 43 54 2e 20 20 47 65 6e 65 72  r SELECT.  Gener
113e0 61 74 65 20 63 6f 64 65 20 74 6f 20 70 75 74 20  ate code to put 
113f0 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 76 61 6c  the.      ** val
11400 75 65 20 6f 66 20 74 68 69 73 20 73 65 6c 65 63  ue of this selec
11410 74 20 69 6e 20 61 20 6d 65 6d 6f 72 79 20 63 65  t in a memory ce
11420 6c 6c 20 61 6e 64 20 72 65 63 6f 72 64 20 74 68  ll and record th
11430 65 20 6e 75 6d 62 65 72 0a 20 20 20 20 20 20 2a  e number.      *
11440 2a 20 6f 66 20 74 68 65 20 6d 65 6d 6f 72 79 20  * of the memory 
11450 63 65 6c 6c 20 69 6e 20 69 43 6f 6c 75 6d 6e 2e  cell in iColumn.
11460 20 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20    If this is an 
11470 45 58 49 53 54 53 2c 20 77 72 69 74 65 0a 20 20  EXISTS, write.  
11480 20 20 20 20 2a 2a 20 61 6e 20 69 6e 74 65 67 65      ** an intege
11490 72 20 30 20 28 6e 6f 74 20 65 78 69 73 74 73 29  r 0 (not exists)
114a0 20 6f 72 20 31 20 28 65 78 69 73 74 73 29 20 69   or 1 (exists) i
114b0 6e 74 6f 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c  nto a memory cel
114c0 6c 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 72  l.      ** and r
114d0 65 63 6f 72 64 20 74 68 61 74 20 6d 65 6d 6f 72  ecord that memor
114e0 79 20 63 65 6c 6c 20 69 6e 20 69 43 6f 6c 75 6d  y cell in iColum
114f0 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  n..      */.    
11500 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 3b 20    Select *pSel; 
11510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11520 20 20 20 20 20 20 20 20 2f 2a 20 53 45 4c 45 43          /* SELEC
11530 54 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 65  T statement to e
11540 6e 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20 53  ncode */.      S
11550 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b 20  electDest dest; 
11560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11570 20 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20 64       /* How to d
11580 65 61 6c 20 77 69 74 68 20 53 45 4c 45 43 74 20  eal with SELECt 
11590 72 65 73 75 6c 74 20 2a 2f 0a 0a 20 20 20 20 20  result */..     
115a0 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
115b0 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53 54 53 20  ->op==TK_EXISTS 
115c0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
115d0 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
115e0 5f 53 45 4c 45 43 54 20 29 3b 0a 20 20 20 20 20  _SELECT );.     
115f0 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
11600 6f 70 3d 3d 54 4b 5f 45 58 49 53 54 53 20 7c 7c  op==TK_EXISTS ||
11610 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53   pExpr->op==TK_S
11620 45 4c 45 43 54 20 29 3b 0a 0a 20 20 20 20 20 20  ELECT );..      
11630 61 73 73 65 72 74 28 20 45 78 70 72 48 61 73 50  assert( ExprHasP
11640 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
11650 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a  P_xIsSelect) );.
11660 20 20 20 20 20 20 70 53 65 6c 20 3d 20 70 45 78        pSel = pEx
11670 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 3b 0a 20  pr->x.pSelect;. 
11680 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65       sqlite3Sele
11690 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74  ctDestInit(&dest
116a0 2c 20 30 2c 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  , 0, ++pParse->n
116b0 4d 65 6d 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Mem);.      if( 
116c0 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45  pExpr->op==TK_SE
116d0 4c 45 43 54 20 29 7b 0a 20 20 20 20 20 20 20 20  LECT ){.        
116e0 64 65 73 74 2e 65 44 65 73 74 20 3d 20 53 52 54  dest.eDest = SRT
116f0 5f 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 64 65  _Mem;.        de
11700 73 74 2e 69 53 64 73 74 20 3d 20 64 65 73 74 2e  st.iSdst = dest.
11710 69 53 44 50 61 72 6d 3b 0a 20 20 20 20 20 20 20  iSDParm;.       
11720 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
11730 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  p2(v, OP_Null, 0
11740 2c 20 64 65 73 74 2e 69 53 44 50 61 72 6d 29 3b  , dest.iSDParm);
11750 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d  .        VdbeCom
11760 6d 65 6e 74 28 28 76 2c 20 22 49 6e 69 74 20 73  ment((v, "Init s
11770 75 62 71 75 65 72 79 20 72 65 73 75 6c 74 22 29  ubquery result")
11780 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
11790 20 20 20 20 20 20 20 20 64 65 73 74 2e 65 44 65          dest.eDe
117a0 73 74 20 3d 20 53 52 54 5f 45 78 69 73 74 73 3b  st = SRT_Exists;
117b0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
117c0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
117d0 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 64 65 73  _Integer, 0, des
117e0 74 2e 69 53 44 50 61 72 6d 29 3b 0a 20 20 20 20  t.iSDParm);.    
117f0 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
11800 28 76 2c 20 22 49 6e 69 74 20 45 58 49 53 54 53  (v, "Init EXISTS
11810 20 72 65 73 75 6c 74 22 29 29 3b 0a 20 20 20 20   result"));.    
11820 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
11830 33 45 78 70 72 44 65 6c 65 74 65 28 70 50 61 72  3ExprDelete(pPar
11840 73 65 2d 3e 64 62 2c 20 70 53 65 6c 2d 3e 70 4c  se->db, pSel->pL
11850 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 70 53 65  imit);.      pSe
11860 6c 2d 3e 70 4c 69 6d 69 74 20 3d 20 73 71 6c 69  l->pLimit = sqli
11870 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
11880 20 54 4b 5f 49 4e 54 45 47 45 52 2c 20 30 2c 20   TK_INTEGER, 0, 
11890 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
118a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
118b0 20 20 20 20 20 26 73 71 6c 69 74 65 33 49 6e 74       &sqlite3Int
118c0 54 6f 6b 65 6e 73 5b 31 5d 29 3b 0a 20 20 20 20  Tokens[1]);.    
118d0 20 20 70 53 65 6c 2d 3e 69 4c 69 6d 69 74 20 3d    pSel->iLimit =
118e0 20 30 3b 0a 20 20 20 20 20 20 70 53 65 6c 2d 3e   0;.      pSel->
118f0 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f  selFlags &= ~SF_
11900 4d 75 6c 74 69 56 61 6c 75 65 3b 0a 20 20 20 20  MultiValue;.    
11910 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c    if( sqlite3Sel
11920 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c  ect(pParse, pSel
11930 2c 20 26 64 65 73 74 29 20 29 7b 0a 20 20 20 20  , &dest) ){.    
11940 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
11950 20 20 20 20 7d 0a 20 20 20 20 20 20 72 52 65 67      }.      rReg
11960 20 3d 20 64 65 73 74 2e 69 53 44 50 61 72 6d 3b   = dest.iSDParm;
11970 0a 20 20 20 20 20 20 45 78 70 72 53 65 74 56 56  .      ExprSetVV
11980 41 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  AProperty(pExpr,
11990 20 45 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a 20   EP_NoReduce);. 
119a0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
119b0 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 48 61  }.  }..  if( rHa
119c0 73 4e 75 6c 6c 46 6c 61 67 20 29 7b 0a 20 20 20  sNullFlag ){.   
119d0 20 73 71 6c 69 74 65 33 53 65 74 48 61 73 4e 75   sqlite3SetHasNu
119e0 6c 6c 46 6c 61 67 28 76 2c 20 70 45 78 70 72 2d  llFlag(v, pExpr-
119f0 3e 69 54 61 62 6c 65 2c 20 72 48 61 73 4e 75 6c  >iTable, rHasNul
11a00 6c 46 6c 61 67 29 3b 0a 20 20 7d 0a 0a 20 20 69  lFlag);.  }..  i
11a10 66 28 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63 3e  f( jmpIfDynamic>
11a20 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
11a30 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
11a40 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63 29 3b 0a   jmpIfDynamic);.
11a50 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70    }.  sqlite3Exp
11a60 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65  rCachePop(pParse
11a70 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 52 65  );..  return rRe
11a80 67 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  g;.}.#endif /* S
11a90 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
11aa0 45 52 59 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  ERY */..#ifndef 
11ab0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
11ac0 55 45 52 59 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  UERY./*.** Gener
11ad0 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 6e 20  ate code for an 
11ae0 49 4e 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a  IN expression..*
11af0 2a 0a 2a 2a 20 20 20 20 20 20 78 20 49 4e 20 28  *.**      x IN (
11b00 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 2a 2a 20 20  SELECT ...).**  
11b10 20 20 20 20 78 20 49 4e 20 28 76 61 6c 75 65 2c      x IN (value,
11b20 20 76 61 6c 75 65 2c 20 2e 2e 2e 29 0a 2a 2a 0a   value, ...).**.
11b30 2a 2a 20 54 68 65 20 6c 65 66 74 2d 68 61 6e 64  ** The left-hand
11b40 20 73 69 64 65 20 28 4c 48 53 29 20 69 73 20 61   side (LHS) is a
11b50 20 73 63 61 6c 61 72 20 65 78 70 72 65 73 73 69   scalar expressi
11b60 6f 6e 2e 20 20 54 68 65 20 72 69 67 68 74 2d 68  on.  The right-h
11b70 61 6e 64 20 73 69 64 65 20 28 52 48 53 29 0a 2a  and side (RHS).*
11b80 2a 20 69 73 20 61 6e 20 61 72 72 61 79 20 6f 66  * is an array of
11b90 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 76 61   zero or more va
11ba0 6c 75 65 73 2e 20 20 54 68 65 20 65 78 70 72 65  lues.  The expre
11bb0 73 73 69 6f 6e 20 69 73 20 74 72 75 65 20 69 66  ssion is true if
11bc0 20 74 68 65 20 4c 48 53 20 69 73 0a 2a 2a 20 63   the LHS is.** c
11bd0 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20  ontained within 
11be0 74 68 65 20 52 48 53 2e 20 20 54 68 65 20 76 61  the RHS.  The va
11bf0 6c 75 65 20 6f 66 20 74 68 65 20 65 78 70 72 65  lue of the expre
11c00 73 73 69 6f 6e 20 69 73 20 75 6e 6b 6e 6f 77 6e  ssion is unknown
11c10 20 28 4e 55 4c 4c 29 0a 2a 2a 20 69 66 20 74 68   (NULL).** if th
11c20 65 20 4c 48 53 20 69 73 20 4e 55 4c 4c 20 6f 72  e LHS is NULL or
11c30 20 69 66 20 74 68 65 20 4c 48 53 20 69 73 20 6e   if the LHS is n
11c40 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74  ot contained wit
11c50 68 69 6e 20 74 68 65 20 52 48 53 20 61 6e 64 20  hin the RHS and 
11c60 74 68 65 0a 2a 2a 20 52 48 53 20 63 6f 6e 74 61  the.** RHS conta
11c70 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  ins one or more 
11c80 4e 55 4c 4c 20 76 61 6c 75 65 73 2e 0a 2a 2a 0a  NULL values..**.
11c90 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
11ca0 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20 74  generates code t
11cb0 68 61 74 20 6a 75 6d 70 73 20 74 6f 20 64 65 73  hat jumps to des
11cc0 74 49 66 46 61 6c 73 65 20 69 66 20 74 68 65 20  tIfFalse if the 
11cd0 4c 48 53 20 69 73 20 6e 6f 74 20 0a 2a 2a 20 63  LHS is not .** c
11ce0 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20  ontained within 
11cf0 74 68 65 20 52 48 53 2e 20 20 49 66 20 64 75 65  the RHS.  If due
11d00 20 74 6f 20 4e 55 4c 4c 73 20 77 65 20 63 61 6e   to NULLs we can
11d10 6e 6f 74 20 64 65 74 65 72 6d 69 6e 65 20 69 66  not determine if
11d20 20 74 68 65 20 4c 48 53 0a 2a 2a 20 69 73 20 63   the LHS.** is c
11d30 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20  ontained in the 
11d40 52 48 53 20 74 68 65 6e 20 6a 75 6d 70 20 74 6f  RHS then jump to
11d50 20 64 65 73 74 49 66 4e 75 6c 6c 2e 20 20 49 66   destIfNull.  If
11d60 20 74 68 65 20 4c 48 53 20 69 73 20 63 6f 6e 74   the LHS is cont
11d70 61 69 6e 65 64 0a 2a 2a 20 77 69 74 68 69 6e 20  ained.** within 
11d80 74 68 65 20 52 48 53 20 74 68 65 6e 20 66 61 6c  the RHS then fal
11d90 6c 20 74 68 72 6f 75 67 68 2e 0a 2a 2f 0a 73 74  l through..*/.st
11da0 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65  atic void sqlite
11db0 33 45 78 70 72 43 6f 64 65 49 4e 28 0a 20 20 50  3ExprCodeIN(.  P
11dc0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
11dd0 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
11de0 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74  and code generat
11df0 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
11e00 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20   Expr *pExpr,   
11e10 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 49 4e         /* The IN
11e20 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20   expression */. 
11e30 20 69 6e 74 20 64 65 73 74 49 66 46 61 6c 73 65   int destIfFalse
11e40 2c 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68  ,      /* Jump h
11e50 65 72 65 20 69 66 20 4c 48 53 20 69 73 20 6e 6f  ere if LHS is no
11e60 74 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74  t contained in t
11e70 68 65 20 52 48 53 20 2a 2f 0a 20 20 69 6e 74 20  he RHS */.  int 
11e80 64 65 73 74 49 66 4e 75 6c 6c 20 20 20 20 20 20  destIfNull      
11e90 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69    /* Jump here i
11ea0 66 20 74 68 65 20 72 65 73 75 6c 74 73 20 61 72  f the results ar
11eb0 65 20 75 6e 6b 6e 6f 77 6e 20 64 75 65 20 74 6f  e unknown due to
11ec0 20 4e 55 4c 4c 73 20 2a 2f 0a 29 7b 0a 20 20 69   NULLs */.){.  i
11ed0 6e 74 20 72 52 68 73 48 61 73 4e 75 6c 6c 20 3d  nt rRhsHasNull =
11ee0 20 30 3b 20 20 2f 2a 20 52 65 67 69 73 74 65 72   0;  /* Register
11ef0 20 74 68 61 74 20 69 73 20 74 72 75 65 20 69 66   that is true if
11f00 20 52 48 53 20 63 6f 6e 74 61 69 6e 73 20 4e 55   RHS contains NU
11f10 4c 4c 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 63  LL values */.  c
11f20 68 61 72 20 61 66 66 69 6e 69 74 79 3b 20 20 20  har affinity;   
11f30 20 20 20 20 20 2f 2a 20 43 6f 6d 70 61 72 69 73       /* Comparis
11f40 6f 6e 20 61 66 66 69 6e 69 74 79 20 74 6f 20 75  on affinity to u
11f50 73 65 20 2a 2f 0a 20 20 69 6e 74 20 65 54 79 70  se */.  int eTyp
11f60 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
11f70 20 54 79 70 65 20 6f 66 20 74 68 65 20 52 48 53   Type of the RHS
11f80 20 2a 2f 0a 20 20 69 6e 74 20 72 31 3b 20 20 20   */.  int r1;   
11f90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
11fa0 65 6d 70 6f 72 61 72 79 20 75 73 65 20 72 65 67  emporary use reg
11fb0 69 73 74 65 72 20 2a 2f 0a 20 20 56 64 62 65 20  ister */.  Vdbe 
11fc0 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *v;             
11fd0 20 2f 2a 20 53 74 61 74 65 6d 65 6e 74 20 75 6e   /* Statement un
11fe0 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
11ff0 20 2a 2f 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74   */..  /* Comput
12000 65 20 74 68 65 20 52 48 53 2e 20 20 20 41 66 74  e the RHS.   Aft
12010 65 72 20 74 68 69 73 20 73 74 65 70 2c 20 74 68  er this step, th
12020 65 20 74 61 62 6c 65 20 77 69 74 68 20 63 75 72  e table with cur
12030 73 6f 72 0a 20 20 2a 2a 20 70 45 78 70 72 2d 3e  sor.  ** pExpr->
12040 69 54 61 62 6c 65 20 77 69 6c 6c 20 63 6f 6e 74  iTable will cont
12050 61 69 6e 73 20 74 68 65 20 76 61 6c 75 65 73 20  ains the values 
12060 74 68 61 74 20 6d 61 6b 65 20 75 70 20 74 68 65  that make up the
12070 20 52 48 53 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d   RHS..  */.  v =
12080 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
12090 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29    assert( v!=0 )
120a0 3b 20 20 20 20 20 20 20 2f 2a 20 4f 4f 4d 20 64  ;       /* OOM d
120b0 65 74 65 63 74 65 64 20 70 72 69 6f 72 20 74 6f  etected prior to
120c0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 2a 2f   this routine */
120d0 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65  .  VdbeNoopComme
120e0 6e 74 28 28 76 2c 20 22 62 65 67 69 6e 20 49 4e  nt((v, "begin IN
120f0 20 65 78 70 72 22 29 29 3b 0a 20 20 65 54 79 70   expr"));.  eTyp
12100 65 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49  e = sqlite3FindI
12110 6e 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70  nIndex(pParse, p
12120 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20  Expr,.          
12130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12140 20 20 20 49 4e 5f 49 4e 44 45 58 5f 4d 45 4d 42     IN_INDEX_MEMB
12150 45 52 53 48 49 50 20 7c 20 49 4e 5f 49 4e 44 45  ERSHIP | IN_INDE
12160 58 5f 4e 4f 4f 50 5f 4f 4b 2c 0a 20 20 20 20 20  X_NOOP_OK,.     
12170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12180 20 20 20 20 20 20 20 20 64 65 73 74 49 66 46 61          destIfFa
12190 6c 73 65 3d 3d 64 65 73 74 49 66 4e 75 6c 6c 20  lse==destIfNull 
121a0 3f 20 30 20 3a 20 26 72 52 68 73 48 61 73 4e 75  ? 0 : &rRhsHasNu
121b0 6c 6c 29 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72  ll);..  /* Figur
121c0 65 20 6f 75 74 20 74 68 65 20 61 66 66 69 6e 69  e out the affini
121d0 74 79 20 74 6f 20 75 73 65 20 74 6f 20 63 72 65  ty to use to cre
121e0 61 74 65 20 61 20 6b 65 79 20 66 72 6f 6d 20 74  ate a key from t
121f0 68 65 20 72 65 73 75 6c 74 73 0a 20 20 2a 2a 20  he results.  ** 
12200 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  of the expressio
12210 6e 2e 20 61 66 66 69 6e 69 74 79 53 74 72 20 73  n. affinityStr s
12220 74 6f 72 65 73 20 61 20 73 74 61 74 69 63 20 73  tores a static s
12230 74 72 69 6e 67 20 73 75 69 74 61 62 6c 65 20 66  tring suitable f
12240 6f 72 0a 20 20 2a 2a 20 50 34 20 6f 66 20 4f 50  or.  ** P4 of OP
12250 5f 4d 61 6b 65 52 65 63 6f 72 64 2e 0a 20 20 2a  _MakeRecord..  *
12260 2f 0a 20 20 61 66 66 69 6e 69 74 79 20 3d 20 63  /.  affinity = c
12270 6f 6d 70 61 72 69 73 6f 6e 41 66 66 69 6e 69 74  omparisonAffinit
12280 79 28 70 45 78 70 72 29 3b 0a 0a 20 20 2f 2a 20  y(pExpr);..  /* 
12290 43 6f 64 65 20 74 68 65 20 4c 48 53 2c 20 74 68  Code the LHS, th
122a0 65 20 3c 65 78 70 72 3e 20 66 72 6f 6d 20 22 3c  e <expr> from "<
122b0 65 78 70 72 3e 20 49 4e 20 28 2e 2e 2e 29 22 2e  expr> IN (...)".
122c0 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45  .  */.  sqlite3E
122d0 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61  xprCachePush(pPa
122e0 72 73 65 29 3b 0a 20 20 72 31 20 3d 20 73 71 6c  rse);.  r1 = sql
122f0 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
12300 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65  Parse);.  sqlite
12310 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
12320 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
12330 72 31 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 73 71  r1);..  /* If sq
12340 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e 64 65 78  lite3FindInIndex
12350 28 29 20 64 69 64 20 6e 6f 74 20 66 69 6e 64 20  () did not find 
12360 6f 72 20 63 72 65 61 74 65 20 61 6e 20 69 6e 64  or create an ind
12370 65 78 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20  ex that is.  ** 
12380 73 75 69 74 61 62 6c 65 20 66 6f 72 20 65 76 61  suitable for eva
12390 6c 75 61 74 69 6e 67 20 74 68 65 20 49 4e 20 6f  luating the IN o
123a0 70 65 72 61 74 6f 72 2c 20 74 68 65 6e 20 65 76  perator, then ev
123b0 61 6c 75 61 74 65 20 75 73 69 6e 67 20 61 0a 20  aluate using a. 
123c0 20 2a 2a 20 73 65 71 75 65 6e 63 65 20 6f 66 20   ** sequence of 
123d0 63 6f 6d 70 61 72 69 73 6f 6e 73 2e 0a 20 20 2a  comparisons..  *
123e0 2f 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 49  /.  if( eType==I
123f0 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 20 29 7b 0a  N_INDEX_NOOP ){.
12400 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c      ExprList *pL
12410 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  ist = pExpr->x.p
12420 4c 69 73 74 3b 0a 20 20 20 20 43 6f 6c 6c 53 65  List;.    CollSe
12430 71 20 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74  q *pColl = sqlit
12440 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
12450 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
12460 66 74 29 3b 0a 20 20 20 20 69 6e 74 20 6c 61 62  ft);.    int lab
12470 65 6c 4f 6b 20 3d 20 73 71 6c 69 74 65 33 56 64  elOk = sqlite3Vd
12480 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
12490 20 20 20 20 69 6e 74 20 72 32 2c 20 72 65 67 54      int r2, regT
124a0 6f 46 72 65 65 3b 0a 20 20 20 20 69 6e 74 20 72  oFree;.    int r
124b0 65 67 43 6b 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20  egCkNull = 0;.  
124c0 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 61 73    int ii;.    as
124d0 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
124e0 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
124f0 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20  _xIsSelect) );. 
12500 20 20 20 69 66 28 20 64 65 73 74 49 66 4e 75 6c     if( destIfNul
12510 6c 21 3d 64 65 73 74 49 66 46 61 6c 73 65 20 29  l!=destIfFalse )
12520 7b 0a 20 20 20 20 20 20 72 65 67 43 6b 4e 75 6c  {.      regCkNul
12530 6c 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  l = sqlite3GetTe
12540 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
12550 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
12560 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 42 69 74  AddOp3(v, OP_Bit
12570 41 6e 64 2c 20 72 31 2c 20 72 31 2c 20 72 65 67  And, r1, r1, reg
12580 43 6b 4e 75 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20  CkNull);.    }. 
12590 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c     for(ii=0; ii<
125a0 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 69  pList->nExpr; ii
125b0 2b 2b 29 7b 0a 20 20 20 20 20 20 72 32 20 3d 20  ++){.      r2 = 
125c0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
125d0 65 6d 70 28 70 50 61 72 73 65 2c 20 70 4c 69 73  emp(pParse, pLis
125e0 74 2d 3e 61 5b 69 69 5d 2e 70 45 78 70 72 2c 20  t->a[ii].pExpr, 
125f0 26 72 65 67 54 6f 46 72 65 65 29 3b 0a 20 20 20  &regToFree);.   
12600 20 20 20 69 66 28 20 72 65 67 43 6b 4e 75 6c 6c     if( regCkNull
12610 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 43   && sqlite3ExprC
12620 61 6e 42 65 4e 75 6c 6c 28 70 4c 69 73 74 2d 3e  anBeNull(pList->
12630 61 5b 69 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a  a[ii].pExpr) ){.
12640 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
12650 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
12660 42 69 74 41 6e 64 2c 20 72 65 67 43 6b 4e 75 6c  BitAnd, regCkNul
12670 6c 2c 20 72 32 2c 20 72 65 67 43 6b 4e 75 6c 6c  l, r2, regCkNull
12680 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
12690 20 69 66 28 20 69 69 3c 70 4c 69 73 74 2d 3e 6e   if( ii<pList->n
126a0 45 78 70 72 2d 31 20 7c 7c 20 64 65 73 74 49 66  Expr-1 || destIf
126b0 4e 75 6c 6c 21 3d 64 65 73 74 49 66 46 61 6c 73  Null!=destIfFals
126c0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  e ){.        sql
126d0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
126e0 2c 20 4f 50 5f 45 71 2c 20 72 31 2c 20 6c 61 62  , OP_Eq, r1, lab
126f0 65 6c 4f 6b 2c 20 72 32 2c 0a 20 20 20 20 20 20  elOk, r2,.      
12700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12710 20 20 20 20 28 76 6f 69 64 2a 29 70 43 6f 6c 6c      (void*)pColl
12720 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20  , P4_COLLSEQ);. 
12730 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
12740 61 67 65 49 66 28 76 2c 20 69 69 3c 70 4c 69 73  ageIf(v, ii<pLis
12750 74 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a 20 20 20  t->nExpr-1);.   
12760 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
12770 65 49 66 28 76 2c 20 69 69 3d 3d 70 4c 69 73 74  eIf(v, ii==pList
12780 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a 20 20 20 20  ->nExpr-1);.    
12790 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
127a0 68 61 6e 67 65 50 35 28 76 2c 20 61 66 66 69 6e  hangeP5(v, affin
127b0 69 74 79 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ity);.      }els
127c0 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  e{.        asser
127d0 74 28 20 64 65 73 74 49 66 4e 75 6c 6c 3d 3d 64  t( destIfNull==d
127e0 65 73 74 49 66 46 61 6c 73 65 20 29 3b 0a 20 20  estIfFalse );.  
127f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
12800 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4e 65  eAddOp4(v, OP_Ne
12810 2c 20 72 31 2c 20 64 65 73 74 49 66 46 61 6c 73  , r1, destIfFals
12820 65 2c 20 72 32 2c 0a 20 20 20 20 20 20 20 20 20  e, r2,.         
12830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12840 20 28 76 6f 69 64 2a 29 70 43 6f 6c 6c 2c 20 50   (void*)pColl, P
12850 34 5f 43 4f 4c 4c 53 45 51 29 3b 20 56 64 62 65  4_COLLSEQ); Vdbe
12860 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
12870 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
12880 43 68 61 6e 67 65 50 35 28 76 2c 20 61 66 66 69  ChangeP5(v, affi
12890 6e 69 74 79 20 7c 20 53 51 4c 49 54 45 5f 4a 55  nity | SQLITE_JU
128a0 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  MPIFNULL);.     
128b0 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
128c0 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
128d0 50 61 72 73 65 2c 20 72 65 67 54 6f 46 72 65 65  Parse, regToFree
128e0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
128f0 20 72 65 67 43 6b 4e 75 6c 6c 20 29 7b 0a 20 20   regCkNull ){.  
12900 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
12910 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75  ddOp2(v, OP_IsNu
12920 6c 6c 2c 20 72 65 67 43 6b 4e 75 6c 6c 2c 20 64  ll, regCkNull, d
12930 65 73 74 49 66 4e 75 6c 6c 29 3b 20 56 64 62 65  estIfNull); Vdbe
12940 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
12950 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f     sqlite3VdbeGo
12960 74 6f 28 76 2c 20 64 65 73 74 49 66 46 61 6c 73  to(v, destIfFals
12970 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  e);.    }.    sq
12980 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
12990 4c 61 62 65 6c 28 76 2c 20 6c 61 62 65 6c 4f 6b  Label(v, labelOk
129a0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65  );.    sqlite3Re
129b0 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
129c0 72 73 65 2c 20 72 65 67 43 6b 4e 75 6c 6c 29 3b  rse, regCkNull);
129d0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 0a 20 20 20  .  }else{.  .   
129e0 20 2f 2a 20 49 66 20 74 68 65 20 4c 48 53 20 69   /* If the LHS i
129f0 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65  s NULL, then the
12a00 20 72 65 73 75 6c 74 20 69 73 20 65 69 74 68 65   result is eithe
12a10 72 20 66 61 6c 73 65 20 6f 72 20 4e 55 4c 4c 20  r false or NULL 
12a20 64 65 70 65 6e 64 69 6e 67 0a 20 20 20 20 2a 2a  depending.    **
12a30 20 6f 6e 20 77 68 65 74 68 65 72 20 74 68 65 20   on whether the 
12a40 52 48 53 20 69 73 20 65 6d 70 74 79 20 6f 72 20  RHS is empty or 
12a50 6e 6f 74 2c 20 72 65 73 70 65 63 74 69 76 65 6c  not, respectivel
12a60 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  y..    */.    if
12a70 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 6e  ( sqlite3ExprCan
12a80 42 65 4e 75 6c 6c 28 70 45 78 70 72 2d 3e 70 4c  BeNull(pExpr->pL
12a90 65 66 74 29 20 29 7b 0a 20 20 20 20 20 20 69 66  eft) ){.      if
12aa0 28 20 64 65 73 74 49 66 4e 75 6c 6c 3d 3d 64 65  ( destIfNull==de
12ab0 73 74 49 66 46 61 6c 73 65 20 29 7b 0a 20 20 20  stIfFalse ){.   
12ac0 20 20 20 20 20 2f 2a 20 53 68 6f 72 74 63 75 74       /* Shortcut
12ad0 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20   for the common 
12ae0 63 61 73 65 20 77 68 65 72 65 20 74 68 65 20 66  case where the f
12af0 61 6c 73 65 20 61 6e 64 20 4e 55 4c 4c 20 6f 75  alse and NULL ou
12b00 74 63 6f 6d 65 73 20 61 72 65 0a 20 20 20 20 20  tcomes are.     
12b10 20 20 20 2a 2a 20 74 68 65 20 73 61 6d 65 2e 20     ** the same. 
12b20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  */.        sqlit
12b30 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
12b40 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 31 2c 20 64  OP_IsNull, r1, d
12b50 65 73 74 49 66 4e 75 6c 6c 29 3b 20 56 64 62 65  estIfNull); Vdbe
12b60 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
12b70 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
12b80 20 20 69 6e 74 20 61 64 64 72 31 20 3d 20 73 71    int addr1 = sq
12b90 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
12ba0 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 72  v, OP_NotNull, r
12bb0 31 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  1); VdbeCoverage
12bc0 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  (v);.        sql
12bd0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
12be0 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 70 45 78  , OP_Rewind, pEx
12bf0 70 72 2d 3e 69 54 61 62 6c 65 2c 20 64 65 73 74  pr->iTable, dest
12c00 49 66 46 61 6c 73 65 29 3b 0a 20 20 20 20 20 20  IfFalse);.      
12c10 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
12c20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
12c30 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 64 65  e3VdbeGoto(v, de
12c40 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  stIfNull);.     
12c50 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
12c60 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 31 29  mpHere(v, addr1)
12c70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
12c80 20 20 0a 20 20 20 20 69 66 28 20 65 54 79 70 65    .    if( eType
12c90 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44  ==IN_INDEX_ROWID
12ca0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20   ){.      /* In 
12cb0 74 68 69 73 20 63 61 73 65 2c 20 74 68 65 20 52  this case, the R
12cc0 48 53 20 69 73 20 74 68 65 20 52 4f 57 49 44 20  HS is the ROWID 
12cd0 6f 66 20 74 61 62 6c 65 20 62 2d 74 72 65 65 0a  of table b-tree.
12ce0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      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 4d 75 73 74 42 65 49 6e 74  (v, OP_MustBeInt
12d10 2c 20 72 31 2c 20 64 65 73 74 49 66 46 61 6c 73  , r1, destIfFals
12d20 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  e); VdbeCoverage
12d30 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (v);.      sqlit
12d40 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
12d50 4f 50 5f 4e 6f 74 45 78 69 73 74 73 2c 20 70 45  OP_NotExists, pE
12d60 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 64 65 73  xpr->iTable, des
12d70 74 49 66 46 61 6c 73 65 2c 20 72 31 29 3b 0a 20  tIfFalse, r1);. 
12d80 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
12d90 65 28 76 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  e(v);.    }else{
12da0 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20 74 68 69  .      /* In thi
12db0 73 20 63 61 73 65 2c 20 74 68 65 20 52 48 53 20  s case, the RHS 
12dc0 69 73 20 61 6e 20 69 6e 64 65 78 20 62 2d 74 72  is an index b-tr
12dd0 65 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ee..      */.   
12de0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
12df0 64 4f 70 34 28 76 2c 20 4f 50 5f 41 66 66 69 6e  dOp4(v, OP_Affin
12e00 69 74 79 2c 20 72 31 2c 20 31 2c 20 30 2c 20 26  ity, r1, 1, 0, &
12e10 61 66 66 69 6e 69 74 79 2c 20 31 29 3b 0a 20 20  affinity, 1);.  
12e20 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
12e30 20 73 65 74 20 6d 65 6d 62 65 72 73 68 69 70 20   set membership 
12e40 74 65 73 74 20 66 61 69 6c 73 2c 20 74 68 65 6e  test fails, then
12e50 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74   the result of t
12e60 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 22 78 20  he .      ** "x 
12e70 49 4e 20 28 2e 2e 2e 29 22 20 65 78 70 72 65 73  IN (...)" expres
12e80 73 69 6f 6e 20 6d 75 73 74 20 62 65 20 65 69 74  sion must be eit
12e90 68 65 72 20 30 20 6f 72 20 4e 55 4c 4c 2e 20 49  her 0 or NULL. I
12ea0 66 20 74 68 65 20 73 65 74 0a 20 20 20 20 20 20  f the set.      
12eb0 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 4e  ** contains no N
12ec0 55 4c 4c 20 76 61 6c 75 65 73 2c 20 74 68 65 6e  ULL values, then
12ed0 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 30   the result is 0
12ee0 2e 20 49 66 20 74 68 65 20 73 65 74 20 0a 20 20  . If the set .  
12ef0 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20      ** contains 
12f00 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 4e 55 4c 4c  one or more NULL
12f10 20 76 61 6c 75 65 73 2c 20 74 68 65 6e 20 74 68   values, then th
12f20 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 0a  e result of the.
12f30 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65 73 73        ** express
12f40 69 6f 6e 20 69 73 20 61 6c 73 6f 20 4e 55 4c 4c  ion is also NULL
12f50 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
12f60 20 61 73 73 65 72 74 28 20 64 65 73 74 49 66 46   assert( destIfF
12f70 61 6c 73 65 21 3d 64 65 73 74 49 66 4e 75 6c 6c  alse!=destIfNull
12f80 20 7c 7c 20 72 52 68 73 48 61 73 4e 75 6c 6c 3d   || rRhsHasNull=
12f90 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =0 );.      if( 
12fa0 72 52 68 73 48 61 73 4e 75 6c 6c 3d 3d 30 20 29  rRhsHasNull==0 )
12fb0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69  {.        /* Thi
12fc0 73 20 62 72 61 6e 63 68 20 72 75 6e 73 20 69 66  s branch runs if
12fd0 20 69 74 20 69 73 20 6b 6e 6f 77 6e 20 61 74 20   it is known at 
12fe0 63 6f 6d 70 69 6c 65 20 74 69 6d 65 20 74 68 61  compile time tha
12ff0 74 20 74 68 65 20 52 48 53 0a 20 20 20 20 20 20  t the RHS.      
13000 20 20 2a 2a 20 63 61 6e 6e 6f 74 20 63 6f 6e 74    ** cannot cont
13010 61 69 6e 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2e  ain NULL values.
13020 20 54 68 69 73 20 68 61 70 70 65 6e 73 20 61 73   This happens as
13030 20 74 68 65 20 72 65 73 75 6c 74 0a 20 20 20 20   the result.    
13040 20 20 20 20 2a 2a 20 6f 66 20 61 20 22 4e 4f 54      ** of a "NOT
13050 20 4e 55 4c 4c 22 20 63 6f 6e 73 74 72 61 69 6e   NULL" constrain
13060 74 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  t in the databas
13070 65 20 73 63 68 65 6d 61 2e 0a 20 20 20 20 20 20  e schema..      
13080 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
13090 41 6c 73 6f 20 72 75 6e 20 74 68 69 73 20 62 72  Also run this br
130a0 61 6e 63 68 20 69 66 20 4e 55 4c 4c 20 69 73 20  anch if NULL is 
130b0 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 46 41  equivalent to FA
130c0 4c 53 45 0a 20 20 20 20 20 20 20 20 2a 2a 20 66  LSE.        ** f
130d0 6f 72 20 74 68 69 73 20 70 61 72 74 69 63 75 6c  or this particul
130e0 61 72 20 49 4e 20 6f 70 65 72 61 74 6f 72 2e 0a  ar IN operator..
130f0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
13100 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
13110 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 4e 6f  dOp4Int(v, OP_No
13120 74 46 6f 75 6e 64 2c 20 70 45 78 70 72 2d 3e 69  tFound, pExpr->i
13130 54 61 62 6c 65 2c 20 64 65 73 74 49 66 46 61 6c  Table, destIfFal
13140 73 65 2c 20 72 31 2c 20 31 29 3b 0a 20 20 20 20  se, r1, 1);.    
13150 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
13160 28 76 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  (v);.      }else
13170 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20  {.        /* In 
13180 74 68 69 73 20 62 72 61 6e 63 68 2c 20 74 68 65  this branch, the
13190 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6d   RHS of the IN m
131a0 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 61 20 4e  ight contain a N
131b0 55 4c 4c 20 61 6e 64 0a 20 20 20 20 20 20 20 20  ULL and.        
131c0 2a 2a 20 74 68 65 20 70 72 65 73 65 6e 63 65 20  ** the presence 
131d0 6f 66 20 61 20 4e 55 4c 4c 20 6f 6e 20 74 68 65  of a NULL on the
131e0 20 52 48 53 20 6d 61 6b 65 73 20 61 20 64 69 66   RHS makes a dif
131f0 66 65 72 65 6e 63 65 20 69 6e 20 74 68 65 0a 20  ference in the. 
13200 20 20 20 20 20 20 20 2a 2a 20 6f 75 74 63 6f 6d         ** outcom
13210 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  e..        */.  
13220 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 31 3b        int addr1;
13230 0a 20 20 0a 20 20 20 20 20 20 20 20 2f 2a 20 46  .  .        /* F
13240 69 72 73 74 20 63 68 65 63 6b 20 74 6f 20 73 65  irst check to se
13250 65 20 69 66 20 74 68 65 20 4c 48 53 20 69 73 20  e if the LHS is 
13260 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65  contained in the
13270 20 52 48 53 2e 20 20 49 66 20 73 6f 2c 0a 20 20   RHS.  If so,.  
13280 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68        ** then th
13290 65 20 61 6e 73 77 65 72 20 69 73 20 54 52 55 45  e answer is TRUE
132a0 20 74 68 65 20 70 72 65 73 65 6e 63 65 20 6f 66   the presence of
132b0 20 4e 55 4c 4c 73 20 69 6e 20 74 68 65 20 52 48   NULLs in the RH
132c0 53 20 64 6f 65 73 0a 20 20 20 20 20 20 20 20 2a  S does.        *
132d0 2a 20 6e 6f 74 20 6d 61 74 74 65 72 2e 20 20 49  * not matter.  I
132e0 66 20 74 68 65 20 4c 48 53 20 69 73 20 6e 6f 74  f the LHS is not
132f0 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68   contained in th
13300 65 20 52 48 53 2c 20 74 68 65 6e 20 74 68 65 0a  e RHS, then the.
13310 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 73 77 65          ** answe
13320 72 20 69 73 20 4e 55 4c 4c 20 69 66 20 74 68 65  r is NULL if the
13330 20 52 48 53 20 63 6f 6e 74 61 69 6e 73 20 4e 55   RHS contains NU
13340 4c 4c 73 20 61 6e 64 20 74 68 65 20 61 6e 73 77  LLs and the answ
13350 65 72 20 69 73 0a 20 20 20 20 20 20 20 20 2a 2a  er is.        **
13360 20 46 41 4c 53 45 20 69 66 20 74 68 65 20 52 48   FALSE if the RH
13370 53 20 69 73 20 4e 55 4c 4c 2d 66 72 65 65 2e 0a  S is NULL-free..
13380 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
13390 20 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74     addr1 = sqlit
133a0 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
133b0 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 70 45 78  v, OP_Found, pEx
133c0 70 72 2d 3e 69 54 61 62 6c 65 2c 20 30 2c 20 72  pr->iTable, 0, r
133d0 31 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 56  1, 1);.        V
133e0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
133f0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
13400 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
13410 49 73 4e 75 6c 6c 2c 20 72 52 68 73 48 61 73 4e  IsNull, rRhsHasN
13420 75 6c 6c 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29  ull, destIfNull)
13430 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
13440 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
13450 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f     sqlite3VdbeGo
13460 74 6f 28 76 2c 20 64 65 73 74 49 66 46 61 6c 73  to(v, destIfFals
13470 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  e);.        sqli
13480 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
13490 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 20 20 20  v, addr1);.     
134a0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73   }.    }.  }.  s
134b0 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
134c0 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29  pReg(pParse, r1)
134d0 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43  ;.  sqlite3ExprC
134e0 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b  achePop(pParse);
134f0 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28  .  VdbeComment((
13500 76 2c 20 22 65 6e 64 20 49 4e 20 65 78 70 72 22  v, "end IN expr"
13510 29 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ));.}.#endif /* 
13520 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
13530 55 45 52 59 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  UERY */..#ifndef
13540 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f   SQLITE_OMIT_FLO
13550 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 2f 2a 0a 2a  ATING_POINT./*.*
13560 2a 20 47 65 6e 65 72 61 74 65 20 61 6e 20 69 6e  * Generate an in
13570 73 74 72 75 63 74 69 6f 6e 20 74 68 61 74 20 77  struction that w
13580 69 6c 6c 20 70 75 74 20 74 68 65 20 66 6c 6f 61  ill put the floa
13590 74 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20 76 61  ting point.** va
135a0 6c 75 65 20 64 65 73 63 72 69 62 65 64 20 62 79  lue described by
135b0 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 69 6e 74 6f 20   z[0..n-1] into 
135c0 72 65 67 69 73 74 65 72 20 69 4d 65 6d 2e 0a 2a  register iMem..*
135d0 2a 0a 2a 2a 20 54 68 65 20 7a 5b 5d 20 73 74 72  *.** The z[] str
135e0 69 6e 67 20 77 69 6c 6c 20 70 72 6f 62 61 62 6c  ing will probabl
135f0 79 20 6e 6f 74 20 62 65 20 7a 65 72 6f 2d 74 65  y not be zero-te
13600 72 6d 69 6e 61 74 65 64 2e 20 20 42 75 74 20 74  rminated.  But t
13610 68 65 20 0a 2a 2a 20 7a 5b 6e 5d 20 63 68 61 72  he .** z[n] char
13620 61 63 74 65 72 20 69 73 20 67 75 61 72 61 6e 74  acter is guarant
13630 65 65 64 20 74 6f 20 62 65 20 73 6f 6d 65 74 68  eed to be someth
13640 69 6e 67 20 74 68 61 74 20 64 6f 65 73 20 6e 6f  ing that does no
13650 74 20 6c 6f 6f 6b 0a 2a 2a 20 6c 69 6b 65 20 74  t look.** like t
13660 68 65 20 63 6f 6e 74 69 6e 75 61 74 69 6f 6e 20  he continuation 
13670 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 2e 0a 2a  of the number..*
13680 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f  /.static void co
13690 64 65 52 65 61 6c 28 56 64 62 65 20 2a 76 2c 20  deReal(Vdbe *v, 
136a0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69  const char *z, i
136b0 6e 74 20 6e 65 67 61 74 65 46 6c 61 67 2c 20 69  nt negateFlag, i
136c0 6e 74 20 69 4d 65 6d 29 7b 0a 20 20 69 66 28 20  nt iMem){.  if( 
136d0 41 4c 57 41 59 53 28 7a 21 3d 30 29 20 29 7b 0a  ALWAYS(z!=0) ){.
136e0 20 20 20 20 64 6f 75 62 6c 65 20 76 61 6c 75 65      double value
136f0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 41 74 6f  ;.    sqlite3Ato
13700 46 28 7a 2c 20 26 76 61 6c 75 65 2c 20 73 71 6c  F(z, &value, sql
13710 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 2c  ite3Strlen30(z),
13720 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20   SQLITE_UTF8);. 
13730 20 20 20 61 73 73 65 72 74 28 20 21 73 71 6c 69     assert( !sqli
13740 74 65 33 49 73 4e 61 4e 28 76 61 6c 75 65 29 20  te3IsNaN(value) 
13750 29 3b 20 2f 2a 20 54 68 65 20 6e 65 77 20 41 74  ); /* The new At
13760 6f 46 20 6e 65 76 65 72 20 72 65 74 75 72 6e 73  oF never returns
13770 20 4e 61 4e 20 2a 2f 0a 20 20 20 20 69 66 28 20   NaN */.    if( 
13780 6e 65 67 61 74 65 46 6c 61 67 20 29 20 76 61 6c  negateFlag ) val
13790 75 65 20 3d 20 2d 76 61 6c 75 65 3b 0a 20 20 20  ue = -value;.   
137a0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
137b0 70 34 44 75 70 38 28 76 2c 20 4f 50 5f 52 65 61  p4Dup8(v, OP_Rea
137c0 6c 2c 20 30 2c 20 69 4d 65 6d 2c 20 30 2c 20 28  l, 0, iMem, 0, (
137d0 75 38 2a 29 26 76 61 6c 75 65 2c 20 50 34 5f 52  u8*)&value, P4_R
137e0 45 41 4c 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  EAL);.  }.}.#end
137f0 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  if.../*.** Gener
13800 61 74 65 20 61 6e 20 69 6e 73 74 72 75 63 74 69  ate an instructi
13810 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20 70 75 74  on that will put
13820 20 74 68 65 20 69 6e 74 65 67 65 72 20 64 65 73   the integer des
13830 63 72 69 62 65 20 62 79 0a 2a 2a 20 74 65 78 74  cribe by.** text
13840 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 69 6e 74 6f 20   z[0..n-1] into 
13850 72 65 67 69 73 74 65 72 20 69 4d 65 6d 2e 0a 2a  register iMem..*
13860 2a 0a 2a 2a 20 45 78 70 72 2e 75 2e 7a 54 6f 6b  *.** Expr.u.zTok
13870 65 6e 20 69 73 20 61 6c 77 61 79 73 20 55 54 46  en is always UTF
13880 38 20 61 6e 64 20 7a 65 72 6f 2d 74 65 72 6d 69  8 and zero-termi
13890 6e 61 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  nated..*/.static
138a0 20 76 6f 69 64 20 63 6f 64 65 49 6e 74 65 67 65   void codeIntege
138b0 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  r(Parse *pParse,
138c0 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e   Expr *pExpr, in
138d0 74 20 6e 65 67 46 6c 61 67 2c 20 69 6e 74 20 69  t negFlag, int i
138e0 4d 65 6d 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  Mem){.  Vdbe *v 
138f0 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
13900 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 66 6c  .  if( pExpr->fl
13910 61 67 73 20 26 20 45 50 5f 49 6e 74 56 61 6c 75  ags & EP_IntValu
13920 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 20 3d  e ){.    int i =
13930 20 70 45 78 70 72 2d 3e 75 2e 69 56 61 6c 75 65   pExpr->u.iValue
13940 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 3e  ;.    assert( i>
13950 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 65  =0 );.    if( ne
13960 67 46 6c 61 67 20 29 20 69 20 3d 20 2d 69 3b 0a  gFlag ) i = -i;.
13970 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
13980 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
13990 67 65 72 2c 20 69 2c 20 69 4d 65 6d 29 3b 0a 20  ger, i, iMem);. 
139a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
139b0 63 3b 0a 20 20 20 20 69 36 34 20 76 61 6c 75 65  c;.    i64 value
139c0 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
139d0 20 2a 7a 20 3d 20 70 45 78 70 72 2d 3e 75 2e 7a   *z = pExpr->u.z
139e0 54 6f 6b 65 6e 3b 0a 20 20 20 20 61 73 73 65 72  Token;.    asser
139f0 74 28 20 7a 21 3d 30 20 29 3b 0a 20 20 20 20 63  t( z!=0 );.    c
13a00 20 3d 20 73 71 6c 69 74 65 33 44 65 63 4f 72 48   = sqlite3DecOrH
13a10 65 78 54 6f 49 36 34 28 7a 2c 20 26 76 61 6c 75  exToI64(z, &valu
13a20 65 29 3b 0a 20 20 20 20 69 66 28 20 63 3d 3d 30  e);.    if( c==0
13a30 20 7c 7c 20 28 63 3d 3d 32 20 26 26 20 6e 65 67   || (c==2 && neg
13a40 46 6c 61 67 29 20 29 7b 0a 20 20 20 20 20 20 69  Flag) ){.      i
13a50 66 28 20 6e 65 67 46 6c 61 67 20 29 7b 20 76 61  f( negFlag ){ va
13a60 6c 75 65 20 3d 20 63 3d 3d 32 20 3f 20 53 4d 41  lue = c==2 ? SMA
13a70 4c 4c 45 53 54 5f 49 4e 54 36 34 20 3a 20 2d 76  LLEST_INT64 : -v
13a80 61 6c 75 65 3b 20 7d 0a 20 20 20 20 20 20 73 71  alue; }.      sq
13a90 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 44  lite3VdbeAddOp4D
13aa0 75 70 38 28 76 2c 20 4f 50 5f 49 6e 74 36 34 2c  up8(v, OP_Int64,
13ab0 20 30 2c 20 69 4d 65 6d 2c 20 30 2c 20 28 75 38   0, iMem, 0, (u8
13ac0 2a 29 26 76 61 6c 75 65 2c 20 50 34 5f 49 4e 54  *)&value, P4_INT
13ad0 36 34 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  64);.    }else{.
13ae0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
13af0 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e  IT_FLOATING_POIN
13b00 54 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  T.      sqlite3E
13b10 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
13b20 22 6f 76 65 72 73 69 7a 65 64 20 69 6e 74 65 67  "oversized integ
13b30 65 72 3a 20 25 73 25 73 22 2c 20 6e 65 67 46 6c  er: %s%s", negFl
13b40 61 67 20 3f 20 22 2d 22 20 3a 20 22 22 2c 20 7a  ag ? "-" : "", z
13b50 29 3b 0a 23 65 6c 73 65 0a 23 69 66 6e 64 65 66  );.#else.#ifndef
13b60 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 48 45 58   SQLITE_OMIT_HEX
13b70 5f 49 4e 54 45 47 45 52 0a 20 20 20 20 20 20 69  _INTEGER.      i
13b80 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 6e 69  f( sqlite3_strni
13b90 63 6d 70 28 7a 2c 22 30 78 22 2c 32 29 3d 3d 30  cmp(z,"0x",2)==0
13ba0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
13bb0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
13bc0 73 65 2c 20 22 68 65 78 20 6c 69 74 65 72 61 6c  se, "hex literal
13bd0 20 74 6f 6f 20 62 69 67 3a 20 25 73 22 2c 20 7a   too big: %s", z
13be0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 23  );.      }else.#
13bf0 65 6e 64 69 66 0a 20 20 20 20 20 20 7b 0a 20 20  endif.      {.  
13c00 20 20 20 20 20 20 63 6f 64 65 52 65 61 6c 28 76        codeReal(v
13c10 2c 20 7a 2c 20 6e 65 67 46 6c 61 67 2c 20 69 4d  , z, negFlag, iM
13c20 65 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  em);.      }.#en
13c30 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  dif.    }.  }.}.
13c40 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 61 20 63  ./*.** Clear a c
13c50 61 63 68 65 20 65 6e 74 72 79 2e 0a 2a 2f 0a 73  ache entry..*/.s
13c60 74 61 74 69 63 20 76 6f 69 64 20 63 61 63 68 65  tatic void cache
13c70 45 6e 74 72 79 43 6c 65 61 72 28 50 61 72 73 65  EntryClear(Parse
13c80 20 2a 70 50 61 72 73 65 2c 20 73 74 72 75 63 74   *pParse, struct
13c90 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 29 7b 0a   yColCache *p){.
13ca0 20 20 69 66 28 20 70 2d 3e 74 65 6d 70 52 65 67    if( p->tempReg
13cb0 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 72   ){.    if( pPar
13cc0 73 65 2d 3e 6e 54 65 6d 70 52 65 67 3c 41 72 72  se->nTempReg<Arr
13cd0 61 79 53 69 7a 65 28 70 50 61 72 73 65 2d 3e 61  aySize(pParse->a
13ce0 54 65 6d 70 52 65 67 29 20 29 7b 0a 20 20 20 20  TempReg) ){.    
13cf0 20 20 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52    pParse->aTempR
13d00 65 67 5b 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70  eg[pParse->nTemp
13d10 52 65 67 2b 2b 5d 20 3d 20 70 2d 3e 69 52 65 67  Reg++] = p->iReg
13d20 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 74  ;.    }.    p->t
13d30 65 6d 70 52 65 67 20 3d 20 30 3b 0a 20 20 7d 0a  empReg = 0;.  }.
13d40 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 72 64  }.../*.** Record
13d50 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63   in the column c
13d60 61 63 68 65 20 74 68 61 74 20 61 20 70 61 72 74  ache that a part
13d70 69 63 75 6c 61 72 20 63 6f 6c 75 6d 6e 20 66 72  icular column fr
13d80 6f 6d 20 61 0a 2a 2a 20 70 61 72 74 69 63 75 6c  om a.** particul
13d90 61 72 20 74 61 62 6c 65 20 69 73 20 73 74 6f 72  ar table is stor
13da0 65 64 20 69 6e 20 61 20 70 61 72 74 69 63 75 6c  ed in a particul
13db0 61 72 20 72 65 67 69 73 74 65 72 2e 0a 2a 2f 0a  ar register..*/.
13dc0 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
13dd0 43 61 63 68 65 53 74 6f 72 65 28 50 61 72 73 65  CacheStore(Parse
13de0 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 54   *pParse, int iT
13df0 61 62 2c 20 69 6e 74 20 69 43 6f 6c 2c 20 69 6e  ab, int iCol, in
13e00 74 20 69 52 65 67 29 7b 0a 20 20 69 6e 74 20 69  t iReg){.  int i
13e10 3b 0a 20 20 69 6e 74 20 6d 69 6e 4c 72 75 3b 0a  ;.  int minLru;.
13e20 20 20 69 6e 74 20 69 64 78 4c 72 75 3b 0a 20 20    int idxLru;.  
13e30 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65  struct yColCache
13e40 20 2a 70 3b 0a 0a 20 20 2f 2a 20 55 6e 6c 65 73   *p;..  /* Unles
13e50 73 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 6f  s an error has o
13e60 63 63 75 72 72 65 64 2c 20 72 65 67 69 73 74 65  ccurred, registe
13e70 72 20 6e 75 6d 62 65 72 73 20 61 72 65 20 61 6c  r numbers are al
13e80 77 61 79 73 20 70 6f 73 69 74 69 76 65 2e 20 2a  ways positive. *
13e90 2f 0a 20 20 61 73 73 65 72 74 28 20 69 52 65 67  /.  assert( iReg
13ea0 3e 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45  >0 || pParse->nE
13eb0 72 72 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62  rr || pParse->db
13ec0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
13ed0 3b 0a 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c  ;.  assert( iCol
13ee0 3e 3d 2d 31 20 26 26 20 69 43 6f 6c 3c 33 32 37  >=-1 && iCol<327
13ef0 36 38 20 29 3b 20 20 2f 2a 20 46 69 6e 69 74 65  68 );  /* Finite
13f00 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 73 20   column numbers 
13f10 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 53 51 4c  */..  /* The SQL
13f20 49 54 45 5f 43 6f 6c 75 6d 6e 43 61 63 68 65 20  ITE_ColumnCache 
13f30 66 6c 61 67 20 64 69 73 61 62 6c 65 73 20 74 68  flag disables th
13f40 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e 20  e column cache. 
13f50 20 54 68 69 73 20 69 73 20 75 73 65 64 0a 20 20   This is used.  
13f60 2a 2a 20 66 6f 72 20 74 65 73 74 69 6e 67 20 6f  ** for testing o
13f70 6e 6c 79 20 2d 20 74 6f 20 76 65 72 69 66 79 20  nly - to verify 
13f80 74 68 61 74 20 53 51 4c 69 74 65 20 61 6c 77 61  that SQLite alwa
13f90 79 73 20 67 65 74 73 20 74 68 65 20 73 61 6d 65  ys gets the same
13fa0 20 61 6e 73 77 65 72 0a 20 20 2a 2a 20 77 69 74   answer.  ** wit
13fb0 68 20 61 6e 64 20 77 69 74 68 6f 75 74 20 74 68  h and without th
13fc0 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e 0a  e column cache..
13fd0 20 20 2a 2f 0a 20 20 69 66 28 20 4f 70 74 69 6d    */.  if( Optim
13fe0 69 7a 61 74 69 6f 6e 44 69 73 61 62 6c 65 64 28  izationDisabled(
13ff0 70 50 61 72 73 65 2d 3e 64 62 2c 20 53 51 4c 49  pParse->db, SQLI
14000 54 45 5f 43 6f 6c 75 6d 6e 43 61 63 68 65 29 20  TE_ColumnCache) 
14010 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20  ) return;..  /* 
14020 46 69 72 73 74 20 72 65 70 6c 61 63 65 20 61 6e  First replace an
14030 79 20 65 78 69 73 74 69 6e 67 20 65 6e 74 72 79  y existing entry
14040 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 63 74 75  ..  **.  ** Actu
14050 61 6c 6c 79 2c 20 74 68 65 20 77 61 79 20 74 68  ally, the way th
14060 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 69  e column cache i
14070 73 20 63 75 72 72 65 6e 74 6c 79 20 75 73 65 64  s currently used
14080 2c 20 77 65 20 61 72 65 20 67 75 61 72 61 6e 74  , we are guarant
14090 65 65 64 0a 20 20 2a 2a 20 74 68 61 74 20 74 68  eed.  ** that th
140a0 65 20 6f 62 6a 65 63 74 20 77 69 6c 6c 20 6e 65  e object will ne
140b0 76 65 72 20 61 6c 72 65 61 64 79 20 62 65 20 69  ver already be i
140c0 6e 20 63 61 63 68 65 2e 20 20 56 65 72 69 66 79  n cache.  Verify
140d0 20 74 68 69 73 20 67 75 61 72 61 6e 74 65 65 2e   this guarantee.
140e0 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44  .  */.#ifndef ND
140f0 45 42 55 47 0a 20 20 66 6f 72 28 69 3d 30 2c 20  EBUG.  for(i=0, 
14100 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61  p=pParse->aColCa
14110 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f  che; i<SQLITE_N_
14120 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70  COLCACHE; i++, p
14130 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ++){.    assert(
14140 20 70 2d 3e 69 52 65 67 3d 3d 30 20 7c 7c 20 70   p->iReg==0 || p
14150 2d 3e 69 54 61 62 6c 65 21 3d 69 54 61 62 20 7c  ->iTable!=iTab |
14160 7c 20 70 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 69 43  | p->iColumn!=iC
14170 6f 6c 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  ol );.  }.#endif
14180 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 61 6e 20 65  ..  /* Find an e
14190 6d 70 74 79 20 73 6c 6f 74 20 61 6e 64 20 72 65  mpty slot and re
141a0 70 6c 61 63 65 20 69 74 20 2a 2f 0a 20 20 66 6f  place it */.  fo
141b0 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d  r(i=0, p=pParse-
141c0 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51  >aColCache; i<SQ
141d0 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b  LITE_N_COLCACHE;
141e0 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20   i++, p++){.    
141f0 69 66 28 20 70 2d 3e 69 52 65 67 3d 3d 30 20 29  if( p->iReg==0 )
14200 7b 0a 20 20 20 20 20 20 70 2d 3e 69 4c 65 76 65  {.      p->iLeve
14210 6c 20 3d 20 70 50 61 72 73 65 2d 3e 69 43 61 63  l = pParse->iCac
14220 68 65 4c 65 76 65 6c 3b 0a 20 20 20 20 20 20 70  heLevel;.      p
14230 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54 61 62 3b  ->iTable = iTab;
14240 0a 20 20 20 20 20 20 70 2d 3e 69 43 6f 6c 75 6d  .      p->iColum
14250 6e 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20  n = iCol;.      
14260 70 2d 3e 69 52 65 67 20 3d 20 69 52 65 67 3b 0a  p->iReg = iReg;.
14270 20 20 20 20 20 20 70 2d 3e 74 65 6d 70 52 65 67        p->tempReg
14280 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 6c   = 0;.      p->l
14290 72 75 20 3d 20 70 50 61 72 73 65 2d 3e 69 43 61  ru = pParse->iCa
142a0 63 68 65 43 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  cheCnt++;.      
142b0 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
142c0 7d 0a 0a 20 20 2f 2a 20 52 65 70 6c 61 63 65 20  }..  /* Replace 
142d0 74 68 65 20 6c 61 73 74 20 72 65 63 65 6e 74 6c  the last recentl
142e0 79 20 75 73 65 64 20 2a 2f 0a 20 20 6d 69 6e 4c  y used */.  minL
142f0 72 75 20 3d 20 30 78 37 66 66 66 66 66 66 66 3b  ru = 0x7fffffff;
14300 0a 20 20 69 64 78 4c 72 75 20 3d 20 2d 31 3b 0a  .  idxLru = -1;.
14310 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61    for(i=0, p=pPa
14320 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20  rse->aColCache; 
14330 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41  i<SQLITE_N_COLCA
14340 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a  CHE; i++, p++){.
14350 20 20 20 20 69 66 28 20 70 2d 3e 6c 72 75 3c 6d      if( p->lru<m
14360 69 6e 4c 72 75 20 29 7b 0a 20 20 20 20 20 20 69  inLru ){.      i
14370 64 78 4c 72 75 20 3d 20 69 3b 0a 20 20 20 20 20  dxLru = i;.     
14380 20 6d 69 6e 4c 72 75 20 3d 20 70 2d 3e 6c 72 75   minLru = p->lru
14390 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
143a0 28 20 41 4c 57 41 59 53 28 69 64 78 4c 72 75 3e  ( ALWAYS(idxLru>
143b0 3d 30 29 20 29 7b 0a 20 20 20 20 70 20 3d 20 26  =0) ){.    p = &
143c0 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68  pParse->aColCach
143d0 65 5b 69 64 78 4c 72 75 5d 3b 0a 20 20 20 20 70  e[idxLru];.    p
143e0 2d 3e 69 4c 65 76 65 6c 20 3d 20 70 50 61 72 73  ->iLevel = pPars
143f0 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 3b 0a  e->iCacheLevel;.
14400 20 20 20 20 70 2d 3e 69 54 61 62 6c 65 20 3d 20      p->iTable = 
14410 69 54 61 62 3b 0a 20 20 20 20 70 2d 3e 69 43 6f  iTab;.    p->iCo
14420 6c 75 6d 6e 20 3d 20 69 43 6f 6c 3b 0a 20 20 20  lumn = iCol;.   
14430 20 70 2d 3e 69 52 65 67 20 3d 20 69 52 65 67 3b   p->iReg = iReg;
14440 0a 20 20 20 20 70 2d 3e 74 65 6d 70 52 65 67 20  .    p->tempReg 
14450 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 6c 72 75 20  = 0;.    p->lru 
14460 3d 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65  = pParse->iCache
14470 43 6e 74 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72  Cnt++;.    retur
14480 6e 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n;.  }.}../*.** 
14490 49 6e 64 69 63 61 74 65 20 74 68 61 74 20 72 65  Indicate that re
144a0 67 69 73 74 65 72 73 20 62 65 74 77 65 65 6e 20  gisters between 
144b0 69 52 65 67 2e 2e 69 52 65 67 2b 6e 52 65 67 2d  iReg..iReg+nReg-
144c0 31 20 61 72 65 20 62 65 69 6e 67 20 6f 76 65 72  1 are being over
144d0 77 72 69 74 74 65 6e 2e 0a 2a 2a 20 50 75 72 67  written..** Purg
144e0 65 20 74 68 65 20 72 61 6e 67 65 20 6f 66 20 72  e the range of r
144f0 65 67 69 73 74 65 72 73 20 66 72 6f 6d 20 74 68  egisters from th
14500 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e 0a  e column cache..
14510 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
14520 78 70 72 43 61 63 68 65 52 65 6d 6f 76 65 28 50  xprCacheRemove(P
14530 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
14540 74 20 69 52 65 67 2c 20 69 6e 74 20 6e 52 65 67  t iReg, int nReg
14550 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  ){.  int i;.  in
14560 74 20 69 4c 61 73 74 20 3d 20 69 52 65 67 20 2b  t iLast = iReg +
14570 20 6e 52 65 67 20 2d 20 31 3b 0a 20 20 73 74 72   nReg - 1;.  str
14580 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70  uct yColCache *p
14590 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70  ;.  for(i=0, p=p
145a0 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65  Parse->aColCache
145b0 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c  ; i<SQLITE_N_COL
145c0 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29  CACHE; i++, p++)
145d0 7b 0a 20 20 20 20 69 6e 74 20 72 20 3d 20 70 2d  {.    int r = p-
145e0 3e 69 52 65 67 3b 0a 20 20 20 20 69 66 28 20 72  >iReg;.    if( r
145f0 3e 3d 69 52 65 67 20 26 26 20 72 3c 3d 69 4c 61  >=iReg && r<=iLa
14600 73 74 20 29 7b 0a 20 20 20 20 20 20 63 61 63 68  st ){.      cach
14610 65 45 6e 74 72 79 43 6c 65 61 72 28 70 50 61 72  eEntryClear(pPar
14620 73 65 2c 20 70 29 3b 0a 20 20 20 20 20 20 70 2d  se, p);.      p-
14630 3e 69 52 65 67 20 3d 20 30 3b 0a 20 20 20 20 7d  >iReg = 0;.    }
14640 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
14650 6d 65 6d 62 65 72 20 74 68 65 20 63 75 72 72 65  member the curre
14660 6e 74 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20  nt column cache 
14670 63 6f 6e 74 65 78 74 2e 20 20 41 6e 79 20 6e 65  context.  Any ne
14680 77 20 65 6e 74 72 69 65 73 20 61 64 64 65 64 0a  w entries added.
14690 2a 2a 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  ** added to the 
146a0 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 61 66 74  column cache aft
146b0 65 72 20 74 68 69 73 20 63 61 6c 6c 20 61 72 65  er this call are
146c0 20 72 65 6d 6f 76 65 64 20 77 68 65 6e 20 74 68   removed when th
146d0 65 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69  e.** correspondi
146e0 6e 67 20 70 6f 70 20 6f 63 63 75 72 73 2e 0a 2a  ng pop occurs..*
146f0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
14700 70 72 43 61 63 68 65 50 75 73 68 28 50 61 72 73  prCachePush(Pars
14710 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 70 50  e *pParse){.  pP
14720 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65  arse->iCacheLeve
14730 6c 2b 2b 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  l++;.#ifdef SQLI
14740 54 45 5f 44 45 42 55 47 0a 20 20 69 66 28 20 70  TE_DEBUG.  if( p
14750 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73  Parse->db->flags
14760 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65 41 64   & SQLITE_VdbeAd
14770 64 6f 70 54 72 61 63 65 20 29 7b 0a 20 20 20 20  dopTrace ){.    
14780 70 72 69 6e 74 66 28 22 50 55 53 48 20 74 6f 20  printf("PUSH to 
14790 25 64 5c 6e 22 2c 20 70 50 61 72 73 65 2d 3e 69  %d\n", pParse->i
147a0 43 61 63 68 65 4c 65 76 65 6c 29 3b 0a 20 20 7d  CacheLevel);.  }
147b0 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
147c0 20 52 65 6d 6f 76 65 20 66 72 6f 6d 20 74 68 65   Remove from the
147d0 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 61 6e   column cache an
147e0 79 20 65 6e 74 72 69 65 73 20 74 68 61 74 20 77  y entries that w
147f0 65 72 65 20 61 64 64 65 64 20 73 69 6e 63 65 20  ere added since 
14800 74 68 65 0a 2a 2a 20 74 68 65 20 70 72 65 76 69  the.** the previ
14810 6f 75 73 20 73 71 6c 69 74 65 33 45 78 70 72 43  ous sqlite3ExprC
14820 61 63 68 65 50 75 73 68 20 6f 70 65 72 61 74 69  achePush operati
14830 6f 6e 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  on.  In other wo
14840 72 64 73 2c 20 72 65 73 74 6f 72 65 0a 2a 2a 20  rds, restore.** 
14850 74 68 65 20 63 61 63 68 65 20 74 6f 20 74 68 65  the cache to the
14860 20 73 74 61 74 65 20 69 74 20 77 61 73 20 69 6e   state it was in
14870 20 70 72 69 6f 72 20 74 68 65 20 6d 6f 73 74 20   prior the most 
14880 72 65 63 65 6e 74 20 50 75 73 68 2e 0a 2a 2f 0a  recent Push..*/.
14890 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
148a0 43 61 63 68 65 50 6f 70 28 50 61 72 73 65 20 2a  CachePop(Parse *
148b0 70 50 61 72 73 65 29 7b 0a 20 20 69 6e 74 20 69  pParse){.  int i
148c0 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43  ;.  struct yColC
148d0 61 63 68 65 20 2a 70 3b 0a 20 20 61 73 73 65 72  ache *p;.  asser
148e0 74 28 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68  t( pParse->iCach
148f0 65 4c 65 76 65 6c 3e 3d 31 20 29 3b 0a 20 20 70  eLevel>=1 );.  p
14900 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76  Parse->iCacheLev
14910 65 6c 2d 2d 3b 0a 23 69 66 64 65 66 20 53 51 4c  el--;.#ifdef SQL
14920 49 54 45 5f 44 45 42 55 47 0a 20 20 69 66 28 20  ITE_DEBUG.  if( 
14930 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67  pParse->db->flag
14940 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65 41  s & SQLITE_VdbeA
14950 64 64 6f 70 54 72 61 63 65 20 29 7b 0a 20 20 20  ddopTrace ){.   
14960 20 70 72 69 6e 74 66 28 22 50 4f 50 20 20 74 6f   printf("POP  to
14970 20 25 64 5c 6e 22 2c 20 70 50 61 72 73 65 2d 3e   %d\n", pParse->
14980 69 43 61 63 68 65 4c 65 76 65 6c 29 3b 0a 20 20  iCacheLevel);.  
14990 7d 0a 23 65 6e 64 69 66 0a 20 20 66 6f 72 28 69  }.#endif.  for(i
149a0 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43  =0, p=pParse->aC
149b0 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54  olCache; i<SQLIT
149c0 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b  E_N_COLCACHE; i+
149d0 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28  +, p++){.    if(
149e0 20 70 2d 3e 69 52 65 67 20 26 26 20 70 2d 3e 69   p->iReg && p->i
149f0 4c 65 76 65 6c 3e 70 50 61 72 73 65 2d 3e 69 43  Level>pParse->iC
14a00 61 63 68 65 4c 65 76 65 6c 20 29 7b 0a 20 20 20  acheLevel ){.   
14a10 20 20 20 63 61 63 68 65 45 6e 74 72 79 43 6c 65     cacheEntryCle
14a20 61 72 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20  ar(pParse, p);. 
14a30 20 20 20 20 20 70 2d 3e 69 52 65 67 20 3d 20 30       p->iReg = 0
14a40 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
14a50 2a 0a 2a 2a 20 57 68 65 6e 20 61 20 63 61 63 68  *.** When a cach
14a60 65 64 20 63 6f 6c 75 6d 6e 20 69 73 20 72 65 75  ed column is reu
14a70 73 65 64 2c 20 6d 61 6b 65 20 73 75 72 65 20 74  sed, make sure t
14a80 68 61 74 20 69 74 73 20 72 65 67 69 73 74 65 72  hat its register
14a90 20 69 73 0a 2a 2a 20 6e 6f 20 6c 6f 6e 67 65 72   is.** no longer
14aa0 20 61 76 61 69 6c 61 62 6c 65 20 61 73 20 61 20   available as a 
14ab0 74 65 6d 70 20 72 65 67 69 73 74 65 72 2e 20 20  temp register.  
14ac0 74 69 63 6b 65 74 20 23 33 38 37 39 3a 20 20 74  ticket #3879:  t
14ad0 68 61 74 20 73 61 6d 65 0a 2a 2a 20 72 65 67 69  hat same.** regi
14ae0 73 74 65 72 20 6d 69 67 68 74 20 62 65 20 69 6e  ster might be in
14af0 20 74 68 65 20 63 61 63 68 65 20 69 6e 20 6d 75   the cache in mu
14b00 6c 74 69 70 6c 65 20 70 6c 61 63 65 73 2c 20 73  ltiple places, s
14b10 6f 20 62 65 20 73 75 72 65 20 74 6f 0a 2a 2a 20  o be sure to.** 
14b20 67 65 74 20 74 68 65 6d 20 61 6c 6c 2e 0a 2a 2f  get them all..*/
14b30 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c  .static void sql
14b40 69 74 65 33 45 78 70 72 43 61 63 68 65 50 69 6e  ite3ExprCachePin
14b50 52 65 67 69 73 74 65 72 28 50 61 72 73 65 20 2a  Register(Parse *
14b60 70 50 61 72 73 65 2c 20 69 6e 74 20 69 52 65 67  pParse, int iReg
14b70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74  ){.  int i;.  st
14b80 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a  ruct yColCache *
14b90 70 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d  p;.  for(i=0, p=
14ba0 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68  pParse->aColCach
14bb0 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f  e; i<SQLITE_N_CO
14bc0 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b  LCACHE; i++, p++
14bd0 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 52  ){.    if( p->iR
14be0 65 67 3d 3d 69 52 65 67 20 29 7b 0a 20 20 20 20  eg==iReg ){.    
14bf0 20 20 70 2d 3e 74 65 6d 70 52 65 67 20 3d 20 30    p->tempReg = 0
14c00 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
14c10 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
14c20 74 68 61 74 20 77 69 6c 6c 20 6c 6f 61 64 20 69  that will load i
14c30 6e 74 6f 20 72 65 67 69 73 74 65 72 20 72 65 67  nto register reg
14c40 4f 75 74 20 61 20 76 61 6c 75 65 20 74 68 61 74  Out a value that
14c50 20 69 73 0a 2a 2a 20 61 70 70 72 6f 70 72 69 61   is.** appropria
14c60 74 65 20 66 6f 72 20 74 68 65 20 69 49 64 78 43  te for the iIdxC
14c70 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20  ol-th column of 
14c80 69 6e 64 65 78 20 70 49 64 78 2e 0a 2a 2f 0a 76  index pIdx..*/.v
14c90 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43  oid sqlite3ExprC
14ca0 6f 64 65 4c 6f 61 64 49 6e 64 65 78 43 6f 6c 75  odeLoadIndexColu
14cb0 6d 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  mn(.  Parse *pPa
14cc0 72 73 65 2c 20 20 2f 2a 20 54 68 65 20 70 61 72  rse,  /* The par
14cd0 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
14ce0 20 20 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 20    Index *pIdx,  
14cf0 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 77    /* The index w
14d00 68 6f 73 65 20 63 6f 6c 75 6d 6e 20 69 73 20 74  hose column is t
14d10 6f 20 62 65 20 6c 6f 61 64 65 64 20 2a 2f 0a 20  o be loaded */. 
14d20 20 69 6e 74 20 69 54 61 62 43 75 72 2c 20 20 20   int iTabCur,   
14d30 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e 74   /* Cursor point
14d40 69 6e 67 20 74 6f 20 61 20 74 61 62 6c 65 20 72  ing to a table r
14d50 6f 77 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78  ow */.  int iIdx
14d60 43 6f 6c 2c 20 20 20 20 2f 2a 20 54 68 65 20 63  Col,    /* The c
14d70 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64  olumn of the ind
14d80 65 78 20 74 6f 20 62 65 20 6c 6f 61 64 65 64 20  ex to be loaded 
14d90 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75 74 20  */.  int regOut 
14da0 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74 68       /* Store th
14db0 65 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 76  e index column v
14dc0 61 6c 75 65 20 69 6e 20 74 68 69 73 20 72 65 67  alue in this reg
14dd0 69 73 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 31  ister */.){.  i1
14de0 36 20 69 54 61 62 43 6f 6c 20 3d 20 70 49 64 78  6 iTabCol = pIdx
14df0 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 49 64 78 43  ->aiColumn[iIdxC
14e00 6f 6c 5d 3b 0a 20 20 69 66 28 20 69 54 61 62 43  ol];.  if( iTabC
14e10 6f 6c 3d 3d 58 4e 5f 45 58 50 52 20 29 7b 0a 20  ol==XN_EXPR ){. 
14e20 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d     assert( pIdx-
14e30 3e 61 43 6f 6c 45 78 70 72 20 29 3b 0a 20 20 20  >aColExpr );.   
14e40 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 61   assert( pIdx->a
14e50 43 6f 6c 45 78 70 72 2d 3e 6e 45 78 70 72 3e 69  ColExpr->nExpr>i
14e60 49 64 78 43 6f 6c 20 29 3b 0a 20 20 20 20 70 50  IdxCol );.    pP
14e70 61 72 73 65 2d 3e 69 53 65 6c 66 54 61 62 20 3d  arse->iSelfTab =
14e80 20 69 54 61 62 43 75 72 3b 0a 20 20 20 20 73 71   iTabCur;.    sq
14e90 6c 69 74 65 33 45 78 70 72 43 6f 64 65 43 6f 70  lite3ExprCodeCop
14ea0 79 28 70 50 61 72 73 65 2c 20 70 49 64 78 2d 3e  y(pParse, pIdx->
14eb0 61 43 6f 6c 45 78 70 72 2d 3e 61 5b 69 49 64 78  aColExpr->a[iIdx
14ec0 43 6f 6c 5d 2e 70 45 78 70 72 2c 20 72 65 67 4f  Col].pExpr, regO
14ed0 75 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ut);.  }else{.  
14ee0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
14ef0 65 47 65 74 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c  eGetColumnOfTabl
14f00 65 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c  e(pParse->pVdbe,
14f10 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2c 20 69   pIdx->pTable, i
14f20 54 61 62 43 75 72 2c 0a 20 20 20 20 20 20 20 20  TabCur,.        
14f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14f40 20 20 20 20 20 20 20 20 20 20 20 20 69 54 61 62              iTab
14f50 43 6f 6c 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20  Col, regOut);.  
14f60 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  }.}../*.** Gener
14f70 61 74 65 20 63 6f 64 65 20 74 6f 20 65 78 74 72  ate code to extr
14f80 61 63 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66  act the value of
14f90 20 74 68 65 20 69 43 6f 6c 2d 74 68 20 63 6f 6c   the iCol-th col
14fa0 75 6d 6e 20 6f 66 20 61 20 74 61 62 6c 65 2e 0a  umn of a table..
14fb0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
14fc0 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e  xprCodeGetColumn
14fd0 4f 66 54 61 62 6c 65 28 0a 20 20 56 64 62 65 20  OfTable(.  Vdbe 
14fe0 2a 76 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68  *v,        /* Th
14ff0 65 20 56 44 42 45 20 75 6e 64 65 72 20 63 6f 6e  e VDBE under con
15000 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 54  struction */.  T
15010 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 2f  able *pTab,    /
15020 2a 20 54 68 65 20 74 61 62 6c 65 20 63 6f 6e 74  * The table cont
15030 61 69 6e 69 6e 67 20 74 68 65 20 76 61 6c 75 65  aining the value
15040 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 43 75   */.  int iTabCu
15050 72 2c 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62  r,    /* The tab
15060 6c 65 20 63 75 72 73 6f 72 2e 20 20 4f 72 20 74  le cursor.  Or t
15070 68 65 20 50 4b 20 63 75 72 73 6f 72 20 66 6f 72  he PK cursor for
15080 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 2a   WITHOUT ROWID *
15090 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 20 20 20  /.  int iCol,   
150a0 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
150b0 74 68 65 20 63 6f 6c 75 6d 6e 20 74 6f 20 65 78  the column to ex
150c0 74 72 61 63 74 20 2a 2f 0a 20 20 69 6e 74 20 72  tract */.  int r
150d0 65 67 4f 75 74 20 20 20 20 20 20 2f 2a 20 45 78  egOut      /* Ex
150e0 74 72 61 63 74 20 74 68 65 20 76 61 6c 75 65 20  tract the value 
150f0 69 6e 74 6f 20 74 68 69 73 20 72 65 67 69 73 74  into this regist
15100 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 69  er */.){.  if( i
15110 43 6f 6c 3c 30 20 7c 7c 20 69 43 6f 6c 3d 3d 70  Col<0 || iCol==p
15120 54 61 62 2d 3e 69 50 4b 65 79 20 29 7b 0a 20 20  Tab->iPKey ){.  
15130 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15140 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c  Op2(v, OP_Rowid,
15150 20 69 54 61 62 43 75 72 2c 20 72 65 67 4f 75 74   iTabCur, regOut
15160 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
15170 69 6e 74 20 6f 70 20 3d 20 49 73 56 69 72 74 75  int op = IsVirtu
15180 61 6c 28 70 54 61 62 29 20 3f 20 4f 50 5f 56 43  al(pTab) ? OP_VC
15190 6f 6c 75 6d 6e 20 3a 20 4f 50 5f 43 6f 6c 75 6d  olumn : OP_Colum
151a0 6e 3b 0a 20 20 20 20 69 6e 74 20 78 20 3d 20 69  n;.    int x = i
151b0 43 6f 6c 3b 0a 20 20 20 20 69 66 28 20 21 48 61  Col;.    if( !Ha
151c0 73 52 6f 77 69 64 28 70 54 61 62 29 20 29 7b 0a  sRowid(pTab) ){.
151d0 20 20 20 20 20 20 78 20 3d 20 73 71 6c 69 74 65        x = sqlite
151e0 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78 28 73  3ColumnOfIndex(s
151f0 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79  qlite3PrimaryKey
15200 49 6e 64 65 78 28 70 54 61 62 29 2c 20 69 43 6f  Index(pTab), iCo
15210 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  l);.    }.    sq
15220 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
15230 76 2c 20 6f 70 2c 20 69 54 61 62 43 75 72 2c 20  v, op, iTabCur, 
15240 78 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20 7d 0a  x, regOut);.  }.
15250 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 29 7b    if( iCol>=0 ){
15260 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6c 75  .    sqlite3Colu
15270 6d 6e 44 65 66 61 75 6c 74 28 76 2c 20 70 54 61  mnDefault(v, pTa
15280 62 2c 20 69 43 6f 6c 2c 20 72 65 67 4f 75 74 29  b, iCol, regOut)
15290 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  ;.  }.}../*.** G
152a0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
152b0 74 20 77 69 6c 6c 20 65 78 74 72 61 63 74 20 74  t will extract t
152c0 68 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 20 63 6f  he iColumn-th co
152d0 6c 75 6d 6e 20 66 72 6f 6d 0a 2a 2a 20 74 61 62  lumn from.** tab
152e0 6c 65 20 70 54 61 62 20 61 6e 64 20 73 74 6f 72  le pTab and stor
152f0 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 76 61 6c  e the column val
15300 75 65 20 69 6e 20 61 20 72 65 67 69 73 74 65 72  ue in a register
15310 2e 20 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 66 66 6f  . .**.** An effo
15320 72 74 20 69 73 20 6d 61 64 65 20 74 6f 20 73 74  rt is made to st
15330 6f 72 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 76  ore the column v
15340 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65 72  alue in register
15350 20 69 52 65 67 2e 20 20 54 68 69 73 0a 2a 2a 20   iReg.  This.** 
15360 69 73 20 6e 6f 74 20 67 61 72 61 6e 74 65 65 65  is not garanteee
15370 64 20 66 6f 72 20 47 65 74 43 6f 6c 75 6d 6e 28  d for GetColumn(
15380 29 20 2d 20 74 68 65 20 72 65 73 75 6c 74 20 63  ) - the result c
15390 61 6e 20 62 65 20 73 74 6f 72 65 64 20 69 6e 0a  an be stored in.
153a0 2a 2a 20 61 6e 79 20 72 65 67 69 73 74 65 72 2e  ** any register.
153b0 20 20 42 75 74 20 74 68 65 20 72 65 73 75 6c 74    But the result
153c0 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
153d0 6f 20 6c 61 6e 64 20 69 6e 20 72 65 67 69 73 74  o land in regist
153e0 65 72 20 69 52 65 67 0a 2a 2a 20 66 6f 72 20 47  er iReg.** for G
153f0 65 74 43 6f 6c 75 6d 6e 54 6f 52 65 67 28 29 2e  etColumnToReg().
15400 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73  .**.** There mus
15410 74 20 62 65 20 61 6e 20 6f 70 65 6e 20 63 75 72  t be an open cur
15420 73 6f 72 20 74 6f 20 70 54 61 62 20 69 6e 20 69  sor to pTab in i
15430 54 61 62 6c 65 20 77 68 65 6e 20 74 68 69 73 20  Table when this 
15440 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61  routine.** is ca
15450 6c 6c 65 64 2e 20 20 49 66 20 69 43 6f 6c 75 6d  lled.  If iColum
15460 6e 3c 30 20 74 68 65 6e 20 63 6f 64 65 20 69 73  n<0 then code is
15470 20 67 65 6e 65 72 61 74 65 64 20 74 68 61 74 20   generated that 
15480 65 78 74 72 61 63 74 73 20 74 68 65 20 72 6f 77  extracts the row
15490 69 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  id..*/.int sqlit
154a0 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c  e3ExprCodeGetCol
154b0 75 6d 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50  umn(.  Parse *pP
154c0 61 72 73 65 2c 20 20 20 2f 2a 20 50 61 72 73 69  arse,   /* Parsi
154d0 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65  ng and code gene
154e0 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  rating context *
154f0 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c  /.  Table *pTab,
15500 20 20 20 20 20 2f 2a 20 44 65 73 63 72 69 70 74       /* Descript
15510 69 6f 6e 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ion of the table
15520 20 77 65 20 61 72 65 20 72 65 61 64 69 6e 67 20   we are reading 
15530 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 43  from */.  int iC
15540 6f 6c 75 6d 6e 2c 20 20 20 20 20 2f 2a 20 49 6e  olumn,     /* In
15550 64 65 78 20 6f 66 20 74 68 65 20 74 61 62 6c 65  dex of the table
15560 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 69 6e 74   column */.  int
15570 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 2f 2a   iTable,      /*
15580 20 54 68 65 20 63 75 72 73 6f 72 20 70 6f 69 6e   The cursor poin
15590 74 69 6e 67 20 74 6f 20 74 68 65 20 74 61 62 6c  ting to the tabl
155a0 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65 67 2c  e */.  int iReg,
155b0 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65          /* Store
155c0 20 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f   results here */
155d0 0a 20 20 75 38 20 70 35 20 20 20 20 20 20 20 20  .  u8 p5        
155e0 20 20 20 20 2f 2a 20 50 35 20 76 61 6c 75 65 20      /* P5 value 
155f0 66 6f 72 20 4f 50 5f 43 6f 6c 75 6d 6e 20 2b 20  for OP_Column + 
15600 46 4c 41 47 53 20 2a 2f 0a 29 7b 0a 20 20 56 64  FLAGS */.){.  Vd
15610 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
15620 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a  pVdbe;.  int i;.
15630 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63    struct yColCac
15640 68 65 20 2a 70 3b 0a 0a 20 20 66 6f 72 28 69 3d  he *p;..  for(i=
15650 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f  0, p=pParse->aCo
15660 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45  lCache; i<SQLITE
15670 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b  _N_COLCACHE; i++
15680 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  , p++){.    if( 
15690 70 2d 3e 69 52 65 67 3e 30 20 26 26 20 70 2d 3e  p->iReg>0 && p->
156a0 69 54 61 62 6c 65 3d 3d 69 54 61 62 6c 65 20 26  iTable==iTable &
156b0 26 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 69 43  & p->iColumn==iC
156c0 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 70  olumn ){.      p
156d0 2d 3e 6c 72 75 20 3d 20 70 50 61 72 73 65 2d 3e  ->lru = pParse->
156e0 69 43 61 63 68 65 43 6e 74 2b 2b 3b 0a 20 20 20  iCacheCnt++;.   
156f0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
15700 63 68 65 50 69 6e 52 65 67 69 73 74 65 72 28 70  chePinRegister(p
15710 50 61 72 73 65 2c 20 70 2d 3e 69 52 65 67 29 3b  Parse, p->iReg);
15720 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 2d  .      return p-
15730 3e 69 52 65 67 3b 0a 20 20 20 20 7d 0a 20 20 7d  >iReg;.    }.  }
15740 20 20 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d    .  assert( v!=
15750 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  0 );.  sqlite3Ex
15760 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 4f  prCodeGetColumnO
15770 66 54 61 62 6c 65 28 76 2c 20 70 54 61 62 2c 20  fTable(v, pTab, 
15780 69 54 61 62 6c 65 2c 20 69 43 6f 6c 75 6d 6e 2c  iTable, iColumn,
15790 20 69 52 65 67 29 3b 0a 20 20 69 66 28 20 70 35   iReg);.  if( p5
157a0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
157b0 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 70  dbeChangeP5(v, p
157c0 35 29 3b 0a 20 20 7d 65 6c 73 65 7b 20 20 20 0a  5);.  }else{   .
157d0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
157e0 61 63 68 65 53 74 6f 72 65 28 70 50 61 72 73 65  acheStore(pParse
157f0 2c 20 69 54 61 62 6c 65 2c 20 69 43 6f 6c 75 6d  , iTable, iColum
15800 6e 2c 20 69 52 65 67 29 3b 0a 20 20 7d 0a 20 20  n, iReg);.  }.  
15810 72 65 74 75 72 6e 20 69 52 65 67 3b 0a 7d 0a 76  return iReg;.}.v
15820 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43  oid sqlite3ExprC
15830 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 54 6f 52 65  odeGetColumnToRe
15840 67 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  g(.  Parse *pPar
15850 73 65 2c 20 20 20 2f 2a 20 50 61 72 73 69 6e 67  se,   /* Parsing
15860 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61   and code genera
15870 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  ting context */.
15880 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20    Table *pTab,  
15890 20 20 20 2f 2a 20 44 65 73 63 72 69 70 74 69 6f     /* Descriptio
158a0 6e 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 77  n of the table w
158b0 65 20 61 72 65 20 72 65 61 64 69 6e 67 20 66 72  e are reading fr
158c0 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c  om */.  int iCol
158d0 75 6d 6e 2c 20 20 20 20 20 2f 2a 20 49 6e 64 65  umn,     /* Inde
158e0 78 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 63  x of the table c
158f0 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  olumn */.  int i
15900 54 61 62 6c 65 2c 20 20 20 20 20 20 2f 2a 20 54  Table,      /* T
15910 68 65 20 63 75 72 73 6f 72 20 70 6f 69 6e 74 69  he cursor pointi
15920 6e 67 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20  ng to the table 
15930 2a 2f 0a 20 20 69 6e 74 20 69 52 65 67 20 20 20  */.  int iReg   
15940 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 72        /* Store r
15950 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29  esults here */.)
15960 7b 0a 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c  {.  int r1 = sql
15970 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43  ite3ExprCodeGetC
15980 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20 70 54  olumn(pParse, pT
15990 61 62 2c 20 69 43 6f 6c 75 6d 6e 2c 20 69 54 61  ab, iColumn, iTa
159a0 62 6c 65 2c 20 69 52 65 67 2c 20 30 29 3b 0a 20  ble, iReg, 0);. 
159b0 20 69 66 28 20 72 31 21 3d 69 52 65 67 20 29 20   if( r1!=iReg ) 
159c0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
159d0 32 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c  2(pParse->pVdbe,
159e0 20 4f 50 5f 53 43 6f 70 79 2c 20 72 31 2c 20 69   OP_SCopy, r1, i
159f0 52 65 67 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  Reg);.}.../*.** 
15a00 43 6c 65 61 72 20 61 6c 6c 20 63 6f 6c 75 6d 6e  Clear all column
15a10 20 63 61 63 68 65 20 65 6e 74 72 69 65 73 2e 0a   cache entries..
15a20 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
15a30 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 50 61  xprCacheClear(Pa
15a40 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
15a50 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
15a60 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 0a 23  yColCache *p;..#
15a70 69 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  if SQLITE_DEBUG.
15a80 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62    if( pParse->db
15a90 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
15aa0 5f 56 64 62 65 41 64 64 6f 70 54 72 61 63 65 20  _VdbeAddopTrace 
15ab0 29 7b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 43  ){.    printf("C
15ac0 4c 45 41 52 5c 6e 22 29 3b 0a 20 20 7d 0a 23 65  LEAR\n");.  }.#e
15ad0 6e 64 69 66 0a 20 20 66 6f 72 28 69 3d 30 2c 20  ndif.  for(i=0, 
15ae0 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61  p=pParse->aColCa
15af0 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f  che; i<SQLITE_N_
15b00 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70  COLCACHE; i++, p
15b10 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  ++){.    if( p->
15b20 69 52 65 67 20 29 7b 0a 20 20 20 20 20 20 63 61  iReg ){.      ca
15b30 63 68 65 45 6e 74 72 79 43 6c 65 61 72 28 70 50  cheEntryClear(pP
15b40 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 20 20  arse, p);.      
15b50 70 2d 3e 69 52 65 67 20 3d 20 30 3b 0a 20 20 20  p->iReg = 0;.   
15b60 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
15b70 52 65 63 6f 72 64 20 74 68 65 20 66 61 63 74 20  Record the fact 
15b80 74 68 61 74 20 61 6e 20 61 66 66 69 6e 69 74 79  that an affinity
15b90 20 63 68 61 6e 67 65 20 68 61 73 20 6f 63 63 75   change has occu
15ba0 72 72 65 64 20 6f 6e 20 69 43 6f 75 6e 74 0a 2a  rred on iCount.*
15bb0 2a 20 72 65 67 69 73 74 65 72 73 20 73 74 61 72  * registers star
15bc0 74 69 6e 67 20 77 69 74 68 20 69 53 74 61 72 74  ting with iStart
15bd0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
15be0 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69  3ExprCacheAffini
15bf0 74 79 43 68 61 6e 67 65 28 50 61 72 73 65 20 2a  tyChange(Parse *
15c00 70 50 61 72 73 65 2c 20 69 6e 74 20 69 53 74 61  pParse, int iSta
15c10 72 74 2c 20 69 6e 74 20 69 43 6f 75 6e 74 29 7b  rt, int iCount){
15c20 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  .  sqlite3ExprCa
15c30 63 68 65 52 65 6d 6f 76 65 28 70 50 61 72 73 65  cheRemove(pParse
15c40 2c 20 69 53 74 61 72 74 2c 20 69 43 6f 75 6e 74  , iStart, iCount
15c50 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  );.}../*.** Gene
15c60 72 61 74 65 20 63 6f 64 65 20 74 6f 20 6d 6f 76  rate code to mov
15c70 65 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 72  e content from r
15c80 65 67 69 73 74 65 72 73 20 69 46 72 6f 6d 2e 2e  egisters iFrom..
15c90 2e 69 46 72 6f 6d 2b 6e 52 65 67 2d 31 0a 2a 2a  .iFrom+nReg-1.**
15ca0 20 6f 76 65 72 20 74 6f 20 69 54 6f 2e 2e 69 54   over to iTo..iT
15cb0 6f 2b 6e 52 65 67 2d 31 2e 20 4b 65 65 70 20 74  o+nReg-1. Keep t
15cc0 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20  he column cache 
15cd0 75 70 2d 74 6f 2d 64 61 74 65 2e 0a 2a 2f 0a 76  up-to-date..*/.v
15ce0 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43  oid sqlite3ExprC
15cf0 6f 64 65 4d 6f 76 65 28 50 61 72 73 65 20 2a 70  odeMove(Parse *p
15d00 50 61 72 73 65 2c 20 69 6e 74 20 69 46 72 6f 6d  Parse, int iFrom
15d10 2c 20 69 6e 74 20 69 54 6f 2c 20 69 6e 74 20 6e  , int iTo, int n
15d20 52 65 67 29 7b 0a 20 20 61 73 73 65 72 74 28 20  Reg){.  assert( 
15d30 69 46 72 6f 6d 3e 3d 69 54 6f 2b 6e 52 65 67 20  iFrom>=iTo+nReg 
15d40 7c 7c 20 69 46 72 6f 6d 2b 6e 52 65 67 3c 3d 69  || iFrom+nReg<=i
15d50 54 6f 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  To );.  sqlite3V
15d60 64 62 65 41 64 64 4f 70 33 28 70 50 61 72 73 65  dbeAddOp3(pParse
15d70 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 4d 6f 76 65  ->pVdbe, OP_Move
15d80 2c 20 69 46 72 6f 6d 2c 20 69 54 6f 2c 20 6e 52  , iFrom, iTo, nR
15d90 65 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  eg);.  sqlite3Ex
15da0 70 72 43 61 63 68 65 52 65 6d 6f 76 65 28 70 50  prCacheRemove(pP
15db0 61 72 73 65 2c 20 69 46 72 6f 6d 2c 20 6e 52 65  arse, iFrom, nRe
15dc0 67 29 3b 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e  g);.}..#if defin
15dd0 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29  ed(SQLITE_DEBUG)
15de0 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49   || defined(SQLI
15df0 54 45 5f 43 4f 56 45 52 41 47 45 5f 54 45 53 54  TE_COVERAGE_TEST
15e00 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  )./*.** Return t
15e10 72 75 65 20 69 66 20 61 6e 79 20 72 65 67 69 73  rue if any regis
15e20 74 65 72 20 69 6e 20 74 68 65 20 72 61 6e 67 65  ter in the range
15e30 20 69 46 72 6f 6d 2e 2e 69 54 6f 20 28 69 6e 63   iFrom..iTo (inc
15e40 6c 75 73 69 76 65 29 0a 2a 2a 20 69 73 20 75 73  lusive).** is us
15e50 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 74 68  ed as part of th
15e60 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e 0a  e column cache..
15e70 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
15e80 6e 65 20 69 73 20 75 73 65 64 20 77 69 74 68 69  ne is used withi
15e90 6e 20 61 73 73 65 72 74 28 29 20 61 6e 64 20 74  n assert() and t
15ea0 65 73 74 63 61 73 65 28 29 20 6d 61 63 72 6f 73  estcase() macros
15eb0 20 6f 6e 6c 79 0a 2a 2a 20 61 6e 64 20 64 6f 65   only.** and doe
15ec0 73 20 6e 6f 74 20 61 70 70 65 61 72 20 69 6e 20  s not appear in 
15ed0 61 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 2e 0a  a normal build..
15ee0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 73  */.static int us
15ef0 65 64 41 73 43 6f 6c 75 6d 6e 43 61 63 68 65 28  edAsColumnCache(
15f00 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
15f10 6e 74 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69 54  nt iFrom, int iT
15f20 6f 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  o){.  int i;.  s
15f30 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20  truct yColCache 
15f40 2a 70 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70  *p;.  for(i=0, p
15f50 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63  =pParse->aColCac
15f60 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43  he; i<SQLITE_N_C
15f70 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b  OLCACHE; i++, p+
15f80 2b 29 7b 0a 20 20 20 20 69 6e 74 20 72 20 3d 20  +){.    int r = 
15f90 70 2d 3e 69 52 65 67 3b 0a 20 20 20 20 69 66 28  p->iReg;.    if(
15fa0 20 72 3e 3d 69 46 72 6f 6d 20 26 26 20 72 3c 3d   r>=iFrom && r<=
15fb0 69 54 6f 20 29 20 72 65 74 75 72 6e 20 31 3b 20  iTo ) return 1; 
15fc0 20 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a 20     /*NO_TEST*/. 
15fd0 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
15fe0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
15ff0 45 5f 44 45 42 55 47 20 7c 7c 20 53 51 4c 49 54  E_DEBUG || SQLIT
16000 45 5f 43 4f 56 45 52 41 47 45 5f 54 45 53 54 20  E_COVERAGE_TEST 
16010 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72  */../*.** Conver
16020 74 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  t an expression 
16030 6e 6f 64 65 20 74 6f 20 61 20 54 4b 5f 52 45 47  node to a TK_REG
16040 49 53 54 45 52 0a 2a 2f 0a 73 74 61 74 69 63 20  ISTER.*/.static 
16050 76 6f 69 64 20 65 78 70 72 54 6f 52 65 67 69 73  void exprToRegis
16060 74 65 72 28 45 78 70 72 20 2a 70 2c 20 69 6e 74  ter(Expr *p, int
16070 20 69 52 65 67 29 7b 0a 20 20 70 2d 3e 6f 70 32   iReg){.  p->op2
16080 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 70 2d 3e 6f   = p->op;.  p->o
16090 70 20 3d 20 54 4b 5f 52 45 47 49 53 54 45 52 3b  p = TK_REGISTER;
160a0 0a 20 20 70 2d 3e 69 54 61 62 6c 65 20 3d 20 69  .  p->iTable = i
160b0 52 65 67 3b 0a 20 20 45 78 70 72 43 6c 65 61 72  Reg;.  ExprClear
160c0 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 53  Property(p, EP_S
160d0 6b 69 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  kip);.}../*.** G
160e0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74  enerate code int
160f0 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 56 64  o the current Vd
16100 62 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74  be to evaluate t
16110 68 65 20 67 69 76 65 6e 0a 2a 2a 20 65 78 70 72  he given.** expr
16120 65 73 73 69 6f 6e 2e 20 20 41 74 74 65 6d 70 74  ession.  Attempt
16130 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 72 65   to store the re
16140 73 75 6c 74 73 20 69 6e 20 72 65 67 69 73 74 65  sults in registe
16150 72 20 22 74 61 72 67 65 74 22 2e 0a 2a 2a 20 52  r "target"..** R
16160 65 74 75 72 6e 20 74 68 65 20 72 65 67 69 73 74  eturn the regist
16170 65 72 20 77 68 65 72 65 20 72 65 73 75 6c 74 73  er where results
16180 20 61 72 65 20 73 74 6f 72 65 64 2e 0a 2a 2a 0a   are stored..**.
16190 2a 2a 20 57 69 74 68 20 74 68 69 73 20 72 6f 75  ** With this rou
161a0 74 69 6e 65 2c 20 74 68 65 72 65 20 69 73 20 6e  tine, there is n
161b0 6f 20 67 75 61 72 61 6e 74 65 65 20 74 68 61 74  o guarantee that
161c0 20 72 65 73 75 6c 74 73 20 77 69 6c 6c 0a 2a 2a   results will.**
161d0 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 74 61   be stored in ta
161e0 72 67 65 74 2e 20 20 54 68 65 20 72 65 73 75 6c  rget.  The resul
161f0 74 20 6d 69 67 68 74 20 62 65 20 73 74 6f 72 65  t might be store
16200 64 20 69 6e 20 73 6f 6d 65 20 6f 74 68 65 72 0a  d in some other.
16210 2a 2a 20 72 65 67 69 73 74 65 72 20 69 66 20 69  ** register if i
16220 74 20 69 73 20 63 6f 6e 76 65 6e 69 65 6e 74 20  t is convenient 
16230 74 6f 20 64 6f 20 73 6f 2e 20 20 54 68 65 20 63  to do so.  The c
16240 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a  alling function.
16250 2a 2a 20 6d 75 73 74 20 63 68 65 63 6b 20 74 68  ** must check th
16260 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 61 6e  e return code an
16270 64 20 6d 6f 76 65 20 74 68 65 20 72 65 73 75 6c  d move the resul
16280 74 73 20 74 6f 20 74 68 65 20 64 65 73 69 72 65  ts to the desire
16290 64 0a 2a 2a 20 72 65 67 69 73 74 65 72 2e 0a 2a  d.** register..*
162a0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
162b0 72 43 6f 64 65 54 61 72 67 65 74 28 50 61 72 73  rCodeTarget(Pars
162c0 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
162d0 2a 70 45 78 70 72 2c 20 69 6e 74 20 74 61 72 67  *pExpr, int targ
162e0 65 74 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  et){.  Vdbe *v =
162f0 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20   pParse->pVdbe; 
16300 20 2f 2a 20 54 68 65 20 56 4d 20 75 6e 64 65 72   /* The VM under
16310 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f   construction */
16320 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20  .  int op;      
16330 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16340 54 68 65 20 6f 70 63 6f 64 65 20 62 65 69 6e 67  The opcode being
16350 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20   coded */.  int 
16360 69 6e 52 65 67 20 3d 20 74 61 72 67 65 74 3b 20  inReg = target; 
16370 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 73        /* Results
16380 20 73 74 6f 72 65 64 20 69 6e 20 72 65 67 69 73   stored in regis
16390 74 65 72 20 69 6e 52 65 67 20 2a 2f 0a 20 20 69  ter inReg */.  i
163a0 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b  nt regFree1 = 0;
163b0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 6e           /* If n
163c0 6f 6e 2d 7a 65 72 6f 20 66 72 65 65 20 74 68 69  on-zero free thi
163d0 73 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69  s temporary regi
163e0 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65  ster */.  int re
163f0 67 46 72 65 65 32 20 3d 20 30 3b 20 20 20 20 20  gFree2 = 0;     
16400 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65      /* If non-ze
16410 72 6f 20 66 72 65 65 20 74 68 69 73 20 74 65 6d  ro free this tem
16420 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 20  porary register 
16430 2a 2f 0a 20 20 69 6e 74 20 72 31 2c 20 72 32 2c  */.  int r1, r2,
16440 20 72 33 2c 20 72 34 3b 20 20 20 20 20 20 20 2f   r3, r4;       /
16450 2a 20 56 61 72 69 6f 75 73 20 72 65 67 69 73 74  * Various regist
16460 65 72 20 6e 75 6d 62 65 72 73 20 2a 2f 0a 20 20  er numbers */.  
16470 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
16480 61 72 73 65 2d 3e 64 62 3b 20 2f 2a 20 54 68 65  arse->db; /* The
16490 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
164a0 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 20 74  tion */.  Expr t
164b0 65 6d 70 58 3b 20 20 20 20 20 20 20 20 20 20 20  empX;           
164c0 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79      /* Temporary
164d0 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65   expression node
164e0 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 74   */..  assert( t
164f0 61 72 67 65 74 3e 30 20 26 26 20 74 61 72 67 65  arget>0 && targe
16500 74 3c 3d 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20  t<=pParse->nMem 
16510 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 7b  );.  if( v==0 ){
16520 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
16530 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
16540 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 72 65 74  ailed );.    ret
16550 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 69 66  urn 0;.  }..  if
16560 28 20 70 45 78 70 72 3d 3d 30 20 29 7b 0a 20 20  ( pExpr==0 ){.  
16570 20 20 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a    op = TK_NULL;.
16580 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 70 20    }else{.    op 
16590 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 7d  = pExpr->op;.  }
165a0 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b  .  switch( op ){
165b0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47  .    case TK_AGG
165c0 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20  _COLUMN: {.     
165d0 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e   AggInfo *pAggIn
165e0 66 6f 20 3d 20 70 45 78 70 72 2d 3e 70 41 67 67  fo = pExpr->pAgg
165f0 49 6e 66 6f 3b 0a 20 20 20 20 20 20 73 74 72 75  Info;.      stru
16600 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a  ct AggInfo_col *
16610 70 43 6f 6c 20 3d 20 26 70 41 67 67 49 6e 66 6f  pCol = &pAggInfo
16620 2d 3e 61 43 6f 6c 5b 70 45 78 70 72 2d 3e 69 41  ->aCol[pExpr->iA
16630 67 67 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 21  gg];.      if( !
16640 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74  pAggInfo->direct
16650 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Mode ){.        
16660 61 73 73 65 72 74 28 20 70 43 6f 6c 2d 3e 69 4d  assert( pCol->iM
16670 65 6d 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20  em>0 );.        
16680 69 6e 52 65 67 20 3d 20 70 43 6f 6c 2d 3e 69 4d  inReg = pCol->iM
16690 65 6d 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  em;.        brea
166a0 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  k;.      }else i
166b0 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e 75 73 65  f( pAggInfo->use
166c0 53 6f 72 74 69 6e 67 49 64 78 20 29 7b 0a 20 20  SortingIdx ){.  
166d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
166e0 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
166f0 6c 75 6d 6e 2c 20 70 41 67 67 49 6e 66 6f 2d 3e  lumn, pAggInfo->
16700 73 6f 72 74 69 6e 67 49 64 78 50 54 61 62 2c 0a  sortingIdxPTab,.
16710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
16730 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d  ol->iSorterColum
16740 6e 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  n, target);.    
16750 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
16760 20 7d 0a 20 20 20 20 20 20 2f 2a 20 4f 74 68 65   }.      /* Othe
16770 72 77 69 73 65 2c 20 66 61 6c 6c 20 74 68 72 75  rwise, fall thru
16780 20 69 6e 74 6f 20 74 68 65 20 54 4b 5f 43 4f 4c   into the TK_COL
16790 55 4d 4e 20 63 61 73 65 20 2a 2f 0a 20 20 20 20  UMN case */.    
167a0 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  }.    case TK_CO
167b0 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e  LUMN: {.      in
167c0 74 20 69 54 61 62 20 3d 20 70 45 78 70 72 2d 3e  t iTab = pExpr->
167d0 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 69 66  iTable;.      if
167e0 28 20 69 54 61 62 3c 30 20 29 7b 0a 20 20 20 20  ( iTab<0 ){.    
167f0 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e      if( pParse->
16800 63 6b 42 61 73 65 3e 30 20 29 7b 0a 20 20 20 20  ckBase>0 ){.    
16810 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
16820 69 6e 67 20 43 48 45 43 4b 20 63 6f 6e 73 74 72  ing CHECK constr
16830 61 69 6e 74 73 20 6f 72 20 69 6e 73 65 72 74 69  aints or inserti
16840 6e 67 20 69 6e 74 6f 20 70 61 72 74 69 61 6c 20  ng into partial 
16850 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 20  index */.       
16860 20 20 20 69 6e 52 65 67 20 3d 20 70 45 78 70 72     inReg = pExpr
16870 2d 3e 69 43 6f 6c 75 6d 6e 20 2b 20 70 50 61 72  ->iColumn + pPar
16880 73 65 2d 3e 63 6b 42 61 73 65 3b 0a 20 20 20 20  se->ckBase;.    
16890 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
168a0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
168b0 20 20 20 20 20 20 2f 2a 20 43 6f 64 69 6e 67 20        /* Coding 
168c0 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68  an expression th
168d0 61 74 20 69 73 20 70 61 72 74 20 6f 66 20 61 6e  at is part of an
168e0 20 69 6e 64 65 78 20 77 68 65 72 65 20 63 6f 6c   index where col
168f0 75 6d 6e 20 6e 61 6d 65 73 0a 20 20 20 20 20 20  umn names.      
16900 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 69 6e      ** in the in
16910 64 65 78 20 72 65 66 65 72 20 74 6f 20 74 68 65  dex refer to the
16920 20 74 61 62 6c 65 20 74 6f 20 77 68 69 63 68 20   table to which 
16930 74 68 65 20 69 6e 64 65 78 20 62 65 6c 6f 6e 67  the index belong
16940 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69  s */.          i
16950 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 69 53  Tab = pParse->iS
16960 65 6c 66 54 61 62 3b 0a 20 20 20 20 20 20 20 20  elfTab;.        
16970 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
16980 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45  inReg = sqlite3E
16990 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e  xprCodeGetColumn
169a0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
169b0 70 54 61 62 2c 0a 20 20 20 20 20 20 20 20 20 20  pTab,.          
169c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
169d0 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c       pExpr->iCol
169e0 75 6d 6e 2c 20 69 54 61 62 2c 20 74 61 72 67 65  umn, iTab, targe
169f0 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
16a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16a10 20 20 70 45 78 70 72 2d 3e 6f 70 32 29 3b 0a 20    pExpr->op2);. 
16a20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
16a30 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e  }.    case TK_IN
16a40 54 45 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 63  TEGER: {.      c
16a50 6f 64 65 49 6e 74 65 67 65 72 28 70 50 61 72 73  odeInteger(pPars
16a60 65 2c 20 70 45 78 70 72 2c 20 30 2c 20 74 61 72  e, pExpr, 0, tar
16a70 67 65 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61  get);.      brea
16a80 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  k;.    }.#ifndef
16a90 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f   SQLITE_OMIT_FLO
16aa0 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20  ATING_POINT.    
16ab0 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 20 7b  case TK_FLOAT: {
16ac0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
16ad0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
16ae0 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c  pExpr, EP_IntVal
16af0 75 65 29 20 29 3b 0a 20 20 20 20 20 20 63 6f 64  ue) );.      cod
16b00 65 52 65 61 6c 28 76 2c 20 70 45 78 70 72 2d 3e  eReal(v, pExpr->
16b10 75 2e 7a 54 6f 6b 65 6e 2c 20 30 2c 20 74 61 72  u.zToken, 0, tar
16b20 67 65 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61  get);.      brea
16b30 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
16b40 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49      case TK_STRI
16b50 4e 47 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  NG: {.      asse
16b60 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
16b70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49  erty(pExpr, EP_I
16b80 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20  ntValue) );.    
16b90 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c 6f 61    sqlite3VdbeLoa
16ba0 64 53 74 72 69 6e 67 28 76 2c 20 74 61 72 67 65  dString(v, targe
16bb0 74 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  t, pExpr->u.zTok
16bc0 65 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  en);.      break
16bd0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
16be0 20 54 4b 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20   TK_NULL: {.    
16bf0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
16c00 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  Op2(v, OP_Null, 
16c10 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  0, target);.    
16c20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
16c30 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
16c40 49 54 5f 42 4c 4f 42 5f 4c 49 54 45 52 41 4c 0a  IT_BLOB_LITERAL.
16c50 20 20 20 20 63 61 73 65 20 54 4b 5f 42 4c 4f 42      case TK_BLOB
16c60 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b  : {.      int n;
16c70 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
16c80 72 20 2a 7a 3b 0a 20 20 20 20 20 20 63 68 61 72  r *z;.      char
16c90 20 2a 7a 42 6c 6f 62 3b 0a 20 20 20 20 20 20 61   *zBlob;.      a
16ca0 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
16cb0 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
16cc0 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20  P_IntValue) );. 
16cd0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
16ce0 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d  pr->u.zToken[0]=
16cf0 3d 27 78 27 20 7c 7c 20 70 45 78 70 72 2d 3e 75  ='x' || pExpr->u
16d00 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 58 27 20  .zToken[0]=='X' 
16d10 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
16d20 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
16d30 5b 31 5d 3d 3d 27 5c 27 27 20 29 3b 0a 20 20 20  [1]=='\'' );.   
16d40 20 20 20 7a 20 3d 20 26 70 45 78 70 72 2d 3e 75     z = &pExpr->u
16d50 2e 7a 54 6f 6b 65 6e 5b 32 5d 3b 0a 20 20 20 20  .zToken[2];.    
16d60 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72    n = sqlite3Str
16d70 6c 65 6e 33 30 28 7a 29 20 2d 20 31 3b 0a 20 20  len30(z) - 1;.  
16d80 20 20 20 20 61 73 73 65 72 74 28 20 7a 5b 6e 5d      assert( z[n]
16d90 3d 3d 27 5c 27 27 20 29 3b 0a 20 20 20 20 20 20  =='\'' );.      
16da0 7a 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 48  zBlob = sqlite3H
16db0 65 78 54 6f 42 6c 6f 62 28 73 71 6c 69 74 65 33  exToBlob(sqlite3
16dc0 56 64 62 65 44 62 28 76 29 2c 20 7a 2c 20 6e 29  VdbeDb(v), z, n)
16dd0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
16de0 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
16df0 42 6c 6f 62 2c 20 6e 2f 32 2c 20 74 61 72 67 65  Blob, n/2, targe
16e00 74 2c 20 30 2c 20 7a 42 6c 6f 62 2c 20 50 34 5f  t, 0, zBlob, P4_
16e10 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20  DYNAMIC);.      
16e20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
16e30 64 69 66 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  dif.    case TK_
16e40 56 41 52 49 41 42 4c 45 3a 20 7b 0a 20 20 20 20  VARIABLE: {.    
16e50 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
16e60 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
16e70 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29  , EP_IntValue) )
16e80 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
16e90 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 21  pExpr->u.zToken!
16ea0 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  =0 );.      asse
16eb0 72 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  rt( pExpr->u.zTo
16ec0 6b 65 6e 5b 30 5d 21 3d 30 20 29 3b 0a 20 20 20  ken[0]!=0 );.   
16ed0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
16ee0 64 4f 70 32 28 76 2c 20 4f 50 5f 56 61 72 69 61  dOp2(v, OP_Varia
16ef0 62 6c 65 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c  ble, pExpr->iCol
16f00 75 6d 6e 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  umn, target);.  
16f10 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 75      if( pExpr->u
16f20 2e 7a 54 6f 6b 65 6e 5b 31 5d 21 3d 30 20 29 7b  .zToken[1]!=0 ){
16f30 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
16f40 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
16f50 5b 30 5d 3d 3d 27 3f 27 20 0a 20 20 20 20 20 20  [0]=='?' .      
16f60 20 20 20 20 20 20 20 7c 7c 20 73 74 72 63 6d 70         || strcmp
16f70 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e  (pExpr->u.zToken
16f80 2c 20 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 5b  , pParse->azVar[
16f90 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2d 31  pExpr->iColumn-1
16fa0 5d 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  ])==0 );.       
16fb0 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
16fc0 67 65 50 34 28 76 2c 20 2d 31 2c 20 70 50 61 72  geP4(v, -1, pPar
16fd0 73 65 2d 3e 61 7a 56 61 72 5b 70 45 78 70 72 2d  se->azVar[pExpr-
16fe0 3e 69 43 6f 6c 75 6d 6e 2d 31 5d 2c 20 50 34 5f  >iColumn-1], P4_
16ff0 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 7d  STATIC);.      }
17000 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
17010 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
17020 52 45 47 49 53 54 45 52 3a 20 7b 0a 20 20 20 20  REGISTER: {.    
17030 20 20 69 6e 52 65 67 20 3d 20 70 45 78 70 72 2d    inReg = pExpr-
17040 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 62  >iTable;.      b
17050 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  reak;.    }.#ifn
17060 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
17070 43 41 53 54 0a 20 20 20 20 63 61 73 65 20 54 4b  CAST.    case TK
17080 5f 43 41 53 54 3a 20 7b 0a 20 20 20 20 20 20 2f  _CAST: {.      /
17090 2a 20 45 78 70 72 65 73 73 69 6f 6e 73 20 6f 66  * Expressions of
170a0 20 74 68 65 20 66 6f 72 6d 3a 20 20 20 43 41 53   the form:   CAS
170b0 54 28 70 4c 65 66 74 20 41 53 20 74 6f 6b 65 6e  T(pLeft AS token
170c0 29 20 2a 2f 0a 20 20 20 20 20 20 69 6e 52 65 67  ) */.      inReg
170d0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
170e0 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c  deTarget(pParse,
170f0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 74   pExpr->pLeft, t
17100 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 69 66  arget);.      if
17110 28 20 69 6e 52 65 67 21 3d 74 61 72 67 65 74 20  ( inReg!=target 
17120 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
17130 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
17140 4f 50 5f 53 43 6f 70 79 2c 20 69 6e 52 65 67 2c  OP_SCopy, inReg,
17150 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
17160 20 20 69 6e 52 65 67 20 3d 20 74 61 72 67 65 74    inReg = target
17170 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
17180 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
17190 32 28 76 2c 20 4f 50 5f 43 61 73 74 2c 20 74 61  2(v, OP_Cast, ta
171a0 72 67 65 74 2c 0a 20 20 20 20 20 20 20 20 20 20  rget,.          
171b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
171c0 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54 79 70  lite3AffinityTyp
171d0 65 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  e(pExpr->u.zToke
171e0 6e 2c 20 30 29 29 3b 0a 20 20 20 20 20 20 74 65  n, 0));.      te
171f0 73 74 63 61 73 65 28 20 75 73 65 64 41 73 43 6f  stcase( usedAsCo
17200 6c 75 6d 6e 43 61 63 68 65 28 70 50 61 72 73 65  lumnCache(pParse
17210 2c 20 69 6e 52 65 67 2c 20 69 6e 52 65 67 29 20  , inReg, inReg) 
17220 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
17230 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74  ExprCacheAffinit
17240 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20  yChange(pParse, 
17250 69 6e 52 65 67 2c 20 31 29 3b 0a 20 20 20 20 20  inReg, 1);.     
17260 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
17270 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
17280 4d 49 54 5f 43 41 53 54 20 2a 2f 0a 20 20 20 20  MIT_CAST */.    
17290 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20  case TK_LT:.    
172a0 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20  case TK_LE:.    
172b0 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20  case TK_GT:.    
172c0 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20  case TK_GE:.    
172d0 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20  case TK_NE:.    
172e0 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20  case TK_EQ: {.  
172f0 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
17300 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
17310 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
17320 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20  t, &regFree1);. 
17330 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65       r2 = sqlite
17340 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
17350 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69  arse, pExpr->pRi
17360 67 68 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b  ght, &regFree2);
17370 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61  .      codeCompa
17380 72 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  re(pParse, pExpr
17390 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e  ->pLeft, pExpr->
173a0 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20  pRight, op,.    
173b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 31                r1
173c0 2c 20 72 32 2c 20 69 6e 52 65 67 2c 20 53 51 4c  , r2, inReg, SQL
173d0 49 54 45 5f 53 54 4f 52 45 50 32 29 3b 0a 20 20  ITE_STOREP2);.  
173e0 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4c 54      assert(TK_LT
173f0 3d 3d 4f 50 5f 4c 74 29 3b 20 74 65 73 74 63 61  ==OP_Lt); testca
17400 73 65 28 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 20 56  se(op==OP_Lt); V
17410 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
17420 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a 20 20 20 20  op==OP_Lt);.    
17430 20 20 61 73 73 65 72 74 28 54 4b 5f 4c 45 3d 3d    assert(TK_LE==
17440 4f 50 5f 4c 65 29 3b 20 74 65 73 74 63 61 73 65  OP_Le); testcase
17450 28 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 20 56 64 62  (op==OP_Le); Vdb
17460 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70  eCoverageIf(v,op
17470 3d 3d 4f 50 5f 4c 65 29 3b 0a 20 20 20 20 20 20  ==OP_Le);.      
17480 61 73 73 65 72 74 28 54 4b 5f 47 54 3d 3d 4f 50  assert(TK_GT==OP
17490 5f 47 74 29 3b 20 74 65 73 74 63 61 73 65 28 6f  _Gt); testcase(o
174a0 70 3d 3d 4f 50 5f 47 74 29 3b 20 56 64 62 65 43  p==OP_Gt); VdbeC
174b0 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d  overageIf(v,op==
174c0 4f 50 5f 47 74 29 3b 0a 20 20 20 20 20 20 61 73  OP_Gt);.      as
174d0 73 65 72 74 28 54 4b 5f 47 45 3d 3d 4f 50 5f 47  sert(TK_GE==OP_G
174e0 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d  e); testcase(op=
174f0 3d 4f 50 5f 47 65 29 3b 20 56 64 62 65 43 6f 76  =OP_Ge); VdbeCov
17500 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50  erageIf(v,op==OP
17510 5f 47 65 29 3b 0a 20 20 20 20 20 20 61 73 73 65  _Ge);.      asse
17520 72 74 28 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71 29  rt(TK_EQ==OP_Eq)
17530 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f  ; testcase(op==O
17540 50 5f 45 71 29 3b 20 56 64 62 65 43 6f 76 65 72  P_Eq); VdbeCover
17550 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 45  ageIf(v,op==OP_E
17560 71 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  q);.      assert
17570 28 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 29 3b 20  (TK_NE==OP_Ne); 
17580 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
17590 4e 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Ne); VdbeCoverag
175a0 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4e 65 29  eIf(v,op==OP_Ne)
175b0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
175c0 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  ( regFree1==0 );
175d0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
175e0 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a   regFree2==0 );.
175f0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
17600 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49   }.    case TK_I
17610 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  S:.    case TK_I
17620 53 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 74 65  SNOT: {.      te
17630 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49  stcase( op==TK_I
17640 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  S );.      testc
17650 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 4f  ase( op==TK_ISNO
17660 54 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20  T );.      r1 = 
17670 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
17680 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
17690 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72  r->pLeft, &regFr
176a0 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d  ee1);.      r2 =
176b0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
176c0 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
176d0 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67  pr->pRight, &reg
176e0 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 6f 70  Free2);.      op
176f0 20 3d 20 28 6f 70 3d 3d 54 4b 5f 49 53 29 20 3f   = (op==TK_IS) ?
17700 20 54 4b 5f 45 51 20 3a 20 54 4b 5f 4e 45 3b 0a   TK_EQ : TK_NE;.
17710 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72        codeCompar
17720 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
17730 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e 70  >pLeft, pExpr->p
17740 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20  Right, op,.     
17750 20 20 20 20 20 20 20 20 20 20 20 20 20 72 31 2c               r1,
17760 20 72 32 2c 20 69 6e 52 65 67 2c 20 53 51 4c 49   r2, inReg, SQLI
17770 54 45 5f 53 54 4f 52 45 50 32 20 7c 20 53 51 4c  TE_STOREP2 | SQL
17780 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20  ITE_NULLEQ);.   
17790 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
177a0 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 45 51 29 3b  f(v, op==TK_EQ);
177b0 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
177c0 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f  ageIf(v, op==TK_
177d0 4e 45 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  NE);.      testc
177e0 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30  ase( regFree1==0
177f0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
17800 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20  se( regFree2==0 
17810 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
17820 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
17830 4b 5f 41 4e 44 3a 0a 20 20 20 20 63 61 73 65 20  K_AND:.    case 
17840 54 4b 5f 4f 52 3a 0a 20 20 20 20 63 61 73 65 20  TK_OR:.    case 
17850 54 4b 5f 50 4c 55 53 3a 0a 20 20 20 20 63 61 73  TK_PLUS:.    cas
17860 65 20 54 4b 5f 53 54 41 52 3a 0a 20 20 20 20 63  e TK_STAR:.    c
17870 61 73 65 20 54 4b 5f 4d 49 4e 55 53 3a 0a 20 20  ase TK_MINUS:.  
17880 20 20 63 61 73 65 20 54 4b 5f 52 45 4d 3a 0a 20    case TK_REM:. 
17890 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54 41 4e     case TK_BITAN
178a0 44 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42  D:.    case TK_B
178b0 49 54 4f 52 3a 0a 20 20 20 20 63 61 73 65 20 54  ITOR:.    case T
178c0 4b 5f 53 4c 41 53 48 3a 0a 20 20 20 20 63 61 73  K_SLASH:.    cas
178d0 65 20 54 4b 5f 4c 53 48 49 46 54 3a 0a 20 20 20  e TK_LSHIFT:.   
178e0 20 63 61 73 65 20 54 4b 5f 52 53 48 49 46 54 3a   case TK_RSHIFT:
178f0 20 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f   .    case TK_CO
17900 4e 43 41 54 3a 20 7b 0a 20 20 20 20 20 20 61 73  NCAT: {.      as
17910 73 65 72 74 28 20 54 4b 5f 41 4e 44 3d 3d 4f 50  sert( TK_AND==OP
17920 5f 41 6e 64 20 29 3b 20 20 20 20 20 20 20 20 20  _And );         
17930 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
17940 3d 54 4b 5f 41 4e 44 20 29 3b 0a 20 20 20 20 20  =TK_AND );.     
17950 20 61 73 73 65 72 74 28 20 54 4b 5f 4f 52 3d 3d   assert( TK_OR==
17960 4f 50 5f 4f 72 20 29 3b 20 20 20 20 20 20 20 20  OP_Or );        
17970 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
17980 6f 70 3d 3d 54 4b 5f 4f 52 20 29 3b 0a 20 20 20  op==TK_OR );.   
17990 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 50 4c     assert( TK_PL
179a0 55 53 3d 3d 4f 50 5f 41 64 64 20 29 3b 20 20 20  US==OP_Add );   
179b0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
179c0 28 20 6f 70 3d 3d 54 4b 5f 50 4c 55 53 20 29 3b  ( op==TK_PLUS );
179d0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
179e0 4b 5f 4d 49 4e 55 53 3d 3d 4f 50 5f 53 75 62 74  K_MINUS==OP_Subt
179f0 72 61 63 74 20 29 3b 20 20 20 20 20 74 65 73 74  ract );     test
17a00 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4d 49 4e  case( op==TK_MIN
17a10 55 53 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  US );.      asse
17a20 72 74 28 20 54 4b 5f 52 45 4d 3d 3d 4f 50 5f 52  rt( TK_REM==OP_R
17a30 65 6d 61 69 6e 64 65 72 20 29 3b 20 20 20 20 20  emainder );     
17a40 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
17a50 4b 5f 52 45 4d 20 29 3b 0a 20 20 20 20 20 20 61  K_REM );.      a
17a60 73 73 65 72 74 28 20 54 4b 5f 42 49 54 41 4e 44  ssert( TK_BITAND
17a70 3d 3d 4f 50 5f 42 69 74 41 6e 64 20 29 3b 20 20  ==OP_BitAnd );  
17a80 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
17a90 3d 3d 54 4b 5f 42 49 54 41 4e 44 20 29 3b 0a 20  ==TK_BITAND );. 
17aa0 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
17ab0 42 49 54 4f 52 3d 3d 4f 50 5f 42 69 74 4f 72 20  BITOR==OP_BitOr 
17ac0 29 3b 20 20 20 20 20 20 20 20 74 65 73 74 63 61  );        testca
17ad0 73 65 28 20 6f 70 3d 3d 54 4b 5f 42 49 54 4f 52  se( op==TK_BITOR
17ae0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
17af0 28 20 54 4b 5f 53 4c 41 53 48 3d 3d 4f 50 5f 44  ( TK_SLASH==OP_D
17b00 69 76 69 64 65 20 29 3b 20 20 20 20 20 20 20 74  ivide );       t
17b10 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
17b20 53 4c 41 53 48 20 29 3b 0a 20 20 20 20 20 20 61  SLASH );.      a
17b30 73 73 65 72 74 28 20 54 4b 5f 4c 53 48 49 46 54  ssert( TK_LSHIFT
17b40 3d 3d 4f 50 5f 53 68 69 66 74 4c 65 66 74 20 29  ==OP_ShiftLeft )
17b50 3b 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70  ;   testcase( op
17b60 3d 3d 54 4b 5f 4c 53 48 49 46 54 20 29 3b 0a 20  ==TK_LSHIFT );. 
17b70 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
17b80 52 53 48 49 46 54 3d 3d 4f 50 5f 53 68 69 66 74  RSHIFT==OP_Shift
17b90 52 69 67 68 74 20 29 3b 20 20 74 65 73 74 63 61  Right );  testca
17ba0 73 65 28 20 6f 70 3d 3d 54 4b 5f 52 53 48 49 46  se( op==TK_RSHIF
17bb0 54 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  T );.      asser
17bc0 74 28 20 54 4b 5f 43 4f 4e 43 41 54 3d 3d 4f 50  t( TK_CONCAT==OP
17bd0 5f 43 6f 6e 63 61 74 20 29 3b 20 20 20 20 20 20  _Concat );      
17be0 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
17bf0 5f 43 4f 4e 43 41 54 20 29 3b 0a 20 20 20 20 20  _CONCAT );.     
17c00 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r1 = sqlite3Exp
17c10 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
17c20 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
17c30 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20  &regFree1);.    
17c40 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78    r2 = sqlite3Ex
17c50 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
17c60 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  e, pExpr->pRight
17c70 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20  , &regFree2);.  
17c80 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
17c90 64 64 4f 70 33 28 76 2c 20 6f 70 2c 20 72 32 2c  ddOp3(v, op, r2,
17ca0 20 72 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20   r1, target);.  
17cb0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
17cc0 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20  gFree1==0 );.   
17cd0 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
17ce0 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20  Free2==0 );.    
17cf0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
17d00 20 20 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55     case TK_UMINU
17d10 53 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72 20  S: {.      Expr 
17d20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e  *pLeft = pExpr->
17d30 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 61 73 73  pLeft;.      ass
17d40 65 72 74 28 20 70 4c 65 66 74 20 29 3b 0a 20 20  ert( pLeft );.  
17d50 20 20 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f      if( pLeft->o
17d60 70 3d 3d 54 4b 5f 49 4e 54 45 47 45 52 20 29 7b  p==TK_INTEGER ){
17d70 0a 20 20 20 20 20 20 20 20 63 6f 64 65 49 6e 74  .        codeInt
17d80 65 67 65 72 28 70 50 61 72 73 65 2c 20 70 4c 65  eger(pParse, pLe
17d90 66 74 2c 20 31 2c 20 74 61 72 67 65 74 29 3b 0a  ft, 1, target);.
17da0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
17db0 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49  MIT_FLOATING_POI
17dc0 4e 54 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  NT.      }else i
17dd0 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b  f( pLeft->op==TK
17de0 5f 46 4c 4f 41 54 20 29 7b 0a 20 20 20 20 20 20  _FLOAT ){.      
17df0 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
17e00 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
17e10 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29  , EP_IntValue) )
17e20 3b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 52 65  ;.        codeRe
17e30 61 6c 28 76 2c 20 70 4c 65 66 74 2d 3e 75 2e 7a  al(v, pLeft->u.z
17e40 54 6f 6b 65 6e 2c 20 31 2c 20 74 61 72 67 65 74  Token, 1, target
17e50 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  );.#endif.      
17e60 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 74  }else{.        t
17e70 65 6d 70 58 2e 6f 70 20 3d 20 54 4b 5f 49 4e 54  empX.op = TK_INT
17e80 45 47 45 52 3b 0a 20 20 20 20 20 20 20 20 74 65  EGER;.        te
17e90 6d 70 58 2e 66 6c 61 67 73 20 3d 20 45 50 5f 49  mpX.flags = EP_I
17ea0 6e 74 56 61 6c 75 65 7c 45 50 5f 54 6f 6b 65 6e  ntValue|EP_Token
17eb0 4f 6e 6c 79 3b 0a 20 20 20 20 20 20 20 20 74 65  Only;.        te
17ec0 6d 70 58 2e 75 2e 69 56 61 6c 75 65 20 3d 20 30  mpX.u.iValue = 0
17ed0 3b 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20 73  ;.        r1 = s
17ee0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
17ef0 6d 70 28 70 50 61 72 73 65 2c 20 26 74 65 6d 70  mp(pParse, &temp
17f00 58 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20  X, &regFree1);. 
17f10 20 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69         r2 = sqli
17f20 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
17f30 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
17f40 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 32 29  Left, &regFree2)
17f50 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
17f60 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
17f70 50 5f 53 75 62 74 72 61 63 74 2c 20 72 32 2c 20  P_Subtract, r2, 
17f80 72 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  r1, target);.   
17f90 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
17fa0 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20  egFree2==0 );.  
17fb0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 6e 52 65      }.      inRe
17fc0 67 20 3d 20 74 61 72 67 65 74 3b 0a 20 20 20 20  g = target;.    
17fd0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
17fe0 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4e 4f     case TK_BITNO
17ff0 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  T:.    case TK_N
18000 4f 54 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  OT: {.      asse
18010 72 74 28 20 54 4b 5f 42 49 54 4e 4f 54 3d 3d 4f  rt( TK_BITNOT==O
18020 50 5f 42 69 74 4e 6f 74 20 29 3b 20 20 20 74 65  P_BitNot );   te
18030 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 42  stcase( op==TK_B
18040 49 54 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20 61  ITNOT );.      a
18050 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54 3d 3d 4f  ssert( TK_NOT==O
18060 50 5f 4e 6f 74 20 29 3b 20 20 20 20 20 20 20 20  P_Not );        
18070 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
18080 4b 5f 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20 72  K_NOT );.      r
18090 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  1 = sqlite3ExprC
180a0 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
180b0 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72  pExpr->pLeft, &r
180c0 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20  egFree1);.      
180d0 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
180e0 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69  e1==0 );.      i
180f0 6e 52 65 67 20 3d 20 74 61 72 67 65 74 3b 0a 20  nReg = target;. 
18100 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
18110 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20 72 31  AddOp2(v, op, r1
18120 2c 20 69 6e 52 65 67 29 3b 0a 20 20 20 20 20 20  , inReg);.      
18130 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
18140 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a   case TK_ISNULL:
18150 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54  .    case TK_NOT
18160 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 69 6e  NULL: {.      in
18170 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20 61 73  t addr;.      as
18180 73 65 72 74 28 20 54 4b 5f 49 53 4e 55 4c 4c 3d  sert( TK_ISNULL=
18190 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 20 20 20  =OP_IsNull );   
181a0 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
181b0 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20  _ISNULL );.     
181c0 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54 4e   assert( TK_NOTN
181d0 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20  ULL==OP_NotNull 
181e0 29 3b 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d  ); testcase( op=
181f0 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 0a 20  =TK_NOTNULL );. 
18200 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
18210 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
18220 65 67 65 72 2c 20 31 2c 20 74 61 72 67 65 74 29  eger, 1, target)
18230 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  ;.      r1 = sql
18240 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
18250 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
18260 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31  pLeft, &regFree1
18270 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
18280 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  e( regFree1==0 )
18290 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73  ;.      addr = s
182a0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
182b0 28 76 2c 20 6f 70 2c 20 72 31 29 3b 0a 20 20 20  (v, op, r1);.   
182c0 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
182d0 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55  f(v, op==TK_ISNU
182e0 4c 4c 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  LL);.      VdbeC
182f0 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d  overageIf(v, op=
18300 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a 20 20  =TK_NOTNULL);.  
18310 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
18320 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
18330 67 65 72 2c 20 30 2c 20 74 61 72 67 65 74 29 3b  ger, 0, target);
18340 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
18350 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
18360 64 72 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  dr);.      break
18370 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
18380 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e   TK_AGG_FUNCTION
18390 3a 20 7b 0a 20 20 20 20 20 20 41 67 67 49 6e 66  : {.      AggInf
183a0 6f 20 2a 70 49 6e 66 6f 20 3d 20 70 45 78 70 72  o *pInfo = pExpr
183b0 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20  ->pAggInfo;.    
183c0 20 20 69 66 28 20 70 49 6e 66 6f 3d 3d 30 20 29    if( pInfo==0 )
183d0 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
183e0 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
183f0 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74  ty(pExpr, EP_Int
18400 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20  Value) );.      
18410 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
18420 67 28 70 50 61 72 73 65 2c 20 22 6d 69 73 75 73  g(pParse, "misus
18430 65 20 6f 66 20 61 67 67 72 65 67 61 74 65 3a 20  e of aggregate: 
18440 25 73 28 29 22 2c 20 70 45 78 70 72 2d 3e 75 2e  %s()", pExpr->u.
18450 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 7d  zToken);.      }
18460 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e  else{.        in
18470 52 65 67 20 3d 20 70 49 6e 66 6f 2d 3e 61 46 75  Reg = pInfo->aFu
18480 6e 63 5b 70 45 78 70 72 2d 3e 69 41 67 67 5d 2e  nc[pExpr->iAgg].
18490 69 4d 65 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  iMem;.      }.  
184a0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
184b0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e  .    case TK_FUN
184c0 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 45  CTION: {.      E
184d0 78 70 72 4c 69 73 74 20 2a 70 46 61 72 67 3b 20  xprList *pFarg; 
184e0 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
184f0 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65   function argume
18500 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  nts */.      int
18510 20 6e 46 61 72 67 3b 20 20 20 20 20 20 20 20 20   nFarg;         
18520 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
18530 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65   function argume
18540 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 46 75 6e  nts */.      Fun
18550 63 44 65 66 20 2a 70 44 65 66 3b 20 20 20 20 20  cDef *pDef;     
18560 20 20 20 20 2f 2a 20 54 68 65 20 66 75 6e 63 74      /* The funct
18570 69 6f 6e 20 64 65 66 69 6e 69 74 69 6f 6e 20 6f  ion definition o
18580 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20 20 20 69  bject */.      i
18590 6e 74 20 6e 49 64 3b 20 20 20 20 20 20 20 20 20  nt nId;         
185a0 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20        /* Length 
185b0 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  of the function 
185c0 6e 61 6d 65 20 69 6e 20 62 79 74 65 73 20 2a 2f  name in bytes */
185d0 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
185e0 72 20 2a 7a 49 64 3b 20 20 20 20 20 20 20 2f 2a  r *zId;       /*
185f0 20 54 68 65 20 66 75 6e 63 74 69 6f 6e 20 6e 61   The function na
18600 6d 65 20 2a 2f 0a 20 20 20 20 20 20 75 33 32 20  me */.      u32 
18610 63 6f 6e 73 74 4d 61 73 6b 20 3d 20 30 3b 20 20  constMask = 0;  
18620 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 66 75     /* Mask of fu
18630 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73  nction arguments
18640 20 74 68 61 74 20 61 72 65 20 63 6f 6e 73 74 61   that are consta
18650 6e 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  nt */.      int 
18660 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
18670 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
18680 65 72 20 2a 2f 0a 20 20 20 20 20 20 75 38 20 65  er */.      u8 e
18690 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 20 20 20  nc = ENC(db);   
186a0 20 20 20 2f 2a 20 54 68 65 20 74 65 78 74 20 65     /* The text e
186b0 6e 63 6f 64 69 6e 67 20 75 73 65 64 20 62 79 20  ncoding used by 
186c0 74 68 69 73 20 64 61 74 61 62 61 73 65 20 2a 2f  this database */
186d0 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  .      CollSeq *
186e0 70 43 6f 6c 6c 20 3d 20 30 3b 20 20 20 20 2f 2a  pColl = 0;    /*
186f0 20 41 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71   A collating seq
18700 75 65 6e 63 65 20 2a 2f 0a 0a 20 20 20 20 20 20  uence */..      
18710 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
18720 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
18730 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b  EP_xIsSelect) );
18740 0a 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48  .      if( ExprH
18750 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
18760 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20  , EP_TokenOnly) 
18770 29 7b 0a 20 20 20 20 20 20 20 20 70 46 61 72 67  ){.        pFarg
18780 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 0;.      }els
18790 65 7b 0a 20 20 20 20 20 20 20 20 70 46 61 72 67  e{.        pFarg
187a0 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73   = pExpr->x.pLis
187b0 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
187c0 20 6e 46 61 72 67 20 3d 20 70 46 61 72 67 20 3f   nFarg = pFarg ?
187d0 20 70 46 61 72 67 2d 3e 6e 45 78 70 72 20 3a 20   pFarg->nExpr : 
187e0 30 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  0;.      assert(
187f0 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
18800 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56  y(pExpr, EP_IntV
18810 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 7a  alue) );.      z
18820 49 64 20 3d 20 70 45 78 70 72 2d 3e 75 2e 7a 54  Id = pExpr->u.zT
18830 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 6e 49 64 20  oken;.      nId 
18840 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
18850 30 28 7a 49 64 29 3b 0a 20 20 20 20 20 20 70 44  0(zId);.      pD
18860 65 66 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ef = sqlite3Find
18870 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 7a 49 64  Function(db, zId
18880 2c 20 6e 49 64 2c 20 6e 46 61 72 67 2c 20 65 6e  , nId, nFarg, en
18890 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  c, 0);.      if(
188a0 20 70 44 65 66 3d 3d 30 20 7c 7c 20 70 44 65 66   pDef==0 || pDef
188b0 2d 3e 78 46 75 6e 63 3d 3d 30 20 29 7b 0a 20 20  ->xFunc==0 ){.  
188c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
188d0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75  orMsg(pParse, "u
188e0 6e 6b 6e 6f 77 6e 20 66 75 6e 63 74 69 6f 6e 3a  nknown function:
188f0 20 25 2e 2a 73 28 29 22 2c 20 6e 49 64 2c 20 7a   %.*s()", nId, z
18900 49 64 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  Id);.        bre
18910 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ak;.      }..   
18920 20 20 20 2f 2a 20 41 74 74 65 6d 70 74 20 61 20     /* Attempt a 
18930 64 69 72 65 63 74 20 69 6d 70 6c 65 6d 65 6e 74  direct implement
18940 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 62 75 69  ation of the bui
18950 6c 74 2d 69 6e 20 43 4f 41 4c 45 53 43 45 28 29  lt-in COALESCE()
18960 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 49 46   and.      ** IF
18970 4e 55 4c 4c 28 29 20 66 75 6e 63 74 69 6f 6e 73  NULL() functions
18980 2e 20 20 54 68 69 73 20 61 76 6f 69 64 73 20 75  .  This avoids u
18990 6e 6e 65 63 65 73 73 61 72 79 20 65 76 61 6c 75  nnecessary evalu
189a0 61 74 69 6f 6e 20 6f 66 0a 20 20 20 20 20 20 2a  ation of.      *
189b0 2a 20 61 72 67 75 6d 65 6e 74 73 20 70 61 73 74  * arguments past
189c0 20 74 68 65 20 66 69 72 73 74 20 6e 6f 6e 2d 4e   the first non-N
189d0 55 4c 4c 20 61 72 67 75 6d 65 6e 74 2e 0a 20 20  ULL argument..  
189e0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
189f0 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73   pDef->funcFlags
18a00 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43   & SQLITE_FUNC_C
18a10 4f 41 4c 45 53 43 45 20 29 7b 0a 20 20 20 20 20  OALESCE ){.     
18a20 20 20 20 69 6e 74 20 65 6e 64 43 6f 61 6c 65 73     int endCoales
18a30 63 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ce = sqlite3Vdbe
18a40 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
18a50 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 46        assert( nF
18a60 61 72 67 3e 3d 32 20 29 3b 0a 20 20 20 20 20 20  arg>=2 );.      
18a70 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
18a80 65 28 70 50 61 72 73 65 2c 20 70 46 61 72 67 2d  e(pParse, pFarg-
18a90 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20 74 61 72  >a[0].pExpr, tar
18aa0 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 66 6f  get);.        fo
18ab0 72 28 69 3d 31 3b 20 69 3c 6e 46 61 72 67 3b 20  r(i=1; i<nFarg; 
18ac0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
18ad0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
18ae0 32 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c  2(v, OP_NotNull,
18af0 20 74 61 72 67 65 74 2c 20 65 6e 64 43 6f 61 6c   target, endCoal
18b00 65 73 63 65 29 3b 0a 20 20 20 20 20 20 20 20 20  esce);.         
18b10 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
18b20 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
18b30 74 65 33 45 78 70 72 43 61 63 68 65 52 65 6d 6f  te3ExprCacheRemo
18b40 76 65 28 70 50 61 72 73 65 2c 20 74 61 72 67 65  ve(pParse, targe
18b50 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20  t, 1);.         
18b60 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
18b70 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20  ePush(pParse);. 
18b80 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
18b90 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
18ba0 20 70 46 61 72 67 2d 3e 61 5b 69 5d 2e 70 45 78   pFarg->a[i].pEx
18bb0 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  pr, target);.   
18bc0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
18bd0 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73  prCachePop(pPars
18be0 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  e);.        }.  
18bf0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
18c00 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
18c10 20 65 6e 64 43 6f 61 6c 65 73 63 65 29 3b 0a 20   endCoalesce);. 
18c20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
18c30 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
18c40 54 68 65 20 55 4e 4c 49 4b 45 4c 59 28 29 20 66  The UNLIKELY() f
18c50 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
18c60 6f 70 2e 20 20 54 68 65 20 72 65 73 75 6c 74 20  op.  The result 
18c70 69 73 20 74 68 65 20 76 61 6c 75 65 0a 20 20 20  is the value.   
18c80 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69 72     ** of the fir
18c90 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a 20 20 20  st argument..   
18ca0 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
18cb0 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20  pDef->funcFlags 
18cc0 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 55 4e  & SQLITE_FUNC_UN
18cd0 4c 49 4b 45 4c 59 20 29 7b 0a 20 20 20 20 20 20  LIKELY ){.      
18ce0 20 20 61 73 73 65 72 74 28 20 6e 46 61 72 67 3e    assert( nFarg>
18cf0 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 69 6e  =1 );.        in
18d00 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Reg = sqlite3Exp
18d10 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72  rCodeTarget(pPar
18d20 73 65 2c 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e  se, pFarg->a[0].
18d30 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a  pExpr, target);.
18d40 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
18d50 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 66 6f       }..      fo
18d60 72 28 69 3d 30 3b 20 69 3c 6e 46 61 72 67 3b 20  r(i=0; i<nFarg; 
18d70 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  i++){.        if
18d80 28 20 69 3c 33 32 20 26 26 20 73 71 6c 69 74 65  ( i<32 && sqlite
18d90 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28  3ExprIsConstant(
18da0 70 46 61 72 67 2d 3e 61 5b 69 5d 2e 70 45 78 70  pFarg->a[i].pExp
18db0 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  r) ){.          
18dc0 74 65 73 74 63 61 73 65 28 20 69 3d 3d 33 31 20  testcase( i==31 
18dd0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e  );.          con
18de0 73 74 4d 61 73 6b 20 7c 3d 20 4d 41 53 4b 42 49  stMask |= MASKBI
18df0 54 33 32 28 69 29 3b 0a 20 20 20 20 20 20 20 20  T32(i);.        
18e00 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70  }.        if( (p
18e10 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26  Def->funcFlags &
18e20 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45   SQLITE_FUNC_NEE
18e30 44 43 4f 4c 4c 29 21 3d 30 20 26 26 20 21 70 43  DCOLL)!=0 && !pC
18e40 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20  oll ){.         
18e50 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
18e60 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
18e70 73 65 2c 20 70 46 61 72 67 2d 3e 61 5b 69 5d 2e  se, pFarg->a[i].
18e80 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
18e90 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
18ea0 69 66 28 20 70 46 61 72 67 20 29 7b 0a 20 20 20  if( pFarg ){.   
18eb0 20 20 20 20 20 69 66 28 20 63 6f 6e 73 74 4d 61       if( constMa
18ec0 73 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  sk ){.          
18ed0 72 31 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  r1 = pParse->nMe
18ee0 6d 2b 31 3b 0a 20 20 20 20 20 20 20 20 20 20 70  m+1;.          p
18ef0 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e  Parse->nMem += n
18f00 46 61 72 67 3b 0a 20 20 20 20 20 20 20 20 7d 65  Farg;.        }e
18f10 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72  lse{.          r
18f20 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
18f30 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
18f40 6e 46 61 72 67 29 3b 0a 20 20 20 20 20 20 20 20  nFarg);.        
18f50 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 6f  }..        /* Fo
18f60 72 20 6c 65 6e 67 74 68 28 29 20 61 6e 64 20 74  r length() and t
18f70 79 70 65 6f 66 28 29 20 66 75 6e 63 74 69 6f 6e  ypeof() function
18f80 73 20 77 69 74 68 20 61 20 63 6f 6c 75 6d 6e 20  s with a column 
18f90 61 72 67 75 6d 65 6e 74 2c 0a 20 20 20 20 20 20  argument,.      
18fa0 20 20 2a 2a 20 73 65 74 20 74 68 65 20 50 35 20    ** set the P5 
18fb0 70 61 72 61 6d 65 74 65 72 20 74 6f 20 74 68 65  parameter to the
18fc0 20 4f 50 5f 43 6f 6c 75 6d 6e 20 6f 70 63 6f 64   OP_Column opcod
18fd0 65 20 74 6f 20 4f 50 46 4c 41 47 5f 4c 45 4e 47  e to OPFLAG_LENG
18fe0 54 48 41 52 47 0a 20 20 20 20 20 20 20 20 2a 2a  THARG.        **
18ff0 20 6f 72 20 4f 50 46 4c 41 47 5f 54 59 50 45 4f   or OPFLAG_TYPEO
19000 46 41 52 47 20 72 65 73 70 65 63 74 69 76 65 6c  FARG respectivel
19010 79 2c 20 74 6f 20 61 76 6f 69 64 20 75 6e 6e 65  y, to avoid unne
19020 63 65 73 73 61 72 79 20 64 61 74 61 0a 20 20 20  cessary data.   
19030 20 20 20 20 20 2a 2a 20 6c 6f 61 64 69 6e 67 2e       ** loading.
19040 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
19050 20 20 20 20 69 66 28 20 28 70 44 65 66 2d 3e 66      if( (pDef->f
19060 75 6e 63 46 6c 61 67 73 20 26 20 28 53 51 4c 49  uncFlags & (SQLI
19070 54 45 5f 46 55 4e 43 5f 4c 45 4e 47 54 48 7c 53  TE_FUNC_LENGTH|S
19080 51 4c 49 54 45 5f 46 55 4e 43 5f 54 59 50 45 4f  QLITE_FUNC_TYPEO
19090 46 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  F))!=0 ){.      
190a0 20 20 20 20 75 38 20 65 78 70 72 4f 70 3b 0a 20      u8 exprOp;. 
190b0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
190c0 20 6e 46 61 72 67 3d 3d 31 20 29 3b 0a 20 20 20   nFarg==1 );.   
190d0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
190e0 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  Farg->a[0].pExpr
190f0 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  !=0 );.         
19100 20 65 78 70 72 4f 70 20 3d 20 70 46 61 72 67 2d   exprOp = pFarg-
19110 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 3b  >a[0].pExpr->op;
19120 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 65  .          if( e
19130 78 70 72 4f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  xprOp==TK_COLUMN
19140 20 7c 7c 20 65 78 70 72 4f 70 3d 3d 54 4b 5f 41   || exprOp==TK_A
19150 47 47 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20  GG_COLUMN ){.   
19160 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
19170 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4c 45 4e   SQLITE_FUNC_LEN
19180 47 54 48 3d 3d 4f 50 46 4c 41 47 5f 4c 45 4e 47  GTH==OPFLAG_LENG
19190 54 48 41 52 47 20 29 3b 0a 20 20 20 20 20 20 20  THARG );.       
191a0 20 20 20 20 20 61 73 73 65 72 74 28 20 53 51 4c       assert( SQL
191b0 49 54 45 5f 46 55 4e 43 5f 54 59 50 45 4f 46 3d  ITE_FUNC_TYPEOF=
191c0 3d 4f 50 46 4c 41 47 5f 54 59 50 45 4f 46 41 52  =OPFLAG_TYPEOFAR
191d0 47 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  G );.           
191e0 20 74 65 73 74 63 61 73 65 28 20 70 44 65 66 2d   testcase( pDef-
191f0 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 4f 50 46  >funcFlags & OPF
19200 4c 41 47 5f 4c 45 4e 47 54 48 41 52 47 20 29 3b  LAG_LENGTHARG );
19210 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 46 61  .            pFa
19220 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e  rg->a[0].pExpr->
19230 6f 70 32 20 3d 20 0a 20 20 20 20 20 20 20 20 20  op2 = .         
19240 20 20 20 20 20 20 20 20 20 70 44 65 66 2d 3e 66           pDef->f
19250 75 6e 63 46 6c 61 67 73 20 26 20 28 4f 50 46 4c  uncFlags & (OPFL
19260 41 47 5f 4c 45 4e 47 54 48 41 52 47 7c 4f 50 46  AG_LENGTHARG|OPF
19270 4c 41 47 5f 54 59 50 45 4f 46 41 52 47 29 3b 0a  LAG_TYPEOFARG);.
19280 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
19290 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 73      }..        s
192a0 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
192b0 75 73 68 28 70 50 61 72 73 65 29 3b 20 20 20 20  ush(pParse);    
192c0 20 2f 2a 20 54 69 63 6b 65 74 20 32 65 61 32 34   /* Ticket 2ea24
192d0 32 35 64 33 34 62 65 20 2a 2f 0a 20 20 20 20 20  25d34be */.     
192e0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
192f0 64 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  deExprList(pPars
19300 65 2c 20 70 46 61 72 67 2c 20 72 31 2c 20 30 2c  e, pFarg, r1, 0,
19310 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
19320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19330 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50   SQLITE_ECEL_DUP
19340 7c 53 51 4c 49 54 45 5f 45 43 45 4c 5f 46 41 43  |SQLITE_ECEL_FAC
19350 54 4f 52 29 3b 0a 20 20 20 20 20 20 20 20 73 71  TOR);.        sq
19360 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f  lite3ExprCachePo
19370 70 28 70 50 61 72 73 65 29 3b 20 20 20 20 20 20  p(pParse);      
19380 2f 2a 20 54 69 63 6b 65 74 20 32 65 61 32 34 32  /* Ticket 2ea242
19390 35 64 33 34 62 65 20 2a 2f 0a 20 20 20 20 20 20  5d34be */.      
193a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
193b0 31 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23  1 = 0;.      }.#
193c0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
193d0 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
193e0 20 20 20 20 20 20 2f 2a 20 50 6f 73 73 69 62 6c        /* Possibl
193f0 79 20 6f 76 65 72 6c 6f 61 64 20 74 68 65 20 66  y overload the f
19400 75 6e 63 74 69 6f 6e 20 69 66 20 74 68 65 20 66  unction if the f
19410 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73  irst argument is
19420 0a 20 20 20 20 20 20 2a 2a 20 61 20 76 69 72 74  .      ** a virt
19430 75 61 6c 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e  ual table column
19440 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
19450 20 2a 2a 20 46 6f 72 20 69 6e 66 69 78 20 66 75   ** For infix fu
19460 6e 63 74 69 6f 6e 73 20 28 4c 49 4b 45 2c 20 47  nctions (LIKE, G
19470 4c 4f 42 2c 20 52 45 47 45 58 50 2c 20 61 6e 64  LOB, REGEXP, and
19480 20 4d 41 54 43 48 29 20 75 73 65 20 74 68 65 0a   MATCH) use the.
19490 20 20 20 20 20 20 2a 2a 20 73 65 63 6f 6e 64 20        ** second 
194a0 61 72 67 75 6d 65 6e 74 2c 20 6e 6f 74 20 74 68  argument, not th
194b0 65 20 66 69 72 73 74 2c 20 61 73 20 74 68 65 20  e first, as the 
194c0 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 65 73 74  argument to test
194d0 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 73 65 65   to.      ** see
194e0 20 69 66 20 69 74 20 69 73 20 61 20 63 6f 6c 75   if it is a colu
194f0 6d 6e 20 69 6e 20 61 20 76 69 72 74 75 61 6c 20  mn in a virtual 
19500 74 61 62 6c 65 2e 20 20 54 68 69 73 20 69 73 20  table.  This is 
19510 64 6f 6e 65 20 62 65 63 61 75 73 65 0a 20 20 20  done because.   
19520 20 20 20 2a 2a 20 74 68 65 20 6c 65 66 74 20 6f     ** the left o
19530 70 65 72 61 6e 64 20 6f 66 20 69 6e 66 69 78 20  perand of infix 
19540 66 75 6e 63 74 69 6f 6e 73 20 28 74 68 65 20 6f  functions (the o
19550 70 65 72 61 6e 64 20 77 65 20 77 61 6e 74 20 74  perand we want t
19560 6f 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 72  o.      ** contr
19570 6f 6c 20 6f 76 65 72 6c 6f 61 64 69 6e 67 29 20  ol overloading) 
19580 65 6e 64 73 20 75 70 20 61 73 20 74 68 65 20 73  ends up as the s
19590 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74  econd argument t
195a0 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 66  o the.      ** f
195b0 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 65 78  unction.  The ex
195c0 70 72 65 73 73 69 6f 6e 20 22 41 20 67 6c 6f 62  pression "A glob
195d0 20 42 22 20 69 73 20 65 71 75 69 76 61 6c 65 6e   B" is equivalen
195e0 74 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 22  t to .      ** "
195f0 67 6c 6f 62 28 42 2c 41 29 2e 20 20 57 65 20 77  glob(B,A).  We w
19600 61 6e 74 20 74 6f 20 75 73 65 20 74 68 65 20 41  ant to use the A
19610 20 69 6e 20 22 41 20 67 6c 6f 62 20 42 22 20 74   in "A glob B" t
19620 6f 20 74 65 73 74 0a 20 20 20 20 20 20 2a 2a 20  o test.      ** 
19630 66 6f 72 20 66 75 6e 63 74 69 6f 6e 20 6f 76 65  for function ove
19640 72 6c 6f 61 64 69 6e 67 2e 20 20 42 75 74 20 77  rloading.  But w
19650 65 20 75 73 65 20 74 68 65 20 42 20 74 65 72 6d  e use the B term
19660 20 69 6e 20 22 67 6c 6f 62 28 42 2c 41 29 22 2e   in "glob(B,A)".
19670 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
19680 69 66 28 20 6e 46 61 72 67 3e 3d 32 20 26 26 20  if( nFarg>=2 && 
19690 28 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20  (pExpr->flags & 
196a0 45 50 5f 49 6e 66 69 78 46 75 6e 63 29 20 29 7b  EP_InfixFunc) ){
196b0 0a 20 20 20 20 20 20 20 20 70 44 65 66 20 3d 20  .        pDef = 
196c0 73 71 6c 69 74 65 33 56 74 61 62 4f 76 65 72 6c  sqlite3VtabOverl
196d0 6f 61 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20  oadFunction(db, 
196e0 70 44 65 66 2c 20 6e 46 61 72 67 2c 20 70 46 61  pDef, nFarg, pFa
196f0 72 67 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 29 3b  rg->a[1].pExpr);
19700 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
19710 20 6e 46 61 72 67 3e 30 20 29 7b 0a 20 20 20 20   nFarg>0 ){.    
19720 20 20 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74      pDef = sqlit
19730 65 33 56 74 61 62 4f 76 65 72 6c 6f 61 64 46 75  e3VtabOverloadFu
19740 6e 63 74 69 6f 6e 28 64 62 2c 20 70 44 65 66 2c  nction(db, pDef,
19750 20 6e 46 61 72 67 2c 20 70 46 61 72 67 2d 3e 61   nFarg, pFarg->a
19760 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [0].pExpr);.    
19770 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
19780 20 69 66 28 20 70 44 65 66 2d 3e 66 75 6e 63 46   if( pDef->funcF
19790 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55  lags & SQLITE_FU
197a0 4e 43 5f 4e 45 45 44 43 4f 4c 4c 20 29 7b 0a 20  NC_NEEDCOLL ){. 
197b0 20 20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c         if( !pCol
197c0 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e  l ) pColl = db->
197d0 70 44 66 6c 74 43 6f 6c 6c 3b 20 0a 20 20 20 20  pDfltColl; .    
197e0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
197f0 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6c 6c  ddOp4(v, OP_Coll
19800 53 65 71 2c 20 30 2c 20 30 2c 20 30 2c 20 28 63  Seq, 0, 0, 0, (c
19810 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f  har *)pColl, P4_
19820 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 20 20  COLLSEQ);.      
19830 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
19840 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
19850 46 75 6e 63 74 69 6f 6e 30 2c 20 63 6f 6e 73 74  Function0, const
19860 4d 61 73 6b 2c 20 72 31 2c 20 74 61 72 67 65 74  Mask, r1, target
19870 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
19880 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
19890 29 70 44 65 66 2c 20 50 34 5f 46 55 4e 43 44 45  )pDef, P4_FUNCDE
198a0 46 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  F);.      sqlite
198b0 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
198c0 20 28 75 38 29 6e 46 61 72 67 29 3b 0a 20 20 20   (u8)nFarg);.   
198d0 20 20 20 69 66 28 20 6e 46 61 72 67 20 26 26 20     if( nFarg && 
198e0 63 6f 6e 73 74 4d 61 73 6b 3d 3d 30 20 29 7b 0a  constMask==0 ){.
198f0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
19900 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28  eleaseTempRange(
19910 70 50 61 72 73 65 2c 20 72 31 2c 20 6e 46 61 72  pParse, r1, nFar
19920 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  g);.      }.    
19930 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
19940 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
19950 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20  IT_SUBQUERY.    
19960 63 61 73 65 20 54 4b 5f 45 58 49 53 54 53 3a 0a  case TK_EXISTS:.
19970 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45      case TK_SELE
19980 43 54 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74  CT: {.      test
19990 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 45 58 49  case( op==TK_EXI
199a0 53 54 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73  STS );.      tes
199b0 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 53 45  tcase( op==TK_SE
199c0 4c 45 43 54 20 29 3b 0a 20 20 20 20 20 20 69 6e  LECT );.      in
199d0 52 65 67 20 3d 20 73 71 6c 69 74 65 33 43 6f 64  Reg = sqlite3Cod
199e0 65 53 75 62 73 65 6c 65 63 74 28 70 50 61 72 73  eSubselect(pPars
199f0 65 2c 20 70 45 78 70 72 2c 20 30 2c 20 30 29 3b  e, pExpr, 0, 0);
19a00 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
19a10 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
19a20 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  IN: {.      int 
19a30 64 65 73 74 49 66 46 61 6c 73 65 20 3d 20 73 71  destIfFalse = sq
19a40 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
19a50 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 6e 74  el(v);.      int
19a60 20 64 65 73 74 49 66 4e 75 6c 6c 20 3d 20 73 71   destIfNull = sq
19a70 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
19a80 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c  el(v);.      sql
19a90 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
19aa0 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61  , OP_Null, 0, ta
19ab0 72 67 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  rget);.      sql
19ac0 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e 28 70  ite3ExprCodeIN(p
19ad0 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64 65  Parse, pExpr, de
19ae0 73 74 49 66 46 61 6c 73 65 2c 20 64 65 73 74 49  stIfFalse, destI
19af0 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71  fNull);.      sq
19b00 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
19b10 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31  v, OP_Integer, 1
19b20 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
19b30 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
19b40 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 65 73 74  lveLabel(v, dest
19b50 49 66 46 61 6c 73 65 29 3b 0a 20 20 20 20 20 20  IfFalse);.      
19b60 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
19b70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20  2(v, OP_AddImm, 
19b80 74 61 72 67 65 74 2c 20 30 29 3b 0a 20 20 20 20  target, 0);.    
19b90 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
19ba0 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 65 73  olveLabel(v, des
19bb0 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  tIfNull);.      
19bc0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
19bd0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
19be0 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a  IT_SUBQUERY */..
19bf0 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20  .    /*.    **  
19c00 20 20 78 20 42 45 54 57 45 45 4e 20 79 20 41 4e    x BETWEEN y AN
19c10 44 20 7a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  D z.    **.    *
19c20 2a 20 54 68 69 73 20 69 73 20 65 71 75 69 76 61  * This is equiva
19c30 6c 65 6e 74 20 74 6f 0a 20 20 20 20 2a 2a 0a 20  lent to.    **. 
19c40 20 20 20 2a 2a 20 20 20 20 78 3e 3d 79 20 41 4e     **    x>=y AN
19c50 44 20 78 3c 3d 7a 0a 20 20 20 20 2a 2a 0a 20 20  D x<=z.    **.  
19c60 20 20 2a 2a 20 58 20 69 73 20 73 74 6f 72 65 64    ** X is stored
19c70 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 65 66 74   in pExpr->pLeft
19c80 2e 0a 20 20 20 20 2a 2a 20 59 20 69 73 20 73 74  ..    ** Y is st
19c90 6f 72 65 64 20 69 6e 20 70 45 78 70 72 2d 3e 70  ored in pExpr->p
19ca0 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
19cb0 2e 0a 20 20 20 20 2a 2a 20 5a 20 69 73 20 73 74  ..    ** Z is st
19cc0 6f 72 65 64 20 69 6e 20 70 45 78 70 72 2d 3e 70  ored in pExpr->p
19cd0 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72  List->a[1].pExpr
19ce0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
19cf0 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a  e TK_BETWEEN: {.
19d00 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66        Expr *pLef
19d10 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  t = pExpr->pLeft
19d20 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45  ;.      struct E
19d30 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4c  xprList_item *pL
19d40 49 74 65 6d 20 3d 20 70 45 78 70 72 2d 3e 78 2e  Item = pExpr->x.
19d50 70 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20  pList->a;.      
19d60 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70  Expr *pRight = p
19d70 4c 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 0a 20  LItem->pExpr;.. 
19d80 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
19d90 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
19da0 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 26 72 65  arse, pLeft, &re
19db0 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 72  gFree1);.      r
19dc0 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  2 = sqlite3ExprC
19dd0 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
19de0 70 52 69 67 68 74 2c 20 26 72 65 67 46 72 65 65  pRight, &regFree
19df0 32 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  2);.      testca
19e00 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20  se( regFree1==0 
19e10 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
19e20 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29  e( regFree2==0 )
19e30 3b 0a 20 20 20 20 20 20 72 33 20 3d 20 73 71 6c  ;.      r3 = sql
19e40 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
19e50 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 72 34  Parse);.      r4
19e60 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
19e70 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
19e80 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28      codeCompare(
19e90 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 70  pParse, pLeft, p
19ea0 52 69 67 68 74 2c 20 4f 50 5f 47 65 2c 0a 20 20  Right, OP_Ge,.  
19eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19ec0 72 31 2c 20 72 32 2c 20 72 33 2c 20 53 51 4c 49  r1, r2, r3, SQLI
19ed0 54 45 5f 53 54 4f 52 45 50 32 29 3b 20 20 56 64  TE_STOREP2);  Vd
19ee0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
19ef0 20 20 20 20 20 70 4c 49 74 65 6d 2b 2b 3b 0a 20       pLItem++;. 
19f00 20 20 20 20 20 70 52 69 67 68 74 20 3d 20 70 4c       pRight = pL
19f10 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Item->pExpr;.   
19f20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
19f30 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
19f40 20 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20   regFree2);.    
19f50 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78    r2 = sqlite3Ex
19f60 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
19f70 65 2c 20 70 52 69 67 68 74 2c 20 26 72 65 67 46  e, pRight, &regF
19f80 72 65 65 32 29 3b 0a 20 20 20 20 20 20 74 65 73  ree2);.      tes
19f90 74 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d  tcase( regFree2=
19fa0 3d 30 20 29 3b 0a 20 20 20 20 20 20 63 6f 64 65  =0 );.      code
19fb0 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20  Compare(pParse, 
19fc0 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20 4f  pLeft, pRight, O
19fd0 50 5f 4c 65 2c 20 72 31 2c 20 72 32 2c 20 72 34  P_Le, r1, r2, r4
19fe0 2c 20 53 51 4c 49 54 45 5f 53 54 4f 52 45 50 32  , SQLITE_STOREP2
19ff0 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
1a000 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
1a010 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1a020 33 28 76 2c 20 4f 50 5f 41 6e 64 2c 20 72 33 2c  3(v, OP_And, r3,
1a030 20 72 34 2c 20 74 61 72 67 65 74 29 3b 0a 20 20   r4, target);.  
1a040 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
1a050 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
1a060 2c 20 72 33 29 3b 0a 20 20 20 20 20 20 73 71 6c  , r3);.      sql
1a070 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
1a080 65 67 28 70 50 61 72 73 65 2c 20 72 34 29 3b 0a  eg(pParse, r4);.
1a090 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1a0a0 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43   }.    case TK_C
1a0b0 4f 4c 4c 41 54 45 3a 20 0a 20 20 20 20 63 61 73  OLLATE: .    cas
1a0c0 65 20 54 4b 5f 55 50 4c 55 53 3a 20 7b 0a 20 20  e TK_UPLUS: {.  
1a0d0 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69      inReg = sqli
1a0e0 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65  te3ExprCodeTarge
1a0f0 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  t(pParse, pExpr-
1a100 3e 70 4c 65 66 74 2c 20 74 61 72 67 65 74 29 3b  >pLeft, target);
1a110 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1a120 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 54 4b    }..    case TK
1a130 5f 54 52 49 47 47 45 52 3a 20 7b 0a 20 20 20 20  _TRIGGER: {.    
1a140 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 70 63 6f    /* If the opco
1a150 64 65 20 69 73 20 54 4b 5f 54 52 49 47 47 45 52  de is TK_TRIGGER
1a160 2c 20 74 68 65 6e 20 74 68 65 20 65 78 70 72 65  , then the expre
1a170 73 73 69 6f 6e 20 69 73 20 61 20 72 65 66 65 72  ssion is a refer
1a180 65 6e 63 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f  ence.      ** to
1a190 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65   a column in the
1a1a0 20 6e 65 77 2e 2a 20 6f 72 20 6f 6c 64 2e 2a 20   new.* or old.* 
1a1b0 70 73 65 75 64 6f 2d 74 61 62 6c 65 73 20 61 76  pseudo-tables av
1a1c0 61 69 6c 61 62 6c 65 20 74 6f 0a 20 20 20 20 20  ailable to.     
1a1d0 20 2a 2a 20 74 72 69 67 67 65 72 20 70 72 6f 67   ** trigger prog
1a1e0 72 61 6d 73 2e 20 49 6e 20 74 68 69 73 20 63 61  rams. In this ca
1a1f0 73 65 20 45 78 70 72 2e 69 54 61 62 6c 65 20 69  se Expr.iTable i
1a200 73 20 73 65 74 20 74 6f 20 31 20 66 6f 72 20 74  s set to 1 for t
1a210 68 65 0a 20 20 20 20 20 20 2a 2a 20 6e 65 77 2e  he.      ** new.
1a220 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2c 20  * pseudo-table, 
1a230 6f 72 20 30 20 66 6f 72 20 74 68 65 20 6f 6c 64  or 0 for the old
1a240 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2e  .* pseudo-table.
1a250 20 45 78 70 72 2e 69 43 6f 6c 75 6d 6e 0a 20 20   Expr.iColumn.  
1a260 20 20 20 20 2a 2a 20 69 73 20 73 65 74 20 74 6f      ** is set to
1a270 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74   the column of t
1a280 68 65 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 20  he pseudo-table 
1a290 74 6f 20 72 65 61 64 2c 20 6f 72 20 74 6f 20 2d  to read, or to -
1a2a0 31 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 72 65  1 to.      ** re
1a2b0 61 64 20 74 68 65 20 72 6f 77 69 64 20 66 69 65  ad the rowid fie
1a2c0 6c 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  ld..      **.   
1a2d0 20 20 20 2a 2a 20 54 68 65 20 65 78 70 72 65 73     ** The expres
1a2e0 73 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e  sion is implemen
1a2f0 74 65 64 20 75 73 69 6e 67 20 61 6e 20 4f 50 5f  ted using an OP_
1a300 50 61 72 61 6d 20 6f 70 63 6f 64 65 2e 20 54 68  Param opcode. Th
1a310 65 20 70 31 0a 20 20 20 20 20 20 2a 2a 20 70 61  e p1.      ** pa
1a320 72 61 6d 65 74 65 72 20 69 73 20 73 65 74 20 74  rameter is set t
1a330 6f 20 30 20 66 6f 72 20 61 6e 20 6f 6c 64 2e 72  o 0 for an old.r
1a340 6f 77 69 64 20 72 65 66 65 72 65 6e 63 65 2c 20  owid reference, 
1a350 6f 72 20 74 6f 20 28 69 2b 31 29 0a 20 20 20 20  or to (i+1).    
1a360 20 20 2a 2a 20 74 6f 20 72 65 66 65 72 65 6e 63    ** to referenc
1a370 65 20 61 6e 6f 74 68 65 72 20 63 6f 6c 75 6d 6e  e another column
1a380 20 6f 66 20 74 68 65 20 6f 6c 64 2e 2a 20 70 73   of the old.* ps
1a390 65 75 64 6f 2d 74 61 62 6c 65 2c 20 77 68 65 72  eudo-table, wher
1a3a0 65 20 0a 20 20 20 20 20 20 2a 2a 20 69 20 69 73  e .      ** i is
1a3b0 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   the index of th
1a3c0 65 20 63 6f 6c 75 6d 6e 2e 20 46 6f 72 20 61 20  e column. For a 
1a3d0 6e 65 77 2e 72 6f 77 69 64 20 72 65 66 65 72 65  new.rowid refere
1a3e0 6e 63 65 2c 20 70 31 20 69 73 0a 20 20 20 20 20  nce, p1 is.     
1a3f0 20 2a 2a 20 73 65 74 20 74 6f 20 28 6e 2b 31 29   ** set to (n+1)
1a400 2c 20 77 68 65 72 65 20 6e 20 69 73 20 74 68 65  , where n is the
1a410 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   number of colum
1a420 6e 73 20 69 6e 20 65 61 63 68 20 70 73 65 75 64  ns in each pseud
1a430 6f 2d 74 61 62 6c 65 2e 0a 20 20 20 20 20 20 2a  o-table..      *
1a440 2a 20 46 6f 72 20 61 20 72 65 66 65 72 65 6e 63  * For a referenc
1a450 65 20 74 6f 20 61 6e 79 20 6f 74 68 65 72 20 63  e to any other c
1a460 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 6e 65 77  olumn in the new
1a470 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2c  .* pseudo-table,
1a480 20 70 31 0a 20 20 20 20 20 20 2a 2a 20 69 73 20   p1.      ** is 
1a490 73 65 74 20 74 6f 20 28 6e 2b 32 2b 69 29 2c 20  set to (n+2+i), 
1a4a0 77 68 65 72 65 20 6e 20 61 6e 64 20 69 20 61 72  where n and i ar
1a4b0 65 20 61 73 20 64 65 66 69 6e 65 64 20 70 72 65  e as defined pre
1a4c0 76 69 6f 75 73 6c 79 2e 20 46 6f 72 0a 20 20 20  viously. For.   
1a4d0 20 20 20 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 69     ** example, i
1a4e0 66 20 74 68 65 20 74 61 62 6c 65 20 6f 6e 20 77  f the table on w
1a4f0 68 69 63 68 20 74 72 69 67 67 65 72 73 20 61 72  hich triggers ar
1a500 65 20 62 65 69 6e 67 20 66 69 72 65 64 20 69 73  e being fired is
1a510 0a 20 20 20 20 20 20 2a 2a 20 64 65 63 6c 61 72  .      ** declar
1a520 65 64 20 61 73 3a 0a 20 20 20 20 20 20 2a 2a 0a  ed as:.      **.
1a530 20 20 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54        **   CREAT
1a540 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29  E TABLE t1(a, b)
1a550 3b 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ;.      **.     
1a560 20 2a 2a 20 54 68 65 6e 20 70 31 20 69 73 20 69   ** Then p1 is i
1a570 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 66 6f  nterpreted as fo
1a580 6c 6c 6f 77 73 3a 0a 20 20 20 20 20 20 2a 2a 0a  llows:.      **.
1a590 20 20 20 20 20 20 2a 2a 20 20 20 70 31 3d 3d 30        **   p1==0
1a5a0 20 20 20 2d 3e 20 20 20 20 6f 6c 64 2e 72 6f 77     ->    old.row
1a5b0 69 64 20 20 20 20 20 70 31 3d 3d 33 20 20 20 2d  id     p1==3   -
1a5c0 3e 20 20 20 20 6e 65 77 2e 72 6f 77 69 64 0a 20  >    new.rowid. 
1a5d0 20 20 20 20 20 2a 2a 20 20 20 70 31 3d 3d 31 20       **   p1==1 
1a5e0 20 20 2d 3e 20 20 20 20 6f 6c 64 2e 61 20 20 20    ->    old.a   
1a5f0 20 20 20 20 20 20 70 31 3d 3d 34 20 20 20 2d 3e        p1==4   ->
1a600 20 20 20 20 6e 65 77 2e 61 0a 20 20 20 20 20 20      new.a.      
1a610 2a 2a 20 20 20 70 31 3d 3d 32 20 20 20 2d 3e 20  **   p1==2   -> 
1a620 20 20 20 6f 6c 64 2e 62 20 20 20 20 20 20 20 20     old.b        
1a630 20 70 31 3d 3d 35 20 20 20 2d 3e 20 20 20 20 6e   p1==5   ->    n
1a640 65 77 2e 62 20 20 20 20 20 20 20 0a 20 20 20 20  ew.b       .    
1a650 20 20 2a 2f 0a 20 20 20 20 20 20 54 61 62 6c 65    */.      Table
1a660 20 2a 70 54 61 62 20 3d 20 70 45 78 70 72 2d 3e   *pTab = pExpr->
1a670 70 54 61 62 3b 0a 20 20 20 20 20 20 69 6e 74 20  pTab;.      int 
1a680 70 31 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62  p1 = pExpr->iTab
1a690 6c 65 20 2a 20 28 70 54 61 62 2d 3e 6e 43 6f 6c  le * (pTab->nCol
1a6a0 2b 31 29 20 2b 20 31 20 2b 20 70 45 78 70 72 2d  +1) + 1 + pExpr-
1a6b0 3e 69 43 6f 6c 75 6d 6e 3b 0a 0a 20 20 20 20 20  >iColumn;..     
1a6c0 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
1a6d0 69 54 61 62 6c 65 3d 3d 30 20 7c 7c 20 70 45 78  iTable==0 || pEx
1a6e0 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 31 20 29 3b  pr->iTable==1 );
1a6f0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1a700 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 2d  Expr->iColumn>=-
1a710 31 20 26 26 20 70 45 78 70 72 2d 3e 69 43 6f 6c  1 && pExpr->iCol
1a720 75 6d 6e 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29  umn<pTab->nCol )
1a730 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1a740 70 54 61 62 2d 3e 69 50 4b 65 79 3c 30 20 7c 7c  pTab->iPKey<0 ||
1a750 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 21   pExpr->iColumn!
1a760 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20 29 3b 0a  =pTab->iPKey );.
1a770 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 31        assert( p1
1a780 3e 3d 30 20 26 26 20 70 31 3c 28 70 54 61 62 2d  >=0 && p1<(pTab-
1a790 3e 6e 43 6f 6c 2a 32 2b 32 29 20 29 3b 0a 0a 20  >nCol*2+2) );.. 
1a7a0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1a7b0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 50 61 72  AddOp2(v, OP_Par
1a7c0 61 6d 2c 20 70 31 2c 20 74 61 72 67 65 74 29 3b  am, p1, target);
1a7d0 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
1a7e0 6e 74 28 28 76 2c 20 22 25 73 2e 25 73 20 2d 3e  nt((v, "%s.%s ->
1a7f0 20 24 25 64 22 2c 0a 20 20 20 20 20 20 20 20 28   $%d",.        (
1a800 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3f 20  pExpr->iTable ? 
1a810 22 6e 65 77 22 20 3a 20 22 6f 6c 64 22 29 2c 0a  "new" : "old"),.
1a820 20 20 20 20 20 20 20 20 28 70 45 78 70 72 2d 3e          (pExpr->
1a830 69 43 6f 6c 75 6d 6e 3c 30 20 3f 20 22 72 6f 77  iColumn<0 ? "row
1a840 69 64 22 20 3a 20 70 45 78 70 72 2d 3e 70 54 61  id" : pExpr->pTa
1a850 62 2d 3e 61 43 6f 6c 5b 70 45 78 70 72 2d 3e 69  b->aCol[pExpr->i
1a860 43 6f 6c 75 6d 6e 5d 2e 7a 4e 61 6d 65 29 2c 0a  Column].zName),.
1a870 20 20 20 20 20 20 20 20 74 61 72 67 65 74 0a 20          target. 
1a880 20 20 20 20 20 29 29 3b 0a 0a 23 69 66 6e 64 65       ));..#ifnde
1a890 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c  f SQLITE_OMIT_FL
1a8a0 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20  OATING_POINT.   
1a8b0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c     /* If the col
1a8c0 75 6d 6e 20 68 61 73 20 52 45 41 4c 20 61 66 66  umn has REAL aff
1a8d0 69 6e 69 74 79 2c 20 69 74 20 6d 61 79 20 63 75  inity, it may cu
1a8e0 72 72 65 6e 74 6c 79 20 62 65 20 73 74 6f 72 65  rrently be store
1a8f0 64 20 61 73 20 61 6e 0a 20 20 20 20 20 20 2a 2a  d as an.      **
1a900 20 69 6e 74 65 67 65 72 2e 20 55 73 65 20 4f 50   integer. Use OP
1a910 5f 52 65 61 6c 41 66 66 69 6e 69 74 79 20 74 6f  _RealAffinity to
1a920 20 6d 61 6b 65 20 73 75 72 65 20 69 74 20 69 73   make sure it is
1a930 20 72 65 61 6c 6c 79 20 72 65 61 6c 2e 0a 20 20   really real..  
1a940 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
1a950 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 36  EVIDENCE-OF: R-6
1a960 30 39 38 35 2d 35 37 36 36 32 20 53 51 4c 69 74  0985-57662 SQLit
1a970 65 20 77 69 6c 6c 20 63 6f 6e 76 65 72 74 20 74  e will convert t
1a980 68 65 20 76 61 6c 75 65 20 62 61 63 6b 20 74 6f  he value back to
1a990 0a 20 20 20 20 20 20 2a 2a 20 66 6c 6f 61 74 69  .      ** floati
1a9a0 6e 67 20 70 6f 69 6e 74 20 77 68 65 6e 20 65 78  ng point when ex
1a9b0 74 72 61 63 74 69 6e 67 20 69 74 20 66 72 6f 6d  tracting it from
1a9c0 20 74 68 65 20 72 65 63 6f 72 64 2e 20 20 2a 2f   the record.  */
1a9d0 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
1a9e0 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20 0a 20 20  ->iColumn>=0 .  
1a9f0 20 20 20 20 20 26 26 20 70 54 61 62 2d 3e 61 43       && pTab->aC
1aa00 6f 6c 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  ol[pExpr->iColum
1aa10 6e 5d 2e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c  n].affinity==SQL
1aa20 49 54 45 5f 41 46 46 5f 52 45 41 4c 0a 20 20 20  ITE_AFF_REAL.   
1aa30 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71     ){.        sq
1aa40 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
1aa50 76 2c 20 4f 50 5f 52 65 61 6c 41 66 66 69 6e 69  v, OP_RealAffini
1aa60 74 79 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  ty, target);.   
1aa70 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
1aa80 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
1aa90 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 46  .    /*.    ** F
1aaa0 6f 72 6d 20 41 3a 0a 20 20 20 20 2a 2a 20 20 20  orm A:.    **   
1aab0 43 41 53 45 20 78 20 57 48 45 4e 20 65 31 20 54  CASE x WHEN e1 T
1aac0 48 45 4e 20 72 31 20 57 48 45 4e 20 65 32 20 54  HEN r1 WHEN e2 T
1aad0 48 45 4e 20 72 32 20 2e 2e 2e 20 57 48 45 4e 20  HEN r2 ... WHEN 
1aae0 65 4e 20 54 48 45 4e 20 72 4e 20 45 4c 53 45 20  eN THEN rN ELSE 
1aaf0 79 20 45 4e 44 0a 20 20 20 20 2a 2a 0a 20 20 20  y END.    **.   
1ab00 20 2a 2a 20 46 6f 72 6d 20 42 3a 0a 20 20 20 20   ** Form B:.    
1ab10 2a 2a 20 20 20 43 41 53 45 20 57 48 45 4e 20 65  **   CASE WHEN e
1ab20 31 20 54 48 45 4e 20 72 31 20 57 48 45 4e 20 65  1 THEN r1 WHEN e
1ab30 32 20 54 48 45 4e 20 72 32 20 2e 2e 2e 20 57 48  2 THEN r2 ... WH
1ab40 45 4e 20 65 4e 20 54 48 45 4e 20 72 4e 20 45 4c  EN eN THEN rN EL
1ab50 53 45 20 79 20 45 4e 44 0a 20 20 20 20 2a 2a 0a  SE y END.    **.
1ab60 20 20 20 20 2a 2a 20 46 6f 72 6d 20 41 20 69 73      ** Form A is
1ab70 20 63 61 6e 20 62 65 20 74 72 61 6e 73 66 6f 72   can be transfor
1ab80 6d 65 64 20 69 6e 74 6f 20 74 68 65 20 65 71 75  med into the equ
1ab90 69 76 61 6c 65 6e 74 20 66 6f 72 6d 20 42 20 61  ivalent form B a
1aba0 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20 2a  s follows:.    *
1abb0 2a 20 20 20 43 41 53 45 20 57 48 45 4e 20 78 3d  *   CASE WHEN x=
1abc0 65 31 20 54 48 45 4e 20 72 31 20 57 48 45 4e 20  e1 THEN r1 WHEN 
1abd0 78 3d 65 32 20 54 48 45 4e 20 72 32 20 2e 2e 2e  x=e2 THEN r2 ...
1abe0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 57  .    **        W
1abf0 48 45 4e 20 78 3d 65 4e 20 54 48 45 4e 20 72 4e  HEN x=eN THEN rN
1ac00 20 45 4c 53 45 20 79 20 45 4e 44 0a 20 20 20 20   ELSE y END.    
1ac10 2a 2a 0a 20 20 20 20 2a 2a 20 58 20 28 69 66 20  **.    ** X (if 
1ac20 69 74 20 65 78 69 73 74 73 29 20 69 73 20 69 6e  it exists) is in
1ac30 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2e 0a 20   pExpr->pLeft.. 
1ac40 20 20 20 2a 2a 20 59 20 69 73 20 69 6e 20 74 68     ** Y is in th
1ac50 65 20 6c 61 73 74 20 65 6c 65 6d 65 6e 74 20 6f  e last element o
1ac60 66 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  f pExpr->x.pList
1ac70 20 69 66 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69   if pExpr->x.pLi
1ac80 73 74 2d 3e 6e 45 78 70 72 20 69 73 0a 20 20 20  st->nExpr is.   
1ac90 20 2a 2a 20 6f 64 64 2e 20 20 54 68 65 20 59 20   ** odd.  The Y 
1aca0 69 73 20 61 6c 73 6f 20 6f 70 74 69 6f 6e 61 6c  is also optional
1acb0 2e 20 20 49 66 20 74 68 65 20 6e 75 6d 62 65 72  .  If the number
1acc0 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20   of elements in 
1acd0 78 2e 70 4c 69 73 74 0a 20 20 20 20 2a 2a 20 69  x.pList.    ** i
1ace0 73 20 65 76 65 6e 2c 20 74 68 65 6e 20 59 20 69  s even, then Y i
1acf0 73 20 6f 6d 69 74 74 65 64 20 61 6e 64 20 74 68  s omitted and th
1ad00 65 20 22 6f 74 68 65 72 77 69 73 65 22 20 72 65  e "otherwise" re
1ad10 73 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 0a 20 20  sult is NULL..  
1ad20 20 20 2a 2a 20 45 69 20 69 73 20 69 6e 20 70 45    ** Ei is in pE
1ad30 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 2a  xpr->pList->a[i*
1ad40 32 5d 20 61 6e 64 20 52 69 20 69 73 20 70 45 78  2] and Ri is pEx
1ad50 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 2a 32  pr->pList->a[i*2
1ad60 2b 31 5d 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  +1]..    **.    
1ad70 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 20 6f 66  ** The result of
1ad80 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
1ad90 69 73 20 74 68 65 20 52 69 20 66 6f 72 20 74 68  is the Ri for th
1ada0 65 20 66 69 72 73 74 20 6d 61 74 63 68 69 6e 67  e first matching
1adb0 20 45 69 2c 0a 20 20 20 20 2a 2a 20 6f 72 20 69   Ei,.    ** or i
1adc0 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 61  f there is no ma
1add0 74 63 68 69 6e 67 20 45 69 2c 20 74 68 65 20 45  tching Ei, the E
1ade0 4c 53 45 20 74 65 72 6d 20 59 2c 20 6f 72 20 69  LSE term Y, or i
1adf0 66 20 74 68 65 72 65 20 69 73 0a 20 20 20 20 2a  f there is.    *
1ae00 2a 20 6e 6f 20 45 4c 53 45 20 74 65 72 6d 2c 20  * no ELSE term, 
1ae10 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  NULL..    */.   
1ae20 20 64 65 66 61 75 6c 74 3a 20 61 73 73 65 72 74   default: assert
1ae30 28 20 6f 70 3d 3d 54 4b 5f 43 41 53 45 20 29 3b  ( op==TK_CASE );
1ae40 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 65 6e 64   {.      int end
1ae50 4c 61 62 65 6c 3b 20 20 20 20 20 20 20 20 20 20  Label;          
1ae60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 4f             /* GO
1ae70 54 4f 20 6c 61 62 65 6c 20 66 6f 72 20 65 6e 64  TO label for end
1ae80 20 6f 66 20 43 41 53 45 20 73 74 6d 74 20 2a 2f   of CASE stmt */
1ae90 0a 20 20 20 20 20 20 69 6e 74 20 6e 65 78 74 43  .      int nextC
1aea0 61 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ase;            
1aeb0 20 20 20 20 20 20 20 20 20 2f 2a 20 47 4f 54 4f           /* GOTO
1aec0 20 6c 61 62 65 6c 20 66 6f 72 20 6e 65 78 74 20   label for next 
1aed0 57 48 45 4e 20 63 6c 61 75 73 65 20 2a 2f 0a 20  WHEN clause */. 
1aee0 20 20 20 20 20 69 6e 74 20 6e 45 78 70 72 3b 20       int nExpr; 
1aef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1af00 20 20 20 20 20 20 20 2f 2a 20 32 78 20 6e 75 6d         /* 2x num
1af10 62 65 72 20 6f 66 20 57 48 45 4e 20 74 65 72 6d  ber of WHEN term
1af20 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69  s */.      int i
1af30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1af40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1af50 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
1af60 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a        ExprList *
1af70 70 45 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20  pEList;         
1af80 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20          /* List 
1af90 6f 66 20 57 48 45 4e 20 74 65 72 6d 73 20 2a 2f  of WHEN terms */
1afa0 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78  .      struct Ex
1afb0 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 4c 69  prList_item *aLi
1afc0 73 74 65 6c 65 6d 3b 20 20 2f 2a 20 41 72 72 61  stelem;  /* Arra
1afd0 79 20 6f 66 20 57 48 45 4e 20 74 65 72 6d 73 20  y of WHEN terms 
1afe0 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 6f 70  */.      Expr op
1aff0 43 6f 6d 70 61 72 65 3b 20 20 20 20 20 20 20 20  Compare;        
1b000 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1b010 65 20 58 3d 3d 45 69 20 65 78 70 72 65 73 73 69  e X==Ei expressi
1b020 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72  on */.      Expr
1b030 20 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20 20   *pX;           
1b040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b050 20 54 68 65 20 58 20 65 78 70 72 65 73 73 69 6f   The X expressio
1b060 6e 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20  n */.      Expr 
1b070 2a 70 54 65 73 74 20 3d 20 30 3b 20 20 20 20 20  *pTest = 0;     
1b080 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b090 58 3d 3d 45 69 20 28 66 6f 72 6d 20 41 29 20 6f  X==Ei (form A) o
1b0a0 72 20 6a 75 73 74 20 45 69 20 28 66 6f 72 6d 20  r just Ei (form 
1b0b0 42 29 20 2a 2f 0a 20 20 20 20 20 20 56 56 41 5f  B) */.      VVA_
1b0c0 4f 4e 4c 59 28 20 69 6e 74 20 69 43 61 63 68 65  ONLY( int iCache
1b0d0 4c 65 76 65 6c 20 3d 20 70 50 61 72 73 65 2d 3e  Level = pParse->
1b0e0 69 43 61 63 68 65 4c 65 76 65 6c 3b 20 29 0a 0a  iCacheLevel; )..
1b0f0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
1b100 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
1b110 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
1b120 63 74 29 20 26 26 20 70 45 78 70 72 2d 3e 78 2e  ct) && pExpr->x.
1b130 70 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20 61  pList );.      a
1b140 73 73 65 72 74 28 70 45 78 70 72 2d 3e 78 2e 70  ssert(pExpr->x.p
1b150 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3e 20 30 29  List->nExpr > 0)
1b160 3b 0a 20 20 20 20 20 20 70 45 4c 69 73 74 20 3d  ;.      pEList =
1b170 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b   pExpr->x.pList;
1b180 0a 20 20 20 20 20 20 61 4c 69 73 74 65 6c 65 6d  .      aListelem
1b190 20 3d 20 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20   = pEList->a;.  
1b1a0 20 20 20 20 6e 45 78 70 72 20 3d 20 70 45 4c 69      nExpr = pELi
1b1b0 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20  st->nExpr;.     
1b1c0 20 65 6e 64 4c 61 62 65 6c 20 3d 20 73 71 6c 69   endLabel = sqli
1b1d0 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
1b1e0 28 76 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28  (v);.      if( (
1b1f0 70 58 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66  pX = pExpr->pLef
1b200 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  t)!=0 ){.       
1b210 20 74 65 6d 70 58 20 3d 20 2a 70 58 3b 0a 20 20   tempX = *pX;.  
1b220 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1b230 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  pX->op==TK_COLUM
1b240 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 65 78 70  N );.        exp
1b250 72 54 6f 52 65 67 69 73 74 65 72 28 26 74 65 6d  rToRegister(&tem
1b260 70 58 2c 20 73 71 6c 69 74 65 33 45 78 70 72 43  pX, sqlite3ExprC
1b270 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
1b280 70 58 2c 20 26 72 65 67 46 72 65 65 31 29 29 3b  pX, &regFree1));
1b290 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
1b2a0 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  e( regFree1==0 )
1b2b0 3b 0a 20 20 20 20 20 20 20 20 6f 70 43 6f 6d 70  ;.        opComp
1b2c0 61 72 65 2e 6f 70 20 3d 20 54 4b 5f 45 51 3b 0a  are.op = TK_EQ;.
1b2d0 20 20 20 20 20 20 20 20 6f 70 43 6f 6d 70 61 72          opCompar
1b2e0 65 2e 70 4c 65 66 74 20 3d 20 26 74 65 6d 70 58  e.pLeft = &tempX
1b2f0 3b 0a 20 20 20 20 20 20 20 20 70 54 65 73 74 20  ;.        pTest 
1b300 3d 20 26 6f 70 43 6f 6d 70 61 72 65 3b 0a 20 20  = &opCompare;.  
1b310 20 20 20 20 20 20 2f 2a 20 54 69 63 6b 65 74 20        /* Ticket 
1b320 62 33 35 31 64 39 35 66 39 63 64 35 65 66 31 37  b351d95f9cd5ef17
1b330 65 39 64 39 64 62 61 65 31 38 66 35 63 61 38 36  e9d9dbae18f5ca86
1b340 31 31 31 39 30 30 30 31 3a 0a 20 20 20 20 20 20  11190001:.      
1b350 20 20 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 69    ** The value i
1b360 6e 20 72 65 67 46 72 65 65 31 20 6d 69 67 68 74  n regFree1 might
1b370 20 67 65 74 20 53 43 6f 70 79 2d 65 64 20 69 6e   get SCopy-ed in
1b380 74 6f 20 74 68 65 20 66 69 6c 65 20 72 65 73 75  to the file resu
1b390 6c 74 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 53  lt..        ** S
1b3a0 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  o make sure that
1b3b0 20 74 68 65 20 72 65 67 46 72 65 65 31 20 72 65   the regFree1 re
1b3c0 67 69 73 74 65 72 20 69 73 20 6e 6f 74 20 72 65  gister is not re
1b3d0 75 73 65 64 20 66 6f 72 20 6f 74 68 65 72 0a 20  used for other. 
1b3e0 20 20 20 20 20 20 20 2a 2a 20 70 75 72 70 6f 73         ** purpos
1b3f0 65 73 20 61 6e 64 20 70 6f 73 73 69 62 6c 79 20  es and possibly 
1b400 6f 76 65 72 77 72 69 74 74 65 6e 2e 20 20 2a 2f  overwritten.  */
1b410 0a 20 20 20 20 20 20 20 20 72 65 67 46 72 65 65  .        regFree
1b420 31 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  1 = 0;.      }. 
1b430 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
1b440 6e 45 78 70 72 2d 31 3b 20 69 3d 69 2b 32 29 7b  nExpr-1; i=i+2){
1b450 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1b460 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50  ExprCachePush(pP
1b470 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 69  arse);.        i
1b480 66 28 20 70 58 20 29 7b 0a 20 20 20 20 20 20 20  f( pX ){.       
1b490 20 20 20 61 73 73 65 72 74 28 20 70 54 65 73 74     assert( pTest
1b4a0 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  !=0 );.         
1b4b0 20 6f 70 43 6f 6d 70 61 72 65 2e 70 52 69 67 68   opCompare.pRigh
1b4c0 74 20 3d 20 61 4c 69 73 74 65 6c 65 6d 5b 69 5d  t = aListelem[i]
1b4d0 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  .pExpr;.        
1b4e0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
1b4f0 20 70 54 65 73 74 20 3d 20 61 4c 69 73 74 65 6c   pTest = aListel
1b500 65 6d 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  em[i].pExpr;.   
1b510 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6e       }.        n
1b520 65 78 74 43 61 73 65 20 3d 20 73 71 6c 69 74 65  extCase = sqlite
1b530 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
1b540 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
1b550 61 73 65 28 20 70 54 65 73 74 2d 3e 6f 70 3d 3d  ase( pTest->op==
1b560 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20  TK_COLUMN );.   
1b570 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1b580 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
1b590 70 54 65 73 74 2c 20 6e 65 78 74 43 61 73 65 2c  pTest, nextCase,
1b5a0 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55   SQLITE_JUMPIFNU
1b5b0 4c 4c 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  LL);.        tes
1b5c0 74 63 61 73 65 28 20 61 4c 69 73 74 65 6c 65 6d  tcase( aListelem
1b5d0 5b 69 2b 31 5d 2e 70 45 78 70 72 2d 3e 6f 70 3d  [i+1].pExpr->op=
1b5e0 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20  =TK_COLUMN );.  
1b5f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1b600 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 61 4c  rCode(pParse, aL
1b610 69 73 74 65 6c 65 6d 5b 69 2b 31 5d 2e 70 45 78  istelem[i+1].pEx
1b620 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  pr, target);.   
1b630 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1b640 47 6f 74 6f 28 76 2c 20 65 6e 64 4c 61 62 65 6c  Goto(v, endLabel
1b650 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
1b660 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70  e3ExprCachePop(p
1b670 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
1b680 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
1b690 76 65 4c 61 62 65 6c 28 76 2c 20 6e 65 78 74 43  veLabel(v, nextC
1b6a0 61 73 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ase);.      }.  
1b6b0 20 20 20 20 69 66 28 20 28 6e 45 78 70 72 26 31      if( (nExpr&1
1b6c0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
1b6d0 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
1b6e0 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20  Push(pParse);.  
1b6f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1b700 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
1b710 4c 69 73 74 2d 3e 61 5b 6e 45 78 70 72 2d 31 5d  List->a[nExpr-1]
1b720 2e 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b  .pExpr, target);
1b730 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1b740 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61  ExprCachePop(pPa
1b750 72 73 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  rse);.      }els
1b760 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
1b770 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1b780 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61 72 67  OP_Null, 0, targ
1b790 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  et);.      }.   
1b7a0 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d     assert( db->m
1b7b0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70  allocFailed || p
1b7c0 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20 0a 20  Parse->nErr>0 . 
1b7d0 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61            || pPa
1b7e0 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c  rse->iCacheLevel
1b7f0 3d 3d 69 43 61 63 68 65 4c 65 76 65 6c 20 29 3b  ==iCacheLevel );
1b800 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1b810 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
1b820 2c 20 65 6e 64 4c 61 62 65 6c 29 3b 0a 20 20 20  , endLabel);.   
1b830 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1b840 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1b850 4d 49 54 5f 54 52 49 47 47 45 52 0a 20 20 20 20  MIT_TRIGGER.    
1b860 63 61 73 65 20 54 4b 5f 52 41 49 53 45 3a 20 7b  case TK_RAISE: {
1b870 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1b880 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d  Expr->affinity==
1b890 4f 45 5f 52 6f 6c 6c 62 61 63 6b 20 0a 20 20 20  OE_Rollback .   
1b8a0 20 20 20 20 20 20 20 20 7c 7c 20 70 45 78 70 72          || pExpr
1b8b0 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 41  ->affinity==OE_A
1b8c0 62 6f 72 74 0a 20 20 20 20 20 20 20 20 20 20 20  bort.           
1b8d0 7c 7c 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69  || pExpr->affini
1b8e0 74 79 3d 3d 4f 45 5f 46 61 69 6c 0a 20 20 20 20  ty==OE_Fail.    
1b8f0 20 20 20 20 20 20 20 7c 7c 20 70 45 78 70 72 2d         || pExpr-
1b900 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 49 67  >affinity==OE_Ig
1b910 6e 6f 72 65 0a 20 20 20 20 20 20 29 3b 0a 20 20  nore.      );.  
1b920 20 20 20 20 69 66 28 20 21 70 50 61 72 73 65 2d      if( !pParse-
1b930 3e 70 54 72 69 67 67 65 72 54 61 62 20 29 7b 0a  >pTriggerTab ){.
1b940 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1b950 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 0a  rrorMsg(pParse,.
1b960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b970 20 20 20 20 20 20 20 22 52 41 49 53 45 28 29 20         "RAISE() 
1b980 6d 61 79 20 6f 6e 6c 79 20 62 65 20 75 73 65 64  may only be used
1b990 20 77 69 74 68 69 6e 20 61 20 74 72 69 67 67 65   within a trigge
1b9a0 72 2d 70 72 6f 67 72 61 6d 22 29 3b 0a 20 20 20  r-program");.   
1b9b0 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
1b9c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
1b9d0 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79   pExpr->affinity
1b9e0 3d 3d 4f 45 5f 41 62 6f 72 74 20 29 7b 0a 20 20  ==OE_Abort ){.  
1b9f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 61 79        sqlite3May
1ba00 41 62 6f 72 74 28 70 50 61 72 73 65 29 3b 0a 20  Abort(pParse);. 
1ba10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
1ba20 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
1ba30 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
1ba40 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20  IntValue) );.   
1ba50 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 61 66     if( pExpr->af
1ba60 66 69 6e 69 74 79 3d 3d 4f 45 5f 49 67 6e 6f 72  finity==OE_Ignor
1ba70 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  e ){.        sql
1ba80 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 0a  ite3VdbeAddOp4(.
1ba90 20 20 20 20 20 20 20 20 20 20 20 20 76 2c 20 4f              v, O
1baa0 50 5f 48 61 6c 74 2c 20 53 51 4c 49 54 45 5f 4f  P_Halt, SQLITE_O
1bab0 4b 2c 20 4f 45 5f 49 67 6e 6f 72 65 2c 20 30 2c  K, OE_Ignore, 0,
1bac0 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
1bad0 2c 30 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62  ,0);.        Vdb
1bae0 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
1baf0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1bb00 20 20 20 73 71 6c 69 74 65 33 48 61 6c 74 43 6f     sqlite3HaltCo
1bb10 6e 73 74 72 61 69 6e 74 28 70 50 61 72 73 65 2c  nstraint(pParse,
1bb20 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
1bb30 4e 54 5f 54 52 49 47 47 45 52 2c 0a 20 20 20 20  NT_TRIGGER,.    
1bb40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bb50 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
1bb60 3e 61 66 66 69 6e 69 74 79 2c 20 70 45 78 70 72  >affinity, pExpr
1bb70 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30 2c 20 30  ->u.zToken, 0, 0
1bb80 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
1bb90 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
1bba0 65 6e 64 69 66 0a 20 20 7d 0a 20 20 73 71 6c 69  endif.  }.  sqli
1bbb0 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
1bbc0 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65  g(pParse, regFre
1bbd0 65 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65  e1);.  sqlite3Re
1bbe0 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
1bbf0 72 73 65 2c 20 72 65 67 46 72 65 65 32 29 3b 0a  rse, regFree2);.
1bc00 20 20 72 65 74 75 72 6e 20 69 6e 52 65 67 3b 0a    return inReg;.
1bc10 7d 0a 0a 2f 2a 0a 2a 2a 20 46 61 63 74 6f 72 20  }../*.** Factor 
1bc20 6f 75 74 20 74 68 65 20 63 6f 64 65 20 6f 66 20  out the code of 
1bc30 74 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73  the given expres
1bc40 73 69 6f 6e 20 74 6f 20 69 6e 69 74 69 61 6c 69  sion to initiali
1bc50 7a 61 74 69 6f 6e 20 74 69 6d 65 2e 0a 2a 2f 0a  zation time..*/.
1bc60 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
1bc70 43 6f 64 65 41 74 49 6e 69 74 28 0a 20 20 50 61  CodeAtInit(.  Pa
1bc80 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
1bc90 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
1bca0 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45  xt */.  Expr *pE
1bcb0 78 70 72 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  xpr,      /* The
1bcc0 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 63   expression to c
1bcd0 6f 64 65 20 77 68 65 6e 20 74 68 65 20 56 44 42  ode when the VDB
1bce0 45 20 69 6e 69 74 69 61 6c 69 7a 65 73 20 2a 2f  E initializes */
1bcf0 0a 20 20 69 6e 74 20 72 65 67 44 65 73 74 2c 20  .  int regDest, 
1bd00 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74 68       /* Store th
1bd10 65 20 76 61 6c 75 65 20 69 6e 20 74 68 69 73 20  e value in this 
1bd20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 75 38  register */.  u8
1bd30 20 72 65 75 73 61 62 6c 65 20 20 20 20 20 20 20   reusable       
1bd40 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20  /* True if this 
1bd50 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 72 65  expression is re
1bd60 75 73 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 45  usable */.){.  E
1bd70 78 70 72 4c 69 73 74 20 2a 70 3b 0a 20 20 61 73  xprList *p;.  as
1bd80 73 65 72 74 28 20 43 6f 6e 73 74 46 61 63 74 6f  sert( ConstFacto
1bd90 72 4f 6b 28 70 50 61 72 73 65 29 20 29 3b 0a 20  rOk(pParse) );. 
1bda0 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 43 6f   p = pParse->pCo
1bdb0 6e 73 74 45 78 70 72 3b 0a 20 20 70 45 78 70 72  nstExpr;.  pExpr
1bdc0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
1bdd0 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 45  p(pParse->db, pE
1bde0 78 70 72 2c 20 30 29 3b 0a 20 20 70 20 3d 20 73  xpr, 0);.  p = s
1bdf0 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
1be00 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70 2c 20  pend(pParse, p, 
1be10 70 45 78 70 72 29 3b 0a 20 20 69 66 28 20 70 20  pExpr);.  if( p 
1be20 29 7b 0a 20 20 20 20 20 73 74 72 75 63 74 20 45  ){.     struct E
1be30 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
1be40 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 70 2d 3e 6e  tem = &p->a[p->n
1be50 45 78 70 72 2d 31 5d 3b 0a 20 20 20 20 20 70 49  Expr-1];.     pI
1be60 74 65 6d 2d 3e 75 2e 69 43 6f 6e 73 74 45 78 70  tem->u.iConstExp
1be70 72 52 65 67 20 3d 20 72 65 67 44 65 73 74 3b 0a  rReg = regDest;.
1be80 20 20 20 20 20 70 49 74 65 6d 2d 3e 72 65 75 73       pItem->reus
1be90 61 62 6c 65 20 3d 20 72 65 75 73 61 62 6c 65 3b  able = reusable;
1bea0 0a 20 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 70  .  }.  pParse->p
1beb0 43 6f 6e 73 74 45 78 70 72 20 3d 20 70 3b 0a 7d  ConstExpr = p;.}
1bec0 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
1bed0 20 63 6f 64 65 20 74 6f 20 65 76 61 6c 75 61 74   code to evaluat
1bee0 65 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  e an expression 
1bef0 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72 65  and store the re
1bf00 73 75 6c 74 73 0a 2a 2a 20 69 6e 74 6f 20 61 20  sults.** into a 
1bf10 72 65 67 69 73 74 65 72 2e 20 20 52 65 74 75 72  register.  Retur
1bf20 6e 20 74 68 65 20 72 65 67 69 73 74 65 72 20 6e  n the register n
1bf30 75 6d 62 65 72 20 77 68 65 72 65 20 74 68 65 20  umber where the 
1bf40 72 65 73 75 6c 74 73 0a 2a 2a 20 61 72 65 20 73  results.** are s
1bf50 74 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  tored..**.** If 
1bf60 74 68 65 20 72 65 67 69 73 74 65 72 20 69 73 20  the register is 
1bf70 61 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69  a temporary regi
1bf80 73 74 65 72 20 74 68 61 74 20 63 61 6e 20 62 65  ster that can be
1bf90 20 64 65 61 6c 6c 6f 63 61 74 65 64 2c 0a 2a 2a   deallocated,.**
1bfa0 20 74 68 65 6e 20 77 72 69 74 65 20 69 74 73 20   then write its 
1bfb0 6e 75 6d 62 65 72 20 69 6e 74 6f 20 2a 70 52 65  number into *pRe
1bfc0 67 2e 20 20 49 66 20 74 68 65 20 72 65 73 75 6c  g.  If the resul
1bfd0 74 20 72 65 67 69 73 74 65 72 20 69 73 20 6e 6f  t register is no
1bfe0 74 0a 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72 79  t.** a temporary
1bff0 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65 67  , then set *pReg
1c000 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20   to zero..**.** 
1c010 49 66 20 70 45 78 70 72 20 69 73 20 61 20 63 6f  If pExpr is a co
1c020 6e 73 74 61 6e 74 2c 20 74 68 65 6e 20 74 68 69  nstant, then thi
1c030 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20  s routine might 
1c040 67 65 6e 65 72 61 74 65 20 74 68 69 73 0a 2a 2a  generate this.**
1c050 20 63 6f 64 65 20 74 6f 20 66 69 6c 6c 20 74 68   code to fill th
1c060 65 20 72 65 67 69 73 74 65 72 20 69 6e 20 74 68  e register in th
1c070 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  e initialization
1c080 20 73 65 63 74 69 6f 6e 20 6f 66 20 74 68 65 0a   section of the.
1c090 2a 2a 20 56 44 42 45 20 70 72 6f 67 72 61 6d 2c  ** VDBE program,
1c0a0 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 66 61 63   in order to fac
1c0b0 74 6f 72 20 69 74 20 6f 75 74 20 6f 66 20 74 68  tor it out of th
1c0c0 65 20 65 76 61 6c 75 61 74 69 6f 6e 20 6c 6f 6f  e evaluation loo
1c0d0 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  p..*/.int sqlite
1c0e0 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 50 61  3ExprCodeTemp(Pa
1c0f0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
1c100 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 2a 70  r *pExpr, int *p
1c110 52 65 67 29 7b 0a 20 20 69 6e 74 20 72 32 3b 0a  Reg){.  int r2;.
1c120 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65    pExpr = sqlite
1c130 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65  3ExprSkipCollate
1c140 28 70 45 78 70 72 29 3b 0a 20 20 69 66 28 20 43  (pExpr);.  if( C
1c150 6f 6e 73 74 46 61 63 74 6f 72 4f 6b 28 70 50 61  onstFactorOk(pPa
1c160 72 73 65 29 0a 20 20 20 26 26 20 70 45 78 70 72  rse).   && pExpr
1c170 2d 3e 6f 70 21 3d 54 4b 5f 52 45 47 49 53 54 45  ->op!=TK_REGISTE
1c180 52 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33 45  R.   && sqlite3E
1c190 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74  xprIsConstantNot
1c1a0 4a 6f 69 6e 28 70 45 78 70 72 29 0a 20 20 29 7b  Join(pExpr).  ){
1c1b0 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70  .    ExprList *p
1c1c0 20 3d 20 70 50 61 72 73 65 2d 3e 70 43 6f 6e 73   = pParse->pCons
1c1d0 74 45 78 70 72 3b 0a 20 20 20 20 69 6e 74 20 69  tExpr;.    int i
1c1e0 3b 0a 20 20 20 20 2a 70 52 65 67 20 20 3d 20 30  ;.    *pReg  = 0
1c1f0 3b 0a 20 20 20 20 69 66 28 20 70 20 29 7b 0a 20  ;.    if( p ){. 
1c200 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72       struct Expr
1c210 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
1c220 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 49 74 65  ;.      for(pIte
1c230 6d 3d 70 2d 3e 61 2c 20 69 3d 70 2d 3e 6e 45 78  m=p->a, i=p->nEx
1c240 70 72 3b 20 69 3e 30 3b 20 70 49 74 65 6d 2b 2b  pr; i>0; pItem++
1c250 2c 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20  , i--){.        
1c260 69 66 28 20 70 49 74 65 6d 2d 3e 72 65 75 73 61  if( pItem->reusa
1c270 62 6c 65 20 26 26 20 73 71 6c 69 74 65 33 45 78  ble && sqlite3Ex
1c280 70 72 43 6f 6d 70 61 72 65 28 70 49 74 65 6d 2d  prCompare(pItem-
1c290 3e 70 45 78 70 72 2c 70 45 78 70 72 2c 2d 31 29  >pExpr,pExpr,-1)
1c2a0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
1c2b0 20 72 65 74 75 72 6e 20 70 49 74 65 6d 2d 3e 75   return pItem->u
1c2c0 2e 69 43 6f 6e 73 74 45 78 70 72 52 65 67 3b 0a  .iConstExprReg;.
1c2d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1c2e0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 32 20 3d  }.    }.    r2 =
1c2f0 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
1c300 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
1c310 43 6f 64 65 41 74 49 6e 69 74 28 70 50 61 72 73  CodeAtInit(pPars
1c320 65 2c 20 70 45 78 70 72 2c 20 72 32 2c 20 31 29  e, pExpr, r2, 1)
1c330 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
1c340 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47  nt r1 = sqlite3G
1c350 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
1c360 29 3b 0a 20 20 20 20 72 32 20 3d 20 73 71 6c 69  );.    r2 = sqli
1c370 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65  te3ExprCodeTarge
1c380 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  t(pParse, pExpr,
1c390 20 72 31 29 3b 0a 20 20 20 20 69 66 28 20 72 32   r1);.    if( r2
1c3a0 3d 3d 72 31 20 29 7b 0a 20 20 20 20 20 20 2a 70  ==r1 ){.      *p
1c3b0 52 65 67 20 3d 20 72 31 3b 0a 20 20 20 20 7d 65  Reg = r1;.    }e
1c3c0 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
1c3d0 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
1c3e0 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20  (pParse, r1);.  
1c3f0 20 20 20 20 2a 70 52 65 67 20 3d 20 30 3b 0a 20      *pReg = 0;. 
1c400 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
1c410 6e 20 72 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  n r2;.}../*.** G
1c420 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
1c430 74 20 77 69 6c 6c 20 65 76 61 6c 75 61 74 65 20  t will evaluate 
1c440 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72  expression pExpr
1c450 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 0a 2a   and store the.*
1c460 2a 20 72 65 73 75 6c 74 73 20 69 6e 20 72 65 67  * results in reg
1c470 69 73 74 65 72 20 74 61 72 67 65 74 2e 20 20 54  ister target.  T
1c480 68 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 67  he results are g
1c490 75 61 72 61 6e 74 65 65 64 20 74 6f 20 61 70 70  uaranteed to app
1c4a0 65 61 72 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74  ear.** in regist
1c4b0 65 72 20 74 61 72 67 65 74 2e 0a 2a 2f 0a 76 6f  er target..*/.vo
1c4c0 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  id sqlite3ExprCo
1c4d0 64 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  de(Parse *pParse
1c4e0 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69  , Expr *pExpr, i
1c4f0 6e 74 20 74 61 72 67 65 74 29 7b 0a 20 20 69 6e  nt target){.  in
1c500 74 20 69 6e 52 65 67 3b 0a 0a 20 20 61 73 73 65  t inReg;..  asse
1c510 72 74 28 20 74 61 72 67 65 74 3e 30 20 26 26 20  rt( target>0 && 
1c520 74 61 72 67 65 74 3c 3d 70 50 61 72 73 65 2d 3e  target<=pParse->
1c530 6e 4d 65 6d 20 29 3b 0a 20 20 69 66 28 20 70 45  nMem );.  if( pE
1c540 78 70 72 20 26 26 20 70 45 78 70 72 2d 3e 6f 70  xpr && pExpr->op
1c550 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29 7b  ==TK_REGISTER ){
1c560 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1c570 41 64 64 4f 70 32 28 70 50 61 72 73 65 2d 3e 70  AddOp2(pParse->p
1c580 56 64 62 65 2c 20 4f 50 5f 43 6f 70 79 2c 20 70  Vdbe, OP_Copy, p
1c590 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 74 61  Expr->iTable, ta
1c5a0 72 67 65 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  rget);.  }else{.
1c5b0 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69      inReg = sqli
1c5c0 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65  te3ExprCodeTarge
1c5d0 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  t(pParse, pExpr,
1c5e0 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 61 73   target);.    as
1c5f0 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70 56  sert( pParse->pV
1c600 64 62 65 21 3d 30 20 7c 7c 20 70 50 61 72 73 65  dbe!=0 || pParse
1c610 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
1c620 65 64 20 29 3b 0a 20 20 20 20 69 66 28 20 69 6e  ed );.    if( in
1c630 52 65 67 21 3d 74 61 72 67 65 74 20 26 26 20 70  Reg!=target && p
1c640 50 61 72 73 65 2d 3e 70 56 64 62 65 20 29 7b 0a  Parse->pVdbe ){.
1c650 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1c660 65 41 64 64 4f 70 32 28 70 50 61 72 73 65 2d 3e  eAddOp2(pParse->
1c670 70 56 64 62 65 2c 20 4f 50 5f 53 43 6f 70 79 2c  pVdbe, OP_SCopy,
1c680 20 69 6e 52 65 67 2c 20 74 61 72 67 65 74 29 3b   inReg, target);
1c690 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
1c6a0 0a 2a 2a 20 4d 61 6b 65 20 61 20 74 72 61 6e 73  .** Make a trans
1c6b0 69 65 6e 74 20 63 6f 70 79 20 6f 66 20 65 78 70  ient copy of exp
1c6c0 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20 61 6e  ression pExpr an
1c6d0 64 20 74 68 65 6e 20 63 6f 64 65 20 69 74 20 75  d then code it u
1c6e0 73 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 45  sing.** sqlite3E
1c6f0 78 70 72 43 6f 64 65 28 29 2e 20 20 54 68 69 73  xprCode().  This
1c700 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20 6a   routine works j
1c710 75 73 74 20 6c 69 6b 65 20 73 71 6c 69 74 65 33  ust like sqlite3
1c720 45 78 70 72 43 6f 64 65 28 29 0a 2a 2a 20 65 78  ExprCode().** ex
1c730 63 65 70 74 20 74 68 61 74 20 74 68 65 20 69 6e  cept that the in
1c740 70 75 74 20 65 78 70 72 65 73 73 69 6f 6e 20 69  put expression i
1c750 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  s guaranteed to 
1c760 62 65 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f  be unchanged..*/
1c770 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
1c780 72 43 6f 64 65 43 6f 70 79 28 50 61 72 73 65 20  rCodeCopy(Parse 
1c790 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
1c7a0 45 78 70 72 2c 20 69 6e 74 20 74 61 72 67 65 74  Expr, int target
1c7b0 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
1c7c0 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
1c7d0 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33   pExpr = sqlite3
1c7e0 45 78 70 72 44 75 70 28 64 62 2c 20 70 45 78 70  ExprDup(db, pExp
1c7f0 72 2c 20 30 29 3b 0a 20 20 69 66 28 20 21 64 62  r, 0);.  if( !db
1c800 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
1c810 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1c820 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
1c830 74 61 72 67 65 74 29 3b 0a 20 20 73 71 6c 69 74  target);.  sqlit
1c840 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
1c850 20 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   pExpr);.}../*.*
1c860 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
1c870 74 68 61 74 20 77 69 6c 6c 20 65 76 61 6c 75 61  that will evalua
1c880 74 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45  te expression pE
1c890 78 70 72 20 61 6e 64 20 73 74 6f 72 65 20 74 68  xpr and store th
1c8a0 65 0a 2a 2a 20 72 65 73 75 6c 74 73 20 69 6e 20  e.** results in 
1c8b0 72 65 67 69 73 74 65 72 20 74 61 72 67 65 74 2e  register target.
1c8c0 20 20 54 68 65 20 72 65 73 75 6c 74 73 20 61 72    The results ar
1c8d0 65 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  e guaranteed to 
1c8e0 61 70 70 65 61 72 0a 2a 2a 20 69 6e 20 72 65 67  appear.** in reg
1c8f0 69 73 74 65 72 20 74 61 72 67 65 74 2e 20 20 49  ister target.  I
1c900 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
1c910 20 69 73 20 63 6f 6e 73 74 61 6e 74 2c 20 74 68   is constant, th
1c920 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  en this routine.
1c930 2a 2a 20 6d 69 67 68 74 20 63 68 6f 6f 73 65 20  ** might choose 
1c940 74 6f 20 63 6f 64 65 20 74 68 65 20 65 78 70 72  to code the expr
1c950 65 73 73 69 6f 6e 20 61 74 20 69 6e 69 74 69 61  ession at initia
1c960 6c 69 7a 61 74 69 6f 6e 20 74 69 6d 65 2e 0a 2a  lization time..*
1c970 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
1c980 70 72 43 6f 64 65 46 61 63 74 6f 72 61 62 6c 65  prCodeFactorable
1c990 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1c9a0 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74  Expr *pExpr, int
1c9b0 20 74 61 72 67 65 74 29 7b 0a 20 20 69 66 28 20   target){.  if( 
1c9c0 70 50 61 72 73 65 2d 3e 6f 6b 43 6f 6e 73 74 46  pParse->okConstF
1c9d0 61 63 74 6f 72 20 26 26 20 73 71 6c 69 74 65 33  actor && sqlite3
1c9e0 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70  ExprIsConstant(p
1c9f0 45 78 70 72 29 20 29 7b 0a 20 20 20 20 73 71 6c  Expr) ){.    sql
1ca00 69 74 65 33 45 78 70 72 43 6f 64 65 41 74 49 6e  ite3ExprCodeAtIn
1ca10 69 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  it(pParse, pExpr
1ca20 2c 20 74 61 72 67 65 74 2c 20 30 29 3b 0a 20 20  , target, 0);.  
1ca30 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
1ca40 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
1ca50 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65 74  e, pExpr, target
1ca60 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
1ca70 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
1ca80 61 74 20 65 76 61 6c 75 61 74 65 73 20 74 68 65  at evaluates the
1ca90 20 67 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f   given expressio
1caa0 6e 20 61 6e 64 20 70 75 74 73 20 74 68 65 20 72  n and puts the r
1cab0 65 73 75 6c 74 0a 2a 2a 20 69 6e 20 72 65 67 69  esult.** in regi
1cac0 73 74 65 72 20 74 61 72 67 65 74 2e 0a 2a 2a 0a  ster target..**.
1cad0 2a 2a 20 41 6c 73 6f 20 6d 61 6b 65 20 61 20 63  ** Also make a c
1cae0 6f 70 79 20 6f 66 20 74 68 65 20 65 78 70 72 65  opy of the expre
1caf0 73 73 69 6f 6e 20 72 65 73 75 6c 74 73 20 69 6e  ssion results in
1cb00 74 6f 20 61 6e 6f 74 68 65 72 20 22 63 61 63 68  to another "cach
1cb10 65 22 20 72 65 67 69 73 74 65 72 0a 2a 2a 20 61  e" register.** a
1cb20 6e 64 20 6d 6f 64 69 66 79 20 74 68 65 20 65 78  nd modify the ex
1cb30 70 72 65 73 73 69 6f 6e 20 73 6f 20 74 68 61 74  pression so that
1cb40 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65 20 69   the next time i
1cb50 74 20 69 73 20 65 76 61 6c 75 61 74 65 64 2c 0a  t is evaluated,.
1cb60 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 69 73  ** the result is
1cb70 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63   a copy of the c
1cb80 61 63 68 65 20 72 65 67 69 73 74 65 72 2e 0a 2a  ache register..*
1cb90 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1cba0 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 65 78  e is used for ex
1cbb0 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20 61  pressions that a
1cbc0 72 65 20 75 73 65 64 20 6d 75 6c 74 69 70 6c 65  re used multiple
1cbd0 20 0a 2a 2a 20 74 69 6d 65 73 2e 20 20 54 68 65   .** times.  The
1cbe0 79 20 61 72 65 20 65 76 61 6c 75 61 74 65 64 20  y are evaluated 
1cbf0 6f 6e 63 65 20 61 6e 64 20 74 68 65 20 72 65 73  once and the res
1cc00 75 6c 74 73 20 6f 66 20 74 68 65 20 65 78 70 72  ults of the expr
1cc10 65 73 73 69 6f 6e 0a 2a 2a 20 61 72 65 20 72 65  ession.** are re
1cc20 75 73 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  used..*/.void sq
1cc30 6c 69 74 65 33 45 78 70 72 43 6f 64 65 41 6e 64  lite3ExprCodeAnd
1cc40 43 61 63 68 65 28 50 61 72 73 65 20 2a 70 50 61  Cache(Parse *pPa
1cc50 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
1cc60 2c 20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a 20  , int target){. 
1cc70 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
1cc80 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
1cc90 69 4d 65 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28  iMem;..  assert(
1cca0 20 74 61 72 67 65 74 3e 30 20 29 3b 0a 20 20 61   target>0 );.  a
1ccb0 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
1ccc0 21 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29 3b  !=TK_REGISTER );
1ccd0 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  .  sqlite3ExprCo
1cce0 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
1ccf0 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 69 4d 65  , target);.  iMe
1cd00 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  m = ++pParse->nM
1cd10 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  em;.  sqlite3Vdb
1cd20 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f  eAddOp2(v, OP_Co
1cd30 70 79 2c 20 74 61 72 67 65 74 2c 20 69 4d 65 6d  py, target, iMem
1cd40 29 3b 0a 20 20 65 78 70 72 54 6f 52 65 67 69 73  );.  exprToRegis
1cd50 74 65 72 28 70 45 78 70 72 2c 20 69 4d 65 6d 29  ter(pExpr, iMem)
1cd60 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
1cd70 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 70 75  ate code that pu
1cd80 73 68 65 73 20 74 68 65 20 76 61 6c 75 65 20 6f  shes the value o
1cd90 66 20 65 76 65 72 79 20 65 6c 65 6d 65 6e 74 20  f every element 
1cda0 6f 66 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20  of the given.** 
1cdb0 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20  expression list 
1cdc0 69 6e 74 6f 20 61 20 73 65 71 75 65 6e 63 65 20  into a sequence 
1cdd0 6f 66 20 72 65 67 69 73 74 65 72 73 20 62 65 67  of registers beg
1cde0 69 6e 6e 69 6e 67 20 61 74 20 74 61 72 67 65 74  inning at target
1cdf0 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ..**.** Return t
1ce00 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65  he number of ele
1ce10 6d 65 6e 74 73 20 65 76 61 6c 75 61 74 65 64 2e  ments evaluated.
1ce20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c 49 54  .**.** The SQLIT
1ce30 45 5f 45 43 45 4c 5f 44 55 50 20 66 6c 61 67 20  E_ECEL_DUP flag 
1ce40 70 72 65 76 65 6e 74 73 20 74 68 65 20 61 72 67  prevents the arg
1ce50 75 6d 65 6e 74 73 20 66 72 6f 6d 20 62 65 69 6e  uments from bein
1ce60 67 0a 2a 2a 20 66 69 6c 6c 65 64 20 75 73 69 6e  g.** filled usin
1ce70 67 20 4f 50 5f 53 43 6f 70 79 2e 20 20 4f 50 5f  g OP_SCopy.  OP_
1ce80 43 6f 70 79 20 6d 75 73 74 20 62 65 20 75 73 65  Copy must be use
1ce90 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a  d instead..**.**
1cea0 20 54 68 65 20 53 51 4c 49 54 45 5f 45 43 45 4c   The SQLITE_ECEL
1ceb0 5f 46 41 43 54 4f 52 20 61 72 67 75 6d 65 6e 74  _FACTOR argument
1cec0 20 61 6c 6c 6f 77 73 20 63 6f 6e 73 74 61 6e 74   allows constant
1ced0 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 62 65   arguments to be
1cee0 0a 2a 2a 20 66 61 63 74 6f 72 65 64 20 6f 75 74  .** factored out
1cef0 20 69 6e 74 6f 20 69 6e 69 74 69 61 6c 69 7a 61   into initializa
1cf00 74 69 6f 6e 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a  tion code..**.**
1cf10 20 54 68 65 20 53 51 4c 49 54 45 5f 45 43 45 4c   The SQLITE_ECEL
1cf20 5f 52 45 46 20 66 6c 61 67 20 6d 65 61 6e 73 20  _REF flag means 
1cf30 74 68 61 74 20 65 78 70 72 65 73 73 69 6f 6e 73  that expressions
1cf40 20 69 6e 20 74 68 65 20 6c 69 73 74 20 77 69 74   in the list wit
1cf50 68 0a 2a 2a 20 45 78 70 72 4c 69 73 74 2e 61 5b  h.** ExprList.a[
1cf60 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f  ].u.x.iOrderByCo
1cf70 6c 3e 30 20 68 61 76 65 20 61 6c 72 65 61 64 79  l>0 have already
1cf80 20 62 65 65 6e 20 65 76 61 6c 75 61 74 65 64 20   been evaluated 
1cf90 61 6e 64 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e  and stored.** in
1cfa0 20 72 65 67 69 73 74 65 72 73 20 61 74 20 73 72   registers at sr
1cfb0 63 52 65 67 2c 20 61 6e 64 20 73 6f 20 74 68 65  cReg, and so the
1cfc0 20 76 61 6c 75 65 20 63 61 6e 20 62 65 20 63 6f   value can be co
1cfd0 70 69 65 64 20 66 72 6f 6d 20 74 68 65 72 65 2e  pied from there.
1cfe0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
1cff0 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28  xprCodeExprList(
1d000 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
1d010 2c 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67  ,     /* Parsing
1d020 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
1d030 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20  prList *pList,  
1d040 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69   /* The expressi
1d050 6f 6e 20 6c 69 73 74 20 74 6f 20 62 65 20 63 6f  on list to be co
1d060 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 74 61 72  ded */.  int tar
1d070 67 65 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 57  get,        /* W
1d080 68 65 72 65 20 74 6f 20 77 72 69 74 65 20 72 65  here to write re
1d090 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20 73  sults */.  int s
1d0a0 72 63 52 65 67 2c 20 20 20 20 20 20 20 20 2f 2a  rcReg,        /*
1d0b0 20 53 6f 75 72 63 65 20 72 65 67 69 73 74 65 72   Source register
1d0c0 73 20 69 66 20 53 51 4c 49 54 45 5f 45 43 45 4c  s if SQLITE_ECEL
1d0d0 5f 52 45 46 20 2a 2f 0a 20 20 75 38 20 66 6c 61  _REF */.  u8 fla
1d0e0 67 73 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  gs           /* 
1d0f0 53 51 4c 49 54 45 5f 45 43 45 4c 5f 2a 20 66 6c  SQLITE_ECEL_* fl
1d100 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75  ags */.){.  stru
1d110 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
1d120 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69   *pItem;.  int i
1d130 2c 20 6a 2c 20 6e 3b 0a 20 20 75 38 20 63 6f 70  , j, n;.  u8 cop
1d140 79 4f 70 20 3d 20 28 66 6c 61 67 73 20 26 20 53  yOp = (flags & S
1d150 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50 29 20  QLITE_ECEL_DUP) 
1d160 3f 20 4f 50 5f 43 6f 70 79 20 3a 20 4f 50 5f 53  ? OP_Copy : OP_S
1d170 43 6f 70 79 3b 0a 20 20 56 64 62 65 20 2a 76 20  Copy;.  Vdbe *v 
1d180 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
1d190 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74  .  assert( pList
1d1a0 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
1d1b0 20 74 61 72 67 65 74 3e 30 20 29 3b 0a 20 20 61   target>0 );.  a
1d1c0 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70  ssert( pParse->p
1d1d0 56 64 62 65 21 3d 30 20 29 3b 20 20 2f 2a 20 4e  Vdbe!=0 );  /* N
1d1e0 65 76 65 72 20 67 65 74 73 20 74 68 69 73 20 66  ever gets this f
1d1f0 61 72 20 6f 74 68 65 72 77 69 73 65 20 2a 2f 0a  ar otherwise */.
1d200 20 20 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78    n = pList->nEx
1d210 70 72 3b 0a 20 20 69 66 28 20 21 43 6f 6e 73 74  pr;.  if( !Const
1d220 46 61 63 74 6f 72 4f 6b 28 70 50 61 72 73 65 29  FactorOk(pParse)
1d230 20 29 20 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c   ) flags &= ~SQL
1d240 49 54 45 5f 45 43 45 4c 5f 46 41 43 54 4f 52 3b  ITE_ECEL_FACTOR;
1d250 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69  .  for(pItem=pLi
1d260 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 6e 3b  st->a, i=0; i<n;
1d270 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i++, pItem++){.
1d280 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20      Expr *pExpr 
1d290 3d 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a  = pItem->pExpr;.
1d2a0 20 20 20 20 69 66 28 20 28 66 6c 61 67 73 20 26      if( (flags &
1d2b0 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 52 45 46   SQLITE_ECEL_REF
1d2c0 29 21 3d 30 20 26 26 20 28 6a 20 3d 20 70 4c 69  )!=0 && (j = pLi
1d2d0 73 74 2d 3e 61 5b 69 5d 2e 75 2e 78 2e 69 4f 72  st->a[i].u.x.iOr
1d2e0 64 65 72 42 79 43 6f 6c 29 3e 30 20 29 7b 0a 20  derByCol)>0 ){. 
1d2f0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1d300 41 64 64 4f 70 32 28 76 2c 20 63 6f 70 79 4f 70  AddOp2(v, copyOp
1d310 2c 20 6a 2b 73 72 63 52 65 67 2d 31 2c 20 74 61  , j+srcReg-1, ta
1d320 72 67 65 74 2b 69 29 3b 0a 20 20 20 20 7d 65 6c  rget+i);.    }el
1d330 73 65 20 69 66 28 20 28 66 6c 61 67 73 20 26 20  se if( (flags & 
1d340 53 51 4c 49 54 45 5f 45 43 45 4c 5f 46 41 43 54  SQLITE_ECEL_FACT
1d350 4f 52 29 21 3d 30 20 26 26 20 73 71 6c 69 74 65  OR)!=0 && sqlite
1d360 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28  3ExprIsConstant(
1d370 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20  pExpr) ){.      
1d380 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 41  sqlite3ExprCodeA
1d390 74 49 6e 69 74 28 70 50 61 72 73 65 2c 20 70 45  tInit(pParse, pE
1d3a0 78 70 72 2c 20 74 61 72 67 65 74 2b 69 2c 20 30  xpr, target+i, 0
1d3b0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
1d3c0 20 20 20 20 69 6e 74 20 69 6e 52 65 67 20 3d 20      int inReg = 
1d3d0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
1d3e0 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 45  arget(pParse, pE
1d3f0 78 70 72 2c 20 74 61 72 67 65 74 2b 69 29 3b 0a  xpr, target+i);.
1d400 20 20 20 20 20 20 69 66 28 20 69 6e 52 65 67 21        if( inReg!
1d410 3d 74 61 72 67 65 74 2b 69 20 29 7b 0a 20 20 20  =target+i ){.   
1d420 20 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 70       VdbeOp *pOp
1d430 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 6f  ;.        if( co
1d440 70 79 4f 70 3d 3d 4f 50 5f 43 6f 70 79 0a 20 20  pyOp==OP_Copy.  
1d450 20 20 20 20 20 20 20 26 26 20 28 70 4f 70 3d 73         && (pOp=s
1d460 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28  qlite3VdbeGetOp(
1d470 76 2c 20 2d 31 29 29 2d 3e 6f 70 63 6f 64 65 3d  v, -1))->opcode=
1d480 3d 4f 50 5f 43 6f 70 79 0a 20 20 20 20 20 20 20  =OP_Copy.       
1d490 20 20 26 26 20 70 4f 70 2d 3e 70 31 2b 70 4f 70    && pOp->p1+pOp
1d4a0 2d 3e 70 33 2b 31 3d 3d 69 6e 52 65 67 0a 20 20  ->p3+1==inReg.  
1d4b0 20 20 20 20 20 20 20 26 26 20 70 4f 70 2d 3e 70         && pOp->p
1d4c0 32 2b 70 4f 70 2d 3e 70 33 2b 31 3d 3d 74 61 72  2+pOp->p3+1==tar
1d4d0 67 65 74 2b 69 0a 20 20 20 20 20 20 20 20 29 7b  get+i.        ){
1d4e0 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e  .          pOp->
1d4f0 70 33 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 65  p3++;.        }e
1d500 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73  lse{.          s
1d510 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1d520 28 76 2c 20 63 6f 70 79 4f 70 2c 20 69 6e 52 65  (v, copyOp, inRe
1d530 67 2c 20 74 61 72 67 65 74 2b 69 29 3b 0a 20 20  g, target+i);.  
1d540 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1d550 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
1d560 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  rn n;.}../*.** G
1d570 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
1d580 20 61 20 42 45 54 57 45 45 4e 20 6f 70 65 72 61   a BETWEEN opera
1d590 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 78 20  tor..**.**    x 
1d5a0 42 45 54 57 45 45 4e 20 79 20 41 4e 44 20 7a 0a  BETWEEN y AND z.
1d5b0 2a 2a 0a 2a 2a 20 54 68 65 20 61 62 6f 76 65 20  **.** The above 
1d5c0 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f  is equivalent to
1d5d0 20 0a 2a 2a 0a 2a 2a 20 20 20 20 78 3e 3d 79 20   .**.**    x>=y 
1d5e0 41 4e 44 20 78 3c 3d 7a 0a 2a 2a 0a 2a 2a 20 43  AND x<=z.**.** C
1d5f0 6f 64 65 20 69 74 20 61 73 20 73 75 63 68 2c 20  ode it as such, 
1d600 74 61 6b 69 6e 67 20 63 61 72 65 20 74 6f 20 64  taking care to d
1d610 6f 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 73 75 62  o the common sub
1d620 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 65 6c  expression.** el
1d630 69 6d 69 6e 61 74 69 6f 6e 20 6f 66 20 78 2e 0a  imination of x..
1d640 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
1d650 78 70 72 43 6f 64 65 42 65 74 77 65 65 6e 28 0a  xprCodeBetween(.
1d660 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
1d670 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61      /* Parsing a
1d680 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69  nd code generati
1d690 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
1d6a0 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20  Expr *pExpr,    
1d6b0 20 20 2f 2a 20 54 68 65 20 42 45 54 57 45 45 4e    /* The BETWEEN
1d6c0 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20   expression */. 
1d6d0 20 69 6e 74 20 64 65 73 74 2c 20 20 20 20 20 20   int dest,      
1d6e0 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20     /* Jump here 
1d6f0 69 66 20 74 68 65 20 6a 75 6d 70 20 69 73 20 74  if the jump is t
1d700 61 6b 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6a 75  aken */.  int ju
1d710 6d 70 49 66 54 72 75 65 2c 20 20 20 2f 2a 20 54  mpIfTrue,   /* T
1d720 61 6b 65 20 74 68 65 20 6a 75 6d 70 20 69 66 20  ake the jump if 
1d730 74 68 65 20 42 45 54 57 45 45 4e 20 69 73 20 74  the BETWEEN is t
1d740 72 75 65 20 2a 2f 0a 20 20 69 6e 74 20 6a 75 6d  rue */.  int jum
1d750 70 49 66 4e 75 6c 6c 20 20 20 20 2f 2a 20 54 61  pIfNull    /* Ta
1d760 6b 65 20 74 68 65 20 6a 75 6d 70 20 69 66 20 74  ke the jump if t
1d770 68 65 20 42 45 54 57 45 45 4e 20 69 73 20 4e 55  he BETWEEN is NU
1d780 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20  LL */.){.  Expr 
1d790 65 78 70 72 41 6e 64 3b 20 20 20 20 20 2f 2a 20  exprAnd;     /* 
1d7a0 54 68 65 20 41 4e 44 20 6f 70 65 72 61 74 6f 72  The AND operator
1d7b0 20 69 6e 20 20 78 3e 3d 79 20 41 4e 44 20 78 3c   in  x>=y AND x<
1d7c0 3d 7a 20 20 2a 2f 0a 20 20 45 78 70 72 20 63 6f  =z  */.  Expr co
1d7d0 6d 70 4c 65 66 74 3b 20 20 20 20 2f 2a 20 54 68  mpLeft;    /* Th
1d7e0 65 20 20 78 3e 3d 79 20 20 74 65 72 6d 20 2a 2f  e  x>=y  term */
1d7f0 0a 20 20 45 78 70 72 20 63 6f 6d 70 52 69 67 68  .  Expr compRigh
1d800 74 3b 20 20 20 2f 2a 20 54 68 65 20 20 78 3c 3d  t;   /* The  x<=
1d810 7a 20 20 74 65 72 6d 20 2a 2f 0a 20 20 45 78 70  z  term */.  Exp
1d820 72 20 65 78 70 72 58 3b 20 20 20 20 20 20 20 2f  r exprX;       /
1d830 2a 20 54 68 65 20 20 78 20 20 73 75 62 65 78 70  * The  x  subexp
1d840 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  ression */.  int
1d850 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b 20 2f   regFree1 = 0; /
1d860 2a 20 54 65 6d 70 6f 72 61 72 79 20 75 73 65 20  * Temporary use 
1d870 72 65 67 69 73 74 65 72 20 2a 2f 0a 0a 20 20 61  register */..  a
1d880 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
1d890 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
1d8a0 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a  P_xIsSelect) );.
1d8b0 20 20 65 78 70 72 58 20 3d 20 2a 70 45 78 70 72    exprX = *pExpr
1d8c0 2d 3e 70 4c 65 66 74 3b 0a 20 20 65 78 70 72 41  ->pLeft;.  exprA
1d8d0 6e 64 2e 6f 70 20 3d 20 54 4b 5f 41 4e 44 3b 0a  nd.op = TK_AND;.
1d8e0 20 20 65 78 70 72 41 6e 64 2e 70 4c 65 66 74 20    exprAnd.pLeft 
1d8f0 3d 20 26 63 6f 6d 70 4c 65 66 74 3b 0a 20 20 65  = &compLeft;.  e
1d900 78 70 72 41 6e 64 2e 70 52 69 67 68 74 20 3d 20  xprAnd.pRight = 
1d910 26 63 6f 6d 70 52 69 67 68 74 3b 0a 20 20 63 6f  &compRight;.  co
1d920 6d 70 4c 65 66 74 2e 6f 70 20 3d 20 54 4b 5f 47  mpLeft.op = TK_G
1d930 45 3b 0a 20 20 63 6f 6d 70 4c 65 66 74 2e 70 4c  E;.  compLeft.pL
1d940 65 66 74 20 3d 20 26 65 78 70 72 58 3b 0a 20 20  eft = &exprX;.  
1d950 63 6f 6d 70 4c 65 66 74 2e 70 52 69 67 68 74 20  compLeft.pRight 
1d960 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  = pExpr->x.pList
1d970 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[0].pExpr;.  
1d980 63 6f 6d 70 52 69 67 68 74 2e 6f 70 20 3d 20 54  compRight.op = T
1d990 4b 5f 4c 45 3b 0a 20 20 63 6f 6d 70 52 69 67 68  K_LE;.  compRigh
1d9a0 74 2e 70 4c 65 66 74 20 3d 20 26 65 78 70 72 58  t.pLeft = &exprX
1d9b0 3b 0a 20 20 63 6f 6d 70 52 69 67 68 74 2e 70 52  ;.  compRight.pR
1d9c0 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e  ight = pExpr->x.
1d9d0 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70  pList->a[1].pExp
1d9e0 72 3b 0a 20 20 65 78 70 72 54 6f 52 65 67 69 73  r;.  exprToRegis
1d9f0 74 65 72 28 26 65 78 70 72 58 2c 20 73 71 6c 69  ter(&exprX, sqli
1da00 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
1da10 70 50 61 72 73 65 2c 20 26 65 78 70 72 58 2c 20  pParse, &exprX, 
1da20 26 72 65 67 46 72 65 65 31 29 29 3b 0a 20 20 69  &regFree1));.  i
1da30 66 28 20 6a 75 6d 70 49 66 54 72 75 65 20 29 7b  f( jumpIfTrue ){
1da40 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
1da50 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 26  IfTrue(pParse, &
1da60 65 78 70 72 41 6e 64 2c 20 64 65 73 74 2c 20 6a  exprAnd, dest, j
1da70 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 7d 65  umpIfNull);.  }e
1da80 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
1da90 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
1daa0 73 65 2c 20 26 65 78 70 72 41 6e 64 2c 20 64 65  se, &exprAnd, de
1dab0 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
1dac0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65  .  }.  sqlite3Re
1dad0 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
1dae0 72 73 65 2c 20 72 65 67 46 72 65 65 31 29 3b 0a  rse, regFree1);.
1daf0 0a 20 20 2f 2a 20 45 6e 73 75 72 65 20 61 64 65  .  /* Ensure ade
1db00 71 75 61 74 65 20 74 65 73 74 20 63 6f 76 65 72  quate test cover
1db10 61 67 65 20 2a 2f 0a 20 20 74 65 73 74 63 61 73  age */.  testcas
1db20 65 28 20 6a 75 6d 70 49 66 54 72 75 65 3d 3d 30  e( jumpIfTrue==0
1db30 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d   && jumpIfNull==
1db40 30 20 26 26 20 72 65 67 46 72 65 65 31 3d 3d 30  0 && regFree1==0
1db50 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
1db60 6a 75 6d 70 49 66 54 72 75 65 3d 3d 30 20 26 26  jumpIfTrue==0 &&
1db70 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 26   jumpIfNull==0 &
1db80 26 20 72 65 67 46 72 65 65 31 21 3d 30 20 29 3b  & regFree1!=0 );
1db90 0a 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d  .  testcase( jum
1dba0 70 49 66 54 72 75 65 3d 3d 30 20 26 26 20 6a 75  pIfTrue==0 && ju
1dbb0 6d 70 49 66 4e 75 6c 6c 21 3d 30 20 26 26 20 72  mpIfNull!=0 && r
1dbc0 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
1dbd0 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
1dbe0 54 72 75 65 3d 3d 30 20 26 26 20 6a 75 6d 70 49  True==0 && jumpI
1dbf0 66 4e 75 6c 6c 21 3d 30 20 26 26 20 72 65 67 46  fNull!=0 && regF
1dc00 72 65 65 31 21 3d 30 20 29 3b 0a 20 20 74 65 73  ree1!=0 );.  tes
1dc10 74 63 61 73 65 28 20 6a 75 6d 70 49 66 54 72 75  tcase( jumpIfTru
1dc20 65 21 3d 30 20 26 26 20 6a 75 6d 70 49 66 4e 75  e!=0 && jumpIfNu
1dc30 6c 6c 3d 3d 30 20 26 26 20 72 65 67 46 72 65 65  ll==0 && regFree
1dc40 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61  1==0 );.  testca
1dc50 73 65 28 20 6a 75 6d 70 49 66 54 72 75 65 21 3d  se( jumpIfTrue!=
1dc60 30 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  0 && jumpIfNull=
1dc70 3d 30 20 26 26 20 72 65 67 46 72 65 65 31 21 3d  =0 && regFree1!=
1dc80 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  0 );.  testcase(
1dc90 20 6a 75 6d 70 49 66 54 72 75 65 21 3d 30 20 26   jumpIfTrue!=0 &
1dca0 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 20  & jumpIfNull!=0 
1dcb0 26 26 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  && regFree1==0 )
1dcc0 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6a 75  ;.  testcase( ju
1dcd0 6d 70 49 66 54 72 75 65 21 3d 30 20 26 26 20 6a  mpIfTrue!=0 && j
1dce0 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 20 26 26 20  umpIfNull!=0 && 
1dcf0 72 65 67 46 72 65 65 31 21 3d 30 20 29 3b 0a 7d  regFree1!=0 );.}
1dd00 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
1dd10 20 63 6f 64 65 20 66 6f 72 20 61 20 62 6f 6f 6c   code for a bool
1dd20 65 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 73  ean expression s
1dd30 75 63 68 20 74 68 61 74 20 61 20 6a 75 6d 70 20  uch that a jump 
1dd40 69 73 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 74 68  is made.** to th
1dd50 65 20 6c 61 62 65 6c 20 22 64 65 73 74 22 20 69  e label "dest" i
1dd60 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
1dd70 20 69 73 20 74 72 75 65 20 62 75 74 20 65 78 65   is true but exe
1dd80 63 75 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e  cution.** contin
1dd90 75 65 73 20 73 74 72 61 69 67 68 74 20 74 68 72  ues straight thr
1dda0 75 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  u if the express
1ddb0 69 6f 6e 20 69 73 20 66 61 6c 73 65 2e 0a 2a 2a  ion is false..**
1ddc0 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65  .** If the expre
1ddd0 73 73 69 6f 6e 20 65 76 61 6c 75 61 74 65 73 20  ssion evaluates 
1dde0 74 6f 20 4e 55 4c 4c 20 28 6e 65 69 74 68 65 72  to NULL (neither
1ddf0 20 74 72 75 65 20 6e 6f 72 20 66 61 6c 73 65 29   true nor false)
1de00 2c 20 74 68 65 6e 0a 2a 2a 20 74 61 6b 65 20 74  , then.** take t
1de10 68 65 20 6a 75 6d 70 20 69 66 20 74 68 65 20 6a  he jump if the j
1de20 75 6d 70 49 66 4e 75 6c 6c 20 66 6c 61 67 20 69  umpIfNull flag i
1de30 73 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  s SQLITE_JUMPIFN
1de40 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ULL..**.** This 
1de50 63 6f 64 65 20 64 65 70 65 6e 64 73 20 6f 6e 20  code depends on 
1de60 74 68 65 20 66 61 63 74 20 74 68 61 74 20 63 65  the fact that ce
1de70 72 74 61 69 6e 20 74 6f 6b 65 6e 20 76 61 6c 75  rtain token valu
1de80 65 73 20 28 65 78 3a 20 54 4b 5f 45 51 29 0a 2a  es (ex: TK_EQ).*
1de90 2a 20 61 72 65 20 74 68 65 20 73 61 6d 65 20 61  * are the same a
1dea0 73 20 6f 70 63 6f 64 65 20 76 61 6c 75 65 73 20  s opcode values 
1deb0 28 65 78 3a 20 4f 50 5f 45 71 29 20 74 68 61 74  (ex: OP_Eq) that
1dec0 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 63   implement the c
1ded0 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20  orresponding.** 
1dee0 6f 70 65 72 61 74 69 6f 6e 2e 20 20 53 70 65 63  operation.  Spec
1def0 69 61 6c 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20  ial comments in 
1df00 76 64 62 65 2e 63 20 61 6e 64 20 74 68 65 20 6d  vdbe.c and the m
1df10 6b 6f 70 63 6f 64 65 68 2e 61 77 6b 20 73 63 72  kopcodeh.awk scr
1df20 69 70 74 20 69 6e 0a 2a 2a 20 74 68 65 20 6d 61  ipt in.** the ma
1df30 6b 65 20 70 72 6f 63 65 73 73 20 63 61 75 73 65  ke process cause
1df40 20 74 68 65 73 65 20 76 61 6c 75 65 73 20 74 6f   these values to
1df50 20 61 6c 69 67 6e 2e 20 20 41 73 73 65 72 74 28   align.  Assert(
1df60 29 73 20 69 6e 20 74 68 65 20 63 6f 64 65 0a 2a  )s in the code.*
1df70 2a 20 62 65 6c 6f 77 20 76 65 72 69 66 79 20 74  * below verify t
1df80 68 61 74 20 74 68 65 20 6e 75 6d 62 65 72 73 20  hat the numbers 
1df90 61 72 65 20 61 6c 69 67 6e 65 64 20 63 6f 72 72  are aligned corr
1dfa0 65 63 74 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ectly..*/.void s
1dfb0 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65  qlite3ExprIfTrue
1dfc0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1dfd0 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74  Expr *pExpr, int
1dfe0 20 64 65 73 74 2c 20 69 6e 74 20 6a 75 6d 70 49   dest, int jumpI
1dff0 66 4e 75 6c 6c 29 7b 0a 20 20 56 64 62 65 20 2a  fNull){.  Vdbe *
1e000 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
1e010 65 3b 0a 20 20 69 6e 74 20 6f 70 20 3d 20 30 3b  e;.  int op = 0;
1e020 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65 31 20  .  int regFree1 
1e030 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 67 46 72  = 0;.  int regFr
1e040 65 65 32 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  ee2 = 0;.  int r
1e050 31 2c 20 72 32 3b 0a 0a 20 20 61 73 73 65 72 74  1, r2;..  assert
1e060 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51  ( jumpIfNull==SQ
1e070 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20  LITE_JUMPIFNULL 
1e080 7c 7c 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  || jumpIfNull==0
1e090 20 29 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28   );.  if( NEVER(
1e0a0 76 3d 3d 30 29 20 29 20 20 20 20 20 72 65 74 75  v==0) )     retu
1e0b0 72 6e 3b 20 20 2f 2a 20 45 78 69 73 74 65 6e 63  rn;  /* Existenc
1e0c0 65 20 6f 66 20 56 44 42 45 20 63 68 65 63 6b 65  e of VDBE checke
1e0d0 64 20 62 79 20 63 61 6c 6c 65 72 20 2a 2f 0a 20  d by caller */. 
1e0e0 20 69 66 28 20 4e 45 56 45 52 28 70 45 78 70 72   if( NEVER(pExpr
1e0f0 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 3b 20 20  ==0) ) return;  
1e100 2f 2a 20 4e 6f 20 77 61 79 20 74 68 69 73 20 63  /* No way this c
1e110 61 6e 20 68 61 70 70 65 6e 20 2a 2f 0a 20 20 6f  an happen */.  o
1e120 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20  p = pExpr->op;. 
1e130 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20   switch( op ){. 
1e140 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20     case TK_AND: 
1e150 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 32 20 3d  {.      int d2 =
1e160 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
1e170 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
1e180 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
1e190 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Null==0 );.     
1e1a0 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
1e1b0 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  lse(pParse, pExp
1e1c0 72 2d 3e 70 4c 65 66 74 2c 20 64 32 2c 6a 75 6d  r->pLeft, d2,jum
1e1d0 70 49 66 4e 75 6c 6c 5e 53 51 4c 49 54 45 5f 4a  pIfNull^SQLITE_J
1e1e0 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20  UMPIFNULL);.    
1e1f0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
1e200 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a  hePush(pParse);.
1e210 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1e220 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20  rIfTrue(pParse, 
1e230 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64  pExpr->pRight, d
1e240 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
1e250 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1e260 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
1e270 76 2c 20 64 32 29 3b 0a 20 20 20 20 20 20 73 71  v, d2);.      sq
1e280 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f  lite3ExprCachePo
1e290 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  p(pParse);.     
1e2a0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1e2b0 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a    case TK_OR: {.
1e2c0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1e2d0 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
1e2e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1e2f0 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c  prIfTrue(pParse,
1e300 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64   pExpr->pLeft, d
1e310 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
1e320 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1e330 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61  xprCachePush(pPa
1e340 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  rse);.      sqli
1e350 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50  te3ExprIfTrue(pP
1e360 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69  arse, pExpr->pRi
1e370 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49  ght, dest, jumpI
1e380 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71  fNull);.      sq
1e390 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f  lite3ExprCachePo
1e3a0 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  p(pParse);.     
1e3b0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1e3c0 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b    case TK_NOT: {
1e3d0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1e3e0 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
1e3f0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1e400 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
1e410 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
1e420 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
1e430 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  l);.      break;
1e440 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1e450 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65 20  TK_LT:.    case 
1e460 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_LE:.    case 
1e470 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65 20  TK_GT:.    case 
1e480 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_GE:.    case 
1e490 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_NE:.    case 
1e4a0 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20 74  TK_EQ: {.      t
1e4b0 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e  estcase( jumpIfN
1e4c0 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ull==0 );.      
1e4d0 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
1e4e0 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
1e4f0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26   pExpr->pLeft, &
1e500 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
1e510 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r2 = sqlite3Exp
1e520 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
1e530 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
1e540 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20   &regFree2);.   
1e550 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70     codeCompare(p
1e560 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
1e570 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  eft, pExpr->pRig
1e580 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20 20  ht, op,.        
1e590 20 20 20 20 20 20 20 20 20 20 72 31 2c 20 72 32            r1, r2
1e5a0 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
1e5b0 6c 6c 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ll);.      asser
1e5c0 74 28 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 29 3b  t(TK_LT==OP_Lt);
1e5d0 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50   testcase(op==OP
1e5e0 5f 4c 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61  _Lt); VdbeCovera
1e5f0 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 74  geIf(v,op==OP_Lt
1e600 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1e610 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 29 3b 20 74  TK_LE==OP_Le); t
1e620 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c  estcase(op==OP_L
1e630 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  e); VdbeCoverage
1e640 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 65 29 3b  If(v,op==OP_Le);
1e650 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b  .      assert(TK
1e660 5f 47 54 3d 3d 4f 50 5f 47 74 29 3b 20 74 65 73  _GT==OP_Gt); tes
1e670 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 74 29  tcase(op==OP_Gt)
1e680 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66  ; VdbeCoverageIf
1e690 28 76 2c 6f 70 3d 3d 4f 50 5f 47 74 29 3b 0a 20  (v,op==OP_Gt);. 
1e6a0 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 47       assert(TK_G
1e6b0 45 3d 3d 4f 50 5f 47 65 29 3b 20 74 65 73 74 63  E==OP_Ge); testc
1e6c0 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 65 29 3b 20  ase(op==OP_Ge); 
1e6d0 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
1e6e0 2c 6f 70 3d 3d 4f 50 5f 47 65 29 3b 0a 20 20 20  ,op==OP_Ge);.   
1e6f0 20 20 20 61 73 73 65 72 74 28 54 4b 5f 45 51 3d     assert(TK_EQ=
1e700 3d 4f 50 5f 45 71 29 3b 20 74 65 73 74 63 61 73  =OP_Eq); testcas
1e710 65 28 6f 70 3d 3d 4f 50 5f 45 71 29 3b 20 56 64  e(op==OP_Eq); Vd
1e720 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f  beCoverageIf(v,o
1e730 70 3d 3d 4f 50 5f 45 71 29 3b 0a 20 20 20 20 20  p==OP_Eq);.     
1e740 20 61 73 73 65 72 74 28 54 4b 5f 4e 45 3d 3d 4f   assert(TK_NE==O
1e750 50 5f 4e 65 29 3b 20 74 65 73 74 63 61 73 65 28  P_Ne); testcase(
1e760 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 20 56 64 62 65  op==OP_Ne); Vdbe
1e770 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d  CoverageIf(v,op=
1e780 3d 4f 50 5f 4e 65 29 3b 0a 20 20 20 20 20 20 74  =OP_Ne);.      t
1e790 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
1e7a0 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65  1==0 );.      te
1e7b0 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 32  stcase( regFree2
1e7c0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  ==0 );.      bre
1e7d0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
1e7e0 73 65 20 54 4b 5f 49 53 3a 0a 20 20 20 20 63 61  se TK_IS:.    ca
1e7f0 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 20 7b 0a 20  se TK_ISNOT: {. 
1e800 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
1e810 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20 20 20 20  p==TK_IS );.    
1e820 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1e830 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20 20 20 20  TK_ISNOT );.    
1e840 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78    r1 = sqlite3Ex
1e850 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
1e860 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
1e870 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20   &regFree1);.   
1e880 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45     r2 = sqlite3E
1e890 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
1e8a0 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
1e8b0 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20  t, &regFree2);. 
1e8c0 20 20 20 20 20 6f 70 20 3d 20 28 6f 70 3d 3d 54       op = (op==T
1e8d0 4b 5f 49 53 29 20 3f 20 54 4b 5f 45 51 20 3a 20  K_IS) ? TK_EQ : 
1e8e0 54 4b 5f 4e 45 3b 0a 20 20 20 20 20 20 63 6f 64  TK_NE;.      cod
1e8f0 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c  eCompare(pParse,
1e900 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70   pExpr->pLeft, p
1e910 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70  Expr->pRight, op
1e920 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1e930 20 20 20 20 72 31 2c 20 72 32 2c 20 64 65 73 74      r1, r2, dest
1e940 2c 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29  , SQLITE_NULLEQ)
1e950 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
1e960 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b  rageIf(v, op==TK
1e970 5f 45 51 29 3b 0a 20 20 20 20 20 20 56 64 62 65  _EQ);.      Vdbe
1e980 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70  CoverageIf(v, op
1e990 3d 3d 54 4b 5f 4e 45 29 3b 0a 20 20 20 20 20 20  ==TK_NE);.      
1e9a0 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
1e9b0 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74  e1==0 );.      t
1e9c0 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
1e9d0 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72  2==0 );.      br
1e9e0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
1e9f0 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20  ase TK_ISNULL:. 
1ea00 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55     case TK_NOTNU
1ea10 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  LL: {.      asse
1ea20 72 74 28 20 54 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f  rt( TK_ISNULL==O
1ea30 50 5f 49 73 4e 75 6c 6c 20 29 3b 20 20 20 74 65  P_IsNull );   te
1ea40 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49  stcase( op==TK_I
1ea50 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 61  SNULL );.      a
1ea60 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54 4e 55 4c  ssert( TK_NOTNUL
1ea70 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b  L==OP_NotNull );
1ea80 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
1ea90 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 0a 20 20 20  K_NOTNULL );.   
1eaa0 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
1eab0 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
1eac0 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
1ead0 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20  , &regFree1);.  
1eae0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1eaf0 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20 72 31 2c  ddOp2(v, op, r1,
1eb00 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 56 64   dest);.      Vd
1eb10 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
1eb20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 29 3b 0a  op==TK_ISNULL);.
1eb30 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
1eb40 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4e  geIf(v, op==TK_N
1eb50 4f 54 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 74  OTNULL);.      t
1eb60 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
1eb70 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72  1==0 );.      br
1eb80 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
1eb90 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20  ase TK_BETWEEN: 
1eba0 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
1ebb0 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  ( jumpIfNull==0 
1ebc0 29 3b 0a 20 20 20 20 20 20 65 78 70 72 43 6f 64  );.      exprCod
1ebd0 65 42 65 74 77 65 65 6e 28 70 50 61 72 73 65 2c  eBetween(pParse,
1ebe0 20 70 45 78 70 72 2c 20 64 65 73 74 2c 20 31 2c   pExpr, dest, 1,
1ebf0 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
1ec00 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1ec10 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1ec20 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
1ec30 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a    case TK_IN: {.
1ec40 20 20 20 20 20 20 69 6e 74 20 64 65 73 74 49 66        int destIf
1ec50 46 61 6c 73 65 20 3d 20 73 71 6c 69 74 65 33 56  False = sqlite3V
1ec60 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
1ec70 0a 20 20 20 20 20 20 69 6e 74 20 64 65 73 74 49  .      int destI
1ec80 66 4e 75 6c 6c 20 3d 20 6a 75 6d 70 49 66 4e 75  fNull = jumpIfNu
1ec90 6c 6c 20 3f 20 64 65 73 74 20 3a 20 64 65 73 74  ll ? dest : dest
1eca0 49 66 46 61 6c 73 65 3b 0a 20 20 20 20 20 20 73  IfFalse;.      s
1ecb0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e  qlite3ExprCodeIN
1ecc0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
1ecd0 64 65 73 74 49 66 46 61 6c 73 65 2c 20 64 65 73  destIfFalse, des
1ece0 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  tIfNull);.      
1ecf0 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28  sqlite3VdbeGoto(
1ed00 76 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20  v, dest);.      
1ed10 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
1ed20 76 65 4c 61 62 65 6c 28 76 2c 20 64 65 73 74 49  veLabel(v, destI
1ed30 66 46 61 6c 73 65 29 3b 0a 20 20 20 20 20 20 62  fFalse);.      b
1ed40 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
1ed50 69 66 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20  if.    default: 
1ed60 7b 0a 20 20 20 20 20 20 69 66 28 20 65 78 70 72  {.      if( expr
1ed70 41 6c 77 61 79 73 54 72 75 65 28 70 45 78 70 72  AlwaysTrue(pExpr
1ed80 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ) ){.        sql
1ed90 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20  ite3VdbeGoto(v, 
1eda0 64 65 73 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c  dest);.      }el
1edb0 73 65 20 69 66 28 20 65 78 70 72 41 6c 77 61 79  se if( exprAlway
1edc0 73 46 61 6c 73 65 28 70 45 78 70 72 29 20 29 7b  sFalse(pExpr) ){
1edd0 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 2d 6f  .        /* No-o
1ede0 70 20 2a 2f 0a 20 20 20 20 20 20 7d 65 6c 73 65  p */.      }else
1edf0 7b 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20 73  {.        r1 = s
1ee00 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
1ee10 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
1ee20 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20  , &regFree1);.  
1ee30 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1ee40 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66  eAddOp3(v, OP_If
1ee50 2c 20 72 31 2c 20 64 65 73 74 2c 20 6a 75 6d 70  , r1, dest, jump
1ee60 49 66 4e 75 6c 6c 21 3d 30 29 3b 0a 20 20 20 20  IfNull!=0);.    
1ee70 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
1ee80 28 76 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  (v);.        tes
1ee90 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
1eea0 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65  =0 );.        te
1eeb0 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75  stcase( jumpIfNu
1eec0 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d  ll==0 );.      }
1eed0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1eee0 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
1eef0 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
1ef00 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 31  pParse, regFree1
1ef10 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65  );.  sqlite3Rele
1ef20 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
1ef30 65 2c 20 72 65 67 46 72 65 65 32 29 3b 20 20 0a  e, regFree2);  .
1ef40 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
1ef50 65 20 63 6f 64 65 20 66 6f 72 20 61 20 62 6f 6f  e code for a boo
1ef60 6c 65 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  lean expression 
1ef70 73 75 63 68 20 74 68 61 74 20 61 20 6a 75 6d 70  such that a jump
1ef80 20 69 73 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 74   is made.** to t
1ef90 68 65 20 6c 61 62 65 6c 20 22 64 65 73 74 22 20  he label "dest" 
1efa0 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
1efb0 6e 20 69 73 20 66 61 6c 73 65 20 62 75 74 20 65  n is false but e
1efc0 78 65 63 75 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74  xecution.** cont
1efd0 69 6e 75 65 73 20 73 74 72 61 69 67 68 74 20 74  inues straight t
1efe0 68 72 75 20 69 66 20 74 68 65 20 65 78 70 72 65  hru if the expre
1eff0 73 73 69 6f 6e 20 69 73 20 74 72 75 65 2e 0a 2a  ssion is true..*
1f000 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72  *.** If the expr
1f010 65 73 73 69 6f 6e 20 65 76 61 6c 75 61 74 65 73  ession evaluates
1f020 20 74 6f 20 4e 55 4c 4c 20 28 6e 65 69 74 68 65   to NULL (neithe
1f030 72 20 74 72 75 65 20 6e 6f 72 20 66 61 6c 73 65  r true nor false
1f040 29 20 74 68 65 6e 0a 2a 2a 20 6a 75 6d 70 20 69  ) then.** jump i
1f050 66 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 69 73 20  f jumpIfNull is 
1f060 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
1f070 4c 20 6f 72 20 66 61 6c 6c 20 74 68 72 6f 75 67  L or fall throug
1f080 68 20 69 66 20 6a 75 6d 70 49 66 4e 75 6c 6c 0a  h if jumpIfNull.
1f090 2a 2a 20 69 73 20 30 2e 0a 2a 2f 0a 76 6f 69 64  ** is 0..*/.void
1f0a0 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
1f0b0 6c 73 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  lse(Parse *pPars
1f0c0 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  e, Expr *pExpr, 
1f0d0 69 6e 74 20 64 65 73 74 2c 20 69 6e 74 20 6a 75  int dest, int ju
1f0e0 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 56 64 62  mpIfNull){.  Vdb
1f0f0 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
1f100 56 64 62 65 3b 0a 20 20 69 6e 74 20 6f 70 20 3d  Vdbe;.  int op =
1f110 20 30 3b 0a 20 20 69 6e 74 20 72 65 67 46 72 65   0;.  int regFre
1f120 65 31 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65  e1 = 0;.  int re
1f130 67 46 72 65 65 32 20 3d 20 30 3b 0a 20 20 69 6e  gFree2 = 0;.  in
1f140 74 20 72 31 2c 20 72 32 3b 0a 0a 20 20 61 73 73  t r1, r2;..  ass
1f150 65 72 74 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  ert( jumpIfNull=
1f160 3d 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55  =SQLITE_JUMPIFNU
1f170 4c 4c 20 7c 7c 20 6a 75 6d 70 49 66 4e 75 6c 6c  LL || jumpIfNull
1f180 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 4e 45 56  ==0 );.  if( NEV
1f190 45 52 28 76 3d 3d 30 29 20 29 20 72 65 74 75 72  ER(v==0) ) retur
1f1a0 6e 3b 20 2f 2a 20 45 78 69 73 74 65 6e 63 65 20  n; /* Existence 
1f1b0 6f 66 20 56 44 42 45 20 63 68 65 63 6b 65 64 20  of VDBE checked 
1f1c0 62 79 20 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 69  by caller */.  i
1f1d0 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20 20 20  f( pExpr==0 )   
1f1e0 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 54   return;..  /* T
1f1f0 68 65 20 76 61 6c 75 65 20 6f 66 20 70 45 78 70  he value of pExp
1f200 72 2d 3e 6f 70 20 61 6e 64 20 6f 70 20 61 72 65  r->op and op are
1f210 20 72 65 6c 61 74 65 64 20 61 73 20 66 6f 6c 6c   related as foll
1f220 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  ows:.  **.  **  
1f230 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 20       pExpr->op  
1f240 20 20 20 20 20 20 20 20 20 20 6f 70 0a 20 20 2a            op.  *
1f250 2a 20 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d  *       --------
1f260 2d 20 20 20 20 20 20 20 20 20 20 2d 2d 2d 2d 2d  -          -----
1f270 2d 2d 2d 2d 2d 0a 20 20 2a 2a 20 20 20 20 20 20  -----.  **      
1f280 20 54 4b 5f 49 53 4e 55 4c 4c 20 20 20 20 20 20   TK_ISNULL      
1f290 20 20 20 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 0a 20      OP_NotNull. 
1f2a0 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4e 4f 54   **       TK_NOT
1f2b0 4e 55 4c 4c 20 20 20 20 20 20 20 20 20 4f 50 5f  NULL         OP_
1f2c0 49 73 4e 75 6c 6c 0a 20 20 2a 2a 20 20 20 20 20  IsNull.  **     
1f2d0 20 20 54 4b 5f 4e 45 20 20 20 20 20 20 20 20 20    TK_NE         
1f2e0 20 20 20 20 20 4f 50 5f 45 71 0a 20 20 2a 2a 20       OP_Eq.  ** 
1f2f0 20 20 20 20 20 20 54 4b 5f 45 51 20 20 20 20 20        TK_EQ     
1f300 20 20 20 20 20 20 20 20 20 4f 50 5f 4e 65 0a 20           OP_Ne. 
1f310 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 47 54 20   **       TK_GT 
1f320 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f               OP_
1f330 4c 65 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b  Le.  **       TK
1f340 5f 4c 45 20 20 20 20 20 20 20 20 20 20 20 20 20  _LE             
1f350 20 4f 50 5f 47 74 0a 20 20 2a 2a 20 20 20 20 20   OP_Gt.  **     
1f360 20 20 54 4b 5f 47 45 20 20 20 20 20 20 20 20 20    TK_GE         
1f370 20 20 20 20 20 4f 50 5f 4c 74 0a 20 20 2a 2a 20       OP_Lt.  ** 
1f380 20 20 20 20 20 20 54 4b 5f 4c 54 20 20 20 20 20        TK_LT     
1f390 20 20 20 20 20 20 20 20 20 4f 50 5f 47 65 0a 20           OP_Ge. 
1f3a0 20 2a 2a 0a 20 20 2a 2a 20 46 6f 72 20 6f 74 68   **.  ** For oth
1f3b0 65 72 20 76 61 6c 75 65 73 20 6f 66 20 70 45 78  er values of pEx
1f3c0 70 72 2d 3e 6f 70 2c 20 6f 70 20 69 73 20 75 6e  pr->op, op is un
1f3d0 64 65 66 69 6e 65 64 20 61 6e 64 20 75 6e 75 73  defined and unus
1f3e0 65 64 2e 0a 20 20 2a 2a 20 54 68 65 20 76 61 6c  ed..  ** The val
1f3f0 75 65 20 6f 66 20 54 4b 5f 20 61 6e 64 20 4f 50  ue of TK_ and OP
1f400 5f 20 63 6f 6e 73 74 61 6e 74 73 20 61 72 65 20  _ constants are 
1f410 61 72 72 61 6e 67 65 64 20 73 75 63 68 20 74 68  arranged such th
1f420 61 74 20 77 65 0a 20 20 2a 2a 20 63 61 6e 20 63  at we.  ** can c
1f430 6f 6d 70 75 74 65 20 74 68 65 20 6d 61 70 70 69  ompute the mappi
1f440 6e 67 20 61 62 6f 76 65 20 75 73 69 6e 67 20 74  ng above using t
1f450 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 78 70  he following exp
1f460 72 65 73 73 69 6f 6e 2e 0a 20 20 2a 2a 20 41 73  ression..  ** As
1f470 73 65 72 74 28 29 73 20 76 65 72 69 66 79 20 74  sert()s verify t
1f480 68 61 74 20 74 68 65 20 63 6f 6d 70 75 74 61 74  hat the computat
1f490 69 6f 6e 20 69 73 20 63 6f 72 72 65 63 74 2e 0a  ion is correct..
1f4a0 20 20 2a 2f 0a 20 20 6f 70 20 3d 20 28 28 70 45    */.  op = ((pE
1f4b0 78 70 72 2d 3e 6f 70 2b 28 54 4b 5f 49 53 4e 55  xpr->op+(TK_ISNU
1f4c0 4c 4c 26 31 29 29 5e 31 29 2d 28 54 4b 5f 49 53  LL&1))^1)-(TK_IS
1f4d0 4e 55 4c 4c 26 31 29 3b 0a 0a 20 20 2f 2a 20 56  NULL&1);..  /* V
1f4e0 65 72 69 66 79 20 63 6f 72 72 65 63 74 20 61 6c  erify correct al
1f4f0 69 67 6e 6d 65 6e 74 20 6f 66 20 54 4b 5f 20 61  ignment of TK_ a
1f500 6e 64 20 4f 50 5f 20 63 6f 6e 73 74 61 6e 74 73  nd OP_ constants
1f510 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
1f520 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 49 53  pExpr->op!=TK_IS
1f530 4e 55 4c 4c 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4e  NULL || op==OP_N
1f540 6f 74 4e 75 6c 6c 20 29 3b 0a 20 20 61 73 73 65  otNull );.  asse
1f550 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  rt( pExpr->op!=T
1f560 4b 5f 4e 4f 54 4e 55 4c 4c 20 7c 7c 20 6f 70 3d  K_NOTNULL || op=
1f570 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 0a 20 20  =OP_IsNull );.  
1f580 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
1f590 70 21 3d 54 4b 5f 4e 45 20 7c 7c 20 6f 70 3d 3d  p!=TK_NE || op==
1f5a0 4f 50 5f 45 71 20 29 3b 0a 20 20 61 73 73 65 72  OP_Eq );.  asser
1f5b0 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  t( pExpr->op!=TK
1f5c0 5f 45 51 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4e 65  _EQ || op==OP_Ne
1f5d0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
1f5e0 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4c 54 20 7c  xpr->op!=TK_LT |
1f5f0 7c 20 6f 70 3d 3d 4f 50 5f 47 65 20 29 3b 0a 20  | op==OP_Ge );. 
1f600 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
1f610 6f 70 21 3d 54 4b 5f 4c 45 20 7c 7c 20 6f 70 3d  op!=TK_LE || op=
1f620 3d 4f 50 5f 47 74 20 29 3b 0a 20 20 61 73 73 65  =OP_Gt );.  asse
1f630 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  rt( pExpr->op!=T
1f640 4b 5f 47 54 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c  K_GT || op==OP_L
1f650 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
1f660 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 47 45 20  Expr->op!=TK_GE 
1f670 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c 74 20 29 3b 0a  || op==OP_Lt );.
1f680 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72  .  switch( pExpr
1f690 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ->op ){.    case
1f6a0 20 54 4b 5f 41 4e 44 3a 20 7b 0a 20 20 20 20 20   TK_AND: {.     
1f6b0 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
1f6c0 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  fNull==0 );.    
1f6d0 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
1f6e0 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 78  alse(pParse, pEx
1f6f0 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c  pr->pLeft, dest,
1f700 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
1f710 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
1f720 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29  achePush(pParse)
1f730 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1f740 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
1f750 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  e, pExpr->pRight
1f760 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
1f770 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ll);.      sqlit
1f780 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70  e3ExprCachePop(p
1f790 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 62 72  Parse);.      br
1f7a0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
1f7b0 61 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20  ase TK_OR: {.   
1f7c0 20 20 20 69 6e 74 20 64 32 20 3d 20 73 71 6c 69     int d2 = sqli
1f7d0 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
1f7e0 28 76 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  (v);.      testc
1f7f0 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  ase( jumpIfNull=
1f800 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =0 );.      sqli
1f810 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50  te3ExprIfTrue(pP
1f820 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
1f830 66 74 2c 20 64 32 2c 20 6a 75 6d 70 49 66 4e 75  ft, d2, jumpIfNu
1f840 6c 6c 5e 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46  ll^SQLITE_JUMPIF
1f850 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 71 6c  NULL);.      sql
1f860 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73  ite3ExprCachePus
1f870 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  h(pParse);.     
1f880 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
1f890 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  lse(pParse, pExp
1f8a0 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c  r->pRight, dest,
1f8b0 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
1f8c0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
1f8d0 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64  esolveLabel(v, d
1f8e0 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  2);.      sqlite
1f8f0 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50  3ExprCachePop(pP
1f900 61 72 73 65 29 3b 0a 20 20 20 20 20 20 62 72 65  arse);.      bre
1f910 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
1f920 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20  se TK_NOT: {.   
1f930 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d     testcase( jum
1f940 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
1f950 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
1f960 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45  fTrue(pParse, pE
1f970 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74  xpr->pLeft, dest
1f980 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
1f990 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1f9a0 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54  }.    case TK_LT
1f9b0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45  :.    case TK_LE
1f9c0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54  :.    case TK_GT
1f9d0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45  :.    case TK_GE
1f9e0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45  :.    case TK_NE
1f9f0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51  :.    case TK_EQ
1fa00 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61  : {.      testca
1fa10 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  se( jumpIfNull==
1fa20 30 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20  0 );.      r1 = 
1fa30 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
1fa40 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
1fa50 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72  r->pLeft, &regFr
1fa60 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d  ee1);.      r2 =
1fa70 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1fa80 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
1fa90 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67  pr->pRight, &reg
1faa0 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 63 6f  Free2);.      co
1fab0 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65  deCompare(pParse
1fac0 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
1fad0 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f  pExpr->pRight, o
1fae0 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  p,.             
1faf0 20 20 20 20 20 72 31 2c 20 72 32 2c 20 64 65 73       r1, r2, des
1fb00 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
1fb10 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f        assert(TK_
1fb20 4c 54 3d 3d 4f 50 5f 4c 74 29 3b 20 74 65 73 74  LT==OP_Lt); test
1fb30 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 74 29 3b  case(op==OP_Lt);
1fb40 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
1fb50 76 2c 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a 20 20  v,op==OP_Lt);.  
1fb60 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4c 45      assert(TK_LE
1fb70 3d 3d 4f 50 5f 4c 65 29 3b 20 74 65 73 74 63 61  ==OP_Le); testca
1fb80 73 65 28 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 20 56  se(op==OP_Le); V
1fb90 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
1fba0 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 0a 20 20 20 20  op==OP_Le);.    
1fbb0 20 20 61 73 73 65 72 74 28 54 4b 5f 47 54 3d 3d    assert(TK_GT==
1fbc0 4f 50 5f 47 74 29 3b 20 74 65 73 74 63 61 73 65  OP_Gt); testcase
1fbd0 28 6f 70 3d 3d 4f 50 5f 47 74 29 3b 20 56 64 62  (op==OP_Gt); Vdb
1fbe0 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70  eCoverageIf(v,op
1fbf0 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20 20 20 20 20  ==OP_Gt);.      
1fc00 61 73 73 65 72 74 28 54 4b 5f 47 45 3d 3d 4f 50  assert(TK_GE==OP
1fc10 5f 47 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f  _Ge); testcase(o
1fc20 70 3d 3d 4f 50 5f 47 65 29 3b 20 56 64 62 65 43  p==OP_Ge); VdbeC
1fc30 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d  overageIf(v,op==
1fc40 4f 50 5f 47 65 29 3b 0a 20 20 20 20 20 20 61 73  OP_Ge);.      as
1fc50 73 65 72 74 28 54 4b 5f 45 51 3d 3d 4f 50 5f 45  sert(TK_EQ==OP_E
1fc60 71 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d  q); testcase(op=
1fc70 3d 4f 50 5f 45 71 29 3b 20 56 64 62 65 43 6f 76  =OP_Eq); VdbeCov
1fc80 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50  erageIf(v,op==OP
1fc90 5f 45 71 29 3b 0a 20 20 20 20 20 20 61 73 73 65  _Eq);.      asse
1fca0 72 74 28 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 29  rt(TK_NE==OP_Ne)
1fcb0 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f  ; testcase(op==O
1fcc0 50 5f 4e 65 29 3b 20 56 64 62 65 43 6f 76 65 72  P_Ne); VdbeCover
1fcd0 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4e  ageIf(v,op==OP_N
1fce0 65 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  e);.      testca
1fcf0 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20  se( regFree1==0 
1fd00 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1fd10 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29  e( regFree2==0 )
1fd20 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1fd30 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
1fd40 5f 49 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _IS:.    case TK
1fd50 5f 49 53 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20  _ISNOT: {.      
1fd60 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
1fd70 3e 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20 20  >op==TK_IS );.  
1fd80 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
1fd90 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f  xpr->op==TK_ISNO
1fda0 54 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20  T );.      r1 = 
1fdb0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
1fdc0 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
1fdd0 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72  r->pLeft, &regFr
1fde0 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d  ee1);.      r2 =
1fdf0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1fe00 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
1fe10 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67  pr->pRight, &reg
1fe20 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 6f 70  Free2);.      op
1fe30 20 3d 20 28 70 45 78 70 72 2d 3e 6f 70 3d 3d 54   = (pExpr->op==T
1fe40 4b 5f 49 53 29 20 3f 20 54 4b 5f 4e 45 20 3a 20  K_IS) ? TK_NE : 
1fe50 54 4b 5f 45 51 3b 0a 20 20 20 20 20 20 63 6f 64  TK_EQ;.      cod
1fe60 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c  eCompare(pParse,
1fe70 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70   pExpr->pLeft, p
1fe80 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70  Expr->pRight, op
1fe90 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1fea0 20 20 20 20 72 31 2c 20 72 32 2c 20 64 65 73 74      r1, r2, dest
1feb0 2c 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29  , SQLITE_NULLEQ)
1fec0 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
1fed0 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b  rageIf(v, op==TK
1fee0 5f 45 51 29 3b 0a 20 20 20 20 20 20 56 64 62 65  _EQ);.      Vdbe
1fef0 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70  CoverageIf(v, op
1ff00 3d 3d 54 4b 5f 4e 45 29 3b 0a 20 20 20 20 20 20  ==TK_NE);.      
1ff10 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
1ff20 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74  e1==0 );.      t
1ff30 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
1ff40 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72  2==0 );.      br
1ff50 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
1ff60 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20  ase TK_ISNULL:. 
1ff70 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55     case TK_NOTNU
1ff80 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 72 31 20 3d  LL: {.      r1 =
1ff90 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1ffa0 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
1ffb0 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46  pr->pLeft, &regF
1ffc0 72 65 65 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  ree1);.      sql
1ffd0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1ffe0 2c 20 6f 70 2c 20 72 31 2c 20 64 65 73 74 29 3b  , op, r1, dest);
1fff0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
20000 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29   op==TK_ISNULL )
20010 3b 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65  ;   VdbeCoverage
20020 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 49 53 4e  If(v, op==TK_ISN
20030 55 4c 4c 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ULL);.      test
20040 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54  case( op==TK_NOT
20050 4e 55 4c 4c 20 29 3b 20 20 56 64 62 65 43 6f 76  NULL );  VdbeCov
20060 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54  erageIf(v, op==T
20070 4b 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a 20 20 20 20  K_NOTNULL);.    
20080 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
20090 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
200a0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
200b0 20 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45    case TK_BETWEE
200c0 4e 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63  N: {.      testc
200d0 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  ase( jumpIfNull=
200e0 3d 30 20 29 3b 0a 20 20 20 20 20 20 65 78 70 72  =0 );.      expr
200f0 43 6f 64 65 42 65 74 77 65 65 6e 28 70 50 61 72  CodeBetween(pPar
20100 73 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74 2c  se, pExpr, dest,
20110 20 30 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b   0, jumpIfNull);
20120 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
20130 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
20140 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
20150 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a  .    case TK_IN:
20160 20 7b 0a 20 20 20 20 20 20 69 66 28 20 6a 75 6d   {.      if( jum
20170 70 49 66 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20  pIfNull ){.     
20180 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
20190 64 65 49 4e 28 70 50 61 72 73 65 2c 20 70 45 78  deIN(pParse, pEx
201a0 70 72 2c 20 64 65 73 74 2c 20 64 65 73 74 29 3b  pr, dest, dest);
201b0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
201c0 20 20 20 20 20 20 69 6e 74 20 64 65 73 74 49 66        int destIf
201d0 4e 75 6c 6c 20 3d 20 73 71 6c 69 74 65 33 56 64  Null = sqlite3Vd
201e0 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
201f0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
20200 78 70 72 43 6f 64 65 49 4e 28 70 50 61 72 73 65  xprCodeIN(pParse
20210 2c 20 70 45 78 70 72 2c 20 64 65 73 74 2c 20 64  , pExpr, dest, d
20220 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  estIfNull);.    
20230 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
20240 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64  esolveLabel(v, d
20250 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  estIfNull);.    
20260 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
20270 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
20280 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
20290 20 20 20 69 66 28 20 65 78 70 72 41 6c 77 61 79     if( exprAlway
202a0 73 46 61 6c 73 65 28 70 45 78 70 72 29 20 29 7b  sFalse(pExpr) ){
202b0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
202c0 56 64 62 65 47 6f 74 6f 28 76 2c 20 64 65 73 74  VdbeGoto(v, dest
202d0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
202e0 66 28 20 65 78 70 72 41 6c 77 61 79 73 54 72 75  f( exprAlwaysTru
202f0 65 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20  e(pExpr) ){.    
20300 20 20 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a      /* no-op */.
20310 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
20320 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
20330 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
20340 61 72 73 65 2c 20 70 45 78 70 72 2c 20 26 72 65  arse, pExpr, &re
20350 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 20  gFree1);.       
20360 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
20370 70 33 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20  p3(v, OP_IfNot, 
20380 72 31 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  r1, dest, jumpIf
20390 4e 75 6c 6c 21 3d 30 29 3b 0a 20 20 20 20 20 20  Null!=0);.      
203a0 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
203b0 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
203c0 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30  ase( regFree1==0
203d0 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74   );.        test
203e0 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  case( jumpIfNull
203f0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ==0 );.      }. 
20400 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
20410 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52  }.  }.  sqlite3R
20420 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
20430 61 72 73 65 2c 20 72 65 67 46 72 65 65 31 29 3b  arse, regFree1);
20440 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
20450 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
20460 20 72 65 67 46 72 65 65 32 29 3b 0a 7d 0a 0a 2f   regFree2);.}../
20470 2a 0a 2a 2a 20 4c 69 6b 65 20 73 71 6c 69 74 65  *.** Like sqlite
20480 33 45 78 70 72 49 66 46 61 6c 73 65 28 29 20 65  3ExprIfFalse() e
20490 78 63 65 70 74 20 74 68 61 74 20 61 20 63 6f 70  xcept that a cop
204a0 79 20 69 73 20 6d 61 64 65 20 6f 66 20 70 45 78  y is made of pEx
204b0 70 72 20 62 65 66 6f 72 65 0a 2a 2a 20 63 6f 64  pr before.** cod
204c0 65 20 67 65 6e 65 72 61 74 69 6f 6e 2c 20 61 6e  e generation, an
204d0 64 20 74 68 61 74 20 63 6f 70 79 20 69 73 20 64  d that copy is d
204e0 65 6c 65 74 65 64 20 61 66 74 65 72 20 63 6f 64  eleted after cod
204f0 65 20 67 65 6e 65 72 61 74 69 6f 6e 2e 20 54 68  e generation. Th
20500 69 73 0a 2a 2a 20 65 6e 73 75 72 65 73 20 74 68  is.** ensures th
20510 61 74 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  at the original 
20520 70 45 78 70 72 20 69 73 20 75 6e 63 68 61 6e 67  pExpr is unchang
20530 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
20540 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 44 75  te3ExprIfFalseDu
20550 70 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  p(Parse *pParse,
20560 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e   Expr *pExpr, in
20570 74 20 64 65 73 74 2c 69 6e 74 20 6a 75 6d 70 49  t dest,int jumpI
20580 66 4e 75 6c 6c 29 7b 0a 20 20 73 71 6c 69 74 65  fNull){.  sqlite
20590 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
205a0 64 62 3b 0a 20 20 45 78 70 72 20 2a 70 43 6f 70  db;.  Expr *pCop
205b0 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  y = sqlite3ExprD
205c0 75 70 28 64 62 2c 20 70 45 78 70 72 2c 20 30 29  up(db, pExpr, 0)
205d0 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
205e0 6f 63 46 61 69 6c 65 64 3d 3d 30 20 29 7b 0a 20  ocFailed==0 ){. 
205f0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
20600 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 43  False(pParse, pC
20610 6f 70 79 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49  opy, dest, jumpI
20620 66 4e 75 6c 6c 29 3b 0a 20 20 7d 0a 20 20 73 71  fNull);.  }.  sq
20630 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
20640 64 62 2c 20 70 43 6f 70 79 29 3b 0a 7d 0a 0a 0a  db, pCopy);.}...
20650 2f 2a 0a 2a 2a 20 44 6f 20 61 20 64 65 65 70 20  /*.** Do a deep 
20660 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 66 20 74 77  comparison of tw
20670 6f 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  o expression tre
20680 65 73 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66  es.  Return 0 if
20690 20 74 68 65 20 74 77 6f 0a 2a 2a 20 65 78 70 72   the two.** expr
206a0 65 73 73 69 6f 6e 73 20 61 72 65 20 63 6f 6d 70  essions are comp
206b0 6c 65 74 65 6c 79 20 69 64 65 6e 74 69 63 61 6c  letely identical
206c0 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66 20 74  .  Return 1 if t
206d0 68 65 79 20 64 69 66 66 65 72 20 6f 6e 6c 79 0a  hey differ only.
206e0 2a 2a 20 62 79 20 61 20 43 4f 4c 4c 41 54 45 20  ** by a COLLATE 
206f0 6f 70 65 72 61 74 6f 72 20 61 74 20 74 68 65 20  operator at the 
20700 74 6f 70 20 6c 65 76 65 6c 2e 20 20 52 65 74 75  top level.  Retu
20710 72 6e 20 32 20 69 66 20 74 68 65 72 65 20 61 72  rn 2 if there ar
20720 65 20 64 69 66 66 65 72 65 6e 63 65 73 0a 2a 2a  e differences.**
20730 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68 65 20   other than the 
20740 74 6f 70 2d 6c 65 76 65 6c 20 43 4f 4c 4c 41 54  top-level COLLAT
20750 45 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 0a 2a  E operator..**.*
20760 2a 20 49 66 20 61 6e 79 20 73 75 62 65 6c 65 6d  * If any subelem
20770 65 6e 74 20 6f 66 20 70 42 20 68 61 73 20 45 78  ent of pB has Ex
20780 70 72 2e 69 54 61 62 6c 65 3d 3d 28 2d 31 29 20  pr.iTable==(-1) 
20790 74 68 65 6e 20 69 74 20 69 73 20 61 6c 6c 6f 77  then it is allow
207a0 65 64 0a 2a 2a 20 74 6f 20 63 6f 6d 70 61 72 65  ed.** to compare
207b0 20 65 71 75 61 6c 20 74 6f 20 61 6e 20 65 71 75   equal to an equ
207c0 69 76 61 6c 65 6e 74 20 65 6c 65 6d 65 6e 74 20  ivalent element 
207d0 69 6e 20 70 41 20 77 69 74 68 20 45 78 70 72 2e  in pA with Expr.
207e0 69 54 61 62 6c 65 3d 3d 69 54 61 62 2e 0a 2a 2a  iTable==iTab..**
207f0 0a 2a 2a 20 54 68 65 20 70 41 20 73 69 64 65 20  .** The pA side 
20800 6d 69 67 68 74 20 62 65 20 75 73 69 6e 67 20 54  might be using T
20810 4b 5f 52 45 47 49 53 54 45 52 2e 20 20 49 66 20  K_REGISTER.  If 
20820 74 68 61 74 20 69 73 20 74 68 65 20 63 61 73 65  that is the case
20830 20 61 6e 64 20 70 42 20 69 73 0a 2a 2a 20 6e 6f   and pB is.** no
20840 74 20 75 73 69 6e 67 20 54 4b 5f 52 45 47 49 53  t using TK_REGIS
20850 54 45 52 20 62 75 74 20 69 73 20 6f 74 68 65 72  TER but is other
20860 77 69 73 65 20 65 71 75 69 76 61 6c 65 6e 74 2c  wise equivalent,
20870 20 74 68 65 6e 20 73 74 69 6c 6c 20 72 65 74 75   then still retu
20880 72 6e 20 30 2e 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65  rn 0..**.** Some
20890 74 69 6d 65 73 20 74 68 69 73 20 72 6f 75 74 69  times this routi
208a0 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 32  ne will return 2
208b0 20 65 76 65 6e 20 69 66 20 74 68 65 20 74 77 6f   even if the two
208c0 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20   expressions.** 
208d0 72 65 61 6c 6c 79 20 61 72 65 20 65 71 75 69 76  really are equiv
208e0 61 6c 65 6e 74 2e 20 20 49 66 20 77 65 20 63 61  alent.  If we ca
208f0 6e 6e 6f 74 20 70 72 6f 76 65 20 74 68 61 74 20  nnot prove that 
20900 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20  the expressions 
20910 61 72 65 0a 2a 2a 20 69 64 65 6e 74 69 63 61 6c  are.** identical
20920 2c 20 77 65 20 72 65 74 75 72 6e 20 32 20 6a 75  , we return 2 ju
20930 73 74 20 74 6f 20 62 65 20 73 61 66 65 2e 20 20  st to be safe.  
20940 53 6f 20 69 66 20 74 68 69 73 20 72 6f 75 74 69  So if this routi
20950 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20 32 2c  ne.** returns 2,
20960 20 74 68 65 6e 20 79 6f 75 20 64 6f 20 6e 6f 74   then you do not
20970 20 72 65 61 6c 6c 79 20 6b 6e 6f 77 20 66 6f 72   really know for
20980 20 63 65 72 74 61 69 6e 20 69 66 20 74 68 65 20   certain if the 
20990 74 77 6f 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  two.** expressio
209a0 6e 73 20 61 72 65 20 74 68 65 20 73 61 6d 65 2e  ns are the same.
209b0 20 20 42 75 74 20 69 66 20 79 6f 75 20 67 65 74    But if you get
209c0 20 61 20 30 20 6f 72 20 31 20 72 65 74 75 72 6e   a 0 or 1 return
209d0 2c 20 74 68 65 6e 20 79 6f 75 0a 2a 2a 20 63 61  , then you.** ca
209e0 6e 20 62 65 20 73 75 72 65 20 74 68 65 20 65 78  n be sure the ex
209f0 70 72 65 73 73 69 6f 6e 73 20 61 72 65 20 74 68  pressions are th
20a00 65 20 73 61 6d 65 2e 20 20 49 6e 20 74 68 65 20  e same.  In the 
20a10 70 6c 61 63 65 73 20 77 68 65 72 65 0a 2a 2a 20  places where.** 
20a20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
20a30 75 73 65 64 2c 20 69 74 20 64 6f 65 73 20 6e 6f  used, it does no
20a40 74 20 68 75 72 74 20 74 6f 20 67 65 74 20 61 6e  t hurt to get an
20a50 20 65 78 74 72 61 20 32 20 2d 20 74 68 61 74 0a   extra 2 - that.
20a60 2a 2a 20 6a 75 73 74 20 6d 69 67 68 74 20 72 65  ** just might re
20a70 73 75 6c 74 20 69 6e 20 73 6f 6d 65 20 73 6c 69  sult in some sli
20a80 67 68 74 6c 79 20 73 6c 6f 77 65 72 20 63 6f 64  ghtly slower cod
20a90 65 2e 20 20 42 75 74 20 72 65 74 75 72 6e 69 6e  e.  But returnin
20aa0 67 0a 2a 2a 20 61 6e 20 69 6e 63 6f 72 72 65 63  g.** an incorrec
20ab0 74 20 30 20 6f 72 20 31 20 63 6f 75 6c 64 20 6c  t 0 or 1 could l
20ac0 65 61 64 20 74 6f 20 61 20 6d 61 6c 66 75 6e 63  ead to a malfunc
20ad0 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tion..*/.int sql
20ae0 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28  ite3ExprCompare(
20af0 45 78 70 72 20 2a 70 41 2c 20 45 78 70 72 20 2a  Expr *pA, Expr *
20b00 70 42 2c 20 69 6e 74 20 69 54 61 62 29 7b 0a 20  pB, int iTab){. 
20b10 20 75 33 32 20 63 6f 6d 62 69 6e 65 64 46 6c 61   u32 combinedFla
20b20 67 73 3b 0a 20 20 69 66 28 20 70 41 3d 3d 30 20  gs;.  if( pA==0 
20b30 7c 7c 20 70 42 3d 3d 30 20 29 7b 0a 20 20 20 20  || pB==0 ){.    
20b40 72 65 74 75 72 6e 20 70 42 3d 3d 70 41 20 3f 20  return pB==pA ? 
20b50 30 20 3a 20 32 3b 0a 20 20 7d 0a 20 20 63 6f 6d  0 : 2;.  }.  com
20b60 62 69 6e 65 64 46 6c 61 67 73 20 3d 20 70 41 2d  binedFlags = pA-
20b70 3e 66 6c 61 67 73 20 7c 20 70 42 2d 3e 66 6c 61  >flags | pB->fla
20b80 67 73 3b 0a 20 20 69 66 28 20 63 6f 6d 62 69 6e  gs;.  if( combin
20b90 65 64 46 6c 61 67 73 20 26 20 45 50 5f 49 6e 74  edFlags & EP_Int
20ba0 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 69 66 28  Value ){.    if(
20bb0 20 28 70 41 2d 3e 66 6c 61 67 73 26 70 42 2d 3e   (pA->flags&pB->
20bc0 66 6c 61 67 73 26 45 50 5f 49 6e 74 56 61 6c 75  flags&EP_IntValu
20bd0 65 29 21 3d 30 20 26 26 20 70 41 2d 3e 75 2e 69  e)!=0 && pA->u.i
20be0 56 61 6c 75 65 3d 3d 70 42 2d 3e 75 2e 69 56 61  Value==pB->u.iVa
20bf0 6c 75 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74  lue ){.      ret
20c00 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 0;.    }.   
20c10 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 7d 0a 20   return 2;.  }. 
20c20 20 69 66 28 20 70 41 2d 3e 6f 70 21 3d 70 42 2d   if( pA->op!=pB-
20c30 3e 6f 70 20 29 7b 0a 20 20 20 20 69 66 28 20 70  >op ){.    if( p
20c40 41 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54  A->op==TK_COLLAT
20c50 45 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72  E && sqlite3Expr
20c60 43 6f 6d 70 61 72 65 28 70 41 2d 3e 70 4c 65 66  Compare(pA->pLef
20c70 74 2c 20 70 42 2c 20 69 54 61 62 29 3c 32 20 29  t, pB, iTab)<2 )
20c80 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  {.      return 1
20c90 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
20ca0 70 42 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41  pB->op==TK_COLLA
20cb0 54 45 20 26 26 20 73 71 6c 69 74 65 33 45 78 70  TE && sqlite3Exp
20cc0 72 43 6f 6d 70 61 72 65 28 70 41 2c 20 70 42 2d  rCompare(pA, pB-
20cd0 3e 70 4c 65 66 74 2c 20 69 54 61 62 29 3c 32 20  >pLeft, iTab)<2 
20ce0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
20cf0 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  1;.    }.    ret
20d00 75 72 6e 20 32 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 2;.  }.  if(
20d10 20 70 41 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55   pA->op!=TK_COLU
20d20 4d 4e 20 26 26 20 70 41 2d 3e 6f 70 21 3d 54 4b  MN && pA->op!=TK
20d30 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 26 26 20 70  _AGG_COLUMN && p
20d40 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 29 7b 0a 20  A->u.zToken ){. 
20d50 20 20 20 69 66 28 20 70 41 2d 3e 6f 70 3d 3d 54     if( pA->op==T
20d60 4b 5f 46 55 4e 43 54 49 4f 4e 20 29 7b 0a 20 20  K_FUNCTION ){.  
20d70 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
20d80 74 72 49 43 6d 70 28 70 41 2d 3e 75 2e 7a 54 6f  trICmp(pA->u.zTo
20d90 6b 65 6e 2c 70 42 2d 3e 75 2e 7a 54 6f 6b 65 6e  ken,pB->u.zToken
20da0 29 21 3d 30 20 29 20 72 65 74 75 72 6e 20 32 3b  )!=0 ) return 2;
20db0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73  .    }else if( s
20dc0 74 72 63 6d 70 28 70 41 2d 3e 75 2e 7a 54 6f 6b  trcmp(pA->u.zTok
20dd0 65 6e 2c 70 42 2d 3e 75 2e 7a 54 6f 6b 65 6e 29  en,pB->u.zToken)
20de0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74  !=0 ){.      ret
20df0 75 72 6e 20 70 41 2d 3e 6f 70 3d 3d 54 4b 5f 43  urn pA->op==TK_C
20e00 4f 4c 4c 41 54 45 20 3f 20 31 20 3a 20 32 3b 0a  OLLATE ? 1 : 2;.
20e10 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
20e20 28 70 41 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  (pA->flags & EP_
20e30 44 69 73 74 69 6e 63 74 29 21 3d 28 70 42 2d 3e  Distinct)!=(pB->
20e40 66 6c 61 67 73 20 26 20 45 50 5f 44 69 73 74 69  flags & EP_Disti
20e50 6e 63 74 29 20 29 20 72 65 74 75 72 6e 20 32 3b  nct) ) return 2;
20e60 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 28 63  .  if( ALWAYS((c
20e70 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20 26 20 45  ombinedFlags & E
20e80 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 3d 3d 30 29  P_TokenOnly)==0)
20e90 20 29 7b 0a 20 20 20 20 69 66 28 20 63 6f 6d 62   ){.    if( comb
20ea0 69 6e 65 64 46 6c 61 67 73 20 26 20 45 50 5f 78  inedFlags & EP_x
20eb0 49 73 53 65 6c 65 63 74 20 29 20 72 65 74 75 72  IsSelect ) retur
20ec0 6e 20 32 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  n 2;.    if( sql
20ed0 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28  ite3ExprCompare(
20ee0 70 41 2d 3e 70 4c 65 66 74 2c 20 70 42 2d 3e 70  pA->pLeft, pB->p
20ef0 4c 65 66 74 2c 20 69 54 61 62 29 20 29 20 72 65  Left, iTab) ) re
20f00 74 75 72 6e 20 32 3b 0a 20 20 20 20 69 66 28 20  turn 2;.    if( 
20f10 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
20f20 72 65 28 70 41 2d 3e 70 52 69 67 68 74 2c 20 70  re(pA->pRight, p
20f30 42 2d 3e 70 52 69 67 68 74 2c 20 69 54 61 62 29  B->pRight, iTab)
20f40 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20   ) return 2;.   
20f50 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
20f60 4c 69 73 74 43 6f 6d 70 61 72 65 28 70 41 2d 3e  ListCompare(pA->
20f70 78 2e 70 4c 69 73 74 2c 20 70 42 2d 3e 78 2e 70  x.pList, pB->x.p
20f80 4c 69 73 74 2c 20 69 54 61 62 29 20 29 20 72 65  List, iTab) ) re
20f90 74 75 72 6e 20 32 3b 0a 20 20 20 20 69 66 28 20  turn 2;.    if( 
20fa0 41 4c 57 41 59 53 28 28 63 6f 6d 62 69 6e 65 64  ALWAYS((combined
20fb0 46 6c 61 67 73 20 26 20 45 50 5f 52 65 64 75 63  Flags & EP_Reduc
20fc0 65 64 29 3d 3d 30 29 20 26 26 20 70 41 2d 3e 6f  ed)==0) && pA->o
20fd0 70 21 3d 54 4b 5f 53 54 52 49 4e 47 20 29 7b 0a  p!=TK_STRING ){.
20fe0 20 20 20 20 20 20 69 66 28 20 70 41 2d 3e 69 43        if( pA->iC
20ff0 6f 6c 75 6d 6e 21 3d 70 42 2d 3e 69 43 6f 6c 75  olumn!=pB->iColu
21000 6d 6e 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20  mn ) return 2;. 
21010 20 20 20 20 20 69 66 28 20 70 41 2d 3e 69 54 61       if( pA->iTa
21020 62 6c 65 21 3d 70 42 2d 3e 69 54 61 62 6c 65 20  ble!=pB->iTable 
21030 0a 20 20 20 20 20 20 20 26 26 20 28 70 41 2d 3e  .       && (pA->
21040 69 54 61 62 6c 65 21 3d 69 54 61 62 20 7c 7c 20  iTable!=iTab || 
21050 4e 45 56 45 52 28 70 42 2d 3e 69 54 61 62 6c 65  NEVER(pB->iTable
21060 3e 3d 30 29 29 20 29 20 72 65 74 75 72 6e 20 32  >=0)) ) return 2
21070 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
21080 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
21090 20 43 6f 6d 70 61 72 65 20 74 77 6f 20 45 78 70   Compare two Exp
210a0 72 4c 69 73 74 20 6f 62 6a 65 63 74 73 2e 20 20  rList objects.  
210b0 52 65 74 75 72 6e 20 30 20 69 66 20 74 68 65 79  Return 0 if they
210c0 20 61 72 65 20 69 64 65 6e 74 69 63 61 6c 20 61   are identical a
210d0 6e 64 20 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20  nd .** non-zero 
210e0 69 66 20 74 68 65 79 20 64 69 66 66 65 72 20 69  if they differ i
210f0 6e 20 61 6e 79 20 77 61 79 2e 0a 2a 2a 0a 2a 2a  n any way..**.**
21100 20 49 66 20 61 6e 79 20 73 75 62 65 6c 65 6d 65   If any subeleme
21110 6e 74 20 6f 66 20 70 42 20 68 61 73 20 45 78 70  nt of pB has Exp
21120 72 2e 69 54 61 62 6c 65 3d 3d 28 2d 31 29 20 74  r.iTable==(-1) t
21130 68 65 6e 20 69 74 20 69 73 20 61 6c 6c 6f 77 65  hen it is allowe
21140 64 0a 2a 2a 20 74 6f 20 63 6f 6d 70 61 72 65 20  d.** to compare 
21150 65 71 75 61 6c 20 74 6f 20 61 6e 20 65 71 75 69  equal to an equi
21160 76 61 6c 65 6e 74 20 65 6c 65 6d 65 6e 74 20 69  valent element i
21170 6e 20 70 41 20 77 69 74 68 20 45 78 70 72 2e 69  n pA with Expr.i
21180 54 61 62 6c 65 3d 3d 69 54 61 62 2e 0a 2a 2a 0a  Table==iTab..**.
21190 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
211a0 6d 69 67 68 74 20 72 65 74 75 72 6e 20 6e 6f 6e  might return non
211b0 2d 7a 65 72 6f 20 66 6f 72 20 65 71 75 69 76 61  -zero for equiva
211c0 6c 65 6e 74 20 45 78 70 72 4c 69 73 74 73 2e 20  lent ExprLists. 
211d0 20 54 68 65 0a 2a 2a 20 6f 6e 6c 79 20 63 6f 6e   The.** only con
211e0 73 65 71 75 65 6e 63 65 20 77 69 6c 6c 20 62 65  sequence will be
211f0 20 64 69 73 61 62 6c 65 64 20 6f 70 74 69 6d 69   disabled optimi
21200 7a 61 74 69 6f 6e 73 2e 20 20 42 75 74 20 74 68  zations.  But th
21210 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 6d 75  is routine.** mu
21220 73 74 20 6e 65 76 65 72 20 72 65 74 75 72 6e 20  st never return 
21230 30 20 69 66 20 74 68 65 20 74 77 6f 20 45 78 70  0 if the two Exp
21240 72 4c 69 73 74 20 6f 62 6a 65 63 74 73 20 61 72  rList objects ar
21250 65 20 64 69 66 66 65 72 65 6e 74 2c 20 6f 72 0a  e different, or.
21260 2a 2a 20 61 20 6d 61 6c 66 75 6e 63 74 69 6f 6e  ** a malfunction
21270 20 77 69 6c 6c 20 72 65 73 75 6c 74 2e 0a 2a 2a   will result..**
21280 0a 2a 2a 20 54 77 6f 20 4e 55 4c 4c 20 70 6f 69  .** Two NULL poi
21290 6e 74 65 72 73 20 61 72 65 20 63 6f 6e 73 69 64  nters are consid
212a0 65 72 65 64 20 74 6f 20 62 65 20 74 68 65 20 73  ered to be the s
212b0 61 6d 65 2e 20 20 42 75 74 20 61 20 4e 55 4c 4c  ame.  But a NULL
212c0 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 61 6c 77 61   pointer.** alwa
212d0 79 73 20 64 69 66 66 65 72 73 20 66 72 6f 6d 20  ys differs from 
212e0 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 70 6f 69 6e 74  a non-NULL point
212f0 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  er..*/.int sqlit
21300 65 33 45 78 70 72 4c 69 73 74 43 6f 6d 70 61 72  e3ExprListCompar
21310 65 28 45 78 70 72 4c 69 73 74 20 2a 70 41 2c 20  e(ExprList *pA, 
21320 45 78 70 72 4c 69 73 74 20 2a 70 42 2c 20 69 6e  ExprList *pB, in
21330 74 20 69 54 61 62 29 7b 0a 20 20 69 6e 74 20 69  t iTab){.  int i
21340 3b 0a 20 20 69 66 28 20 70 41 3d 3d 30 20 26 26  ;.  if( pA==0 &&
21350 20 70 42 3d 3d 30 20 29 20 72 65 74 75 72 6e 20   pB==0 ) return 
21360 30 3b 0a 20 20 69 66 28 20 70 41 3d 3d 30 20 7c  0;.  if( pA==0 |
21370 7c 20 70 42 3d 3d 30 20 29 20 72 65 74 75 72 6e  | pB==0 ) return
21380 20 31 3b 0a 20 20 69 66 28 20 70 41 2d 3e 6e 45   1;.  if( pA->nE
21390 78 70 72 21 3d 70 42 2d 3e 6e 45 78 70 72 20 29  xpr!=pB->nExpr )
213a0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 66 6f 72   return 1;.  for
213b0 28 69 3d 30 3b 20 69 3c 70 41 2d 3e 6e 45 78 70  (i=0; i<pA->nExp
213c0 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70  r; i++){.    Exp
213d0 72 20 2a 70 45 78 70 72 41 20 3d 20 70 41 2d 3e  r *pExprA = pA->
213e0 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
213f0 45 78 70 72 20 2a 70 45 78 70 72 42 20 3d 20 70  Expr *pExprB = p
21400 42 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  B->a[i].pExpr;. 
21410 20 20 20 69 66 28 20 70 41 2d 3e 61 5b 69 5d 2e     if( pA->a[i].
21420 73 6f 72 74 4f 72 64 65 72 21 3d 70 42 2d 3e 61  sortOrder!=pB->a
21430 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 20 29 20  [i].sortOrder ) 
21440 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 69 66  return 1;.    if
21450 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  ( sqlite3ExprCom
21460 70 61 72 65 28 70 45 78 70 72 41 2c 20 70 45 78  pare(pExprA, pEx
21470 70 72 42 2c 20 69 54 61 62 29 20 29 20 72 65 74  prB, iTab) ) ret
21480 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 1;.  }.  ret
21490 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
214a0 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 77  Return true if w
214b0 65 20 63 61 6e 20 70 72 6f 76 65 20 74 68 65 20  e can prove the 
214c0 70 45 32 20 77 69 6c 6c 20 61 6c 77 61 79 73 20  pE2 will always 
214d0 62 65 20 74 72 75 65 20 69 66 20 70 45 31 20 69  be true if pE1 i
214e0 73 0a 2a 2a 20 74 72 75 65 2e 20 20 52 65 74 75  s.** true.  Retu
214f0 72 6e 20 66 61 6c 73 65 20 69 66 20 77 65 20 63  rn false if we c
21500 61 6e 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 20 74  annot complete t
21510 68 65 20 70 72 6f 6f 66 20 6f 72 20 69 66 20 70  he proof or if p
21520 45 32 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20 66  E2 might.** be f
21530 61 6c 73 65 2e 20 20 45 78 61 6d 70 6c 65 73 3a  alse.  Examples:
21540 0a 2a 2a 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20  .**.**     pE1: 
21550 78 3d 3d 35 20 20 20 20 20 20 20 70 45 32 3a 20  x==5       pE2: 
21560 78 3d 3d 35 20 20 20 20 20 20 20 20 20 20 20 20  x==5            
21570 20 52 65 73 75 6c 74 3a 20 74 72 75 65 0a 2a 2a   Result: true.**
21580 20 20 20 20 20 70 45 31 3a 20 78 3e 30 20 20 20       pE1: x>0   
21590 20 20 20 20 20 70 45 32 3a 20 78 3d 3d 35 20 20       pE2: x==5  
215a0 20 20 20 20 20 20 20 20 20 20 20 52 65 73 75 6c             Resul
215b0 74 3a 20 66 61 6c 73 65 0a 2a 2a 20 20 20 20 20  t: false.**     
215c0 70 45 31 3a 20 78 3d 32 31 20 20 20 20 20 20 20  pE1: x=21       
215d0 70 45 32 3a 20 78 3d 32 31 20 4f 52 20 79 3d 34  pE2: x=21 OR y=4
215e0 33 20 20 20 20 20 52 65 73 75 6c 74 3a 20 74 72  3     Result: tr
215f0 75 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78  ue.**     pE1: x
21600 21 3d 31 32 33 20 20 20 20 20 70 45 32 3a 20 78  !=123     pE2: x
21610 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20   IS NOT NULL    
21620 52 65 73 75 6c 74 3a 20 74 72 75 65 0a 2a 2a 20  Result: true.** 
21630 20 20 20 20 70 45 31 3a 20 78 21 3d 3f 31 20 20      pE1: x!=?1  
21640 20 20 20 20 70 45 32 3a 20 78 20 49 53 20 4e 4f      pE2: x IS NO
21650 54 20 4e 55 4c 4c 20 20 20 20 52 65 73 75 6c 74  T NULL    Result
21660 3a 20 74 72 75 65 0a 2a 2a 20 20 20 20 20 70 45  : true.**     pE
21670 31 3a 20 78 20 49 53 20 4e 55 4c 4c 20 20 70 45  1: x IS NULL  pE
21680 32 3a 20 78 20 49 53 20 4e 4f 54 20 4e 55 4c 4c  2: x IS NOT NULL
21690 20 20 20 20 52 65 73 75 6c 74 3a 20 66 61 6c 73      Result: fals
216a0 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78 20  e.**     pE1: x 
216b0 49 53 20 3f 32 20 20 20 20 70 45 32 3a 20 78 20  IS ?2    pE2: x 
216c0 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 52  IS NOT NULL    R
216d0 65 75 73 6c 74 3a 20 66 61 6c 73 65 0a 2a 2a 0a  euslt: false.**.
216e0 2a 2a 20 57 68 65 6e 20 63 6f 6d 70 61 72 69 6e  ** When comparin
216f0 67 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65  g TK_COLUMN node
21700 73 20 62 65 74 77 65 65 6e 20 70 45 31 20 61 6e  s between pE1 an
21710 64 20 70 45 32 2c 20 69 66 20 70 45 32 20 68 61  d pE2, if pE2 ha
21720 73 0a 2a 2a 20 45 78 70 72 2e 69 54 61 62 6c 65  s.** Expr.iTable
21730 3c 30 20 74 68 65 6e 20 61 73 73 75 6d 65 20 61  <0 then assume a
21740 20 74 61 62 6c 65 20 6e 75 6d 62 65 72 20 67 69   table number gi
21750 76 65 6e 20 62 79 20 69 54 61 62 2e 0a 2a 2a 0a  ven by iTab..**.
21760 2a 2a 20 57 68 65 6e 20 69 6e 20 64 6f 75 62 74  ** When in doubt
21770 2c 20 72 65 74 75 72 6e 20 66 61 6c 73 65 2e 20  , return false. 
21780 20 52 65 74 75 72 6e 69 6e 67 20 74 72 75 65 20   Returning true 
21790 6d 69 67 68 74 20 67 69 76 65 20 61 20 70 65 72  might give a per
217a0 66 6f 72 6d 61 6e 63 65 0a 2a 2a 20 69 6d 70 72  formance.** impr
217b0 6f 76 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e  ovement.  Return
217c0 69 6e 67 20 66 61 6c 73 65 20 6d 69 67 68 74 20  ing false might 
217d0 63 61 75 73 65 20 61 20 70 65 72 66 6f 72 6d 61  cause a performa
217e0 6e 63 65 20 72 65 64 75 63 74 69 6f 6e 2c 20 62  nce reduction, b
217f0 75 74 0a 2a 2a 20 69 74 20 77 69 6c 6c 20 61 6c  ut.** it will al
21800 77 61 79 73 20 67 69 76 65 20 74 68 65 20 63 6f  ways give the co
21810 72 72 65 63 74 20 61 6e 73 77 65 72 20 61 6e 64  rrect answer and
21820 20 69 73 20 68 65 6e 63 65 20 61 6c 77 61 79 73   is hence always
21830 20 73 61 66 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71   safe..*/.int sq
21840 6c 69 74 65 33 45 78 70 72 49 6d 70 6c 69 65 73  lite3ExprImplies
21850 45 78 70 72 28 45 78 70 72 20 2a 70 45 31 2c 20  Expr(Expr *pE1, 
21860 45 78 70 72 20 2a 70 45 32 2c 20 69 6e 74 20 69  Expr *pE2, int i
21870 54 61 62 29 7b 0a 20 20 69 66 28 20 73 71 6c 69  Tab){.  if( sqli
21880 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70  te3ExprCompare(p
21890 45 31 2c 20 70 45 32 2c 20 69 54 61 62 29 3d 3d  E1, pE2, iTab)==
218a0 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
218b0 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 45 32  1;.  }.  if( pE2
218c0 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52 0a 20 20 20 26  ->op==TK_OR.   &
218d0 26 20 28 73 71 6c 69 74 65 33 45 78 70 72 49 6d  & (sqlite3ExprIm
218e0 70 6c 69 65 73 45 78 70 72 28 70 45 31 2c 20 70  pliesExpr(pE1, p
218f0 45 32 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 29  E2->pLeft, iTab)
21900 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  .             ||
21910 20 73 71 6c 69 74 65 33 45 78 70 72 49 6d 70 6c   sqlite3ExprImpl
21920 69 65 73 45 78 70 72 28 70 45 31 2c 20 70 45 32  iesExpr(pE1, pE2
21930 2d 3e 70 52 69 67 68 74 2c 20 69 54 61 62 29 20  ->pRight, iTab) 
21940 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ).  ){.    retur
21950 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  n 1;.  }.  if( p
21960 45 32 2d 3e 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55  E2->op==TK_NOTNU
21970 4c 4c 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33  LL.   && sqlite3
21980 45 78 70 72 43 6f 6d 70 61 72 65 28 70 45 31 2d  ExprCompare(pE1-
21990 3e 70 4c 65 66 74 2c 20 70 45 32 2d 3e 70 4c 65  >pLeft, pE2->pLe
219a0 66 74 2c 20 69 54 61 62 29 3d 3d 30 0a 20 20 20  ft, iTab)==0.   
219b0 26 26 20 28 70 45 31 2d 3e 6f 70 21 3d 54 4b 5f  && (pE1->op!=TK_
219c0 49 53 4e 55 4c 4c 20 26 26 20 70 45 31 2d 3e 6f  ISNULL && pE1->o
219d0 70 21 3d 54 4b 5f 49 53 29 0a 20 20 29 7b 0a 20  p!=TK_IS).  ){. 
219e0 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
219f0 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
21a00 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63  /*.** An instanc
21a10 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
21a20 6e 67 20 73 74 72 75 63 74 75 72 65 20 69 73 20  ng structure is 
21a30 75 73 65 64 20 62 79 20 74 68 65 20 74 72 65 65  used by the tree
21a40 20 77 61 6c 6b 65 72 0a 2a 2a 20 74 6f 20 63 6f   walker.** to co
21a50 75 6e 74 20 72 65 66 65 72 65 6e 63 65 73 20 74  unt references t
21a60 6f 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 20  o table columns 
21a70 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74 73  in the arguments
21a80 20 6f 66 20 61 6e 20 0a 2a 2a 20 61 67 67 72 65   of an .** aggre
21a90 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 2c 20 69  gate function, i
21aa0 6e 20 6f 72 64 65 72 20 74 6f 20 69 6d 70 6c 65  n order to imple
21ab0 6d 65 6e 74 20 74 68 65 0a 2a 2a 20 73 71 6c 69  ment the.** sqli
21ac0 74 65 33 46 75 6e 63 74 69 6f 6e 54 68 69 73 53  te3FunctionThisS
21ad0 72 63 28 29 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f  rc() routine..*/
21ae0 0a 73 74 72 75 63 74 20 53 72 63 43 6f 75 6e 74  .struct SrcCount
21af0 20 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53   {.  SrcList *pS
21b00 72 63 3b 20 20 20 2f 2a 20 4f 6e 65 20 70 61 72  rc;   /* One par
21b10 74 69 63 75 6c 61 72 20 46 52 4f 4d 20 63 6c 61  ticular FROM cla
21b20 75 73 65 20 69 6e 20 61 20 6e 65 73 74 65 64 20  use in a nested 
21b30 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6e  query */.  int n
21b40 54 68 69 73 3b 20 20 20 20 20 20 20 2f 2a 20 4e  This;       /* N
21b50 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e  umber of referen
21b60 63 65 73 20 74 6f 20 63 6f 6c 75 6d 6e 73 20 69  ces to columns i
21b70 6e 20 70 53 72 63 4c 69 73 74 20 2a 2f 0a 20 20  n pSrcList */.  
21b80 69 6e 74 20 6e 4f 74 68 65 72 3b 20 20 20 20 20  int nOther;     
21b90 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65   /* Number of re
21ba0 66 65 72 65 6e 63 65 73 20 74 6f 20 63 6f 6c 75  ferences to colu
21bb0 6d 6e 73 20 69 6e 20 6f 74 68 65 72 20 46 52 4f  mns in other FRO
21bc0 4d 20 63 6c 61 75 73 65 73 20 2a 2f 0a 7d 3b 0a  M clauses */.};.
21bd0 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65  ./*.** Count the
21be0 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72   number of refer
21bf0 65 6e 63 65 73 20 74 6f 20 63 6f 6c 75 6d 6e 73  ences to columns
21c00 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
21c10 65 78 70 72 53 72 63 43 6f 75 6e 74 28 57 61 6c  exprSrcCount(Wal
21c20 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78  ker *pWalker, Ex
21c30 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 2f 2a  pr *pExpr){.  /*
21c40 20 54 68 65 20 4e 45 56 45 52 28 29 20 6f 6e 20   The NEVER() on 
21c50 74 68 65 20 73 65 63 6f 6e 64 20 74 65 72 6d 20  the second term 
21c60 69 73 20 62 65 63 61 75 73 65 20 73 71 6c 69 74  is because sqlit
21c70 65 33 46 75 6e 63 74 69 6f 6e 55 73 65 73 54 68  e3FunctionUsesTh
21c80 69 73 53 72 63 28 29 0a 20 20 2a 2a 20 69 73 20  isSrc().  ** is 
21c90 61 6c 77 61 79 73 20 63 61 6c 6c 65 64 20 62 65  always called be
21ca0 66 6f 72 65 20 73 71 6c 69 74 65 33 45 78 70 72  fore sqlite3Expr
21cb0 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  AnalyzeAggregate
21cc0 73 28 29 20 61 6e 64 20 73 6f 20 74 68 65 0a 20  s() and so the. 
21cd0 20 2a 2a 20 54 4b 5f 43 4f 4c 55 4d 4e 73 20 68   ** TK_COLUMNs h
21ce0 61 76 65 20 6e 6f 74 20 79 65 74 20 62 65 65 6e  ave not yet been
21cf0 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20   converted into 
21d00 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 2e 20 20  TK_AGG_COLUMN.  
21d10 49 66 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 46  If.  ** sqlite3F
21d20 75 6e 63 74 69 6f 6e 55 73 65 73 54 68 69 73 53  unctionUsesThisS
21d30 72 63 28 29 20 69 73 20 75 73 65 64 20 64 69 66  rc() is used dif
21d40 66 65 72 65 6e 74 6c 79 20 69 6e 20 74 68 65 20  ferently in the 
21d50 66 75 74 75 72 65 2c 20 74 68 65 0a 20 20 2a 2a  future, the.  **
21d60 20 4e 45 56 45 52 28 29 20 77 69 6c 6c 20 6e 65   NEVER() will ne
21d70 65 64 20 74 6f 20 62 65 20 72 65 6d 6f 76 65 64  ed to be removed
21d80 2e 20 2a 2f 0a 20 20 69 66 28 20 70 45 78 70 72  . */.  if( pExpr
21d90 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
21da0 7c 7c 20 4e 45 56 45 52 28 70 45 78 70 72 2d 3e  || NEVER(pExpr->
21db0 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  op==TK_AGG_COLUM
21dc0 4e 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  N) ){.    int i;
21dd0 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63 43  .    struct SrcC
21de0 6f 75 6e 74 20 2a 70 20 3d 20 70 57 61 6c 6b 65  ount *p = pWalke
21df0 72 2d 3e 75 2e 70 53 72 63 43 6f 75 6e 74 3b 0a  r->u.pSrcCount;.
21e00 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72      SrcList *pSr
21e10 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20  c = p->pSrc;.   
21e20 20 69 6e 74 20 6e 53 72 63 20 3d 20 70 53 72 63   int nSrc = pSrc
21e30 20 3f 20 70 53 72 63 2d 3e 6e 53 72 63 20 3a 20   ? pSrc->nSrc : 
21e40 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  0;.    for(i=0; 
21e50 69 3c 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20  i<nSrc; i++){.  
21e60 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69      if( pExpr->i
21e70 54 61 62 6c 65 3d 3d 70 53 72 63 2d 3e 61 5b 69  Table==pSrc->a[i
21e80 5d 2e 69 43 75 72 73 6f 72 20 29 20 62 72 65 61  ].iCursor ) brea
21e90 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  k;.    }.    if(
21ea0 20 69 3c 6e 53 72 63 20 29 7b 0a 20 20 20 20 20   i<nSrc ){.     
21eb0 20 70 2d 3e 6e 54 68 69 73 2b 2b 3b 0a 20 20 20   p->nThis++;.   
21ec0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d   }else{.      p-
21ed0 3e 6e 4f 74 68 65 72 2b 2b 3b 0a 20 20 20 20 7d  >nOther++;.    }
21ee0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 57 52  .  }.  return WR
21ef0 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f  C_Continue;.}../
21f00 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 69  *.** Determine i
21f10 66 20 61 6e 79 20 6f 66 20 74 68 65 20 61 72 67  f any of the arg
21f20 75 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 70 45  uments to the pE
21f30 78 70 72 20 46 75 6e 63 74 69 6f 6e 20 72 65 66  xpr Function ref
21f40 65 72 65 6e 63 65 0a 2a 2a 20 70 53 72 63 4c 69  erence.** pSrcLi
21f50 73 74 2e 20 20 52 65 74 75 72 6e 20 74 72 75 65  st.  Return true
21f60 20 69 66 20 74 68 65 79 20 64 6f 2e 20 20 41 6c   if they do.  Al
21f70 73 6f 20 72 65 74 75 72 6e 20 74 72 75 65 20 69  so return true i
21f80 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 0a 2a  f the function.*
21f90 2a 20 68 61 73 20 6e 6f 20 61 72 67 75 6d 65 6e  * has no argumen
21fa0 74 73 20 6f 72 20 68 61 73 20 6f 6e 6c 79 20 63  ts or has only c
21fb0 6f 6e 73 74 61 6e 74 20 61 72 67 75 6d 65 6e 74  onstant argument
21fc0 73 2e 20 20 52 65 74 75 72 6e 20 66 61 6c 73 65  s.  Return false
21fd0 20 69 66 20 70 45 78 70 72 0a 2a 2a 20 72 65 66   if pExpr.** ref
21fe0 65 72 65 6e 63 65 73 20 63 6f 6c 75 6d 6e 73 20  erences columns 
21ff0 62 75 74 20 6e 6f 74 20 63 6f 6c 75 6d 6e 73 20  but not columns 
22000 6f 66 20 74 61 62 6c 65 73 20 66 6f 75 6e 64 20  of tables found 
22010 69 6e 20 70 53 72 63 4c 69 73 74 2e 0a 2a 2f 0a  in pSrcList..*/.
22020 69 6e 74 20 73 71 6c 69 74 65 33 46 75 6e 63 74  int sqlite3Funct
22030 69 6f 6e 55 73 65 73 54 68 69 73 53 72 63 28 45  ionUsesThisSrc(E
22040 78 70 72 20 2a 70 45 78 70 72 2c 20 53 72 63 4c  xpr *pExpr, SrcL
22050 69 73 74 20 2a 70 53 72 63 4c 69 73 74 29 7b 0a  ist *pSrcList){.
22060 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 73 74    Walker w;.  st
22070 72 75 63 74 20 53 72 63 43 6f 75 6e 74 20 63 6e  ruct SrcCount cn
22080 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  t;.  assert( pEx
22090 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46  pr->op==TK_AGG_F
220a0 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 6d 65 6d  UNCTION );.  mem
220b0 73 65 74 28 26 77 2c 20 30 2c 20 73 69 7a 65 6f  set(&w, 0, sizeo
220c0 66 28 77 29 29 3b 0a 20 20 77 2e 78 45 78 70 72  f(w));.  w.xExpr
220d0 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72 53  Callback = exprS
220e0 72 63 43 6f 75 6e 74 3b 0a 20 20 77 2e 75 2e 70  rcCount;.  w.u.p
220f0 53 72 63 43 6f 75 6e 74 20 3d 20 26 63 6e 74 3b  SrcCount = &cnt;
22100 0a 20 20 63 6e 74 2e 70 53 72 63 20 3d 20 70 53  .  cnt.pSrc = pS
22110 72 63 4c 69 73 74 3b 0a 20 20 63 6e 74 2e 6e 54  rcList;.  cnt.nT
22120 68 69 73 20 3d 20 30 3b 0a 20 20 63 6e 74 2e 6e  his = 0;.  cnt.n
22130 4f 74 68 65 72 20 3d 20 30 3b 0a 20 20 73 71 6c  Other = 0;.  sql
22140 69 74 65 33 57 61 6c 6b 45 78 70 72 4c 69 73 74  ite3WalkExprList
22150 28 26 77 2c 20 70 45 78 70 72 2d 3e 78 2e 70 4c  (&w, pExpr->x.pL
22160 69 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 63  ist);.  return c
22170 6e 74 2e 6e 54 68 69 73 3e 30 20 7c 7c 20 63 6e  nt.nThis>0 || cn
22180 74 2e 6e 4f 74 68 65 72 3d 3d 30 3b 0a 7d 0a 0a  t.nOther==0;.}..
22190 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20  /*.** Add a new 
221a0 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 70  element to the p
221b0 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20  AggInfo->aCol[] 
221c0 61 72 72 61 79 2e 20 20 52 65 74 75 72 6e 20 74  array.  Return t
221d0 68 65 20 69 6e 64 65 78 20 6f 66 0a 2a 2a 20 74  he index of.** t
221e0 68 65 20 6e 65 77 20 65 6c 65 6d 65 6e 74 2e 20  he new element. 
221f0 20 52 65 74 75 72 6e 20 61 20 6e 65 67 61 74 69   Return a negati
22200 76 65 20 6e 75 6d 62 65 72 20 69 66 20 6d 61 6c  ve number if mal
22210 6c 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74  loc fails..*/.st
22220 61 74 69 63 20 69 6e 74 20 61 64 64 41 67 67 49  atic int addAggI
22230 6e 66 6f 43 6f 6c 75 6d 6e 28 73 71 6c 69 74 65  nfoColumn(sqlite
22240 33 20 2a 64 62 2c 20 41 67 67 49 6e 66 6f 20 2a  3 *db, AggInfo *
22250 70 49 6e 66 6f 29 7b 0a 20 20 69 6e 74 20 69 3b  pInfo){.  int i;
22260 0a 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 20 3d  .  pInfo->aCol =
22270 20 73 71 6c 69 74 65 33 41 72 72 61 79 41 6c 6c   sqlite3ArrayAll
22280 6f 63 61 74 65 28 0a 20 20 20 20 20 20 20 64 62  ocate(.       db
22290 2c 0a 20 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e  ,.       pInfo->
222a0 61 43 6f 6c 2c 0a 20 20 20 20 20 20 20 73 69 7a  aCol,.       siz
222b0 65 6f 66 28 70 49 6e 66 6f 2d 3e 61 43 6f 6c 5b  eof(pInfo->aCol[
222c0 30 5d 29 2c 0a 20 20 20 20 20 20 20 26 70 49 6e  0]),.       &pIn
222d0 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 2c 0a 20 20 20  fo->nColumn,.   
222e0 20 20 20 20 26 69 0a 20 20 29 3b 0a 20 20 72 65      &i.  );.  re
222f0 74 75 72 6e 20 69 3b 0a 7d 20 20 20 20 0a 0a 2f  turn i;.}    ../
22300 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 65  *.** Add a new e
22310 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 70 41  lement to the pA
22320 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 20  ggInfo->aFunc[] 
22330 61 72 72 61 79 2e 20 20 52 65 74 75 72 6e 20 74  array.  Return t
22340 68 65 20 69 6e 64 65 78 20 6f 66 0a 2a 2a 20 74  he index of.** t
22350 68 65 20 6e 65 77 20 65 6c 65 6d 65 6e 74 2e 20  he new element. 
22360 20 52 65 74 75 72 6e 20 61 20 6e 65 67 61 74 69   Return a negati
22370 76 65 20 6e 75 6d 62 65 72 20 69 66 20 6d 61 6c  ve number if mal
22380 6c 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74  loc fails..*/.st
22390 61 74 69 63 20 69 6e 74 20 61 64 64 41 67 67 49  atic int addAggI
223a0 6e 66 6f 46 75 6e 63 28 73 71 6c 69 74 65 33 20  nfoFunc(sqlite3 
223b0 2a 64 62 2c 20 41 67 67 49 6e 66 6f 20 2a 70 49  *db, AggInfo *pI
223c0 6e 66 6f 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  nfo){.  int i;. 
223d0 20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 20 3d 20   pInfo->aFunc = 
223e0 73 71 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f  sqlite3ArrayAllo
223f0 63 61 74 65 28 0a 20 20 20 20 20 20 20 64 62 2c  cate(.       db,
22400 20 0a 20 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e   .       pInfo->
22410 61 46 75 6e 63 2c 0a 20 20 20 20 20 20 20 73 69  aFunc,.       si
22420 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 61 46 75 6e  zeof(pInfo->aFun
22430 63 5b 30 5d 29 2c 0a 20 20 20 20 20 20 20 26 70  c[0]),.       &p
22440 49 6e 66 6f 2d 3e 6e 46 75 6e 63 2c 0a 20 20 20  Info->nFunc,.   
22450 20 20 20 20 26 69 0a 20 20 29 3b 0a 20 20 72 65      &i.  );.  re
22460 74 75 72 6e 20 69 3b 0a 7d 20 20 20 20 0a 0a 2f  turn i;.}    ../
22470 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65  *.** This is the
22480 20 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 66   xExprCallback f
22490 6f 72 20 61 20 74 72 65 65 20 77 61 6c 6b 65 72  or a tree walker
224a0 2e 20 20 49 74 20 69 73 20 75 73 65 64 20 74 6f  .  It is used to
224b0 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 73 71  .** implement sq
224c0 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65  lite3ExprAnalyze
224d0 41 67 67 72 65 67 61 74 65 73 28 29 2e 20 20 53  Aggregates().  S
224e0 65 65 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e  ee sqlite3ExprAn
224f0 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 0a  alyzeAggregates.
22500 2a 2a 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  ** for additiona
22510 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a  l information..*
22520 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6e 61  /.static int ana
22530 6c 79 7a 65 41 67 67 72 65 67 61 74 65 28 57 61  lyzeAggregate(Wa
22540 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45  lker *pWalker, E
22550 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69  xpr *pExpr){.  i
22560 6e 74 20 69 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74  nt i;.  NameCont
22570 65 78 74 20 2a 70 4e 43 20 3d 20 70 57 61 6c 6b  ext *pNC = pWalk
22580 65 72 2d 3e 75 2e 70 4e 43 3b 0a 20 20 50 61 72  er->u.pNC;.  Par
22590 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 4e 43  se *pParse = pNC
225a0 2d 3e 70 50 61 72 73 65 3b 0a 20 20 53 72 63 4c  ->pParse;.  SrcL
225b0 69 73 74 20 2a 70 53 72 63 4c 69 73 74 20 3d 20  ist *pSrcList = 
225c0 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3b 0a 20  pNC->pSrcList;. 
225d0 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e   AggInfo *pAggIn
225e0 66 6f 20 3d 20 70 4e 43 2d 3e 70 41 67 67 49 6e  fo = pNC->pAggIn
225f0 66 6f 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 70  fo;..  switch( p
22600 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  Expr->op ){.    
22610 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55  case TK_AGG_COLU
22620 4d 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  MN:.    case TK_
22630 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20  COLUMN: {.      
22640 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
22650 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55  >op==TK_AGG_COLU
22660 4d 4e 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  MN );.      test
22670 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
22680 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20  =TK_COLUMN );.  
22690 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20      /* Check to 
226a0 73 65 65 20 69 66 20 74 68 65 20 63 6f 6c 75 6d  see if the colum
226b0 6e 20 69 73 20 69 6e 20 6f 6e 65 20 6f 66 20 74  n is in one of t
226c0 68 65 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65  he tables in the
226d0 20 46 52 4f 4d 0a 20 20 20 20 20 20 2a 2a 20 63   FROM.      ** c
226e0 6c 61 75 73 65 20 6f 66 20 74 68 65 20 61 67 67  lause of the agg
226f0 72 65 67 61 74 65 20 71 75 65 72 79 20 2a 2f 0a  regate query */.
22700 20 20 20 20 20 20 69 66 28 20 41 4c 57 41 59 53        if( ALWAYS
22710 28 70 53 72 63 4c 69 73 74 21 3d 30 29 20 29 7b  (pSrcList!=0) ){
22720 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20  .        struct 
22730 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
22740 74 65 6d 20 3d 20 70 53 72 63 4c 69 73 74 2d 3e  tem = pSrcList->
22750 61 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  a;.        for(i
22760 3d 30 3b 20 69 3c 70 53 72 63 4c 69 73 74 2d 3e  =0; i<pSrcList->
22770 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d  nSrc; i++, pItem
22780 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  ++){.          s
22790 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f  truct AggInfo_co
227a0 6c 20 2a 70 43 6f 6c 3b 0a 20 20 20 20 20 20 20  l *pCol;.       
227b0 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
227c0 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
227d0 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c  r, EP_TokenOnly|
227e0 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a 20  EP_Reduced) );. 
227f0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78           if( pEx
22800 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 49 74 65  pr->iTable==pIte
22810 6d 2d 3e 69 43 75 72 73 6f 72 20 29 7b 0a 20 20  m->iCursor ){.  
22820 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
22830 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f  we reach this po
22840 69 6e 74 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  int, it means th
22850 61 74 20 70 45 78 70 72 20 72 65 66 65 72 73 20  at pExpr refers 
22860 74 6f 20 61 20 74 61 62 6c 65 0a 20 20 20 20 20  to a table.     
22870 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 69         ** that i
22880 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  s in the FROM cl
22890 61 75 73 65 20 6f 66 20 74 68 65 20 61 67 67 72  ause of the aggr
228a0 65 67 61 74 65 20 71 75 65 72 79 2e 20 20 0a 20  egate query.  . 
228b0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 0a 20 20             **.  
228c0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 4d 61 6b            ** Mak
228d0 65 20 61 6e 20 65 6e 74 72 79 20 66 6f 72 20 74  e an entry for t
228e0 68 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 41 67  he column in pAg
228f0 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 69 66  gInfo->aCol[] if
22900 20 74 68 65 72 65 0a 20 20 20 20 20 20 20 20 20   there.         
22910 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61 6e 20     ** is not an 
22920 65 6e 74 72 79 20 74 68 65 72 65 20 61 6c 72 65  entry there alre
22930 61 64 79 2e 0a 20 20 20 20 20 20 20 20 20 20 20  ady..           
22940 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
22950 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20 20 20 20  int k;.         
22960 20 20 20 70 43 6f 6c 20 3d 20 70 41 67 67 49 6e     pCol = pAggIn
22970 66 6f 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 20 20  fo->aCol;.      
22980 20 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b        for(k=0; k
22990 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75  <pAggInfo->nColu
229a0 6d 6e 3b 20 6b 2b 2b 2c 20 70 43 6f 6c 2b 2b 29  mn; k++, pCol++)
229b0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
229c0 69 66 28 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65  if( pCol->iTable
229d0 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20  ==pExpr->iTable 
229e0 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  &&.             
229f0 20 20 20 20 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75       pCol->iColu
22a00 6d 6e 3d 3d 70 45 78 70 72 2d 3e 69 43 6f 6c 75  mn==pExpr->iColu
22a10 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  mn ){.          
22a20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
22a30 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
22a40 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
22a50 20 20 20 20 20 20 20 69 66 28 20 28 6b 3e 3d 70         if( (k>=p
22a60 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e  AggInfo->nColumn
22a70 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26  ).             &
22a80 26 20 28 6b 20 3d 20 61 64 64 41 67 67 49 6e 66  & (k = addAggInf
22a90 6f 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2d 3e  oColumn(pParse->
22aa0 64 62 2c 20 70 41 67 67 49 6e 66 6f 29 29 3e 3d  db, pAggInfo))>=
22ab0 30 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 29  0 .            )
22ac0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
22ad0 70 43 6f 6c 20 3d 20 26 70 41 67 67 49 6e 66 6f  pCol = &pAggInfo
22ae0 2d 3e 61 43 6f 6c 5b 6b 5d 3b 0a 20 20 20 20 20  ->aCol[k];.     
22af0 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70           pCol->p
22b00 54 61 62 20 3d 20 70 45 78 70 72 2d 3e 70 54 61  Tab = pExpr->pTa
22b10 62 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  b;.             
22b20 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 20 3d 20   pCol->iTable = 
22b30 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20  pExpr->iTable;. 
22b40 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
22b50 6c 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 70 45 78  l->iColumn = pEx
22b60 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20  pr->iColumn;.   
22b70 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
22b80 3e 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65  >iMem = ++pParse
22b90 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20  ->nMem;.        
22ba0 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72        pCol->iSor
22bb0 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a  terColumn = -1;.
22bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
22bd0 6f 6c 2d 3e 70 45 78 70 72 20 3d 20 70 45 78 70  ol->pExpr = pExp
22be0 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r;.             
22bf0 20 69 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e 70   if( pAggInfo->p
22c00 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20  GroupBy ){.     
22c10 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6a             int j
22c20 2c 20 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20  , n;.           
22c30 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70       ExprList *p
22c40 47 42 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 70  GB = pAggInfo->p
22c50 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 20 20 20  GroupBy;.       
22c60 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20           struct 
22c70 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
22c80 54 65 72 6d 20 3d 20 70 47 42 2d 3e 61 3b 0a 20  Term = pGB->a;. 
22c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e                 n
22ca0 20 3d 20 70 47 42 2d 3e 6e 45 78 70 72 3b 0a 20   = pGB->nExpr;. 
22cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66                 f
22cc0 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 3b 20 6a 2b 2b  or(j=0; j<n; j++
22cd0 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  , pTerm++){.    
22ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45 78                Ex
22cf0 70 72 20 2a 70 45 20 3d 20 70 54 65 72 6d 2d 3e  pr *pE = pTerm->
22d00 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20  pExpr;.         
22d10 20 20 20 20 20 20 20 20 20 69 66 28 20 70 45 2d           if( pE-
22d20 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26  >op==TK_COLUMN &
22d30 26 20 70 45 2d 3e 69 54 61 62 6c 65 3d 3d 70 45  & pE->iTable==pE
22d40 78 70 72 2d 3e 69 54 61 62 6c 65 20 26 26 0a 20  xpr->iTable &&. 
22d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22d60 20 20 20 20 20 70 45 2d 3e 69 43 6f 6c 75 6d 6e       pE->iColumn
22d70 3d 3d 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ==pExpr->iColumn
22d80 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
22d90 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53          pCol->iS
22da0 6f 72 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 6a 3b  orterColumn = j;
22db0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
22dc0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
22dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
22de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22df0 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
22e00 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
22e10 69 66 28 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65  if( pCol->iSorte
22e20 72 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20  rColumn<0 ){.   
22e30 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
22e40 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e  l->iSorterColumn
22e50 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 53 6f   = pAggInfo->nSo
22e60 72 74 69 6e 67 43 6f 6c 75 6d 6e 2b 2b 3b 0a 20  rtingColumn++;. 
22e70 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
22e80 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
22e90 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 72           /* Ther
22ea0 65 20 69 73 20 6e 6f 77 20 61 6e 20 65 6e 74 72  e is now an entr
22eb0 79 20 66 6f 72 20 70 45 78 70 72 20 69 6e 20 70  y for pExpr in p
22ec0 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20  AggInfo->aCol[] 
22ed0 28 65 69 74 68 65 72 0a 20 20 20 20 20 20 20 20  (either.        
22ee0 20 20 20 20 2a 2a 20 62 65 63 61 75 73 65 20 69      ** because i
22ef0 74 20 77 61 73 20 74 68 65 72 65 20 62 65 66 6f  t was there befo
22f00 72 65 20 6f 72 20 62 65 63 61 75 73 65 20 77 65  re or because we
22f10 20 6a 75 73 74 20 63 72 65 61 74 65 64 20 69 74   just created it
22f20 29 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  )..            *
22f30 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20 70 45  * Convert the pE
22f40 78 70 72 20 74 6f 20 62 65 20 61 20 54 4b 5f 41  xpr to be a TK_A
22f50 47 47 5f 43 4f 4c 55 4d 4e 20 72 65 66 65 72 72  GG_COLUMN referr
22f60 69 6e 67 20 74 6f 20 74 68 61 74 0a 20 20 20 20  ing to that.    
22f70 20 20 20 20 20 20 20 20 2a 2a 20 70 41 67 67 49          ** pAggI
22f80 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 65 6e 74 72  nfo->aCol[] entr
22f90 79 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  y..            *
22fa0 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 45 78  /.            Ex
22fb0 70 72 53 65 74 56 56 41 50 72 6f 70 65 72 74 79  prSetVVAProperty
22fc0 28 70 45 78 70 72 2c 20 45 50 5f 4e 6f 52 65 64  (pExpr, EP_NoRed
22fd0 75 63 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  uce);.          
22fe0 20 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66    pExpr->pAggInf
22ff0 6f 20 3d 20 70 41 67 67 49 6e 66 6f 3b 0a 20 20  o = pAggInfo;.  
23000 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
23010 3e 6f 70 20 3d 20 54 4b 5f 41 47 47 5f 43 4f 4c  >op = TK_AGG_COL
23020 55 4d 4e 3b 0a 20 20 20 20 20 20 20 20 20 20 20  UMN;.           
23030 20 70 45 78 70 72 2d 3e 69 41 67 67 20 3d 20 28   pExpr->iAgg = (
23040 69 31 36 29 6b 3b 0a 20 20 20 20 20 20 20 20 20  i16)k;.         
23050 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
23060 20 20 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20 70      } /* endif p
23070 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 49  Expr->iTable==pI
23080 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 2a 2f 0a  tem->iCursor */.
23090 20 20 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64          } /* end
230a0 20 6c 6f 6f 70 20 6f 76 65 72 20 70 53 72 63 4c   loop over pSrcL
230b0 69 73 74 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20  ist */.      }. 
230c0 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f       return WRC_
230d0 50 72 75 6e 65 3b 0a 20 20 20 20 7d 0a 20 20 20  Prune;.    }.   
230e0 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e   case TK_AGG_FUN
230f0 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 69  CTION: {.      i
23100 66 28 20 28 70 4e 43 2d 3e 6e 63 46 6c 61 67 73  f( (pNC->ncFlags
23110 20 26 20 4e 43 5f 49 6e 41 67 67 46 75 6e 63 29   & NC_InAggFunc)
23120 3d 3d 30 0a 20 20 20 20 20 20 20 26 26 20 70 57  ==0.       && pW
23130 61 6c 6b 65 72 2d 3e 77 61 6c 6b 65 72 44 65 70  alker->walkerDep
23140 74 68 3d 3d 70 45 78 70 72 2d 3e 6f 70 32 0a 20  th==pExpr->op2. 
23150 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
23160 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  /* Check to see 
23170 69 66 20 70 45 78 70 72 20 69 73 20 61 20 64 75  if pExpr is a du
23180 70 6c 69 63 61 74 65 20 6f 66 20 61 6e 6f 74 68  plicate of anoth
23190 65 72 20 61 67 67 72 65 67 61 74 65 20 0a 20 20  er aggregate .  
231a0 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f        ** functio
231b0 6e 20 74 68 61 74 20 69 73 20 61 6c 72 65 61 64  n that is alread
231c0 79 20 69 6e 20 74 68 65 20 70 41 67 67 49 6e 66  y in the pAggInf
231d0 6f 20 73 74 72 75 63 74 75 72 65 0a 20 20 20 20  o structure.    
231e0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 73      */.        s
231f0 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75  truct AggInfo_fu
23200 6e 63 20 2a 70 49 74 65 6d 20 3d 20 70 41 67 67  nc *pItem = pAgg
23210 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 0a 20 20 20  Info->aFunc;.   
23220 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
23230 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b  pAggInfo->nFunc;
23240 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i++, pItem++){.
23250 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71            if( sq
23260 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65  lite3ExprCompare
23270 28 70 49 74 65 6d 2d 3e 70 45 78 70 72 2c 20 70  (pItem->pExpr, p
23280 45 78 70 72 2c 20 2d 31 29 3d 3d 30 20 29 7b 0a  Expr, -1)==0 ){.
23290 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
232a0 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  k;.          }. 
232b0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
232c0 20 69 66 28 20 69 3e 3d 70 41 67 67 49 6e 66 6f   if( i>=pAggInfo
232d0 2d 3e 6e 46 75 6e 63 20 29 7b 0a 20 20 20 20 20  ->nFunc ){.     
232e0 20 20 20 20 20 2f 2a 20 70 45 78 70 72 20 69 73       /* pExpr is
232f0 20 6f 72 69 67 69 6e 61 6c 2e 20 20 4d 61 6b 65   original.  Make
23300 20 61 20 6e 65 77 20 65 6e 74 72 79 20 69 6e 20   a new entry in 
23310 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b  pAggInfo->aFunc[
23320 5d 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ].          */. 
23330 20 20 20 20 20 20 20 20 20 75 38 20 65 6e 63 20           u8 enc 
23340 3d 20 45 4e 43 28 70 50 61 72 73 65 2d 3e 64 62  = ENC(pParse->db
23350 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 20 3d  );.          i =
23360 20 61 64 64 41 67 67 49 6e 66 6f 46 75 6e 63 28   addAggInfoFunc(
23370 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 41 67 67  pParse->db, pAgg
23380 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 20  Info);.         
23390 20 69 66 28 20 69 3e 3d 30 20 29 7b 0a 20 20 20   if( i>=0 ){.   
233a0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
233b0 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
233c0 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
233d0 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20  elect) );.      
233e0 20 20 20 20 20 20 70 49 74 65 6d 20 3d 20 26 70        pItem = &p
233f0 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69  AggInfo->aFunc[i
23400 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ];.            p
23410 49 74 65 6d 2d 3e 70 45 78 70 72 20 3d 20 70 45  Item->pExpr = pE
23420 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20  xpr;.           
23430 20 70 49 74 65 6d 2d 3e 69 4d 65 6d 20 3d 20 2b   pItem->iMem = +
23440 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
23450 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
23460 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
23470 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e  rty(pExpr, EP_In
23480 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20  tValue) );.     
23490 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 46         pItem->pF
234a0 75 6e 63 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  unc = sqlite3Fin
234b0 64 46 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65  dFunction(pParse
234c0 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20  ->db,.          
234d0 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
234e0 75 2e 7a 54 6f 6b 65 6e 2c 20 73 71 6c 69 74 65  u.zToken, sqlite
234f0 33 53 74 72 6c 65 6e 33 30 28 70 45 78 70 72 2d  3Strlen30(pExpr-
23500 3e 75 2e 7a 54 6f 6b 65 6e 29 2c 0a 20 20 20 20  >u.zToken),.    
23510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
23520 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20 3f 20  Expr->x.pList ? 
23530 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e  pExpr->x.pList->
23540 6e 45 78 70 72 20 3a 20 30 2c 20 65 6e 63 2c 20  nExpr : 0, enc, 
23550 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0);.            
23560 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73  if( pExpr->flags
23570 20 26 20 45 50 5f 44 69 73 74 69 6e 63 74 20 29   & EP_Distinct )
23580 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
23590 70 49 74 65 6d 2d 3e 69 44 69 73 74 69 6e 63 74  pItem->iDistinct
235a0 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
235b0 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  +;.            }
235c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
235d0 20 20 20 20 70 49 74 65 6d 2d 3e 69 44 69 73 74      pItem->iDist
235e0 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20  inct = -1;.     
235f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
23600 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
23610 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 70         /* Make p
23620 45 78 70 72 20 70 6f 69 6e 74 20 74 6f 20 74 68  Expr point to th
23630 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 70 41  e appropriate pA
23640 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 20  ggInfo->aFunc[] 
23650 65 6e 74 72 79 0a 20 20 20 20 20 20 20 20 2a 2f  entry.        */
23660 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
23670 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
23680 79 28 70 45 78 70 72 2c 20 45 50 5f 54 6f 6b 65  y(pExpr, EP_Toke
23690 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64  nOnly|EP_Reduced
236a0 29 20 29 3b 0a 20 20 20 20 20 20 20 20 45 78 70  ) );.        Exp
236b0 72 53 65 74 56 56 41 50 72 6f 70 65 72 74 79 28  rSetVVAProperty(
236c0 70 45 78 70 72 2c 20 45 50 5f 4e 6f 52 65 64 75  pExpr, EP_NoRedu
236d0 63 65 29 3b 0a 20 20 20 20 20 20 20 20 70 45 78  ce);.        pEx
236e0 70 72 2d 3e 69 41 67 67 20 3d 20 28 69 31 36 29  pr->iAgg = (i16)
236f0 69 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72  i;.        pExpr
23700 2d 3e 70 41 67 67 49 6e 66 6f 20 3d 20 70 41 67  ->pAggInfo = pAg
23710 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 72  gInfo;.        r
23720 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b  eturn WRC_Prune;
23730 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
23740 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
23750 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20  _Continue;.     
23760 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
23770 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e  eturn WRC_Contin
23780 75 65 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74  ue;.}.static int
23790 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74   analyzeAggregat
237a0 65 73 49 6e 53 65 6c 65 63 74 28 57 61 6c 6b 65  esInSelect(Walke
237b0 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65  r *pWalker, Sele
237c0 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20  ct *pSelect){.  
237d0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
237e0 28 70 57 61 6c 6b 65 72 29 3b 0a 20 20 55 4e 55  (pWalker);.  UNU
237f0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 53  SED_PARAMETER(pS
23800 65 6c 65 63 74 29 3b 0a 20 20 72 65 74 75 72 6e  elect);.  return
23810 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d   WRC_Continue;.}
23820 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20  ../*.** Analyze 
23830 74 68 65 20 70 45 78 70 72 20 65 78 70 72 65 73  the pExpr expres
23840 73 69 6f 6e 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72  sion looking for
23850 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
23860 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f 72 20  ions and.** for 
23870 76 61 72 69 61 62 6c 65 73 20 74 68 61 74 20 6e  variables that n
23880 65 65 64 20 74 6f 20 62 65 20 61 64 64 65 64 20  eed to be added 
23890 74 6f 20 41 67 67 49 6e 66 6f 20 6f 62 6a 65 63  to AggInfo objec
238a0 74 20 74 68 61 74 20 70 4e 43 2d 3e 70 41 67 67  t that pNC->pAgg
238b0 49 6e 66 6f 0a 2a 2a 20 70 6f 69 6e 74 73 20 74  Info.** points t
238c0 6f 2e 20 20 41 64 64 69 74 69 6f 6e 61 6c 20 65  o.  Additional e
238d0 6e 74 72 69 65 73 20 61 72 65 20 6d 61 64 65 20  ntries are made 
238e0 6f 6e 20 74 68 65 20 41 67 67 49 6e 66 6f 20 6f  on the AggInfo o
238f0 62 6a 65 63 74 20 61 73 0a 2a 2a 20 6e 65 63 65  bject as.** nece
23900 73 73 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ssary..**.** Thi
23910 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64  s routine should
23920 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20   only be called 
23930 61 66 74 65 72 20 74 68 65 20 65 78 70 72 65 73  after the expres
23940 73 69 6f 6e 20 68 61 73 20 62 65 65 6e 0a 2a 2a  sion has been.**
23950 20 61 6e 61 6c 79 7a 65 64 20 62 79 20 73 71 6c   analyzed by sql
23960 69 74 65 33 52 65 73 6f 6c 76 65 45 78 70 72 4e  ite3ResolveExprN
23970 61 6d 65 73 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20  ames()..*/.void 
23980 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79  sqlite3ExprAnaly
23990 7a 65 41 67 67 72 65 67 61 74 65 73 28 4e 61 6d  zeAggregates(Nam
239a0 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 45  eContext *pNC, E
239b0 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 57  xpr *pExpr){.  W
239c0 61 6c 6b 65 72 20 77 3b 0a 20 20 6d 65 6d 73 65  alker w;.  memse
239d0 74 28 26 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28  t(&w, 0, sizeof(
239e0 77 29 29 3b 0a 20 20 77 2e 78 45 78 70 72 43 61  w));.  w.xExprCa
239f0 6c 6c 62 61 63 6b 20 3d 20 61 6e 61 6c 79 7a 65  llback = analyze
23a00 41 67 67 72 65 67 61 74 65 3b 0a 20 20 77 2e 78  Aggregate;.  w.x
23a10 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d  SelectCallback =
23a20 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74   analyzeAggregat
23a30 65 73 49 6e 53 65 6c 65 63 74 3b 0a 20 20 77 2e  esInSelect;.  w.
23a40 75 2e 70 4e 43 20 3d 20 70 4e 43 3b 0a 20 20 61  u.pNC = pNC;.  a
23a50 73 73 65 72 74 28 20 70 4e 43 2d 3e 70 53 72 63  ssert( pNC->pSrc
23a60 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 73 71 6c  List!=0 );.  sql
23a70 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77 2c  ite3WalkExpr(&w,
23a80 20 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   pExpr);.}../*.*
23a90 2a 20 43 61 6c 6c 20 73 71 6c 69 74 65 33 45 78  * Call sqlite3Ex
23aa0 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  prAnalyzeAggrega
23ab0 74 65 73 28 29 20 66 6f 72 20 65 76 65 72 79 20  tes() for every 
23ac0 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 61 6e  expression in an
23ad0 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  .** expression l
23ae0 69 73 74 2e 20 20 52 65 74 75 72 6e 20 74 68 65  ist.  Return the
23af0 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72   number of error
23b00 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  s..**.** If an e
23b10 72 72 6f 72 20 69 73 20 66 6f 75 6e 64 2c 20 74  rror is found, t
23b20 68 65 20 61 6e 61 6c 79 73 69 73 20 69 73 20 63  he analysis is c
23b30 75 74 20 73 68 6f 72 74 2e 0a 2a 2f 0a 76 6f 69  ut short..*/.voi
23b40 64 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61  d sqlite3ExprAna
23b50 6c 79 7a 65 41 67 67 4c 69 73 74 28 4e 61 6d 65  lyzeAggList(Name
23b60 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 45 78  Context *pNC, Ex
23b70 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a  prList *pList){.
23b80 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
23b90 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
23ba0 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c   int i;.  if( pL
23bb0 69 73 74 20 29 7b 0a 20 20 20 20 66 6f 72 28 70  ist ){.    for(p
23bc0 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69  Item=pList->a, i
23bd0 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  =0; i<pList->nEx
23be0 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b  pr; i++, pItem++
23bf0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
23c00 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65  ExprAnalyzeAggre
23c10 67 61 74 65 73 28 70 4e 43 2c 20 70 49 74 65 6d  gates(pNC, pItem
23c20 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a  ->pExpr);.    }.
23c30 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c    }.}../*.** All
23c40 6f 63 61 74 65 20 61 20 73 69 6e 67 6c 65 20 6e  ocate a single n
23c50 65 77 20 72 65 67 69 73 74 65 72 20 66 6f 72 20  ew register for 
23c60 75 73 65 20 74 6f 20 68 6f 6c 64 20 73 6f 6d 65  use to hold some
23c70 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 72 65   intermediate re
23c80 73 75 6c 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  sult..*/.int sql
23c90 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 50  ite3GetTempReg(P
23ca0 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20  arse *pParse){. 
23cb0 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 54 65   if( pParse->nTe
23cc0 6d 70 52 65 67 3d 3d 30 20 29 7b 0a 20 20 20 20  mpReg==0 ){.    
23cd0 72 65 74 75 72 6e 20 2b 2b 70 50 61 72 73 65 2d  return ++pParse-
23ce0 3e 6e 4d 65 6d 3b 0a 20 20 7d 0a 20 20 72 65 74  >nMem;.  }.  ret
23cf0 75 72 6e 20 70 50 61 72 73 65 2d 3e 61 54 65 6d  urn pParse->aTem
23d00 70 52 65 67 5b 2d 2d 70 50 61 72 73 65 2d 3e 6e  pReg[--pParse->n
23d10 54 65 6d 70 52 65 67 5d 3b 0a 7d 0a 0a 2f 2a 0a  TempReg];.}../*.
23d20 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20 61 20  ** Deallocate a 
23d30 72 65 67 69 73 74 65 72 2c 20 6d 61 6b 69 6e 67  register, making
23d40 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 72   available for r
23d50 65 75 73 65 20 66 6f 72 20 73 6f 6d 65 20 6f 74  euse for some ot
23d60 68 65 72 0a 2a 2a 20 70 75 72 70 6f 73 65 2e 0a  her.** purpose..
23d70 2a 2a 0a 2a 2a 20 49 66 20 61 20 72 65 67 69 73  **.** If a regis
23d80 74 65 72 20 69 73 20 63 75 72 72 65 6e 74 6c 79  ter is currently
23d90 20 62 65 69 6e 67 20 75 73 65 64 20 62 79 20 74   being used by t
23da0 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2c  he column cache,
23db0 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 64 65 61   then.** the dea
23dc0 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 64 65 66  llocation is def
23dd0 65 72 72 65 64 20 75 6e 74 69 6c 20 74 68 65 20  erred until the 
23de0 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 6c 69 6e  column cache lin
23df0 65 20 74 68 61 74 20 75 73 65 73 0a 2a 2a 20 74  e that uses.** t
23e00 68 65 20 72 65 67 69 73 74 65 72 20 62 65 63 6f  he register beco
23e10 6d 65 73 20 73 74 61 6c 65 2e 0a 2a 2f 0a 76 6f  mes stale..*/.vo
23e20 69 64 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  id sqlite3Releas
23e30 65 54 65 6d 70 52 65 67 28 50 61 72 73 65 20 2a  eTempReg(Parse *
23e40 70 50 61 72 73 65 2c 20 69 6e 74 20 69 52 65 67  pParse, int iReg
23e50 29 7b 0a 20 20 69 66 28 20 69 52 65 67 20 26 26  ){.  if( iReg &&
23e60 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65   pParse->nTempRe
23e70 67 3c 41 72 72 61 79 53 69 7a 65 28 70 50 61 72  g<ArraySize(pPar
23e80 73 65 2d 3e 61 54 65 6d 70 52 65 67 29 20 29 7b  se->aTempReg) ){
23e90 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
23ea0 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65  struct yColCache
23eb0 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30   *p;.    for(i=0
23ec0 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c  , p=pParse->aCol
23ed0 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f  Cache; i<SQLITE_
23ee0 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c  N_COLCACHE; i++,
23ef0 20 70 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   p++){.      if(
23f00 20 70 2d 3e 69 52 65 67 3d 3d 69 52 65 67 20 29   p->iReg==iReg )
23f10 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 74 65 6d  {.        p->tem
23f20 70 52 65 67 20 3d 20 31 3b 0a 20 20 20 20 20 20  pReg = 1;.      
23f30 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20    return;.      
23f40 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72  }.    }.    pPar
23f50 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b 70 50 61  se->aTempReg[pPa
23f60 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 2b 2b 5d  rse->nTempReg++]
23f70 20 3d 20 69 52 65 67 3b 0a 20 20 7d 0a 7d 0a 0a   = iReg;.  }.}..
23f80 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6f  /*.** Allocate o
23f90 72 20 64 65 61 6c 6c 6f 63 61 74 65 20 61 20 62  r deallocate a b
23fa0 6c 6f 63 6b 20 6f 66 20 6e 52 65 67 20 63 6f 6e  lock of nReg con
23fb0 73 65 63 75 74 69 76 65 20 72 65 67 69 73 74 65  secutive registe
23fc0 72 73 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  rs.*/.int sqlite
23fd0 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 50 61  3GetTempRange(Pa
23fe0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
23ff0 20 6e 52 65 67 29 7b 0a 20 20 69 6e 74 20 69 2c   nReg){.  int i,
24000 20 6e 3b 0a 20 20 69 20 3d 20 70 50 61 72 73 65   n;.  i = pParse
24010 2d 3e 69 52 61 6e 67 65 52 65 67 3b 0a 20 20 6e  ->iRangeReg;.  n
24020 20 3d 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67   = pParse->nRang
24030 65 52 65 67 3b 0a 20 20 69 66 28 20 6e 52 65 67  eReg;.  if( nReg
24040 3c 3d 6e 20 29 7b 0a 20 20 20 20 61 73 73 65 72  <=n ){.    asser
24050 74 28 20 21 75 73 65 64 41 73 43 6f 6c 75 6d 6e  t( !usedAsColumn
24060 43 61 63 68 65 28 70 50 61 72 73 65 2c 20 69 2c  Cache(pParse, i,
24070 20 69 2b 6e 2d 31 29 20 29 3b 0a 20 20 20 20 70   i+n-1) );.    p
24080 50 61 72 73 65 2d 3e 69 52 61 6e 67 65 52 65 67  Parse->iRangeReg
24090 20 2b 3d 20 6e 52 65 67 3b 0a 20 20 20 20 70 50   += nReg;.    pP
240a0 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20  arse->nRangeReg 
240b0 2d 3d 20 6e 52 65 67 3b 0a 20 20 7d 65 6c 73 65  -= nReg;.  }else
240c0 7b 0a 20 20 20 20 69 20 3d 20 70 50 61 72 73 65  {.    i = pParse
240d0 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70 50  ->nMem+1;.    pP
240e0 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52  arse->nMem += nR
240f0 65 67 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  eg;.  }.  return
24100 20 69 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74   i;.}.void sqlit
24110 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e  e3ReleaseTempRan
24120 67 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ge(Parse *pParse
24130 2c 20 69 6e 74 20 69 52 65 67 2c 20 69 6e 74 20  , int iReg, int 
24140 6e 52 65 67 29 7b 0a 20 20 73 71 6c 69 74 65 33  nReg){.  sqlite3
24150 45 78 70 72 43 61 63 68 65 52 65 6d 6f 76 65 28  ExprCacheRemove(
24160 70 50 61 72 73 65 2c 20 69 52 65 67 2c 20 6e 52  pParse, iReg, nR
24170 65 67 29 3b 0a 20 20 69 66 28 20 6e 52 65 67 3e  eg);.  if( nReg>
24180 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65  pParse->nRangeRe
24190 67 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d  g ){.    pParse-
241a0 3e 6e 52 61 6e 67 65 52 65 67 20 3d 20 6e 52 65  >nRangeReg = nRe
241b0 67 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 69  g;.    pParse->i
241c0 52 61 6e 67 65 52 65 67 20 3d 20 69 52 65 67 3b  RangeReg = iReg;
241d0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61  .  }.}../*.** Ma
241e0 72 6b 20 61 6c 6c 20 74 65 6d 70 6f 72 61 72 79  rk all temporary
241f0 20 72 65 67 69 73 74 65 72 73 20 61 73 20 62 65   registers as be
24200 69 6e 67 20 75 6e 61 76 61 69 6c 61 62 6c 65 20  ing unavailable 
24210 66 6f 72 20 72 65 75 73 65 2e 0a 2a 2f 0a 76 6f  for reuse..*/.vo
24220 69 64 20 73 71 6c 69 74 65 33 43 6c 65 61 72 54  id sqlite3ClearT
24230 65 6d 70 52 65 67 43 61 63 68 65 28 50 61 72 73  empRegCache(Pars
24240 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 70 50  e *pParse){.  pP
24250 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 20 3d  arse->nTempReg =
24260 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 52   0;.  pParse->nR
24270 61 6e 67 65 52 65 67 20 3d 20 30 3b 0a 7d 0a     angeReg = 0;.}.