/ Hex Artifact Content
Login

Artifact 572ebfeb5c848e8d32096c823f87baa1eb988391:


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 4c 65 66 74 20 26 26 20 70 52 69 67 68 74   pLeft && pRight
43b0: 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   && pParse->nErr
43c0: 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 61  ==0 ){.    /* Ta
43d0: 6b 65 20 61 64 76 61 6e 74 61 67 65 20 6f 66 20  ke advantage of 
43e0: 73 68 6f 72 74 2d 63 69 72 63 75 69 74 20 66 61  short-circuit fa
43f0: 6c 73 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  lse optimization
4400: 20 66 6f 72 20 41 4e 44 20 2a 2f 0a 20 20 20 20   for AND */.    
4410: 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  p = sqlite3ExprA
4420: 6e 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  nd(pParse->db, p
4430: 4c 65 66 74 2c 20 70 52 69 67 68 74 29 3b 0a 20  Left, pRight);. 
4440: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 20 3d 20   }else{.    p = 
4450: 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63  sqlite3ExprAlloc
4460: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 6f 70 2c  (pParse->db, op,
4470: 20 70 54 6f 6b 65 6e 2c 20 31 29 3b 0a 20 20 20   pToken, 1);.   
4480: 20 73 71 6c 69 74 65 33 45 78 70 72 41 74 74 61   sqlite3ExprAtta
4490: 63 68 53 75 62 74 72 65 65 73 28 70 50 61 72 73  chSubtrees(pPars
44a0: 65 2d 3e 64 62 2c 20 70 2c 20 70 4c 65 66 74 2c  e->db, p, pLeft,
44b0: 20 70 52 69 67 68 74 29 3b 0a 20 20 7d 0a 20 20   pRight);.  }.  
44c0: 69 66 28 20 70 20 29 20 7b 0a 20 20 20 20 73 71  if( p ) {.    sq
44d0: 6c 69 74 65 33 45 78 70 72 43 68 65 63 6b 48 65  lite3ExprCheckHe
44e0: 69 67 68 74 28 70 50 61 72 73 65 2c 20 70 2d 3e  ight(pParse, p->
44f0: 6e 48 65 69 67 68 74 29 3b 0a 20 20 7d 0a 20 20  nHeight);.  }.  
4500: 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a  return p;.}../*.
4510: 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73  ** If the expres
4520: 73 69 6f 6e 20 69 73 20 61 6c 77 61 79 73 20 65  sion is always e
4530: 69 74 68 65 72 20 54 52 55 45 20 6f 72 20 46 41  ither TRUE or FA
4540: 4c 53 45 20 28 72 65 73 70 65 63 74 69 76 65 6c  LSE (respectivel
4550: 79 29 2c 0a 2a 2a 20 74 68 65 6e 20 72 65 74 75  y),.** then retu
4560: 72 6e 20 31 2e 20 20 49 66 20 6f 6e 65 20 63 61  rn 1.  If one ca
4570: 6e 6e 6f 74 20 64 65 74 65 72 6d 69 6e 65 20 74  nnot determine t
4580: 68 65 20 74 72 75 74 68 20 76 61 6c 75 65 20 6f  he truth value o
4590: 66 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73  f the.** express
45a0: 69 6f 6e 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74  ion at compile-t
45b0: 69 6d 65 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2a  ime return 0..**
45c0: 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 6e 20 6f  .** This is an o
45d0: 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 49 66  ptimization.  If
45e0: 20 69 73 20 4f 4b 20 74 6f 20 72 65 74 75 72 6e   is OK to return
45f0: 20 30 20 68 65 72 65 20 65 76 65 6e 20 69 66 0a   0 here even if.
4600: 2a 2a 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  ** the expressio
4610: 6e 20 72 65 61 6c 6c 79 20 69 73 20 61 6c 77 61  n really is alwa
4620: 79 73 20 66 61 6c 73 65 20 6f 72 20 66 61 6c 73  ys false or fals
4630: 65 20 28 61 20 66 61 6c 73 65 20 6e 65 67 61 74  e (a false negat
4640: 69 76 65 29 2e 0a 2a 2a 20 42 75 74 20 69 74 20  ive)..** But it 
4650: 69 73 20 61 20 62 75 67 20 74 6f 20 72 65 74 75  is a bug to retu
4660: 72 6e 20 31 20 69 66 20 74 68 65 20 65 78 70 72  rn 1 if the expr
4670: 65 73 73 69 6f 6e 20 6d 69 67 68 74 20 68 61 76  ession might hav
4680: 65 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 62  e different.** b
4690: 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 73 20 69 6e  oolean values in
46a0: 20 64 69 66 66 65 72 65 6e 74 20 63 69 72 63 75   different circu
46b0: 6d 73 74 61 6e 63 65 73 20 28 61 20 66 61 6c 73  mstances (a fals
46c0: 65 20 70 6f 73 69 74 69 76 65 2e 29 0a 2a 2a 0a  e positive.).**.
46d0: 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 66 20  ** Note that if 
46e0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
46f0: 73 20 70 61 72 74 20 6f 66 20 63 6f 6e 64 69 74  s part of condit
4700: 69 6f 6e 61 6c 20 66 6f 72 20 61 0a 2a 2a 20 4c  ional for a.** L
4710: 45 46 54 20 4a 4f 49 4e 2c 20 74 68 65 6e 20 77  EFT JOIN, then w
4720: 65 20 63 61 6e 6e 6f 74 20 64 65 74 65 72 6d 69  e cannot determi
4730: 6e 65 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69  ne at compile-ti
4740: 6d 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  me whether or no
4750: 74 0a 2a 2a 20 69 73 20 69 74 20 74 72 75 65 20  t.** is it true 
4760: 6f 72 20 66 61 6c 73 65 2c 20 73 6f 20 61 6c 77  or false, so alw
4770: 61 79 73 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2f  ays return 0..*/
4780: 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72  .static int expr
4790: 41 6c 77 61 79 73 54 72 75 65 28 45 78 70 72 20  AlwaysTrue(Expr 
47a0: 2a 70 29 7b 0a 20 20 69 6e 74 20 76 20 3d 20 30  *p){.  int v = 0
47b0: 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50  ;.  if( ExprHasP
47c0: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 46 72  roperty(p, EP_Fr
47d0: 6f 6d 4a 6f 69 6e 29 20 29 20 72 65 74 75 72 6e  omJoin) ) return
47e0: 20 30 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74   0;.  if( !sqlit
47f0: 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28  e3ExprIsInteger(
4800: 70 2c 20 26 76 29 20 29 20 72 65 74 75 72 6e 20  p, &v) ) return 
4810: 30 3b 0a 20 20 72 65 74 75 72 6e 20 76 21 3d 30  0;.  return v!=0
4820: 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 65  ;.}.static int e
4830: 78 70 72 41 6c 77 61 79 73 46 61 6c 73 65 28 45  xprAlwaysFalse(E
4840: 78 70 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20 76  xpr *p){.  int v
4850: 20 3d 20 30 3b 0a 20 20 69 66 28 20 45 78 70 72   = 0;.  if( Expr
4860: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
4870: 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 20 72 65  P_FromJoin) ) re
4880: 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 21 73  turn 0;.  if( !s
4890: 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65  qlite3ExprIsInte
48a0: 67 65 72 28 70 2c 20 26 76 29 20 29 20 72 65 74  ger(p, &v) ) ret
48b0: 75 72 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  urn 0;.  return 
48c0: 76 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4a  v==0;.}../*.** J
48d0: 6f 69 6e 20 74 77 6f 20 65 78 70 72 65 73 73 69  oin two expressi
48e0: 6f 6e 73 20 75 73 69 6e 67 20 61 6e 20 41 4e 44  ons using an AND
48f0: 20 6f 70 65 72 61 74 6f 72 2e 20 20 49 66 20 65   operator.  If e
4900: 69 74 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e  ither expression
4910: 20 69 73 0a 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65   is.** NULL, the
4920: 6e 20 6a 75 73 74 20 72 65 74 75 72 6e 20 74 68  n just return th
4930: 65 20 6f 74 68 65 72 20 65 78 70 72 65 73 73 69  e other expressi
4940: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6f 6e 65  on..**.** If one
4950: 20 73 69 64 65 20 6f 72 20 74 68 65 20 6f 74 68   side or the oth
4960: 65 72 20 6f 66 20 74 68 65 20 41 4e 44 20 69 73  er of the AND is
4970: 20 6b 6e 6f 77 6e 20 74 6f 20 62 65 20 66 61 6c   known to be fal
4980: 73 65 2c 20 74 68 65 6e 20 69 6e 73 74 65 61 64  se, then instead
4990: 0a 2a 2a 20 6f 66 20 72 65 74 75 72 6e 69 6e 67  .** of returning
49a0: 20 61 6e 20 41 4e 44 20 65 78 70 72 65 73 73 69   an AND expressi
49b0: 6f 6e 2c 20 6a 75 73 74 20 72 65 74 75 72 6e 20  on, just return 
49c0: 61 20 63 6f 6e 73 74 61 6e 74 20 65 78 70 72 65  a constant expre
49d0: 73 73 69 6f 6e 20 77 69 74 68 0a 2a 2a 20 61 20  ssion with.** a 
49e0: 76 61 6c 75 65 20 6f 66 20 66 61 6c 73 65 2e 0a  value of false..
49f0: 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33  */.Expr *sqlite3
4a00: 45 78 70 72 41 6e 64 28 73 71 6c 69 74 65 33 20  ExprAnd(sqlite3 
4a10: 2a 64 62 2c 20 45 78 70 72 20 2a 70 4c 65 66 74  *db, Expr *pLeft
4a20: 2c 20 45 78 70 72 20 2a 70 52 69 67 68 74 29 7b  , Expr *pRight){
4a30: 0a 20 20 69 66 28 20 70 4c 65 66 74 3d 3d 30 20  .  if( pLeft==0 
4a40: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 52  ){.    return pR
4a50: 69 67 68 74 3b 0a 20 20 7d 65 6c 73 65 20 69 66  ight;.  }else if
4a60: 28 20 70 52 69 67 68 74 3d 3d 30 20 29 7b 0a 20  ( pRight==0 ){. 
4a70: 20 20 20 72 65 74 75 72 6e 20 70 4c 65 66 74 3b     return pLeft;
4a80: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65 78 70  .  }else if( exp
4a90: 72 41 6c 77 61 79 73 46 61 6c 73 65 28 70 4c 65  rAlwaysFalse(pLe
4aa0: 66 74 29 20 7c 7c 20 65 78 70 72 41 6c 77 61 79  ft) || exprAlway
4ab0: 73 46 61 6c 73 65 28 70 52 69 67 68 74 29 20 29  sFalse(pRight) )
4ac0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
4ad0: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 65 66  rDelete(db, pLef
4ae0: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  t);.    sqlite3E
4af0: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 52  xprDelete(db, pR
4b00: 69 67 68 74 29 3b 0a 20 20 20 20 72 65 74 75 72  ight);.    retur
4b10: 6e 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c  n sqlite3ExprAll
4b20: 6f 63 28 64 62 2c 20 54 4b 5f 49 4e 54 45 47 45  oc(db, TK_INTEGE
4b30: 52 2c 20 26 73 71 6c 69 74 65 33 49 6e 74 54 6f  R, &sqlite3IntTo
4b40: 6b 65 6e 73 5b 30 5d 2c 20 30 29 3b 0a 20 20 7d  kens[0], 0);.  }
4b50: 65 6c 73 65 7b 0a 20 20 20 20 45 78 70 72 20 2a  else{.    Expr *
4b60: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78  pNew = sqlite3Ex
4b70: 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f 41  prAlloc(db, TK_A
4b80: 4e 44 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73  ND, 0, 0);.    s
4b90: 71 6c 69 74 65 33 45 78 70 72 41 74 74 61 63 68  qlite3ExprAttach
4ba0: 53 75 62 74 72 65 65 73 28 64 62 2c 20 70 4e 65  Subtrees(db, pNe
4bb0: 77 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74  w, pLeft, pRight
4bc0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 4e  );.    return pN
4bd0: 65 77 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ew;.  }.}../*.**
4be0: 20 43 6f 6e 73 74 72 75 63 74 20 61 20 6e 65 77   Construct a new
4bf0: 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65   expression node
4c00: 20 66 6f 72 20 61 20 66 75 6e 63 74 69 6f 6e 20   for a function 
4c10: 77 69 74 68 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a  with multiple.**
4c20: 20 61 72 67 75 6d 65 6e 74 73 2e 0a 2a 2f 0a 45   arguments..*/.E
4c30: 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72  xpr *sqlite3Expr
4c40: 46 75 6e 63 74 69 6f 6e 28 50 61 72 73 65 20 2a  Function(Parse *
4c50: 70 50 61 72 73 65 2c 20 45 78 70 72 4c 69 73 74  pParse, ExprList
4c60: 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a   *pList, Token *
4c70: 70 54 6f 6b 65 6e 29 7b 0a 20 20 45 78 70 72 20  pToken){.  Expr 
4c80: 2a 70 4e 65 77 3b 0a 20 20 73 71 6c 69 74 65 33  *pNew;.  sqlite3
4c90: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
4ca0: 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 6f  b;.  assert( pTo
4cb0: 6b 65 6e 20 29 3b 0a 20 20 70 4e 65 77 20 3d 20  ken );.  pNew = 
4cc0: 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63  sqlite3ExprAlloc
4cd0: 28 64 62 2c 20 54 4b 5f 46 55 4e 43 54 49 4f 4e  (db, TK_FUNCTION
4ce0: 2c 20 70 54 6f 6b 65 6e 2c 20 31 29 3b 0a 20 20  , pToken, 1);.  
4cf0: 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20  if( pNew==0 ){. 
4d00: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
4d10: 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69  stDelete(db, pLi
4d20: 73 74 29 3b 20 2f 2a 20 41 76 6f 69 64 20 6d 65  st); /* Avoid me
4d30: 6d 6f 72 79 20 6c 65 61 6b 20 77 68 65 6e 20 6d  mory leak when m
4d40: 61 6c 6c 6f 63 20 66 61 69 6c 73 20 2a 2f 0a 20  alloc fails */. 
4d50: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
4d60: 0a 20 20 70 4e 65 77 2d 3e 78 2e 70 4c 69 73 74  .  pNew->x.pList
4d70: 20 3d 20 70 4c 69 73 74 3b 0a 20 20 61 73 73 65   = pList;.  asse
4d80: 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
4d90: 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 78 49  erty(pNew, EP_xI
4da0: 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 73 71  sSelect) );.  sq
4db0: 6c 69 74 65 33 45 78 70 72 53 65 74 48 65 69 67  lite3ExprSetHeig
4dc0: 68 74 41 6e 64 46 6c 61 67 73 28 70 50 61 72 73  htAndFlags(pPars
4dd0: 65 2c 20 70 4e 65 77 29 3b 0a 20 20 72 65 74 75  e, pNew);.  retu
4de0: 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pNew;.}../*.*
4df0: 2a 20 41 73 73 69 67 6e 20 61 20 76 61 72 69 61  * Assign a varia
4e00: 62 6c 65 20 6e 75 6d 62 65 72 20 74 6f 20 61 6e  ble number to an
4e10: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74   expression that
4e20: 20 65 6e 63 6f 64 65 73 20 61 20 77 69 6c 64 63   encodes a wildc
4e30: 61 72 64 0a 2a 2a 20 69 6e 20 74 68 65 20 6f 72  ard.** in the or
4e40: 69 67 69 6e 61 6c 20 53 51 4c 20 73 74 61 74 65  iginal SQL state
4e50: 6d 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 69  ment.  .**.** Wi
4e60: 6c 64 63 61 72 64 73 20 63 6f 6e 73 69 73 74 69  ldcards consisti
4e70: 6e 67 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 22  ng of a single "
4e80: 3f 22 20 61 72 65 20 61 73 73 69 67 6e 65 64 20  ?" are assigned 
4e90: 74 68 65 20 6e 65 78 74 20 73 65 71 75 65 6e 74  the next sequent
4ea0: 69 61 6c 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20  ial.** variable 
4eb0: 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 57 69  number..**.** Wi
4ec0: 6c 64 63 61 72 64 73 20 6f 66 20 74 68 65 20 66  ldcards of the f
4ed0: 6f 72 6d 20 22 3f 6e 6e 6e 22 20 61 72 65 20 61  orm "?nnn" are a
4ee0: 73 73 69 67 6e 65 64 20 74 68 65 20 6e 75 6d 62  ssigned the numb
4ef0: 65 72 20 22 6e 6e 6e 22 2e 20 20 57 65 20 6d 61  er "nnn".  We ma
4f00: 6b 65 0a 2a 2a 20 73 75 72 65 20 22 6e 6e 6e 22  ke.** sure "nnn"
4f10: 20 69 73 20 6e 6f 74 20 74 6f 6f 20 62 65 20 74   is not too be t
4f20: 6f 20 61 76 6f 69 64 20 61 20 64 65 6e 69 61 6c  o avoid a denial
4f30: 20 6f 66 20 73 65 72 76 69 63 65 20 61 74 74 61   of service atta
4f40: 63 6b 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 53  ck when.** the S
4f50: 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 63 6f 6d  QL statement com
4f60: 65 73 20 66 72 6f 6d 20 61 6e 20 65 78 74 65 72  es from an exter
4f70: 6e 61 6c 20 73 6f 75 72 63 65 2e 0a 2a 2a 0a 2a  nal source..**.*
4f80: 2a 20 57 69 6c 64 63 61 72 64 73 20 6f 66 20 74  * Wildcards of t
4f90: 68 65 20 66 6f 72 6d 20 22 3a 61 61 61 22 2c 20  he form ":aaa", 
4fa0: 22 40 61 61 61 22 2c 20 6f 72 20 22 24 61 61 61  "@aaa", or "$aaa
4fb0: 22 20 61 72 65 20 61 73 73 69 67 6e 65 64 20 74  " are assigned t
4fc0: 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 0a 2a  he same number.*
4fd0: 2a 20 61 73 20 74 68 65 20 70 72 65 76 69 6f 75  * as the previou
4fe0: 73 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  s instance of th
4ff0: 65 20 73 61 6d 65 20 77 69 6c 64 63 61 72 64 2e  e same wildcard.
5000: 20 20 4f 72 20 69 66 20 74 68 69 73 20 69 73 20    Or if this is 
5010: 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 69 6e 73  the first.** ins
5020: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 77 69 6c  tance of the wil
5030: 64 63 61 72 64 2c 20 74 68 65 20 6e 65 78 74 20  dcard, the next 
5040: 73 65 71 75 65 6e 74 69 61 6c 20 76 61 72 69 61  sequential varia
5050: 62 6c 65 20 6e 75 6d 62 65 72 20 69 73 0a 2a 2a  ble number is.**
5060: 20 61 73 73 69 67 6e 65 64 2e 0a 2a 2f 0a 76 6f   assigned..*/.vo
5070: 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 41 73  id sqlite3ExprAs
5080: 73 69 67 6e 56 61 72 4e 75 6d 62 65 72 28 50 61  signVarNumber(Pa
5090: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
50a0: 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 73 71 6c  r *pExpr){.  sql
50b0: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
50c0: 65 2d 3e 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63  e->db;.  const c
50d0: 68 61 72 20 2a 7a 3b 0a 0a 20 20 69 66 28 20 70  har *z;..  if( p
50e0: 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e  Expr==0 ) return
50f0: 3b 0a 20 20 61 73 73 65 72 74 28 20 21 45 78 70  ;.  assert( !Exp
5100: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
5110: 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 7c  pr, EP_IntValue|
5120: 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f  EP_Reduced|EP_To
5130: 6b 65 6e 4f 6e 6c 79 29 20 29 3b 0a 20 20 7a 20  kenOnly) );.  z 
5140: 3d 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  = pExpr->u.zToke
5150: 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 21 3d  n;.  assert( z!=
5160: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 7a  0 );.  assert( z
5170: 5b 30 5d 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  [0]!=0 );.  if( 
5180: 7a 5b 31 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  z[1]==0 ){.    /
5190: 2a 20 57 69 6c 64 63 61 72 64 20 6f 66 20 74 68  * Wildcard of th
51a0: 65 20 66 6f 72 6d 20 22 3f 22 2e 20 20 41 73 73  e form "?".  Ass
51b0: 69 67 6e 20 74 68 65 20 6e 65 78 74 20 76 61 72  ign the next var
51c0: 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 2a 2f 0a  iable number */.
51d0: 20 20 20 20 61 73 73 65 72 74 28 20 7a 5b 30 5d      assert( z[0]
51e0: 3d 3d 27 3f 27 20 29 3b 0a 20 20 20 20 70 45 78  =='?' );.    pEx
51f0: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 28 79  pr->iColumn = (y
5200: 6e 56 61 72 29 28 2b 2b 70 50 61 72 73 65 2d 3e  nVar)(++pParse->
5210: 6e 56 61 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  nVar);.  }else{.
5220: 20 20 20 20 79 6e 56 61 72 20 78 20 3d 20 30 3b      ynVar x = 0;
5230: 0a 20 20 20 20 75 33 32 20 6e 20 3d 20 73 71 6c  .    u32 n = sql
5240: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 3b  ite3Strlen30(z);
5250: 0a 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27  .    if( z[0]=='
5260: 3f 27 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 57  ?' ){.      /* W
5270: 69 6c 64 63 61 72 64 20 6f 66 20 74 68 65 20 66  ildcard of the f
5280: 6f 72 6d 20 22 3f 6e 6e 6e 22 2e 20 20 43 6f 6e  orm "?nnn".  Con
5290: 76 65 72 74 20 22 6e 6e 6e 22 20 74 6f 20 61 6e  vert "nnn" to an
52a0: 20 69 6e 74 65 67 65 72 20 61 6e 64 0a 20 20 20   integer and.   
52b0: 20 20 20 2a 2a 20 75 73 65 20 69 74 20 61 73 20     ** use it as 
52c0: 74 68 65 20 76 61 72 69 61 62 6c 65 20 6e 75 6d  the variable num
52d0: 62 65 72 20 2a 2f 0a 20 20 20 20 20 20 69 36 34  ber */.      i64
52e0: 20 69 3b 0a 20 20 20 20 20 20 69 6e 74 20 62 4f   i;.      int bO
52f0: 6b 20 3d 20 30 3d 3d 73 71 6c 69 74 65 33 41 74  k = 0==sqlite3At
5300: 6f 69 36 34 28 26 7a 5b 31 5d 2c 20 26 69 2c 20  oi64(&z[1], &i, 
5310: 6e 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  n-1, SQLITE_UTF8
5320: 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  );.      pExpr->
5330: 69 43 6f 6c 75 6d 6e 20 3d 20 78 20 3d 20 28 79  iColumn = x = (y
5340: 6e 56 61 72 29 69 3b 0a 20 20 20 20 20 20 74 65  nVar)i;.      te
5350: 73 74 63 61 73 65 28 20 69 3d 3d 30 20 29 3b 0a  stcase( i==0 );.
5360: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
5370: 69 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 74 65  i==1 );.      te
5380: 73 74 63 61 73 65 28 20 69 3d 3d 64 62 2d 3e 61  stcase( i==db->a
5390: 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
53a0: 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42  IT_VARIABLE_NUMB
53b0: 45 52 5d 2d 31 20 29 3b 0a 20 20 20 20 20 20 74  ER]-1 );.      t
53c0: 65 73 74 63 61 73 65 28 20 69 3d 3d 64 62 2d 3e  estcase( i==db->
53d0: 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
53e0: 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d  MIT_VARIABLE_NUM
53f0: 42 45 52 5d 20 29 3b 0a 20 20 20 20 20 20 69 66  BER] );.      if
5400: 28 20 62 4f 6b 3d 3d 30 20 7c 7c 20 69 3c 31 20  ( bOk==0 || i<1 
5410: 7c 7c 20 69 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b  || i>db->aLimit[
5420: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52  SQLITE_LIMIT_VAR
5430: 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 20 29 7b  IABLE_NUMBER] ){
5440: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
5450: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
5460: 20 22 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65   "variable numbe
5470: 72 20 6d 75 73 74 20 62 65 20 62 65 74 77 65 65  r must be betwee
5480: 6e 20 3f 31 20 61 6e 64 20 3f 25 64 22 2c 0a 20  n ?1 and ?%d",. 
5490: 20 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 61             db->a
54a0: 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
54b0: 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42  IT_VARIABLE_NUMB
54c0: 45 52 5d 29 3b 0a 20 20 20 20 20 20 20 20 78 20  ER]);.        x 
54d0: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
54e0: 20 20 20 69 66 28 20 69 3e 70 50 61 72 73 65 2d     if( i>pParse-
54f0: 3e 6e 56 61 72 20 29 7b 0a 20 20 20 20 20 20 20  >nVar ){.       
5500: 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 20 3d 20   pParse->nVar = 
5510: 28 69 6e 74 29 69 3b 0a 20 20 20 20 20 20 7d 0a  (int)i;.      }.
5520: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
5530: 20 2f 2a 20 57 69 6c 64 63 61 72 64 73 20 6c 69   /* Wildcards li
5540: 6b 65 20 22 3a 61 61 61 22 2c 20 22 24 61 61 61  ke ":aaa", "$aaa
5550: 22 20 6f 72 20 22 40 61 61 61 22 2e 20 20 52 65  " or "@aaa".  Re
5560: 75 73 65 20 74 68 65 20 73 61 6d 65 20 76 61 72  use the same var
5570: 69 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20 6e  iable.      ** n
5580: 75 6d 62 65 72 20 61 73 20 74 68 65 20 70 72 69  umber as the pri
5590: 6f 72 20 61 70 70 65 61 72 61 6e 63 65 20 6f 66  or appearance of
55a0: 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2c 20   the same name, 
55b0: 6f 72 20 69 66 20 74 68 65 20 6e 61 6d 65 0a 20  or if the name. 
55c0: 20 20 20 20 20 2a 2a 20 68 61 73 20 6e 65 76 65       ** has neve
55d0: 72 20 61 70 70 65 61 72 65 64 20 62 65 66 6f 72  r appeared befor
55e0: 65 2c 20 72 65 75 73 65 20 74 68 65 20 73 61 6d  e, reuse the sam
55f0: 65 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65  e variable numbe
5600: 72 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  r.      */.     
5610: 20 79 6e 56 61 72 20 69 3b 0a 20 20 20 20 20 20   ynVar i;.      
5620: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72 73  for(i=0; i<pPars
5630: 65 2d 3e 6e 7a 56 61 72 3b 20 69 2b 2b 29 7b 0a  e->nzVar; i++){.
5640: 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 72          if( pPar
5650: 73 65 2d 3e 61 7a 56 61 72 5b 69 5d 20 26 26 20  se->azVar[i] && 
5660: 73 74 72 63 6d 70 28 70 50 61 72 73 65 2d 3e 61  strcmp(pParse->a
5670: 7a 56 61 72 5b 69 5d 2c 7a 29 3d 3d 30 20 29 7b  zVar[i],z)==0 ){
5680: 0a 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72  .          pExpr
5690: 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 78 20 3d 20  ->iColumn = x = 
56a0: 28 79 6e 56 61 72 29 69 2b 31 3b 0a 20 20 20 20  (ynVar)i+1;.    
56b0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
56c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
56d0: 20 20 20 20 20 69 66 28 20 78 3d 3d 30 20 29 20       if( x==0 ) 
56e0: 78 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  x = pExpr->iColu
56f0: 6d 6e 20 3d 20 28 79 6e 56 61 72 29 28 2b 2b 70  mn = (ynVar)(++p
5700: 50 61 72 73 65 2d 3e 6e 56 61 72 29 3b 0a 20 20  Parse->nVar);.  
5710: 20 20 7d 0a 20 20 20 20 69 66 28 20 78 3e 30 20    }.    if( x>0 
5720: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 78 3e 70  ){.      if( x>p
5730: 50 61 72 73 65 2d 3e 6e 7a 56 61 72 20 29 7b 0a  Parse->nzVar ){.
5740: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 2a 61          char **a
5750: 3b 0a 20 20 20 20 20 20 20 20 61 20 3d 20 73 71  ;.        a = sq
5760: 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 64  lite3DbRealloc(d
5770: 62 2c 20 70 50 61 72 73 65 2d 3e 61 7a 56 61 72  b, pParse->azVar
5780: 2c 20 78 2a 73 69 7a 65 6f 66 28 61 5b 30 5d 29  , x*sizeof(a[0])
5790: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  );.        if( a
57a0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 20 20 2f  ==0 ) return;  /
57b0: 2a 20 45 72 72 6f 72 20 72 65 70 6f 72 74 65 64  * Error reported
57c0: 20 74 68 72 6f 75 67 68 20 64 62 2d 3e 6d 61 6c   through db->mal
57d0: 6c 6f 63 46 61 69 6c 65 64 20 2a 2f 0a 20 20 20  locFailed */.   
57e0: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61 7a 56       pParse->azV
57f0: 61 72 20 3d 20 61 3b 0a 20 20 20 20 20 20 20 20  ar = a;.        
5800: 6d 65 6d 73 65 74 28 26 61 5b 70 50 61 72 73 65  memset(&a[pParse
5810: 2d 3e 6e 7a 56 61 72 5d 2c 20 30 2c 20 28 78 2d  ->nzVar], 0, (x-
5820: 70 50 61 72 73 65 2d 3e 6e 7a 56 61 72 29 2a 73  pParse->nzVar)*s
5830: 69 7a 65 6f 66 28 61 5b 30 5d 29 29 3b 0a 20 20  izeof(a[0]));.  
5840: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 7a        pParse->nz
5850: 56 61 72 20 3d 20 78 3b 0a 20 20 20 20 20 20 7d  Var = x;.      }
5860: 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 30 5d 21  .      if( z[0]!
5870: 3d 27 3f 27 20 7c 7c 20 70 50 61 72 73 65 2d 3e  ='?' || pParse->
5880: 61 7a 56 61 72 5b 78 2d 31 5d 3d 3d 30 20 29 7b  azVar[x-1]==0 ){
5890: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
58a0: 44 62 46 72 65 65 28 64 62 2c 20 70 50 61 72 73  DbFree(db, pPars
58b0: 65 2d 3e 61 7a 56 61 72 5b 78 2d 31 5d 29 3b 0a  e->azVar[x-1]);.
58c0: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
58d0: 61 7a 56 61 72 5b 78 2d 31 5d 20 3d 20 73 71 6c  azVar[x-1] = sql
58e0: 69 74 65 33 44 62 53 74 72 4e 44 75 70 28 64 62  ite3DbStrNDup(db
58f0: 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d  , z, n);.      }
5900: 0a 20 20 20 20 7d 0a 20 20 7d 20 0a 20 20 69 66  .    }.  } .  if
5910: 28 20 21 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  ( !pParse->nErr 
5920: 26 26 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 3e  && pParse->nVar>
5930: 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54  db->aLimit[SQLIT
5940: 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45  E_LIMIT_VARIABLE
5950: 5f 4e 55 4d 42 45 52 5d 20 29 7b 0a 20 20 20 20  _NUMBER] ){.    
5960: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
5970: 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e  pParse, "too man
5980: 79 20 53 51 4c 20 76 61 72 69 61 62 6c 65 73 22  y SQL variables"
5990: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
59a0: 52 65 63 75 72 73 69 76 65 6c 79 20 64 65 6c 65  Recursively dele
59b0: 74 65 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  te an expression
59c0: 20 74 72 65 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73   tree..*/.void s
59d0: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
59e0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78  (sqlite3 *db, Ex
59f0: 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 3d  pr *p){.  if( p=
5a00: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 2f  =0 ) return;.  /
5a10: 2a 20 53 61 6e 69 74 79 20 63 68 65 63 6b 3a 20  * Sanity check: 
5a20: 41 73 73 65 72 74 20 74 68 61 74 20 74 68 65 20  Assert that the 
5a30: 49 6e 74 56 61 6c 75 65 20 69 73 20 6e 6f 6e 2d  IntValue is non-
5a40: 6e 65 67 61 74 69 76 65 20 69 66 20 69 74 20 65  negative if it e
5a50: 78 69 73 74 73 20 2a 2f 0a 20 20 61 73 73 65 72  xists */.  asser
5a60: 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
5a70: 72 74 79 28 70 2c 20 45 50 5f 49 6e 74 56 61 6c  rty(p, EP_IntVal
5a80: 75 65 29 20 7c 7c 20 70 2d 3e 75 2e 69 56 61 6c  ue) || p->u.iVal
5a90: 75 65 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 21  ue>=0 );.  if( !
5aa0: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
5ab0: 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29  p, EP_TokenOnly)
5ac0: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 45   ){.    /* The E
5ad0: 78 70 72 2e 78 20 75 6e 69 6f 6e 20 69 73 20 6e  xpr.x union is n
5ae0: 65 76 65 72 20 75 73 65 64 20 61 74 20 74 68 65  ever used at the
5af0: 20 73 61 6d 65 20 74 69 6d 65 20 61 73 20 45 78   same time as Ex
5b00: 70 72 2e 70 52 69 67 68 74 20 2a 2f 0a 20 20 20  pr.pRight */.   
5b10: 20 61 73 73 65 72 74 28 20 70 2d 3e 78 2e 70 4c   assert( p->x.pL
5b20: 69 73 74 3d 3d 30 20 7c 7c 20 70 2d 3e 70 52 69  ist==0 || p->pRi
5b30: 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 73 71  ght==0 );.    sq
5b40: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
5b50: 64 62 2c 20 70 2d 3e 70 4c 65 66 74 29 3b 0a 20  db, p->pLeft);. 
5b60: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
5b70: 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 52 69 67  lete(db, p->pRig
5b80: 68 74 29 3b 0a 20 20 20 20 69 66 28 20 45 78 70  ht);.    if( Exp
5b90: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
5ba0: 45 50 5f 4d 65 6d 54 6f 6b 65 6e 29 20 29 20 73  EP_MemToken) ) s
5bb0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
5bc0: 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20   p->u.zToken);. 
5bd0: 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72     if( ExprHasPr
5be0: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 78 49 73  operty(p, EP_xIs
5bf0: 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20  Select) ){.     
5c00: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
5c10: 6c 65 74 65 28 64 62 2c 20 70 2d 3e 78 2e 70 53  lete(db, p->x.pS
5c20: 65 6c 65 63 74 29 3b 0a 20 20 20 20 7d 65 6c 73  elect);.    }els
5c30: 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
5c40: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
5c50: 62 2c 20 70 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a  b, p->x.pList);.
5c60: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
5c70: 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
5c80: 28 70 2c 20 45 50 5f 53 74 61 74 69 63 29 20 29  (p, EP_Static) )
5c90: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  {.    sqlite3DbF
5ca0: 72 65 65 28 64 62 2c 20 70 29 3b 0a 20 20 7d 0a  ree(db, p);.  }.
5cb0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
5cc0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
5cd0: 74 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f  tes allocated fo
5ce0: 72 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  r the expression
5cf0: 20 73 74 72 75 63 74 75 72 65 20 0a 2a 2a 20 70   structure .** p
5d00: 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72  assed as the fir
5d10: 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 69  st argument. Thi
5d20: 73 20 69 73 20 61 6c 77 61 79 73 20 6f 6e 65 20  s is always one 
5d30: 6f 66 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45  of EXPR_FULLSIZE
5d40: 2c 0a 2a 2a 20 45 58 50 52 5f 52 45 44 55 43 45  ,.** EXPR_REDUCE
5d50: 44 53 49 5a 45 20 6f 72 20 45 58 50 52 5f 54 4f  DSIZE or EXPR_TO
5d60: 4b 45 4e 4f 4e 4c 59 53 49 5a 45 2e 0a 2a 2f 0a  KENONLYSIZE..*/.
5d70: 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 53  static int exprS
5d80: 74 72 75 63 74 53 69 7a 65 28 45 78 70 72 20 2a  tructSize(Expr *
5d90: 70 29 7b 0a 20 20 69 66 28 20 45 78 70 72 48 61  p){.  if( ExprHa
5da0: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
5db0: 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 20 72 65 74  TokenOnly) ) ret
5dc0: 75 72 6e 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e  urn EXPR_TOKENON
5dd0: 4c 59 53 49 5a 45 3b 0a 20 20 69 66 28 20 45 78  LYSIZE;.  if( Ex
5de0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
5df0: 20 45 50 5f 52 65 64 75 63 65 64 29 20 29 20 72   EP_Reduced) ) r
5e00: 65 74 75 72 6e 20 45 58 50 52 5f 52 45 44 55 43  eturn EXPR_REDUC
5e10: 45 44 53 49 5a 45 3b 0a 20 20 72 65 74 75 72 6e  EDSIZE;.  return
5e20: 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 3b 0a   EXPR_FULLSIZE;.
5e30: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 64 75 70  }../*.** The dup
5e40: 65 64 45 78 70 72 2a 53 69 7a 65 28 29 20 72 6f  edExpr*Size() ro
5e50: 75 74 69 6e 65 73 20 65 61 63 68 20 72 65 74 75  utines each retu
5e60: 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
5e70: 20 62 79 74 65 73 20 72 65 71 75 69 72 65 64 0a   bytes required.
5e80: 2a 2a 20 74 6f 20 73 74 6f 72 65 20 61 20 63 6f  ** to store a co
5e90: 70 79 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73  py of an express
5ea0: 69 6f 6e 20 6f 72 20 65 78 70 72 65 73 73 69 6f  ion or expressio
5eb0: 6e 20 74 72 65 65 2e 20 20 54 68 65 79 20 64 69  n tree.  They di
5ec0: 66 66 65 72 20 69 6e 0a 2a 2a 20 68 6f 77 20 6d  ffer in.** how m
5ed0: 75 63 68 20 6f 66 20 74 68 65 20 74 72 65 65 20  uch of the tree 
5ee0: 69 73 20 6d 65 61 73 75 72 65 64 2e 0a 2a 2a 0a  is measured..**.
5ef0: 2a 2a 20 20 20 20 20 64 75 70 65 64 45 78 70 72  **     dupedExpr
5f00: 53 74 72 75 63 74 53 69 7a 65 28 29 20 20 20 20  StructSize()    
5f10: 20 53 69 7a 65 20 6f 66 20 6f 6e 6c 79 20 74 68   Size of only th
5f20: 65 20 45 78 70 72 20 73 74 72 75 63 74 75 72 65  e Expr structure
5f30: 20 0a 2a 2a 20 20 20 20 20 64 75 70 65 64 45 78   .**     dupedEx
5f40: 70 72 4e 6f 64 65 53 69 7a 65 28 29 20 20 20 20  prNodeSize()    
5f50: 20 20 20 53 69 7a 65 20 6f 66 20 45 78 70 72 20     Size of Expr 
5f60: 2b 20 73 70 61 63 65 20 66 6f 72 20 74 6f 6b 65  + space for toke
5f70: 6e 0a 2a 2a 20 20 20 20 20 64 75 70 65 64 45 78  n.**     dupedEx
5f80: 70 72 53 69 7a 65 28 29 20 20 20 20 20 20 20 20  prSize()        
5f90: 20 20 20 45 78 70 72 20 2b 20 74 6f 6b 65 6e 20     Expr + token 
5fa0: 2b 20 73 75 62 74 72 65 65 20 63 6f 6d 70 6f 6e  + subtree compon
5fb0: 65 6e 74 73 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ents.**.********
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 2a 2a 2a  ****************
6000: 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 75  ***.**.** The du
6010: 70 65 64 45 78 70 72 53 74 72 75 63 74 53 69 7a  pedExprStructSiz
6020: 65 28 29 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  e() function ret
6030: 75 72 6e 73 20 74 77 6f 20 76 61 6c 75 65 73 20  urns two values 
6040: 4f 52 2d 65 64 20 74 6f 67 65 74 68 65 72 3a 20  OR-ed together: 
6050: 20 0a 2a 2a 20 28 31 29 20 74 68 65 20 73 70 61   .** (1) the spa
6060: 63 65 20 72 65 71 75 69 72 65 64 20 66 6f 72 20  ce required for 
6070: 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 45 78  a copy of the Ex
6080: 70 72 20 73 74 72 75 63 74 75 72 65 20 6f 6e 6c  pr structure onl
6090: 79 20 61 6e 64 20 0a 2a 2a 20 28 32 29 20 74 68  y and .** (2) th
60a0: 65 20 45 50 5f 78 78 78 20 66 6c 61 67 73 20 74  e EP_xxx flags t
60b0: 68 61 74 20 69 6e 64 69 63 61 74 65 20 77 68 61  hat indicate wha
60c0: 74 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20  t the structure 
60d0: 73 69 7a 65 20 73 68 6f 75 6c 64 20 62 65 2e 0a  size should be..
60e0: 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61  ** The return va
60f0: 6c 75 65 73 20 69 73 20 61 6c 77 61 79 73 20 6f  lues is always o
6100: 6e 65 20 6f 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  ne of:.**.**    
6110: 20 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 0a    EXPR_FULLSIZE.
6120: 2a 2a 20 20 20 20 20 20 45 58 50 52 5f 52 45 44  **      EXPR_RED
6130: 55 43 45 44 53 49 5a 45 20 20 20 7c 20 45 50 5f  UCEDSIZE   | EP_
6140: 52 65 64 75 63 65 64 0a 2a 2a 20 20 20 20 20 20  Reduced.**      
6150: 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49  EXPR_TOKENONLYSI
6160: 5a 45 20 7c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  ZE | EP_TokenOnl
6170: 79 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65  y.**.** The size
6180: 20 6f 66 20 74 68 65 20 73 74 72 75 63 74 75 72   of the structur
6190: 65 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 20 62  e can be found b
61a0: 79 20 6d 61 73 6b 69 6e 67 20 74 68 65 20 72 65  y masking the re
61b0: 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 6f 66  turn value.** of
61c0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   this routine wi
61d0: 74 68 20 30 78 66 66 66 2e 20 20 54 68 65 20 66  th 0xfff.  The f
61e0: 6c 61 67 73 20 63 61 6e 20 62 65 20 66 6f 75 6e  lags can be foun
61f0: 64 20 62 79 20 6d 61 73 6b 69 6e 67 20 74 68 65  d by masking the
6200: 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65  .** return value
6210: 20 77 69 74 68 20 45 50 5f 52 65 64 75 63 65 64   with EP_Reduced
6220: 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 2e 0a 2a  |EP_TokenOnly..*
6230: 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 77  *.** Note that w
6240: 69 74 68 20 66 6c 61 67 73 3d 3d 45 58 50 52 44  ith flags==EXPRD
6250: 55 50 5f 52 45 44 55 43 45 2c 20 74 68 69 73 20  UP_REDUCE, this 
6260: 72 6f 75 74 69 6e 65 73 20 77 6f 72 6b 73 20 6f  routines works o
6270: 6e 20 66 75 6c 6c 2d 73 69 7a 65 0a 2a 2a 20 28  n full-size.** (
6280: 75 6e 72 65 64 75 63 65 64 29 20 45 78 70 72 20  unreduced) Expr 
6290: 6f 62 6a 65 63 74 73 20 61 73 20 74 68 65 79 20  objects as they 
62a0: 6f 72 20 6f 72 69 67 69 6e 61 6c 6c 79 20 63 6f  or originally co
62b0: 6e 73 74 72 75 63 74 65 64 20 62 79 20 74 68 65  nstructed by the
62c0: 20 70 61 72 73 65 72 2e 0a 2a 2a 20 44 75 72 69   parser..** Duri
62d0: 6e 67 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e  ng expression an
62e0: 61 6c 79 73 69 73 2c 20 65 78 74 72 61 20 69 6e  alysis, extra in
62f0: 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 63 6f 6d  formation is com
6300: 70 75 74 65 64 20 61 6e 64 20 6d 6f 76 65 64 20  puted and moved 
6310: 69 6e 74 6f 0a 2a 2a 20 6c 61 74 65 72 20 70 61  into.** later pa
6320: 72 74 73 20 6f 66 20 74 65 68 20 45 78 70 72 20  rts of teh Expr 
6330: 6f 62 6a 65 63 74 20 61 6e 64 20 74 68 61 74 20  object and that 
6340: 65 78 74 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f  extra informatio
6350: 6e 20 6d 69 67 68 74 20 67 65 74 20 63 68 6f 70  n might get chop
6360: 70 65 64 0a 2a 2a 20 6f 66 66 20 69 66 20 74 68  ped.** off if th
6370: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
6380: 72 65 64 75 63 65 64 2e 20 20 4e 6f 74 65 20 61  reduced.  Note a
6390: 6c 73 6f 20 74 68 61 74 20 69 74 20 64 6f 65 73  lso that it does
63a0: 20 6e 6f 74 20 77 6f 72 6b 20 74 6f 0a 2a 2a 20   not work to.** 
63b0: 6d 61 6b 65 20 61 6e 20 45 58 50 52 44 55 50 5f  make an EXPRDUP_
63c0: 52 45 44 55 43 45 20 63 6f 70 79 20 6f 66 20 61  REDUCE copy of a
63d0: 20 72 65 64 75 63 65 64 20 65 78 70 72 65 73 73   reduced express
63e0: 69 6f 6e 2e 20 20 49 74 20 69 73 20 6f 6e 6c 79  ion.  It is only
63f0: 20 6c 65 67 61 6c 0a 2a 2a 20 74 6f 20 72 65 64   legal.** to red
6400: 75 63 65 20 61 20 70 72 69 73 74 69 6e 65 20 65  uce a pristine e
6410: 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20 66  xpression tree f
6420: 72 6f 6d 20 74 68 65 20 70 61 72 73 65 72 2e 20  rom the parser. 
6430: 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   The implementat
6440: 69 6f 6e 0a 2a 2a 20 6f 66 20 64 75 70 65 64 45  ion.** of dupedE
6450: 78 70 72 53 74 72 75 63 74 53 69 7a 65 28 29 20  xprStructSize() 
6460: 63 6f 6e 74 61 69 6e 20 6d 75 6c 74 69 70 6c 65  contain multiple
6470: 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
6480: 65 6e 74 73 20 74 68 61 74 20 61 74 74 65 6d 70  ents that attemp
6490: 74 0a 2a 2a 20 74 6f 20 65 6e 66 6f 72 63 65 20  t.** to enforce 
64a0: 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 2e  this constraint.
64b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
64c0: 75 70 65 64 45 78 70 72 53 74 72 75 63 74 53 69  upedExprStructSi
64d0: 7a 65 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20  ze(Expr *p, int 
64e0: 66 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20 6e 53  flags){.  int nS
64f0: 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20 66  ize;.  assert( f
6500: 6c 61 67 73 3d 3d 45 58 50 52 44 55 50 5f 52 45  lags==EXPRDUP_RE
6510: 44 55 43 45 20 7c 7c 20 66 6c 61 67 73 3d 3d 30  DUCE || flags==0
6520: 20 29 3b 20 2f 2a 20 4f 6e 6c 79 20 6f 6e 65 20   ); /* Only one 
6530: 66 6c 61 67 20 76 61 6c 75 65 20 61 6c 6c 6f 77  flag value allow
6540: 65 64 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ed */.  assert( 
6550: 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 3c 3d 30  EXPR_FULLSIZE<=0
6560: 78 66 66 66 20 29 3b 0a 20 20 61 73 73 65 72 74  xfff );.  assert
6570: 28 20 28 30 78 66 66 66 20 26 20 28 45 50 5f 52  ( (0xfff & (EP_R
6580: 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f  educed|EP_TokenO
6590: 6e 6c 79 29 29 3d 3d 30 20 29 3b 0a 20 20 69 66  nly))==0 );.  if
65a0: 28 20 30 3d 3d 28 66 6c 61 67 73 26 45 58 50 52  ( 0==(flags&EXPR
65b0: 44 55 50 5f 52 45 44 55 43 45 29 20 29 7b 0a 20  DUP_REDUCE) ){. 
65c0: 20 20 20 6e 53 69 7a 65 20 3d 20 45 58 50 52 5f     nSize = EXPR_
65d0: 46 55 4c 4c 53 49 5a 45 3b 0a 20 20 7d 65 6c 73  FULLSIZE;.  }els
65e0: 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  e{.    assert( !
65f0: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
6600: 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c  p, EP_TokenOnly|
6610: 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a 20  EP_Reduced) );. 
6620: 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
6630: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
6640: 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 3b 20 0a  P_FromJoin) ); .
6650: 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
6660: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
6670: 45 50 5f 4d 65 6d 54 6f 6b 65 6e 29 20 29 3b 0a  EP_MemToken) );.
6680: 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
6690: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
66a0: 45 50 5f 4e 6f 52 65 64 75 63 65 29 20 29 3b 0a  EP_NoReduce) );.
66b0: 20 20 20 20 69 66 28 20 70 2d 3e 70 4c 65 66 74      if( p->pLeft
66c0: 20 7c 7c 20 70 2d 3e 78 2e 70 4c 69 73 74 20 29   || p->x.pList )
66d0: 7b 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20  {.      nSize = 
66e0: 45 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45  EXPR_REDUCEDSIZE
66f0: 20 7c 20 45 50 5f 52 65 64 75 63 65 64 3b 0a 20   | EP_Reduced;. 
6700: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
6710: 61 73 73 65 72 74 28 20 70 2d 3e 70 52 69 67 68  assert( p->pRigh
6720: 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 6e 53  t==0 );.      nS
6730: 69 7a 65 20 3d 20 45 58 50 52 5f 54 4f 4b 45 4e  ize = EXPR_TOKEN
6740: 4f 4e 4c 59 53 49 5a 45 20 7c 20 45 50 5f 54 6f  ONLYSIZE | EP_To
6750: 6b 65 6e 4f 6e 6c 79 3b 0a 20 20 20 20 7d 0a 20  kenOnly;.    }. 
6760: 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 53 69 7a   }.  return nSiz
6770: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  e;.}../*.** This
6780: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
6790: 73 20 74 68 65 20 73 70 61 63 65 20 69 6e 20 62  s the space in b
67a0: 79 74 65 73 20 72 65 71 75 69 72 65 64 20 74 6f  ytes required to
67b0: 20 73 74 6f 72 65 20 74 68 65 20 63 6f 70 79 20   store the copy 
67c0: 0a 2a 2a 20 6f 66 20 74 68 65 20 45 78 70 72 20  .** of the Expr 
67d0: 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 61 20  structure and a 
67e0: 63 6f 70 79 20 6f 66 20 74 68 65 20 45 78 70 72  copy of the Expr
67f0: 2e 75 2e 7a 54 6f 6b 65 6e 20 73 74 72 69 6e 67  .u.zToken string
6800: 20 28 69 66 20 74 68 61 74 0a 2a 2a 20 73 74 72   (if that.** str
6810: 69 6e 67 20 69 73 20 64 65 66 69 6e 65 64 2e 29  ing is defined.)
6820: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
6830: 75 70 65 64 45 78 70 72 4e 6f 64 65 53 69 7a 65  upedExprNodeSize
6840: 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c  (Expr *p, int fl
6850: 61 67 73 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74  ags){.  int nByt
6860: 65 20 3d 20 64 75 70 65 64 45 78 70 72 53 74 72  e = dupedExprStr
6870: 75 63 74 53 69 7a 65 28 70 2c 20 66 6c 61 67 73  uctSize(p, flags
6880: 29 20 26 20 30 78 66 66 66 3b 0a 20 20 69 66 28  ) & 0xfff;.  if(
6890: 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
68a0: 79 28 70 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  y(p, EP_IntValue
68b0: 29 20 26 26 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e  ) && p->u.zToken
68c0: 20 29 7b 0a 20 20 20 20 6e 42 79 74 65 20 2b 3d   ){.    nByte +=
68d0: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
68e0: 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 2b 31 3b  (p->u.zToken)+1;
68f0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 52 4f  .  }.  return RO
6900: 55 4e 44 38 28 6e 42 79 74 65 29 3b 0a 7d 0a 0a  UND8(nByte);.}..
6910: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
6920: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
6930: 20 72 65 71 75 69 72 65 64 20 74 6f 20 63 72 65   required to cre
6940: 61 74 65 20 61 20 64 75 70 6c 69 63 61 74 65 20  ate a duplicate 
6950: 6f 66 20 74 68 65 20 0a 2a 2a 20 65 78 70 72 65  of the .** expre
6960: 73 73 69 6f 6e 20 70 61 73 73 65 64 20 61 73 20  ssion passed as 
6970: 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
6980: 6e 74 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 61  nt. The second a
6990: 72 67 75 6d 65 6e 74 20 69 73 20 61 0a 2a 2a 20  rgument is a.** 
69a0: 6d 61 73 6b 20 63 6f 6e 74 61 69 6e 69 6e 67 20  mask containing 
69b0: 45 58 50 52 44 55 50 5f 58 58 58 20 66 6c 61 67  EXPRDUP_XXX flag
69c0: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c  s..**.** The val
69d0: 75 65 20 72 65 74 75 72 6e 65 64 20 69 6e 63 6c  ue returned incl
69e0: 75 64 65 73 20 73 70 61 63 65 20 74 6f 20 63 72  udes space to cr
69f0: 65 61 74 65 20 61 20 63 6f 70 79 20 6f 66 20 74  eate a copy of t
6a00: 68 65 20 45 78 70 72 20 73 74 72 75 63 74 0a 2a  he Expr struct.*
6a10: 2a 20 69 74 73 65 6c 66 20 61 6e 64 20 74 68 65  * itself and the
6a20: 20 62 75 66 66 65 72 20 72 65 66 65 72 72 65 64   buffer referred
6a30: 20 74 6f 20 62 79 20 45 78 70 72 2e 75 2e 7a 54   to by Expr.u.zT
6a40: 6f 6b 65 6e 2c 20 69 66 20 61 6e 79 2e 0a 2a 2a  oken, if any..**
6a50: 0a 2a 2a 20 49 66 20 74 68 65 20 45 58 50 52 44  .** If the EXPRD
6a60: 55 50 5f 52 45 44 55 43 45 20 66 6c 61 67 20 69  UP_REDUCE flag i
6a70: 73 20 73 65 74 2c 20 74 68 65 6e 20 74 68 65 20  s set, then the 
6a80: 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 6e 63  return value inc
6a90: 6c 75 64 65 73 20 0a 2a 2a 20 73 70 61 63 65 20  ludes .** space 
6aa0: 74 6f 20 64 75 70 6c 69 63 61 74 65 20 61 6c 6c  to duplicate all
6ab0: 20 45 78 70 72 20 6e 6f 64 65 73 20 69 6e 20 74   Expr nodes in t
6ac0: 68 65 20 74 72 65 65 20 66 6f 72 6d 65 64 20 62  he tree formed b
6ad0: 79 20 45 78 70 72 2e 70 4c 65 66 74 20 0a 2a 2a  y Expr.pLeft .**
6ae0: 20 61 6e 64 20 45 78 70 72 2e 70 52 69 67 68 74   and Expr.pRight
6af0: 20 76 61 72 69 61 62 6c 65 73 20 28 62 75 74 20   variables (but 
6b00: 6e 6f 74 20 66 6f 72 20 61 6e 79 20 73 74 72 75  not for any stru
6b10: 63 74 75 72 65 73 20 70 6f 69 6e 74 65 64 20 74  ctures pointed t
6b20: 6f 20 6f 72 20 0a 2a 2a 20 64 65 73 63 65 6e 64  o or .** descend
6b30: 65 64 20 66 72 6f 6d 20 74 68 65 20 45 78 70 72  ed from the Expr
6b40: 2e 78 2e 70 4c 69 73 74 20 6f 72 20 45 78 70 72  .x.pList or Expr
6b50: 2e 78 2e 70 53 65 6c 65 63 74 20 76 61 72 69 61  .x.pSelect varia
6b60: 62 6c 65 73 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  bles)..*/.static
6b70: 20 69 6e 74 20 64 75 70 65 64 45 78 70 72 53 69   int dupedExprSi
6b80: 7a 65 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20  ze(Expr *p, int 
6b90: 66 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20 6e 42  flags){.  int nB
6ba0: 79 74 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  yte = 0;.  if( p
6bb0: 20 29 7b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20   ){.    nByte = 
6bc0: 64 75 70 65 64 45 78 70 72 4e 6f 64 65 53 69 7a  dupedExprNodeSiz
6bd0: 65 28 70 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20  e(p, flags);.   
6be0: 20 69 66 28 20 66 6c 61 67 73 26 45 58 50 52 44   if( flags&EXPRD
6bf0: 55 50 5f 52 45 44 55 43 45 20 29 7b 0a 20 20 20  UP_REDUCE ){.   
6c00: 20 20 20 6e 42 79 74 65 20 2b 3d 20 64 75 70 65     nByte += dupe
6c10: 64 45 78 70 72 53 69 7a 65 28 70 2d 3e 70 4c 65  dExprSize(p->pLe
6c20: 66 74 2c 20 66 6c 61 67 73 29 20 2b 20 64 75 70  ft, flags) + dup
6c30: 65 64 45 78 70 72 53 69 7a 65 28 70 2d 3e 70 52  edExprSize(p->pR
6c40: 69 67 68 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20  ight, flags);.  
6c50: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
6c60: 20 6e 42 79 74 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   nByte;.}../*.**
6c70: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
6c80: 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 73 71 6c  s similar to sql
6c90: 69 74 65 33 45 78 70 72 44 75 70 28 29 2c 20 65  ite3ExprDup(), e
6ca0: 78 63 65 70 74 20 74 68 61 74 20 69 66 20 70 7a  xcept that if pz
6cb0: 42 75 66 66 65 72 20 0a 2a 2a 20 69 73 20 6e 6f  Buffer .** is no
6cc0: 74 20 4e 55 4c 4c 20 74 68 65 6e 20 2a 70 7a 42  t NULL then *pzB
6cd0: 75 66 66 65 72 20 69 73 20 61 73 73 75 6d 65 64  uffer is assumed
6ce0: 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20 62   to point to a b
6cf0: 75 66 66 65 72 20 6c 61 72 67 65 20 65 6e 6f 75  uffer large enou
6d00: 67 68 20 0a 2a 2a 20 74 6f 20 73 74 6f 72 65 20  gh .** to store 
6d10: 74 68 65 20 63 6f 70 79 20 6f 66 20 65 78 70 72  the copy of expr
6d20: 65 73 73 69 6f 6e 20 70 2c 20 74 68 65 20 63 6f  ession p, the co
6d30: 70 69 65 73 20 6f 66 20 70 2d 3e 75 2e 7a 54 6f  pies of p->u.zTo
6d40: 6b 65 6e 0a 2a 2a 20 28 69 66 20 61 70 70 6c 69  ken.** (if appli
6d50: 63 61 62 6c 65 29 2c 20 61 6e 64 20 74 68 65 20  cable), and the 
6d60: 63 6f 70 69 65 73 20 6f 66 20 74 68 65 20 70 2d  copies of the p-
6d70: 3e 70 4c 65 66 74 20 61 6e 64 20 70 2d 3e 70 52  >pLeft and p->pR
6d80: 69 67 68 74 20 65 78 70 72 65 73 73 69 6f 6e 73  ight expressions
6d90: 2c 0a 2a 2a 20 69 66 20 61 6e 79 2e 20 42 65 66  ,.** if any. Bef
6da0: 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 2a  ore returning, *
6db0: 70 7a 42 75 66 66 65 72 20 69 73 20 73 65 74 20  pzBuffer is set 
6dc0: 74 6f 20 74 68 65 20 66 69 72 73 74 20 62 79 74  to the first byt
6dd0: 65 20 70 61 73 74 20 74 68 65 0a 2a 2a 20 70 6f  e past the.** po
6de0: 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 62 75 66  rtion of the buf
6df0: 66 65 72 20 63 6f 70 69 65 64 20 69 6e 74 6f 20  fer copied into 
6e00: 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
6e10: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 45 78 70 72  ..*/.static Expr
6e20: 20 2a 65 78 70 72 44 75 70 28 73 71 6c 69 74 65   *exprDup(sqlite
6e30: 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 2c 20  3 *db, Expr *p, 
6e40: 69 6e 74 20 66 6c 61 67 73 2c 20 75 38 20 2a 2a  int flags, u8 **
6e50: 70 7a 42 75 66 66 65 72 29 7b 0a 20 20 45 78 70  pzBuffer){.  Exp
6e60: 72 20 2a 70 4e 65 77 20 3d 20 30 3b 20 20 20 20  r *pNew = 0;    
6e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6e80: 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72 65    /* Value to re
6e90: 74 75 72 6e 20 2a 2f 0a 20 20 69 66 28 20 70 20  turn */.  if( p 
6ea0: 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74  ){.    const int
6eb0: 20 69 73 52 65 64 75 63 65 64 20 3d 20 28 66 6c   isReduced = (fl
6ec0: 61 67 73 26 45 58 50 52 44 55 50 5f 52 45 44 55  ags&EXPRDUP_REDU
6ed0: 43 45 29 3b 0a 20 20 20 20 75 38 20 2a 7a 41 6c  CE);.    u8 *zAl
6ee0: 6c 6f 63 3b 0a 20 20 20 20 75 33 32 20 73 74 61  loc;.    u32 sta
6ef0: 74 69 63 46 6c 61 67 20 3d 20 30 3b 0a 0a 20 20  ticFlag = 0;..  
6f00: 20 20 61 73 73 65 72 74 28 20 70 7a 42 75 66 66    assert( pzBuff
6f10: 65 72 3d 3d 30 20 7c 7c 20 69 73 52 65 64 75 63  er==0 || isReduc
6f20: 65 64 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 46 69  ed );..    /* Fi
6f30: 67 75 72 65 20 6f 75 74 20 77 68 65 72 65 20 74  gure out where t
6f40: 6f 20 77 72 69 74 65 20 74 68 65 20 6e 65 77 20  o write the new 
6f50: 45 78 70 72 20 73 74 72 75 63 74 75 72 65 2e 20  Expr structure. 
6f60: 2a 2f 0a 20 20 20 20 69 66 28 20 70 7a 42 75 66  */.    if( pzBuf
6f70: 66 65 72 20 29 7b 0a 20 20 20 20 20 20 7a 41 6c  fer ){.      zAl
6f80: 6c 6f 63 20 3d 20 2a 70 7a 42 75 66 66 65 72 3b  loc = *pzBuffer;
6f90: 0a 20 20 20 20 20 20 73 74 61 74 69 63 46 6c 61  .      staticFla
6fa0: 67 20 3d 20 45 50 5f 53 74 61 74 69 63 3b 0a 20  g = EP_Static;. 
6fb0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
6fc0: 7a 41 6c 6c 6f 63 20 3d 20 73 71 6c 69 74 65 33  zAlloc = sqlite3
6fd0: 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20  DbMallocRaw(db, 
6fe0: 64 75 70 65 64 45 78 70 72 53 69 7a 65 28 70 2c  dupedExprSize(p,
6ff0: 20 66 6c 61 67 73 29 29 3b 0a 20 20 20 20 7d 0a   flags));.    }.
7000: 20 20 20 20 70 4e 65 77 20 3d 20 28 45 78 70 72      pNew = (Expr
7010: 20 2a 29 7a 41 6c 6c 6f 63 3b 0a 0a 20 20 20 20   *)zAlloc;..    
7020: 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20  if( pNew ){.    
7030: 20 20 2f 2a 20 53 65 74 20 6e 4e 65 77 53 69 7a    /* Set nNewSiz
7040: 65 20 74 6f 20 74 68 65 20 73 69 7a 65 20 61 6c  e to the size al
7050: 6c 6f 63 61 74 65 64 20 66 6f 72 20 74 68 65 20  located for the 
7060: 73 74 72 75 63 74 75 72 65 20 70 6f 69 6e 74 65  structure pointe
7070: 64 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 62 79  d to.      ** by
7080: 20 70 4e 65 77 2e 20 54 68 69 73 20 69 73 20 65   pNew. This is e
7090: 69 74 68 65 72 20 45 58 50 52 5f 46 55 4c 4c 53  ither EXPR_FULLS
70a0: 49 5a 45 2c 20 45 58 50 52 5f 52 45 44 55 43 45  IZE, EXPR_REDUCE
70b0: 44 53 49 5a 45 20 6f 72 0a 20 20 20 20 20 20 2a  DSIZE or.      *
70c0: 2a 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59  * EXPR_TOKENONLY
70d0: 53 49 5a 45 2e 20 6e 54 6f 6b 65 6e 20 69 73 20  SIZE. nToken is 
70e0: 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65  set to the numbe
70f0: 72 20 6f 66 20 62 79 74 65 73 20 63 6f 6e 73 75  r of bytes consu
7100: 6d 65 64 0a 20 20 20 20 20 20 2a 2a 20 62 79 20  med.      ** by 
7110: 74 68 65 20 63 6f 70 79 20 6f 66 20 74 68 65 20  the copy of the 
7120: 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 73 74 72 69  p->u.zToken stri
7130: 6e 67 20 28 69 66 20 61 6e 79 29 2e 0a 20 20 20  ng (if any)..   
7140: 20 20 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73     */.      cons
7150: 74 20 75 6e 73 69 67 6e 65 64 20 6e 53 74 72 75  t unsigned nStru
7160: 63 74 53 69 7a 65 20 3d 20 64 75 70 65 64 45 78  ctSize = dupedEx
7170: 70 72 53 74 72 75 63 74 53 69 7a 65 28 70 2c 20  prStructSize(p, 
7180: 66 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 63 6f  flags);.      co
7190: 6e 73 74 20 69 6e 74 20 6e 4e 65 77 53 69 7a 65  nst int nNewSize
71a0: 20 3d 20 6e 53 74 72 75 63 74 53 69 7a 65 20 26   = nStructSize &
71b0: 20 30 78 66 66 66 3b 0a 20 20 20 20 20 20 69 6e   0xfff;.      in
71c0: 74 20 6e 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20  t nToken;.      
71d0: 69 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  if( !ExprHasProp
71e0: 65 72 74 79 28 70 2c 20 45 50 5f 49 6e 74 56 61  erty(p, EP_IntVa
71f0: 6c 75 65 29 20 26 26 20 70 2d 3e 75 2e 7a 54 6f  lue) && p->u.zTo
7200: 6b 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 6e  ken ){.        n
7210: 54 6f 6b 65 6e 20 3d 20 73 71 6c 69 74 65 33 53  Token = sqlite3S
7220: 74 72 6c 65 6e 33 30 28 70 2d 3e 75 2e 7a 54 6f  trlen30(p->u.zTo
7230: 6b 65 6e 29 20 2b 20 31 3b 0a 20 20 20 20 20 20  ken) + 1;.      
7240: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6e  }else{.        n
7250: 54 6f 6b 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20  Token = 0;.     
7260: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 73 52   }.      if( isR
7270: 65 64 75 63 65 64 20 29 7b 0a 20 20 20 20 20 20  educed ){.      
7280: 20 20 61 73 73 65 72 74 28 20 45 78 70 72 48 61    assert( ExprHa
7290: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
72a0: 52 65 64 75 63 65 64 29 3d 3d 30 20 29 3b 0a 20  Reduced)==0 );. 
72b0: 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 41         memcpy(zA
72c0: 6c 6c 6f 63 2c 20 70 2c 20 6e 4e 65 77 53 69 7a  lloc, p, nNewSiz
72d0: 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  e);.      }else{
72e0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 53 69  .        int nSi
72f0: 7a 65 20 3d 20 65 78 70 72 53 74 72 75 63 74 53  ze = exprStructS
7300: 69 7a 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20  ize(p);.        
7310: 6d 65 6d 63 70 79 28 7a 41 6c 6c 6f 63 2c 20 70  memcpy(zAlloc, p
7320: 2c 20 6e 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  , nSize);.      
7330: 20 20 6d 65 6d 73 65 74 28 26 7a 41 6c 6c 6f 63    memset(&zAlloc
7340: 5b 6e 53 69 7a 65 5d 2c 20 30 2c 20 45 58 50 52  [nSize], 0, EXPR
7350: 5f 46 55 4c 4c 53 49 5a 45 2d 6e 53 69 7a 65 29  _FULLSIZE-nSize)
7360: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
7370: 20 2f 2a 20 53 65 74 20 74 68 65 20 45 50 5f 52   /* Set the EP_R
7380: 65 64 75 63 65 64 2c 20 45 50 5f 54 6f 6b 65 6e  educed, EP_Token
7390: 4f 6e 6c 79 2c 20 61 6e 64 20 45 50 5f 53 74 61  Only, and EP_Sta
73a0: 74 69 63 20 66 6c 61 67 73 20 61 70 70 72 6f 70  tic flags approp
73b0: 72 69 61 74 65 6c 79 2e 20 2a 2f 0a 20 20 20 20  riately. */.    
73c0: 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 26 3d    pNew->flags &=
73d0: 20 7e 28 45 50 5f 52 65 64 75 63 65 64 7c 45 50   ~(EP_Reduced|EP
73e0: 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 53 74  _TokenOnly|EP_St
73f0: 61 74 69 63 7c 45 50 5f 4d 65 6d 54 6f 6b 65 6e  atic|EP_MemToken
7400: 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 66  );.      pNew->f
7410: 6c 61 67 73 20 7c 3d 20 6e 53 74 72 75 63 74 53  lags |= nStructS
7420: 69 7a 65 20 26 20 28 45 50 5f 52 65 64 75 63 65  ize & (EP_Reduce
7430: 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 3b  d|EP_TokenOnly);
7440: 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61  .      pNew->fla
7450: 67 73 20 7c 3d 20 73 74 61 74 69 63 46 6c 61 67  gs |= staticFlag
7460: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 70 79  ;..      /* Copy
7470: 20 74 68 65 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e   the p->u.zToken
7480: 20 73 74 72 69 6e 67 2c 20 69 66 20 61 6e 79 2e   string, if any.
7490: 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6e 54   */.      if( nT
74a0: 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  oken ){.        
74b0: 63 68 61 72 20 2a 7a 54 6f 6b 65 6e 20 3d 20 70  char *zToken = p
74c0: 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 3d 20  New->u.zToken = 
74d0: 28 63 68 61 72 2a 29 26 7a 41 6c 6c 6f 63 5b 6e  (char*)&zAlloc[n
74e0: 4e 65 77 53 69 7a 65 5d 3b 0a 20 20 20 20 20 20  NewSize];.      
74f0: 20 20 6d 65 6d 63 70 79 28 7a 54 6f 6b 65 6e 2c    memcpy(zToken,
7500: 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 6e 54   p->u.zToken, nT
7510: 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  oken);.      }..
7520: 20 20 20 20 20 20 69 66 28 20 30 3d 3d 28 28 70        if( 0==((p
7530: 2d 3e 66 6c 61 67 73 7c 70 4e 65 77 2d 3e 66 6c  ->flags|pNew->fl
7540: 61 67 73 29 20 26 20 45 50 5f 54 6f 6b 65 6e 4f  ags) & EP_TokenO
7550: 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 20 20  nly) ){.        
7560: 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 70  /* Fill in the p
7570: 4e 65 77 2d 3e 78 2e 70 53 65 6c 65 63 74 20 6f  New->x.pSelect o
7580: 72 20 70 4e 65 77 2d 3e 78 2e 70 4c 69 73 74 20  r pNew->x.pList 
7590: 6d 65 6d 62 65 72 2e 20 2a 2f 0a 20 20 20 20 20  member. */.     
75a0: 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72     if( ExprHasPr
75b0: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 78 49 73  operty(p, EP_xIs
75c0: 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20  Select) ){.     
75d0: 20 20 20 20 20 70 4e 65 77 2d 3e 78 2e 70 53 65       pNew->x.pSe
75e0: 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65  lect = sqlite3Se
75f0: 6c 65 63 74 44 75 70 28 64 62 2c 20 70 2d 3e 78  lectDup(db, p->x
7600: 2e 70 53 65 6c 65 63 74 2c 20 69 73 52 65 64 75  .pSelect, isRedu
7610: 63 65 64 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  ced);.        }e
7620: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70  lse{.          p
7630: 4e 65 77 2d 3e 78 2e 70 4c 69 73 74 20 3d 20 73  New->x.pList = s
7640: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
7650: 70 28 64 62 2c 20 70 2d 3e 78 2e 70 4c 69 73 74  p(db, p->x.pList
7660: 2c 20 69 73 52 65 64 75 63 65 64 29 3b 0a 20 20  , isReduced);.  
7670: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
7680: 0a 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69  .      /* Fill i
7690: 6e 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 61 6e  n pNew->pLeft an
76a0: 64 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 2e 20  d pNew->pRight. 
76b0: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 45 78 70  */.      if( Exp
76c0: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 4e 65  rHasProperty(pNe
76d0: 77 2c 20 45 50 5f 52 65 64 75 63 65 64 7c 45 50  w, EP_Reduced|EP
76e0: 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20  _TokenOnly) ){. 
76f0: 20 20 20 20 20 20 20 7a 41 6c 6c 6f 63 20 2b 3d         zAlloc +=
7700: 20 64 75 70 65 64 45 78 70 72 4e 6f 64 65 53 69   dupedExprNodeSi
7710: 7a 65 28 70 2c 20 66 6c 61 67 73 29 3b 0a 20 20  ze(p, flags);.  
7720: 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61        if( ExprHa
7730: 73 50 72 6f 70 65 72 74 79 28 70 4e 65 77 2c 20  sProperty(pNew, 
7740: 45 50 5f 52 65 64 75 63 65 64 29 20 29 7b 0a 20  EP_Reduced) ){. 
7750: 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70           pNew->p
7760: 4c 65 66 74 20 3d 20 65 78 70 72 44 75 70 28 64  Left = exprDup(d
7770: 62 2c 20 70 2d 3e 70 4c 65 66 74 2c 20 45 58 50  b, p->pLeft, EXP
7780: 52 44 55 50 5f 52 45 44 55 43 45 2c 20 26 7a 41  RDUP_REDUCE, &zA
7790: 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20 20 20 20  lloc);.         
77a0: 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 20 3d 20   pNew->pRight = 
77b0: 65 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70  exprDup(db, p->p
77c0: 52 69 67 68 74 2c 20 45 58 50 52 44 55 50 5f 52  Right, EXPRDUP_R
77d0: 45 44 55 43 45 2c 20 26 7a 41 6c 6c 6f 63 29 3b  EDUCE, &zAlloc);
77e0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
77f0: 20 20 20 69 66 28 20 70 7a 42 75 66 66 65 72 20     if( pzBuffer 
7800: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 7a  ){.          *pz
7810: 42 75 66 66 65 72 20 3d 20 7a 41 6c 6c 6f 63 3b  Buffer = zAlloc;
7820: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
7830: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
7840: 69 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  if( !ExprHasProp
7850: 65 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e  erty(p, EP_Token
7860: 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 20  Only) ){.       
7870: 20 20 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d     pNew->pLeft =
7880: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
7890: 64 62 2c 20 70 2d 3e 70 4c 65 66 74 2c 20 30 29  db, p->pLeft, 0)
78a0: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77  ;.          pNew
78b0: 2d 3e 70 52 69 67 68 74 20 3d 20 73 71 6c 69 74  ->pRight = sqlit
78c0: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d  e3ExprDup(db, p-
78d0: 3e 70 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 20  >pRight, 0);.   
78e0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a       }.      }..
78f0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
7900: 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pNew;.}../*.*
7910: 2a 20 43 72 65 61 74 65 20 61 6e 64 20 72 65 74  * Create and ret
7920: 75 72 6e 20 61 20 64 65 65 70 20 63 6f 70 79 20  urn a deep copy 
7930: 6f 66 20 74 68 65 20 6f 62 6a 65 63 74 20 70 61  of the object pa
7940: 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
7950: 6e 64 20 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e  nd .** argument.
7960: 20 49 66 20 61 6e 20 4f 4f 4d 20 63 6f 6e 64 69   If an OOM condi
7970: 74 69 6f 6e 20 69 73 20 65 6e 63 6f 75 6e 74 65  tion is encounte
7980: 72 65 64 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74  red, NULL is ret
7990: 75 72 6e 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65  urned.** and the
79a0: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
79b0: 64 20 66 6c 61 67 20 73 65 74 2e 0a 2a 2f 0a 23  d flag set..*/.#
79c0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
79d0: 49 54 5f 43 54 45 0a 73 74 61 74 69 63 20 57 69  IT_CTE.static Wi
79e0: 74 68 20 2a 77 69 74 68 44 75 70 28 73 71 6c 69  th *withDup(sqli
79f0: 74 65 33 20 2a 64 62 2c 20 57 69 74 68 20 2a 70  te3 *db, With *p
7a00: 29 7b 0a 20 20 57 69 74 68 20 2a 70 52 65 74 20  ){.  With *pRet 
7a10: 3d 20 30 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a  = 0;.  if( p ){.
7a20: 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20      int nByte = 
7a30: 73 69 7a 65 6f 66 28 2a 70 29 20 2b 20 73 69 7a  sizeof(*p) + siz
7a40: 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 2a 20 28  eof(p->a[0]) * (
7a50: 70 2d 3e 6e 43 74 65 2d 31 29 3b 0a 20 20 20 20  p->nCte-1);.    
7a60: 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33 44 62  pRet = sqlite3Db
7a70: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e  MallocZero(db, n
7a80: 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28 20 70  Byte);.    if( p
7a90: 52 65 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  Ret ){.      int
7aa0: 20 69 3b 0a 20 20 20 20 20 20 70 52 65 74 2d 3e   i;.      pRet->
7ab0: 6e 43 74 65 20 3d 20 70 2d 3e 6e 43 74 65 3b 0a  nCte = p->nCte;.
7ac0: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
7ad0: 3c 70 2d 3e 6e 43 74 65 3b 20 69 2b 2b 29 7b 0a  <p->nCte; i++){.
7ae0: 20 20 20 20 20 20 20 20 70 52 65 74 2d 3e 61 5b          pRet->a[
7af0: 69 5d 2e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c  i].pSelect = sql
7b00: 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62  ite3SelectDup(db
7b10: 2c 20 70 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63  , p->a[i].pSelec
7b20: 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70  t, 0);.        p
7b30: 52 65 74 2d 3e 61 5b 69 5d 2e 70 43 6f 6c 73 20  Ret->a[i].pCols 
7b40: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
7b50: 74 44 75 70 28 64 62 2c 20 70 2d 3e 61 5b 69 5d  tDup(db, p->a[i]
7b60: 2e 70 43 6f 6c 73 2c 20 30 29 3b 0a 20 20 20 20  .pCols, 0);.    
7b70: 20 20 20 20 70 52 65 74 2d 3e 61 5b 69 5d 2e 7a      pRet->a[i].z
7b80: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62  Name = sqlite3Db
7b90: 53 74 72 44 75 70 28 64 62 2c 20 70 2d 3e 61 5b  StrDup(db, p->a[
7ba0: 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  i].zName);.     
7bb0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
7bc0: 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 23 65  eturn pRet;.}.#e
7bd0: 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 77 69 74  lse.# define wit
7be0: 68 44 75 70 28 78 2c 79 29 20 30 0a 23 65 6e 64  hDup(x,y) 0.#end
7bf0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  if../*.** The fo
7c00: 6c 6c 6f 77 69 6e 67 20 67 72 6f 75 70 20 6f 66  llowing group of
7c10: 20 72 6f 75 74 69 6e 65 73 20 6d 61 6b 65 20 64   routines make d
7c20: 65 65 70 20 63 6f 70 69 65 73 20 6f 66 20 65 78  eep copies of ex
7c30: 70 72 65 73 73 69 6f 6e 73 2c 0a 2a 2a 20 65 78  pressions,.** ex
7c40: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 73 2c 20  pression lists, 
7c50: 49 44 20 6c 69 73 74 73 2c 20 61 6e 64 20 73 65  ID lists, and se
7c60: 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 73 2e  lect statements.
7c70: 20 20 54 68 65 20 63 6f 70 69 65 73 20 63 61 6e    The copies can
7c80: 0a 2a 2a 20 62 65 20 64 65 6c 65 74 65 64 20 28  .** be deleted (
7c90: 62 79 20 62 65 69 6e 67 20 70 61 73 73 65 64 20  by being passed 
7ca0: 74 6f 20 74 68 65 69 72 20 72 65 73 70 65 63 74  to their respect
7cb0: 69 76 65 20 2e 2e 2e 44 65 6c 65 74 65 28 29 20  ive ...Delete() 
7cc0: 72 6f 75 74 69 6e 65 73 29 0a 2a 2a 20 77 69 74  routines).** wit
7cd0: 68 6f 75 74 20 65 66 66 65 63 74 69 6e 67 20 74  hout effecting t
7ce0: 68 65 20 6f 72 69 67 69 6e 61 6c 73 2e 0a 2a 2a  he originals..**
7cf0: 0a 2a 2a 20 54 68 65 20 65 78 70 72 65 73 73 69  .** The expressi
7d00: 6f 6e 20 6c 69 73 74 2c 20 49 44 2c 20 61 6e 64  on list, ID, and
7d10: 20 73 6f 75 72 63 65 20 6c 69 73 74 73 20 72 65   source lists re
7d20: 74 75 72 6e 20 62 79 20 73 71 6c 69 74 65 33 45  turn by sqlite3E
7d30: 78 70 72 4c 69 73 74 44 75 70 28 29 2c 0a 2a 2a  xprListDup(),.**
7d40: 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 75   sqlite3IdListDu
7d50: 70 28 29 2c 20 61 6e 64 20 73 71 6c 69 74 65 33  p(), and sqlite3
7d60: 53 72 63 4c 69 73 74 44 75 70 28 29 20 63 61 6e  SrcListDup() can
7d70: 20 6e 6f 74 20 62 65 20 66 75 72 74 68 65 72 20   not be further 
7d80: 65 78 70 61 6e 64 65 64 20 0a 2a 2a 20 62 79 20  expanded .** by 
7d90: 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73  subsequent calls
7da0: 20 74 6f 20 73 71 6c 69 74 65 2a 4c 69 73 74 41   to sqlite*ListA
7db0: 70 70 65 6e 64 28 29 20 72 6f 75 74 69 6e 65 73  ppend() routines
7dc0: 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 74 61 62 6c  ..**.** Any tabl
7dd0: 65 73 20 74 68 61 74 20 74 68 65 20 53 72 63 4c  es that the SrcL
7de0: 69 73 74 20 6d 69 67 68 74 20 70 6f 69 6e 74 20  ist might point 
7df0: 74 6f 20 61 72 65 20 6e 6f 74 20 64 75 70 6c 69  to are not dupli
7e00: 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  cated..**.** The
7e10: 20 66 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72   flags parameter
7e20: 20 63 6f 6e 74 61 69 6e 73 20 61 20 63 6f 6d 62   contains a comb
7e30: 69 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 45  ination of the E
7e40: 58 50 52 44 55 50 5f 58 58 58 20 66 6c 61 67 73  XPRDUP_XXX flags
7e50: 2e 0a 2a 2a 20 49 66 20 74 68 65 20 45 58 50 52  ..** If the EXPR
7e60: 44 55 50 5f 52 45 44 55 43 45 20 66 6c 61 67 20  DUP_REDUCE flag 
7e70: 69 73 20 73 65 74 2c 20 74 68 65 6e 20 74 68 65  is set, then the
7e80: 20 73 74 72 75 63 74 75 72 65 20 72 65 74 75 72   structure retur
7e90: 6e 65 64 20 69 73 20 61 0a 2a 2a 20 74 72 75 6e  ned is a.** trun
7ea0: 63 61 74 65 64 20 76 65 72 73 69 6f 6e 20 6f 66  cated version of
7eb0: 20 74 68 65 20 75 73 75 61 6c 20 45 78 70 72 20   the usual Expr 
7ec0: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 77  structure that w
7ed0: 69 6c 6c 20 62 65 20 73 74 6f 72 65 64 20 61 73  ill be stored as
7ee0: 0a 2a 2a 20 70 61 72 74 20 6f 66 20 74 68 65 20  .** part of the 
7ef0: 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65 73  in-memory repres
7f00: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
7f10: 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e  database schema.
7f20: 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65  .*/.Expr *sqlite
7f30: 33 45 78 70 72 44 75 70 28 73 71 6c 69 74 65 33  3ExprDup(sqlite3
7f40: 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 2c 20 69   *db, Expr *p, i
7f50: 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 72 65 74  nt flags){.  ret
7f60: 75 72 6e 20 65 78 70 72 44 75 70 28 64 62 2c 20  urn exprDup(db, 
7f70: 70 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 7d 0a  p, flags, 0);.}.
7f80: 45 78 70 72 4c 69 73 74 20 2a 73 71 6c 69 74 65  ExprList *sqlite
7f90: 33 45 78 70 72 4c 69 73 74 44 75 70 28 73 71 6c  3ExprListDup(sql
7fa0: 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72 4c 69  ite3 *db, ExprLi
7fb0: 73 74 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73  st *p, int flags
7fc0: 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  ){.  ExprList *p
7fd0: 4e 65 77 3b 0a 20 20 73 74 72 75 63 74 20 45 78  New;.  struct Ex
7fe0: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
7ff0: 65 6d 2c 20 2a 70 4f 6c 64 49 74 65 6d 3b 0a 20  em, *pOldItem;. 
8000: 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 3d   int i;.  if( p=
8010: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
8020: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44   pNew = sqlite3D
8030: 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73  bMallocRaw(db, s
8040: 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a  izeof(*pNew) );.
8050: 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20    if( pNew==0 ) 
8060: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77  return 0;.  pNew
8070: 2d 3e 6e 45 78 70 72 20 3d 20 69 20 3d 20 70 2d  ->nExpr = i = p-
8080: 3e 6e 45 78 70 72 3b 0a 20 20 69 66 28 20 28 66  >nExpr;.  if( (f
8090: 6c 61 67 73 20 26 20 45 58 50 52 44 55 50 5f 52  lags & EXPRDUP_R
80a0: 45 44 55 43 45 29 3d 3d 30 20 29 20 66 6f 72 28  EDUCE)==0 ) for(
80b0: 69 3d 31 3b 20 69 3c 70 2d 3e 6e 45 78 70 72 3b  i=1; i<p->nExpr;
80c0: 20 69 2b 3d 69 29 7b 7d 0a 20 20 70 4e 65 77 2d   i+=i){}.  pNew-
80d0: 3e 61 20 3d 20 70 49 74 65 6d 20 3d 20 73 71 6c  >a = pItem = sql
80e0: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28  ite3DbMallocRaw(
80f0: 64 62 2c 20 20 69 2a 73 69 7a 65 6f 66 28 70 2d  db,  i*sizeof(p-
8100: 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20  >a[0]) );.  if( 
8110: 70 49 74 65 6d 3d 3d 30 20 29 7b 0a 20 20 20 20  pItem==0 ){.    
8120: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
8130: 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 72 65 74  , pNew);.    ret
8140: 75 72 6e 20 30 3b 0a 20 20 7d 20 0a 20 20 70 4f  urn 0;.  } .  pO
8150: 6c 64 49 74 65 6d 20 3d 20 70 2d 3e 61 3b 0a 20  ldItem = p->a;. 
8160: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
8170: 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d  Expr; i++, pItem
8180: 2b 2b 2c 20 70 4f 6c 64 49 74 65 6d 2b 2b 29 7b  ++, pOldItem++){
8190: 0a 20 20 20 20 45 78 70 72 20 2a 70 4f 6c 64 45  .    Expr *pOldE
81a0: 78 70 72 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e  xpr = pOldItem->
81b0: 70 45 78 70 72 3b 0a 20 20 20 20 70 49 74 65 6d  pExpr;.    pItem
81c0: 2d 3e 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65  ->pExpr = sqlite
81d0: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4f 6c  3ExprDup(db, pOl
81e0: 64 45 78 70 72 2c 20 66 6c 61 67 73 29 3b 0a 20  dExpr, flags);. 
81f0: 20 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20     pItem->zName 
8200: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
8210: 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e  p(db, pOldItem->
8220: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 49 74 65  zName);.    pIte
8230: 6d 2d 3e 7a 53 70 61 6e 20 3d 20 73 71 6c 69 74  m->zSpan = sqlit
8240: 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70  e3DbStrDup(db, p
8250: 4f 6c 64 49 74 65 6d 2d 3e 7a 53 70 61 6e 29 3b  OldItem->zSpan);
8260: 0a 20 20 20 20 70 49 74 65 6d 2d 3e 73 6f 72 74  .    pItem->sort
8270: 4f 72 64 65 72 20 3d 20 70 4f 6c 64 49 74 65 6d  Order = pOldItem
8280: 2d 3e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20  ->sortOrder;.   
8290: 20 70 49 74 65 6d 2d 3e 64 6f 6e 65 20 3d 20 30   pItem->done = 0
82a0: 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 62 53 70  ;.    pItem->bSp
82b0: 61 6e 49 73 54 61 62 20 3d 20 70 4f 6c 64 49 74  anIsTab = pOldIt
82c0: 65 6d 2d 3e 62 53 70 61 6e 49 73 54 61 62 3b 0a  em->bSpanIsTab;.
82d0: 20 20 20 20 70 49 74 65 6d 2d 3e 75 20 3d 20 70      pItem->u = p
82e0: 4f 6c 64 49 74 65 6d 2d 3e 75 3b 0a 20 20 7d 0a  OldItem->u;.  }.
82f0: 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d    return pNew;.}
8300: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 63 75 72 73 6f  ../*.** If curso
8310: 72 73 2c 20 74 72 69 67 67 65 72 73 2c 20 76 69  rs, triggers, vi
8320: 65 77 73 20 61 6e 64 20 73 75 62 71 75 65 72 69  ews and subqueri
8330: 65 73 20 61 72 65 20 61 6c 6c 20 6f 6d 69 74 74  es are all omitt
8340: 65 64 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 62  ed from.** the b
8350: 75 69 6c 64 2c 20 74 68 65 6e 20 6e 6f 6e 65 20  uild, then none 
8360: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
8370: 20 72 6f 75 74 69 6e 65 73 2c 20 65 78 63 65 70   routines, excep
8380: 74 20 66 6f 72 20 0a 2a 2a 20 73 71 6c 69 74 65  t for .** sqlite
8390: 33 53 65 6c 65 63 74 44 75 70 28 29 2c 20 63 61  3SelectDup(), ca
83a0: 6e 20 62 65 20 63 61 6c 6c 65 64 2e 20 73 71 6c  n be called. sql
83b0: 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 29 20  ite3SelectDup() 
83c0: 69 73 20 73 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20  is sometimes.** 
83d0: 63 61 6c 6c 65 64 20 77 69 74 68 20 61 20 4e 55  called with a NU
83e0: 4c 4c 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  LL argument..*/.
83f0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
8400: 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c  ITE_OMIT_VIEW) |
8410: 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
8420: 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 29 20  E_OMIT_TRIGGER) 
8430: 5c 0a 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  \. || !defined(S
8440: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
8450: 45 52 59 29 0a 53 72 63 4c 69 73 74 20 2a 73 71  ERY).SrcList *sq
8460: 6c 69 74 65 33 53 72 63 4c 69 73 74 44 75 70 28  lite3SrcListDup(
8470: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 72 63  sqlite3 *db, Src
8480: 4c 69 73 74 20 2a 70 2c 20 69 6e 74 20 66 6c 61  List *p, int fla
8490: 67 73 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a  gs){.  SrcList *
84a0: 70 4e 65 77 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  pNew;.  int i;. 
84b0: 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 69 66   int nByte;.  if
84c0: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( p==0 ) return 
84d0: 30 3b 0a 20 20 6e 42 79 74 65 20 3d 20 73 69 7a  0;.  nByte = siz
84e0: 65 6f 66 28 2a 70 29 20 2b 20 28 70 2d 3e 6e 53  eof(*p) + (p->nS
84f0: 72 63 3e 30 20 3f 20 73 69 7a 65 6f 66 28 70 2d  rc>0 ? sizeof(p-
8500: 3e 61 5b 30 5d 29 20 2a 20 28 70 2d 3e 6e 53 72  >a[0]) * (p->nSr
8510: 63 2d 31 29 20 3a 20 30 29 3b 0a 20 20 70 4e 65  c-1) : 0);.  pNe
8520: 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  w = sqlite3DbMal
8530: 6c 6f 63 52 61 77 28 64 62 2c 20 6e 42 79 74 65  locRaw(db, nByte
8540: 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d   );.  if( pNew==
8550: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
8560: 70 4e 65 77 2d 3e 6e 53 72 63 20 3d 20 70 4e 65  pNew->nSrc = pNe
8570: 77 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e  w->nAlloc = p->n
8580: 53 72 63 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  Src;.  for(i=0; 
8590: 69 3c 70 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b  i<p->nSrc; i++){
85a0: 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c  .    struct SrcL
85b0: 69 73 74 5f 69 74 65 6d 20 2a 70 4e 65 77 49 74  ist_item *pNewIt
85c0: 65 6d 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 69 5d  em = &pNew->a[i]
85d0: 3b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63  ;.    struct Src
85e0: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4f 6c 64 49  List_item *pOldI
85f0: 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a  tem = &p->a[i];.
8600: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b      Table *pTab;
8610: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70  .    pNewItem->p
8620: 53 63 68 65 6d 61 20 3d 20 70 4f 6c 64 49 74 65  Schema = pOldIte
8630: 6d 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20  m->pSchema;.    
8640: 70 4e 65 77 49 74 65 6d 2d 3e 7a 44 61 74 61 62  pNewItem->zDatab
8650: 61 73 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ase = sqlite3DbS
8660: 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74  trDup(db, pOldIt
8670: 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a  em->zDatabase);.
8680: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e      pNewItem->zN
8690: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ame = sqlite3DbS
86a0: 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74  trDup(db, pOldIt
86b0: 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  em->zName);.    
86c0: 70 4e 65 77 49 74 65 6d 2d 3e 7a 41 6c 69 61 73  pNewItem->zAlias
86d0: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
86e0: 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d  up(db, pOldItem-
86f0: 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 70 4e  >zAlias);.    pN
8700: 65 77 49 74 65 6d 2d 3e 66 67 20 3d 20 70 4f 6c  ewItem->fg = pOl
8710: 64 49 74 65 6d 2d 3e 66 67 3b 0a 20 20 20 20 70  dItem->fg;.    p
8720: 4e 65 77 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  NewItem->iCursor
8730: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 43 75   = pOldItem->iCu
8740: 72 73 6f 72 3b 0a 20 20 20 20 70 4e 65 77 49 74  rsor;.    pNewIt
8750: 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20  em->addrFillSub 
8760: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 61 64 64 72  = pOldItem->addr
8770: 46 69 6c 6c 53 75 62 3b 0a 20 20 20 20 70 4e 65  FillSub;.    pNe
8780: 77 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e  wItem->regReturn
8790: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 72 65 67   = pOldItem->reg
87a0: 52 65 74 75 72 6e 3b 0a 20 20 20 20 69 66 28 20  Return;.    if( 
87b0: 70 4e 65 77 49 74 65 6d 2d 3e 66 67 2e 69 73 49  pNewItem->fg.isI
87c0: 6e 64 65 78 65 64 42 79 20 29 7b 0a 20 20 20 20  ndexedBy ){.    
87d0: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 75 31 2e 7a    pNewItem->u1.z
87e0: 49 6e 64 65 78 65 64 42 79 20 3d 20 73 71 6c 69  IndexedBy = sqli
87f0: 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
8800: 70 4f 6c 64 49 74 65 6d 2d 3e 75 31 2e 7a 49 6e  pOldItem->u1.zIn
8810: 64 65 78 65 64 42 79 29 3b 0a 20 20 20 20 7d 0a  dexedBy);.    }.
8820: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 49      pNewItem->pI
8830: 42 49 6e 64 65 78 20 3d 20 70 4f 6c 64 49 74 65  BIndex = pOldIte
8840: 6d 2d 3e 70 49 42 49 6e 64 65 78 3b 0a 20 20 20  m->pIBIndex;.   
8850: 20 69 66 28 20 70 4e 65 77 49 74 65 6d 2d 3e 66   if( pNewItem->f
8860: 67 2e 69 73 54 61 62 46 75 6e 63 20 29 7b 0a 20  g.isTabFunc ){. 
8870: 20 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 75       pNewItem->u
8880: 31 2e 70 46 75 6e 63 41 72 67 20 3d 20 0a 20 20  1.pFuncArg = .  
8890: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
88a0: 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70  xprListDup(db, p
88b0: 4f 6c 64 49 74 65 6d 2d 3e 75 31 2e 70 46 75 6e  OldItem->u1.pFun
88c0: 63 41 72 67 2c 20 66 6c 61 67 73 29 3b 0a 20 20  cArg, flags);.  
88d0: 20 20 7d 0a 20 20 20 20 70 54 61 62 20 3d 20 70    }.    pTab = p
88e0: 4e 65 77 49 74 65 6d 2d 3e 70 54 61 62 20 3d 20  NewItem->pTab = 
88f0: 70 4f 6c 64 49 74 65 6d 2d 3e 70 54 61 62 3b 0a  pOldItem->pTab;.
8900: 20 20 20 20 69 66 28 20 70 54 61 62 20 29 7b 0a      if( pTab ){.
8910: 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 52 65 66        pTab->nRef
8920: 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e  ++;.    }.    pN
8930: 65 77 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20  ewItem->pSelect 
8940: 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  = sqlite3SelectD
8950: 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d  up(db, pOldItem-
8960: 3e 70 53 65 6c 65 63 74 2c 20 66 6c 61 67 73 29  >pSelect, flags)
8970: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
8980: 70 4f 6e 20 3d 20 73 71 6c 69 74 65 33 45 78 70  pOn = sqlite3Exp
8990: 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65  rDup(db, pOldIte
89a0: 6d 2d 3e 70 4f 6e 2c 20 66 6c 61 67 73 29 3b 0a  m->pOn, flags);.
89b0: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 55      pNewItem->pU
89c0: 73 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 49 64  sing = sqlite3Id
89d0: 4c 69 73 74 44 75 70 28 64 62 2c 20 70 4f 6c 64  ListDup(db, pOld
89e0: 49 74 65 6d 2d 3e 70 55 73 69 6e 67 29 3b 0a 20  Item->pUsing);. 
89f0: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 63 6f 6c     pNewItem->col
8a00: 55 73 65 64 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  Used = pOldItem-
8a10: 3e 63 6f 6c 55 73 65 64 3b 0a 20 20 7d 0a 20 20  >colUsed;.  }.  
8a20: 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 49  return pNew;.}.I
8a30: 64 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 49 64  dList *sqlite3Id
8a40: 4c 69 73 74 44 75 70 28 73 71 6c 69 74 65 33 20  ListDup(sqlite3 
8a50: 2a 64 62 2c 20 49 64 4c 69 73 74 20 2a 70 29 7b  *db, IdList *p){
8a60: 0a 20 20 49 64 4c 69 73 74 20 2a 70 4e 65 77 3b  .  IdList *pNew;
8a70: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
8a80: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  p==0 ) return 0;
8a90: 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  .  pNew = sqlite
8aa0: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c  3DbMallocRaw(db,
8ab0: 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29   sizeof(*pNew) )
8ac0: 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20  ;.  if( pNew==0 
8ad0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e  ) return 0;.  pN
8ae0: 65 77 2d 3e 6e 49 64 20 3d 20 70 2d 3e 6e 49 64  ew->nId = p->nId
8af0: 3b 0a 20 20 70 4e 65 77 2d 3e 61 20 3d 20 73 71  ;.  pNew->a = sq
8b00: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
8b10: 28 64 62 2c 20 70 2d 3e 6e 49 64 2a 73 69 7a 65  (db, p->nId*size
8b20: 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20  of(p->a[0]) );. 
8b30: 20 69 66 28 20 70 4e 65 77 2d 3e 61 3d 3d 30 20   if( pNew->a==0 
8b40: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  ){.    sqlite3Db
8b50: 46 72 65 65 28 64 62 2c 20 70 4e 65 77 29 3b 0a  Free(db, pNew);.
8b60: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
8b70: 7d 0a 20 20 2f 2a 20 4e 6f 74 65 20 74 68 61 74  }.  /* Note that
8b80: 20 62 65 63 61 75 73 65 20 74 68 65 20 73 69 7a   because the siz
8b90: 65 20 6f 66 20 74 68 65 20 61 6c 6c 6f 63 61 74  e of the allocat
8ba0: 69 6f 6e 20 66 6f 72 20 70 2d 3e 61 5b 5d 20 69  ion for p->a[] i
8bb0: 73 20 6e 6f 74 0a 20 20 2a 2a 20 6e 65 63 65 73  s not.  ** neces
8bc0: 73 61 72 69 6c 79 20 61 20 70 6f 77 65 72 20 6f  sarily a power o
8bd0: 66 20 74 77 6f 2c 20 73 71 6c 69 74 65 33 49 64  f two, sqlite3Id
8be0: 4c 69 73 74 41 70 70 65 6e 64 28 29 20 6d 61 79  ListAppend() may
8bf0: 20 6e 6f 74 20 62 65 20 63 61 6c 6c 65 64 0a 20   not be called. 
8c00: 20 2a 2a 20 6f 6e 20 74 68 65 20 64 75 70 6c 69   ** on the dupli
8c10: 63 61 74 65 20 63 72 65 61 74 65 64 20 62 79 20  cate created by 
8c20: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 2a  this function. *
8c30: 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  /.  for(i=0; i<p
8c40: 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nId; i++){.   
8c50: 20 73 74 72 75 63 74 20 49 64 4c 69 73 74 5f 69   struct IdList_i
8c60: 74 65 6d 20 2a 70 4e 65 77 49 74 65 6d 20 3d 20  tem *pNewItem = 
8c70: 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b 0a 20 20 20  &pNew->a[i];.   
8c80: 20 73 74 72 75 63 74 20 49 64 4c 69 73 74 5f 69   struct IdList_i
8c90: 74 65 6d 20 2a 70 4f 6c 64 49 74 65 6d 20 3d 20  tem *pOldItem = 
8ca0: 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 70 4e  &p->a[i];.    pN
8cb0: 65 77 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20  ewItem->zName = 
8cc0: 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
8cd0: 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e  db, pOldItem->zN
8ce0: 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77 49 74  ame);.    pNewIt
8cf0: 65 6d 2d 3e 69 64 78 20 3d 20 70 4f 6c 64 49 74  em->idx = pOldIt
8d00: 65 6d 2d 3e 69 64 78 3b 0a 20 20 7d 0a 20 20 72  em->idx;.  }.  r
8d10: 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 53 65  eturn pNew;.}.Se
8d20: 6c 65 63 74 20 2a 73 71 6c 69 74 65 33 53 65 6c  lect *sqlite3Sel
8d30: 65 63 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a  ectDup(sqlite3 *
8d40: 64 62 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69  db, Select *p, i
8d50: 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 53 65 6c  nt flags){.  Sel
8d60: 65 63 74 20 2a 70 4e 65 77 2c 20 2a 70 50 72 69  ect *pNew, *pPri
8d70: 6f 72 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29  or;.  if( p==0 )
8d80: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65   return 0;.  pNe
8d90: 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  w = sqlite3DbMal
8da0: 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f  locRaw(db, sizeo
8db0: 66 28 2a 70 29 20 29 3b 0a 20 20 69 66 28 20 70  f(*p) );.  if( p
8dc0: 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  New==0 ) return 
8dd0: 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 45 4c 69 73  0;.  pNew->pELis
8de0: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  t = sqlite3ExprL
8df0: 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 45  istDup(db, p->pE
8e00: 4c 69 73 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20  List, flags);.  
8e10: 70 4e 65 77 2d 3e 70 53 72 63 20 3d 20 73 71 6c  pNew->pSrc = sql
8e20: 69 74 65 33 53 72 63 4c 69 73 74 44 75 70 28 64  ite3SrcListDup(d
8e30: 62 2c 20 70 2d 3e 70 53 72 63 2c 20 66 6c 61 67  b, p->pSrc, flag
8e40: 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 57 68 65  s);.  pNew->pWhe
8e50: 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  re = sqlite3Expr
8e60: 44 75 70 28 64 62 2c 20 70 2d 3e 70 57 68 65 72  Dup(db, p->pWher
8e70: 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65  e, flags);.  pNe
8e80: 77 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71  w->pGroupBy = sq
8e90: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
8ea0: 28 64 62 2c 20 70 2d 3e 70 47 72 6f 75 70 42 79  (db, p->pGroupBy
8eb0: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77  , flags);.  pNew
8ec0: 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 71 6c 69  ->pHaving = sqli
8ed0: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
8ee0: 2d 3e 70 48 61 76 69 6e 67 2c 20 66 6c 61 67 73  ->pHaving, flags
8ef0: 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65  );.  pNew->pOrde
8f00: 72 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70  rBy = sqlite3Exp
8f10: 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e  rListDup(db, p->
8f20: 70 4f 72 64 65 72 42 79 2c 20 66 6c 61 67 73 29  pOrderBy, flags)
8f30: 3b 0a 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 70  ;.  pNew->op = p
8f40: 2d 3e 6f 70 3b 0a 20 20 70 4e 65 77 2d 3e 70 50  ->op;.  pNew->pP
8f50: 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 20 3d 20  rior = pPrior = 
8f60: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70  sqlite3SelectDup
8f70: 28 64 62 2c 20 70 2d 3e 70 50 72 69 6f 72 2c 20  (db, p->pPrior, 
8f80: 66 6c 61 67 73 29 3b 0a 20 20 69 66 28 20 70 50  flags);.  if( pP
8f90: 72 69 6f 72 20 29 20 70 50 72 69 6f 72 2d 3e 70  rior ) pPrior->p
8fa0: 4e 65 78 74 20 3d 20 70 4e 65 77 3b 0a 20 20 70  Next = pNew;.  p
8fb0: 4e 65 77 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a  New->pNext = 0;.
8fc0: 20 20 70 4e 65 77 2d 3e 70 4c 69 6d 69 74 20 3d    pNew->pLimit =
8fd0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
8fe0: 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 2c 20 66  db, p->pLimit, f
8ff0: 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 70  lags);.  pNew->p
9000: 4f 66 66 73 65 74 20 3d 20 73 71 6c 69 74 65 33  Offset = sqlite3
9010: 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70  ExprDup(db, p->p
9020: 4f 66 66 73 65 74 2c 20 66 6c 61 67 73 29 3b 0a  Offset, flags);.
9030: 20 20 70 4e 65 77 2d 3e 69 4c 69 6d 69 74 20 3d    pNew->iLimit =
9040: 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 69 4f 66 66   0;.  pNew->iOff
9050: 73 65 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d  set = 0;.  pNew-
9060: 3e 73 65 6c 46 6c 61 67 73 20 3d 20 70 2d 3e 73  >selFlags = p->s
9070: 65 6c 46 6c 61 67 73 20 26 20 7e 53 46 5f 55 73  elFlags & ~SF_Us
9080: 65 73 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20 70  esEphemeral;.  p
9090: 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68  New->addrOpenEph
90a0: 6d 5b 30 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e 65  m[0] = -1;.  pNe
90b0: 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  w->addrOpenEphm[
90c0: 31 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d  1] = -1;.  pNew-
90d0: 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 70 2d  >nSelectRow = p-
90e0: 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 70  >nSelectRow;.  p
90f0: 4e 65 77 2d 3e 70 57 69 74 68 20 3d 20 77 69 74  New->pWith = wit
9100: 68 44 75 70 28 64 62 2c 20 70 2d 3e 70 57 69 74  hDup(db, p->pWit
9110: 68 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c  h);.  sqlite3Sel
9120: 65 63 74 53 65 74 4e 61 6d 65 28 70 4e 65 77 2c  ectSetName(pNew,
9130: 20 70 2d 3e 7a 53 65 6c 4e 61 6d 65 29 3b 0a 20   p->zSelName);. 
9140: 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a   return pNew;.}.
9150: 23 65 6c 73 65 0a 53 65 6c 65 63 74 20 2a 73 71  #else.Select *sq
9160: 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 73  lite3SelectDup(s
9170: 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 65 6c 65  qlite3 *db, Sele
9180: 63 74 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73  ct *p, int flags
9190: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 3d 3d  ){.  assert( p==
91a0: 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b  0 );.  return 0;
91b0: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  .}.#endif.../*.*
91c0: 2a 20 41 64 64 20 61 20 6e 65 77 20 65 6c 65 6d  * Add a new elem
91d0: 65 6e 74 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  ent to the end o
91e0: 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  f an expression 
91f0: 6c 69 73 74 2e 20 20 49 66 20 70 4c 69 73 74 20  list.  If pList 
9200: 69 73 0a 2a 2a 20 69 6e 69 74 69 61 6c 6c 79 20  is.** initially 
9210: 4e 55 4c 4c 2c 20 74 68 65 6e 20 63 72 65 61 74  NULL, then creat
9220: 65 20 61 20 6e 65 77 20 65 78 70 72 65 73 73 69  e a new expressi
9230: 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49  on list..**.** I
9240: 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  f a memory alloc
9250: 61 74 69 6f 6e 20 65 72 72 6f 72 20 6f 63 63 75  ation error occu
9260: 72 73 2c 20 74 68 65 20 65 6e 74 69 72 65 20 6c  rs, the entire l
9270: 69 73 74 20 69 73 20 66 72 65 65 64 20 61 6e 64  ist is freed and
9280: 0a 2a 2a 20 4e 55 4c 4c 20 69 73 20 72 65 74 75  .** NULL is retu
9290: 72 6e 65 64 2e 20 20 49 66 20 6e 6f 6e 2d 4e 55  rned.  If non-NU
92a0: 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20  LL is returned, 
92b0: 74 68 65 6e 20 69 74 20 69 73 20 67 75 61 72 61  then it is guara
92c0: 6e 74 65 65 64 0a 2a 2a 20 74 68 61 74 20 74 68  nteed.** that th
92d0: 65 20 6e 65 77 20 65 6e 74 72 79 20 77 61 73 20  e new entry was 
92e0: 73 75 63 63 65 73 73 66 75 6c 6c 79 20 61 70 70  successfully app
92f0: 65 6e 64 65 64 2e 0a 2a 2f 0a 45 78 70 72 4c 69  ended..*/.ExprLi
9300: 73 74 20 2a 73 71 6c 69 74 65 33 45 78 70 72 4c  st *sqlite3ExprL
9310: 69 73 74 41 70 70 65 6e 64 28 0a 20 20 50 61 72  istAppend(.  Par
9320: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
9330: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
9340: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
9350: 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20  rList *pList,   
9360: 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20       /* List to 
9370: 77 68 69 63 68 20 74 6f 20 61 70 70 65 6e 64 2e  which to append.
9380: 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a   Might be NULL *
9390: 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 20  /.  Expr *pExpr 
93a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
93b0: 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 62 65 20  xpression to be 
93c0: 61 70 70 65 6e 64 65 64 2e 20 4d 69 67 68 74 20  appended. Might 
93d0: 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20  be NULL */.){.  
93e0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
93f0: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20  arse->db;.  if( 
9400: 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pList==0 ){.    
9410: 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 44  pList = sqlite3D
9420: 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
9430: 73 69 7a 65 6f 66 28 45 78 70 72 4c 69 73 74 29  sizeof(ExprList)
9440: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73   );.    if( pLis
9450: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f  t==0 ){.      go
9460: 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 7d  to no_mem;.    }
9470: 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 20 3d 20  .    pList->a = 
9480: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
9490: 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 70 4c  aw(db, sizeof(pL
94a0: 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 20  ist->a[0]));.   
94b0: 20 69 66 28 20 70 4c 69 73 74 2d 3e 61 3d 3d 30   if( pList->a==0
94c0: 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a   ) goto no_mem;.
94d0: 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 4c 69    }else if( (pLi
94e0: 73 74 2d 3e 6e 45 78 70 72 20 26 20 28 70 4c 69  st->nExpr & (pLi
94f0: 73 74 2d 3e 6e 45 78 70 72 2d 31 29 29 3d 3d 30  st->nExpr-1))==0
9500: 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45   ){.    struct E
9510: 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 3b  xprList_item *a;
9520: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69  .    assert( pLi
9530: 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20  st->nExpr>0 );. 
9540: 20 20 20 61 20 3d 20 73 71 6c 69 74 65 33 44 62     a = sqlite3Db
9550: 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70 4c 69 73  Realloc(db, pLis
9560: 74 2d 3e 61 2c 20 70 4c 69 73 74 2d 3e 6e 45 78  t->a, pList->nEx
9570: 70 72 2a 32 2a 73 69 7a 65 6f 66 28 70 4c 69 73  pr*2*sizeof(pLis
9580: 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 20 20 69  t->a[0]));.    i
9590: 66 28 20 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( a==0 ){.     
95a0: 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20   goto no_mem;.  
95b0: 20 20 7d 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61    }.    pList->a
95c0: 20 3d 20 61 3b 0a 20 20 7d 0a 20 20 61 73 73 65   = a;.  }.  asse
95d0: 72 74 28 20 70 4c 69 73 74 2d 3e 61 21 3d 30 20  rt( pList->a!=0 
95e0: 29 3b 0a 20 20 69 66 28 20 31 20 29 7b 0a 20 20  );.  if( 1 ){.  
95f0: 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
9600: 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20  t_item *pItem = 
9610: 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d  &pList->a[pList-
9620: 3e 6e 45 78 70 72 2b 2b 5d 3b 0a 20 20 20 20 6d  >nExpr++];.    m
9630: 65 6d 73 65 74 28 70 49 74 65 6d 2c 20 30 2c 20  emset(pItem, 0, 
9640: 73 69 7a 65 6f 66 28 2a 70 49 74 65 6d 29 29 3b  sizeof(*pItem));
9650: 0a 20 20 20 20 70 49 74 65 6d 2d 3e 70 45 78 70  .    pItem->pExp
9660: 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 7d 0a 20  r = pExpr;.  }. 
9670: 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 0a   return pList;..
9680: 6e 6f 5f 6d 65 6d 3a 20 20 20 20 20 0a 20 20 2f  no_mem:     .  /
9690: 2a 20 41 76 6f 69 64 20 6c 65 61 6b 69 6e 67 20  * Avoid leaking 
96a0: 6d 65 6d 6f 72 79 20 69 66 20 6d 61 6c 6c 6f 63  memory if malloc
96b0: 20 68 61 73 20 66 61 69 6c 65 64 2e 20 2a 2f 0a   has failed. */.
96c0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
96d0: 65 74 65 28 64 62 2c 20 70 45 78 70 72 29 3b 0a  ete(db, pExpr);.
96e0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
96f0: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69 73  tDelete(db, pLis
9700: 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a  t);.  return 0;.
9710: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
9720: 20 73 6f 72 74 20 6f 72 64 65 72 20 66 6f 72 20   sort order for 
9730: 74 68 65 20 6c 61 73 74 20 65 6c 65 6d 65 6e 74  the last element
9740: 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 45 78   on the given Ex
9750: 70 72 4c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20  prList..*/.void 
9760: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 53  sqlite3ExprListS
9770: 65 74 53 6f 72 74 4f 72 64 65 72 28 45 78 70 72  etSortOrder(Expr
9780: 4c 69 73 74 20 2a 70 2c 20 69 6e 74 20 69 53 6f  List *p, int iSo
9790: 72 74 4f 72 64 65 72 29 7b 0a 20 20 69 66 28 20  rtOrder){.  if( 
97a0: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  p==0 ) return;. 
97b0: 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f   assert( SQLITE_
97c0: 53 4f 5f 55 4e 44 45 46 49 4e 45 44 3c 30 20 26  SO_UNDEFINED<0 &
97d0: 26 20 53 51 4c 49 54 45 5f 53 4f 5f 41 53 43 3e  & SQLITE_SO_ASC>
97e0: 3d 30 20 26 26 20 53 51 4c 49 54 45 5f 53 4f 5f  =0 && SQLITE_SO_
97f0: 44 45 53 43 3e 30 20 29 3b 0a 20 20 61 73 73 65  DESC>0 );.  asse
9800: 72 74 28 20 70 2d 3e 6e 45 78 70 72 3e 30 20 29  rt( p->nExpr>0 )
9810: 3b 0a 20 20 69 66 28 20 69 53 6f 72 74 4f 72 64  ;.  if( iSortOrd
9820: 65 72 3c 30 20 29 7b 0a 20 20 20 20 61 73 73 65  er<0 ){.    asse
9830: 72 74 28 20 70 2d 3e 61 5b 70 2d 3e 6e 45 78 70  rt( p->a[p->nExp
9840: 72 2d 31 5d 2e 73 6f 72 74 4f 72 64 65 72 3d 3d  r-1].sortOrder==
9850: 53 51 4c 49 54 45 5f 53 4f 5f 41 53 43 20 29 3b  SQLITE_SO_ASC );
9860: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
9870: 0a 20 20 70 2d 3e 61 5b 70 2d 3e 6e 45 78 70 72  .  p->a[p->nExpr
9880: 2d 31 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3d 20  -1].sortOrder = 
9890: 28 75 38 29 69 53 6f 72 74 4f 72 64 65 72 3b 0a  (u8)iSortOrder;.
98a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
98b0: 20 45 78 70 72 4c 69 73 74 2e 61 5b 5d 2e 7a 4e   ExprList.a[].zN
98c0: 61 6d 65 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74  ame element of t
98d0: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
98e0: 20 61 64 64 65 64 20 69 74 65 6d 0a 2a 2a 20 6f   added item.** o
98f0: 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  n the expression
9900: 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69   list..**.** pLi
9910: 73 74 20 6d 69 67 68 74 20 62 65 20 4e 55 4c 4c  st might be NULL
9920: 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 6e 20 4f 4f   following an OO
9930: 4d 20 65 72 72 6f 72 2e 20 20 42 75 74 20 70 4e  M error.  But pN
9940: 61 6d 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72  ame should never
9950: 20 62 65 0a 2a 2a 20 4e 55 4c 4c 2e 20 20 49 66   be.** NULL.  If
9960: 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61   a memory alloca
9970: 74 69 6f 6e 20 66 61 69 6c 73 2c 20 74 68 65 20  tion fails, the 
9980: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
9990: 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 0a 2a 2a  ocFailed flag.**
99a0: 20 69 73 20 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64   is set..*/.void
99b0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
99c0: 53 65 74 4e 61 6d 65 28 0a 20 20 50 61 72 73 65  SetName(.  Parse
99d0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
99e0: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
99f0: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c  ntext */.  ExprL
9a00: 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20  ist *pList,     
9a10: 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 77 68     /* List to wh
9a20: 69 63 68 20 74 6f 20 61 64 64 20 74 68 65 20 73  ich to add the s
9a30: 70 61 6e 2e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  pan. */.  Token 
9a40: 2a 70 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 20  *pName,         
9a50: 20 20 2f 2a 20 4e 61 6d 65 20 74 6f 20 62 65 20    /* Name to be 
9a60: 61 64 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 64  added */.  int d
9a70: 65 71 75 6f 74 65 20 20 20 20 20 20 20 20 20 20  equote          
9a80: 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 63 61     /* True to ca
9a90: 75 73 65 20 74 68 65 20 6e 61 6d 65 20 74 6f 20  use the name to 
9aa0: 62 65 20 64 65 71 75 6f 74 65 64 20 2a 2f 0a 29  be dequoted */.)
9ab0: 7b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73  {.  assert( pLis
9ac0: 74 21 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e  t!=0 || pParse->
9ad0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
9ae0: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 4c 69  !=0 );.  if( pLi
9af0: 73 74 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74  st ){.    struct
9b00: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
9b10: 70 49 74 65 6d 3b 0a 20 20 20 20 61 73 73 65 72  pItem;.    asser
9b20: 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3e  t( pList->nExpr>
9b30: 30 20 29 3b 0a 20 20 20 20 70 49 74 65 6d 20 3d  0 );.    pItem =
9b40: 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74   &pList->a[pList
9b50: 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20 20 20 20  ->nExpr-1];.    
9b60: 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 7a  assert( pItem->z
9b70: 4e 61 6d 65 3d 3d 30 20 29 3b 0a 20 20 20 20 70  Name==0 );.    p
9b80: 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71  Item->zName = sq
9b90: 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70 28 70  lite3DbStrNDup(p
9ba0: 50 61 72 73 65 2d 3e 64 62 2c 20 70 4e 61 6d 65  Parse->db, pName
9bb0: 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a  ->z, pName->n);.
9bc0: 20 20 20 20 69 66 28 20 64 65 71 75 6f 74 65 20      if( dequote 
9bd0: 26 26 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20  && pItem->zName 
9be0: 29 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65  ) sqlite3Dequote
9bf0: 28 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a  (pItem->zName);.
9c00: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74    }.}../*.** Set
9c10: 20 74 68 65 20 45 78 70 72 4c 69 73 74 2e 61 5b   the ExprList.a[
9c20: 5d 2e 7a 53 70 61 6e 20 65 6c 65 6d 65 6e 74 20  ].zSpan element 
9c30: 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  of the most rece
9c40: 6e 74 6c 79 20 61 64 64 65 64 20 69 74 65 6d 0a  ntly added item.
9c50: 2a 2a 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73  ** on the expres
9c60: 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a  sion list..**.**
9c70: 20 70 4c 69 73 74 20 6d 69 67 68 74 20 62 65 20   pList might be 
9c80: 4e 55 4c 4c 20 66 6f 6c 6c 6f 77 69 6e 67 20 61  NULL following a
9c90: 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e 20 20 42 75  n OOM error.  Bu
9ca0: 74 20 70 53 70 61 6e 20 73 68 6f 75 6c 64 20 6e  t pSpan should n
9cb0: 65 76 65 72 20 62 65 0a 2a 2a 20 4e 55 4c 4c 2e  ever be.** NULL.
9cc0: 20 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c    If a memory al
9cd0: 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c 20  location fails, 
9ce0: 74 68 65 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  the pParse->db->
9cf0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61  mallocFailed fla
9d00: 67 0a 2a 2a 20 69 73 20 73 65 74 2e 0a 2a 2f 0a  g.** is set..*/.
9d10: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
9d20: 4c 69 73 74 53 65 74 53 70 61 6e 28 0a 20 20 50  ListSetSpan(.  P
9d30: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
9d40: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
9d50: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
9d60: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
9d70: 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74         /* List t
9d80: 6f 20 77 68 69 63 68 20 74 6f 20 61 64 64 20 74  o which to add t
9d90: 68 65 20 73 70 61 6e 2e 20 2a 2f 0a 20 20 45 78  he span. */.  Ex
9da0: 70 72 53 70 61 6e 20 2a 70 53 70 61 6e 20 20 20  prSpan *pSpan   
9db0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 70 61        /* The spa
9dc0: 6e 20 74 6f 20 62 65 20 61 64 64 65 64 20 2a 2f  n to be added */
9dd0: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
9de0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
9df0: 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 21    assert( pList!
9e00: 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  =0 || db->malloc
9e10: 46 61 69 6c 65 64 21 3d 30 20 29 3b 0a 20 20 69  Failed!=0 );.  i
9e20: 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  f( pList ){.    
9e30: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
9e40: 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70  item *pItem = &p
9e50: 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e  List->a[pList->n
9e60: 45 78 70 72 2d 31 5d 3b 0a 20 20 20 20 61 73 73  Expr-1];.    ass
9e70: 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70  ert( pList->nExp
9e80: 72 3e 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  r>0 );.    asser
9e90: 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  t( db->mallocFai
9ea0: 6c 65 64 20 7c 7c 20 70 49 74 65 6d 2d 3e 70 45  led || pItem->pE
9eb0: 78 70 72 3d 3d 70 53 70 61 6e 2d 3e 70 45 78 70  xpr==pSpan->pExp
9ec0: 72 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  r );.    sqlite3
9ed0: 44 62 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d  DbFree(db, pItem
9ee0: 2d 3e 7a 53 70 61 6e 29 3b 0a 20 20 20 20 70 49  ->zSpan);.    pI
9ef0: 74 65 6d 2d 3e 7a 53 70 61 6e 20 3d 20 73 71 6c  tem->zSpan = sql
9f00: 69 74 65 33 44 62 53 74 72 4e 44 75 70 28 64 62  ite3DbStrNDup(db
9f10: 2c 20 28 63 68 61 72 2a 29 70 53 70 61 6e 2d 3e  , (char*)pSpan->
9f20: 7a 53 74 61 72 74 2c 0a 20 20 20 20 20 20 20 20  zStart,.        
9f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9f40: 20 20 20 20 20 20 20 20 20 20 20 20 28 69 6e 74              (int
9f50: 29 28 70 53 70 61 6e 2d 3e 7a 45 6e 64 20 2d 20  )(pSpan->zEnd - 
9f60: 70 53 70 61 6e 2d 3e 7a 53 74 61 72 74 29 29 3b  pSpan->zStart));
9f70: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  .  }.}../*.** If
9f80: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
9f90: 6c 69 73 74 20 70 45 4c 69 73 74 20 63 6f 6e 74  list pEList cont
9fa0: 61 69 6e 73 20 6d 6f 72 65 20 74 68 61 6e 20 69  ains more than i
9fb0: 4c 69 6d 69 74 20 65 6c 65 6d 65 6e 74 73 2c 0a  Limit elements,.
9fc0: 2a 2a 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f  ** leave an erro
9fd0: 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61  r message in pPa
9fe0: 72 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  rse..*/.void sql
9ff0: 69 74 65 33 45 78 70 72 4c 69 73 74 43 68 65 63  ite3ExprListChec
a000: 6b 4c 65 6e 67 74 68 28 0a 20 20 50 61 72 73 65  kLength(.  Parse
a010: 20 2a 70 50 61 72 73 65 2c 0a 20 20 45 78 70 72   *pParse,.  Expr
a020: 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 0a 20 20  List *pEList,.  
a030: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 62 6a  const char *zObj
a040: 65 63 74 0a 29 7b 0a 20 20 69 6e 74 20 6d 78 20  ect.){.  int mx 
a050: 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 4c  = pParse->db->aL
a060: 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
a070: 54 5f 43 4f 4c 55 4d 4e 5d 3b 0a 20 20 74 65 73  T_COLUMN];.  tes
a080: 74 63 61 73 65 28 20 70 45 4c 69 73 74 20 26 26  tcase( pEList &&
a090: 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d   pEList->nExpr==
a0a0: 6d 78 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  mx );.  testcase
a0b0: 28 20 70 45 4c 69 73 74 20 26 26 20 70 45 4c 69  ( pEList && pELi
a0c0: 73 74 2d 3e 6e 45 78 70 72 3d 3d 6d 78 2b 31 20  st->nExpr==mx+1 
a0d0: 29 3b 0a 20 20 69 66 28 20 70 45 4c 69 73 74 20  );.  if( pEList 
a0e0: 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  && pEList->nExpr
a0f0: 3e 6d 78 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  >mx ){.    sqlit
a100: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
a110: 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c  e, "too many col
a120: 75 6d 6e 73 20 69 6e 20 25 73 22 2c 20 7a 4f 62  umns in %s", zOb
a130: 6a 65 63 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ject);.  }.}../*
a140: 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e  .** Delete an en
a150: 74 69 72 65 20 65 78 70 72 65 73 73 69 6f 6e 20  tire expression 
a160: 6c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  list..*/.void sq
a170: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
a180: 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ete(sqlite3 *db,
a190: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
a1a0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74  ){.  int i;.  st
a1b0: 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
a1c0: 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 66 28  em *pItem;.  if(
a1d0: 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75   pList==0 ) retu
a1e0: 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c  rn;.  assert( pL
a1f0: 69 73 74 2d 3e 61 21 3d 30 20 7c 7c 20 70 4c 69  ist->a!=0 || pLi
a200: 73 74 2d 3e 6e 45 78 70 72 3d 3d 30 20 29 3b 0a  st->nExpr==0 );.
a210: 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73    for(pItem=pLis
a220: 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70 4c 69  t->a, i=0; i<pLi
a230: 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20  st->nExpr; i++, 
a240: 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 73 71  pItem++){.    sq
a250: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
a260: 64 62 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72  db, pItem->pExpr
a270: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
a280: 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e  Free(db, pItem->
a290: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69  zName);.    sqli
a2a0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49  te3DbFree(db, pI
a2b0: 74 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a 20 20 7d  tem->zSpan);.  }
a2c0: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
a2d0: 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61 29 3b 0a  (db, pList->a);.
a2e0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
a2f0: 64 62 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f  db, pList);.}../
a300: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
a310: 62 69 74 77 69 73 65 2d 4f 52 20 6f 66 20 61 6c  bitwise-OR of al
a320: 6c 20 45 78 70 72 2e 66 6c 61 67 73 20 66 69 65  l Expr.flags fie
a330: 6c 64 73 20 69 6e 20 74 68 65 20 67 69 76 65 6e  lds in the given
a340: 0a 2a 2a 20 45 78 70 72 4c 69 73 74 2e 0a 2a 2f  .** ExprList..*/
a350: 0a 75 33 32 20 73 71 6c 69 74 65 33 45 78 70 72  .u32 sqlite3Expr
a360: 4c 69 73 74 46 6c 61 67 73 28 63 6f 6e 73 74 20  ListFlags(const 
a370: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29  ExprList *pList)
a380: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75 33 32  {.  int i;.  u32
a390: 20 6d 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 4c   m = 0;.  if( pL
a3a0: 69 73 74 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  ist ){.    for(i
a3b0: 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  =0; i<pList->nEx
a3c0: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
a3d0: 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70   Expr *pExpr = p
a3e0: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
a3f0: 3b 0a 20 20 20 20 20 20 20 69 66 28 20 41 4c 57  ;.       if( ALW
a400: 41 59 53 28 70 45 78 70 72 29 20 29 20 6d 20 7c  AYS(pExpr) ) m |
a410: 3d 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 3b 0a  = pExpr->flags;.
a420: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
a430: 72 6e 20 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  rn m;.}../*.** T
a440: 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72  hese routines ar
a450: 65 20 57 61 6c 6b 65 72 20 63 61 6c 6c 62 61 63  e Walker callbac
a460: 6b 73 20 75 73 65 64 20 74 6f 20 63 68 65 63 6b  ks used to check
a470: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 6f 0a   expressions to.
a480: 2a 2a 20 73 65 65 20 69 66 20 74 68 65 79 20 61  ** see if they a
a490: 72 65 20 22 63 6f 6e 73 74 61 6e 74 22 20 66 6f  re "constant" fo
a4a0: 72 20 73 6f 6d 65 20 64 65 66 69 6e 69 74 69 6f  r some definitio
a4b0: 6e 20 6f 66 20 63 6f 6e 73 74 61 6e 74 2e 20 20  n of constant.  
a4c0: 54 68 65 0a 2a 2a 20 57 61 6c 6b 65 72 2e 65 43  The.** Walker.eC
a4d0: 6f 64 65 20 76 61 6c 75 65 20 64 65 74 65 72 6d  ode value determ
a4e0: 69 6e 65 73 20 74 68 65 20 74 79 70 65 20 6f 66  ines the type of
a4f0: 20 22 63 6f 6e 73 74 61 6e 74 22 20 77 65 20 61   "constant" we a
a500: 72 65 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20 66 6f  re looking.** fo
a510: 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 63  r..**.** These c
a520: 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 73  allback routines
a530: 20 61 72 65 20 75 73 65 64 20 74 6f 20 69 6d 70   are used to imp
a540: 6c 65 6d 65 6e 74 20 74 68 65 20 66 6f 6c 6c 6f  lement the follo
a550: 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  wing:.**.**     
a560: 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
a570: 73 74 61 6e 74 28 29 20 20 20 20 20 20 20 20 20  stant()         
a580: 20 20 20 20 20 20 20 20 20 70 57 61 6c 6b 65 72           pWalker
a590: 2d 3e 65 43 6f 64 65 3d 3d 31 0a 2a 2a 20 20 20  ->eCode==1.**   
a5a0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43    sqlite3ExprIsC
a5b0: 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 29  onstantNotJoin()
a5c0: 20 20 20 20 20 20 20 20 20 20 20 70 57 61 6c 6b             pWalk
a5d0: 65 72 2d 3e 65 43 6f 64 65 3d 3d 32 0a 2a 2a 20  er->eCode==2.** 
a5e0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
a5f0: 73 54 61 62 6c 65 43 6f 6e 73 74 61 6e 74 28 29  sTableConstant()
a600: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 57 61               pWa
a610: 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 33 0a 2a  lker->eCode==3.*
a620: 2a 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  *     sqlite3Exp
a630: 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75 6e  rIsConstantOrFun
a640: 63 74 69 6f 6e 28 29 20 20 20 20 20 20 20 20 70  ction()        p
a650: 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 34  Walker->eCode==4
a660: 20 6f 72 20 35 0a 2a 2a 0a 2a 2a 20 49 6e 20 61   or 5.**.** In a
a670: 6c 6c 20 63 61 73 65 73 2c 20 74 68 65 20 63 61  ll cases, the ca
a680: 6c 6c 62 61 63 6b 73 20 73 65 74 20 57 61 6c 6b  llbacks set Walk
a690: 65 72 2e 65 43 6f 64 65 3d 30 20 61 6e 64 20 61  er.eCode=0 and a
a6a0: 62 6f 72 74 20 69 66 20 74 68 65 20 65 78 70 72  bort if the expr
a6b0: 65 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 66 6f 75  ession.** is fou
a6c0: 6e 64 20 74 6f 20 6e 6f 74 20 62 65 20 61 20 63  nd to not be a c
a6d0: 6f 6e 73 74 61 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54  onstant..**.** T
a6e0: 68 65 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  he sqlite3ExprIs
a6f0: 43 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74 69  ConstantOrFuncti
a700: 6f 6e 28 29 20 69 73 20 75 73 65 64 20 66 6f 72  on() is used for
a710: 20 65 76 61 6c 75 61 74 69 6e 67 20 65 78 70 72   evaluating expr
a720: 65 73 73 69 6f 6e 73 0a 2a 2a 20 69 6e 20 61 20  essions.** in a 
a730: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
a740: 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 57 61 6c  tement.  The Wal
a750: 6b 65 72 2e 65 43 6f 64 65 20 76 61 6c 75 65 20  ker.eCode value 
a760: 69 73 20 35 20 77 68 65 6e 20 70 61 72 73 69 6e  is 5 when parsin
a770: 67 0a 2a 2a 20 61 6e 20 65 78 69 73 74 69 6e 67  g.** an existing
a780: 20 73 63 68 65 6d 61 20 61 6e 64 20 34 20 77 68   schema and 4 wh
a790: 65 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 61 20  en processing a 
a7a0: 6e 65 77 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  new statement.  
a7b0: 41 20 62 6f 75 6e 64 0a 2a 2a 20 70 61 72 61 6d  A bound.** param
a7c0: 65 74 65 72 20 72 61 69 73 65 73 20 61 6e 20 65  eter raises an e
a7d0: 72 72 6f 72 20 66 6f 72 20 6e 65 77 20 73 74 61  rror for new sta
a7e0: 74 65 6d 65 6e 74 73 2c 20 62 75 74 20 69 73 20  tements, but is 
a7f0: 73 69 6c 65 6e 74 6c 79 20 63 6f 6e 76 65 72 74  silently convert
a800: 65 64 0a 2a 2a 20 74 6f 20 4e 55 4c 4c 20 66 6f  ed.** to NULL fo
a810: 72 20 65 78 69 73 74 69 6e 67 20 73 63 68 65 6d  r existing schem
a820: 61 73 2e 20 20 54 68 69 73 20 61 6c 6c 6f 77 73  as.  This allows
a830: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
a840: 61 62 6c 65 73 20 74 68 61 74 20 0a 2a 2a 20 63  ables that .** c
a850: 6f 6e 74 61 69 6e 20 61 20 62 6f 75 6e 64 20 70  ontain a bound p
a860: 61 72 61 6d 65 74 65 72 20 62 65 63 61 75 73 65  arameter because
a870: 20 74 68 65 79 20 77 65 72 65 20 67 65 6e 65 72   they were gener
a880: 61 74 65 64 20 62 79 20 6f 6c 64 65 72 20 76 65  ated by older ve
a890: 72 73 69 6f 6e 73 0a 2a 2a 20 6f 66 20 53 51 4c  rsions.** of SQL
a8a0: 69 74 65 20 74 6f 20 62 65 20 70 61 72 73 65 64  ite to be parsed
a8b0: 20 62 79 20 6e 65 77 65 72 20 76 65 72 73 69 6f   by newer versio
a8c0: 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 77 69 74  ns of SQLite wit
a8d0: 68 6f 75 74 20 72 61 69 73 69 6e 67 20 61 0a 2a  hout raising a.*
a8e0: 2a 20 6d 61 6c 66 6f 72 6d 65 64 20 73 63 68 65  * malformed sche
a8f0: 6d 61 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61  ma error..*/.sta
a900: 74 69 63 20 69 6e 74 20 65 78 70 72 4e 6f 64 65  tic int exprNode
a910: 49 73 43 6f 6e 73 74 61 6e 74 28 57 61 6c 6b 65  IsConstant(Walke
a920: 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72  r *pWalker, Expr
a930: 20 2a 70 45 78 70 72 29 7b 0a 0a 20 20 2f 2a 20   *pExpr){..  /* 
a940: 49 66 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64  If pWalker->eCod
a950: 65 20 69 73 20 32 20 74 68 65 6e 20 61 6e 79 20  e is 2 then any 
a960: 74 65 72 6d 20 6f 66 20 74 68 65 20 65 78 70 72  term of the expr
a970: 65 73 73 69 6f 6e 20 74 68 61 74 20 63 6f 6d 65  ession that come
a980: 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 74 68 65 20  s from.  ** the 
a990: 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75  ON or USING clau
a9a0: 73 65 73 20 6f 66 20 61 20 6c 65 66 74 20 6a 6f  ses of a left jo
a9b0: 69 6e 20 64 69 73 71 75 61 6c 69 66 69 65 73 20  in disqualifies 
a9c0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 20  the expression. 
a9d0: 20 2a 2a 20 66 72 6f 6d 20 62 65 69 6e 67 20 63   ** from being c
a9e0: 6f 6e 73 69 64 65 72 65 64 20 63 6f 6e 73 74 61  onsidered consta
a9f0: 6e 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 57 61  nt. */.  if( pWa
aa00: 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 32 20 26  lker->eCode==2 &
aa10: 26 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  & ExprHasPropert
aa20: 79 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d  y(pExpr, EP_From
aa30: 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20 70 57 61  Join) ){.    pWa
aa40: 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20 30 3b  lker->eCode = 0;
aa50: 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f  .    return WRC_
aa60: 41 62 6f 72 74 3b 0a 20 20 7d 0a 0a 20 20 73 77  Abort;.  }..  sw
aa70: 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20  itch( pExpr->op 
aa80: 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 6e 73 69 64  ){.    /* Consid
aa90: 65 72 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20  er functions to 
aaa0: 62 65 20 63 6f 6e 73 74 61 6e 74 20 69 66 20 61  be constant if a
aab0: 6c 6c 20 74 68 65 69 72 20 61 72 67 75 6d 65 6e  ll their argumen
aac0: 74 73 20 61 72 65 20 63 6f 6e 73 74 61 6e 74 0a  ts are constant.
aad0: 20 20 20 20 2a 2a 20 61 6e 64 20 65 69 74 68 65      ** and eithe
aae0: 72 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65  r pWalker->eCode
aaf0: 3d 3d 34 20 6f 72 20 35 20 6f 72 20 74 68 65 20  ==4 or 5 or the 
ab00: 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 74 68 65  function has the
ab10: 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 46  .    ** SQLITE_F
ab20: 55 4e 43 5f 43 4f 4e 53 54 20 66 6c 61 67 2e 20  UNC_CONST flag. 
ab30: 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46  */.    case TK_F
ab40: 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 20 20 69  UNCTION:.      i
ab50: 66 28 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64  f( pWalker->eCod
ab60: 65 3e 3d 34 20 7c 7c 20 45 78 70 72 48 61 73 50  e>=4 || ExprHasP
ab70: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 45 50  roperty(pExpr,EP
ab80: 5f 43 6f 6e 73 74 46 75 6e 63 29 20 29 7b 0a 20  _ConstFunc) ){. 
ab90: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52         return WR
aba0: 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  C_Continue;.    
abb0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
abc0: 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20   pWalker->eCode 
abd0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74  = 0;.        ret
abe0: 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
abf0: 20 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20       }.    case 
ac00: 54 4b 5f 49 44 3a 0a 20 20 20 20 63 61 73 65 20  TK_ID:.    case 
ac10: 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63  TK_COLUMN:.    c
ac20: 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54  ase TK_AGG_FUNCT
ac30: 49 4f 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  ION:.    case TK
ac40: 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20  _AGG_COLUMN:.   
ac50: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
ac60: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 3b  pr->op==TK_ID );
ac70: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
ac80: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43   pExpr->op==TK_C
ac90: 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 74  OLUMN );.      t
aca0: 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
acb0: 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54  op==TK_AGG_FUNCT
acc0: 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ION );.      tes
acd0: 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
ace0: 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20  ==TK_AGG_COLUMN 
acf0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57 61  );.      if( pWa
ad00: 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 33 20 26  lker->eCode==3 &
ad10: 26 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d  & pExpr->iTable=
ad20: 3d 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 43 75 72  =pWalker->u.iCur
ad30: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
ad40: 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
ad50: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
ad60: 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65        pWalker->e
ad70: 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Code = 0;.      
ad80: 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f    return WRC_Abo
ad90: 72 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rt;.      }.    
ada0: 63 61 73 65 20 54 4b 5f 56 41 52 49 41 42 4c 45  case TK_VARIABLE
adb0: 3a 0a 20 20 20 20 20 20 69 66 28 20 70 57 61 6c  :.      if( pWal
adc0: 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 35 20 29 7b  ker->eCode==5 ){
add0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 69 6c 65  .        /* Sile
ade0: 6e 74 6c 79 20 63 6f 6e 76 65 72 74 20 62 6f 75  ntly convert bou
adf0: 6e 64 20 70 61 72 61 6d 65 74 65 72 73 20 74 68  nd parameters th
ae00: 61 74 20 61 70 70 65 61 72 20 69 6e 73 69 64 65  at appear inside
ae10: 20 6f 66 20 43 52 45 41 54 45 0a 20 20 20 20 20   of CREATE.     
ae20: 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73     ** statements
ae30: 20 69 6e 74 6f 20 61 20 4e 55 4c 4c 20 77 68 65   into a NULL whe
ae40: 6e 20 70 61 72 73 69 6e 67 20 74 68 65 20 43 52  n parsing the CR
ae50: 45 41 54 45 20 73 74 61 74 65 6d 65 6e 74 20 74  EATE statement t
ae60: 65 78 74 20 6f 75 74 0a 20 20 20 20 20 20 20 20  ext out.        
ae70: 2a 2a 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65  ** of the sqlite
ae80: 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 2a 2f  _master table */
ae90: 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e  .        pExpr->
aea0: 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20  op = TK_NULL;.  
aeb0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 57      }else if( pW
aec0: 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 34 20  alker->eCode==4 
aed0: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 20  ){.        /* A 
aee0: 62 6f 75 6e 64 20 70 61 72 61 6d 65 74 65 72 20  bound parameter 
aef0: 69 6e 20 61 20 43 52 45 41 54 45 20 73 74 61 74  in a CREATE stat
af00: 65 6d 65 6e 74 20 74 68 61 74 20 6f 72 69 67 69  ement that origi
af10: 6e 61 74 65 73 20 66 72 6f 6d 0a 20 20 20 20 20  nates from.     
af20: 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 70 72     ** sqlite3_pr
af30: 65 70 61 72 65 28 29 20 63 61 75 73 65 73 20 61  epare() causes a
af40: 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20  n error */.     
af50: 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64     pWalker->eCod
af60: 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72  e = 0;.        r
af70: 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
af80: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f  .      }.      /
af90: 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67 68 20 2a  * Fall through *
afa0: 2f 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20  /.    default:. 
afb0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
afc0: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c  Expr->op==TK_SEL
afd0: 45 43 54 20 29 3b 20 2f 2a 20 73 65 6c 65 63 74  ECT ); /* select
afe0: 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 20 77  NodeIsConstant w
aff0: 69 6c 6c 20 64 69 73 61 6c 6c 6f 77 20 2a 2f 0a  ill disallow */.
b000: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
b010: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58  pExpr->op==TK_EX
b020: 49 53 54 53 20 29 3b 20 2f 2a 20 73 65 6c 65 63  ISTS ); /* selec
b030: 74 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 20  tNodeIsConstant 
b040: 77 69 6c 6c 20 64 69 73 61 6c 6c 6f 77 20 2a 2f  will disallow */
b050: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52  .      return WR
b060: 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 7d 0a  C_Continue;.  }.
b070: 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 6c  }.static int sel
b080: 65 63 74 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e  ectNodeIsConstan
b090: 74 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65  t(Walker *pWalke
b0a0: 72 2c 20 53 65 6c 65 63 74 20 2a 4e 6f 74 55 73  r, Select *NotUs
b0b0: 65 64 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  ed){.  UNUSED_PA
b0c0: 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29  RAMETER(NotUsed)
b0d0: 3b 0a 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f  ;.  pWalker->eCo
b0e0: 64 65 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  de = 0;.  return
b0f0: 20 57 52 43 5f 41 62 6f 72 74 3b 0a 7d 0a 73 74   WRC_Abort;.}.st
b100: 61 74 69 63 20 69 6e 74 20 65 78 70 72 49 73 43  atic int exprIsC
b110: 6f 6e 73 74 28 45 78 70 72 20 2a 70 2c 20 69 6e  onst(Expr *p, in
b120: 74 20 69 6e 69 74 46 6c 61 67 2c 20 69 6e 74 20  t initFlag, int 
b130: 69 43 75 72 29 7b 0a 20 20 57 61 6c 6b 65 72 20  iCur){.  Walker 
b140: 77 3b 0a 20 20 6d 65 6d 73 65 74 28 26 77 2c 20  w;.  memset(&w, 
b150: 30 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20  0, sizeof(w));. 
b160: 20 77 2e 65 43 6f 64 65 20 3d 20 69 6e 69 74 46   w.eCode = initF
b170: 6c 61 67 3b 0a 20 20 77 2e 78 45 78 70 72 43 61  lag;.  w.xExprCa
b180: 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72 4e 6f 64  llback = exprNod
b190: 65 49 73 43 6f 6e 73 74 61 6e 74 3b 0a 20 20 77  eIsConstant;.  w
b1a0: 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  .xSelectCallback
b1b0: 20 3d 20 73 65 6c 65 63 74 4e 6f 64 65 49 73 43   = selectNodeIsC
b1c0: 6f 6e 73 74 61 6e 74 3b 0a 20 20 77 2e 75 2e 69  onstant;.  w.u.i
b1d0: 43 75 72 20 3d 20 69 43 75 72 3b 0a 20 20 73 71  Cur = iCur;.  sq
b1e0: 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77  lite3WalkExpr(&w
b1f0: 2c 20 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 77  , p);.  return w
b200: 2e 65 43 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  .eCode;.}../*.**
b210: 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73   Walk an express
b220: 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72  ion tree.  Retur
b230: 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68  n non-zero if th
b240: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
b250: 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 61 6e 64 20  constant.** and 
b260: 30 20 69 66 20 69 74 20 69 6e 76 6f 6c 76 65 73  0 if it involves
b270: 20 76 61 72 69 61 62 6c 65 73 20 6f 72 20 66 75   variables or fu
b280: 6e 63 74 69 6f 6e 20 63 61 6c 6c 73 2e 0a 2a 2a  nction calls..**
b290: 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70  .** For the purp
b2a0: 6f 73 65 73 20 6f 66 20 74 68 69 73 20 66 75 6e  oses of this fun
b2b0: 63 74 69 6f 6e 2c 20 61 20 64 6f 75 62 6c 65 2d  ction, a double-
b2c0: 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65  quoted string (e
b2d0: 78 3a 20 22 61 62 63 22 29 0a 2a 2a 20 69 73 20  x: "abc").** is 
b2e0: 63 6f 6e 73 69 64 65 72 65 64 20 61 20 76 61 72  considered a var
b2f0: 69 61 62 6c 65 20 62 75 74 20 61 20 73 69 6e 67  iable but a sing
b300: 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67  le-quoted string
b310: 20 28 65 78 3a 20 27 61 62 63 27 29 20 69 73 0a   (ex: 'abc') is.
b320: 2a 2a 20 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a  ** a constant..*
b330: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
b340: 72 49 73 43 6f 6e 73 74 61 6e 74 28 45 78 70 72  rIsConstant(Expr
b350: 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 65   *p){.  return e
b360: 78 70 72 49 73 43 6f 6e 73 74 28 70 2c 20 31 2c  xprIsConst(p, 1,
b370: 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61   0);.}../*.** Wa
b380: 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  lk an expression
b390: 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20 6e   tree.  Return n
b3a0: 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 65  on-zero if the e
b3b0: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e  xpression is con
b3c0: 73 74 61 6e 74 0a 2a 2a 20 74 68 61 74 20 64 6f  stant.** that do
b3d0: 65 73 20 6e 6f 20 6f 72 69 67 69 6e 61 74 65 20  es no originate 
b3e0: 66 72 6f 6d 20 74 68 65 20 4f 4e 20 6f 72 20 55  from the ON or U
b3f0: 53 49 4e 47 20 63 6c 61 75 73 65 73 20 6f 66 20  SING clauses of 
b400: 61 20 6a 6f 69 6e 2e 0a 2a 2a 20 52 65 74 75 72  a join..** Retur
b410: 6e 20 30 20 69 66 20 69 74 20 69 6e 76 6f 6c 76  n 0 if it involv
b420: 65 73 20 76 61 72 69 61 62 6c 65 73 20 6f 72 20  es variables or 
b430: 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 73 20 6f  function calls o
b440: 72 20 74 65 72 6d 73 20 66 72 6f 6d 0a 2a 2a 20  r terms from.** 
b450: 61 6e 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63  an ON or USING c
b460: 6c 61 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  lause..*/.int sq
b470: 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
b480: 61 6e 74 4e 6f 74 4a 6f 69 6e 28 45 78 70 72 20  antNotJoin(Expr 
b490: 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 65 78  *p){.  return ex
b4a0: 70 72 49 73 43 6f 6e 73 74 28 70 2c 20 32 2c 20  prIsConst(p, 2, 
b4b0: 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c  0);.}../*.** Wal
b4c0: 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  k an expression 
b4d0: 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20 6e 6f  tree.  Return no
b4e0: 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 65 78  n-zero if the ex
b4f0: 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73  pression is cons
b500: 74 61 6e 74 0a 2a 2a 20 66 6f 72 20 61 6e 79 20  tant.** for any 
b510: 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 74 68  single row of th
b520: 65 20 74 61 62 6c 65 20 77 69 74 68 20 63 75 72  e table with cur
b530: 73 6f 72 20 69 43 75 72 2e 20 20 49 6e 20 6f 74  sor iCur.  In ot
b540: 68 65 72 20 77 6f 72 64 73 2c 20 74 68 65 0a 2a  her words, the.*
b550: 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 75 73  * expression mus
b560: 74 20 6e 6f 74 20 72 65 66 65 72 20 74 6f 20 61  t not refer to a
b570: 6e 79 20 6e 6f 6e 2d 64 65 74 65 72 6d 69 6e 69  ny non-determini
b580: 73 74 69 63 20 66 75 6e 63 74 69 6f 6e 20 6e 6f  stic function no
b590: 72 20 61 6e 79 0a 2a 2a 20 74 61 62 6c 65 20 6f  r any.** table o
b5a0: 74 68 65 72 20 74 68 61 6e 20 69 43 75 72 2e 0a  ther than iCur..
b5b0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
b5c0: 70 72 49 73 54 61 62 6c 65 43 6f 6e 73 74 61 6e  prIsTableConstan
b5d0: 74 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 69  t(Expr *p, int i
b5e0: 43 75 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 65  Cur){.  return e
b5f0: 78 70 72 49 73 43 6f 6e 73 74 28 70 2c 20 33 2c  xprIsConst(p, 3,
b600: 20 69 43 75 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   iCur);.}../*.**
b610: 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73   Walk an express
b620: 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72  ion tree.  Retur
b630: 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68  n non-zero if th
b640: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
b650: 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 6f 72 20 61  constant.** or a
b660: 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 77   function call w
b670: 69 74 68 20 63 6f 6e 73 74 61 6e 74 20 61 72 67  ith constant arg
b680: 75 6d 65 6e 74 73 2e 20 20 52 65 74 75 72 6e 20  uments.  Return 
b690: 61 6e 64 20 30 20 69 66 20 74 68 65 72 65 0a 2a  and 0 if there.*
b6a0: 2a 20 61 72 65 20 61 6e 79 20 76 61 72 69 61 62  * are any variab
b6b0: 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74  les..**.** For t
b6c0: 68 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74  he purposes of t
b6d0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20  his function, a 
b6e0: 64 6f 75 62 6c 65 2d 71 75 6f 74 65 64 20 73 74  double-quoted st
b6f0: 72 69 6e 67 20 28 65 78 3a 20 22 61 62 63 22 29  ring (ex: "abc")
b700: 0a 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65 72 65  .** is considere
b710: 64 20 61 20 76 61 72 69 61 62 6c 65 20 62 75 74  d a variable but
b720: 20 61 20 73 69 6e 67 6c 65 2d 71 75 6f 74 65 64   a single-quoted
b730: 20 73 74 72 69 6e 67 20 28 65 78 3a 20 27 61 62   string (ex: 'ab
b740: 63 27 29 20 69 73 0a 2a 2a 20 61 20 63 6f 6e 73  c') is.** a cons
b750: 74 61 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tant..*/.int sql
b760: 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
b770: 6e 74 4f 72 46 75 6e 63 74 69 6f 6e 28 45 78 70  ntOrFunction(Exp
b780: 72 20 2a 70 2c 20 75 38 20 69 73 49 6e 69 74 29  r *p, u8 isInit)
b790: 7b 0a 20 20 61 73 73 65 72 74 28 20 69 73 49 6e  {.  assert( isIn
b7a0: 69 74 3d 3d 30 20 7c 7c 20 69 73 49 6e 69 74 3d  it==0 || isInit=
b7b0: 3d 31 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 65  =1 );.  return e
b7c0: 78 70 72 49 73 43 6f 6e 73 74 28 70 2c 20 34 2b  xprIsConst(p, 4+
b7d0: 69 73 49 6e 69 74 2c 20 30 29 3b 0a 7d 0a 0a 23  isInit, 0);.}..#
b7e0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
b7f0: 42 4c 45 5f 43 55 52 53 4f 52 5f 48 49 4e 54 53  BLE_CURSOR_HINTS
b800: 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65  ./*.** Walk an e
b810: 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20  xpression tree. 
b820: 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65   Return 1 if the
b830: 20 65 78 70 72 65 73 73 69 6f 6e 20 63 6f 6e 74   expression cont
b840: 61 69 6e 73 20 61 0a 2a 2a 20 73 75 62 71 75 65  ains a.** subque
b850: 72 79 20 6f 66 20 73 6f 6d 65 20 6b 69 6e 64 2e  ry of some kind.
b860: 20 20 52 65 74 75 72 6e 20 30 20 69 66 20 74 68    Return 0 if th
b870: 65 72 65 20 61 72 65 20 6e 6f 20 73 75 62 71 75  ere are no subqu
b880: 65 72 69 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  eries..*/.int sq
b890: 6c 69 74 65 33 45 78 70 72 43 6f 6e 74 61 69 6e  lite3ExprContain
b8a0: 73 53 75 62 71 75 65 72 79 28 45 78 70 72 20 2a  sSubquery(Expr *
b8b0: 70 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a  p){.  Walker w;.
b8c0: 20 20 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c 20    memset(&w, 0, 
b8d0: 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20 77 2e  sizeof(w));.  w.
b8e0: 65 43 6f 64 65 20 3d 20 31 3b 0a 20 20 77 2e 78  eCode = 1;.  w.x
b8f0: 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 73  ExprCallback = s
b900: 71 6c 69 74 65 33 45 78 70 72 57 61 6c 6b 4e 6f  qlite3ExprWalkNo
b910: 6f 70 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43  op;.  w.xSelectC
b920: 61 6c 6c 62 61 63 6b 20 3d 20 73 65 6c 65 63 74  allback = select
b930: 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 3b 0a  NodeIsConstant;.
b940: 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70    sqlite3WalkExp
b950: 72 28 26 77 2c 20 70 29 3b 0a 20 20 72 65 74 75  r(&w, p);.  retu
b960: 72 6e 20 77 2e 65 43 6f 64 65 3d 3d 30 3b 0a 7d  rn w.eCode==0;.}
b970: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49  .#endif../*.** I
b980: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
b990: 20 70 20 63 6f 64 65 73 20 61 20 63 6f 6e 73 74   p codes a const
b9a0: 61 6e 74 20 69 6e 74 65 67 65 72 20 74 68 61 74  ant integer that
b9b0: 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68   is small enough
b9c0: 0a 2a 2a 20 74 6f 20 66 69 74 20 69 6e 20 61 20  .** to fit in a 
b9d0: 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 2c 20  32-bit integer, 
b9e0: 72 65 74 75 72 6e 20 31 20 61 6e 64 20 70 75 74  return 1 and put
b9f0: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
ba00: 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20 69 6e 20  e integer.** in 
ba10: 2a 70 56 61 6c 75 65 2e 20 20 49 66 20 74 68 65  *pValue.  If the
ba20: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6e   expression is n
ba30: 6f 74 20 61 6e 20 69 6e 74 65 67 65 72 20 6f 72  ot an integer or
ba40: 20 69 66 20 69 74 20 69 73 20 74 6f 6f 20 62 69   if it is too bi
ba50: 67 0a 2a 2a 20 74 6f 20 66 69 74 20 69 6e 20 61  g.** to fit in a
ba60: 20 73 69 67 6e 65 64 20 33 32 2d 62 69 74 20 69   signed 32-bit i
ba70: 6e 74 65 67 65 72 2c 20 72 65 74 75 72 6e 20 30  nteger, return 0
ba80: 20 61 6e 64 20 6c 65 61 76 65 20 2a 70 56 61 6c   and leave *pVal
ba90: 75 65 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f  ue unchanged..*/
baa0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
bab0: 49 73 49 6e 74 65 67 65 72 28 45 78 70 72 20 2a  IsInteger(Expr *
bac0: 70 2c 20 69 6e 74 20 2a 70 56 61 6c 75 65 29 7b  p, int *pValue){
bad0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 0a  .  int rc = 0;..
bae0: 20 20 2f 2a 20 49 66 20 61 6e 20 65 78 70 72 65    /* If an expre
baf0: 73 73 69 6f 6e 20 69 73 20 61 6e 20 69 6e 74 65  ssion is an inte
bb00: 67 65 72 20 6c 69 74 65 72 61 6c 20 74 68 61 74  ger literal that
bb10: 20 66 69 74 73 20 69 6e 20 61 20 73 69 67 6e 65   fits in a signe
bb20: 64 20 33 32 2d 62 69 74 0a 20 20 2a 2a 20 69 6e  d 32-bit.  ** in
bb30: 74 65 67 65 72 2c 20 74 68 65 6e 20 74 68 65 20  teger, then the 
bb40: 45 50 5f 49 6e 74 56 61 6c 75 65 20 66 6c 61 67  EP_IntValue flag
bb50: 20 77 69 6c 6c 20 68 61 76 65 20 61 6c 72 65 61   will have alrea
bb60: 64 79 20 62 65 65 6e 20 73 65 74 20 2a 2f 0a 20  dy been set */. 
bb70: 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 21 3d   assert( p->op!=
bb80: 54 4b 5f 49 4e 54 45 47 45 52 20 7c 7c 20 28 70  TK_INTEGER || (p
bb90: 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e 74  ->flags & EP_Int
bba0: 56 61 6c 75 65 29 21 3d 30 0a 20 20 20 20 20 20  Value)!=0.      
bbb0: 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 47       || sqlite3G
bbc0: 65 74 49 6e 74 33 32 28 70 2d 3e 75 2e 7a 54 6f  etInt32(p->u.zTo
bbd0: 6b 65 6e 2c 20 26 72 63 29 3d 3d 30 20 29 3b 0a  ken, &rc)==0 );.
bbe0: 0a 20 20 69 66 28 20 70 2d 3e 66 6c 61 67 73 20  .  if( p->flags 
bbf0: 26 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 29 7b  & EP_IntValue ){
bc00: 0a 20 20 20 20 2a 70 56 61 6c 75 65 20 3d 20 70  .    *pValue = p
bc10: 2d 3e 75 2e 69 56 61 6c 75 65 3b 0a 20 20 20 20  ->u.iValue;.    
bc20: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
bc30: 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b  switch( p->op ){
bc40: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 50 4c  .    case TK_UPL
bc50: 55 53 3a 20 7b 0a 20 20 20 20 20 20 72 63 20 3d  US: {.      rc =
bc60: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e   sqlite3ExprIsIn
bc70: 74 65 67 65 72 28 70 2d 3e 70 4c 65 66 74 2c 20  teger(p->pLeft, 
bc80: 70 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 62  pValue);.      b
bc90: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
bca0: 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20  case TK_UMINUS: 
bcb0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 76 3b 0a 20  {.      int v;. 
bcc0: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
bcd0: 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 2d  ExprIsInteger(p-
bce0: 3e 70 4c 65 66 74 2c 20 26 76 29 20 29 7b 0a 20  >pLeft, &v) ){. 
bcf0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 76         assert( v
bd00: 21 3d 28 2d 32 31 34 37 34 38 33 36 34 37 2d 31  !=(-2147483647-1
bd10: 29 20 29 3b 0a 20 20 20 20 20 20 20 20 2a 70 56  ) );.        *pV
bd20: 61 6c 75 65 20 3d 20 2d 76 3b 0a 20 20 20 20 20  alue = -v;.     
bd30: 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20     rc = 1;.     
bd40: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
bd50: 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c      }.    defaul
bd60: 74 3a 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20  t: break;.  }.  
bd70: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
bd80: 0a 2a 2a 20 52 65 74 75 72 6e 20 46 41 4c 53 45  .** Return FALSE
bd90: 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   if there is no 
bda0: 63 68 61 6e 63 65 20 74 68 61 74 20 74 68 65 20  chance that the 
bdb0: 65 78 70 72 65 73 73 69 6f 6e 20 63 61 6e 20 62  expression can b
bdc0: 65 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66  e NULL..**.** If
bdd0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
bde0: 6d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 6f 72  might be NULL or
bdf0: 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
be00: 6f 6e 20 69 73 20 74 6f 6f 20 63 6f 6d 70 6c 65  on is too comple
be10: 78 0a 2a 2a 20 74 6f 20 74 65 6c 6c 20 72 65 74  x.** to tell ret
be20: 75 72 6e 20 54 52 55 45 2e 20 20 0a 2a 2a 0a 2a  urn TRUE.  .**.*
be30: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
be40: 73 20 75 73 65 64 20 61 73 20 61 6e 20 6f 70 74  s used as an opt
be50: 69 6d 69 7a 61 74 69 6f 6e 2c 20 74 6f 20 73 6b  imization, to sk
be60: 69 70 20 4f 50 5f 49 73 4e 75 6c 6c 20 6f 70 63  ip OP_IsNull opc
be70: 6f 64 65 73 0a 2a 2a 20 77 68 65 6e 20 77 65 20  odes.** when we 
be80: 6b 6e 6f 77 20 74 68 61 74 20 61 20 76 61 6c 75  know that a valu
be90: 65 20 63 61 6e 6e 6f 74 20 62 65 20 4e 55 4c 4c  e cannot be NULL
bea0: 2e 20 20 48 65 6e 63 65 2c 20 61 20 66 61 6c 73  .  Hence, a fals
beb0: 65 20 70 6f 73 69 74 69 76 65 0a 2a 2a 20 28 72  e positive.** (r
bec0: 65 74 75 72 6e 69 6e 67 20 54 52 55 45 20 77 68  eturning TRUE wh
bed0: 65 6e 20 69 6e 20 66 61 63 74 20 74 68 65 20 65  en in fact the e
bee0: 78 70 72 65 73 73 69 6f 6e 20 63 61 6e 20 6e 65  xpression can ne
bef0: 76 65 72 20 62 65 20 4e 55 4c 4c 29 20 6d 69 67  ver be NULL) mig
bf00: 68 74 0a 2a 2a 20 62 65 20 61 20 73 6d 61 6c 6c  ht.** be a small
bf10: 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 68 69 74   performance hit
bf20: 20 62 75 74 20 69 73 20 6f 74 68 65 72 77 69 73   but is otherwis
bf30: 65 20 68 61 72 6d 6c 65 73 73 2e 20 20 4f 6e 20  e harmless.  On 
bf40: 74 68 65 20 6f 74 68 65 72 0a 2a 2a 20 68 61 6e  the other.** han
bf50: 64 2c 20 61 20 66 61 6c 73 65 20 6e 65 67 61 74  d, a false negat
bf60: 69 76 65 20 28 72 65 74 75 72 6e 69 6e 67 20 46  ive (returning F
bf70: 41 4c 53 45 20 77 68 65 6e 20 74 68 65 20 72 65  ALSE when the re
bf80: 73 75 6c 74 20 63 6f 75 6c 64 20 62 65 20 4e 55  sult could be NU
bf90: 4c 4c 29 0a 2a 2a 20 77 69 6c 6c 20 6c 69 6b 65  LL).** will like
bfa0: 6c 79 20 72 65 73 75 6c 74 20 69 6e 20 61 6e 20  ly result in an 
bfb0: 69 6e 63 6f 72 72 65 63 74 20 61 6e 73 77 65 72  incorrect answer
bfc0: 2e 20 20 53 6f 20 77 68 65 6e 20 69 6e 20 64 6f  .  So when in do
bfd0: 75 62 74 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 54  ubt, return.** T
bfe0: 52 55 45 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  RUE..*/.int sqli
bff0: 74 65 33 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c  te3ExprCanBeNull
c000: 28 63 6f 6e 73 74 20 45 78 70 72 20 2a 70 29 7b  (const Expr *p){
c010: 0a 20 20 75 38 20 6f 70 3b 0a 20 20 77 68 69 6c  .  u8 op;.  whil
c020: 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 50 4c  e( p->op==TK_UPL
c030: 55 53 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  US || p->op==TK_
c040: 55 4d 49 4e 55 53 20 29 7b 20 70 20 3d 20 70 2d  UMINUS ){ p = p-
c050: 3e 70 4c 65 66 74 3b 20 7d 0a 20 20 6f 70 20 3d  >pLeft; }.  op =
c060: 20 70 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70   p->op;.  if( op
c070: 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29 20  ==TK_REGISTER ) 
c080: 6f 70 20 3d 20 70 2d 3e 6f 70 32 3b 0a 20 20 73  op = p->op2;.  s
c090: 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20  witch( op ){.   
c0a0: 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52   case TK_INTEGER
c0b0: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54  :.    case TK_ST
c0c0: 52 49 4e 47 3a 0a 20 20 20 20 63 61 73 65 20 54  RING:.    case T
c0d0: 4b 5f 46 4c 4f 41 54 3a 0a 20 20 20 20 63 61 73  K_FLOAT:.    cas
c0e0: 65 20 54 4b 5f 42 4c 4f 42 3a 0a 20 20 20 20 20  e TK_BLOB:.     
c0f0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 63   return 0;.    c
c100: 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20  ase TK_COLUMN:. 
c110: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
c120: 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 20 20 20  pTab!=0 );.     
c130: 20 72 65 74 75 72 6e 20 45 78 70 72 48 61 73 50   return ExprHasP
c140: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 43 61  roperty(p, EP_Ca
c150: 6e 42 65 4e 75 6c 6c 29 20 7c 7c 0a 20 20 20 20  nBeNull) ||.    
c160: 20 20 20 20 20 20 20 20 20 28 70 2d 3e 69 43 6f           (p->iCo
c170: 6c 75 6d 6e 3e 3d 30 20 26 26 20 70 2d 3e 70 54  lumn>=0 && p->pT
c180: 61 62 2d 3e 61 43 6f 6c 5b 70 2d 3e 69 43 6f 6c  ab->aCol[p->iCol
c190: 75 6d 6e 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 29  umn].notNull==0)
c1a0: 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20  ;.    default:. 
c1b0: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
c1c0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75   }.}../*.** Retu
c1d0: 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 67  rn TRUE if the g
c1e0: 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  iven expression 
c1f0: 69 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 77 68  is a constant wh
c200: 69 63 68 20 77 6f 75 6c 64 20 62 65 0a 2a 2a 20  ich would be.** 
c210: 75 6e 63 68 61 6e 67 65 64 20 62 79 20 4f 50 5f  unchanged by OP_
c220: 41 66 66 69 6e 69 74 79 20 77 69 74 68 20 74 68  Affinity with th
c230: 65 20 61 66 66 69 6e 69 74 79 20 67 69 76 65 6e  e affinity given
c240: 20 69 6e 20 74 68 65 20 73 65 63 6f 6e 64 0a 2a   in the second.*
c250: 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a  * argument..**.*
c260: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
c270: 73 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d  s used to determ
c280: 69 6e 65 20 69 66 20 74 68 65 20 4f 50 5f 41 66  ine if the OP_Af
c290: 66 69 6e 69 74 79 20 6f 70 65 72 61 74 69 6f 6e  finity operation
c2a0: 0a 2a 2a 20 63 61 6e 20 62 65 20 6f 6d 69 74 74  .** can be omitt
c2b0: 65 64 2e 20 20 57 68 65 6e 20 69 6e 20 64 6f 75  ed.  When in dou
c2c0: 62 74 20 72 65 74 75 72 6e 20 46 41 4c 53 45 2e  bt return FALSE.
c2d0: 20 20 41 20 66 61 6c 73 65 20 6e 65 67 61 74 69    A false negati
c2e0: 76 65 0a 2a 2a 20 69 73 20 68 61 72 6d 6c 65 73  ve.** is harmles
c2f0: 73 2e 20 20 41 20 66 61 6c 73 65 20 70 6f 73 69  s.  A false posi
c300: 74 69 76 65 2c 20 68 6f 77 65 76 65 72 2c 20 63  tive, however, c
c310: 61 6e 20 72 65 73 75 6c 74 20 69 6e 20 74 68 65  an result in the
c320: 20 77 72 6f 6e 67 0a 2a 2a 20 61 6e 73 77 65 72   wrong.** answer
c330: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
c340: 45 78 70 72 4e 65 65 64 73 4e 6f 41 66 66 69 6e  ExprNeedsNoAffin
c350: 69 74 79 43 68 61 6e 67 65 28 63 6f 6e 73 74 20  ityChange(const 
c360: 45 78 70 72 20 2a 70 2c 20 63 68 61 72 20 61 66  Expr *p, char af
c370: 66 29 7b 0a 20 20 75 38 20 6f 70 3b 0a 20 20 69  f){.  u8 op;.  i
c380: 66 28 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41  f( aff==SQLITE_A
c390: 46 46 5f 42 4c 4f 42 20 29 20 72 65 74 75 72 6e  FF_BLOB ) return
c3a0: 20 31 3b 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e   1;.  while( p->
c3b0: 6f 70 3d 3d 54 4b 5f 55 50 4c 55 53 20 7c 7c 20  op==TK_UPLUS || 
c3c0: 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4d 49 4e 55 53  p->op==TK_UMINUS
c3d0: 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4c 65 66 74   ){ p = p->pLeft
c3e0: 3b 20 7d 0a 20 20 6f 70 20 3d 20 70 2d 3e 6f 70  ; }.  op = p->op
c3f0: 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 52  ;.  if( op==TK_R
c400: 45 47 49 53 54 45 52 20 29 20 6f 70 20 3d 20 70  EGISTER ) op = p
c410: 2d 3e 6f 70 32 3b 0a 20 20 73 77 69 74 63 68 28  ->op2;.  switch(
c420: 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20   op ){.    case 
c430: 54 4b 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20  TK_INTEGER: {.  
c440: 20 20 20 20 72 65 74 75 72 6e 20 61 66 66 3d 3d      return aff==
c450: 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47  SQLITE_AFF_INTEG
c460: 45 52 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54  ER || aff==SQLIT
c470: 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20  E_AFF_NUMERIC;. 
c480: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
c490: 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20  _FLOAT: {.      
c4a0: 72 65 74 75 72 6e 20 61 66 66 3d 3d 53 51 4c 49  return aff==SQLI
c4b0: 54 45 5f 41 46 46 5f 52 45 41 4c 20 7c 7c 20 61  TE_AFF_REAL || a
c4c0: 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ff==SQLITE_AFF_N
c4d0: 55 4d 45 52 49 43 3b 0a 20 20 20 20 7d 0a 20 20  UMERIC;.    }.  
c4e0: 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47    case TK_STRING
c4f0: 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  : {.      return
c500: 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46   aff==SQLITE_AFF
c510: 5f 54 45 58 54 3b 0a 20 20 20 20 7d 0a 20 20 20  _TEXT;.    }.   
c520: 20 63 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 20 7b   case TK_BLOB: {
c530: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
c540: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
c550: 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20  TK_COLUMN: {.   
c560: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 54     assert( p->iT
c570: 61 62 6c 65 3e 3d 30 20 29 3b 20 20 2f 2a 20 70  able>=0 );  /* p
c580: 20 63 61 6e 6e 6f 74 20 62 65 20 70 61 72 74 20   cannot be part 
c590: 6f 66 20 61 20 43 48 45 43 4b 20 63 6f 6e 73 74  of a CHECK const
c5a0: 72 61 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20 72  raint */.      r
c5b0: 65 74 75 72 6e 20 70 2d 3e 69 43 6f 6c 75 6d 6e  eturn p->iColumn
c5c0: 3c 30 0a 20 20 20 20 20 20 20 20 20 20 26 26 20  <0.          && 
c5d0: 28 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46  (aff==SQLITE_AFF
c5e0: 5f 49 4e 54 45 47 45 52 20 7c 7c 20 61 66 66 3d  _INTEGER || aff=
c5f0: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45  =SQLITE_AFF_NUME
c600: 52 49 43 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RIC);.    }.    
c610: 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
c620: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
c630: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
c640: 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
c650: 20 67 69 76 65 6e 20 73 74 72 69 6e 67 20 69 73   given string is
c660: 20 61 20 72 6f 77 2d 69 64 20 63 6f 6c 75 6d 6e   a row-id column
c670: 20 6e 61 6d 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71   name..*/.int sq
c680: 6c 69 74 65 33 49 73 52 6f 77 69 64 28 63 6f 6e  lite3IsRowid(con
c690: 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69  st char *z){.  i
c6a0: 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
c6b0: 70 28 7a 2c 20 22 5f 52 4f 57 49 44 5f 22 29 3d  p(z, "_ROWID_")=
c6c0: 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  =0 ) return 1;. 
c6d0: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
c6e0: 43 6d 70 28 7a 2c 20 22 52 4f 57 49 44 22 29 3d  Cmp(z, "ROWID")=
c6f0: 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  =0 ) return 1;. 
c700: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
c710: 43 6d 70 28 7a 2c 20 22 4f 49 44 22 29 3d 3d 30  Cmp(z, "OID")==0
c720: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 72   ) return 1;.  r
c730: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
c740: 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
c750: 20 77 65 20 61 72 65 20 61 62 6c 65 20 74 6f 20   we are able to 
c760: 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20  the IN operator 
c770: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6f 6e 20  optimization on 
c780: 61 0a 2a 2a 20 71 75 65 72 79 20 6f 66 20 74 68  a.** query of th
c790: 65 20 66 6f 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20  e form.**.**    
c7a0: 20 20 20 78 20 49 4e 20 28 53 45 4c 45 43 54 20     x IN (SELECT 
c7b0: 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 57 68 65 72 65  ...).**.** Where
c7c0: 20 74 68 65 20 53 45 4c 45 43 54 2e 2e 2e 20 63   the SELECT... c
c7d0: 6c 61 75 73 65 20 69 73 20 61 73 20 73 70 65 63  lause is as spec
c7e0: 69 66 69 65 64 20 62 79 20 74 68 65 20 70 61 72  ified by the par
c7f0: 61 6d 65 74 65 72 20 74 6f 20 74 68 69 73 0a 2a  ameter to this.*
c800: 2a 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a  * routine..**.**
c810: 20 54 68 65 20 53 65 6c 65 63 74 20 6f 62 6a 65   The Select obje
c820: 63 74 20 70 61 73 73 65 64 20 69 6e 20 68 61 73  ct passed in has
c830: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 70 72   already been pr
c840: 65 70 72 6f 63 65 73 73 65 64 20 61 6e 64 20 6e  eprocessed and n
c850: 6f 0a 2a 2a 20 65 72 72 6f 72 73 20 68 61 76 65  o.** errors have
c860: 20 62 65 65 6e 20 66 6f 75 6e 64 2e 0a 2a 2f 0a   been found..*/.
c870: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
c880: 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 73 74 61  MIT_SUBQUERY.sta
c890: 74 69 63 20 69 6e 74 20 69 73 43 61 6e 64 69 64  tic int isCandid
c8a0: 61 74 65 46 6f 72 49 6e 4f 70 74 28 53 65 6c 65  ateForInOpt(Sele
c8b0: 63 74 20 2a 70 29 7b 0a 20 20 53 72 63 4c 69 73  ct *p){.  SrcLis
c8c0: 74 20 2a 70 53 72 63 3b 0a 20 20 45 78 70 72 4c  t *pSrc;.  ExprL
c8d0: 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 54  ist *pEList;.  T
c8e0: 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 69 66  able *pTab;.  if
c8f0: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( p==0 ) return 
c900: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
c910: 20 20 20 20 20 2f 2a 20 72 69 67 68 74 2d 68 61       /* right-ha
c920: 6e 64 20 73 69 64 65 20 6f 66 20 49 4e 20 69 73  nd side of IN is
c930: 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 69 66 28   SELECT */.  if(
c940: 20 70 2d 3e 70 50 72 69 6f 72 20 29 20 72 65 74   p->pPrior ) ret
c950: 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
c960: 20 20 20 20 2f 2a 20 4e 6f 74 20 61 20 63 6f 6d      /* Not a com
c970: 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 2a 2f 0a  pound SELECT */.
c980: 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67    if( p->selFlag
c990: 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74  s & (SF_Distinct
c9a0: 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29 20 29  |SF_Aggregate) )
c9b0: 7b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  {.    testcase( 
c9c0: 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28  (p->selFlags & (
c9d0: 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41  SF_Distinct|SF_A
c9e0: 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 44  ggregate))==SF_D
c9f0: 69 73 74 69 6e 63 74 20 29 3b 0a 20 20 20 20 74  istinct );.    t
ca00: 65 73 74 63 61 73 65 28 20 28 70 2d 3e 73 65 6c  estcase( (p->sel
ca10: 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74  Flags & (SF_Dist
ca20: 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74  inct|SF_Aggregat
ca30: 65 29 29 3d 3d 53 46 5f 41 67 67 72 65 67 61 74  e))==SF_Aggregat
ca40: 65 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  e );.    return 
ca50: 30 3b 20 2f 2a 20 4e 6f 20 44 49 53 54 49 4e 43  0; /* No DISTINC
ca60: 54 20 6b 65 79 77 6f 72 64 20 61 6e 64 20 6e 6f  T keyword and no
ca70: 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
ca80: 69 6f 6e 73 20 2a 2f 0a 20 20 7d 0a 20 20 61 73  ions */.  }.  as
ca90: 73 65 72 74 28 20 70 2d 3e 70 47 72 6f 75 70 42  sert( p->pGroupB
caa0: 79 3d 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20  y==0 );         
cab0: 20 20 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20 47       /* Has no G
cac0: 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 2a  ROUP BY clause *
cad0: 2f 0a 20 20 69 66 28 20 70 2d 3e 70 4c 69 6d 69  /.  if( p->pLimi
cae0: 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  t ) return 0;   
caf0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61             /* Ha
cb00: 73 20 6e 6f 20 4c 49 4d 49 54 20 63 6c 61 75 73  s no LIMIT claus
cb10: 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  e */.  assert( p
cb20: 2d 3e 70 4f 66 66 73 65 74 3d 3d 30 20 29 3b 20  ->pOffset==0 ); 
cb30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
cb40: 20 4e 6f 20 4c 49 4d 49 54 20 6d 65 61 6e 73 20   No LIMIT means 
cb50: 6e 6f 20 4f 46 46 53 45 54 20 2a 2f 0a 20 20 69  no OFFSET */.  i
cb60: 66 28 20 70 2d 3e 70 57 68 65 72 65 20 29 20 72  f( p->pWhere ) r
cb70: 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
cb80: 20 20 20 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20        /* Has no 
cb90: 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
cba0: 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63    pSrc = p->pSrc
cbb0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 72 63  ;.  assert( pSrc
cbc0: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 53 72  !=0 );.  if( pSr
cbd0: 63 2d 3e 6e 53 72 63 21 3d 31 20 29 20 72 65 74  c->nSrc!=1 ) ret
cbe0: 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
cbf0: 2f 2a 20 53 69 6e 67 6c 65 20 74 65 72 6d 20 69  /* Single term i
cc00: 6e 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f  n FROM clause */
cc10: 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 61 5b 30  .  if( pSrc->a[0
cc20: 5d 2e 70 53 65 6c 65 63 74 20 29 20 72 65 74 75  ].pSelect ) retu
cc30: 72 6e 20 30 3b 20 20 20 20 20 2f 2a 20 46 52 4f  rn 0;     /* FRO
cc40: 4d 20 69 73 20 6e 6f 74 20 61 20 73 75 62 71 75  M is not a subqu
cc50: 65 72 79 20 6f 72 20 76 69 65 77 20 2a 2f 0a 20  ery or view */. 
cc60: 20 70 54 61 62 20 3d 20 70 53 72 63 2d 3e 61 5b   pTab = pSrc->a[
cc70: 30 5d 2e 70 54 61 62 3b 0a 20 20 69 66 28 20 4e  0].pTab;.  if( N
cc80: 45 56 45 52 28 70 54 61 62 3d 3d 30 29 20 29 20  EVER(pTab==0) ) 
cc90: 72 65 74 75 72 6e 20 30 3b 0a 20 20 61 73 73 65  return 0;.  asse
cca0: 72 74 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63  rt( pTab->pSelec
ccb0: 74 3d 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20  t==0 );         
ccc0: 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73     /* FROM claus
ccd0: 65 20 69 73 20 6e 6f 74 20 61 20 76 69 65 77 20  e is not a view 
cce0: 2a 2f 0a 20 20 69 66 28 20 49 73 56 69 72 74 75  */.  if( IsVirtu
ccf0: 61 6c 28 70 54 61 62 29 20 29 20 72 65 74 75 72  al(pTab) ) retur
cd00: 6e 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 46  n 0;        /* F
cd10: 52 4f 4d 20 63 6c 61 75 73 65 20 6e 6f 74 20 61  ROM clause not a
cd20: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 2a   virtual table *
cd30: 2f 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e  /.  pEList = p->
cd40: 70 45 4c 69 73 74 3b 0a 20 20 69 66 28 20 70 45  pEList;.  if( pE
cd50: 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29  List->nExpr!=1 )
cd60: 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
cd70: 20 2f 2a 20 4f 6e 65 20 63 6f 6c 75 6d 6e 20 69   /* One column i
cd80: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
cd90: 20 2a 2f 0a 20 20 69 66 28 20 70 45 4c 69 73 74   */.  if( pEList
cda0: 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70  ->a[0].pExpr->op
cdb0: 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 72 65  !=TK_COLUMN ) re
cdc0: 74 75 72 6e 20 30 3b 20 2f 2a 20 52 65 73 75 6c  turn 0; /* Resul
cdd0: 74 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 2a 2f  t is a column */
cde0: 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23  .  return 1;.}.#
cdf0: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
ce00: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f  OMIT_SUBQUERY */
ce10: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20  ../*.** Code an 
ce20: 4f 50 5f 4f 6e 63 65 20 69 6e 73 74 72 75 63 74  OP_Once instruct
ce30: 69 6f 6e 20 61 6e 64 20 61 6c 6c 6f 63 61 74 65  ion and allocate
ce40: 20 73 70 61 63 65 20 66 6f 72 20 69 74 73 20 66   space for its f
ce50: 6c 61 67 2e 20 52 65 74 75 72 6e 20 74 68 65 20  lag. Return the 
ce60: 0a 2a 2a 20 61 64 64 72 65 73 73 20 6f 66 20 74  .** address of t
ce70: 68 65 20 6e 65 77 20 69 6e 73 74 72 75 63 74 69  he new instructi
ce80: 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  on..*/.int sqlit
ce90: 65 33 43 6f 64 65 4f 6e 63 65 28 50 61 72 73 65  e3CodeOnce(Parse
cea0: 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 56 64 62   *pParse){.  Vdb
ceb0: 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65  e *v = sqlite3Ge
cec0: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 20 20  tVdbe(pParse);  
ced0: 20 20 20 20 2f 2a 20 56 69 72 74 75 61 6c 20 6d      /* Virtual m
cee0: 61 63 68 69 6e 65 20 62 65 69 6e 67 20 63 6f 64  achine being cod
cef0: 65 64 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 73  ed */.  return s
cf00: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
cf10: 28 76 2c 20 4f 50 5f 4f 6e 63 65 2c 20 70 50 61  (v, OP_Once, pPa
cf20: 72 73 65 2d 3e 6e 4f 6e 63 65 2b 2b 29 3b 0a 7d  rse->nOnce++);.}
cf30: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
cf40: 20 63 6f 64 65 20 74 68 61 74 20 63 68 65 63 6b   code that check
cf50: 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20  s the left-most 
cf60: 63 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78 20  column of index 
cf70: 74 61 62 6c 65 20 69 43 75 72 20 74 6f 20 73 65  table iCur to se
cf80: 65 20 69 66 0a 2a 2a 20 69 74 20 63 6f 6e 74 61  e if.** it conta
cf90: 69 6e 73 20 61 6e 79 20 4e 55 4c 4c 20 65 6e 74  ins any NULL ent
cfa0: 72 69 65 73 2e 20 20 43 61 75 73 65 20 74 68 65  ries.  Cause the
cfb0: 20 72 65 67 69 73 74 65 72 20 61 74 20 72 65 67   register at reg
cfc0: 48 61 73 4e 75 6c 6c 20 74 6f 20 62 65 20 73 65  HasNull to be se
cfd0: 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 4e 55  t.** to a non-NU
cfe0: 4c 4c 20 76 61 6c 75 65 20 69 66 20 69 43 75 72  LL value if iCur
cff0: 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 4e 55 4c   contains no NUL
d000: 4c 73 2e 20 20 43 61 75 73 65 20 72 65 67 69 73  Ls.  Cause regis
d010: 74 65 72 20 72 65 67 48 61 73 4e 75 6c 6c 0a 2a  ter regHasNull.*
d020: 2a 20 74 6f 20 62 65 20 73 65 74 20 74 6f 20 4e  * to be set to N
d030: 55 4c 4c 20 69 66 20 69 43 75 72 20 63 6f 6e 74  ULL if iCur cont
d040: 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  ains one or more
d050: 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2e 0a 2a 2f   NULL values..*/
d060: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c  .static void sql
d070: 69 74 65 33 53 65 74 48 61 73 4e 75 6c 6c 46 6c  ite3SetHasNullFl
d080: 61 67 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20  ag(Vdbe *v, int 
d090: 69 43 75 72 2c 20 69 6e 74 20 72 65 67 48 61 73  iCur, int regHas
d0a0: 4e 75 6c 6c 29 7b 0a 20 20 69 6e 74 20 6a 31 3b  Null){.  int j1;
d0b0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
d0c0: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
d0d0: 65 72 2c 20 30 2c 20 72 65 67 48 61 73 4e 75 6c  er, 0, regHasNul
d0e0: 6c 29 3b 0a 20 20 6a 31 20 3d 20 73 71 6c 69 74  l);.  j1 = sqlit
d0f0: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
d100: 4f 50 5f 52 65 77 69 6e 64 2c 20 69 43 75 72 29  OP_Rewind, iCur)
d110: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
d120: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
d130: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
d140: 75 6d 6e 2c 20 69 43 75 72 2c 20 30 2c 20 72 65  umn, iCur, 0, re
d150: 67 48 61 73 4e 75 6c 6c 29 3b 0a 20 20 73 71 6c  gHasNull);.  sql
d160: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
d170: 28 76 2c 20 4f 50 46 4c 41 47 5f 54 59 50 45 4f  (v, OPFLAG_TYPEO
d180: 46 41 52 47 29 3b 0a 20 20 56 64 62 65 43 6f 6d  FARG);.  VdbeCom
d190: 6d 65 6e 74 28 28 76 2c 20 22 66 69 72 73 74 5f  ment((v, "first_
d1a0: 65 6e 74 72 79 5f 69 6e 28 25 64 29 22 2c 20 69  entry_in(%d)", i
d1b0: 43 75 72 29 29 3b 0a 20 20 73 71 6c 69 74 65 33  Cur));.  sqlite3
d1c0: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
d1d0: 6a 31 29 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66  j1);.}...#ifndef
d1e0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
d1f0: 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 54 68 65 20  QUERY./*.** The 
d200: 61 72 67 75 6d 65 6e 74 20 69 73 20 61 6e 20 49  argument is an I
d210: 4e 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68 20  N operator with 
d220: 61 20 6c 69 73 74 20 28 6e 6f 74 20 61 20 73 75  a list (not a su
d230: 62 71 75 65 72 79 29 20 6f 6e 20 74 68 65 20 0a  bquery) on the .
d240: 2a 2a 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69  ** right-hand si
d250: 64 65 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45  de.  Return TRUE
d260: 20 69 66 20 74 68 61 74 20 6c 69 73 74 20 69 73   if that list is
d270: 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a 73 74   constant..*/.st
d280: 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33  atic int sqlite3
d290: 49 6e 52 68 73 49 73 43 6f 6e 73 74 61 6e 74 28  InRhsIsConstant(
d2a0: 45 78 70 72 20 2a 70 49 6e 29 7b 0a 20 20 45 78  Expr *pIn){.  Ex
d2b0: 70 72 20 2a 70 4c 48 53 3b 0a 20 20 69 6e 74 20  pr *pLHS;.  int 
d2c0: 72 65 73 3b 0a 20 20 61 73 73 65 72 74 28 20 21  res;.  assert( !
d2d0: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
d2e0: 70 49 6e 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  pIn, EP_xIsSelec
d2f0: 74 29 20 29 3b 0a 20 20 70 4c 48 53 20 3d 20 70  t) );.  pLHS = p
d300: 49 6e 2d 3e 70 4c 65 66 74 3b 0a 20 20 70 49 6e  In->pLeft;.  pIn
d310: 2d 3e 70 4c 65 66 74 20 3d 20 30 3b 0a 20 20 72  ->pLeft = 0;.  r
d320: 65 73 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  es = sqlite3Expr
d330: 49 73 43 6f 6e 73 74 61 6e 74 28 70 49 6e 29 3b  IsConstant(pIn);
d340: 0a 20 20 70 49 6e 2d 3e 70 4c 65 66 74 20 3d 20  .  pIn->pLeft = 
d350: 70 4c 48 53 3b 0a 20 20 72 65 74 75 72 6e 20 72  pLHS;.  return r
d360: 65 73 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  es;.}.#endif../*
d370: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
d380: 6e 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65  n is used by the
d390: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
d3a0: 6f 66 20 74 68 65 20 49 4e 20 28 2e 2e 2e 29 20  of the IN (...) 
d3b0: 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 20 54 68 65  operator..** The
d3c0: 20 70 58 20 70 61 72 61 6d 65 74 65 72 20 69 73   pX parameter is
d3d0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
d3e0: 6f 6e 20 74 68 65 20 52 48 53 20 6f 66 20 74 68  on the RHS of th
d3f0: 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 2c 20 77  e IN operator, w
d400: 68 69 63 68 0a 2a 2a 20 6d 69 67 68 74 20 62 65  hich.** might be
d410: 20 65 69 74 68 65 72 20 61 20 6c 69 73 74 20 6f   either a list o
d420: 66 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6f 72  f expressions or
d430: 20 61 20 73 75 62 71 75 65 72 79 2e 0a 2a 2a 0a   a subquery..**.
d440: 2a 2a 20 54 68 65 20 6a 6f 62 20 6f 66 20 74 68  ** The job of th
d450: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 6f  is routine is to
d460: 20 66 69 6e 64 20 6f 72 20 63 72 65 61 74 65 20   find or create 
d470: 61 20 62 2d 74 72 65 65 20 6f 62 6a 65 63 74 20  a b-tree object 
d480: 74 68 61 74 20 63 61 6e 0a 2a 2a 20 62 65 20 75  that can.** be u
d490: 73 65 64 20 65 69 74 68 65 72 20 74 6f 20 74 65  sed either to te
d4a0: 73 74 20 66 6f 72 20 6d 65 6d 62 65 72 73 68 69  st for membershi
d4b0: 70 20 69 6e 20 74 68 65 20 52 48 53 20 73 65 74  p in the RHS set
d4c0: 20 6f 72 20 74 6f 20 69 74 65 72 61 74 65 20 74   or to iterate t
d4d0: 68 72 6f 75 67 68 0a 2a 2a 20 61 6c 6c 20 6d 65  hrough.** all me
d4e0: 6d 62 65 72 73 20 6f 66 20 74 68 65 20 52 48 53  mbers of the RHS
d4f0: 20 73 65 74 2c 20 73 6b 69 70 70 69 6e 67 20 64   set, skipping d
d500: 75 70 6c 69 63 61 74 65 73 2e 0a 2a 2a 0a 2a 2a  uplicates..**.**
d510: 20 41 20 63 75 72 73 6f 72 20 69 73 20 6f 70 65   A cursor is ope
d520: 6e 65 64 20 6f 6e 20 74 68 65 20 62 2d 74 72 65  ned on the b-tre
d530: 65 20 6f 62 6a 65 63 74 20 74 68 61 74 20 69 73  e object that is
d540: 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 65 20   the RHS of the 
d550: 49 4e 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 61  IN operator.** a
d560: 6e 64 20 70 58 2d 3e 69 54 61 62 6c 65 20 69 73  nd pX->iTable is
d570: 20 73 65 74 20 74 6f 20 74 68 65 20 69 6e 64 65   set to the inde
d580: 78 20 6f 66 20 74 68 61 74 20 63 75 72 73 6f 72  x of that cursor
d590: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75  ..**.** The retu
d5a0: 72 6e 65 64 20 76 61 6c 75 65 20 6f 66 20 74 68  rned value of th
d5b0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 6e 64 69  is function indi
d5c0: 63 61 74 65 73 20 74 68 65 20 62 2d 74 72 65 65  cates the b-tree
d5d0: 20 74 79 70 65 2c 20 61 73 20 66 6f 6c 6c 6f 77   type, as follow
d5e0: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 49 4e 5f 49 4e  s:.**.**   IN_IN
d5f0: 44 45 58 5f 52 4f 57 49 44 20 20 20 20 20 20 2d  DEX_ROWID      -
d600: 20 54 68 65 20 63 75 72 73 6f 72 20 77 61 73 20   The cursor was 
d610: 6f 70 65 6e 65 64 20 6f 6e 20 61 20 64 61 74 61  opened on a data
d620: 62 61 73 65 20 74 61 62 6c 65 2e 0a 2a 2a 20 20  base table..**  
d630: 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f   IN_INDEX_INDEX_
d640: 41 53 43 20 20 2d 20 54 68 65 20 63 75 72 73 6f  ASC  - The curso
d650: 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20  r was opened on 
d660: 61 6e 20 61 73 63 65 6e 64 69 6e 67 20 69 6e 64  an ascending ind
d670: 65 78 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45  ex..**   IN_INDE
d680: 58 5f 49 4e 44 45 58 5f 44 45 53 43 20 2d 20 54  X_INDEX_DESC - T
d690: 68 65 20 63 75 72 73 6f 72 20 77 61 73 20 6f 70  he cursor was op
d6a0: 65 6e 65 64 20 6f 6e 20 61 20 64 65 73 63 65 6e  ened on a descen
d6b0: 64 69 6e 67 20 69 6e 64 65 78 2e 0a 2a 2a 20 20  ding index..**  
d6c0: 20 49 4e 5f 49 4e 44 45 58 5f 45 50 48 20 20 20   IN_INDEX_EPH   
d6d0: 20 20 20 20 20 2d 20 54 68 65 20 63 75 72 73 6f       - The curso
d6e0: 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20  r was opened on 
d6f0: 61 20 73 70 65 63 69 61 6c 6c 79 20 63 72 65 61  a specially crea
d700: 74 65 64 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20  ted and.**      
d710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d720: 20 20 20 70 6f 70 75 6c 61 74 65 64 20 65 70 68     populated eph
d730: 65 72 65 6d 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a  eremal table..**
d740: 20 20 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50     IN_INDEX_NOOP
d750: 20 20 20 20 20 20 20 2d 20 4e 6f 20 63 75 72 73         - No curs
d760: 6f 72 20 77 61 73 20 61 6c 6c 6f 63 61 74 65 64  or was allocated
d770: 2e 20 20 54 68 65 20 49 4e 20 6f 70 65 72 61 74  .  The IN operat
d780: 6f 72 20 6d 75 73 74 20 62 65 0a 2a 2a 20 20 20  or must be.**   
d790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d7a0: 20 20 20 20 20 20 69 6d 70 6c 65 6d 65 6e 74 65        implemente
d7b0: 64 20 61 73 20 61 20 73 65 71 75 65 6e 63 65 20  d as a sequence 
d7c0: 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e 73 2e 0a  of comparisons..
d7d0: 2a 2a 0a 2a 2a 20 41 6e 20 65 78 69 73 74 69 6e  **.** An existin
d7e0: 67 20 62 2d 74 72 65 65 20 6d 69 67 68 74 20 62  g b-tree might b
d7f0: 65 20 75 73 65 64 20 69 66 20 74 68 65 20 52 48  e used if the RH
d800: 53 20 65 78 70 72 65 73 73 69 6f 6e 20 70 58 20  S expression pX 
d810: 69 73 20 61 20 73 69 6d 70 6c 65 0a 2a 2a 20 73  is a simple.** s
d820: 75 62 71 75 65 72 79 20 73 75 63 68 20 61 73 3a  ubquery such as:
d830: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43  .**.**     SELEC
d840: 54 20 3c 63 6f 6c 75 6d 6e 3e 20 46 52 4f 4d 20  T <column> FROM 
d850: 3c 74 61 62 6c 65 3e 0a 2a 2a 0a 2a 2a 20 49 66  <table>.**.** If
d860: 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 65 20   the RHS of the 
d870: 49 4e 20 6f 70 65 72 61 74 6f 72 20 69 73 20 61  IN operator is a
d880: 20 6c 69 73 74 20 6f 72 20 61 20 6d 6f 72 65 20   list or a more 
d890: 63 6f 6d 70 6c 65 78 20 73 75 62 71 75 65 72 79  complex subquery
d8a0: 2c 20 74 68 65 6e 0a 2a 2a 20 61 6e 20 65 70 68  , then.** an eph
d8b0: 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 6d 69 67  emeral table mig
d8c0: 68 74 20 6e 65 65 64 20 74 6f 20 62 65 20 67 65  ht need to be ge
d8d0: 6e 65 72 61 74 65 64 20 66 72 6f 6d 20 74 68 65  nerated from the
d8e0: 20 52 48 53 20 61 6e 64 20 74 68 65 6e 0a 2a 2a   RHS and then.**
d8f0: 20 70 58 2d 3e 69 54 61 62 6c 65 20 6d 61 64 65   pX->iTable made
d900: 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   to point to the
d910: 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65   ephemeral table
d920: 20 69 6e 73 74 65 61 64 20 6f 66 20 61 6e 0a 2a   instead of an.*
d930: 2a 20 65 78 69 73 74 69 6e 67 20 74 61 62 6c 65  * existing table
d940: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 46 6c  ..**.** The inFl
d950: 61 67 73 20 70 61 72 61 6d 65 74 65 72 20 6d 75  ags parameter mu
d960: 73 74 20 63 6f 6e 74 61 69 6e 20 65 78 61 63 74  st contain exact
d970: 6c 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 62 69  ly one of the bi
d980: 74 73 0a 2a 2a 20 49 4e 5f 49 4e 44 45 58 5f 4d  ts.** IN_INDEX_M
d990: 45 4d 42 45 52 53 48 49 50 20 6f 72 20 49 4e 5f  EMBERSHIP or IN_
d9a0: 49 4e 44 45 58 5f 4c 4f 4f 50 2e 20 20 49 66 20  INDEX_LOOP.  If 
d9b0: 69 6e 46 6c 61 67 73 20 63 6f 6e 74 61 69 6e 73  inFlags contains
d9c0: 0a 2a 2a 20 49 4e 5f 49 4e 44 45 58 5f 4d 45 4d  .** IN_INDEX_MEM
d9d0: 42 45 52 53 48 49 50 2c 20 74 68 65 6e 20 74 68  BERSHIP, then th
d9e0: 65 20 67 65 6e 65 72 61 74 65 64 20 74 61 62 6c  e generated tabl
d9f0: 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 66  e will be used f
da00: 6f 72 20 61 0a 2a 2a 20 66 61 73 74 20 6d 65 6d  or a.** fast mem
da10: 62 65 72 73 68 69 70 20 74 65 73 74 2e 20 20 57  bership test.  W
da20: 68 65 6e 20 74 68 65 20 49 4e 5f 49 4e 44 45 58  hen the IN_INDEX
da30: 5f 4c 4f 4f 50 20 62 69 74 20 69 73 20 73 65 74  _LOOP bit is set
da40: 2c 20 74 68 65 0a 2a 2a 20 49 4e 20 69 6e 64 65  , the.** IN inde
da50: 78 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74  x will be used t
da60: 6f 20 6c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20  o loop over all 
da70: 76 61 6c 75 65 73 20 6f 66 20 74 68 65 20 52 48  values of the RH
da80: 53 20 6f 66 20 74 68 65 0a 2a 2a 20 49 4e 20 6f  S of the.** IN o
da90: 70 65 72 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 57  perator..**.** W
daa0: 68 65 6e 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f  hen IN_INDEX_LOO
dab0: 50 20 69 73 20 75 73 65 64 20 28 61 6e 64 20 74  P is used (and t
dac0: 68 65 20 62 2d 74 72 65 65 20 77 69 6c 6c 20 62  he b-tree will b
dad0: 65 20 75 73 65 64 20 74 6f 20 69 74 65 72 61 74  e used to iterat
dae0: 65 0a 2a 2a 20 74 68 72 6f 75 67 68 20 74 68 65  e.** through the
daf0: 20 73 65 74 20 6d 65 6d 62 65 72 73 29 20 74 68   set members) th
db00: 65 6e 20 74 68 65 20 62 2d 74 72 65 65 20 6d 75  en the b-tree mu
db10: 73 74 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 64  st not contain d
db20: 75 70 6c 69 63 61 74 65 73 2e 0a 2a 2a 20 41 6e  uplicates..** An
db30: 20 65 70 68 65 72 65 6d 61 6c 20 74 61 62 6c 65   epheremal table
db40: 20 6d 75 73 74 20 62 65 20 75 73 65 64 20 75 6e   must be used un
db50: 6c 65 73 73 20 74 68 65 20 73 65 6c 65 63 74 65  less the selecte
db60: 64 20 3c 63 6f 6c 75 6d 6e 3e 20 69 73 20 67 75  d <column> is gu
db70: 61 72 61 6e 74 65 65 64 0a 2a 2a 20 74 6f 20 62  aranteed.** to b
db80: 65 20 75 6e 69 71 75 65 20 2d 20 65 69 74 68 65  e unique - eithe
db90: 72 20 62 65 63 61 75 73 65 20 69 74 20 69 73 20  r because it is 
dba0: 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  an INTEGER PRIMA
dbb0: 52 59 20 4b 45 59 20 6f 72 20 69 74 0a 2a 2a 20  RY KEY or it.** 
dbc0: 68 61 73 20 61 20 55 4e 49 51 55 45 20 63 6f 6e  has a UNIQUE con
dbd0: 73 74 72 61 69 6e 74 20 6f 72 20 55 4e 49 51 55  straint or UNIQU
dbe0: 45 20 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 57  E index..**.** W
dbf0: 68 65 6e 20 49 4e 5f 49 4e 44 45 58 5f 4d 45 4d  hen IN_INDEX_MEM
dc00: 42 45 52 53 48 49 50 20 69 73 20 75 73 65 64 20  BERSHIP is used 
dc10: 28 61 6e 64 20 74 68 65 20 62 2d 74 72 65 65 20  (and the b-tree 
dc20: 77 69 6c 6c 20 62 65 20 75 73 65 64 20 0a 2a 2a  will be used .**
dc30: 20 66 6f 72 20 66 61 73 74 20 73 65 74 20 6d 65   for fast set me
dc40: 6d 62 65 72 73 68 69 70 20 74 65 73 74 73 29 20  mbership tests) 
dc50: 74 68 65 6e 20 61 6e 20 65 70 68 65 72 65 6d 61  then an epherema
dc60: 6c 20 74 61 62 6c 65 20 6d 75 73 74 20 0a 2a 2a  l table must .**
dc70: 20 62 65 20 75 73 65 64 20 75 6e 6c 65 73 73 20   be used unless 
dc80: 3c 63 6f 6c 75 6d 6e 3e 20 69 73 20 61 6e 20 49  <column> is an I
dc90: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
dca0: 45 59 20 6f 72 20 61 6e 20 69 6e 64 65 78 20 63  EY or an index c
dcb0: 61 6e 20 0a 2a 2a 20 62 65 20 66 6f 75 6e 64 20  an .** be found 
dcc0: 77 69 74 68 20 3c 63 6f 6c 75 6d 6e 3e 20 61 73  with <column> as
dcd0: 20 69 74 73 20 6c 65 66 74 2d 6d 6f 73 74 20 63   its left-most c
dce0: 6f 6c 75 6d 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  olumn..**.** If 
dcf0: 74 68 65 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f  the IN_INDEX_NOO
dd00: 50 5f 4f 4b 20 61 6e 64 20 49 4e 5f 49 4e 44 45  P_OK and IN_INDE
dd10: 58 5f 4d 45 4d 42 45 52 53 48 49 50 20 61 72 65  X_MEMBERSHIP are
dd20: 20 62 6f 74 68 20 73 65 74 20 61 6e 64 0a 2a 2a   both set and.**
dd30: 20 69 66 20 74 68 65 20 52 48 53 20 6f 66 20 74   if the RHS of t
dd40: 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 69  he IN operator i
dd50: 73 20 61 20 6c 69 73 74 20 28 6e 6f 74 20 61 20  s a list (not a 
dd60: 73 75 62 71 75 65 72 79 29 20 74 68 65 6e 20 74  subquery) then t
dd70: 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 6d  his.** routine m
dd80: 69 67 68 74 20 64 65 63 69 64 65 20 74 68 61 74  ight decide that
dd90: 20 63 72 65 61 74 69 6e 67 20 61 6e 20 65 70 68   creating an eph
dda0: 65 6d 65 72 61 6c 20 62 2d 74 72 65 65 20 66 6f  emeral b-tree fo
ddb0: 72 20 6d 65 6d 62 65 72 73 68 69 70 0a 2a 2a 20  r membership.** 
ddc0: 74 65 73 74 69 6e 67 20 69 73 20 74 6f 6f 20 65  testing is too e
ddd0: 78 70 65 6e 73 69 76 65 20 61 6e 64 20 72 65 74  xpensive and ret
dde0: 75 72 6e 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f  urn IN_INDEX_NOO
ddf0: 50 2e 20 20 49 6e 20 74 68 61 74 20 63 61 73 65  P.  In that case
de00: 2c 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67  , the.** calling
de10: 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20   routine should 
de20: 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 49 4e  implement the IN
de30: 20 6f 70 65 72 61 74 6f 72 20 75 73 69 6e 67 20   operator using 
de40: 61 20 73 65 71 75 65 6e 63 65 0a 2a 2a 20 6f 66  a sequence.** of
de50: 20 45 71 20 6f 72 20 4e 65 20 63 6f 6d 70 61 72   Eq or Ne compar
de60: 69 73 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 73 2e  ison operations.
de70: 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 65 20  .**.** When the 
de80: 62 2d 74 72 65 65 20 69 73 20 62 65 69 6e 67 20  b-tree is being 
de90: 75 73 65 64 20 66 6f 72 20 6d 65 6d 62 65 72 73  used for members
dea0: 68 69 70 20 74 65 73 74 73 2c 20 74 68 65 20 63  hip tests, the c
deb0: 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a  alling function.
dec0: 2a 2a 20 6d 69 67 68 74 20 6e 65 65 64 20 74 6f  ** might need to
ded0: 20 6b 6e 6f 77 20 77 68 65 74 68 65 72 20 6f 72   know whether or
dee0: 20 6e 6f 74 20 74 68 65 20 52 48 53 20 73 69 64   not the RHS sid
def0: 65 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72  e of the IN oper
df00: 61 74 6f 72 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73  ator.** contains
df10: 20 61 20 4e 55 4c 4c 2e 20 20 49 66 20 70 72 52   a NULL.  If prR
df20: 68 73 48 61 73 4e 75 6c 6c 20 69 73 20 6e 6f 74  hsHasNull is not
df30: 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20   a NULL pointer 
df40: 61 6e 64 20 0a 2a 2a 20 69 66 20 74 68 65 72 65  and .** if there
df50: 20 69 73 20 61 6e 79 20 63 68 61 6e 63 65 20 74   is any chance t
df60: 68 61 74 20 74 68 65 20 28 2e 2e 2e 29 20 6d 69  hat the (...) mi
df70: 67 68 74 20 63 6f 6e 74 61 69 6e 20 61 20 4e 55  ght contain a NU
df80: 4c 4c 20 76 61 6c 75 65 20 61 74 0a 2a 2a 20 72  LL value at.** r
df90: 75 6e 74 69 6d 65 2c 20 74 68 65 6e 20 61 20 72  untime, then a r
dfa0: 65 67 69 73 74 65 72 20 69 73 20 61 6c 6c 6f 63  egister is alloc
dfb0: 61 74 65 64 20 61 6e 64 20 74 68 65 20 72 65 67  ated and the reg
dfc0: 69 73 74 65 72 20 6e 75 6d 62 65 72 20 77 72 69  ister number wri
dfd0: 74 74 65 6e 0a 2a 2a 20 74 6f 20 2a 70 72 52 68  tten.** to *prRh
dfe0: 73 48 61 73 4e 75 6c 6c 2e 20 49 66 20 74 68 65  sHasNull. If the
dff0: 72 65 20 69 73 20 6e 6f 20 63 68 61 6e 63 65 20  re is no chance 
e000: 74 68 61 74 20 74 68 65 20 28 2e 2e 2e 29 20 63  that the (...) c
e010: 6f 6e 74 61 69 6e 73 20 61 0a 2a 2a 20 4e 55 4c  ontains a.** NUL
e020: 4c 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 2a 70  L value, then *p
e030: 72 52 68 73 48 61 73 4e 75 6c 6c 20 69 73 20 6c  rRhsHasNull is l
e040: 65 66 74 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a  eft unchanged..*
e050: 2a 0a 2a 2a 20 49 66 20 61 20 72 65 67 69 73 74  *.** If a regist
e060: 65 72 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20  er is allocated 
e070: 61 6e 64 20 69 74 73 20 6c 6f 63 61 74 69 6f 6e  and its location
e080: 20 73 74 6f 72 65 64 20 69 6e 20 2a 70 72 52 68   stored in *prRh
e090: 73 48 61 73 4e 75 6c 6c 2c 20 74 68 65 6e 0a 2a  sHasNull, then.*
e0a0: 2a 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 74  * the value in t
e0b0: 68 61 74 20 72 65 67 69 73 74 65 72 20 77 69 6c  hat register wil
e0c0: 6c 20 62 65 20 4e 55 4c 4c 20 69 66 20 74 68 65  l be NULL if the
e0d0: 20 62 2d 74 72 65 65 20 63 6f 6e 74 61 69 6e 73   b-tree contains
e0e0: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20   one or more.** 
e0f0: 4e 55 4c 4c 20 76 61 6c 75 65 73 2c 20 61 6e 64  NULL values, and
e100: 20 69 74 20 77 69 6c 6c 20 62 65 20 73 6f 6d 65   it will be some
e110: 20 6e 6f 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65 20   non-NULL value 
e120: 69 66 20 74 68 65 20 62 2d 74 72 65 65 20 63 6f  if the b-tree co
e130: 6e 74 61 69 6e 73 20 6e 6f 0a 2a 2a 20 4e 55 4c  ntains no.** NUL
e140: 4c 20 76 61 6c 75 65 73 2e 0a 2a 2f 0a 23 69 66  L values..*/.#if
e150: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
e160: 5f 53 55 42 51 55 45 52 59 0a 69 6e 74 20 73 71  _SUBQUERY.int sq
e170: 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e 64 65 78  lite3FindInIndex
e180: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
e190: 45 78 70 72 20 2a 70 58 2c 20 75 33 32 20 69 6e  Expr *pX, u32 in
e1a0: 46 6c 61 67 73 2c 20 69 6e 74 20 2a 70 72 52 68  Flags, int *prRh
e1b0: 73 48 61 73 4e 75 6c 6c 29 7b 0a 20 20 53 65 6c  sHasNull){.  Sel
e1c0: 65 63 74 20 2a 70 3b 20 20 20 20 20 20 20 20 20  ect *p;         
e1d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e1e0: 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 74 6f 20     /* SELECT to 
e1f0: 74 68 65 20 72 69 67 68 74 20 6f 66 20 49 4e 20  the right of IN 
e200: 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e  operator */.  in
e210: 74 20 65 54 79 70 65 20 3d 20 30 3b 20 20 20 20  t eType = 0;    
e220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e230: 20 20 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 52      /* Type of R
e240: 48 53 20 74 61 62 6c 65 2e 20 49 4e 5f 49 4e 44  HS table. IN_IND
e250: 45 58 5f 2a 20 2a 2f 0a 20 20 69 6e 74 20 69 54  EX_* */.  int iT
e260: 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  ab = pParse->nTa
e270: 62 2b 2b 3b 20 20 20 20 20 20 20 20 20 20 20 20  b++;            
e280: 2f 2a 20 43 75 72 73 6f 72 20 6f 66 20 74 68 65  /* Cursor of the
e290: 20 52 48 53 20 74 61 62 6c 65 20 2a 2f 0a 20 20   RHS table */.  
e2a0: 69 6e 74 20 6d 75 73 74 42 65 55 6e 69 71 75 65  int mustBeUnique
e2b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
e2c0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
e2d0: 20 52 48 53 20 6d 75 73 74 20 62 65 20 75 6e 69   RHS must be uni
e2e0: 71 75 65 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  que */.  Vdbe *v
e2f0: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
e300: 65 28 70 50 61 72 73 65 29 3b 20 20 20 20 20 2f  e(pParse);     /
e310: 2a 20 56 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  * Virtual machin
e320: 65 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f  e being coded */
e330: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 58 2d 3e  ..  assert( pX->
e340: 6f 70 3d 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20 6d  op==TK_IN );.  m
e350: 75 73 74 42 65 55 6e 69 71 75 65 20 3d 20 28 69  ustBeUnique = (i
e360: 6e 46 6c 61 67 73 20 26 20 49 4e 5f 49 4e 44 45  nFlags & IN_INDE
e370: 58 5f 4c 4f 4f 50 29 21 3d 30 3b 0a 0a 20 20 2f  X_LOOP)!=0;..  /
e380: 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
e390: 66 20 61 6e 20 65 78 69 73 74 69 6e 67 20 74 61  f an existing ta
e3a0: 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 63 61 6e  ble or index can
e3b0: 20 62 65 20 75 73 65 64 20 74 6f 0a 20 20 2a 2a   be used to.  **
e3c0: 20 73 61 74 69 73 66 79 20 74 68 65 20 71 75 65   satisfy the que
e3d0: 72 79 2e 20 20 54 68 69 73 20 69 73 20 70 72 65  ry.  This is pre
e3e0: 66 65 72 61 62 6c 65 20 74 6f 20 67 65 6e 65 72  ferable to gener
e3f0: 61 74 69 6e 67 20 61 20 6e 65 77 20 0a 20 20 2a  ating a new .  *
e400: 2a 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c  * ephemeral tabl
e410: 65 2e 0a 20 20 2a 2f 0a 20 20 70 20 3d 20 28 45  e..  */.  p = (E
e420: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
e430: 58 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  X, EP_xIsSelect)
e440: 20 3f 20 70 58 2d 3e 78 2e 70 53 65 6c 65 63 74   ? pX->x.pSelect
e450: 20 3a 20 30 29 3b 0a 20 20 69 66 28 20 70 50 61   : 0);.  if( pPa
e460: 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 26 26 20  rse->nErr==0 && 
e470: 69 73 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e  isCandidateForIn
e480: 4f 70 74 28 70 29 20 29 7b 0a 20 20 20 20 73 71  Opt(p) ){.    sq
e490: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
e4a0: 73 65 2d 3e 64 62 3b 20 20 20 20 20 20 20 20 20  se->db;         
e4b0: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
e4c0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
e4d0: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20     Table *pTab; 
e4e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e4f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62            /* Tab
e500: 6c 65 20 3c 74 61 62 6c 65 3e 2e 20 2a 2f 0a 20  le <table>. */. 
e510: 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b 20     Expr *pExpr; 
e520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e530: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70            /* Exp
e540: 72 65 73 73 69 6f 6e 20 3c 63 6f 6c 75 6d 6e 3e  ression <column>
e550: 20 2a 2f 0a 20 20 20 20 69 31 36 20 69 43 6f 6c   */.    i16 iCol
e560: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
e570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e580: 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d  * Index of colum
e590: 6e 20 3c 63 6f 6c 75 6d 6e 3e 20 2a 2f 0a 20 20  n <column> */.  
e5a0: 20 20 69 31 36 20 69 44 62 3b 20 20 20 20 20 20    i16 iDb;      
e5b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e5c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
e5d0: 62 61 73 65 20 69 64 78 20 66 6f 72 20 70 54 61  base idx for pTa
e5e0: 62 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74  b */..    assert
e5f0: 28 20 70 20 29 3b 20 20 20 20 20 20 20 20 20 20  ( p );          
e600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e610: 20 42 65 63 61 75 73 65 20 6f 66 20 69 73 43 61   Because of isCa
e620: 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28  ndidateForInOpt(
e630: 70 29 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  p) */.    assert
e640: 28 20 70 2d 3e 70 45 4c 69 73 74 21 3d 30 20 29  ( p->pEList!=0 )
e650: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
e660: 20 42 65 63 61 75 73 65 20 6f 66 20 69 73 43 61   Because of isCa
e670: 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28  ndidateForInOpt(
e680: 70 29 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  p) */.    assert
e690: 28 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30  ( p->pEList->a[0
e6a0: 5d 2e 70 45 78 70 72 21 3d 30 20 29 3b 20 2f 2a  ].pExpr!=0 ); /*
e6b0: 20 42 65 63 61 75 73 65 20 6f 66 20 69 73 43 61   Because of isCa
e6c0: 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28  ndidateForInOpt(
e6d0: 70 29 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  p) */.    assert
e6e0: 28 20 70 2d 3e 70 53 72 63 21 3d 30 20 29 3b 20  ( p->pSrc!=0 ); 
e6f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e700: 20 42 65 63 61 75 73 65 20 6f 66 20 69 73 43 61   Because of isCa
e710: 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28  ndidateForInOpt(
e720: 70 29 20 2a 2f 0a 20 20 20 20 70 54 61 62 20 3d  p) */.    pTab =
e730: 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70   p->pSrc->a[0].p
e740: 54 61 62 3b 0a 20 20 20 20 70 45 78 70 72 20 3d  Tab;.    pExpr =
e750: 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d   p->pEList->a[0]
e760: 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 43 6f 6c  .pExpr;.    iCol
e770: 20 3d 20 28 69 31 36 29 70 45 78 70 72 2d 3e 69   = (i16)pExpr->i
e780: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 0a 20 20 20 20  Column;.   .    
e790: 2f 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f 54 72  /* Code an OP_Tr
e7a0: 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 4f 50  ansaction and OP
e7b0: 5f 54 61 62 6c 65 4c 6f 63 6b 20 66 6f 72 20 3c  _TableLock for <
e7c0: 74 61 62 6c 65 3e 2e 20 2a 2f 0a 20 20 20 20 69  table>. */.    i
e7d0: 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
e7e0: 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54  maToIndex(db, pT
e7f0: 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  ab->pSchema);.  
e800: 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72    sqlite3CodeVer
e810: 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65  ifySchema(pParse
e820: 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69  , iDb);.    sqli
e830: 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61  te3TableLock(pPa
e840: 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e  rse, iDb, pTab->
e850: 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e 7a  tnum, 0, pTab->z
e860: 4e 61 6d 65 29 3b 0a 0a 20 20 20 20 2f 2a 20 54  Name);..    /* T
e870: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
e880: 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 66 72 6f 6d  only called from
e890: 20 74 77 6f 20 70 6c 61 63 65 73 2e 20 49 6e 20   two places. In 
e8a0: 62 6f 74 68 20 63 61 73 65 73 20 74 68 65 20 76  both cases the v
e8b0: 64 62 65 0a 20 20 20 20 2a 2a 20 68 61 73 20 61  dbe.    ** has a
e8c0: 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f  lready been allo
e8d0: 63 61 74 65 64 2e 20 53 6f 20 61 73 73 75 6d 65  cated. So assume
e8e0: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
e8f0: 29 20 69 73 20 61 6c 77 61 79 73 0a 20 20 20 20  ) is always.    
e900: 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20 68 65  ** successful he
e910: 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  re..    */.    a
e920: 73 73 65 72 74 28 76 29 3b 0a 20 20 20 20 69 66  ssert(v);.    if
e930: 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20  ( iCol<0 ){.    
e940: 20 20 69 6e 74 20 69 41 64 64 72 20 3d 20 73 71    int iAddr = sq
e950: 6c 69 74 65 33 43 6f 64 65 4f 6e 63 65 28 70 50  lite3CodeOnce(pP
e960: 61 72 73 65 29 3b 0a 20 20 20 20 20 20 56 64 62  arse);.      Vdb
e970: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a 20  eCoverage(v);.. 
e980: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e       sqlite3Open
e990: 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 69 54  Table(pParse, iT
e9a0: 61 62 2c 20 69 44 62 2c 20 70 54 61 62 2c 20 4f  ab, iDb, pTab, O
e9b0: 50 5f 4f 70 65 6e 52 65 61 64 29 3b 0a 20 20 20  P_OpenRead);.   
e9c0: 20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e     eType = IN_IN
e9d0: 44 45 58 5f 52 4f 57 49 44 3b 0a 0a 20 20 20 20  DEX_ROWID;..    
e9e0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
e9f0: 70 48 65 72 65 28 76 2c 20 69 41 64 64 72 29 3b  pHere(v, iAddr);
ea00: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
ea10: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20    Index *pIdx;  
ea20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ea30: 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74         /* Iterat
ea40: 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 0a  or variable */..
ea50: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6c        /* The col
ea60: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
ea70: 75 73 65 64 20 62 79 20 74 68 65 20 63 6f 6d 70  used by the comp
ea80: 61 72 69 73 6f 6e 2e 20 49 66 20 61 6e 20 69 6e  arison. If an in
ea90: 64 65 78 20 69 73 20 74 6f 0a 20 20 20 20 20 20  dex is to.      
eaa0: 2a 2a 20 62 65 20 75 73 65 64 20 69 6e 20 70 6c  ** be used in pl
eab0: 61 63 65 20 6f 66 20 61 20 74 65 6d 70 2d 74 61  ace of a temp-ta
eac0: 62 6c 65 2c 20 69 74 20 6d 75 73 74 20 62 65 20  ble, it must be 
ead0: 6f 72 64 65 72 65 64 20 61 63 63 6f 72 64 69 6e  ordered accordin
eae0: 67 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 68  g.      ** to th
eaf0: 69 73 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  is collation seq
eb00: 75 65 6e 63 65 2e 20 20 2a 2f 0a 20 20 20 20 20  uence.  */.     
eb10: 20 43 6f 6c 6c 53 65 71 20 2a 70 52 65 71 20 3d   CollSeq *pReq =
eb20: 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f   sqlite3BinaryCo
eb30: 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61  mpareCollSeq(pPa
eb40: 72 73 65 2c 20 70 58 2d 3e 70 4c 65 66 74 2c 20  rse, pX->pLeft, 
eb50: 70 45 78 70 72 29 3b 0a 0a 20 20 20 20 20 20 2f  pExpr);..      /
eb60: 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65  * Check that the
eb70: 20 61 66 66 69 6e 69 74 79 20 74 68 61 74 20 77   affinity that w
eb80: 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f 20 70  ill be used to p
eb90: 65 72 66 6f 72 6d 20 74 68 65 20 0a 20 20 20 20  erform the .    
eba0: 20 20 2a 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 20    ** comparison 
ebb0: 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 74  is the same as t
ebc0: 68 65 20 61 66 66 69 6e 69 74 79 20 6f 66 20 74  he affinity of t
ebd0: 68 65 20 63 6f 6c 75 6d 6e 2e 20 49 66 0a 20 20  he column. If.  
ebe0: 20 20 20 20 2a 2a 20 69 74 20 69 73 20 6e 6f 74      ** it is not
ebf0: 2c 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73  , it is not poss
ec00: 69 62 6c 65 20 74 6f 20 75 73 65 20 61 6e 79 20  ible to use any 
ec10: 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 2a 2f 0a  index..      */.
ec20: 20 20 20 20 20 20 69 6e 74 20 61 66 66 69 6e 69        int affini
ec30: 74 79 5f 6f 6b 20 3d 20 73 71 6c 69 74 65 33 49  ty_ok = sqlite3I
ec40: 6e 64 65 78 41 66 66 69 6e 69 74 79 4f 6b 28 70  ndexAffinityOk(p
ec50: 58 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43  X, pTab->aCol[iC
ec60: 6f 6c 5d 2e 61 66 66 69 6e 69 74 79 29 3b 0a 0a  ol].affinity);..
ec70: 20 20 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70        for(pIdx=p
ec80: 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64  Tab->pIndex; pId
ec90: 78 20 26 26 20 65 54 79 70 65 3d 3d 30 20 26 26  x && eType==0 &&
eca0: 20 61 66 66 69 6e 69 74 79 5f 6f 6b 3b 20 70 49   affinity_ok; pI
ecb0: 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b  dx=pIdx->pNext){
ecc0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70 49  .        if( (pI
ecd0: 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 3d  dx->aiColumn[0]=
ece0: 3d 69 43 6f 6c 29 0a 20 20 20 20 20 20 20 20 20  =iCol).         
ecf0: 26 26 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f  && sqlite3FindCo
ed00: 6c 6c 53 65 71 28 64 62 2c 20 45 4e 43 28 64 62  llSeq(db, ENC(db
ed10: 29 2c 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b  ), pIdx->azColl[
ed20: 30 5d 2c 20 30 29 3d 3d 70 52 65 71 0a 20 20 20  0], 0)==pReq.   
ed30: 20 20 20 20 20 20 26 26 20 28 21 6d 75 73 74 42        && (!mustB
ed40: 65 55 6e 69 71 75 65 20 7c 7c 20 28 70 49 64 78  eUnique || (pIdx
ed50: 2d 3e 6e 4b 65 79 43 6f 6c 3d 3d 31 20 26 26 20  ->nKeyCol==1 && 
ed60: 49 73 55 6e 69 71 75 65 49 6e 64 65 78 28 70 49  IsUniqueIndex(pI
ed70: 64 78 29 29 29 0a 20 20 20 20 20 20 20 20 29 7b  dx))).        ){
ed80: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69  .          int i
ed90: 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33 43 6f  Addr = sqlite3Co
eda0: 64 65 4f 6e 63 65 28 70 50 61 72 73 65 29 3b 20  deOnce(pParse); 
edb0: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
edc0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
edd0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
ede0: 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69 54 61  OP_OpenRead, iTa
edf0: 62 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c 20 69  b, pIdx->tnum, i
ee00: 44 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  Db);.          s
ee10: 71 6c 69 74 65 33 56 64 62 65 53 65 74 50 34 4b  qlite3VdbeSetP4K
ee20: 65 79 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70  eyInfo(pParse, p
ee30: 49 64 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Idx);.          
ee40: 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
ee50: 22 25 73 22 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d  "%s", pIdx->zNam
ee60: 65 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61  e));.          a
ee70: 73 73 65 72 74 28 20 49 4e 5f 49 4e 44 45 58 5f  ssert( IN_INDEX_
ee80: 49 4e 44 45 58 5f 44 45 53 43 20 3d 3d 20 49 4e  INDEX_DESC == IN
ee90: 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 41 53 43  _INDEX_INDEX_ASC
eea0: 2b 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  +1 );.          
eeb0: 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58  eType = IN_INDEX
eec0: 5f 49 4e 44 45 58 5f 41 53 43 20 2b 20 70 49 64  _INDEX_ASC + pId
eed0: 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 30 5d  x->aSortOrder[0]
eee0: 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ;..          if(
eef0: 20 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 26 26   prRhsHasNull &&
ef00: 20 21 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f   !pTab->aCol[iCo
ef10: 6c 5d 2e 6e 6f 74 4e 75 6c 6c 20 29 7b 0a 20 20  l].notNull ){.  
ef20: 20 20 20 20 20 20 20 20 20 20 2a 70 72 52 68 73            *prRhs
ef30: 48 61 73 4e 75 6c 6c 20 3d 20 2b 2b 70 50 61 72  HasNull = ++pPar
ef40: 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
ef50: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 74        sqlite3Set
ef60: 48 61 73 4e 75 6c 6c 46 6c 61 67 28 76 2c 20 69  HasNullFlag(v, i
ef70: 54 61 62 2c 20 2a 70 72 52 68 73 48 61 73 4e 75  Tab, *prRhsHasNu
ef80: 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ll);.          }
ef90: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
efa0: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
efb0: 2c 20 69 41 64 64 72 29 3b 0a 20 20 20 20 20 20  , iAddr);.      
efc0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
efd0: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6e  }.  }..  /* If n
efe0: 6f 20 70 72 65 65 78 69 73 74 69 6e 67 20 69 6e  o preexisting in
eff0: 64 65 78 20 69 73 20 61 76 61 69 6c 61 62 6c 65  dex is available
f000: 20 66 6f 72 20 74 68 65 20 49 4e 20 63 6c 61 75   for the IN clau
f010: 73 65 0a 20 20 2a 2a 20 61 6e 64 20 49 4e 5f 49  se.  ** and IN_I
f020: 4e 44 45 58 5f 4e 4f 4f 50 20 69 73 20 61 6e 20  NDEX_NOOP is an 
f030: 61 6c 6c 6f 77 65 64 20 72 65 70 6c 79 0a 20 20  allowed reply.  
f040: 2a 2a 20 61 6e 64 20 74 68 65 20 52 48 53 20 6f  ** and the RHS o
f050: 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f  f the IN operato
f060: 72 20 69 73 20 61 20 6c 69 73 74 2c 20 6e 6f 74  r is a list, not
f070: 20 61 20 73 75 62 71 75 65 72 79 0a 20 20 2a 2a   a subquery.  **
f080: 20 61 6e 64 20 74 68 65 20 52 48 53 20 69 73 20   and the RHS is 
f090: 6e 6f 74 20 63 6f 6e 74 61 6e 74 20 6f 72 20 68  not contant or h
f0a0: 61 73 20 74 77 6f 20 6f 72 20 66 65 77 65 72 20  as two or fewer 
f0b0: 74 65 72 6d 73 2c 0a 20 20 2a 2a 20 74 68 65 6e  terms,.  ** then
f0c0: 20 69 74 20 69 73 20 6e 6f 74 20 77 6f 72 74 68   it is not worth
f0d0: 20 63 72 65 61 74 69 6e 67 20 61 6e 20 65 70 68   creating an eph
f0e0: 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 74 6f 20  emeral table to 
f0f0: 65 76 61 6c 75 61 74 65 0a 20 20 2a 2a 20 74 68  evaluate.  ** th
f100: 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 73 6f  e IN operator so
f110: 20 72 65 74 75 72 6e 20 49 4e 5f 49 4e 44 45 58   return IN_INDEX
f120: 5f 4e 4f 4f 50 2e 0a 20 20 2a 2f 0a 20 20 69 66  _NOOP..  */.  if
f130: 28 20 65 54 79 70 65 3d 3d 30 0a 20 20 20 26 26  ( eType==0.   &&
f140: 20 28 69 6e 46 6c 61 67 73 20 26 20 49 4e 5f 49   (inFlags & IN_I
f150: 4e 44 45 58 5f 4e 4f 4f 50 5f 4f 4b 29 0a 20 20  NDEX_NOOP_OK).  
f160: 20 26 26 20 21 45 78 70 72 48 61 73 50 72 6f 70   && !ExprHasProp
f170: 65 72 74 79 28 70 58 2c 20 45 50 5f 78 49 73 53  erty(pX, EP_xIsS
f180: 65 6c 65 63 74 29 0a 20 20 20 26 26 20 28 21 73  elect).   && (!s
f190: 71 6c 69 74 65 33 49 6e 52 68 73 49 73 43 6f 6e  qlite3InRhsIsCon
f1a0: 73 74 61 6e 74 28 70 58 29 20 7c 7c 20 70 58 2d  stant(pX) || pX-
f1b0: 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3c  >x.pList->nExpr<
f1c0: 3d 32 29 0a 20 20 29 7b 0a 20 20 20 20 65 54 79  =2).  ){.    eTy
f1d0: 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f  pe = IN_INDEX_NO
f1e0: 4f 50 3b 0a 20 20 7d 0a 20 20 20 20 20 0a 0a 20  OP;.  }.     .. 
f1f0: 20 69 66 28 20 65 54 79 70 65 3d 3d 30 20 29 7b   if( eType==0 ){
f200: 0a 20 20 20 20 2f 2a 20 43 6f 75 6c 64 20 6e 6f  .    /* Could no
f210: 74 20 66 69 6e 64 20 61 6e 20 65 78 69 73 74 69  t find an existi
f220: 6e 67 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65  ng table or inde
f230: 78 20 74 6f 20 75 73 65 20 61 73 20 74 68 65 20  x to use as the 
f240: 52 48 53 20 62 2d 74 72 65 65 2e 0a 20 20 20 20  RHS b-tree..    
f250: 2a 2a 20 57 65 20 77 69 6c 6c 20 68 61 76 65 20  ** We will have 
f260: 74 6f 20 67 65 6e 65 72 61 74 65 20 61 6e 20 65  to generate an e
f270: 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 74  phemeral table t
f280: 6f 20 64 6f 20 74 68 65 20 6a 6f 62 2e 0a 20 20  o do the job..  
f290: 20 20 2a 2f 0a 20 20 20 20 75 33 32 20 73 61 76    */.    u32 sav
f2a0: 65 64 4e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70  edNQueryLoop = p
f2b0: 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f  Parse->nQueryLoo
f2c0: 70 3b 0a 20 20 20 20 69 6e 74 20 72 4d 61 79 48  p;.    int rMayH
f2d0: 61 76 65 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20  aveNull = 0;.   
f2e0: 20 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45   eType = IN_INDE
f2f0: 58 5f 45 50 48 3b 0a 20 20 20 20 69 66 28 20 69  X_EPH;.    if( i
f300: 6e 46 6c 61 67 73 20 26 20 49 4e 5f 49 4e 44 45  nFlags & IN_INDE
f310: 58 5f 4c 4f 4f 50 20 29 7b 0a 20 20 20 20 20 20  X_LOOP ){.      
f320: 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f  pParse->nQueryLo
f330: 6f 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66  op = 0;.      if
f340: 28 20 70 58 2d 3e 70 4c 65 66 74 2d 3e 69 43 6f  ( pX->pLeft->iCo
f350: 6c 75 6d 6e 3c 30 20 26 26 20 21 45 78 70 72 48  lumn<0 && !ExprH
f360: 61 73 50 72 6f 70 65 72 74 79 28 70 58 2c 20 45  asProperty(pX, E
f370: 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a  P_xIsSelect) ){.
f380: 20 20 20 20 20 20 20 20 65 54 79 70 65 20 3d 20          eType = 
f390: 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 3b 0a  IN_INDEX_ROWID;.
f3a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
f3b0: 65 20 69 66 28 20 70 72 52 68 73 48 61 73 4e 75  e if( prRhsHasNu
f3c0: 6c 6c 20 29 7b 0a 20 20 20 20 20 20 2a 70 72 52  ll ){.      *prR
f3d0: 68 73 48 61 73 4e 75 6c 6c 20 3d 20 72 4d 61 79  hsHasNull = rMay
f3e0: 48 61 76 65 4e 75 6c 6c 20 3d 20 2b 2b 70 50 61  HaveNull = ++pPa
f3f0: 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 7d  rse->nMem;.    }
f400: 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65  .    sqlite3Code
f410: 53 75 62 73 65 6c 65 63 74 28 70 50 61 72 73 65  Subselect(pParse
f420: 2c 20 70 58 2c 20 72 4d 61 79 48 61 76 65 4e 75  , pX, rMayHaveNu
f430: 6c 6c 2c 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e  ll, eType==IN_IN
f440: 44 45 58 5f 52 4f 57 49 44 29 3b 0a 20 20 20 20  DEX_ROWID);.    
f450: 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f  pParse->nQueryLo
f460: 6f 70 20 3d 20 73 61 76 65 64 4e 51 75 65 72 79  op = savedNQuery
f470: 4c 6f 6f 70 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Loop;.  }else{. 
f480: 20 20 20 70 58 2d 3e 69 54 61 62 6c 65 20 3d 20     pX->iTable = 
f490: 69 54 61 62 3b 0a 20 20 7d 0a 20 20 72 65 74 75  iTab;.  }.  retu
f4a0: 72 6e 20 65 54 79 70 65 3b 0a 7d 0a 23 65 6e 64  rn eType;.}.#end
f4b0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  if../*.** Genera
f4c0: 74 65 20 63 6f 64 65 20 66 6f 72 20 73 63 61 6c  te code for scal
f4d0: 61 72 20 73 75 62 71 75 65 72 69 65 73 20 75 73  ar subqueries us
f4e0: 65 64 20 61 73 20 61 20 73 75 62 71 75 65 72 79  ed as a subquery
f4f0: 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 45 58 49   expression, EXI
f500: 53 54 53 2c 0a 2a 2a 20 6f 72 20 49 4e 20 6f 70  STS,.** or IN op
f510: 65 72 61 74 6f 72 73 2e 20 20 45 78 61 6d 70 6c  erators.  Exampl
f520: 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 53  es:.**.**     (S
f530: 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 62 29 20  ELECT a FROM b) 
f540: 20 20 20 20 20 20 20 20 20 2d 2d 20 73 75 62 71           -- subq
f550: 75 65 72 79 0a 2a 2a 20 20 20 20 20 45 58 49 53  uery.**     EXIS
f560: 54 53 20 28 53 45 4c 45 43 54 20 61 20 46 52 4f  TS (SELECT a FRO
f570: 4d 20 62 29 20 20 20 2d 2d 20 45 58 49 53 54 53  M b)   -- EXISTS
f580: 20 73 75 62 71 75 65 72 79 0a 2a 2a 20 20 20 20   subquery.**    
f590: 20 78 20 49 4e 20 28 34 2c 35 2c 31 31 29 20 20   x IN (4,5,11)  
f5a0: 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 49              -- I
f5b0: 4e 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68 20  N operator with 
f5c0: 6c 69 73 74 20 6f 6e 20 72 69 67 68 74 2d 68 61  list on right-ha
f5d0: 6e 64 20 73 69 64 65 0a 2a 2a 20 20 20 20 20 78  nd side.**     x
f5e0: 20 49 4e 20 28 53 45 4c 45 43 54 20 61 20 46 52   IN (SELECT a FR
f5f0: 4f 4d 20 62 29 20 20 20 20 20 2d 2d 20 49 4e 20  OM b)     -- IN 
f600: 6f 70 65 72 61 74 6f 72 20 77 69 74 68 20 73 75  operator with su
f610: 62 71 75 65 72 79 20 6f 6e 20 74 68 65 20 72 69  bquery on the ri
f620: 67 68 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 45  ght.**.** The pE
f630: 78 70 72 20 70 61 72 61 6d 65 74 65 72 20 64 65  xpr parameter de
f640: 73 63 72 69 62 65 73 20 74 68 65 20 65 78 70 72  scribes the expr
f650: 65 73 73 69 6f 6e 20 74 68 61 74 20 63 6f 6e 74  ession that cont
f660: 61 69 6e 73 20 74 68 65 20 49 4e 0a 2a 2a 20 6f  ains the IN.** o
f670: 70 65 72 61 74 6f 72 20 6f 72 20 73 75 62 71 75  perator or subqu
f680: 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61  ery..**.** If pa
f690: 72 61 6d 65 74 65 72 20 69 73 52 6f 77 69 64 20  rameter isRowid 
f6a0: 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
f6b0: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78  n expression pEx
f6c0: 70 72 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  pr is guaranteed
f6d0: 0a 2a 2a 20 74 6f 20 62 65 20 6f 66 20 74 68 65  .** to be of the
f6e0: 20 66 6f 72 6d 20 22 3c 72 6f 77 69 64 3e 20 49   form "<rowid> I
f6f0: 4e 20 28 3f 2c 20 3f 2c 20 3f 29 22 2c 20 77 68  N (?, ?, ?)", wh
f700: 65 72 65 20 3c 72 6f 77 69 64 3e 20 69 73 20 61  ere <rowid> is a
f710: 20 72 65 66 65 72 65 6e 63 65 0a 2a 2a 20 74 6f   reference.** to
f720: 20 73 6f 6d 65 20 69 6e 74 65 67 65 72 20 6b 65   some integer ke
f730: 79 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 20 74 61  y column of a ta
f740: 62 6c 65 20 42 2d 54 72 65 65 2e 20 49 6e 20 74  ble B-Tree. In t
f750: 68 69 73 20 63 61 73 65 2c 20 75 73 65 20 61 6e  his case, use an
f760: 0a 2a 2a 20 69 6e 74 6b 65 79 20 42 2d 54 72 65  .** intkey B-Tre
f770: 65 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 73  e to store the s
f780: 65 74 20 6f 66 20 49 4e 28 2e 2e 2e 29 20 76 61  et of IN(...) va
f790: 6c 75 65 73 20 69 6e 73 74 65 61 64 20 6f 66 20  lues instead of 
f7a0: 74 68 65 20 75 73 75 61 6c 0a 2a 2a 20 28 73 6c  the usual.** (sl
f7b0: 6f 77 65 72 29 20 76 61 72 69 61 62 6c 65 20 6c  ower) variable l
f7c0: 65 6e 67 74 68 20 6b 65 79 73 20 42 2d 54 72 65  ength keys B-Tre
f7d0: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72 4d 61 79  e..**.** If rMay
f7e0: 48 61 76 65 4e 75 6c 6c 20 69 73 20 6e 6f 6e 2d  HaveNull is non-
f7f0: 7a 65 72 6f 2c 20 74 68 61 74 20 6d 65 61 6e 73  zero, that means
f800: 20 74 68 61 74 20 74 68 65 20 6f 70 65 72 61 74   that the operat
f810: 69 6f 6e 20 69 73 20 61 6e 20 49 4e 0a 2a 2a 20  ion is an IN.** 
f820: 28 6e 6f 74 20 61 20 53 45 4c 45 43 54 20 6f 72  (not a SELECT or
f830: 20 45 58 49 53 54 53 29 20 61 6e 64 20 74 68 61   EXISTS) and tha
f840: 74 20 74 68 65 20 52 48 53 20 6d 69 67 68 74 20  t the RHS might 
f850: 63 6f 6e 74 61 69 6e 73 20 4e 55 4c 4c 73 2e 0a  contains NULLs..
f860: 2a 2a 20 41 6c 6c 20 74 68 69 73 20 72 6f 75 74  ** All this rout
f870: 69 6e 65 20 64 6f 65 73 20 69 73 20 69 6e 69 74  ine does is init
f880: 69 61 6c 69 7a 65 20 74 68 65 20 72 65 67 69 73  ialize the regis
f890: 74 65 72 20 67 69 76 65 6e 20 62 79 20 72 4d 61  ter given by rMa
f8a0: 79 48 61 76 65 4e 75 6c 6c 0a 2a 2a 20 74 6f 20  yHaveNull.** to 
f8b0: 4e 55 4c 4c 2e 20 20 43 61 6c 6c 69 6e 67 20 72  NULL.  Calling r
f8c0: 6f 75 74 69 6e 65 73 20 77 69 6c 6c 20 74 61 6b  outines will tak
f8d0: 65 20 63 61 72 65 20 6f 66 20 63 68 61 6e 67 69  e care of changi
f8e0: 6e 67 20 74 68 69 73 20 72 65 67 69 73 74 65 72  ng this register
f8f0: 0a 2a 2a 20 76 61 6c 75 65 20 74 6f 20 6e 6f 6e  .** value to non
f900: 2d 4e 55 4c 4c 20 69 66 20 74 68 65 20 52 48 53  -NULL if the RHS
f910: 20 69 73 20 4e 55 4c 4c 2d 66 72 65 65 2e 0a 2a   is NULL-free..*
f920: 2a 0a 2a 2a 20 46 6f 72 20 61 20 53 45 4c 45 43  *.** For a SELEC
f930: 54 20 6f 72 20 45 58 49 53 54 53 20 6f 70 65 72  T or EXISTS oper
f940: 61 74 6f 72 2c 20 72 65 74 75 72 6e 20 74 68 65  ator, return the
f950: 20 72 65 67 69 73 74 65 72 20 74 68 61 74 20 68   register that h
f960: 6f 6c 64 73 20 74 68 65 0a 2a 2a 20 72 65 73 75  olds the.** resu
f970: 6c 74 2e 20 20 46 6f 72 20 49 4e 20 6f 70 65 72  lt.  For IN oper
f980: 61 74 6f 72 73 20 6f 72 20 69 66 20 61 6e 20 65  ators or if an e
f990: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65  rror occurs, the
f9a0: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73   return value is
f9b0: 20 30 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53   0..*/.#ifndef S
f9c0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
f9d0: 45 52 59 0a 69 6e 74 20 73 71 6c 69 74 65 33 43  ERY.int sqlite3C
f9e0: 6f 64 65 53 75 62 73 65 6c 65 63 74 28 0a 20 20  odeSubselect(.  
f9f0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
fa00: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
fa10: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
fa20: 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20  Expr *pExpr,    
fa30: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 49          /* The I
fa40: 4e 2c 20 53 45 4c 45 43 54 2c 20 6f 72 20 45 58  N, SELECT, or EX
fa50: 49 53 54 53 20 6f 70 65 72 61 74 6f 72 20 2a 2f  ISTS operator */
fa60: 0a 20 20 69 6e 74 20 72 48 61 73 4e 75 6c 6c 46  .  int rHasNullF
fa70: 6c 61 67 2c 20 20 20 20 20 20 20 2f 2a 20 52 65  lag,       /* Re
fa80: 67 69 73 74 65 72 20 74 68 61 74 20 72 65 63 6f  gister that reco
fa90: 72 64 73 20 77 68 65 74 68 65 72 20 4e 55 4c 4c  rds whether NULL
faa0: 73 20 65 78 69 73 74 20 69 6e 20 52 48 53 20 2a  s exist in RHS *
fab0: 2f 0a 20 20 69 6e 74 20 69 73 52 6f 77 69 64 20  /.  int isRowid 
fac0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
fad0: 66 20 74 72 75 65 2c 20 4c 48 53 20 6f 66 20 49  f true, LHS of I
fae0: 4e 20 6f 70 65 72 61 74 6f 72 20 69 73 20 61 20  N operator is a 
faf0: 72 6f 77 69 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e  rowid */.){.  in
fb00: 74 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63 20 3d  t jmpIfDynamic =
fb10: 20 2d 31 3b 20 20 20 20 20 20 20 20 20 20 20 20   -1;            
fb20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65            /* One
fb30: 2d 74 69 6d 65 20 74 65 73 74 20 61 64 64 72 65  -time test addre
fb40: 73 73 20 2a 2f 0a 20 20 69 6e 74 20 72 52 65 67  ss */.  int rReg
fb50: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
fb60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fb70: 2f 2a 20 52 65 67 69 73 74 65 72 20 73 74 6f 72  /* Register stor
fb80: 69 6e 67 20 72 65 73 75 6c 74 69 6e 67 20 2a 2f  ing resulting */
fb90: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c  .  Vdbe *v = sql
fba0: 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
fbb0: 73 65 29 3b 0a 20 20 69 66 28 20 4e 45 56 45 52  se);.  if( NEVER
fbc0: 28 76 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 20  (v==0) ) return 
fbd0: 30 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  0;.  sqlite3Expr
fbe0: 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65  CachePush(pParse
fbf0: 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 63 6f  );..  /* This co
fc00: 64 65 20 6d 75 73 74 20 62 65 20 72 75 6e 20 69  de must be run i
fc10: 6e 20 69 74 73 20 65 6e 74 69 72 65 74 79 20 65  n its entirety e
fc20: 76 65 72 79 20 74 69 6d 65 20 69 74 20 69 73 20  very time it is 
fc30: 65 6e 63 6f 75 6e 74 65 72 65 64 0a 20 20 2a 2a  encountered.  **
fc40: 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20 66   if any of the f
fc50: 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 74 72 75 65  ollowing is true
fc60: 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 2a  :.  **.  **    *
fc70: 20 20 54 68 65 20 72 69 67 68 74 2d 68 61 6e 64    The right-hand
fc80: 20 73 69 64 65 20 69 73 20 61 20 63 6f 72 72 65   side is a corre
fc90: 6c 61 74 65 64 20 73 75 62 71 75 65 72 79 0a 20  lated subquery. 
fca0: 20 2a 2a 20 20 20 20 2a 20 20 54 68 65 20 72 69   **    *  The ri
fcb0: 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 69 73  ght-hand side is
fcc0: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c   an expression l
fcd0: 69 73 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 76  ist containing v
fce0: 61 72 69 61 62 6c 65 73 0a 20 20 2a 2a 20 20 20  ariables.  **   
fcf0: 20 2a 20 20 57 65 20 61 72 65 20 69 6e 73 69 64   *  We are insid
fd00: 65 20 61 20 74 72 69 67 67 65 72 0a 20 20 2a 2a  e a trigger.  **
fd10: 0a 20 20 2a 2a 20 49 66 20 61 6c 6c 20 6f 66 20  .  ** If all of 
fd20: 74 68 65 20 61 62 6f 76 65 20 61 72 65 20 66 61  the above are fa
fd30: 6c 73 65 2c 20 74 68 65 6e 20 77 65 20 63 61 6e  lse, then we can
fd40: 20 72 75 6e 20 74 68 69 73 20 63 6f 64 65 20 6a   run this code j
fd50: 75 73 74 20 6f 6e 63 65 0a 20 20 2a 2a 20 73 61  ust once.  ** sa
fd60: 76 65 20 74 68 65 20 72 65 73 75 6c 74 73 2c 20  ve the results, 
fd70: 61 6e 64 20 72 65 75 73 65 20 74 68 65 20 73 61  and reuse the sa
fd80: 6d 65 20 72 65 73 75 6c 74 20 6f 6e 20 73 75 62  me result on sub
fd90: 73 65 71 75 65 6e 74 20 69 6e 76 6f 63 61 74 69  sequent invocati
fda0: 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ons..  */.  if( 
fdb0: 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
fdc0: 28 70 45 78 70 72 2c 20 45 50 5f 56 61 72 53 65  (pExpr, EP_VarSe
fdd0: 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 6a 6d 70  lect) ){.    jmp
fde0: 49 66 44 79 6e 61 6d 69 63 20 3d 20 73 71 6c 69  IfDynamic = sqli
fdf0: 74 65 33 43 6f 64 65 4f 6e 63 65 28 70 50 61 72  te3CodeOnce(pPar
fe00: 73 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  se); VdbeCoverag
fe10: 65 28 76 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64  e(v);.  }..#ifnd
fe20: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  ef SQLITE_OMIT_E
fe30: 58 50 4c 41 49 4e 0a 20 20 69 66 28 20 70 50 61  XPLAIN.  if( pPa
fe40: 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20  rse->explain==2 
fe50: 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 73  ){.    char *zMs
fe60: 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  g = sqlite3MPrin
fe70: 74 66 28 0a 20 20 20 20 20 20 20 20 70 50 61 72  tf(.        pPar
fe80: 73 65 2d 3e 64 62 2c 20 22 45 58 45 43 55 54 45  se->db, "EXECUTE
fe90: 20 25 73 25 73 20 53 55 42 51 55 45 52 59 20 25   %s%s SUBQUERY %
fea0: 64 22 2c 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63  d", jmpIfDynamic
feb0: 3e 3d 30 3f 22 22 3a 22 43 4f 52 52 45 4c 41 54  >=0?"":"CORRELAT
fec0: 45 44 20 22 2c 0a 20 20 20 20 20 20 20 20 70 45  ED ",.        pE
fed0: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 3f 22  xpr->op==TK_IN?"
fee0: 4c 49 53 54 22 3a 22 53 43 41 4c 41 52 22 2c 20  LIST":"SCALAR", 
fef0: 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c  pParse->iNextSel
ff00: 65 63 74 49 64 0a 20 20 20 20 29 3b 0a 20 20 20  ectId.    );.   
ff10: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
ff20: 70 34 28 76 2c 20 4f 50 5f 45 78 70 6c 61 69 6e  p4(v, OP_Explain
ff30: 2c 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63  , pParse->iSelec
ff40: 74 49 64 2c 20 30 2c 20 30 2c 20 7a 4d 73 67 2c  tId, 0, 0, zMsg,
ff50: 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20   P4_DYNAMIC);.  
ff60: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 73 77 69 74  }.#endif..  swit
ff70: 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b  ch( pExpr->op ){
ff80: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a  .    case TK_IN:
ff90: 20 7b 0a 20 20 20 20 20 20 63 68 61 72 20 61 66   {.      char af
ffa0: 66 69 6e 69 74 79 3b 20 20 20 20 20 20 20 20 20  finity;         
ffb0: 20 20 20 20 20 2f 2a 20 41 66 66 69 6e 69 74 79       /* Affinity
ffc0: 20 6f 66 20 74 68 65 20 4c 48 53 20 6f 66 20 74   of the LHS of t
ffd0: 68 65 20 49 4e 20 2a 2f 0a 20 20 20 20 20 20 69  he IN */.      i
ffe0: 6e 74 20 61 64 64 72 3b 20 20 20 20 20 20 20 20  nt addr;        
fff0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
10000 64 72 65 73 73 20 6f 66 20 4f 50 5f 4f 70 65 6e  dress of OP_Open
10010 45 70 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 75  Ephemeral instru
10020 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45  ction */.      E
10030 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78  xpr *pLeft = pEx
10040 70 72 2d 3e 70 4c 65 66 74 3b 20 2f 2a 20 74 68  pr->pLeft; /* th
10050 65 20 4c 48 53 20 6f 66 20 74 68 65 20 49 4e 20  e LHS of the IN 
10060 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20  operator */.    
10070 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
10080 6e 66 6f 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a  nfo = 0;      /*
10090 20 4b 65 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   Key information
100a0 20 2a 2f 0a 0a 20 20 20 20 20 20 61 66 66 69 6e   */..      affin
100b0 69 74 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ity = sqlite3Exp
100c0 72 41 66 66 69 6e 69 74 79 28 70 4c 65 66 74 29  rAffinity(pLeft)
100d0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57 68 65 74  ;..      /* Whet
100e0 68 65 72 20 74 68 69 73 20 69 73 20 61 6e 20 27  her this is an '
100f0 78 20 49 4e 28 53 45 4c 45 43 54 2e 2e 2e 29 27  x IN(SELECT...)'
10100 20 6f 72 20 61 6e 20 27 78 20 49 4e 28 3c 65 78   or an 'x IN(<ex
10110 70 72 6c 69 73 74 3e 29 27 0a 20 20 20 20 20 20  prlist>)'.      
10120 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 69 74  ** expression it
10130 20 69 73 20 68 61 6e 64 6c 65 64 20 74 68 65 20   is handled the 
10140 73 61 6d 65 20 77 61 79 2e 20 20 41 6e 20 65 70  same way.  An ep
10150 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 69 73  hemeral table is
10160 20 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 6c 65   .      ** fille
10170 64 20 77 69 74 68 20 73 69 6e 67 6c 65 2d 66 69  d with single-fi
10180 65 6c 64 20 69 6e 64 65 78 20 6b 65 79 73 20 72  eld index keys r
10190 65 70 72 65 73 65 6e 74 69 6e 67 20 74 68 65 20  epresenting the 
101a0 72 65 73 75 6c 74 73 0a 20 20 20 20 20 20 2a 2a  results.      **
101b0 20 66 72 6f 6d 20 74 68 65 20 53 45 4c 45 43 54   from the SELECT
101c0 20 6f 72 20 74 68 65 20 3c 65 78 70 72 6c 69 73   or the <exprlis
101d0 74 3e 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  t>..      **.   
101e0 20 20 20 2a 2a 20 49 66 20 74 68 65 20 27 78 27     ** If the 'x'
101f0 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61   expression is a
10200 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 2c 20 6f   column value, o
10210 72 20 74 68 65 20 53 45 4c 45 43 54 2e 2e 2e 0a  r the SELECT....
10220 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65        ** stateme
10230 6e 74 20 72 65 74 75 72 6e 73 20 61 20 63 6f 6c  nt returns a col
10240 75 6d 6e 20 76 61 6c 75 65 2c 20 74 68 65 6e 20  umn value, then 
10250 74 68 65 20 61 66 66 69 6e 69 74 79 20 6f 66 20  the affinity of 
10260 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 63 6f  that.      ** co
10270 6c 75 6d 6e 20 69 73 20 75 73 65 64 20 74 6f 20  lumn is used to 
10280 62 75 69 6c 64 20 74 68 65 20 69 6e 64 65 78 20  build the index 
10290 6b 65 79 73 2e 20 49 66 20 62 6f 74 68 20 27 78  keys. If both 'x
102a0 27 20 61 6e 64 20 74 68 65 0a 20 20 20 20 20 20  ' and the.      
102b0 2a 2a 20 53 45 4c 45 43 54 2e 2e 2e 20 73 74 61  ** SELECT... sta
102c0 74 65 6d 65 6e 74 20 61 72 65 20 63 6f 6c 75 6d  tement are colum
102d0 6e 73 2c 20 74 68 65 6e 20 6e 75 6d 65 72 69 63  ns, then numeric
102e0 20 61 66 66 69 6e 69 74 79 20 69 73 20 75 73 65   affinity is use
102f0 64 0a 20 20 20 20 20 20 2a 2a 20 69 66 20 65 69  d.      ** if ei
10300 74 68 65 72 20 63 6f 6c 75 6d 6e 20 68 61 73 20  ther column has 
10310 4e 55 4d 45 52 49 43 20 6f 72 20 49 4e 54 45 47  NUMERIC or INTEG
10320 45 52 20 61 66 66 69 6e 69 74 79 2e 20 49 66 20  ER affinity. If 
10330 6e 65 69 74 68 65 72 0a 20 20 20 20 20 20 2a 2a  neither.      **
10340 20 27 78 27 20 6e 6f 72 20 74 68 65 20 53 45 4c   'x' nor the SEL
10350 45 43 54 2e 2e 2e 20 73 74 61 74 65 6d 65 6e 74  ECT... statement
10360 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2c 20 74 68   are columns, th
10370 65 6e 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e  en numeric affin
10380 69 74 79 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  ity.      ** is 
10390 75 73 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  used..      */. 
103a0 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62       pExpr->iTab
103b0 6c 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  le = pParse->nTa
103c0 62 2b 2b 3b 0a 20 20 20 20 20 20 61 64 64 72 20  b++;.      addr 
103d0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
103e0 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70  Op2(v, OP_OpenEp
103f0 68 65 6d 65 72 61 6c 2c 20 70 45 78 70 72 2d 3e  hemeral, pExpr->
10400 69 54 61 62 6c 65 2c 20 21 69 73 52 6f 77 69 64  iTable, !isRowid
10410 29 3b 0a 20 20 20 20 20 20 70 4b 65 79 49 6e 66  );.      pKeyInf
10420 6f 20 3d 20 69 73 52 6f 77 69 64 20 3f 20 30 20  o = isRowid ? 0 
10430 3a 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  : sqlite3KeyInfo
10440 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64 62  Alloc(pParse->db
10450 2c 20 31 2c 20 31 29 3b 0a 0a 20 20 20 20 20 20  , 1, 1);..      
10460 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
10470 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49  rty(pExpr, EP_xI
10480 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20  sSelect) ){.    
10490 20 20 20 20 2f 2a 20 43 61 73 65 20 31 3a 20 20      /* Case 1:  
104a0 20 20 20 65 78 70 72 20 49 4e 20 28 53 45 4c 45     expr IN (SELE
104b0 43 54 20 2e 2e 2e 29 0a 20 20 20 20 20 20 20 20  CT ...).        
104c0 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 47 65  **.        ** Ge
104d0 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 77  nerate code to w
104e0 72 69 74 65 20 74 68 65 20 72 65 73 75 6c 74 73  rite the results
104f0 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 20 69   of the select i
10500 6e 74 6f 20 74 68 65 20 74 65 6d 70 6f 72 61 72  nto the temporar
10510 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62  y.        ** tab
10520 6c 65 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  le allocated and
10530 20 6f 70 65 6e 65 64 20 61 62 6f 76 65 2e 0a 20   opened above.. 
10540 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
10550 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63    Select *pSelec
10560 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 53 65  t = pExpr->x.pSe
10570 6c 65 63 74 3b 0a 20 20 20 20 20 20 20 20 53 65  lect;.        Se
10580 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b 0a 20  lectDest dest;. 
10590 20 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20         ExprList 
105a0 2a 70 45 4c 69 73 74 3b 0a 0a 20 20 20 20 20 20  *pEList;..      
105b0 20 20 61 73 73 65 72 74 28 20 21 69 73 52 6f 77    assert( !isRow
105c0 69 64 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  id );.        sq
105d0 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49  lite3SelectDestI
105e0 6e 69 74 28 26 64 65 73 74 2c 20 53 52 54 5f 53  nit(&dest, SRT_S
105f0 65 74 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  et, pExpr->iTabl
10600 65 29 3b 0a 20 20 20 20 20 20 20 20 64 65 73 74  e);.        dest
10610 2e 61 66 66 53 64 73 74 20 3d 20 28 75 38 29 61  .affSdst = (u8)a
10620 66 66 69 6e 69 74 79 3b 0a 20 20 20 20 20 20 20  ffinity;.       
10630 20 61 73 73 65 72 74 28 20 28 70 45 78 70 72 2d   assert( (pExpr-
10640 3e 69 54 61 62 6c 65 26 30 78 30 30 30 30 46 46  >iTable&0x0000FF
10650 46 46 29 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62  FF)==pExpr->iTab
10660 6c 65 20 29 3b 0a 20 20 20 20 20 20 20 20 70 53  le );.        pS
10670 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 20 3d 20  elect->iLimit = 
10680 30 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  0;.        testc
10690 61 73 65 28 20 70 53 65 6c 65 63 74 2d 3e 73 65  ase( pSelect->se
106a0 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74  lFlags & SF_Dist
106b0 69 6e 63 74 20 29 3b 0a 20 20 20 20 20 20 20 20  inct );.        
106c0 74 65 73 74 63 61 73 65 28 20 70 4b 65 79 49 6e  testcase( pKeyIn
106d0 66 6f 3d 3d 30 20 29 3b 20 2f 2a 20 43 61 75 73  fo==0 ); /* Caus
106e0 65 64 20 62 79 20 4f 4f 4d 20 69 6e 20 73 71 6c  ed by OOM in sql
106f0 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63  ite3KeyInfoAlloc
10700 28 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66  () */.        if
10710 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  ( sqlite3Select(
10720 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2c  pParse, pSelect,
10730 20 26 64 65 73 74 29 20 29 7b 0a 20 20 20 20 20   &dest) ){.     
10740 20 20 20 20 20 73 71 6c 69 74 65 33 4b 65 79 49       sqlite3KeyI
10750 6e 66 6f 55 6e 72 65 66 28 70 4b 65 79 49 6e 66  nfoUnref(pKeyInf
10760 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  o);.          re
10770 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 20 20  turn 0;.        
10780 7d 0a 20 20 20 20 20 20 20 20 70 45 4c 69 73 74  }.        pEList
10790 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69   = pSelect->pELi
107a0 73 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  st;.        asse
107b0 72 74 28 20 70 4b 65 79 49 6e 66 6f 21 3d 30 20  rt( pKeyInfo!=0 
107c0 29 3b 20 2f 2a 20 4f 4f 4d 20 77 69 6c 6c 20 63  ); /* OOM will c
107d0 61 75 73 65 20 65 78 69 74 20 61 66 74 65 72 20  ause exit after 
107e0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29 20  sqlite3Select() 
107f0 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  */.        asser
10800 74 28 20 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a  t( pEList!=0 );.
10810 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
10820 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20  pEList->nExpr>0 
10830 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
10840 74 28 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66  t( sqlite3KeyInf
10850 6f 49 73 57 72 69 74 65 61 62 6c 65 28 70 4b 65  oIsWriteable(pKe
10860 79 49 6e 66 6f 29 20 29 3b 0a 20 20 20 20 20 20  yInfo) );.      
10870 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c    pKeyInfo->aCol
10880 6c 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 42 69  l[0] = sqlite3Bi
10890 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53  naryCompareCollS
108a0 65 71 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  eq(pParse, pExpr
108b0 2d 3e 70 4c 65 66 74 2c 0a 20 20 20 20 20 20 20  ->pLeft,.       
108c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
108d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
108e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
108f0 20 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70    pEList->a[0].p
10900 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c  Expr);.      }el
10910 73 65 20 69 66 28 20 41 4c 57 41 59 53 28 70 45  se if( ALWAYS(pE
10920 78 70 72 2d 3e 78 2e 70 4c 69 73 74 21 3d 30 29  xpr->x.pList!=0)
10930 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43   ){.        /* C
10940 61 73 65 20 32 3a 20 20 20 20 20 65 78 70 72 20  ase 2:     expr 
10950 49 4e 20 28 65 78 70 72 6c 69 73 74 29 0a 20 20  IN (exprlist).  
10960 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
10970 20 2a 2a 20 46 6f 72 20 65 61 63 68 20 65 78 70   ** For each exp
10980 72 65 73 73 69 6f 6e 2c 20 62 75 69 6c 64 20 61  ression, build a
10990 6e 20 69 6e 64 65 78 20 6b 65 79 20 66 72 6f 6d  n index key from
109a0 20 74 68 65 20 65 76 61 6c 75 61 74 69 6f 6e 20   the evaluation 
109b0 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 73  and.        ** s
109c0 74 6f 72 65 20 69 74 20 69 6e 20 74 68 65 20 74  tore it in the t
109d0 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2e 20  emporary table. 
109e0 49 66 20 3c 65 78 70 72 3e 20 69 73 20 61 20 63  If <expr> is a c
109f0 6f 6c 75 6d 6e 2c 20 74 68 65 6e 20 75 73 65 0a  olumn, then use.
10a00 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20          ** that 
10a10 63 6f 6c 75 6d 6e 73 20 61 66 66 69 6e 69 74 79  columns affinity
10a20 20 77 68 65 6e 20 62 75 69 6c 64 69 6e 67 20 69   when building i
10a30 6e 64 65 78 20 6b 65 79 73 2e 20 49 66 20 3c 65  ndex keys. If <e
10a40 78 70 72 3e 20 69 73 20 6e 6f 74 0a 20 20 20 20  xpr> is not.    
10a50 20 20 20 20 2a 2a 20 61 20 63 6f 6c 75 6d 6e 2c      ** a column,
10a60 20 75 73 65 20 6e 75 6d 65 72 69 63 20 61 66 66   use numeric aff
10a70 69 6e 69 74 79 2e 0a 20 20 20 20 20 20 20 20 2a  inity..        *
10a80 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b  /.        int i;
10a90 0a 20 20 20 20 20 20 20 20 45 78 70 72 4c 69 73  .        ExprLis
10aa0 74 20 2a 70 4c 69 73 74 20 3d 20 70 45 78 70 72  t *pList = pExpr
10ab0 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20  ->x.pList;.     
10ac0 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
10ad0 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
10ae0 20 20 20 20 20 20 20 20 69 6e 74 20 72 31 2c 20          int r1, 
10af0 72 32 2c 20 72 33 3b 0a 0a 20 20 20 20 20 20 20  r2, r3;..       
10b00 20 69 66 28 20 21 61 66 66 69 6e 69 74 79 20 29   if( !affinity )
10b10 7b 0a 20 20 20 20 20 20 20 20 20 20 61 66 66 69  {.          affi
10b20 6e 69 74 79 20 3d 20 53 51 4c 49 54 45 5f 41 46  nity = SQLITE_AF
10b30 46 5f 42 4c 4f 42 3b 0a 20 20 20 20 20 20 20 20  F_BLOB;.        
10b40 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4b  }.        if( pK
10b50 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20  eyInfo ){.      
10b60 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
10b70 74 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74  te3KeyInfoIsWrit
10b80 65 61 62 6c 65 28 70 4b 65 79 49 6e 66 6f 29 20  eable(pKeyInfo) 
10b90 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4b 65  );.          pKe
10ba0 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 30 5d 20  yInfo->aColl[0] 
10bb0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
10bc0 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 45 78  lSeq(pParse, pEx
10bd0 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20  pr->pLeft);.    
10be0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f      }..        /
10bf0 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 65  * Loop through e
10c00 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e 20 69  ach expression i
10c10 6e 20 3c 65 78 70 72 6c 69 73 74 3e 2e 20 2a 2f  n <exprlist>. */
10c20 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20 73 71  .        r1 = sq
10c30 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
10c40 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
10c50 20 72 32 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r2 = sqlite3Get
10c60 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
10c70 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 73 52  .        if( isR
10c80 6f 77 69 64 20 29 20 73 71 6c 69 74 65 33 56 64  owid ) sqlite3Vd
10c90 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
10ca0 75 6c 6c 2c 20 30 2c 20 72 32 29 3b 0a 20 20 20  ull, 0, r2);.   
10cb0 20 20 20 20 20 66 6f 72 28 69 3d 70 4c 69 73 74       for(i=pList
10cc0 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d 70  ->nExpr, pItem=p
10cd0 4c 69 73 74 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d  List->a; i>0; i-
10ce0 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  -, pItem++){.   
10cf0 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 32         Expr *pE2
10d00 20 3d 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 3b   = pItem->pExpr;
10d10 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69  .          int i
10d20 56 61 6c 54 6f 49 6e 73 3b 0a 0a 20 20 20 20 20  ValToIns;..     
10d30 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 65       /* If the e
10d40 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6e 6f 74  xpression is not
10d50 20 63 6f 6e 73 74 61 6e 74 20 74 68 65 6e 20 77   constant then w
10d60 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 0a 20  e will need to. 
10d70 20 20 20 20 20 20 20 20 20 2a 2a 20 64 69 73 61           ** disa
10d80 62 6c 65 20 74 68 65 20 74 65 73 74 20 74 68 61  ble the test tha
10d90 74 20 77 61 73 20 67 65 6e 65 72 61 74 65 64 20  t was generated 
10da0 61 62 6f 76 65 20 74 68 61 74 20 6d 61 6b 65 73  above that makes
10db0 20 73 75 72 65 0a 20 20 20 20 20 20 20 20 20 20   sure.          
10dc0 2a 2a 20 74 68 69 73 20 63 6f 64 65 20 6f 6e 6c  ** this code onl
10dd0 79 20 65 78 65 63 75 74 65 73 20 6f 6e 63 65 2e  y executes once.
10de0 20 20 42 65 63 61 75 73 65 20 66 6f 72 20 61 20    Because for a 
10df0 6e 6f 6e 2d 63 6f 6e 73 74 61 6e 74 0a 20 20 20  non-constant.   
10e00 20 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65 73         ** expres
10e10 73 69 6f 6e 20 77 65 20 6e 65 65 64 20 74 6f 20  sion we need to 
10e20 72 65 72 75 6e 20 74 68 69 73 20 63 6f 64 65 20  rerun this code 
10e30 65 61 63 68 20 74 69 6d 65 2e 0a 20 20 20 20 20  each time..     
10e40 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
10e50 20 20 69 66 28 20 6a 6d 70 49 66 44 79 6e 61 6d    if( jmpIfDynam
10e60 69 63 3e 3d 30 20 26 26 20 21 73 71 6c 69 74 65  ic>=0 && !sqlite
10e70 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28  3ExprIsConstant(
10e80 70 45 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20  pE2) ){.        
10e90 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
10ea0 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 6a  hangeToNoop(v, j
10eb0 6d 70 49 66 44 79 6e 61 6d 69 63 29 3b 0a 20 20  mpIfDynamic);.  
10ec0 20 20 20 20 20 20 20 20 20 20 6a 6d 70 49 66 44            jmpIfD
10ed0 79 6e 61 6d 69 63 20 3d 20 2d 31 3b 0a 20 20 20  ynamic = -1;.   
10ee0 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
10ef0 20 20 20 20 2f 2a 20 45 76 61 6c 75 61 74 65 20      /* Evaluate 
10f00 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 61  the expression a
10f10 6e 64 20 69 6e 73 65 72 74 20 69 74 20 69 6e 74  nd insert it int
10f20 6f 20 74 68 65 20 74 65 6d 70 20 74 61 62 6c 65  o the temp table
10f30 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
10f40 28 20 69 73 52 6f 77 69 64 20 26 26 20 73 71 6c  ( isRowid && sql
10f50 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65  ite3ExprIsIntege
10f60 72 28 70 45 32 2c 20 26 69 56 61 6c 54 6f 49 6e  r(pE2, &iValToIn
10f70 73 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  s) ){.          
10f80 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
10f90 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74  Op3(v, OP_Insert
10fa0 49 6e 74 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  Int, pExpr->iTab
10fb0 6c 65 2c 20 72 32 2c 20 69 56 61 6c 54 6f 49 6e  le, r2, iValToIn
10fc0 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  s);.          }e
10fd0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
10fe0 20 72 33 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r3 = sqlite3Exp
10ff0 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72  rCodeTarget(pPar
11000 73 65 2c 20 70 45 32 2c 20 72 31 29 3b 0a 20 20  se, pE2, r1);.  
11010 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 73            if( is
11020 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20 20  Rowid ){.       
11030 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
11040 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4d  beAddOp2(v, OP_M
11050 75 73 74 42 65 49 6e 74 2c 20 72 33 2c 0a 20 20  ustBeInt, r3,.  
11060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
11080 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
11090 41 64 64 72 28 76 29 2b 32 29 3b 0a 20 20 20 20  Addr(v)+2);.    
110a0 20 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f            VdbeCo
110b0 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
110c0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
110d0 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
110e0 5f 49 6e 73 65 72 74 2c 20 70 45 78 70 72 2d 3e  _Insert, pExpr->
110f0 69 54 61 62 6c 65 2c 20 72 32 2c 20 72 33 29 3b  iTable, r2, r3);
11100 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c  .            }el
11110 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
11120 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
11130 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op4(v, OP_MakeRe
11140 63 6f 72 64 2c 20 72 33 2c 20 31 2c 20 72 32 2c  cord, r3, 1, r2,
11150 20 26 61 66 66 69 6e 69 74 79 2c 20 31 29 3b 0a   &affinity, 1);.
11160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
11170 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66  lite3ExprCacheAf
11180 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61  finityChange(pPa
11190 72 73 65 2c 20 72 33 2c 20 31 29 3b 0a 20 20 20  rse, r3, 1);.   
111a0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
111b0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
111c0 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 70 45  OP_IdxInsert, pE
111d0 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 72 32 29  xpr->iTable, r2)
111e0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
111f0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
11200 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
11210 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
11220 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b  Reg(pParse, r1);
11230 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
11240 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
11250 50 61 72 73 65 2c 20 72 32 29 3b 0a 20 20 20 20  Parse, r2);.    
11260 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 4b    }.      if( pK
11270 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20  eyInfo ){.      
11280 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
11290 6e 67 65 50 34 28 76 2c 20 61 64 64 72 2c 20 28  ngeP4(v, addr, (
112a0 76 6f 69 64 20 2a 29 70 4b 65 79 49 6e 66 6f 2c  void *)pKeyInfo,
112b0 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20   P4_KEYINFO);.  
112c0 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
112d0 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61  k;.    }..    ca
112e0 73 65 20 54 4b 5f 45 58 49 53 54 53 3a 0a 20 20  se TK_EXISTS:.  
112f0 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54    case TK_SELECT
11300 3a 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  :.    default: {
11310 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69  .      /* If thi
11320 73 20 68 61 73 20 74 6f 20 62 65 20 61 20 73 63  s has to be a sc
11330 61 6c 61 72 20 53 45 4c 45 43 54 2e 20 20 47 65  alar SELECT.  Ge
11340 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 70  nerate code to p
11350 75 74 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  ut the.      ** 
11360 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20 73 65  value of this se
11370 6c 65 63 74 20 69 6e 20 61 20 6d 65 6d 6f 72 79  lect in a memory
11380 20 63 65 6c 6c 20 61 6e 64 20 72 65 63 6f 72 64   cell and record
11390 20 74 68 65 20 6e 75 6d 62 65 72 0a 20 20 20 20   the number.    
113a0 20 20 2a 2a 20 6f 66 20 74 68 65 20 6d 65 6d 6f    ** of the memo
113b0 72 79 20 63 65 6c 6c 20 69 6e 20 69 43 6f 6c 75  ry cell in iColu
113c0 6d 6e 2e 20 20 49 66 20 74 68 69 73 20 69 73 20  mn.  If this is 
113d0 61 6e 20 45 58 49 53 54 53 2c 20 77 72 69 74 65  an EXISTS, write
113e0 0a 20 20 20 20 20 20 2a 2a 20 61 6e 20 69 6e 74  .      ** an int
113f0 65 67 65 72 20 30 20 28 6e 6f 74 20 65 78 69 73  eger 0 (not exis
11400 74 73 29 20 6f 72 20 31 20 28 65 78 69 73 74 73  ts) or 1 (exists
11410 29 20 69 6e 74 6f 20 61 20 6d 65 6d 6f 72 79 20  ) into a memory 
11420 63 65 6c 6c 0a 20 20 20 20 20 20 2a 2a 20 61 6e  cell.      ** an
11430 64 20 72 65 63 6f 72 64 20 74 68 61 74 20 6d 65  d record that me
11440 6d 6f 72 79 20 63 65 6c 6c 20 69 6e 20 69 43 6f  mory cell in iCo
11450 6c 75 6d 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  lumn..      */. 
11460 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 65       Select *pSe
11470 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
11480 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 45             /* SE
11490 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74  LECT statement t
114a0 6f 20 65 6e 63 6f 64 65 20 2a 2f 0a 20 20 20 20  o encode */.    
114b0 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73    SelectDest des
114c0 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
114d0 20 20 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 74          /* How t
114e0 6f 20 64 65 61 6c 20 77 69 74 68 20 53 45 4c 45  o deal with SELE
114f0 43 74 20 72 65 73 75 6c 74 20 2a 2f 0a 0a 20 20  Ct result */..  
11500 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
11510 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53  xpr->op==TK_EXIS
11520 54 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  TS );.      test
11530 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
11540 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 20 20  =TK_SELECT );.  
11550 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
11560 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53 54 53  r->op==TK_EXISTS
11570 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54   || pExpr->op==T
11580 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 0a 20 20 20  K_SELECT );..   
11590 20 20 20 61 73 73 65 72 74 28 20 45 78 70 72 48     assert( ExprH
115a0 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
115b0 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
115c0 29 3b 0a 20 20 20 20 20 20 70 53 65 6c 20 3d 20  );.      pSel = 
115d0 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74  pExpr->x.pSelect
115e0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  ;.      sqlite3S
115f0 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64  electDestInit(&d
11600 65 73 74 2c 20 30 2c 20 2b 2b 70 50 61 72 73 65  est, 0, ++pParse
11610 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 20 20 20 20 69  ->nMem);.      i
11620 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  f( pExpr->op==TK
11630 5f 53 45 4c 45 43 54 20 29 7b 0a 20 20 20 20 20  _SELECT ){.     
11640 20 20 20 64 65 73 74 2e 65 44 65 73 74 20 3d 20     dest.eDest = 
11650 53 52 54 5f 4d 65 6d 3b 0a 20 20 20 20 20 20 20  SRT_Mem;.       
11660 20 64 65 73 74 2e 69 53 64 73 74 20 3d 20 64 65   dest.iSdst = de
11670 73 74 2e 69 53 44 50 61 72 6d 3b 0a 20 20 20 20  st.iSDParm;.    
11680 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
11690 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp2(v, OP_Null
116a0 2c 20 30 2c 20 64 65 73 74 2e 69 53 44 50 61 72  , 0, dest.iSDPar
116b0 6d 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  m);.        Vdbe
116c0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 49 6e 69  Comment((v, "Ini
116d0 74 20 73 75 62 71 75 65 72 79 20 72 65 73 75 6c  t subquery resul
116e0 74 22 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  t"));.      }els
116f0 65 7b 0a 20 20 20 20 20 20 20 20 64 65 73 74 2e  e{.        dest.
11700 65 44 65 73 74 20 3d 20 53 52 54 5f 45 78 69 73  eDest = SRT_Exis
11710 74 73 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  ts;.        sqli
11720 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
11730 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
11740 64 65 73 74 2e 69 53 44 50 61 72 6d 29 3b 0a 20  dest.iSDParm);. 
11750 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65         VdbeComme
11760 6e 74 28 28 76 2c 20 22 49 6e 69 74 20 45 58 49  nt((v, "Init EXI
11770 53 54 53 20 72 65 73 75 6c 74 22 29 29 3b 0a 20  STS result"));. 
11780 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
11790 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70  ite3ExprDelete(p
117a0 50 61 72 73 65 2d 3e 64 62 2c 20 70 53 65 6c 2d  Parse->db, pSel-
117b0 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20  >pLimit);.      
117c0 70 53 65 6c 2d 3e 70 4c 69 6d 69 74 20 3d 20 73  pSel->pLimit = s
117d0 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
117e0 73 65 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c 20  se, TK_INTEGER, 
117f0 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  0, 0,.          
11800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11810 20 20 20 20 20 20 20 20 26 73 71 6c 69 74 65 33          &sqlite3
11820 49 6e 74 54 6f 6b 65 6e 73 5b 31 5d 29 3b 0a 20  IntTokens[1]);. 
11830 20 20 20 20 20 70 53 65 6c 2d 3e 69 4c 69 6d 69       pSel->iLimi
11840 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 53 65  t = 0;.      pSe
11850 6c 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e  l->selFlags &= ~
11860 53 46 5f 4d 75 6c 74 69 56 61 6c 75 65 3b 0a 20  SF_MultiValue;. 
11870 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
11880 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
11890 53 65 6c 2c 20 26 64 65 73 74 29 20 29 7b 0a 20  Sel, &dest) ){. 
118a0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b         return 0;
118b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
118c0 52 65 67 20 3d 20 64 65 73 74 2e 69 53 44 50 61  Reg = dest.iSDPa
118d0 72 6d 3b 0a 20 20 20 20 20 20 45 78 70 72 53 65  rm;.      ExprSe
118e0 74 56 56 41 50 72 6f 70 65 72 74 79 28 70 45 78  tVVAProperty(pEx
118f0 70 72 2c 20 45 50 5f 4e 6f 52 65 64 75 63 65 29  pr, EP_NoReduce)
11900 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
11910 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
11920 72 48 61 73 4e 75 6c 6c 46 6c 61 67 20 29 7b 0a  rHasNullFlag ){.
11930 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 48 61      sqlite3SetHa
11940 73 4e 75 6c 6c 46 6c 61 67 28 76 2c 20 70 45 78  sNullFlag(v, pEx
11950 70 72 2d 3e 69 54 61 62 6c 65 2c 20 72 48 61 73  pr->iTable, rHas
11960 4e 75 6c 6c 46 6c 61 67 29 3b 0a 20 20 7d 0a 0a  NullFlag);.  }..
11970 20 20 69 66 28 20 6a 6d 70 49 66 44 79 6e 61 6d    if( jmpIfDynam
11980 69 63 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ic>=0 ){.    sql
11990 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
119a0 28 76 2c 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63  (v, jmpIfDynamic
119b0 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
119c0 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61  ExprCachePop(pPa
119d0 72 73 65 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  rse);..  return 
119e0 72 52 65 67 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  rReg;.}.#endif /
119f0 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  * SQLITE_OMIT_SU
11a00 42 51 55 45 52 59 20 2a 2f 0a 0a 23 69 66 6e 64  BQUERY */..#ifnd
11a10 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
11a20 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 47 65  UBQUERY./*.** Ge
11a30 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
11a40 61 6e 20 49 4e 20 65 78 70 72 65 73 73 69 6f 6e  an IN expression
11a50 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 78 20 49  ..**.**      x I
11a60 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 2a  N (SELECT ...).*
11a70 2a 20 20 20 20 20 20 78 20 49 4e 20 28 76 61 6c  *      x IN (val
11a80 75 65 2c 20 76 61 6c 75 65 2c 20 2e 2e 2e 29 0a  ue, value, ...).
11a90 2a 2a 0a 2a 2a 20 54 68 65 20 6c 65 66 74 2d 68  **.** The left-h
11aa0 61 6e 64 20 73 69 64 65 20 28 4c 48 53 29 20 69  and side (LHS) i
11ab0 73 20 61 20 73 63 61 6c 61 72 20 65 78 70 72 65  s a scalar expre
11ac0 73 73 69 6f 6e 2e 20 20 54 68 65 20 72 69 67 68  ssion.  The righ
11ad0 74 2d 68 61 6e 64 20 73 69 64 65 20 28 52 48 53  t-hand side (RHS
11ae0 29 0a 2a 2a 20 69 73 20 61 6e 20 61 72 72 61 79  ).** is an array
11af0 20 6f 66 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65   of zero or more
11b00 20 76 61 6c 75 65 73 2e 20 20 54 68 65 20 65 78   values.  The ex
11b10 70 72 65 73 73 69 6f 6e 20 69 73 20 74 72 75 65  pression is true
11b20 20 69 66 20 74 68 65 20 4c 48 53 20 69 73 0a 2a   if the LHS is.*
11b30 2a 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68  * contained with
11b40 69 6e 20 74 68 65 20 52 48 53 2e 20 20 54 68 65  in the RHS.  The
11b50 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 65 78   value of the ex
11b60 70 72 65 73 73 69 6f 6e 20 69 73 20 75 6e 6b 6e  pression is unkn
11b70 6f 77 6e 20 28 4e 55 4c 4c 29 0a 2a 2a 20 69 66  own (NULL).** if
11b80 20 74 68 65 20 4c 48 53 20 69 73 20 4e 55 4c 4c   the LHS is NULL
11b90 20 6f 72 20 69 66 20 74 68 65 20 4c 48 53 20 69   or if the LHS i
11ba0 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20  s not contained 
11bb0 77 69 74 68 69 6e 20 74 68 65 20 52 48 53 20 61  within the RHS a
11bc0 6e 64 20 74 68 65 0a 2a 2a 20 52 48 53 20 63 6f  nd the.** RHS co
11bd0 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f  ntains one or mo
11be0 72 65 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2e 0a  re NULL values..
11bf0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
11c00 6e 65 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64  ne generates cod
11c10 65 20 74 68 61 74 20 6a 75 6d 70 73 20 74 6f 20  e that jumps to 
11c20 64 65 73 74 49 66 46 61 6c 73 65 20 69 66 20 74  destIfFalse if t
11c30 68 65 20 4c 48 53 20 69 73 20 6e 6f 74 20 0a 2a  he LHS is not .*
11c40 2a 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68  * contained with
11c50 69 6e 20 74 68 65 20 52 48 53 2e 20 20 49 66 20  in the RHS.  If 
11c60 64 75 65 20 74 6f 20 4e 55 4c 4c 73 20 77 65 20  due to NULLs we 
11c70 63 61 6e 6e 6f 74 20 64 65 74 65 72 6d 69 6e 65  cannot determine
11c80 20 69 66 20 74 68 65 20 4c 48 53 0a 2a 2a 20 69   if the LHS.** i
11c90 73 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74  s contained in t
11ca0 68 65 20 52 48 53 20 74 68 65 6e 20 6a 75 6d 70  he RHS then jump
11cb0 20 74 6f 20 64 65 73 74 49 66 4e 75 6c 6c 2e 20   to destIfNull. 
11cc0 20 49 66 20 74 68 65 20 4c 48 53 20 69 73 20 63   If the LHS is c
11cd0 6f 6e 74 61 69 6e 65 64 0a 2a 2a 20 77 69 74 68  ontained.** with
11ce0 69 6e 20 74 68 65 20 52 48 53 20 74 68 65 6e 20  in the RHS then 
11cf0 66 61 6c 6c 20 74 68 72 6f 75 67 68 2e 0a 2a 2f  fall through..*/
11d00 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c  .static void sql
11d10 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e 28 0a  ite3ExprCodeIN(.
11d20 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
11d30 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
11d40 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65  ng and code gene
11d50 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  rating context *
11d60 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c  /.  Expr *pExpr,
11d70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
11d80 20 49 4e 20 65 78 70 72 65 73 73 69 6f 6e 20 2a   IN expression *
11d90 2f 0a 20 20 69 6e 74 20 64 65 73 74 49 66 46 61  /.  int destIfFa
11da0 6c 73 65 2c 20 20 20 20 20 20 2f 2a 20 4a 75 6d  lse,      /* Jum
11db0 70 20 68 65 72 65 20 69 66 20 4c 48 53 20 69 73  p here if LHS is
11dc0 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20 69   not contained i
11dd0 6e 20 74 68 65 20 52 48 53 20 2a 2f 0a 20 20 69  n the RHS */.  i
11de0 6e 74 20 64 65 73 74 49 66 4e 75 6c 6c 20 20 20  nt destIfNull   
11df0 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72       /* Jump her
11e00 65 20 69 66 20 74 68 65 20 72 65 73 75 6c 74 73  e if the results
11e10 20 61 72 65 20 75 6e 6b 6e 6f 77 6e 20 64 75 65   are unknown due
11e20 20 74 6f 20 4e 55 4c 4c 73 20 2a 2f 0a 29 7b 0a   to NULLs */.){.
11e30 20 20 69 6e 74 20 72 52 68 73 48 61 73 4e 75 6c    int rRhsHasNul
11e40 6c 20 3d 20 30 3b 20 20 2f 2a 20 52 65 67 69 73  l = 0;  /* Regis
11e50 74 65 72 20 74 68 61 74 20 69 73 20 74 72 75 65  ter that is true
11e60 20 69 66 20 52 48 53 20 63 6f 6e 74 61 69 6e 73   if RHS contains
11e70 20 4e 55 4c 4c 20 76 61 6c 75 65 73 20 2a 2f 0a   NULL values */.
11e80 20 20 63 68 61 72 20 61 66 66 69 6e 69 74 79 3b    char affinity;
11e90 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 61          /* Compa
11ea0 72 69 73 6f 6e 20 61 66 66 69 6e 69 74 79 20 74  rison affinity t
11eb0 6f 20 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 65  o use */.  int e
11ec0 54 79 70 65 3b 20 20 20 20 20 20 20 20 20 20 20  Type;           
11ed0 20 2f 2a 20 54 79 70 65 20 6f 66 20 74 68 65 20   /* Type of the 
11ee0 52 48 53 20 2a 2f 0a 20 20 69 6e 74 20 72 31 3b  RHS */.  int r1;
11ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11f00 2a 20 54 65 6d 70 6f 72 61 72 79 20 75 73 65 20  * Temporary use 
11f10 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 56 64  register */.  Vd
11f20 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20  be *v;          
11f30 20 20 20 20 2f 2a 20 53 74 61 74 65 6d 65 6e 74      /* Statement
11f40 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
11f50 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 43 6f 6d  ion */..  /* Com
11f60 70 75 74 65 20 74 68 65 20 52 48 53 2e 20 20 20  pute the RHS.   
11f70 41 66 74 65 72 20 74 68 69 73 20 73 74 65 70 2c  After this step,
11f80 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20   the table with 
11f90 63 75 72 73 6f 72 0a 20 20 2a 2a 20 70 45 78 70  cursor.  ** pExp
11fa0 72 2d 3e 69 54 61 62 6c 65 20 77 69 6c 6c 20 63  r->iTable will c
11fb0 6f 6e 74 61 69 6e 73 20 74 68 65 20 76 61 6c 75  ontains the valu
11fc0 65 73 20 74 68 61 74 20 6d 61 6b 65 20 75 70 20  es that make up 
11fd0 74 68 65 20 52 48 53 2e 0a 20 20 2a 2f 0a 20 20  the RHS..  */.  
11fe0 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
11ff0 65 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d  e;.  assert( v!=
12000 30 20 29 3b 20 20 20 20 20 20 20 2f 2a 20 4f 4f  0 );       /* OO
12010 4d 20 64 65 74 65 63 74 65 64 20 70 72 69 6f 72  M detected prior
12020 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   to this routine
12030 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f   */.  VdbeNoopCo
12040 6d 6d 65 6e 74 28 28 76 2c 20 22 62 65 67 69 6e  mment((v, "begin
12050 20 49 4e 20 65 78 70 72 22 29 29 3b 0a 20 20 65   IN expr"));.  e
12060 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33 46 69  Type = sqlite3Fi
12070 6e 64 49 6e 49 6e 64 65 78 28 70 50 61 72 73 65  ndInIndex(pParse
12080 2c 20 70 45 78 70 72 2c 0a 20 20 20 20 20 20 20  , pExpr,.       
12090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
120a0 20 20 20 20 20 20 49 4e 5f 49 4e 44 45 58 5f 4d        IN_INDEX_M
120b0 45 4d 42 45 52 53 48 49 50 20 7c 20 49 4e 5f 49  EMBERSHIP | IN_I
120c0 4e 44 45 58 5f 4e 4f 4f 50 5f 4f 4b 2c 0a 20 20  NDEX_NOOP_OK,.  
120d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
120e0 20 20 20 20 20 20 20 20 20 20 20 64 65 73 74 49             destI
120f0 66 46 61 6c 73 65 3d 3d 64 65 73 74 49 66 4e 75  fFalse==destIfNu
12100 6c 6c 20 3f 20 30 20 3a 20 26 72 52 68 73 48 61  ll ? 0 : &rRhsHa
12110 73 4e 75 6c 6c 29 3b 0a 0a 20 20 2f 2a 20 46 69  sNull);..  /* Fi
12120 67 75 72 65 20 6f 75 74 20 74 68 65 20 61 66 66  gure out the aff
12130 69 6e 69 74 79 20 74 6f 20 75 73 65 20 74 6f 20  inity to use to 
12140 63 72 65 61 74 65 20 61 20 6b 65 79 20 66 72 6f  create a key fro
12150 6d 20 74 68 65 20 72 65 73 75 6c 74 73 0a 20 20  m the results.  
12160 2a 2a 20 6f 66 20 74 68 65 20 65 78 70 72 65 73  ** of the expres
12170 73 69 6f 6e 2e 20 61 66 66 69 6e 69 74 79 53 74  sion. affinitySt
12180 72 20 73 74 6f 72 65 73 20 61 20 73 74 61 74 69  r stores a stati
12190 63 20 73 74 72 69 6e 67 20 73 75 69 74 61 62 6c  c string suitabl
121a0 65 20 66 6f 72 0a 20 20 2a 2a 20 50 34 20 6f 66  e for.  ** P4 of
121b0 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2e 0a   OP_MakeRecord..
121c0 20 20 2a 2f 0a 20 20 61 66 66 69 6e 69 74 79 20    */.  affinity 
121d0 3d 20 63 6f 6d 70 61 72 69 73 6f 6e 41 66 66 69  = comparisonAffi
121e0 6e 69 74 79 28 70 45 78 70 72 29 3b 0a 0a 20 20  nity(pExpr);..  
121f0 2f 2a 20 43 6f 64 65 20 74 68 65 20 4c 48 53 2c  /* Code the LHS,
12200 20 74 68 65 20 3c 65 78 70 72 3e 20 66 72 6f 6d   the <expr> from
12210 20 22 3c 65 78 70 72 3e 20 49 4e 20 28 2e 2e 2e   "<expr> IN (...
12220 29 22 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  )"..  */.  sqlit
12230 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28  e3ExprCachePush(
12240 70 50 61 72 73 65 29 3b 0a 20 20 72 31 20 3d 20  pParse);.  r1 = 
12250 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
12260 67 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c  g(pParse);.  sql
12270 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
12280 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
12290 74 2c 20 72 31 29 3b 0a 0a 20 20 2f 2a 20 49 66  t, r1);..  /* If
122a0 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e   sqlite3FindInIn
122b0 64 65 78 28 29 20 64 69 64 20 6e 6f 74 20 66 69  dex() did not fi
122c0 6e 64 20 6f 72 20 63 72 65 61 74 65 20 61 6e 20  nd or create an 
122d0 69 6e 64 65 78 20 74 68 61 74 20 69 73 0a 20 20  index that is.  
122e0 2a 2a 20 73 75 69 74 61 62 6c 65 20 66 6f 72 20  ** suitable for 
122f0 65 76 61 6c 75 61 74 69 6e 67 20 74 68 65 20 49  evaluating the I
12300 4e 20 6f 70 65 72 61 74 6f 72 2c 20 74 68 65 6e  N operator, then
12310 20 65 76 61 6c 75 61 74 65 20 75 73 69 6e 67 20   evaluate using 
12320 61 0a 20 20 2a 2a 20 73 65 71 75 65 6e 63 65 20  a.  ** sequence 
12330 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e 73 2e 0a  of comparisons..
12340 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65    */.  if( eType
12350 3d 3d 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 20  ==IN_INDEX_NOOP 
12360 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20  ){.    ExprList 
12370 2a 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e  *pList = pExpr->
12380 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 43 6f 6c  x.pList;.    Col
12390 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 73 71  lSeq *pColl = sq
123a0 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
123b0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
123c0 70 4c 65 66 74 29 3b 0a 20 20 20 20 69 6e 74 20  pLeft);.    int 
123d0 6c 61 62 65 6c 4f 6b 20 3d 20 73 71 6c 69 74 65  labelOk = sqlite
123e0 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
123f0 29 3b 0a 20 20 20 20 69 6e 74 20 72 32 2c 20 72  );.    int r2, r
12400 65 67 54 6f 46 72 65 65 3b 0a 20 20 20 20 69 6e  egToFree;.    in
12410 74 20 72 65 67 43 6b 4e 75 6c 6c 20 3d 20 30 3b  t regCkNull = 0;
12420 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20  .    int ii;.   
12430 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
12440 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
12450 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
12460 3b 0a 20 20 20 20 69 66 28 20 64 65 73 74 49 66  ;.    if( destIf
12470 4e 75 6c 6c 21 3d 64 65 73 74 49 66 46 61 6c 73  Null!=destIfFals
12480 65 20 29 7b 0a 20 20 20 20 20 20 72 65 67 43 6b  e ){.      regCk
12490 4e 75 6c 6c 20 3d 20 73 71 6c 69 74 65 33 47 65  Null = sqlite3Ge
124a0 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
124b0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
124c0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
124d0 42 69 74 41 6e 64 2c 20 72 31 2c 20 72 31 2c 20  BitAnd, r1, r1, 
124e0 72 65 67 43 6b 4e 75 6c 6c 29 3b 0a 20 20 20 20  regCkNull);.    
124f0 7d 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20  }.    for(ii=0; 
12500 69 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  ii<pList->nExpr;
12510 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 32   ii++){.      r2
12520 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
12530 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
12540 4c 69 73 74 2d 3e 61 5b 69 69 5d 2e 70 45 78 70  List->a[ii].pExp
12550 72 2c 20 26 72 65 67 54 6f 46 72 65 65 29 3b 0a  r, &regToFree);.
12560 20 20 20 20 20 20 69 66 28 20 72 65 67 43 6b 4e        if( regCkN
12570 75 6c 6c 20 26 26 20 73 71 6c 69 74 65 33 45 78  ull && sqlite3Ex
12580 70 72 43 61 6e 42 65 4e 75 6c 6c 28 70 4c 69 73  prCanBeNull(pLis
12590 74 2d 3e 61 5b 69 69 5d 2e 70 45 78 70 72 29 20  t->a[ii].pExpr) 
125a0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
125b0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
125c0 4f 50 5f 42 69 74 41 6e 64 2c 20 72 65 67 43 6b  OP_BitAnd, regCk
125d0 4e 75 6c 6c 2c 20 72 32 2c 20 72 65 67 43 6b 4e  Null, r2, regCkN
125e0 75 6c 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ull);.      }.  
125f0 20 20 20 20 69 66 28 20 69 69 3c 70 4c 69 73 74      if( ii<pList
12600 2d 3e 6e 45 78 70 72 2d 31 20 7c 7c 20 64 65 73  ->nExpr-1 || des
12610 74 49 66 4e 75 6c 6c 21 3d 64 65 73 74 49 66 46  tIfNull!=destIfF
12620 61 6c 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20  alse ){.        
12630 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
12640 34 28 76 2c 20 4f 50 5f 45 71 2c 20 72 31 2c 20  4(v, OP_Eq, r1, 
12650 6c 61 62 65 6c 4f 6b 2c 20 72 32 2c 0a 20 20 20  labelOk, r2,.   
12660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12670 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29 70 43         (void*)pC
12680 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29  oll, P4_COLLSEQ)
12690 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
126a0 76 65 72 61 67 65 49 66 28 76 2c 20 69 69 3c 70  verageIf(v, ii<p
126b0 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a  List->nExpr-1);.
126c0 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
126d0 72 61 67 65 49 66 28 76 2c 20 69 69 3d 3d 70 4c  rageIf(v, ii==pL
126e0 69 73 74 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a 20  ist->nExpr-1);. 
126f0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
12700 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 61 66  beChangeP5(v, af
12710 66 69 6e 69 74 79 29 3b 0a 20 20 20 20 20 20 7d  finity);.      }
12720 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73  else{.        as
12730 73 65 72 74 28 20 64 65 73 74 49 66 4e 75 6c 6c  sert( destIfNull
12740 3d 3d 64 65 73 74 49 66 46 61 6c 73 65 20 29 3b  ==destIfFalse );
12750 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
12760 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
12770 5f 4e 65 2c 20 72 31 2c 20 64 65 73 74 49 66 46  _Ne, r1, destIfF
12780 61 6c 73 65 2c 20 72 32 2c 0a 20 20 20 20 20 20  alse, r2,.      
12790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
127a0 20 20 20 20 28 76 6f 69 64 2a 29 70 43 6f 6c 6c      (void*)pColl
127b0 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 20 56  , P4_COLLSEQ); V
127c0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
127d0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
127e0 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 61  dbeChangeP5(v, a
127f0 66 66 69 6e 69 74 79 20 7c 20 53 51 4c 49 54 45  ffinity | SQLITE
12800 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20  _JUMPIFNULL);.  
12810 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
12820 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
12830 67 28 70 50 61 72 73 65 2c 20 72 65 67 54 6f 46  g(pParse, regToF
12840 72 65 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ree);.    }.    
12850 69 66 28 20 72 65 67 43 6b 4e 75 6c 6c 20 29 7b  if( regCkNull ){
12860 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
12870 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
12880 73 4e 75 6c 6c 2c 20 72 65 67 43 6b 4e 75 6c 6c  sNull, regCkNull
12890 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 20 56  , destIfNull); V
128a0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
128b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
128c0 65 47 6f 74 6f 28 76 2c 20 64 65 73 74 49 66 46  eGoto(v, destIfF
128d0 61 6c 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  alse);.    }.   
128e0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
128f0 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 61 62 65  lveLabel(v, labe
12900 6c 4f 6b 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  lOk);.    sqlite
12910 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
12920 70 50 61 72 73 65 2c 20 72 65 67 43 6b 4e 75 6c  pParse, regCkNul
12930 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 0a  l);.  }else{.  .
12940 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 4c 48      /* If the LH
12950 53 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20  S is NULL, then 
12960 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 65 69  the result is ei
12970 74 68 65 72 20 66 61 6c 73 65 20 6f 72 20 4e 55  ther false or NU
12980 4c 4c 20 64 65 70 65 6e 64 69 6e 67 0a 20 20 20  LL depending.   
12990 20 2a 2a 20 6f 6e 20 77 68 65 74 68 65 72 20 74   ** on whether t
129a0 68 65 20 52 48 53 20 69 73 20 65 6d 70 74 79 20  he RHS is empty 
129b0 6f 72 20 6e 6f 74 2c 20 72 65 73 70 65 63 74 69  or not, respecti
129c0 76 65 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  vely..    */.   
129d0 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
129e0 43 61 6e 42 65 4e 75 6c 6c 28 70 45 78 70 72 2d  CanBeNull(pExpr-
129f0 3e 70 4c 65 66 74 29 20 29 7b 0a 20 20 20 20 20  >pLeft) ){.     
12a00 20 69 66 28 20 64 65 73 74 49 66 4e 75 6c 6c 3d   if( destIfNull=
12a10 3d 64 65 73 74 49 66 46 61 6c 73 65 20 29 7b 0a  =destIfFalse ){.
12a20 20 20 20 20 20 20 20 20 2f 2a 20 53 68 6f 72 74          /* Short
12a30 63 75 74 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d  cut for the comm
12a40 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20 74 68  on case where th
12a50 65 20 66 61 6c 73 65 20 61 6e 64 20 4e 55 4c 4c  e false and NULL
12a60 20 6f 75 74 63 6f 6d 65 73 20 61 72 65 0a 20 20   outcomes are.  
12a70 20 20 20 20 20 20 2a 2a 20 74 68 65 20 73 61 6d        ** the sam
12a80 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71  e. */.        sq
12a90 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
12aa0 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 31  v, OP_IsNull, r1
12ab0 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 20 56  , destIfNull); V
12ac0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
12ad0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
12ae0 20 20 20 20 20 69 6e 74 20 61 64 64 72 31 20 3d       int addr1 =
12af0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12b00 70 31 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c  p1(v, OP_NotNull
12b10 2c 20 72 31 29 3b 20 56 64 62 65 43 6f 76 65 72  , r1); VdbeCover
12b20 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
12b30 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
12b40 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20  2(v, OP_Rewind, 
12b50 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 64  pExpr->iTable, d
12b60 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 20 20 20  estIfFalse);.   
12b70 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
12b80 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71  e(v);.        sq
12b90 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c  lite3VdbeGoto(v,
12ba0 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20   destIfNull);.  
12bb0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
12bc0 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
12bd0 72 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  r1);.      }.   
12be0 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 65 54   }.  .    if( eT
12bf0 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52 4f  ype==IN_INDEX_RO
12c00 57 49 44 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  WID ){.      /* 
12c10 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 74 68  In this case, th
12c20 65 20 52 48 53 20 69 73 20 74 68 65 20 52 4f 57  e RHS is the ROW
12c30 49 44 20 6f 66 20 74 61 62 6c 65 20 62 2d 74 72  ID of table b-tr
12c40 65 65 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  ee.      */.    
12c50 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
12c60 4f 70 32 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65  Op2(v, OP_MustBe
12c70 49 6e 74 2c 20 72 31 2c 20 64 65 73 74 49 66 46  Int, r1, destIfF
12c80 61 6c 73 65 29 3b 20 56 64 62 65 43 6f 76 65 72  alse); VdbeCover
12c90 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 73 71  age(v);.      sq
12ca0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
12cb0 76 2c 20 4f 50 5f 4e 6f 74 45 78 69 73 74 73 2c  v, OP_NotExists,
12cc0 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
12cd0 64 65 73 74 49 66 46 61 6c 73 65 2c 20 72 31 29  destIfFalse, r1)
12ce0 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
12cf0 72 61 67 65 28 76 29 3b 0a 20 20 20 20 7d 65 6c  rage(v);.    }el
12d00 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20  se{.      /* In 
12d10 74 68 69 73 20 63 61 73 65 2c 20 74 68 65 20 52  this case, the R
12d20 48 53 20 69 73 20 61 6e 20 69 6e 64 65 78 20 62  HS is an index b
12d30 2d 74 72 65 65 2e 0a 20 20 20 20 20 20 2a 2f 0a  -tree..      */.
12d40 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
12d50 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 41 66  eAddOp4(v, OP_Af
12d60 66 69 6e 69 74 79 2c 20 72 31 2c 20 31 2c 20 30  finity, r1, 1, 0
12d70 2c 20 26 61 66 66 69 6e 69 74 79 2c 20 31 29 3b  , &affinity, 1);
12d80 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  .  .      /* If 
12d90 74 68 65 20 73 65 74 20 6d 65 6d 62 65 72 73 68  the set membersh
12da0 69 70 20 74 65 73 74 20 66 61 69 6c 73 2c 20 74  ip test fails, t
12db0 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 6f  hen the result o
12dc0 66 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20  f the .      ** 
12dd0 22 78 20 49 4e 20 28 2e 2e 2e 29 22 20 65 78 70  "x IN (...)" exp
12de0 72 65 73 73 69 6f 6e 20 6d 75 73 74 20 62 65 20  ression must be 
12df0 65 69 74 68 65 72 20 30 20 6f 72 20 4e 55 4c 4c  either 0 or NULL
12e00 2e 20 49 66 20 74 68 65 20 73 65 74 0a 20 20 20  . If the set.   
12e10 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 6e     ** contains n
12e20 6f 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2c 20 74  o NULL values, t
12e30 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 69  hen the result i
12e40 73 20 30 2e 20 49 66 20 74 68 65 20 73 65 74 20  s 0. If the set 
12e50 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69  .      ** contai
12e60 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 4e  ns one or more N
12e70 55 4c 4c 20 76 61 6c 75 65 73 2c 20 74 68 65 6e  ULL values, then
12e80 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74   the result of t
12e90 68 65 0a 20 20 20 20 20 20 2a 2a 20 65 78 70 72  he.      ** expr
12ea0 65 73 73 69 6f 6e 20 69 73 20 61 6c 73 6f 20 4e  ession is also N
12eb0 55 4c 4c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ULL..      */.  
12ec0 20 20 20 20 61 73 73 65 72 74 28 20 64 65 73 74      assert( dest
12ed0 49 66 46 61 6c 73 65 21 3d 64 65 73 74 49 66 4e  IfFalse!=destIfN
12ee0 75 6c 6c 20 7c 7c 20 72 52 68 73 48 61 73 4e 75  ull || rRhsHasNu
12ef0 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69  ll==0 );.      i
12f00 66 28 20 72 52 68 73 48 61 73 4e 75 6c 6c 3d 3d  f( rRhsHasNull==
12f10 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
12f20 54 68 69 73 20 62 72 61 6e 63 68 20 72 75 6e 73  This branch runs
12f30 20 69 66 20 69 74 20 69 73 20 6b 6e 6f 77 6e 20   if it is known 
12f40 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 20  at compile time 
12f50 74 68 61 74 20 74 68 65 20 52 48 53 0a 20 20 20  that the RHS.   
12f60 20 20 20 20 20 2a 2a 20 63 61 6e 6e 6f 74 20 63       ** cannot c
12f70 6f 6e 74 61 69 6e 20 4e 55 4c 4c 20 76 61 6c 75  ontain NULL valu
12f80 65 73 2e 20 54 68 69 73 20 68 61 70 70 65 6e 73  es. This happens
12f90 20 61 73 20 74 68 65 20 72 65 73 75 6c 74 0a 20   as the result. 
12fa0 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 61 20 22         ** of a "
12fb0 4e 4f 54 20 4e 55 4c 4c 22 20 63 6f 6e 73 74 72  NOT NULL" constr
12fc0 61 69 6e 74 20 69 6e 20 74 68 65 20 64 61 74 61  aint in the data
12fd0 62 61 73 65 20 73 63 68 65 6d 61 2e 0a 20 20 20  base schema..   
12fe0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
12ff0 2a 2a 20 41 6c 73 6f 20 72 75 6e 20 74 68 69 73  ** Also run this
13000 20 62 72 61 6e 63 68 20 69 66 20 4e 55 4c 4c 20   branch if NULL 
13010 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f  is equivalent to
13020 20 46 41 4c 53 45 0a 20 20 20 20 20 20 20 20 2a   FALSE.        *
13030 2a 20 66 6f 72 20 74 68 69 73 20 70 61 72 74 69  * for this parti
13040 63 75 6c 61 72 20 49 4e 20 6f 70 65 72 61 74 6f  cular IN operato
13050 72 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  r..        */.  
13060 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
13070 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
13080 5f 4e 6f 74 46 6f 75 6e 64 2c 20 70 45 78 70 72  _NotFound, pExpr
13090 2d 3e 69 54 61 62 6c 65 2c 20 64 65 73 74 49 66  ->iTable, destIf
130a0 46 61 6c 73 65 2c 20 72 31 2c 20 31 29 3b 0a 20  False, r1, 1);. 
130b0 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
130c0 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 7d 65  age(v);.      }e
130d0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
130e0 49 6e 20 74 68 69 73 20 62 72 61 6e 63 68 2c 20  In this branch, 
130f0 74 68 65 20 52 48 53 20 6f 66 20 74 68 65 20 49  the RHS of the I
13100 4e 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20  N might contain 
13110 61 20 4e 55 4c 4c 20 61 6e 64 0a 20 20 20 20 20  a NULL and.     
13120 20 20 20 2a 2a 20 74 68 65 20 70 72 65 73 65 6e     ** the presen
13130 63 65 20 6f 66 20 61 20 4e 55 4c 4c 20 6f 6e 20  ce of a NULL on 
13140 74 68 65 20 52 48 53 20 6d 61 6b 65 73 20 61 20  the RHS makes a 
13150 64 69 66 66 65 72 65 6e 63 65 20 69 6e 20 74 68  difference in th
13160 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 75 74  e.        ** out
13170 63 6f 6d 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f  come..        */
13180 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6a 31 3b  .        int j1;
13190 0a 20 20 0a 20 20 20 20 20 20 20 20 2f 2a 20 46  .  .        /* F
131a0 69 72 73 74 20 63 68 65 63 6b 20 74 6f 20 73 65  irst check to se
131b0 65 20 69 66 20 74 68 65 20 4c 48 53 20 69 73 20  e if the LHS is 
131c0 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65  contained in the
131d0 20 52 48 53 2e 20 20 49 66 20 73 6f 2c 0a 20 20   RHS.  If so,.  
131e0 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68        ** then th
131f0 65 20 61 6e 73 77 65 72 20 69 73 20 54 52 55 45  e answer is TRUE
13200 20 74 68 65 20 70 72 65 73 65 6e 63 65 20 6f 66   the presence of
13210 20 4e 55 4c 4c 73 20 69 6e 20 74 68 65 20 52 48   NULLs in the RH
13220 53 20 64 6f 65 73 0a 20 20 20 20 20 20 20 20 2a  S does.        *
13230 2a 20 6e 6f 74 20 6d 61 74 74 65 72 2e 20 20 49  * not matter.  I
13240 66 20 74 68 65 20 4c 48 53 20 69 73 20 6e 6f 74  f the LHS is not
13250 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68   contained in th
13260 65 20 52 48 53 2c 20 74 68 65 6e 20 74 68 65 0a  e RHS, then the.
13270 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 73 77 65          ** answe
13280 72 20 69 73 20 4e 55 4c 4c 20 69 66 20 74 68 65  r is NULL if the
13290 20 52 48 53 20 63 6f 6e 74 61 69 6e 73 20 4e 55   RHS contains NU
132a0 4c 4c 73 20 61 6e 64 20 74 68 65 20 61 6e 73 77  LLs and the answ
132b0 65 72 20 69 73 0a 20 20 20 20 20 20 20 20 2a 2a  er is.        **
132c0 20 46 41 4c 53 45 20 69 66 20 74 68 65 20 52 48   FALSE if the RH
132d0 53 20 69 73 20 4e 55 4c 4c 2d 66 72 65 65 2e 0a  S is NULL-free..
132e0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
132f0 20 20 20 6a 31 20 3d 20 73 71 6c 69 74 65 33 56     j1 = sqlite3V
13300 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
13310 4f 50 5f 46 6f 75 6e 64 2c 20 70 45 78 70 72 2d  OP_Found, pExpr-
13320 3e 69 54 61 62 6c 65 2c 20 30 2c 20 72 31 2c 20  >iTable, 0, r1, 
13330 31 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  1);.        Vdbe
13340 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
13350 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
13360 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e  AddOp2(v, OP_IsN
13370 75 6c 6c 2c 20 72 52 68 73 48 61 73 4e 75 6c 6c  ull, rRhsHasNull
13380 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20  , destIfNull);. 
13390 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
133a0 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
133b0 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28  sqlite3VdbeGoto(
133c0 76 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b  v, destIfFalse);
133d0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
133e0 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
133f0 6a 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  j1);.      }.   
13400 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
13410 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
13420 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 73 71  Parse, r1);.  sq
13430 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f  lite3ExprCachePo
13440 70 28 70 50 61 72 73 65 29 3b 0a 20 20 56 64 62  p(pParse);.  Vdb
13450 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6e  eComment((v, "en
13460 64 20 49 4e 20 65 78 70 72 22 29 29 3b 0a 7d 0a  d IN expr"));.}.
13470 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
13480 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a  _OMIT_SUBQUERY *
13490 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
134a0 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f  E_OMIT_FLOATING_
134b0 50 4f 49 4e 54 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  POINT./*.** Gene
134c0 72 61 74 65 20 61 6e 20 69 6e 73 74 72 75 63 74  rate an instruct
134d0 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20 70 75  ion that will pu
134e0 74 20 74 68 65 20 66 6c 6f 61 74 69 6e 67 20 70  t the floating p
134f0 6f 69 6e 74 0a 2a 2a 20 76 61 6c 75 65 20 64 65  oint.** value de
13500 73 63 72 69 62 65 64 20 62 79 20 7a 5b 30 2e 2e  scribed by z[0..
13510 6e 2d 31 5d 20 69 6e 74 6f 20 72 65 67 69 73 74  n-1] into regist
13520 65 72 20 69 4d 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54  er iMem..**.** T
13530 68 65 20 7a 5b 5d 20 73 74 72 69 6e 67 20 77 69  he z[] string wi
13540 6c 6c 20 70 72 6f 62 61 62 6c 79 20 6e 6f 74 20  ll probably not 
13550 62 65 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74  be zero-terminat
13560 65 64 2e 20 20 42 75 74 20 74 68 65 20 0a 2a 2a  ed.  But the .**
13570 20 7a 5b 6e 5d 20 63 68 61 72 61 63 74 65 72 20   z[n] character 
13580 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  is guaranteed to
13590 20 62 65 20 73 6f 6d 65 74 68 69 6e 67 20 74 68   be something th
135a0 61 74 20 64 6f 65 73 20 6e 6f 74 20 6c 6f 6f 6b  at does not look
135b0 0a 2a 2a 20 6c 69 6b 65 20 74 68 65 20 63 6f 6e  .** like the con
135c0 74 69 6e 75 61 74 69 6f 6e 20 6f 66 20 74 68 65  tinuation of the
135d0 20 6e 75 6d 62 65 72 2e 0a 2a 2f 0a 73 74 61 74   number..*/.stat
135e0 69 63 20 76 6f 69 64 20 63 6f 64 65 52 65 61 6c  ic void codeReal
135f0 28 56 64 62 65 20 2a 76 2c 20 63 6f 6e 73 74 20  (Vdbe *v, const 
13600 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 65 67  char *z, int neg
13610 61 74 65 46 6c 61 67 2c 20 69 6e 74 20 69 4d 65  ateFlag, int iMe
13620 6d 29 7b 0a 20 20 69 66 28 20 41 4c 57 41 59 53  m){.  if( ALWAYS
13630 28 7a 21 3d 30 29 20 29 7b 0a 20 20 20 20 64 6f  (z!=0) ){.    do
13640 75 62 6c 65 20 76 61 6c 75 65 3b 0a 20 20 20 20  uble value;.    
13650 73 71 6c 69 74 65 33 41 74 6f 46 28 7a 2c 20 26  sqlite3AtoF(z, &
13660 76 61 6c 75 65 2c 20 73 71 6c 69 74 65 33 53 74  value, sqlite3St
13670 72 6c 65 6e 33 30 28 7a 29 2c 20 53 51 4c 49 54  rlen30(z), SQLIT
13680 45 5f 55 54 46 38 29 3b 0a 20 20 20 20 61 73 73  E_UTF8);.    ass
13690 65 72 74 28 20 21 73 71 6c 69 74 65 33 49 73 4e  ert( !sqlite3IsN
136a0 61 4e 28 76 61 6c 75 65 29 20 29 3b 20 2f 2a 20  aN(value) ); /* 
136b0 54 68 65 20 6e 65 77 20 41 74 6f 46 20 6e 65 76  The new AtoF nev
136c0 65 72 20 72 65 74 75 72 6e 73 20 4e 61 4e 20 2a  er returns NaN *
136d0 2f 0a 20 20 20 20 69 66 28 20 6e 65 67 61 74 65  /.    if( negate
136e0 46 6c 61 67 20 29 20 76 61 6c 75 65 20 3d 20 2d  Flag ) value = -
136f0 76 61 6c 75 65 3b 0a 20 20 20 20 73 71 6c 69 74  value;.    sqlit
13700 65 33 56 64 62 65 41 64 64 4f 70 34 44 75 70 38  e3VdbeAddOp4Dup8
13710 28 76 2c 20 4f 50 5f 52 65 61 6c 2c 20 30 2c 20  (v, OP_Real, 0, 
13720 69 4d 65 6d 2c 20 30 2c 20 28 75 38 2a 29 26 76  iMem, 0, (u8*)&v
13730 61 6c 75 65 2c 20 50 34 5f 52 45 41 4c 29 3b 0a  alue, P4_REAL);.
13740 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f    }.}.#endif.../
13750 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 6e  *.** Generate an
13760 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 61   instruction tha
13770 74 20 77 69 6c 6c 20 70 75 74 20 74 68 65 20 69  t will put the i
13780 6e 74 65 67 65 72 20 64 65 73 63 72 69 62 65 20  nteger describe 
13790 62 79 0a 2a 2a 20 74 65 78 74 20 7a 5b 30 2e 2e  by.** text z[0..
137a0 6e 2d 31 5d 20 69 6e 74 6f 20 72 65 67 69 73 74  n-1] into regist
137b0 65 72 20 69 4d 65 6d 2e 0a 2a 2a 0a 2a 2a 20 45  er iMem..**.** E
137c0 78 70 72 2e 75 2e 7a 54 6f 6b 65 6e 20 69 73 20  xpr.u.zToken is 
137d0 61 6c 77 61 79 73 20 55 54 46 38 20 61 6e 64 20  always UTF8 and 
137e0 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74 65 64 2e  zero-terminated.
137f0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
13800 63 6f 64 65 49 6e 74 65 67 65 72 28 50 61 72 73  codeInteger(Pars
13810 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
13820 2a 70 45 78 70 72 2c 20 69 6e 74 20 6e 65 67 46  *pExpr, int negF
13830 6c 61 67 2c 20 69 6e 74 20 69 4d 65 6d 29 7b 0a  lag, int iMem){.
13840 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
13850 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 66 28  se->pVdbe;.  if(
13860 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20   pExpr->flags & 
13870 45 50 5f 49 6e 74 56 61 6c 75 65 20 29 7b 0a 20  EP_IntValue ){. 
13880 20 20 20 69 6e 74 20 69 20 3d 20 70 45 78 70 72     int i = pExpr
13890 2d 3e 75 2e 69 56 61 6c 75 65 3b 0a 20 20 20 20  ->u.iValue;.    
138a0 61 73 73 65 72 74 28 20 69 3e 3d 30 20 29 3b 0a  assert( i>=0 );.
138b0 20 20 20 20 69 66 28 20 6e 65 67 46 6c 61 67 20      if( negFlag 
138c0 29 20 69 20 3d 20 2d 69 3b 0a 20 20 20 20 73 71  ) i = -i;.    sq
138d0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
138e0 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69  v, OP_Integer, i
138f0 2c 20 69 4d 65 6d 29 3b 0a 20 20 7d 65 6c 73 65  , iMem);.  }else
13900 7b 0a 20 20 20 20 69 6e 74 20 63 3b 0a 20 20 20  {.    int c;.   
13910 20 69 36 34 20 76 61 6c 75 65 3b 0a 20 20 20 20   i64 value;.    
13920 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20  const char *z = 
13930 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b  pExpr->u.zToken;
13940 0a 20 20 20 20 61 73 73 65 72 74 28 20 7a 21 3d  .    assert( z!=
13950 30 20 29 3b 0a 20 20 20 20 63 20 3d 20 73 71 6c  0 );.    c = sql
13960 69 74 65 33 44 65 63 4f 72 48 65 78 54 6f 49 36  ite3DecOrHexToI6
13970 34 28 7a 2c 20 26 76 61 6c 75 65 29 3b 0a 20 20  4(z, &value);.  
13980 20 20 69 66 28 20 63 3d 3d 30 20 7c 7c 20 28 63    if( c==0 || (c
13990 3d 3d 32 20 26 26 20 6e 65 67 46 6c 61 67 29 20  ==2 && negFlag) 
139a0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 67  ){.      if( neg
139b0 46 6c 61 67 20 29 7b 20 76 61 6c 75 65 20 3d 20  Flag ){ value = 
139c0 63 3d 3d 32 20 3f 20 53 4d 41 4c 4c 45 53 54 5f  c==2 ? SMALLEST_
139d0 49 4e 54 36 34 20 3a 20 2d 76 61 6c 75 65 3b 20  INT64 : -value; 
139e0 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
139f0 64 62 65 41 64 64 4f 70 34 44 75 70 38 28 76 2c  dbeAddOp4Dup8(v,
13a00 20 4f 50 5f 49 6e 74 36 34 2c 20 30 2c 20 69 4d   OP_Int64, 0, iM
13a10 65 6d 2c 20 30 2c 20 28 75 38 2a 29 26 76 61 6c  em, 0, (u8*)&val
13a20 75 65 2c 20 50 34 5f 49 4e 54 36 34 29 3b 0a 20  ue, P4_INT64);. 
13a30 20 20 20 7d 65 6c 73 65 7b 0a 23 69 66 64 65 66     }else{.#ifdef
13a40 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f   SQLITE_OMIT_FLO
13a50 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20  ATING_POINT.    
13a60 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
13a70 67 28 70 50 61 72 73 65 2c 20 22 6f 76 65 72 73  g(pParse, "overs
13a80 69 7a 65 64 20 69 6e 74 65 67 65 72 3a 20 25 73  ized integer: %s
13a90 25 73 22 2c 20 6e 65 67 46 6c 61 67 20 3f 20 22  %s", negFlag ? "
13aa0 2d 22 20 3a 20 22 22 2c 20 7a 29 3b 0a 23 65 6c  -" : "", z);.#el
13ab0 73 65 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  se.#ifndef SQLIT
13ac0 45 5f 4f 4d 49 54 5f 48 45 58 5f 49 4e 54 45 47  E_OMIT_HEX_INTEG
13ad0 45 52 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  ER.      if( sql
13ae0 69 74 65 33 5f 73 74 72 6e 69 63 6d 70 28 7a 2c  ite3_strnicmp(z,
13af0 22 30 78 22 2c 32 29 3d 3d 30 20 29 7b 0a 20 20  "0x",2)==0 ){.  
13b00 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
13b10 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 68  orMsg(pParse, "h
13b20 65 78 20 6c 69 74 65 72 61 6c 20 74 6f 6f 20 62  ex literal too b
13b30 69 67 3a 20 25 73 22 2c 20 7a 29 3b 0a 20 20 20  ig: %s", z);.   
13b40 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a     }else.#endif.
13b50 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
13b60 63 6f 64 65 52 65 61 6c 28 76 2c 20 7a 2c 20 6e  codeReal(v, z, n
13b70 65 67 46 6c 61 67 2c 20 69 4d 65 6d 29 3b 0a 20  egFlag, iMem);. 
13b80 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
13b90 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
13ba0 20 43 6c 65 61 72 20 61 20 63 61 63 68 65 20 65   Clear a cache e
13bb0 6e 74 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ntry..*/.static 
13bc0 76 6f 69 64 20 63 61 63 68 65 45 6e 74 72 79 43  void cacheEntryC
13bd0 6c 65 61 72 28 50 61 72 73 65 20 2a 70 50 61 72  lear(Parse *pPar
13be0 73 65 2c 20 73 74 72 75 63 74 20 79 43 6f 6c 43  se, struct yColC
13bf0 61 63 68 65 20 2a 70 29 7b 0a 20 20 69 66 28 20  ache *p){.  if( 
13c00 70 2d 3e 74 65 6d 70 52 65 67 20 29 7b 0a 20 20  p->tempReg ){.  
13c10 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 54    if( pParse->nT
13c20 65 6d 70 52 65 67 3c 41 72 72 61 79 53 69 7a 65  empReg<ArraySize
13c30 28 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65  (pParse->aTempRe
13c40 67 29 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72  g) ){.      pPar
13c50 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b 70 50 61  se->aTempReg[pPa
13c60 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 2b 2b 5d  rse->nTempReg++]
13c70 20 3d 20 70 2d 3e 69 52 65 67 3b 0a 20 20 20 20   = p->iReg;.    
13c80 7d 0a 20 20 20 20 70 2d 3e 74 65 6d 70 52 65 67  }.    p->tempReg
13c90 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a   = 0;.  }.}.../*
13ca0 0a 2a 2a 20 52 65 63 6f 72 64 20 69 6e 20 74 68  .** Record in th
13cb0 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 74  e column cache t
13cc0 68 61 74 20 61 20 70 61 72 74 69 63 75 6c 61 72  hat a particular
13cd0 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d 20 61 0a 2a   column from a.*
13ce0 2a 20 70 61 72 74 69 63 75 6c 61 72 20 74 61 62  * particular tab
13cf0 6c 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  le is stored in 
13d00 61 20 70 61 72 74 69 63 75 6c 61 72 20 72 65 67  a particular reg
13d10 69 73 74 65 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ister..*/.void s
13d20 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 53  qlite3ExprCacheS
13d30 74 6f 72 65 28 50 61 72 73 65 20 2a 70 50 61 72  tore(Parse *pPar
13d40 73 65 2c 20 69 6e 74 20 69 54 61 62 2c 20 69 6e  se, int iTab, in
13d50 74 20 69 43 6f 6c 2c 20 69 6e 74 20 69 52 65 67  t iCol, int iReg
13d60 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  ){.  int i;.  in
13d70 74 20 6d 69 6e 4c 72 75 3b 0a 20 20 69 6e 74 20  t minLru;.  int 
13d80 69 64 78 4c 72 75 3b 0a 20 20 73 74 72 75 63 74  idxLru;.  struct
13d90 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 0a   yColCache *p;..
13da0 20 20 2f 2a 20 55 6e 6c 65 73 73 20 61 6e 20 65    /* Unless an e
13db0 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65  rror has occurre
13dc0 64 2c 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62  d, register numb
13dd0 65 72 73 20 61 72 65 20 61 6c 77 61 79 73 20 70  ers are always p
13de0 6f 73 69 74 69 76 65 2e 20 2a 2f 0a 20 20 61 73  ositive. */.  as
13df0 73 65 72 74 28 20 69 52 65 67 3e 30 20 7c 7c 20  sert( iReg>0 || 
13e00 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20  pParse->nErr || 
13e10 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
13e20 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 61 73  ocFailed );.  as
13e30 73 65 72 74 28 20 69 43 6f 6c 3e 3d 2d 31 20 26  sert( iCol>=-1 &
13e40 26 20 69 43 6f 6c 3c 33 32 37 36 38 20 29 3b 20  & iCol<32768 ); 
13e50 20 2f 2a 20 46 69 6e 69 74 65 20 63 6f 6c 75 6d   /* Finite colum
13e60 6e 20 6e 75 6d 62 65 72 73 20 2a 2f 0a 0a 20 20  n numbers */..  
13e70 2f 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 43 6f  /* The SQLITE_Co
13e80 6c 75 6d 6e 43 61 63 68 65 20 66 6c 61 67 20 64  lumnCache flag d
13e90 69 73 61 62 6c 65 73 20 74 68 65 20 63 6f 6c 75  isables the colu
13ea0 6d 6e 20 63 61 63 68 65 2e 20 20 54 68 69 73 20  mn cache.  This 
13eb0 69 73 20 75 73 65 64 0a 20 20 2a 2a 20 66 6f 72  is used.  ** for
13ec0 20 74 65 73 74 69 6e 67 20 6f 6e 6c 79 20 2d 20   testing only - 
13ed0 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20 53  to verify that S
13ee0 51 4c 69 74 65 20 61 6c 77 61 79 73 20 67 65 74  QLite always get
13ef0 73 20 74 68 65 20 73 61 6d 65 20 61 6e 73 77 65  s the same answe
13f00 72 0a 20 20 2a 2a 20 77 69 74 68 20 61 6e 64 20  r.  ** with and 
13f10 77 69 74 68 6f 75 74 20 74 68 65 20 63 6f 6c 75  without the colu
13f20 6d 6e 20 63 61 63 68 65 2e 0a 20 20 2a 2f 0a 20  mn cache..  */. 
13f30 20 69 66 28 20 4f 70 74 69 6d 69 7a 61 74 69 6f   if( Optimizatio
13f40 6e 44 69 73 61 62 6c 65 64 28 70 50 61 72 73 65  nDisabled(pParse
13f50 2d 3e 64 62 2c 20 53 51 4c 49 54 45 5f 43 6f 6c  ->db, SQLITE_Col
13f60 75 6d 6e 43 61 63 68 65 29 20 29 20 72 65 74 75  umnCache) ) retu
13f70 72 6e 3b 0a 0a 20 20 2f 2a 20 46 69 72 73 74 20  rn;..  /* First 
13f80 72 65 70 6c 61 63 65 20 61 6e 79 20 65 78 69 73  replace any exis
13f90 74 69 6e 67 20 65 6e 74 72 79 2e 0a 20 20 2a 2a  ting entry..  **
13fa0 0a 20 20 2a 2a 20 41 63 74 75 61 6c 6c 79 2c 20  .  ** Actually, 
13fb0 74 68 65 20 77 61 79 20 74 68 65 20 63 6f 6c 75  the way the colu
13fc0 6d 6e 20 63 61 63 68 65 20 69 73 20 63 75 72 72  mn cache is curr
13fd0 65 6e 74 6c 79 20 75 73 65 64 2c 20 77 65 20 61  ently used, we a
13fe0 72 65 20 67 75 61 72 61 6e 74 65 65 64 0a 20 20  re guaranteed.  
13ff0 2a 2a 20 74 68 61 74 20 74 68 65 20 6f 62 6a 65  ** that the obje
14000 63 74 20 77 69 6c 6c 20 6e 65 76 65 72 20 61 6c  ct will never al
14010 72 65 61 64 79 20 62 65 20 69 6e 20 63 61 63 68  ready be in cach
14020 65 2e 20 20 56 65 72 69 66 79 20 74 68 69 73 20  e.  Verify this 
14030 67 75 61 72 61 6e 74 65 65 2e 0a 20 20 2a 2f 0a  guarantee..  */.
14040 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
14050 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72   for(i=0, p=pPar
14060 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69  se->aColCache; i
14070 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43  <SQLITE_N_COLCAC
14080 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20  HE; i++, p++){. 
14090 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 52     assert( p->iR
140a0 65 67 3d 3d 30 20 7c 7c 20 70 2d 3e 69 54 61 62  eg==0 || p->iTab
140b0 6c 65 21 3d 69 54 61 62 20 7c 7c 20 70 2d 3e 69  le!=iTab || p->i
140c0 43 6f 6c 75 6d 6e 21 3d 69 43 6f 6c 20 29 3b 0a  Column!=iCol );.
140d0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
140e0 20 46 69 6e 64 20 61 6e 20 65 6d 70 74 79 20 73   Find an empty s
140f0 6c 6f 74 20 61 6e 64 20 72 65 70 6c 61 63 65 20  lot and replace 
14100 69 74 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c  it */.  for(i=0,
14110 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43   p=pParse->aColC
14120 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e  ache; i<SQLITE_N
14130 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20  _COLCACHE; i++, 
14140 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  p++){.    if( p-
14150 3e 69 52 65 67 3d 3d 30 20 29 7b 0a 20 20 20 20  >iReg==0 ){.    
14160 20 20 70 2d 3e 69 4c 65 76 65 6c 20 3d 20 70 50    p->iLevel = pP
14170 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65  arse->iCacheLeve
14180 6c 3b 0a 20 20 20 20 20 20 70 2d 3e 69 54 61 62  l;.      p->iTab
14190 6c 65 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 20  le = iTab;.     
141a0 20 70 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69 43   p->iColumn = iC
141b0 6f 6c 3b 0a 20 20 20 20 20 20 70 2d 3e 69 52 65  ol;.      p->iRe
141c0 67 20 3d 20 69 52 65 67 3b 0a 20 20 20 20 20 20  g = iReg;.      
141d0 70 2d 3e 74 65 6d 70 52 65 67 20 3d 20 30 3b 0a  p->tempReg = 0;.
141e0 20 20 20 20 20 20 70 2d 3e 6c 72 75 20 3d 20 70        p->lru = p
141f0 50 61 72 73 65 2d 3e 69 43 61 63 68 65 43 6e 74  Parse->iCacheCnt
14200 2b 2b 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ++;.      return
14210 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
14220 2a 20 52 65 70 6c 61 63 65 20 74 68 65 20 6c 61  * Replace the la
14230 73 74 20 72 65 63 65 6e 74 6c 79 20 75 73 65 64  st recently used
14240 20 2a 2f 0a 20 20 6d 69 6e 4c 72 75 20 3d 20 30   */.  minLru = 0
14250 78 37 66 66 66 66 66 66 66 3b 0a 20 20 69 64 78  x7fffffff;.  idx
14260 4c 72 75 20 3d 20 2d 31 3b 0a 20 20 66 6f 72 28  Lru = -1;.  for(
14270 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61  i=0, p=pParse->a
14280 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49  ColCache; i<SQLI
14290 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69  TE_N_COLCACHE; i
142a0 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66  ++, p++){.    if
142b0 28 20 70 2d 3e 6c 72 75 3c 6d 69 6e 4c 72 75 20  ( p->lru<minLru 
142c0 29 7b 0a 20 20 20 20 20 20 69 64 78 4c 72 75 20  ){.      idxLru 
142d0 3d 20 69 3b 0a 20 20 20 20 20 20 6d 69 6e 4c 72  = i;.      minLr
142e0 75 20 3d 20 70 2d 3e 6c 72 75 3b 0a 20 20 20 20  u = p->lru;.    
142f0 7d 0a 20 20 7d 0a 20 20 69 66 28 20 41 4c 57 41  }.  }.  if( ALWA
14300 59 53 28 69 64 78 4c 72 75 3e 3d 30 29 20 29 7b  YS(idxLru>=0) ){
14310 0a 20 20 20 20 70 20 3d 20 26 70 50 61 72 73 65  .    p = &pParse
14320 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 69 64 78 4c  ->aColCache[idxL
14330 72 75 5d 3b 0a 20 20 20 20 70 2d 3e 69 4c 65 76  ru];.    p->iLev
14340 65 6c 20 3d 20 70 50 61 72 73 65 2d 3e 69 43 61  el = pParse->iCa
14350 63 68 65 4c 65 76 65 6c 3b 0a 20 20 20 20 70 2d  cheLevel;.    p-
14360 3e 69 54 61 62 6c 65 20 3d 20 69 54 61 62 3b 0a  >iTable = iTab;.
14370 20 20 20 20 70 2d 3e 69 43 6f 6c 75 6d 6e 20 3d      p->iColumn =
14380 20 69 43 6f 6c 3b 0a 20 20 20 20 70 2d 3e 69 52   iCol;.    p->iR
14390 65 67 20 3d 20 69 52 65 67 3b 0a 20 20 20 20 70  eg = iReg;.    p
143a0 2d 3e 74 65 6d 70 52 65 67 20 3d 20 30 3b 0a 20  ->tempReg = 0;. 
143b0 20 20 20 70 2d 3e 6c 72 75 20 3d 20 70 50 61 72     p->lru = pPar
143c0 73 65 2d 3e 69 43 61 63 68 65 43 6e 74 2b 2b 3b  se->iCacheCnt++;
143d0 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
143e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64 69 63 61  .}../*.** Indica
143f0 74 65 20 74 68 61 74 20 72 65 67 69 73 74 65 72  te that register
14400 73 20 62 65 74 77 65 65 6e 20 69 52 65 67 2e 2e  s between iReg..
14410 69 52 65 67 2b 6e 52 65 67 2d 31 20 61 72 65 20  iReg+nReg-1 are 
14420 62 65 69 6e 67 20 6f 76 65 72 77 72 69 74 74 65  being overwritte
14430 6e 2e 0a 2a 2a 20 50 75 72 67 65 20 74 68 65 20  n..** Purge the 
14440 72 61 6e 67 65 20 6f 66 20 72 65 67 69 73 74 65  range of registe
14450 72 73 20 66 72 6f 6d 20 74 68 65 20 63 6f 6c 75  rs from the colu
14460 6d 6e 20 63 61 63 68 65 2e 0a 2a 2f 0a 76 6f 69  mn cache..*/.voi
14470 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63  d sqlite3ExprCac
14480 68 65 52 65 6d 6f 76 65 28 50 61 72 73 65 20 2a  heRemove(Parse *
14490 70 50 61 72 73 65 2c 20 69 6e 74 20 69 52 65 67  pParse, int iReg
144a0 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20 69  , int nReg){.  i
144b0 6e 74 20 69 3b 0a 20 20 69 6e 74 20 69 4c 61 73  nt i;.  int iLas
144c0 74 20 3d 20 69 52 65 67 20 2b 20 6e 52 65 67 20  t = iReg + nReg 
144d0 2d 20 31 3b 0a 20 20 73 74 72 75 63 74 20 79 43  - 1;.  struct yC
144e0 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20 66 6f  olCache *p;.  fo
144f0 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d  r(i=0, p=pParse-
14500 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51  >aColCache; i<SQ
14510 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b  LITE_N_COLCACHE;
14520 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20   i++, p++){.    
14530 69 6e 74 20 72 20 3d 20 70 2d 3e 69 52 65 67 3b  int r = p->iReg;
14540 0a 20 20 20 20 69 66 28 20 72 3e 3d 69 52 65 67  .    if( r>=iReg
14550 20 26 26 20 72 3c 3d 69 4c 61 73 74 20 29 7b 0a   && r<=iLast ){.
14560 20 20 20 20 20 20 63 61 63 68 65 45 6e 74 72 79        cacheEntry
14570 43 6c 65 61 72 28 70 50 61 72 73 65 2c 20 70 29  Clear(pParse, p)
14580 3b 0a 20 20 20 20 20 20 70 2d 3e 69 52 65 67 20  ;.      p->iReg 
14590 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  = 0;.    }.  }.}
145a0 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 65 6d 62 65 72  ../*.** Remember
145b0 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6c   the current col
145c0 75 6d 6e 20 63 61 63 68 65 20 63 6f 6e 74 65 78  umn cache contex
145d0 74 2e 20 20 41 6e 79 20 6e 65 77 20 65 6e 74 72  t.  Any new entr
145e0 69 65 73 20 61 64 64 65 64 0a 2a 2a 20 61 64 64  ies added.** add
145f0 65 64 20 74 6f 20 74 68 65 20 63 6f 6c 75 6d 6e  ed to the column
14600 20 63 61 63 68 65 20 61 66 74 65 72 20 74 68 69   cache after thi
14610 73 20 63 61 6c 6c 20 61 72 65 20 72 65 6d 6f 76  s call are remov
14620 65 64 20 77 68 65 6e 20 74 68 65 0a 2a 2a 20 63  ed when the.** c
14630 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 70 6f 70  orresponding pop
14640 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 76 6f 69 64   occurs..*/.void
14650 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
14660 65 50 75 73 68 28 50 61 72 73 65 20 2a 70 50 61  ePush(Parse *pPa
14670 72 73 65 29 7b 0a 20 20 70 50 61 72 73 65 2d 3e  rse){.  pParse->
14680 69 43 61 63 68 65 4c 65 76 65 6c 2b 2b 3b 0a 23  iCacheLevel++;.#
14690 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
146a0 55 47 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  UG.  if( pParse-
146b0 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  >db->flags & SQL
146c0 49 54 45 5f 56 64 62 65 41 64 64 6f 70 54 72 61  ITE_VdbeAddopTra
146d0 63 65 20 29 7b 0a 20 20 20 20 70 72 69 6e 74 66  ce ){.    printf
146e0 28 22 50 55 53 48 20 74 6f 20 25 64 5c 6e 22 2c  ("PUSH to %d\n",
146f0 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c   pParse->iCacheL
14700 65 76 65 6c 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  evel);.  }.#endi
14710 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76  f.}../*.** Remov
14720 65 20 66 72 6f 6d 20 74 68 65 20 63 6f 6c 75 6d  e from the colum
14730 6e 20 63 61 63 68 65 20 61 6e 79 20 65 6e 74 72  n cache any entr
14740 69 65 73 20 74 68 61 74 20 77 65 72 65 20 61 64  ies that were ad
14750 64 65 64 20 73 69 6e 63 65 20 74 68 65 0a 2a 2a  ded since the.**
14760 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 73 71   the previous sq
14770 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75  lite3ExprCachePu
14780 73 68 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 49  sh operation.  I
14790 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 72  n other words, r
147a0 65 73 74 6f 72 65 0a 2a 2a 20 74 68 65 20 63 61  estore.** the ca
147b0 63 68 65 20 74 6f 20 74 68 65 20 73 74 61 74 65  che to the state
147c0 20 69 74 20 77 61 73 20 69 6e 20 70 72 69 6f 72   it was in prior
147d0 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
147e0 20 50 75 73 68 2e 0a 2a 2f 0a 76 6f 69 64 20 73   Push..*/.void s
147f0 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
14800 6f 70 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  op(Parse *pParse
14810 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74  ){.  int i;.  st
14820 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a  ruct yColCache *
14830 70 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  p;.  assert( pPa
14840 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c  rse->iCacheLevel
14850 3e 3d 31 20 29 3b 0a 20 20 70 50 61 72 73 65 2d  >=1 );.  pParse-
14860 3e 69 43 61 63 68 65 4c 65 76 65 6c 2d 2d 3b 0a  >iCacheLevel--;.
14870 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
14880 42 55 47 0a 20 20 69 66 28 20 70 50 61 72 73 65  BUG.  if( pParse
14890 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ->db->flags & SQ
148a0 4c 49 54 45 5f 56 64 62 65 41 64 64 6f 70 54 72  LITE_VdbeAddopTr
148b0 61 63 65 20 29 7b 0a 20 20 20 20 70 72 69 6e 74  ace ){.    print
148c0 66 28 22 50 4f 50 20 20 74 6f 20 25 64 5c 6e 22  f("POP  to %d\n"
148d0 2c 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65  , pParse->iCache
148e0 4c 65 76 65 6c 29 3b 0a 20 20 7d 0a 23 65 6e 64  Level);.  }.#end
148f0 69 66 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d  if.  for(i=0, p=
14900 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68  pParse->aColCach
14910 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f  e; i<SQLITE_N_CO
14920 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b  LCACHE; i++, p++
14930 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 52  ){.    if( p->iR
14940 65 67 20 26 26 20 70 2d 3e 69 4c 65 76 65 6c 3e  eg && p->iLevel>
14950 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65  pParse->iCacheLe
14960 76 65 6c 20 29 7b 0a 20 20 20 20 20 20 63 61 63  vel ){.      cac
14970 68 65 45 6e 74 72 79 43 6c 65 61 72 28 70 50 61  heEntryClear(pPa
14980 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 20 20 70  rse, p);.      p
14990 2d 3e 69 52 65 67 20 3d 20 30 3b 0a 20 20 20 20  ->iReg = 0;.    
149a0 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  }.  }.}../*.** W
149b0 68 65 6e 20 61 20 63 61 63 68 65 64 20 63 6f 6c  hen a cached col
149c0 75 6d 6e 20 69 73 20 72 65 75 73 65 64 2c 20 6d  umn is reused, m
149d0 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 69 74  ake sure that it
149e0 73 20 72 65 67 69 73 74 65 72 20 69 73 0a 2a 2a  s register is.**
149f0 20 6e 6f 20 6c 6f 6e 67 65 72 20 61 76 61 69 6c   no longer avail
14a00 61 62 6c 65 20 61 73 20 61 20 74 65 6d 70 20 72  able as a temp r
14a10 65 67 69 73 74 65 72 2e 20 20 74 69 63 6b 65 74  egister.  ticket
14a20 20 23 33 38 37 39 3a 20 20 74 68 61 74 20 73 61   #3879:  that sa
14a30 6d 65 0a 2a 2a 20 72 65 67 69 73 74 65 72 20 6d  me.** register m
14a40 69 67 68 74 20 62 65 20 69 6e 20 74 68 65 20 63  ight be in the c
14a50 61 63 68 65 20 69 6e 20 6d 75 6c 74 69 70 6c 65  ache in multiple
14a60 20 70 6c 61 63 65 73 2c 20 73 6f 20 62 65 20 73   places, so be s
14a70 75 72 65 20 74 6f 0a 2a 2a 20 67 65 74 20 74 68  ure to.** get th
14a80 65 6d 20 61 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69  em all..*/.stati
14a90 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  c void sqlite3Ex
14aa0 70 72 43 61 63 68 65 50 69 6e 52 65 67 69 73 74  prCachePinRegist
14ab0 65 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  er(Parse *pParse
14ac0 2c 20 69 6e 74 20 69 52 65 67 29 7b 0a 20 20 69  , int iReg){.  i
14ad0 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 79  nt i;.  struct y
14ae0 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20 66  ColCache *p;.  f
14af0 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65  or(i=0, p=pParse
14b00 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53  ->aColCache; i<S
14b10 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45  QLITE_N_COLCACHE
14b20 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20  ; i++, p++){.   
14b30 20 69 66 28 20 70 2d 3e 69 52 65 67 3d 3d 69 52   if( p->iReg==iR
14b40 65 67 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 74  eg ){.      p->t
14b50 65 6d 70 52 65 67 20 3d 20 30 3b 0a 20 20 20 20  empReg = 0;.    
14b60 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 47 65 6e 65  }.  }.}../* Gene
14b70 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77  rate code that w
14b80 69 6c 6c 20 6c 6f 61 64 20 69 6e 74 6f 20 72 65  ill load into re
14b90 67 69 73 74 65 72 20 72 65 67 4f 75 74 20 61 20  gister regOut a 
14ba0 76 61 6c 75 65 20 74 68 61 74 20 69 73 0a 2a 2a  value that is.**
14bb0 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72   appropriate for
14bc0 20 74 68 65 20 69 49 64 78 43 6f 6c 2d 74 68 20   the iIdxCol-th 
14bd0 63 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78 20  column of index 
14be0 70 49 64 78 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  pIdx..*/.void sq
14bf0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4c 6f 61  lite3ExprCodeLoa
14c00 64 49 6e 64 65 78 43 6f 6c 75 6d 6e 28 0a 20 20  dIndexColumn(.  
14c10 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
14c20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63  /* The parsing c
14c30 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 49 6e 64 65  ontext */.  Inde
14c40 78 20 2a 70 49 64 78 2c 20 20 20 20 2f 2a 20 54  x *pIdx,    /* T
14c50 68 65 20 69 6e 64 65 78 20 77 68 6f 73 65 20 63  he index whose c
14c60 6f 6c 75 6d 6e 20 69 73 20 74 6f 20 62 65 20 6c  olumn is to be l
14c70 6f 61 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69  oaded */.  int i
14c80 54 61 62 43 75 72 2c 20 20 20 20 2f 2a 20 43 75  TabCur,    /* Cu
14c90 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f  rsor pointing to
14ca0 20 61 20 74 61 62 6c 65 20 72 6f 77 20 2a 2f 0a   a table row */.
14cb0 20 20 69 6e 74 20 69 49 64 78 43 6f 6c 2c 20 20    int iIdxCol,  
14cc0 20 20 2f 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20    /* The column 
14cd0 6f 66 20 74 68 65 20 69 6e 64 65 78 20 74 6f 20  of the index to 
14ce0 62 65 20 6c 6f 61 64 65 64 20 2a 2f 0a 20 20 69  be loaded */.  i
14cf0 6e 74 20 72 65 67 4f 75 74 20 20 20 20 20 20 2f  nt regOut      /
14d00 2a 20 53 74 6f 72 65 20 74 68 65 20 69 6e 64 65  * Store the inde
14d10 78 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69  x column value i
14d20 6e 20 74 68 69 73 20 72 65 67 69 73 74 65 72 20  n this register 
14d30 2a 2f 0a 29 7b 0a 20 20 69 31 36 20 69 54 61 62  */.){.  i16 iTab
14d40 43 6f 6c 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f  Col = pIdx->aiCo
14d50 6c 75 6d 6e 5b 69 49 64 78 43 6f 6c 5d 3b 0a 20  lumn[iIdxCol];. 
14d60 20 69 66 28 20 69 54 61 62 43 6f 6c 3e 3d 28 2d   if( iTabCol>=(-
14d70 31 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  1) ){.    sqlite
14d80 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75  3ExprCodeGetColu
14d90 6d 6e 4f 66 54 61 62 6c 65 28 70 50 61 72 73 65  mnOfTable(pParse
14da0 2d 3e 70 56 64 62 65 2c 20 70 49 64 78 2d 3e 70  ->pVdbe, pIdx->p
14db0 54 61 62 6c 65 2c 20 69 54 61 62 43 75 72 2c 0a  Table, iTabCur,.
14dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14de0 20 20 20 20 69 54 61 62 43 6f 6c 2c 20 72 65 67      iTabCol, reg
14df0 4f 75 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  Out);.    return
14e00 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
14e10 70 49 64 78 2d 3e 61 43 6f 6c 45 78 70 72 20 29  pIdx->aColExpr )
14e20 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 64 78  ;.  assert( pIdx
14e30 2d 3e 61 43 6f 6c 45 78 70 72 2d 3e 6e 45 78 70  ->aColExpr->nExp
14e40 72 3e 69 49 64 78 43 6f 6c 20 29 3b 0a 20 20 70  r>iIdxCol );.  p
14e50 50 61 72 73 65 2d 3e 69 53 65 6c 66 54 61 62 20  Parse->iSelfTab 
14e60 3d 20 69 54 61 62 43 75 72 3b 0a 20 20 73 71 6c  = iTabCur;.  sql
14e70 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
14e80 72 73 65 2c 20 70 49 64 78 2d 3e 61 43 6f 6c 45  rse, pIdx->aColE
14e90 78 70 72 2d 3e 61 5b 69 49 64 78 43 6f 6c 5d 2e  xpr->a[iIdxCol].
14ea0 70 45 78 70 72 2c 20 72 65 67 4f 75 74 29 3b 0a  pExpr, regOut);.
14eb0 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
14ec0 65 20 63 6f 64 65 20 74 6f 20 65 78 74 72 61 63  e code to extrac
14ed0 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  t the value of t
14ee0 68 65 20 69 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d  he iCol-th colum
14ef0 6e 20 6f 66 20 61 20 74 61 62 6c 65 2e 0a 2a 2f  n of a table..*/
14f00 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
14f10 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 4f 66  rCodeGetColumnOf
14f20 54 61 62 6c 65 28 0a 20 20 56 64 62 65 20 2a 76  Table(.  Vdbe *v
14f30 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ,        /* The 
14f40 56 44 42 45 20 75 6e 64 65 72 20 63 6f 6e 73 74  VDBE under const
14f50 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 61 62  ruction */.  Tab
14f60 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 2f 2a 20  le *pTab,    /* 
14f70 54 68 65 20 74 61 62 6c 65 20 63 6f 6e 74 61 69  The table contai
14f80 6e 69 6e 67 20 74 68 65 20 76 61 6c 75 65 20 2a  ning the value *
14f90 2f 0a 20 20 69 6e 74 20 69 54 61 62 43 75 72 2c  /.  int iTabCur,
14fa0 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65      /* The table
14fb0 20 63 75 72 73 6f 72 2e 20 20 4f 72 20 74 68 65   cursor.  Or the
14fc0 20 50 4b 20 63 75 72 73 6f 72 20 66 6f 72 20 57   PK cursor for W
14fd0 49 54 48 4f 55 54 20 52 4f 57 49 44 20 2a 2f 0a  ITHOUT ROWID */.
14fe0 20 20 69 6e 74 20 69 43 6f 6c 2c 20 20 20 20 20    int iCol,     
14ff0 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68    /* Index of th
15000 65 20 63 6f 6c 75 6d 6e 20 74 6f 20 65 78 74 72  e column to extr
15010 61 63 74 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  act */.  int reg
15020 4f 75 74 20 20 20 20 20 20 2f 2a 20 45 78 74 72  Out      /* Extr
15030 61 63 74 20 74 68 65 20 76 61 6c 75 65 20 69 6e  act the value in
15040 74 6f 20 74 68 69 73 20 72 65 67 69 73 74 65 72  to this register
15050 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 69 43 6f   */.){.  if( iCo
15060 6c 3c 30 20 7c 7c 20 69 43 6f 6c 3d 3d 70 54 61  l<0 || iCol==pTa
15070 62 2d 3e 69 50 4b 65 79 20 29 7b 0a 20 20 20 20  b->iPKey ){.    
15080 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15090 32 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 69  2(v, OP_Rowid, i
150a0 54 61 62 43 75 72 2c 20 72 65 67 4f 75 74 29 3b  TabCur, regOut);
150b0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
150c0 74 20 6f 70 20 3d 20 49 73 56 69 72 74 75 61 6c  t op = IsVirtual
150d0 28 70 54 61 62 29 20 3f 20 4f 50 5f 56 43 6f 6c  (pTab) ? OP_VCol
150e0 75 6d 6e 20 3a 20 4f 50 5f 43 6f 6c 75 6d 6e 3b  umn : OP_Column;
150f0 0a 20 20 20 20 69 6e 74 20 78 20 3d 20 69 43 6f  .    int x = iCo
15100 6c 3b 0a 20 20 20 20 69 66 28 20 21 48 61 73 52  l;.    if( !HasR
15110 6f 77 69 64 28 70 54 61 62 29 20 29 7b 0a 20 20  owid(pTab) ){.  
15120 20 20 20 20 78 20 3d 20 73 71 6c 69 74 65 33 43      x = sqlite3C
15130 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78 28 73 71 6c  olumnOfIndex(sql
15140 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e  ite3PrimaryKeyIn
15150 64 65 78 28 70 54 61 62 29 2c 20 69 43 6f 6c 29  dex(pTab), iCol)
15160 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
15170 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
15180 20 6f 70 2c 20 69 54 61 62 43 75 72 2c 20 78 2c   op, iTabCur, x,
15190 20 72 65 67 4f 75 74 29 3b 0a 20 20 7d 0a 20 20   regOut);.  }.  
151a0 69 66 28 20 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20  if( iCol>=0 ){. 
151b0 20 20 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e     sqlite3Column
151c0 44 65 66 61 75 6c 74 28 76 2c 20 70 54 61 62 2c  Default(v, pTab,
151d0 20 69 43 6f 6c 2c 20 72 65 67 4f 75 74 29 3b 0a   iCol, regOut);.
151e0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e    }.}../*.** Gen
151f0 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
15200 77 69 6c 6c 20 65 78 74 72 61 63 74 20 74 68 65  will extract the
15210 20 69 43 6f 6c 75 6d 6e 2d 74 68 20 63 6f 6c 75   iColumn-th colu
15220 6d 6e 20 66 72 6f 6d 0a 2a 2a 20 74 61 62 6c 65  mn from.** table
15230 20 70 54 61 62 20 61 6e 64 20 73 74 6f 72 65 20   pTab and store 
15240 74 68 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65  the column value
15250 20 69 6e 20 61 20 72 65 67 69 73 74 65 72 2e 20   in a register. 
15260 20 41 6e 20 65 66 66 6f 72 74 0a 2a 2a 20 69 73   An effort.** is
15270 20 6d 61 64 65 20 74 6f 20 73 74 6f 72 65 20 74   made to store t
15280 68 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20  he column value 
15290 69 6e 20 72 65 67 69 73 74 65 72 20 69 52 65 67  in register iReg
152a0 2c 20 62 75 74 20 74 68 69 73 20 69 73 0a 2a 2a  , but this is.**
152b0 20 6e 6f 74 20 67 75 61 72 61 6e 74 65 65 64 2e   not guaranteed.
152c0 20 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f    The location o
152d0 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 76 61 6c  f the column val
152e0 75 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  ue is returned..
152f0 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73 74  **.** There must
15300 20 62 65 20 61 6e 20 6f 70 65 6e 20 63 75 72 73   be an open curs
15310 6f 72 20 74 6f 20 70 54 61 62 20 69 6e 20 69 54  or to pTab in iT
15320 61 62 6c 65 20 77 68 65 6e 20 74 68 69 73 20 72  able when this r
15330 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c  outine.** is cal
15340 6c 65 64 2e 20 20 49 66 20 69 43 6f 6c 75 6d 6e  led.  If iColumn
15350 3c 30 20 74 68 65 6e 20 63 6f 64 65 20 69 73 20  <0 then code is 
15360 67 65 6e 65 72 61 74 65 64 20 74 68 61 74 20 65  generated that e
15370 78 74 72 61 63 74 73 20 74 68 65 20 72 6f 77 69  xtracts the rowi
15380 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
15390 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75  3ExprCodeGetColu
153a0 6d 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  mn(.  Parse *pPa
153b0 72 73 65 2c 20 20 20 2f 2a 20 50 61 72 73 69 6e  rse,   /* Parsin
153c0 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72  g and code gener
153d0 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  ating context */
153e0 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20  .  Table *pTab, 
153f0 20 20 20 20 2f 2a 20 44 65 73 63 72 69 70 74 69      /* Descripti
15400 6f 6e 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  on of the table 
15410 77 65 20 61 72 65 20 72 65 61 64 69 6e 67 20 66  we are reading f
15420 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f  rom */.  int iCo
15430 6c 75 6d 6e 2c 20 20 20 20 20 2f 2a 20 49 6e 64  lumn,     /* Ind
15440 65 78 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  ex of the table 
15450 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 69 6e 74 20  column */.  int 
15460 69 54 61 62 6c 65 2c 20 20 20 20 20 20 2f 2a 20  iTable,      /* 
15470 54 68 65 20 63 75 72 73 6f 72 20 70 6f 69 6e 74  The cursor point
15480 69 6e 67 20 74 6f 20 74 68 65 20 74 61 62 6c 65  ing to the table
15490 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65 67 2c 20   */.  int iReg, 
154a0 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20         /* Store 
154b0 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a  results here */.
154c0 20 20 75 38 20 70 35 20 20 20 20 20 20 20 20 20    u8 p5         
154d0 20 20 20 2f 2a 20 50 35 20 76 61 6c 75 65 20 66     /* P5 value f
154e0 6f 72 20 4f 50 5f 43 6f 6c 75 6d 6e 20 2a 2f 0a  or OP_Column */.
154f0 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
15500 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
15510 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
15520 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 0a 20  yColCache *p;.. 
15530 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72   for(i=0, p=pPar
15540 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69  se->aColCache; i
15550 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43  <SQLITE_N_COLCAC
15560 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20  HE; i++, p++){. 
15570 20 20 20 69 66 28 20 70 2d 3e 69 52 65 67 3e 30     if( p->iReg>0
15580 20 26 26 20 70 2d 3e 69 54 61 62 6c 65 3d 3d 69   && p->iTable==i
15590 54 61 62 6c 65 20 26 26 20 70 2d 3e 69 43 6f 6c  Table && p->iCol
155a0 75 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e 20 29 7b 0a  umn==iColumn ){.
155b0 20 20 20 20 20 20 70 2d 3e 6c 72 75 20 3d 20 70        p->lru = p
155c0 50 61 72 73 65 2d 3e 69 43 61 63 68 65 43 6e 74  Parse->iCacheCnt
155d0 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ++;.      sqlite
155e0 33 45 78 70 72 43 61 63 68 65 50 69 6e 52 65 67  3ExprCachePinReg
155f0 69 73 74 65 72 28 70 50 61 72 73 65 2c 20 70 2d  ister(pParse, p-
15600 3e 69 52 65 67 29 3b 0a 20 20 20 20 20 20 72 65  >iReg);.      re
15610 74 75 72 6e 20 70 2d 3e 69 52 65 67 3b 0a 20 20  turn p->iReg;.  
15620 20 20 7d 0a 20 20 7d 20 20 0a 20 20 61 73 73 65    }.  }  .  asse
15630 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 73 71  rt( v!=0 );.  sq
15640 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74  lite3ExprCodeGet
15650 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65 28 76 2c  ColumnOfTable(v,
15660 20 70 54 61 62 2c 20 69 54 61 62 6c 65 2c 20 69   pTab, iTable, i
15670 43 6f 6c 75 6d 6e 2c 20 69 52 65 67 29 3b 0a 20  Column, iReg);. 
15680 20 69 66 28 20 70 35 20 29 7b 0a 20 20 20 20 73   if( p5 ){.    s
15690 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
156a0 50 35 28 76 2c 20 70 35 29 3b 0a 20 20 7d 65 6c  P5(v, p5);.  }el
156b0 73 65 7b 20 20 20 0a 20 20 20 20 73 71 6c 69 74  se{   .    sqlit
156c0 65 33 45 78 70 72 43 61 63 68 65 53 74 6f 72 65  e3ExprCacheStore
156d0 28 70 50 61 72 73 65 2c 20 69 54 61 62 6c 65 2c  (pParse, iTable,
156e0 20 69 43 6f 6c 75 6d 6e 2c 20 69 52 65 67 29 3b   iColumn, iReg);
156f0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 52  .  }.  return iR
15700 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65  eg;.}../*.** Cle
15710 61 72 20 61 6c 6c 20 63 6f 6c 75 6d 6e 20 63 61  ar all column ca
15720 63 68 65 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a  che entries..*/.
15730 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
15740 43 61 63 68 65 43 6c 65 61 72 28 50 61 72 73 65  CacheClear(Parse
15750 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 69 6e 74   *pParse){.  int
15760 20 69 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f   i;.  struct yCo
15770 6c 43 61 63 68 65 20 2a 70 3b 0a 0a 23 69 66 20  lCache *p;..#if 
15780 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69  SQLITE_DEBUG.  i
15790 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66  f( pParse->db->f
157a0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 56 64  lags & SQLITE_Vd
157b0 62 65 41 64 64 6f 70 54 72 61 63 65 20 29 7b 0a  beAddopTrace ){.
157c0 20 20 20 20 70 72 69 6e 74 66 28 22 43 4c 45 41      printf("CLEA
157d0 52 5c 6e 22 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  R\n");.  }.#endi
157e0 66 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70  f.  for(i=0, p=p
157f0 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65  Parse->aColCache
15800 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c  ; i<SQLITE_N_COL
15810 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29  CACHE; i++, p++)
15820 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 52 65  {.    if( p->iRe
15830 67 20 29 7b 0a 20 20 20 20 20 20 63 61 63 68 65  g ){.      cache
15840 45 6e 74 72 79 43 6c 65 61 72 28 70 50 61 72 73  EntryClear(pPars
15850 65 2c 20 70 29 3b 0a 20 20 20 20 20 20 70 2d 3e  e, p);.      p->
15860 69 52 65 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  iReg = 0;.    }.
15870 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63    }.}../*.** Rec
15880 6f 72 64 20 74 68 65 20 66 61 63 74 20 74 68 61  ord the fact tha
15890 74 20 61 6e 20 61 66 66 69 6e 69 74 79 20 63 68  t an affinity ch
158a0 61 6e 67 65 20 68 61 73 20 6f 63 63 75 72 72 65  ange has occurre
158b0 64 20 6f 6e 20 69 43 6f 75 6e 74 0a 2a 2a 20 72  d on iCount.** r
158c0 65 67 69 73 74 65 72 73 20 73 74 61 72 74 69 6e  egisters startin
158d0 67 20 77 69 74 68 20 69 53 74 61 72 74 2e 0a 2a  g with iStart..*
158e0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
158f0 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43  prCacheAffinityC
15900 68 61 6e 67 65 28 50 61 72 73 65 20 2a 70 50 61  hange(Parse *pPa
15910 72 73 65 2c 20 69 6e 74 20 69 53 74 61 72 74 2c  rse, int iStart,
15920 20 69 6e 74 20 69 43 6f 75 6e 74 29 7b 0a 20 20   int iCount){.  
15930 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
15940 52 65 6d 6f 76 65 28 70 50 61 72 73 65 2c 20 69  Remove(pParse, i
15950 53 74 61 72 74 2c 20 69 43 6f 75 6e 74 29 3b 0a  Start, iCount);.
15960 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
15970 65 20 63 6f 64 65 20 74 6f 20 6d 6f 76 65 20 63  e code to move c
15980 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 72 65 67 69  ontent from regi
15990 73 74 65 72 73 20 69 46 72 6f 6d 2e 2e 2e 69 46  sters iFrom...iF
159a0 72 6f 6d 2b 6e 52 65 67 2d 31 0a 2a 2a 20 6f 76  rom+nReg-1.** ov
159b0 65 72 20 74 6f 20 69 54 6f 2e 2e 69 54 6f 2b 6e  er to iTo..iTo+n
159c0 52 65 67 2d 31 2e 20 4b 65 65 70 20 74 68 65 20  Reg-1. Keep the 
159d0 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 75 70 2d  column cache up-
159e0 74 6f 2d 64 61 74 65 2e 0a 2a 2f 0a 76 6f 69 64  to-date..*/.void
159f0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
15a00 4d 6f 76 65 28 50 61 72 73 65 20 2a 70 50 61 72  Move(Parse *pPar
15a10 73 65 2c 20 69 6e 74 20 69 46 72 6f 6d 2c 20 69  se, int iFrom, i
15a20 6e 74 20 69 54 6f 2c 20 69 6e 74 20 6e 52 65 67  nt iTo, int nReg
15a30 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 46 72  ){.  assert( iFr
15a40 6f 6d 3e 3d 69 54 6f 2b 6e 52 65 67 20 7c 7c 20  om>=iTo+nReg || 
15a50 69 46 72 6f 6d 2b 6e 52 65 67 3c 3d 69 54 6f 20  iFrom+nReg<=iTo 
15a60 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
15a70 41 64 64 4f 70 33 28 70 50 61 72 73 65 2d 3e 70  AddOp3(pParse->p
15a80 56 64 62 65 2c 20 4f 50 5f 4d 6f 76 65 2c 20 69  Vdbe, OP_Move, i
15a90 46 72 6f 6d 2c 20 69 54 6f 2c 20 6e 52 65 67 29  From, iTo, nReg)
15aa0 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43  ;.  sqlite3ExprC
15ab0 61 63 68 65 52 65 6d 6f 76 65 28 70 50 61 72 73  acheRemove(pPars
15ac0 65 2c 20 69 46 72 6f 6d 2c 20 6e 52 65 67 29 3b  e, iFrom, nReg);
15ad0 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .}..#if defined(
15ae0 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20 7c 7c  SQLITE_DEBUG) ||
15af0 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
15b00 43 4f 56 45 52 41 47 45 5f 54 45 53 54 29 0a 2f  COVERAGE_TEST)./
15b10 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
15b20 20 69 66 20 61 6e 79 20 72 65 67 69 73 74 65 72   if any register
15b30 20 69 6e 20 74 68 65 20 72 61 6e 67 65 20 69 46   in the range iF
15b40 72 6f 6d 2e 2e 69 54 6f 20 28 69 6e 63 6c 75 73  rom..iTo (inclus
15b50 69 76 65 29 0a 2a 2a 20 69 73 20 75 73 65 64 20  ive).** is used 
15b60 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 63  as part of the c
15b70 6f 6c 75 6d 6e 20 63 61 63 68 65 2e 0a 2a 2a 0a  olumn cache..**.
15b80 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
15b90 69 73 20 75 73 65 64 20 77 69 74 68 69 6e 20 61  is used within a
15ba0 73 73 65 72 74 28 29 20 61 6e 64 20 74 65 73 74  ssert() and test
15bb0 63 61 73 65 28 29 20 6d 61 63 72 6f 73 20 6f 6e  case() macros on
15bc0 6c 79 0a 2a 2a 20 61 6e 64 20 64 6f 65 73 20 6e  ly.** and does n
15bd0 6f 74 20 61 70 70 65 61 72 20 69 6e 20 61 20 6e  ot appear in a n
15be0 6f 72 6d 61 6c 20 62 75 69 6c 64 2e 0a 2a 2f 0a  ormal build..*/.
15bf0 73 74 61 74 69 63 20 69 6e 74 20 75 73 65 64 41  static int usedA
15c00 73 43 6f 6c 75 6d 6e 43 61 63 68 65 28 50 61 72  sColumnCache(Par
15c10 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
15c20 69 46 72 6f 6d 2c 20 69 6e 74 20 69 54 6f 29 7b  iFrom, int iTo){
15c30 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75  .  int i;.  stru
15c40 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b  ct yColCache *p;
15c50 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50  .  for(i=0, p=pP
15c60 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b  arse->aColCache;
15c70 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43   i<SQLITE_N_COLC
15c80 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b  ACHE; i++, p++){
15c90 0a 20 20 20 20 69 6e 74 20 72 20 3d 20 70 2d 3e  .    int r = p->
15ca0 69 52 65 67 3b 0a 20 20 20 20 69 66 28 20 72 3e  iReg;.    if( r>
15cb0 3d 69 46 72 6f 6d 20 26 26 20 72 3c 3d 69 54 6f  =iFrom && r<=iTo
15cc0 20 29 20 72 65 74 75 72 6e 20 31 3b 20 20 20 20   ) return 1;    
15cd0 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a 20 20 7d 0a  /*NO_TEST*/.  }.
15ce0 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65    return 0;.}.#e
15cf0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44  ndif /* SQLITE_D
15d00 45 42 55 47 20 7c 7c 20 53 51 4c 49 54 45 5f 43  EBUG || SQLITE_C
15d10 4f 56 45 52 41 47 45 5f 54 45 53 54 20 2a 2f 0a  OVERAGE_TEST */.
15d20 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61  ./*.** Convert a
15d30 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64  n expression nod
15d40 65 20 74 6f 20 61 20 54 4b 5f 52 45 47 49 53 54  e to a TK_REGIST
15d50 45 52 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ER.*/.static voi
15d60 64 20 65 78 70 72 54 6f 52 65 67 69 73 74 65 72  d exprToRegister
15d70 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 69 52  (Expr *p, int iR
15d80 65 67 29 7b 0a 20 20 70 2d 3e 6f 70 32 20 3d 20  eg){.  p->op2 = 
15d90 70 2d 3e 6f 70 3b 0a 20 20 70 2d 3e 6f 70 20 3d  p->op;.  p->op =
15da0 20 54 4b 5f 52 45 47 49 53 54 45 52 3b 0a 20 20   TK_REGISTER;.  
15db0 70 2d 3e 69 54 61 62 6c 65 20 3d 20 69 52 65 67  p->iTable = iReg
15dc0 3b 0a 20 20 45 78 70 72 43 6c 65 61 72 50 72 6f  ;.  ExprClearPro
15dd0 70 65 72 74 79 28 70 2c 20 45 50 5f 53 6b 69 70  perty(p, EP_Skip
15de0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  );.}../*.** Gene
15df0 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74  rate code into t
15e00 68 65 20 63 75 72 72 65 6e 74 20 56 64 62 65 20  he current Vdbe 
15e10 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65 20  to evaluate the 
15e20 67 69 76 65 6e 0a 2a 2a 20 65 78 70 72 65 73 73  given.** express
15e30 69 6f 6e 2e 20 20 41 74 74 65 6d 70 74 20 74 6f  ion.  Attempt to
15e40 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   store the resul
15e50 74 73 20 69 6e 20 72 65 67 69 73 74 65 72 20 22  ts in register "
15e60 74 61 72 67 65 74 22 2e 0a 2a 2a 20 52 65 74 75  target"..** Retu
15e70 72 6e 20 74 68 65 20 72 65 67 69 73 74 65 72 20  rn the register 
15e80 77 68 65 72 65 20 72 65 73 75 6c 74 73 20 61 72  where results ar
15e90 65 20 73 74 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20  e stored..**.** 
15ea0 57 69 74 68 20 74 68 69 73 20 72 6f 75 74 69 6e  With this routin
15eb0 65 2c 20 74 68 65 72 65 20 69 73 20 6e 6f 20 67  e, there is no g
15ec0 75 61 72 61 6e 74 65 65 20 74 68 61 74 20 72 65  uarantee that re
15ed0 73 75 6c 74 73 20 77 69 6c 6c 0a 2a 2a 20 62 65  sults will.** be
15ee0 20 73 74 6f 72 65 64 20 69 6e 20 74 61 72 67 65   stored in targe
15ef0 74 2e 20 20 54 68 65 20 72 65 73 75 6c 74 20 6d  t.  The result m
15f00 69 67 68 74 20 62 65 20 73 74 6f 72 65 64 20 69  ight be stored i
15f10 6e 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20  n some other.** 
15f20 72 65 67 69 73 74 65 72 20 69 66 20 69 74 20 69  register if it i
15f30 73 20 63 6f 6e 76 65 6e 69 65 6e 74 20 74 6f 20  s convenient to 
15f40 64 6f 20 73 6f 2e 20 20 54 68 65 20 63 61 6c 6c  do so.  The call
15f50 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  ing function.** 
15f60 6d 75 73 74 20 63 68 65 63 6b 20 74 68 65 20 72  must check the r
15f70 65 74 75 72 6e 20 63 6f 64 65 20 61 6e 64 20 6d  eturn code and m
15f80 6f 76 65 20 74 68 65 20 72 65 73 75 6c 74 73 20  ove the results 
15f90 74 6f 20 74 68 65 20 64 65 73 69 72 65 64 0a 2a  to the desired.*
15fa0 2a 20 72 65 67 69 73 74 65 72 2e 0a 2a 2f 0a 69  * register..*/.i
15fb0 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  nt sqlite3ExprCo
15fc0 64 65 54 61 72 67 65 74 28 50 61 72 73 65 20 2a  deTarget(Parse *
15fd0 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
15fe0 78 70 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29  xpr, int target)
15ff0 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
16000 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 2f 2a  arse->pVdbe;  /*
16010 20 54 68 65 20 56 4d 20 75 6e 64 65 72 20 63 6f   The VM under co
16020 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20  nstruction */.  
16030 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20  int op;         
16040 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
16050 20 6f 70 63 6f 64 65 20 62 65 69 6e 67 20 63 6f   opcode being co
16060 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 52  ded */.  int inR
16070 65 67 20 3d 20 74 61 72 67 65 74 3b 20 20 20 20  eg = target;    
16080 20 20 20 2f 2a 20 52 65 73 75 6c 74 73 20 73 74     /* Results st
16090 6f 72 65 64 20 69 6e 20 72 65 67 69 73 74 65 72  ored in register
160a0 20 69 6e 52 65 67 20 2a 2f 0a 20 20 69 6e 74 20   inReg */.  int 
160b0 72 65 67 46 72 65 65 31 20 3d 20 30 3b 20 20 20  regFree1 = 0;   
160c0 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d        /* If non-
160d0 7a 65 72 6f 20 66 72 65 65 20 74 68 69 73 20 74  zero free this t
160e0 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74 65  emporary registe
160f0 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 46 72  r */.  int regFr
16100 65 65 32 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ee2 = 0;        
16110 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20   /* If non-zero 
16120 66 72 65 65 20 74 68 69 73 20 74 65 6d 70 6f 72  free this tempor
16130 61 72 79 20 72 65 67 69 73 74 65 72 20 2a 2f 0a  ary register */.
16140 20 20 69 6e 74 20 72 31 2c 20 72 32 2c 20 72 33    int r1, r2, r3
16150 2c 20 72 34 3b 20 20 20 20 20 20 20 2f 2a 20 56  , r4;       /* V
16160 61 72 69 6f 75 73 20 72 65 67 69 73 74 65 72 20  arious register 
16170 6e 75 6d 62 65 72 73 20 2a 2f 0a 20 20 73 71 6c  numbers */.  sql
16180 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
16190 65 2d 3e 64 62 3b 20 2f 2a 20 54 68 65 20 64 61  e->db; /* The da
161a0 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
161b0 6e 20 2a 2f 0a 20 20 45 78 70 72 20 74 65 6d 70  n */.  Expr temp
161c0 58 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  X;              
161d0 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 65 78   /* Temporary ex
161e0 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 2a 2f  pression node */
161f0 0a 0a 20 20 61 73 73 65 72 74 28 20 74 61 72 67  ..  assert( targ
16200 65 74 3e 30 20 26 26 20 74 61 72 67 65 74 3c 3d  et>0 && target<=
16210 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 29 3b 0a  pParse->nMem );.
16220 20 20 69 66 28 20 76 3d 3d 30 20 29 7b 0a 20 20    if( v==0 ){.  
16230 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
16240 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
16250 65 64 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ed );.    return
16260 20 30 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70   0;.  }..  if( p
16270 45 78 70 72 3d 3d 30 20 29 7b 0a 20 20 20 20 6f  Expr==0 ){.    o
16280 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 7d  p = TK_NULL;.  }
16290 65 6c 73 65 7b 0a 20 20 20 20 6f 70 20 3d 20 70  else{.    op = p
162a0 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 7d 0a 20 20  Expr->op;.  }.  
162b0 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20  switch( op ){.  
162c0 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f    case TK_AGG_CO
162d0 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 41 67  LUMN: {.      Ag
162e0 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 20  gInfo *pAggInfo 
162f0 3d 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66  = pExpr->pAggInf
16300 6f 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  o;.      struct 
16310 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f  AggInfo_col *pCo
16320 6c 20 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e 61  l = &pAggInfo->a
16330 43 6f 6c 5b 70 45 78 70 72 2d 3e 69 41 67 67 5d  Col[pExpr->iAgg]
16340 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 41 67  ;.      if( !pAg
16350 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64  gInfo->directMod
16360 65 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  e ){.        ass
16370 65 72 74 28 20 70 43 6f 6c 2d 3e 69 4d 65 6d 3e  ert( pCol->iMem>
16380 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 52  0 );.        inR
16390 65 67 20 3d 20 70 43 6f 6c 2d 3e 69 4d 65 6d 3b  eg = pCol->iMem;
163a0 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
163b0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
163c0 70 41 67 67 49 6e 66 6f 2d 3e 75 73 65 53 6f 72  pAggInfo->useSor
163d0 74 69 6e 67 49 64 78 20 29 7b 0a 20 20 20 20 20  tingIdx ){.     
163e0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
163f0 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
16400 6e 2c 20 70 41 67 67 49 6e 66 6f 2d 3e 73 6f 72  n, pAggInfo->sor
16410 74 69 6e 67 49 64 78 50 54 61 62 2c 0a 20 20 20  tingIdxPTab,.   
16420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16430 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
16440 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 2c 20  >iSorterColumn, 
16450 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20  target);.       
16460 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
16470 20 20 20 20 20 20 2f 2a 20 4f 74 68 65 72 77 69        /* Otherwi
16480 73 65 2c 20 66 61 6c 6c 20 74 68 72 75 20 69 6e  se, fall thru in
16490 74 6f 20 74 68 65 20 54 4b 5f 43 4f 4c 55 4d 4e  to the TK_COLUMN
164a0 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 7d 0a 20   case */.    }. 
164b0 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d     case TK_COLUM
164c0 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  N: {.      int i
164d0 54 61 62 20 3d 20 70 45 78 70 72 2d 3e 69 54 61  Tab = pExpr->iTa
164e0 62 6c 65 3b 0a 20 20 20 20 20 20 69 66 28 20 69  ble;.      if( i
164f0 54 61 62 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  Tab<0 ){.       
16500 20 69 66 28 20 70 50 61 72 73 65 2d 3e 63 6b 42   if( pParse->ckB
16510 61 73 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  ase>0 ){.       
16520 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 69 6e 67     /* Generating
16530 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e   CHECK constrain
16540 74 73 20 6f 72 20 69 6e 73 65 72 74 69 6e 67 20  ts or inserting 
16550 69 6e 74 6f 20 70 61 72 74 69 61 6c 20 69 6e 64  into partial ind
16560 65 78 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ex */.          
16570 69 6e 52 65 67 20 3d 20 70 45 78 70 72 2d 3e 69  inReg = pExpr->i
16580 43 6f 6c 75 6d 6e 20 2b 20 70 50 61 72 73 65 2d  Column + pParse-
16590 3e 63 6b 42 61 73 65 3b 0a 20 20 20 20 20 20 20  >ckBase;.       
165a0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
165b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
165c0 20 20 20 2f 2a 20 43 6f 64 69 6e 67 20 61 6e 20     /* Coding an 
165d0 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20  expression that 
165e0 69 73 20 70 61 72 74 20 6f 66 20 61 6e 20 69 6e  is part of an in
165f0 64 65 78 20 77 68 65 72 65 20 63 6f 6c 75 6d 6e  dex where column
16600 20 6e 61 6d 65 73 0a 20 20 20 20 20 20 20 20 20   names.         
16610 20 2a 2a 20 69 6e 20 74 68 65 20 69 6e 64 65 78   ** in the index
16620 20 72 65 66 65 72 20 74 6f 20 74 68 65 20 74 61   refer to the ta
16630 62 6c 65 20 74 6f 20 77 68 69 63 68 20 74 68 65  ble to which the
16640 20 69 6e 64 65 78 20 62 65 6c 6f 6e 67 73 20 2a   index belongs *
16650 2f 0a 20 20 20 20 20 20 20 20 20 20 69 54 61 62  /.          iTab
16660 20 3d 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 66   = pParse->iSelf
16670 54 61 62 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  Tab;.        }. 
16680 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 6e 52       }.      inR
16690 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  eg = sqlite3Expr
166a0 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28 70 50  CodeGetColumn(pP
166b0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 54 61  arse, pExpr->pTa
166c0 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  b,.             
166d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
166e0 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e    pExpr->iColumn
166f0 2c 20 69 54 61 62 2c 20 74 61 72 67 65 74 2c 0a  , iTab, target,.
16700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
16720 45 78 70 72 2d 3e 6f 70 32 29 3b 0a 20 20 20 20  Expr->op2);.    
16730 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
16740 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 47     case TK_INTEG
16750 45 52 3a 20 7b 0a 20 20 20 20 20 20 63 6f 64 65  ER: {.      code
16760 49 6e 74 65 67 65 72 28 70 50 61 72 73 65 2c 20  Integer(pParse, 
16770 70 45 78 70 72 2c 20 30 2c 20 74 61 72 67 65 74  pExpr, 0, target
16780 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
16790 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
167a0 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49  LITE_OMIT_FLOATI
167b0 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20 63 61 73  NG_POINT.    cas
167c0 65 20 54 4b 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20  e TK_FLOAT: {.  
167d0 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
167e0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
167f0 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  pr, EP_IntValue)
16800 20 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 52 65   );.      codeRe
16810 61 6c 28 76 2c 20 70 45 78 70 72 2d 3e 75 2e 7a  al(v, pExpr->u.z
16820 54 6f 6b 65 6e 2c 20 30 2c 20 74 61 72 67 65 74  Token, 0, target
16830 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
16840 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
16850 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a   case TK_STRING:
16860 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
16870 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
16880 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56  y(pExpr, EP_IntV
16890 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 73  alue) );.      s
168a0 71 6c 69 74 65 33 56 64 62 65 4c 6f 61 64 53 74  qlite3VdbeLoadSt
168b0 72 69 6e 67 28 76 2c 20 74 61 72 67 65 74 2c 20  ring(v, target, 
168c0 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29  pExpr->u.zToken)
168d0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
168e0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
168f0 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 73  _NULL: {.      s
16900 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
16910 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20  (v, OP_Null, 0, 
16920 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 62  target);.      b
16930 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  reak;.    }.#ifn
16940 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
16950 42 4c 4f 42 5f 4c 49 54 45 52 41 4c 0a 20 20 20  BLOB_LITERAL.   
16960 20 63 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 20 7b   case TK_BLOB: {
16970 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20  .      int n;.  
16980 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
16990 7a 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  z;.      char *z
169a0 42 6c 6f 62 3b 0a 20 20 20 20 20 20 61 73 73 65  Blob;.      asse
169b0 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
169c0 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49  erty(pExpr, EP_I
169d0 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20  ntValue) );.    
169e0 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
169f0 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 78  >u.zToken[0]=='x
16a00 27 20 7c 7c 20 70 45 78 70 72 2d 3e 75 2e 7a 54  ' || pExpr->u.zT
16a10 6f 6b 65 6e 5b 30 5d 3d 3d 27 58 27 20 29 3b 0a  oken[0]=='X' );.
16a20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
16a30 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 31 5d  xpr->u.zToken[1]
16a40 3d 3d 27 5c 27 27 20 29 3b 0a 20 20 20 20 20 20  =='\'' );.      
16a50 7a 20 3d 20 26 70 45 78 70 72 2d 3e 75 2e 7a 54  z = &pExpr->u.zT
16a60 6f 6b 65 6e 5b 32 5d 3b 0a 20 20 20 20 20 20 6e  oken[2];.      n
16a70 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
16a80 33 30 28 7a 29 20 2d 20 31 3b 0a 20 20 20 20 20  30(z) - 1;.     
16a90 20 61 73 73 65 72 74 28 20 7a 5b 6e 5d 3d 3d 27   assert( z[n]=='
16aa0 5c 27 27 20 29 3b 0a 20 20 20 20 20 20 7a 42 6c  \'' );.      zBl
16ab0 6f 62 20 3d 20 73 71 6c 69 74 65 33 48 65 78 54  ob = sqlite3HexT
16ac0 6f 42 6c 6f 62 28 73 71 6c 69 74 65 33 56 64 62  oBlob(sqlite3Vdb
16ad0 65 44 62 28 76 29 2c 20 7a 2c 20 6e 29 3b 0a 20  eDb(v), z, n);. 
16ae0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
16af0 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 42 6c 6f  AddOp4(v, OP_Blo
16b00 62 2c 20 6e 2f 32 2c 20 74 61 72 67 65 74 2c 20  b, n/2, target, 
16b10 30 2c 20 7a 42 6c 6f 62 2c 20 50 34 5f 44 59 4e  0, zBlob, P4_DYN
16b20 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 62 72 65  AMIC);.      bre
16b30 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
16b40 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 56 41 52  .    case TK_VAR
16b50 49 41 42 4c 45 3a 20 7b 0a 20 20 20 20 20 20 61  IABLE: {.      a
16b60 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
16b70 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
16b80 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20  P_IntValue) );. 
16b90 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
16ba0 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 21 3d 30 20  pr->u.zToken!=0 
16bb0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
16bc0 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
16bd0 5b 30 5d 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  [0]!=0 );.      
16be0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
16bf0 32 28 76 2c 20 4f 50 5f 56 61 72 69 61 62 6c 65  2(v, OP_Variable
16c00 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  , pExpr->iColumn
16c10 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
16c20 20 69 66 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54   if( pExpr->u.zT
16c30 6f 6b 65 6e 5b 31 5d 21 3d 30 20 29 7b 0a 20 20  oken[1]!=0 ){.  
16c40 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
16c50 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d  xpr->u.zToken[0]
16c60 3d 3d 27 3f 27 20 0a 20 20 20 20 20 20 20 20 20  =='?' .         
16c70 20 20 20 20 7c 7c 20 73 74 72 63 6d 70 28 70 45      || strcmp(pE
16c80 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 70  xpr->u.zToken, p
16c90 50 61 72 73 65 2d 3e 61 7a 56 61 72 5b 70 45 78  Parse->azVar[pEx
16ca0 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2d 31 5d 29 3d  pr->iColumn-1])=
16cb0 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  =0 );.        sq
16cc0 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
16cd0 34 28 76 2c 20 2d 31 2c 20 70 50 61 72 73 65 2d  4(v, -1, pParse-
16ce0 3e 61 7a 56 61 72 5b 70 45 78 70 72 2d 3e 69 43  >azVar[pExpr->iC
16cf0 6f 6c 75 6d 6e 2d 31 5d 2c 20 50 34 5f 53 54 41  olumn-1], P4_STA
16d00 54 49 43 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  TIC);.      }.  
16d10 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
16d20 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45 47  .    case TK_REG
16d30 49 53 54 45 52 3a 20 7b 0a 20 20 20 20 20 20 69  ISTER: {.      i
16d40 6e 52 65 67 20 3d 20 70 45 78 70 72 2d 3e 69 54  nReg = pExpr->iT
16d50 61 62 6c 65 3b 0a 20 20 20 20 20 20 62 72 65 61  able;.      brea
16d60 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  k;.    }.#ifndef
16d70 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53   SQLITE_OMIT_CAS
16d80 54 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 41  T.    case TK_CA
16d90 53 54 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45  ST: {.      /* E
16da0 78 70 72 65 73 73 69 6f 6e 73 20 6f 66 20 74 68  xpressions of th
16db0 65 20 66 6f 72 6d 3a 20 20 20 43 41 53 54 28 70  e form:   CAST(p
16dc0 4c 65 66 74 20 41 53 20 74 6f 6b 65 6e 29 20 2a  Left AS token) *
16dd0 2f 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20  /.      inReg = 
16de0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
16df0 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 45  arget(pParse, pE
16e00 78 70 72 2d 3e 70 4c 65 66 74 2c 20 74 61 72 67  xpr->pLeft, targ
16e10 65 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69  et);.      if( i
16e20 6e 52 65 67 21 3d 74 61 72 67 65 74 20 29 7b 0a  nReg!=target ){.
16e30 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
16e40 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
16e50 53 43 6f 70 79 2c 20 69 6e 52 65 67 2c 20 74 61  SCopy, inReg, ta
16e60 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 69  rget);.        i
16e70 6e 52 65 67 20 3d 20 74 61 72 67 65 74 3b 0a 20  nReg = target;. 
16e80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
16e90 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
16ea0 2c 20 4f 50 5f 43 61 73 74 2c 20 74 61 72 67 65  , OP_Cast, targe
16eb0 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
16ec0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
16ed0 65 33 41 66 66 69 6e 69 74 79 54 79 70 65 28 70  e3AffinityType(p
16ee0 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20  Expr->u.zToken, 
16ef0 30 29 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  0));.      testc
16f00 61 73 65 28 20 75 73 65 64 41 73 43 6f 6c 75 6d  ase( usedAsColum
16f10 6e 43 61 63 68 65 28 70 50 61 72 73 65 2c 20 69  nCache(pParse, i
16f20 6e 52 65 67 2c 20 69 6e 52 65 67 29 20 29 3b 0a  nReg, inReg) );.
16f30 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
16f40 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68  rCacheAffinityCh
16f50 61 6e 67 65 28 70 50 61 72 73 65 2c 20 69 6e 52  ange(pParse, inR
16f60 65 67 2c 20 31 29 3b 0a 20 20 20 20 20 20 62 72  eg, 1);.      br
16f70 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
16f80 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
16f90 5f 43 41 53 54 20 2a 2f 0a 20 20 20 20 63 61 73  _CAST */.    cas
16fa0 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73  e TK_LT:.    cas
16fb0 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73  e TK_LE:.    cas
16fc0 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73  e TK_GT:.    cas
16fd0 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73  e TK_GE:.    cas
16fe0 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73  e TK_NE:.    cas
16ff0 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20  e TK_EQ: {.     
17000 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r1 = sqlite3Exp
17010 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
17020 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
17030 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20  &regFree1);.    
17040 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78    r2 = sqlite3Ex
17050 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
17060 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  e, pExpr->pRight
17070 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20  , &regFree2);.  
17080 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28      codeCompare(
17090 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
170a0 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69  Left, pExpr->pRi
170b0 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20  ght, op,.       
170c0 20 20 20 20 20 20 20 20 20 20 20 72 31 2c 20 72             r1, r
170d0 32 2c 20 69 6e 52 65 67 2c 20 53 51 4c 49 54 45  2, inReg, SQLITE
170e0 5f 53 54 4f 52 45 50 32 29 3b 0a 20 20 20 20 20  _STOREP2);.     
170f0 20 61 73 73 65 72 74 28 54 4b 5f 4c 54 3d 3d 4f   assert(TK_LT==O
17100 50 5f 4c 74 29 3b 20 74 65 73 74 63 61 73 65 28  P_Lt); testcase(
17110 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 20 56 64 62 65  op==OP_Lt); Vdbe
17120 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d  CoverageIf(v,op=
17130 3d 4f 50 5f 4c 74 29 3b 0a 20 20 20 20 20 20 61  =OP_Lt);.      a
17140 73 73 65 72 74 28 54 4b 5f 4c 45 3d 3d 4f 50 5f  ssert(TK_LE==OP_
17150 4c 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70  Le); testcase(op
17160 3d 3d 4f 50 5f 4c 65 29 3b 20 56 64 62 65 43 6f  ==OP_Le); VdbeCo
17170 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f  verageIf(v,op==O
17180 50 5f 4c 65 29 3b 0a 20 20 20 20 20 20 61 73 73  P_Le);.      ass
17190 65 72 74 28 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74  ert(TK_GT==OP_Gt
171a0 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d  ); testcase(op==
171b0 4f 50 5f 47 74 29 3b 20 56 64 62 65 43 6f 76 65  OP_Gt); VdbeCove
171c0 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f  rageIf(v,op==OP_
171d0 47 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Gt);.      asser
171e0 74 28 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65 29 3b  t(TK_GE==OP_Ge);
171f0 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50   testcase(op==OP
17200 5f 47 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61  _Ge); VdbeCovera
17210 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 65  geIf(v,op==OP_Ge
17220 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
17230 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71 29 3b 20 74  TK_EQ==OP_Eq); t
17240 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 45  estcase(op==OP_E
17250 71 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  q); VdbeCoverage
17260 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 45 71 29 3b  If(v,op==OP_Eq);
17270 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b  .      assert(TK
17280 5f 4e 45 3d 3d 4f 50 5f 4e 65 29 3b 20 74 65 73  _NE==OP_Ne); tes
17290 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4e 65 29  tcase(op==OP_Ne)
172a0 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66  ; VdbeCoverageIf
172b0 28 76 2c 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 0a 20  (v,op==OP_Ne);. 
172c0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
172d0 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
172e0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
172f0 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20  gFree2==0 );.   
17300 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
17310 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 3a 0a      case TK_IS:.
17320 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f      case TK_ISNO
17330 54 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63  T: {.      testc
17340 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 20 29  ase( op==TK_IS )
17350 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
17360 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29  ( op==TK_ISNOT )
17370 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  ;.      r1 = sql
17380 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
17390 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
173a0 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31  pLeft, &regFree1
173b0 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71  );.      r2 = sq
173c0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
173d0 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
173e0 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46 72 65  >pRight, &regFre
173f0 65 32 29 3b 0a 20 20 20 20 20 20 6f 70 20 3d 20  e2);.      op = 
17400 28 6f 70 3d 3d 54 4b 5f 49 53 29 20 3f 20 54 4b  (op==TK_IS) ? TK
17410 5f 45 51 20 3a 20 54 4b 5f 4e 45 3b 0a 20 20 20  _EQ : TK_NE;.   
17420 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70     codeCompare(p
17430 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
17440 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  eft, pExpr->pRig
17450 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20 20  ht, op,.        
17460 20 20 20 20 20 20 20 20 20 20 72 31 2c 20 72 32            r1, r2
17470 2c 20 69 6e 52 65 67 2c 20 53 51 4c 49 54 45 5f  , inReg, SQLITE_
17480 53 54 4f 52 45 50 32 20 7c 20 53 51 4c 49 54 45  STOREP2 | SQLITE
17490 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20  _NULLEQ);.      
174a0 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
174b0 2c 20 6f 70 3d 3d 54 4b 5f 45 51 29 3b 0a 20 20  , op==TK_EQ);.  
174c0 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
174d0 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4e 45 29  If(v, op==TK_NE)
174e0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
174f0 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  ( regFree1==0 );
17500 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
17510 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a   regFree2==0 );.
17520 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
17530 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41   }.    case TK_A
17540 4e 44 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ND:.    case TK_
17550 4f 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  OR:.    case TK_
17560 50 4c 55 53 3a 0a 20 20 20 20 63 61 73 65 20 54  PLUS:.    case T
17570 4b 5f 53 54 41 52 3a 0a 20 20 20 20 63 61 73 65  K_STAR:.    case
17580 20 54 4b 5f 4d 49 4e 55 53 3a 0a 20 20 20 20 63   TK_MINUS:.    c
17590 61 73 65 20 54 4b 5f 52 45 4d 3a 0a 20 20 20 20  ase TK_REM:.    
175a0 63 61 73 65 20 54 4b 5f 42 49 54 41 4e 44 3a 0a  case TK_BITAND:.
175b0 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4f      case TK_BITO
175c0 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53  R:.    case TK_S
175d0 4c 41 53 48 3a 0a 20 20 20 20 63 61 73 65 20 54  LASH:.    case T
175e0 4b 5f 4c 53 48 49 46 54 3a 0a 20 20 20 20 63 61  K_LSHIFT:.    ca
175f0 73 65 20 54 4b 5f 52 53 48 49 46 54 3a 20 0a 20  se TK_RSHIFT: . 
17600 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4e 43 41     case TK_CONCA
17610 54 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  T: {.      asser
17620 74 28 20 54 4b 5f 41 4e 44 3d 3d 4f 50 5f 41 6e  t( TK_AND==OP_An
17630 64 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  d );            
17640 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
17650 5f 41 4e 44 20 29 3b 0a 20 20 20 20 20 20 61 73  _AND );.      as
17660 73 65 72 74 28 20 54 4b 5f 4f 52 3d 3d 4f 50 5f  sert( TK_OR==OP_
17670 4f 72 20 29 3b 20 20 20 20 20 20 20 20 20 20 20  Or );           
17680 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
17690 3d 54 4b 5f 4f 52 20 29 3b 0a 20 20 20 20 20 20  =TK_OR );.      
176a0 61 73 73 65 72 74 28 20 54 4b 5f 50 4c 55 53 3d  assert( TK_PLUS=
176b0 3d 4f 50 5f 41 64 64 20 29 3b 20 20 20 20 20 20  =OP_Add );      
176c0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
176d0 70 3d 3d 54 4b 5f 50 4c 55 53 20 29 3b 0a 20 20  p==TK_PLUS );.  
176e0 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4d      assert( TK_M
176f0 49 4e 55 53 3d 3d 4f 50 5f 53 75 62 74 72 61 63  INUS==OP_Subtrac
17700 74 20 29 3b 20 20 20 20 20 74 65 73 74 63 61 73  t );     testcas
17710 65 28 20 6f 70 3d 3d 54 4b 5f 4d 49 4e 55 53 20  e( op==TK_MINUS 
17720 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
17730 20 54 4b 5f 52 45 4d 3d 3d 4f 50 5f 52 65 6d 61   TK_REM==OP_Rema
17740 69 6e 64 65 72 20 29 3b 20 20 20 20 20 20 74 65  inder );      te
17750 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 52  stcase( op==TK_R
17760 45 4d 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  EM );.      asse
17770 72 74 28 20 54 4b 5f 42 49 54 41 4e 44 3d 3d 4f  rt( TK_BITAND==O
17780 50 5f 42 69 74 41 6e 64 20 29 3b 20 20 20 20 20  P_BitAnd );     
17790 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
177a0 4b 5f 42 49 54 41 4e 44 20 29 3b 0a 20 20 20 20  K_BITAND );.    
177b0 20 20 61 73 73 65 72 74 28 20 54 4b 5f 42 49 54    assert( TK_BIT
177c0 4f 52 3d 3d 4f 50 5f 42 69 74 4f 72 20 29 3b 20  OR==OP_BitOr ); 
177d0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
177e0 20 6f 70 3d 3d 54 4b 5f 42 49 54 4f 52 20 29 3b   op==TK_BITOR );
177f0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
17800 4b 5f 53 4c 41 53 48 3d 3d 4f 50 5f 44 69 76 69  K_SLASH==OP_Divi
17810 64 65 20 29 3b 20 20 20 20 20 20 20 74 65 73 74  de );       test
17820 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 53 4c 41  case( op==TK_SLA
17830 53 48 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  SH );.      asse
17840 72 74 28 20 54 4b 5f 4c 53 48 49 46 54 3d 3d 4f  rt( TK_LSHIFT==O
17850 50 5f 53 68 69 66 74 4c 65 66 74 20 29 3b 20 20  P_ShiftLeft );  
17860 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
17870 4b 5f 4c 53 48 49 46 54 20 29 3b 0a 20 20 20 20  K_LSHIFT );.    
17880 20 20 61 73 73 65 72 74 28 20 54 4b 5f 52 53 48    assert( TK_RSH
17890 49 46 54 3d 3d 4f 50 5f 53 68 69 66 74 52 69 67  IFT==OP_ShiftRig
178a0 68 74 20 29 3b 20 20 74 65 73 74 63 61 73 65 28  ht );  testcase(
178b0 20 6f 70 3d 3d 54 4b 5f 52 53 48 49 46 54 20 29   op==TK_RSHIFT )
178c0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
178d0 54 4b 5f 43 4f 4e 43 41 54 3d 3d 4f 50 5f 43 6f  TK_CONCAT==OP_Co
178e0 6e 63 61 74 20 29 3b 20 20 20 20 20 20 74 65 73  ncat );      tes
178f0 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 43 4f  tcase( op==TK_CO
17900 4e 43 41 54 20 29 3b 0a 20 20 20 20 20 20 72 31  NCAT );.      r1
17910 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
17920 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
17930 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65  Expr->pLeft, &re
17940 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 72  gFree1);.      r
17950 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  2 = sqlite3ExprC
17960 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
17970 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26  pExpr->pRight, &
17980 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20  regFree2);.     
17990 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
179a0 70 33 28 76 2c 20 6f 70 2c 20 72 32 2c 20 72 31  p3(v, op, r2, r1
179b0 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
179c0 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
179d0 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee1==0 );.      
179e0 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
179f0 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62  e2==0 );.      b
17a00 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
17a10 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20  case TK_UMINUS: 
17a20 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c  {.      Expr *pL
17a30 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65  eft = pExpr->pLe
17a40 66 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ft;.      assert
17a50 28 20 70 4c 65 66 74 20 29 3b 0a 20 20 20 20 20  ( pLeft );.     
17a60 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d   if( pLeft->op==
17a70 54 4b 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20 20  TK_INTEGER ){.  
17a80 20 20 20 20 20 20 63 6f 64 65 49 6e 74 65 67 65        codeIntege
17a90 72 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c  r(pParse, pLeft,
17aa0 20 31 2c 20 74 61 72 67 65 74 29 3b 0a 23 69 66   1, target);.#if
17ab0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
17ac0 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a  _FLOATING_POINT.
17ad0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
17ae0 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c  pLeft->op==TK_FL
17af0 4f 41 54 20 29 7b 0a 20 20 20 20 20 20 20 20 61  OAT ){.        a
17b00 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
17b10 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
17b20 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20  P_IntValue) );. 
17b30 20 20 20 20 20 20 20 63 6f 64 65 52 65 61 6c 28         codeReal(
17b40 76 2c 20 70 4c 65 66 74 2d 3e 75 2e 7a 54 6f 6b  v, pLeft->u.zTok
17b50 65 6e 2c 20 31 2c 20 74 61 72 67 65 74 29 3b 0a  en, 1, target);.
17b60 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 65 6c  #endif.      }el
17b70 73 65 7b 0a 20 20 20 20 20 20 20 20 74 65 6d 70  se{.        temp
17b80 58 2e 6f 70 20 3d 20 54 4b 5f 49 4e 54 45 47 45  X.op = TK_INTEGE
17b90 52 3b 0a 20 20 20 20 20 20 20 20 74 65 6d 70 58  R;.        tempX
17ba0 2e 66 6c 61 67 73 20 3d 20 45 50 5f 49 6e 74 56  .flags = EP_IntV
17bb0 61 6c 75 65 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  alue|EP_TokenOnl
17bc0 79 3b 0a 20 20 20 20 20 20 20 20 74 65 6d 70 58  y;.        tempX
17bd0 2e 75 2e 69 56 61 6c 75 65 20 3d 20 30 3b 0a 20  .u.iValue = 0;. 
17be0 20 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69         r1 = sqli
17bf0 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
17c00 70 50 61 72 73 65 2c 20 26 74 65 6d 70 58 2c 20  pParse, &tempX, 
17c10 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20  &regFree1);.    
17c20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33      r2 = sqlite3
17c30 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
17c40 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
17c50 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20  t, &regFree2);. 
17c60 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
17c70 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53  beAddOp3(v, OP_S
17c80 75 62 74 72 61 63 74 2c 20 72 32 2c 20 72 31 2c  ubtract, r2, r1,
17c90 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
17ca0 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
17cb0 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree2==0 );.     
17cc0 20 7d 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d   }.      inReg =
17cd0 20 74 61 72 67 65 74 3b 0a 20 20 20 20 20 20 62   target;.      b
17ce0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
17cf0 63 61 73 65 20 54 4b 5f 42 49 54 4e 4f 54 3a 0a  case TK_BITNOT:.
17d00 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a      case TK_NOT:
17d10 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
17d20 20 54 4b 5f 42 49 54 4e 4f 54 3d 3d 4f 50 5f 42   TK_BITNOT==OP_B
17d30 69 74 4e 6f 74 20 29 3b 20 20 20 74 65 73 74 63  itNot );   testc
17d40 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 42 49 54 4e  ase( op==TK_BITN
17d50 4f 54 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  OT );.      asse
17d60 72 74 28 20 54 4b 5f 4e 4f 54 3d 3d 4f 50 5f 4e  rt( TK_NOT==OP_N
17d70 6f 74 20 29 3b 20 20 20 20 20 20 20 20 20 74 65  ot );         te
17d80 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e  stcase( op==TK_N
17d90 4f 54 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d  OT );.      r1 =
17da0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
17db0 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
17dc0 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46  pr->pLeft, &regF
17dd0 72 65 65 31 29 3b 0a 20 20 20 20 20 20 74 65 73  ree1);.      tes
17de0 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
17df0 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 6e 52 65  =0 );.      inRe
17e00 67 20 3d 20 74 61 72 67 65 74 3b 0a 20 20 20 20  g = target;.    
17e10 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
17e20 4f 70 32 28 76 2c 20 6f 70 2c 20 72 31 2c 20 69  Op2(v, op, r1, i
17e30 6e 52 65 67 29 3b 0a 20 20 20 20 20 20 62 72 65  nReg);.      bre
17e40 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
17e50 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20  se TK_ISNULL:.  
17e60 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c    case TK_NOTNUL
17e70 4c 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 61  L: {.      int a
17e80 64 64 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ddr;.      asser
17e90 74 28 20 54 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f 50  t( TK_ISNULL==OP
17ea0 5f 49 73 4e 75 6c 6c 20 29 3b 20 20 20 74 65 73  _IsNull );   tes
17eb0 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53  tcase( op==TK_IS
17ec0 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 61 73  NULL );.      as
17ed0 73 65 72 74 28 20 54 4b 5f 4e 4f 54 4e 55 4c 4c  sert( TK_NOTNULL
17ee0 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 20  ==OP_NotNull ); 
17ef0 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
17f00 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 0a 20 20 20 20  _NOTNULL );.    
17f10 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
17f20 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
17f30 72 2c 20 31 2c 20 74 61 72 67 65 74 29 3b 0a 20  r, 1, target);. 
17f40 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
17f50 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
17f60 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
17f70 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  ft, &regFree1);.
17f80 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
17f90 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
17fa0 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69       addr = sqli
17fb0 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
17fc0 20 6f 70 2c 20 72 31 29 3b 0a 20 20 20 20 20 20   op, r1);.      
17fd0 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
17fe0 2c 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 29  , op==TK_ISNULL)
17ff0 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
18000 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b  rageIf(v, op==TK
18010 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  _NOTNULL);.     
18020 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
18030 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
18040 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  , 0, target);.  
18050 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
18060 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 29  umpHere(v, addr)
18070 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
18080 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
18090 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b  _AGG_FUNCTION: {
180a0 0a 20 20 20 20 20 20 41 67 67 49 6e 66 6f 20 2a  .      AggInfo *
180b0 70 49 6e 66 6f 20 3d 20 70 45 78 70 72 2d 3e 70  pInfo = pExpr->p
180c0 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 69  AggInfo;.      i
180d0 66 28 20 70 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20  f( pInfo==0 ){. 
180e0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
180f0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
18100 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c  pExpr, EP_IntVal
18110 75 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 73  ue) );.        s
18120 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
18130 50 61 72 73 65 2c 20 22 6d 69 73 75 73 65 20 6f  Parse, "misuse o
18140 66 20 61 67 67 72 65 67 61 74 65 3a 20 25 73 28  f aggregate: %s(
18150 29 22 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  )", pExpr->u.zTo
18160 6b 65 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ken);.      }els
18170 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 52 65 67  e{.        inReg
18180 20 3d 20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b   = pInfo->aFunc[
18190 70 45 78 70 72 2d 3e 69 41 67 67 5d 2e 69 4d 65  pExpr->iAgg].iMe
181a0 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  m;.      }.     
181b0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
181c0 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54 49    case TK_FUNCTI
181d0 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72  ON: {.      Expr
181e0 4c 69 73 74 20 2a 70 46 61 72 67 3b 20 20 20 20  List *pFarg;    
181f0 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 75     /* List of fu
18200 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73  nction arguments
18210 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 46   */.      int nF
18220 61 72 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  arg;            
18230 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 75   /* Number of fu
18240 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73  nction arguments
18250 20 2a 2f 0a 20 20 20 20 20 20 46 75 6e 63 44 65   */.      FuncDe
18260 66 20 2a 70 44 65 66 3b 20 20 20 20 20 20 20 20  f *pDef;        
18270 20 2f 2a 20 54 68 65 20 66 75 6e 63 74 69 6f 6e   /* The function
18280 20 64 65 66 69 6e 69 74 69 6f 6e 20 6f 62 6a 65   definition obje
18290 63 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ct */.      int 
182a0 6e 49 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  nId;            
182b0 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20     /* Length of 
182c0 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d  the function nam
182d0 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  e in bytes */.  
182e0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
182f0 7a 49 64 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  zId;       /* Th
18300 65 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20  e function name 
18310 2a 2f 0a 20 20 20 20 20 20 75 33 32 20 63 6f 6e  */.      u32 con
18320 73 74 4d 61 73 6b 20 3d 20 30 3b 20 20 20 20 20  stMask = 0;     
18330 2f 2a 20 4d 61 73 6b 20 6f 66 20 66 75 6e 63 74  /* Mask of funct
18340 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 74 68  ion arguments th
18350 61 74 20 61 72 65 20 63 6f 6e 73 74 61 6e 74 20  at are constant 
18360 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 20  */.      int i; 
18370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18380 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
18390 2a 2f 0a 20 20 20 20 20 20 75 38 20 65 6e 63 20  */.      u8 enc 
183a0 3d 20 45 4e 43 28 64 62 29 3b 20 20 20 20 20 20  = ENC(db);      
183b0 2f 2a 20 54 68 65 20 74 65 78 74 20 65 6e 63 6f  /* The text enco
183c0 64 69 6e 67 20 75 73 65 64 20 62 79 20 74 68 69  ding used by thi
183d0 73 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  s database */.  
183e0 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
183f0 6c 6c 20 3d 20 30 3b 20 20 20 20 2f 2a 20 41 20  ll = 0;    /* A 
18400 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
18410 63 65 20 2a 2f 0a 0a 20 20 20 20 20 20 61 73 73  ce */..      ass
18420 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
18430 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
18440 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20  xIsSelect) );.  
18450 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50      if( ExprHasP
18460 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
18470 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a  P_TokenOnly) ){.
18480 20 20 20 20 20 20 20 20 70 46 61 72 67 20 3d 20          pFarg = 
18490 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  0;.      }else{.
184a0 20 20 20 20 20 20 20 20 70 46 61 72 67 20 3d 20          pFarg = 
184b0 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a  pExpr->x.pList;.
184c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 46        }.      nF
184d0 61 72 67 20 3d 20 70 46 61 72 67 20 3f 20 70 46  arg = pFarg ? pF
184e0 61 72 67 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 0a  arg->nExpr : 0;.
184f0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
18500 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
18510 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75  Expr, EP_IntValu
18520 65 29 20 29 3b 0a 20 20 20 20 20 20 7a 49 64 20  e) );.      zId 
18530 3d 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  = pExpr->u.zToke
18540 6e 3b 0a 20 20 20 20 20 20 6e 49 64 20 3d 20 73  n;.      nId = s
18550 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
18560 49 64 29 3b 0a 20 20 20 20 20 20 70 44 65 66 20  Id);.      pDef 
18570 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e  = sqlite3FindFun
18580 63 74 69 6f 6e 28 64 62 2c 20 7a 49 64 2c 20 6e  ction(db, zId, n
18590 49 64 2c 20 6e 46 61 72 67 2c 20 65 6e 63 2c 20  Id, nFarg, enc, 
185a0 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44  0);.      if( pD
185b0 65 66 3d 3d 30 20 7c 7c 20 70 44 65 66 2d 3e 78  ef==0 || pDef->x
185c0 46 75 6e 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Func==0 ){.     
185d0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
185e0 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e 6b 6e  sg(pParse, "unkn
185f0 6f 77 6e 20 66 75 6e 63 74 69 6f 6e 3a 20 25 2e  own function: %.
18600 2a 73 28 29 22 2c 20 6e 49 64 2c 20 7a 49 64 29  *s()", nId, zId)
18610 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
18620 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
18630 2f 2a 20 41 74 74 65 6d 70 74 20 61 20 64 69 72  /* Attempt a dir
18640 65 63 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ect implementati
18650 6f 6e 20 6f 66 20 74 68 65 20 62 75 69 6c 74 2d  on of the built-
18660 69 6e 20 43 4f 41 4c 45 53 43 45 28 29 20 61 6e  in COALESCE() an
18670 64 0a 20 20 20 20 20 20 2a 2a 20 49 46 4e 55 4c  d.      ** IFNUL
18680 4c 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20  L() functions.  
18690 54 68 69 73 20 61 76 6f 69 64 73 20 75 6e 6e 65  This avoids unne
186a0 63 65 73 73 61 72 79 20 65 76 61 6c 75 61 74 69  cessary evaluati
186b0 6f 6e 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 61  on of.      ** a
186c0 72 67 75 6d 65 6e 74 73 20 70 61 73 74 20 74 68  rguments past th
186d0 65 20 66 69 72 73 74 20 6e 6f 6e 2d 4e 55 4c 4c  e first non-NULL
186e0 20 61 72 67 75 6d 65 6e 74 2e 0a 20 20 20 20 20   argument..     
186f0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 44   */.      if( pD
18700 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20  ef->funcFlags & 
18710 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43 4f 41 4c  SQLITE_FUNC_COAL
18720 45 53 43 45 20 29 7b 0a 20 20 20 20 20 20 20 20  ESCE ){.        
18730 69 6e 74 20 65 6e 64 43 6f 61 6c 65 73 63 65 20  int endCoalesce 
18740 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
18750 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
18760 20 20 20 61 73 73 65 72 74 28 20 6e 46 61 72 67     assert( nFarg
18770 3e 3d 32 20 29 3b 0a 20 20 20 20 20 20 20 20 73  >=2 );.        s
18780 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
18790 50 61 72 73 65 2c 20 70 46 61 72 67 2d 3e 61 5b  Parse, pFarg->a[
187a0 30 5d 2e 70 45 78 70 72 2c 20 74 61 72 67 65 74  0].pExpr, target
187b0 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  );.        for(i
187c0 3d 31 3b 20 69 3c 6e 46 61 72 67 3b 20 69 2b 2b  =1; i<nFarg; i++
187d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
187e0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
187f0 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 74 61  , OP_NotNull, ta
18800 72 67 65 74 2c 20 65 6e 64 43 6f 61 6c 65 73 63  rget, endCoalesc
18810 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 56 64  e);.          Vd
18820 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
18830 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
18840 45 78 70 72 43 61 63 68 65 52 65 6d 6f 76 65 28  ExprCacheRemove(
18850 70 50 61 72 73 65 2c 20 74 61 72 67 65 74 2c 20  pParse, target, 
18860 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  1);.          sq
18870 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75  lite3ExprCachePu
18880 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  sh(pParse);.    
18890 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
188a0 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 46  rCode(pParse, pF
188b0 61 72 67 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c  arg->a[i].pExpr,
188c0 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
188d0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
188e0 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b  achePop(pParse);
188f0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
18900 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
18910 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65 6e  solveLabel(v, en
18920 64 43 6f 61 6c 65 73 63 65 29 3b 0a 20 20 20 20  dCoalesce);.    
18930 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
18940 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65   }..      /* The
18950 20 55 4e 4c 49 4b 45 4c 59 28 29 20 66 75 6e 63   UNLIKELY() func
18960 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
18970 20 20 54 68 65 20 72 65 73 75 6c 74 20 69 73 20    The result is 
18980 74 68 65 20 76 61 6c 75 65 0a 20 20 20 20 20 20  the value.      
18990 2a 2a 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  ** of the first 
189a0 61 72 67 75 6d 65 6e 74 2e 0a 20 20 20 20 20 20  argument..      
189b0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 44 65  */.      if( pDe
189c0 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53  f->funcFlags & S
189d0 51 4c 49 54 45 5f 46 55 4e 43 5f 55 4e 4c 49 4b  QLITE_FUNC_UNLIK
189e0 45 4c 59 20 29 7b 0a 20 20 20 20 20 20 20 20 61  ELY ){.        a
189f0 73 73 65 72 74 28 20 6e 46 61 72 67 3e 3d 31 20  ssert( nFarg>=1 
18a00 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 52 65 67  );.        inReg
18a10 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
18a20 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c  deTarget(pParse,
18a30 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78   pFarg->a[0].pEx
18a40 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  pr, target);.   
18a50 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
18a60 20 20 7d 0a 0a 20 20 20 20 20 20 66 6f 72 28 69    }..      for(i
18a70 3d 30 3b 20 69 3c 6e 46 61 72 67 3b 20 69 2b 2b  =0; i<nFarg; i++
18a80 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  ){.        if( i
18a90 3c 33 32 20 26 26 20 73 71 6c 69 74 65 33 45 78  <32 && sqlite3Ex
18aa0 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 46 61  prIsConstant(pFa
18ab0 72 67 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20  rg->a[i].pExpr) 
18ac0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73  ){.          tes
18ad0 74 63 61 73 65 28 20 69 3d 3d 33 31 20 29 3b 0a  tcase( i==31 );.
18ae0 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 4d            constM
18af0 61 73 6b 20 7c 3d 20 4d 41 53 4b 42 49 54 33 32  ask |= MASKBIT32
18b00 28 69 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  (i);.        }. 
18b10 20 20 20 20 20 20 20 69 66 28 20 28 70 44 65 66         if( (pDef
18b20 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51  ->funcFlags & SQ
18b30 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f  LITE_FUNC_NEEDCO
18b40 4c 4c 29 21 3d 30 20 26 26 20 21 70 43 6f 6c 6c  LL)!=0 && !pColl
18b50 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43   ){.          pC
18b60 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
18b70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
18b80 20 70 46 61 72 67 2d 3e 61 5b 69 5d 2e 70 45 78   pFarg->a[i].pEx
18b90 70 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  pr);.        }. 
18ba0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
18bb0 20 70 46 61 72 67 20 29 7b 0a 20 20 20 20 20 20   pFarg ){.      
18bc0 20 20 69 66 28 20 63 6f 6e 73 74 4d 61 73 6b 20    if( constMask 
18bd0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 31 20  ){.          r1 
18be0 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31  = pParse->nMem+1
18bf0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 72  ;.          pPar
18c00 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 46 61 72  se->nMem += nFar
18c10 67 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  g;.        }else
18c20 7b 0a 20 20 20 20 20 20 20 20 20 20 72 31 20 3d  {.          r1 =
18c30 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
18c40 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 46 61  ange(pParse, nFa
18c50 72 67 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  rg);.        }..
18c60 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c          /* For l
18c70 65 6e 67 74 68 28 29 20 61 6e 64 20 74 79 70 65  ength() and type
18c80 6f 66 28 29 20 66 75 6e 63 74 69 6f 6e 73 20 77  of() functions w
18c90 69 74 68 20 61 20 63 6f 6c 75 6d 6e 20 61 72 67  ith a column arg
18ca0 75 6d 65 6e 74 2c 0a 20 20 20 20 20 20 20 20 2a  ument,.        *
18cb0 2a 20 73 65 74 20 74 68 65 20 50 35 20 70 61 72  * set the P5 par
18cc0 61 6d 65 74 65 72 20 74 6f 20 74 68 65 20 4f 50  ameter to the OP
18cd0 5f 43 6f 6c 75 6d 6e 20 6f 70 63 6f 64 65 20 74  _Column opcode t
18ce0 6f 20 4f 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41  o OPFLAG_LENGTHA
18cf0 52 47 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 72  RG.        ** or
18d00 20 4f 50 46 4c 41 47 5f 54 59 50 45 4f 46 41 52   OPFLAG_TYPEOFAR
18d10 47 20 72 65 73 70 65 63 74 69 76 65 6c 79 2c 20  G respectively, 
18d20 74 6f 20 61 76 6f 69 64 20 75 6e 6e 65 63 65 73  to avoid unneces
18d30 73 61 72 79 20 64 61 74 61 0a 20 20 20 20 20 20  sary data.      
18d40 20 20 2a 2a 20 6c 6f 61 64 69 6e 67 2e 0a 20 20    ** loading..  
18d50 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
18d60 20 69 66 28 20 28 70 44 65 66 2d 3e 66 75 6e 63   if( (pDef->func
18d70 46 6c 61 67 73 20 26 20 28 53 51 4c 49 54 45 5f  Flags & (SQLITE_
18d80 46 55 4e 43 5f 4c 45 4e 47 54 48 7c 53 51 4c 49  FUNC_LENGTH|SQLI
18d90 54 45 5f 46 55 4e 43 5f 54 59 50 45 4f 46 29 29  TE_FUNC_TYPEOF))
18da0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
18db0 20 75 38 20 65 78 70 72 4f 70 3b 0a 20 20 20 20   u8 exprOp;.    
18dc0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 46        assert( nF
18dd0 61 72 67 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  arg==1 );.      
18de0 20 20 20 20 61 73 73 65 72 74 28 20 70 46 61 72      assert( pFar
18df0 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 21 3d 30  g->a[0].pExpr!=0
18e00 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 65 78   );.          ex
18e10 70 72 4f 70 20 3d 20 70 46 61 72 67 2d 3e 61 5b  prOp = pFarg->a[
18e20 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20  0].pExpr->op;.  
18e30 20 20 20 20 20 20 20 20 69 66 28 20 65 78 70 72          if( expr
18e40 4f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c  Op==TK_COLUMN ||
18e50 20 65 78 70 72 4f 70 3d 3d 54 4b 5f 41 47 47 5f   exprOp==TK_AGG_
18e60 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20  COLUMN ){.      
18e70 20 20 20 20 20 20 61 73 73 65 72 74 28 20 53 51        assert( SQ
18e80 4c 49 54 45 5f 46 55 4e 43 5f 4c 45 4e 47 54 48  LITE_FUNC_LENGTH
18e90 3d 3d 4f 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41  ==OPFLAG_LENGTHA
18ea0 52 47 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  RG );.          
18eb0 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45    assert( SQLITE
18ec0 5f 46 55 4e 43 5f 54 59 50 45 4f 46 3d 3d 4f 50  _FUNC_TYPEOF==OP
18ed0 46 4c 41 47 5f 54 59 50 45 4f 46 41 52 47 20 29  FLAG_TYPEOFARG )
18ee0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65  ;.            te
18ef0 73 74 63 61 73 65 28 20 70 44 65 66 2d 3e 66 75  stcase( pDef->fu
18f00 6e 63 46 6c 61 67 73 20 26 20 4f 50 46 4c 41 47  ncFlags & OPFLAG
18f10 5f 4c 45 4e 47 54 48 41 52 47 20 29 3b 0a 20 20  _LENGTHARG );.  
18f20 20 20 20 20 20 20 20 20 20 20 70 46 61 72 67 2d            pFarg-
18f30 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 32  >a[0].pExpr->op2
18f40 20 3d 20 0a 20 20 20 20 20 20 20 20 20 20 20 20   = .            
18f50 20 20 20 20 20 20 70 44 65 66 2d 3e 66 75 6e 63        pDef->func
18f60 46 6c 61 67 73 20 26 20 28 4f 50 46 4c 41 47 5f  Flags & (OPFLAG_
18f70 4c 45 4e 47 54 48 41 52 47 7c 4f 50 46 4c 41 47  LENGTHARG|OPFLAG
18f80 5f 54 59 50 45 4f 46 41 52 47 29 3b 0a 20 20 20  _TYPEOFARG);.   
18f90 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
18fa0 20 7d 0a 0a 20 20 20 20 20 20 20 20 73 71 6c 69   }..        sqli
18fb0 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68  te3ExprCachePush
18fc0 28 70 50 61 72 73 65 29 3b 20 20 20 20 20 2f 2a  (pParse);     /*
18fd0 20 54 69 63 6b 65 74 20 32 65 61 32 34 32 35 64   Ticket 2ea2425d
18fe0 33 34 62 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  34be */.        
18ff0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45  sqlite3ExprCodeE
19000 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
19010 70 46 61 72 67 2c 20 72 31 2c 20 30 2c 0a 20 20  pFarg, r1, 0,.  
19020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
19040 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50 7c 53 51  LITE_ECEL_DUP|SQ
19050 4c 49 54 45 5f 45 43 45 4c 5f 46 41 43 54 4f 52  LITE_ECEL_FACTOR
19060 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
19070 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70  e3ExprCachePop(p
19080 50 61 72 73 65 29 3b 20 20 20 20 20 20 2f 2a 20  Parse);      /* 
19090 54 69 63 6b 65 74 20 32 65 61 32 34 32 35 64 33  Ticket 2ea2425d3
190a0 34 62 65 20 2a 2f 0a 20 20 20 20 20 20 7d 65 6c  4be */.      }el
190b0 73 65 7b 0a 20 20 20 20 20 20 20 20 72 31 20 3d  se{.        r1 =
190c0 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e   0;.      }.#ifn
190d0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
190e0 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20  VIRTUALTABLE.   
190f0 20 20 20 2f 2a 20 50 6f 73 73 69 62 6c 79 20 6f     /* Possibly o
19100 76 65 72 6c 6f 61 64 20 74 68 65 20 66 75 6e 63  verload the func
19110 74 69 6f 6e 20 69 66 20 74 68 65 20 66 69 72 73  tion if the firs
19120 74 20 61 72 67 75 6d 65 6e 74 20 69 73 0a 20 20  t argument is.  
19130 20 20 20 20 2a 2a 20 61 20 76 69 72 74 75 61 6c      ** a virtual
19140 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 2e 0a 20   table column.. 
19150 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
19160 20 46 6f 72 20 69 6e 66 69 78 20 66 75 6e 63 74   For infix funct
19170 69 6f 6e 73 20 28 4c 49 4b 45 2c 20 47 4c 4f 42  ions (LIKE, GLOB
19180 2c 20 52 45 47 45 58 50 2c 20 61 6e 64 20 4d 41  , REGEXP, and MA
19190 54 43 48 29 20 75 73 65 20 74 68 65 0a 20 20 20  TCH) use the.   
191a0 20 20 20 2a 2a 20 73 65 63 6f 6e 64 20 61 72 67     ** second arg
191b0 75 6d 65 6e 74 2c 20 6e 6f 74 20 74 68 65 20 66  ument, not the f
191c0 69 72 73 74 2c 20 61 73 20 74 68 65 20 61 72 67  irst, as the arg
191d0 75 6d 65 6e 74 20 74 6f 20 74 65 73 74 20 74 6f  ument to test to
191e0 0a 20 20 20 20 20 20 2a 2a 20 73 65 65 20 69 66  .      ** see if
191f0 20 69 74 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20   it is a column 
19200 69 6e 20 61 20 76 69 72 74 75 61 6c 20 74 61 62  in a virtual tab
19210 6c 65 2e 20 20 54 68 69 73 20 69 73 20 64 6f 6e  le.  This is don
19220 65 20 62 65 63 61 75 73 65 0a 20 20 20 20 20 20  e because.      
19230 2a 2a 20 74 68 65 20 6c 65 66 74 20 6f 70 65 72  ** the left oper
19240 61 6e 64 20 6f 66 20 69 6e 66 69 78 20 66 75 6e  and of infix fun
19250 63 74 69 6f 6e 73 20 28 74 68 65 20 6f 70 65 72  ctions (the oper
19260 61 6e 64 20 77 65 20 77 61 6e 74 20 74 6f 0a 20  and we want to. 
19270 20 20 20 20 20 2a 2a 20 63 6f 6e 74 72 6f 6c 20       ** control 
19280 6f 76 65 72 6c 6f 61 64 69 6e 67 29 20 65 6e 64  overloading) end
19290 73 20 75 70 20 61 73 20 74 68 65 20 73 65 63 6f  s up as the seco
192a0 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  nd argument to t
192b0 68 65 0a 20 20 20 20 20 20 2a 2a 20 66 75 6e 63  he.      ** func
192c0 74 69 6f 6e 2e 20 20 54 68 65 20 65 78 70 72 65  tion.  The expre
192d0 73 73 69 6f 6e 20 22 41 20 67 6c 6f 62 20 42 22  ssion "A glob B"
192e0 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74   is equivalent t
192f0 6f 20 0a 20 20 20 20 20 20 2a 2a 20 22 67 6c 6f  o .      ** "glo
19300 62 28 42 2c 41 29 2e 20 20 57 65 20 77 61 6e 74  b(B,A).  We want
19310 20 74 6f 20 75 73 65 20 74 68 65 20 41 20 69 6e   to use the A in
19320 20 22 41 20 67 6c 6f 62 20 42 22 20 74 6f 20 74   "A glob B" to t
19330 65 73 74 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72  est.      ** for
19340 20 66 75 6e 63 74 69 6f 6e 20 6f 76 65 72 6c 6f   function overlo
19350 61 64 69 6e 67 2e 20 20 42 75 74 20 77 65 20 75  ading.  But we u
19360 73 65 20 74 68 65 20 42 20 74 65 72 6d 20 69 6e  se the B term in
19370 20 22 67 6c 6f 62 28 42 2c 41 29 22 2e 0a 20 20   "glob(B,A)"..  
19380 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
19390 20 6e 46 61 72 67 3e 3d 32 20 26 26 20 28 70 45   nFarg>=2 && (pE
193a0 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  xpr->flags & EP_
193b0 49 6e 66 69 78 46 75 6e 63 29 20 29 7b 0a 20 20  InfixFunc) ){.  
193c0 20 20 20 20 20 20 70 44 65 66 20 3d 20 73 71 6c        pDef = sql
193d0 69 74 65 33 56 74 61 62 4f 76 65 72 6c 6f 61 64  ite3VtabOverload
193e0 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 70 44 65  Function(db, pDe
193f0 66 2c 20 6e 46 61 72 67 2c 20 70 46 61 72 67 2d  f, nFarg, pFarg-
19400 3e 61 5b 31 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[1].pExpr);.  
19410 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 46      }else if( nF
19420 61 72 67 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  arg>0 ){.       
19430 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33 56   pDef = sqlite3V
19440 74 61 62 4f 76 65 72 6c 6f 61 64 46 75 6e 63 74  tabOverloadFunct
19450 69 6f 6e 28 64 62 2c 20 70 44 65 66 2c 20 6e 46  ion(db, pDef, nF
19460 61 72 67 2c 20 70 46 61 72 67 2d 3e 61 5b 30 5d  arg, pFarg->a[0]
19470 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d  .pExpr);.      }
19480 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66  .#endif.      if
19490 28 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67  ( pDef->funcFlag
194a0 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f  s & SQLITE_FUNC_
194b0 4e 45 45 44 43 4f 4c 4c 20 29 7b 0a 20 20 20 20  NEEDCOLL ){.    
194c0 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29      if( !pColl )
194d0 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66   pColl = db->pDf
194e0 6c 74 43 6f 6c 6c 3b 20 0a 20 20 20 20 20 20 20  ltColl; .       
194f0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
19500 70 34 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71  p4(v, OP_CollSeq
19510 2c 20 30 2c 20 30 2c 20 30 2c 20 28 63 68 61 72  , 0, 0, 0, (char
19520 20 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c   *)pColl, P4_COL
19530 4c 53 45 51 29 3b 0a 20 20 20 20 20 20 7d 0a 20  LSEQ);.      }. 
19540 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
19550 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 46 75 6e  AddOp4(v, OP_Fun
19560 63 74 69 6f 6e 30 2c 20 63 6f 6e 73 74 4d 61 73  ction0, constMas
19570 6b 2c 20 72 31 2c 20 74 61 72 67 65 74 2c 0a 20  k, r1, target,. 
19580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19590 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 44         (char*)pD
195a0 65 66 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b  ef, P4_FUNCDEF);
195b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
195c0 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 28 75  beChangeP5(v, (u
195d0 38 29 6e 46 61 72 67 29 3b 0a 20 20 20 20 20 20  8)nFarg);.      
195e0 69 66 28 20 6e 46 61 72 67 20 26 26 20 63 6f 6e  if( nFarg && con
195f0 73 74 4d 61 73 6b 3d 3d 30 20 29 7b 0a 20 20 20  stMask==0 ){.   
19600 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
19610 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61  aseTempRange(pPa
19620 72 73 65 2c 20 72 31 2c 20 6e 46 61 72 67 29 3b  rse, r1, nFarg);
19630 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
19640 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  reak;.    }.#ifn
19650 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
19660 53 55 42 51 55 45 52 59 0a 20 20 20 20 63 61 73  SUBQUERY.    cas
19670 65 20 54 4b 5f 45 58 49 53 54 53 3a 0a 20 20 20  e TK_EXISTS:.   
19680 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a   case TK_SELECT:
19690 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   {.      testcas
196a0 65 28 20 6f 70 3d 3d 54 4b 5f 45 58 49 53 54 53  e( op==TK_EXISTS
196b0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
196c0 73 65 28 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43  se( op==TK_SELEC
196d0 54 20 29 3b 0a 20 20 20 20 20 20 69 6e 52 65 67  T );.      inReg
196e0 20 3d 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75   = sqlite3CodeSu
196f0 62 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  bselect(pParse, 
19700 70 45 78 70 72 2c 20 30 2c 20 30 29 3b 0a 20 20  pExpr, 0, 0);.  
19710 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
19720 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a  .    case TK_IN:
19730 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 65 73   {.      int des
19740 74 49 66 46 61 6c 73 65 20 3d 20 73 71 6c 69 74  tIfFalse = sqlit
19750 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
19760 76 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 64 65  v);.      int de
19770 73 74 49 66 4e 75 6c 6c 20 3d 20 73 71 6c 69 74  stIfNull = sqlit
19780 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
19790 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
197a0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
197b0 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61 72 67 65  P_Null, 0, targe
197c0 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
197d0 33 45 78 70 72 43 6f 64 65 49 4e 28 70 50 61 72  3ExprCodeIN(pPar
197e0 73 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74 49  se, pExpr, destI
197f0 66 46 61 6c 73 65 2c 20 64 65 73 74 49 66 4e 75  fFalse, destIfNu
19800 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ll);.      sqlit
19810 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
19820 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 74  OP_Integer, 1, t
19830 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 73 71  arget);.      sq
19840 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
19850 4c 61 62 65 6c 28 76 2c 20 64 65 73 74 49 66 46  Label(v, destIfF
19860 61 6c 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  alse);.      sql
19870 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
19880 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 74 61 72  , OP_AddImm, tar
19890 67 65 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  get, 0);.      s
198a0 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
198b0 65 4c 61 62 65 6c 28 76 2c 20 64 65 73 74 49 66  eLabel(v, destIf
198c0 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65  Null);.      bre
198d0 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
198e0 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
198f0 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 0a 20 20  SUBQUERY */...  
19900 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 20 20 78    /*.    **    x
19910 20 42 45 54 57 45 45 4e 20 79 20 41 4e 44 20 7a   BETWEEN y AND z
19920 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
19930 68 69 73 20 69 73 20 65 71 75 69 76 61 6c 65 6e  his is equivalen
19940 74 20 74 6f 0a 20 20 20 20 2a 2a 0a 20 20 20 20  t to.    **.    
19950 2a 2a 20 20 20 20 78 3e 3d 79 20 41 4e 44 20 78  **    x>=y AND x
19960 3c 3d 7a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  <=z.    **.    *
19970 2a 20 58 20 69 73 20 73 74 6f 72 65 64 20 69 6e  * X is stored in
19980 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2e 0a 20   pExpr->pLeft.. 
19990 20 20 20 2a 2a 20 59 20 69 73 20 73 74 6f 72 65     ** Y is store
199a0 64 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 69 73  d in pExpr->pLis
199b0 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2e 0a 20  t->a[0].pExpr.. 
199c0 20 20 20 2a 2a 20 5a 20 69 73 20 73 74 6f 72 65     ** Z is store
199d0 64 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 69 73  d in pExpr->pLis
199e0 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 2e 0a 20  t->a[1].pExpr.. 
199f0 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54     */.    case T
19a00 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20  K_BETWEEN: {.   
19a10 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d     Expr *pLeft =
19a20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20   pExpr->pLeft;. 
19a30 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72       struct Expr
19a40 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4c 49 74 65  List_item *pLIte
19a50 6d 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  m = pExpr->x.pLi
19a60 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20 45 78 70  st->a;.      Exp
19a70 72 20 2a 70 52 69 67 68 74 20 3d 20 70 4c 49 74  r *pRight = pLIt
19a80 65 6d 2d 3e 70 45 78 70 72 3b 0a 0a 20 20 20 20  em->pExpr;..    
19a90 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78    r1 = sqlite3Ex
19aa0 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
19ab0 65 2c 20 70 4c 65 66 74 2c 20 26 72 65 67 46 72  e, pLeft, &regFr
19ac0 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d  ee1);.      r2 =
19ad0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
19ae0 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 52 69  Temp(pParse, pRi
19af0 67 68 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b  ght, &regFree2);
19b00 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
19b10 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
19b20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
19b30 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20  regFree2==0 );. 
19b40 20 20 20 20 20 72 33 20 3d 20 73 71 6c 69 74 65       r3 = sqlite
19b50 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
19b60 73 65 29 3b 0a 20 20 20 20 20 20 72 34 20 3d 20  se);.      r4 = 
19b70 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
19b80 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
19b90 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61   codeCompare(pPa
19ba0 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 52 69 67  rse, pLeft, pRig
19bb0 68 74 2c 20 4f 50 5f 47 65 2c 0a 20 20 20 20 20  ht, OP_Ge,.     
19bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 72 31 2c               r1,
19bd0 20 72 32 2c 20 72 33 2c 20 53 51 4c 49 54 45 5f   r2, r3, SQLITE_
19be0 53 54 4f 52 45 50 32 29 3b 20 20 56 64 62 65 43  STOREP2);  VdbeC
19bf0 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
19c00 20 20 70 4c 49 74 65 6d 2b 2b 3b 0a 20 20 20 20    pLItem++;.    
19c10 20 20 70 52 69 67 68 74 20 3d 20 70 4c 49 74 65    pRight = pLIte
19c20 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  m->pExpr;.      
19c30 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
19c40 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
19c50 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 72  gFree2);.      r
19c60 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  2 = sqlite3ExprC
19c70 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
19c80 70 52 69 67 68 74 2c 20 26 72 65 67 46 72 65 65  pRight, &regFree
19c90 32 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  2);.      testca
19ca0 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20  se( regFree2==0 
19cb0 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d  );.      codeCom
19cc0 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 4c 65  pare(pParse, pLe
19cd0 66 74 2c 20 70 52 69 67 68 74 2c 20 4f 50 5f 4c  ft, pRight, OP_L
19ce0 65 2c 20 72 31 2c 20 72 32 2c 20 72 34 2c 20 53  e, r1, r2, r4, S
19cf0 51 4c 49 54 45 5f 53 54 4f 52 45 50 32 29 3b 0a  QLITE_STOREP2);.
19d00 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
19d10 67 65 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c  ge(v);.      sql
19d20 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
19d30 2c 20 4f 50 5f 41 6e 64 2c 20 72 33 2c 20 72 34  , OP_And, r3, r4
19d40 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
19d50 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
19d60 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
19d70 33 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  3);.      sqlite
19d80 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
19d90 70 50 61 72 73 65 2c 20 72 34 29 3b 0a 20 20 20  pParse, r4);.   
19da0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
19db0 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 4c      case TK_COLL
19dc0 41 54 45 3a 20 0a 20 20 20 20 63 61 73 65 20 54  ATE: .    case T
19dd0 4b 5f 55 50 4c 55 53 3a 20 7b 0a 20 20 20 20 20  K_UPLUS: {.     
19de0 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33   inReg = sqlite3
19df0 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70  ExprCodeTarget(p
19e00 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
19e10 65 66 74 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  eft, target);.  
19e20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
19e30 0a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 54 52  ..    case TK_TR
19e40 49 47 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 2f  IGGER: {.      /
19e50 2a 20 49 66 20 74 68 65 20 6f 70 63 6f 64 65 20  * If the opcode 
19e60 69 73 20 54 4b 5f 54 52 49 47 47 45 52 2c 20 74  is TK_TRIGGER, t
19e70 68 65 6e 20 74 68 65 20 65 78 70 72 65 73 73 69  hen the expressi
19e80 6f 6e 20 69 73 20 61 20 72 65 66 65 72 65 6e 63  on is a referenc
19e90 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 20  e.      ** to a 
19ea0 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 6e 65  column in the ne
19eb0 77 2e 2a 20 6f 72 20 6f 6c 64 2e 2a 20 70 73 65  w.* or old.* pse
19ec0 75 64 6f 2d 74 61 62 6c 65 73 20 61 76 61 69 6c  udo-tables avail
19ed0 61 62 6c 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a  able to.      **
19ee0 20 74 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d   trigger program
19ef0 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  s. In this case 
19f00 45 78 70 72 2e 69 54 61 62 6c 65 20 69 73 20 73  Expr.iTable is s
19f10 65 74 20 74 6f 20 31 20 66 6f 72 20 74 68 65 0a  et to 1 for the.
19f20 20 20 20 20 20 20 2a 2a 20 6e 65 77 2e 2a 20 70        ** new.* p
19f30 73 65 75 64 6f 2d 74 61 62 6c 65 2c 20 6f 72 20  seudo-table, or 
19f40 30 20 66 6f 72 20 74 68 65 20 6f 6c 64 2e 2a 20  0 for the old.* 
19f50 70 73 65 75 64 6f 2d 74 61 62 6c 65 2e 20 45 78  pseudo-table. Ex
19f60 70 72 2e 69 43 6f 6c 75 6d 6e 0a 20 20 20 20 20  pr.iColumn.     
19f70 20 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 74 68   ** is set to th
19f80 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  e column of the 
19f90 70 73 65 75 64 6f 2d 74 61 62 6c 65 20 74 6f 20  pseudo-table to 
19fa0 72 65 61 64 2c 20 6f 72 20 74 6f 20 2d 31 20 74  read, or to -1 t
19fb0 6f 0a 20 20 20 20 20 20 2a 2a 20 72 65 61 64 20  o.      ** read 
19fc0 74 68 65 20 72 6f 77 69 64 20 66 69 65 6c 64 2e  the rowid field.
19fd0 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
19fe0 2a 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  ** The expressio
19ff0 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64  n is implemented
1a000 20 75 73 69 6e 67 20 61 6e 20 4f 50 5f 50 61 72   using an OP_Par
1a010 61 6d 20 6f 70 63 6f 64 65 2e 20 54 68 65 20 70  am opcode. The p
1a020 31 0a 20 20 20 20 20 20 2a 2a 20 70 61 72 61 6d  1.      ** param
1a030 65 74 65 72 20 69 73 20 73 65 74 20 74 6f 20 30  eter is set to 0
1a040 20 66 6f 72 20 61 6e 20 6f 6c 64 2e 72 6f 77 69   for an old.rowi
1a050 64 20 72 65 66 65 72 65 6e 63 65 2c 20 6f 72 20  d reference, or 
1a060 74 6f 20 28 69 2b 31 29 0a 20 20 20 20 20 20 2a  to (i+1).      *
1a070 2a 20 74 6f 20 72 65 66 65 72 65 6e 63 65 20 61  * to reference a
1a080 6e 6f 74 68 65 72 20 63 6f 6c 75 6d 6e 20 6f 66  nother column of
1a090 20 74 68 65 20 6f 6c 64 2e 2a 20 70 73 65 75 64   the old.* pseud
1a0a0 6f 2d 74 61 62 6c 65 2c 20 77 68 65 72 65 20 0a  o-table, where .
1a0b0 20 20 20 20 20 20 2a 2a 20 69 20 69 73 20 74 68        ** i is th
1a0c0 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 63  e index of the c
1a0d0 6f 6c 75 6d 6e 2e 20 46 6f 72 20 61 20 6e 65 77  olumn. For a new
1a0e0 2e 72 6f 77 69 64 20 72 65 66 65 72 65 6e 63 65  .rowid reference
1a0f0 2c 20 70 31 20 69 73 0a 20 20 20 20 20 20 2a 2a  , p1 is.      **
1a100 20 73 65 74 20 74 6f 20 28 6e 2b 31 29 2c 20 77   set to (n+1), w
1a110 68 65 72 65 20 6e 20 69 73 20 74 68 65 20 6e 75  here n is the nu
1a120 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
1a130 69 6e 20 65 61 63 68 20 70 73 65 75 64 6f 2d 74  in each pseudo-t
1a140 61 62 6c 65 2e 0a 20 20 20 20 20 20 2a 2a 20 46  able..      ** F
1a150 6f 72 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  or a reference t
1a160 6f 20 61 6e 79 20 6f 74 68 65 72 20 63 6f 6c 75  o any other colu
1a170 6d 6e 20 69 6e 20 74 68 65 20 6e 65 77 2e 2a 20  mn in the new.* 
1a180 70 73 65 75 64 6f 2d 74 61 62 6c 65 2c 20 70 31  pseudo-table, p1
1a190 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73 65 74  .      ** is set
1a1a0 20 74 6f 20 28 6e 2b 32 2b 69 29 2c 20 77 68 65   to (n+2+i), whe
1a1b0 72 65 20 6e 20 61 6e 64 20 69 20 61 72 65 20 61  re n and i are a
1a1c0 73 20 64 65 66 69 6e 65 64 20 70 72 65 76 69 6f  s defined previo
1a1d0 75 73 6c 79 2e 20 46 6f 72 0a 20 20 20 20 20 20  usly. For.      
1a1e0 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74  ** example, if t
1a1f0 68 65 20 74 61 62 6c 65 20 6f 6e 20 77 68 69 63  he table on whic
1a200 68 20 74 72 69 67 67 65 72 73 20 61 72 65 20 62  h triggers are b
1a210 65 69 6e 67 20 66 69 72 65 64 20 69 73 0a 20 20  eing fired is.  
1a220 20 20 20 20 2a 2a 20 64 65 63 6c 61 72 65 64 20      ** declared 
1a230 61 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  as:.      **.   
1a240 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45 20 54     **   CREATE T
1a250 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20  ABLE t1(a, b);. 
1a260 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
1a270 20 54 68 65 6e 20 70 31 20 69 73 20 69 6e 74 65   Then p1 is inte
1a280 72 70 72 65 74 65 64 20 61 73 20 66 6f 6c 6c 6f  rpreted as follo
1a290 77 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  ws:.      **.   
1a2a0 20 20 20 2a 2a 20 20 20 70 31 3d 3d 30 20 20 20     **   p1==0   
1a2b0 2d 3e 20 20 20 20 6f 6c 64 2e 72 6f 77 69 64 20  ->    old.rowid 
1a2c0 20 20 20 20 70 31 3d 3d 33 20 20 20 2d 3e 20 20      p1==3   ->  
1a2d0 20 20 6e 65 77 2e 72 6f 77 69 64 0a 20 20 20 20    new.rowid.    
1a2e0 20 20 2a 2a 20 20 20 70 31 3d 3d 31 20 20 20 2d    **   p1==1   -
1a2f0 3e 20 20 20 20 6f 6c 64 2e 61 20 20 20 20 20 20  >    old.a      
1a300 20 20 20 70 31 3d 3d 34 20 20 20 2d 3e 20 20 20     p1==4   ->   
1a310 20 6e 65 77 2e 61 0a 20 20 20 20 20 20 2a 2a 20   new.a.      ** 
1a320 20 20 70 31 3d 3d 32 20 20 20 2d 3e 20 20 20 20    p1==2   ->    
1a330 6f 6c 64 2e 62 20 20 20 20 20 20 20 20 20 70 31  old.b         p1
1a340 3d 3d 35 20 20 20 2d 3e 20 20 20 20 6e 65 77 2e  ==5   ->    new.
1a350 62 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 2a  b       .      *
1a360 2f 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70  /.      Table *p
1a370 54 61 62 20 3d 20 70 45 78 70 72 2d 3e 70 54 61  Tab = pExpr->pTa
1a380 62 3b 0a 20 20 20 20 20 20 69 6e 74 20 70 31 20  b;.      int p1 
1a390 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20  = pExpr->iTable 
1a3a0 2a 20 28 70 54 61 62 2d 3e 6e 43 6f 6c 2b 31 29  * (pTab->nCol+1)
1a3b0 20 2b 20 31 20 2b 20 70 45 78 70 72 2d 3e 69 43   + 1 + pExpr->iC
1a3c0 6f 6c 75 6d 6e 3b 0a 0a 20 20 20 20 20 20 61 73  olumn;..      as
1a3d0 73 65 72 74 28 20 70 45 78 70 72 2d 3e 69 54 61  sert( pExpr->iTa
1a3e0 62 6c 65 3d 3d 30 20 7c 7c 20 70 45 78 70 72 2d  ble==0 || pExpr-
1a3f0 3e 69 54 61 62 6c 65 3d 3d 31 20 29 3b 0a 20 20  >iTable==1 );.  
1a400 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
1a410 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 2d 31 20 26  r->iColumn>=-1 &
1a420 26 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  & pExpr->iColumn
1a430 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20  <pTab->nCol );. 
1a440 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61       assert( pTa
1a450 62 2d 3e 69 50 4b 65 79 3c 30 20 7c 7c 20 70 45  b->iPKey<0 || pE
1a460 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70 54  xpr->iColumn!=pT
1a470 61 62 2d 3e 69 50 4b 65 79 20 29 3b 0a 20 20 20  ab->iPKey );.   
1a480 20 20 20 61 73 73 65 72 74 28 20 70 31 3e 3d 30     assert( p1>=0
1a490 20 26 26 20 70 31 3c 28 70 54 61 62 2d 3e 6e 43   && p1<(pTab->nC
1a4a0 6f 6c 2a 32 2b 32 29 20 29 3b 0a 0a 20 20 20 20  ol*2+2) );..    
1a4b0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1a4c0 4f 70 32 28 76 2c 20 4f 50 5f 50 61 72 61 6d 2c  Op2(v, OP_Param,
1a4d0 20 70 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20   p1, target);.  
1a4e0 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
1a4f0 28 76 2c 20 22 25 73 2e 25 73 20 2d 3e 20 24 25  (v, "%s.%s -> $%
1a500 64 22 2c 0a 20 20 20 20 20 20 20 20 28 70 45 78  d",.        (pEx
1a510 70 72 2d 3e 69 54 61 62 6c 65 20 3f 20 22 6e 65  pr->iTable ? "ne
1a520 77 22 20 3a 20 22 6f 6c 64 22 29 2c 0a 20 20 20  w" : "old"),.   
1a530 20 20 20 20 20 28 70 45 78 70 72 2d 3e 69 43 6f       (pExpr->iCo
1a540 6c 75 6d 6e 3c 30 20 3f 20 22 72 6f 77 69 64 22  lumn<0 ? "rowid"
1a550 20 3a 20 70 45 78 70 72 2d 3e 70 54 61 62 2d 3e   : pExpr->pTab->
1a560 61 43 6f 6c 5b 70 45 78 70 72 2d 3e 69 43 6f 6c  aCol[pExpr->iCol
1a570 75 6d 6e 5d 2e 7a 4e 61 6d 65 29 2c 0a 20 20 20  umn].zName),.   
1a580 20 20 20 20 20 74 61 72 67 65 74 0a 20 20 20 20       target.    
1a590 20 20 29 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53    ));..#ifndef S
1a5a0 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54  QLITE_OMIT_FLOAT
1a5b0 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20 20 20  ING_POINT.      
1a5c0 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c 75 6d 6e  /* If the column
1a5d0 20 68 61 73 20 52 45 41 4c 20 61 66 66 69 6e 69   has REAL affini
1a5e0 74 79 2c 20 69 74 20 6d 61 79 20 63 75 72 72 65  ty, it may curre
1a5f0 6e 74 6c 79 20 62 65 20 73 74 6f 72 65 64 20 61  ntly be stored a
1a600 73 20 61 6e 0a 20 20 20 20 20 20 2a 2a 20 69 6e  s an.      ** in
1a610 74 65 67 65 72 2e 20 55 73 65 20 4f 50 5f 52 65  teger. Use OP_Re
1a620 61 6c 41 66 66 69 6e 69 74 79 20 74 6f 20 6d 61  alAffinity to ma
1a630 6b 65 20 73 75 72 65 20 69 74 20 69 73 20 72 65  ke sure it is re
1a640 61 6c 6c 79 20 72 65 61 6c 2e 0a 20 20 20 20 20  ally real..     
1a650 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 45 56 49   **.      ** EVI
1a660 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 36 30 39 38  DENCE-OF: R-6098
1a670 35 2d 35 37 36 36 32 20 53 51 4c 69 74 65 20 77  5-57662 SQLite w
1a680 69 6c 6c 20 63 6f 6e 76 65 72 74 20 74 68 65 20  ill convert the 
1a690 76 61 6c 75 65 20 62 61 63 6b 20 74 6f 0a 20 20  value back to.  
1a6a0 20 20 20 20 2a 2a 20 66 6c 6f 61 74 69 6e 67 20      ** floating 
1a6b0 70 6f 69 6e 74 20 77 68 65 6e 20 65 78 74 72 61  point when extra
1a6c0 63 74 69 6e 67 20 69 74 20 66 72 6f 6d 20 74 68  cting it from th
1a6d0 65 20 72 65 63 6f 72 64 2e 20 20 2a 2f 0a 20 20  e record.  */.  
1a6e0 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69      if( pExpr->i
1a6f0 43 6f 6c 75 6d 6e 3e 3d 30 20 0a 20 20 20 20 20  Column>=0 .     
1a700 20 20 26 26 20 70 54 61 62 2d 3e 61 43 6f 6c 5b    && pTab->aCol[
1a710 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e  pExpr->iColumn].
1a720 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45  affinity==SQLITE
1a730 5f 41 46 46 5f 52 45 41 4c 0a 20 20 20 20 20 20  _AFF_REAL.      
1a740 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1a750 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
1a760 4f 50 5f 52 65 61 6c 41 66 66 69 6e 69 74 79 2c  OP_RealAffinity,
1a770 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
1a780 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 62  }.#endif.      b
1a790 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 0a 20 20  reak;.    }...  
1a7a0 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 6d    /*.    ** Form
1a7b0 20 41 3a 0a 20 20 20 20 2a 2a 20 20 20 43 41 53   A:.    **   CAS
1a7c0 45 20 78 20 57 48 45 4e 20 65 31 20 54 48 45 4e  E x WHEN e1 THEN
1a7d0 20 72 31 20 57 48 45 4e 20 65 32 20 54 48 45 4e   r1 WHEN e2 THEN
1a7e0 20 72 32 20 2e 2e 2e 20 57 48 45 4e 20 65 4e 20   r2 ... WHEN eN 
1a7f0 54 48 45 4e 20 72 4e 20 45 4c 53 45 20 79 20 45  THEN rN ELSE y E
1a800 4e 44 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  ND.    **.    **
1a810 20 46 6f 72 6d 20 42 3a 0a 20 20 20 20 2a 2a 20   Form B:.    ** 
1a820 20 20 43 41 53 45 20 57 48 45 4e 20 65 31 20 54    CASE WHEN e1 T
1a830 48 45 4e 20 72 31 20 57 48 45 4e 20 65 32 20 54  HEN r1 WHEN e2 T
1a840 48 45 4e 20 72 32 20 2e 2e 2e 20 57 48 45 4e 20  HEN r2 ... WHEN 
1a850 65 4e 20 54 48 45 4e 20 72 4e 20 45 4c 53 45 20  eN THEN rN ELSE 
1a860 79 20 45 4e 44 0a 20 20 20 20 2a 2a 0a 20 20 20  y END.    **.   
1a870 20 2a 2a 20 46 6f 72 6d 20 41 20 69 73 20 63 61   ** Form A is ca
1a880 6e 20 62 65 20 74 72 61 6e 73 66 6f 72 6d 65 64  n be transformed
1a890 20 69 6e 74 6f 20 74 68 65 20 65 71 75 69 76 61   into the equiva
1a8a0 6c 65 6e 74 20 66 6f 72 6d 20 42 20 61 73 20 66  lent form B as f
1a8b0 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20 2a 2a 20 20  ollows:.    **  
1a8c0 20 43 41 53 45 20 57 48 45 4e 20 78 3d 65 31 20   CASE WHEN x=e1 
1a8d0 54 48 45 4e 20 72 31 20 57 48 45 4e 20 78 3d 65  THEN r1 WHEN x=e
1a8e0 32 20 54 48 45 4e 20 72 32 20 2e 2e 2e 0a 20 20  2 THEN r2 ....  
1a8f0 20 20 2a 2a 20 20 20 20 20 20 20 20 57 48 45 4e    **        WHEN
1a900 20 78 3d 65 4e 20 54 48 45 4e 20 72 4e 20 45 4c   x=eN THEN rN EL
1a910 53 45 20 79 20 45 4e 44 0a 20 20 20 20 2a 2a 0a  SE y END.    **.
1a920 20 20 20 20 2a 2a 20 58 20 28 69 66 20 69 74 20      ** X (if it 
1a930 65 78 69 73 74 73 29 20 69 73 20 69 6e 20 70 45  exists) is in pE
1a940 78 70 72 2d 3e 70 4c 65 66 74 2e 0a 20 20 20 20  xpr->pLeft..    
1a950 2a 2a 20 59 20 69 73 20 69 6e 20 74 68 65 20 6c  ** Y is in the l
1a960 61 73 74 20 65 6c 65 6d 65 6e 74 20 6f 66 20 70  ast element of p
1a970 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20 69 66  Expr->x.pList if
1a980 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d   pExpr->x.pList-
1a990 3e 6e 45 78 70 72 20 69 73 0a 20 20 20 20 2a 2a  >nExpr is.    **
1a9a0 20 6f 64 64 2e 20 20 54 68 65 20 59 20 69 73 20   odd.  The Y is 
1a9b0 61 6c 73 6f 20 6f 70 74 69 6f 6e 61 6c 2e 20 20  also optional.  
1a9c0 49 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  If the number of
1a9d0 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 78 2e 70   elements in x.p
1a9e0 4c 69 73 74 0a 20 20 20 20 2a 2a 20 69 73 20 65  List.    ** is e
1a9f0 76 65 6e 2c 20 74 68 65 6e 20 59 20 69 73 20 6f  ven, then Y is o
1aa00 6d 69 74 74 65 64 20 61 6e 64 20 74 68 65 20 22  mitted and the "
1aa10 6f 74 68 65 72 77 69 73 65 22 20 72 65 73 75 6c  otherwise" resul
1aa20 74 20 69 73 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a  t is NULL..    *
1aa30 2a 20 45 69 20 69 73 20 69 6e 20 70 45 78 70 72  * Ei is in pExpr
1aa40 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 2a 32 5d 20  ->pList->a[i*2] 
1aa50 61 6e 64 20 52 69 20 69 73 20 70 45 78 70 72 2d  and Ri is pExpr-
1aa60 3e 70 4c 69 73 74 2d 3e 61 5b 69 2a 32 2b 31 5d  >pList->a[i*2+1]
1aa70 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
1aa80 54 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68  The result of th
1aa90 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
1aaa0 74 68 65 20 52 69 20 66 6f 72 20 74 68 65 20 66  the Ri for the f
1aab0 69 72 73 74 20 6d 61 74 63 68 69 6e 67 20 45 69  irst matching Ei
1aac0 2c 0a 20 20 20 20 2a 2a 20 6f 72 20 69 66 20 74  ,.    ** or if t
1aad0 68 65 72 65 20 69 73 20 6e 6f 20 6d 61 74 63 68  here is no match
1aae0 69 6e 67 20 45 69 2c 20 74 68 65 20 45 4c 53 45  ing Ei, the ELSE
1aaf0 20 74 65 72 6d 20 59 2c 20 6f 72 20 69 66 20 74   term Y, or if t
1ab00 68 65 72 65 20 69 73 0a 20 20 20 20 2a 2a 20 6e  here is.    ** n
1ab10 6f 20 45 4c 53 45 20 74 65 72 6d 2c 20 4e 55 4c  o ELSE term, NUL
1ab20 4c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 65  L..    */.    de
1ab30 66 61 75 6c 74 3a 20 61 73 73 65 72 74 28 20 6f  fault: assert( o
1ab40 70 3d 3d 54 4b 5f 43 41 53 45 20 29 3b 20 7b 0a  p==TK_CASE ); {.
1ab50 20 20 20 20 20 20 69 6e 74 20 65 6e 64 4c 61 62        int endLab
1ab60 65 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  el;             
1ab70 20 20 20 20 20 20 20 20 2f 2a 20 47 4f 54 4f 20          /* GOTO 
1ab80 6c 61 62 65 6c 20 66 6f 72 20 65 6e 64 20 6f 66  label for end of
1ab90 20 43 41 53 45 20 73 74 6d 74 20 2a 2f 0a 20 20   CASE stmt */.  
1aba0 20 20 20 20 69 6e 74 20 6e 65 78 74 43 61 73 65      int nextCase
1abb0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1abc0 20 20 20 20 20 20 2f 2a 20 47 4f 54 4f 20 6c 61        /* GOTO la
1abd0 62 65 6c 20 66 6f 72 20 6e 65 78 74 20 57 48 45  bel for next WHE
1abe0 4e 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20  N clause */.    
1abf0 20 20 69 6e 74 20 6e 45 78 70 72 3b 20 20 20 20    int nExpr;    
1ac00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ac10 20 20 20 20 2f 2a 20 32 78 20 6e 75 6d 62 65 72      /* 2x number
1ac20 20 6f 66 20 57 48 45 4e 20 74 65 72 6d 73 20 2a   of WHEN terms *
1ac30 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 20 20  /.      int i;  
1ac40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ac50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
1ac60 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20  p counter */.   
1ac70 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c     ExprList *pEL
1ac80 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ist;            
1ac90 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
1aca0 57 48 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20  WHEN terms */.  
1acb0 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
1acc0 69 73 74 5f 69 74 65 6d 20 2a 61 4c 69 73 74 65  ist_item *aListe
1acd0 6c 65 6d 3b 20 20 2f 2a 20 41 72 72 61 79 20 6f  lem;  /* Array o
1ace0 66 20 57 48 45 4e 20 74 65 72 6d 73 20 2a 2f 0a  f WHEN terms */.
1acf0 20 20 20 20 20 20 45 78 70 72 20 6f 70 43 6f 6d        Expr opCom
1ad00 70 61 72 65 3b 20 20 20 20 20 20 20 20 20 20 20  pare;           
1ad10 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 58          /* The X
1ad20 3d 3d 45 69 20 65 78 70 72 65 73 73 69 6f 6e 20  ==Ei expression 
1ad30 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  */.      Expr *p
1ad40 58 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  X;              
1ad50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1ad60 65 20 58 20 65 78 70 72 65 73 73 69 6f 6e 20 2a  e X expression *
1ad70 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 54  /.      Expr *pT
1ad80 65 73 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  est = 0;        
1ad90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 58 3d 3d            /* X==
1ada0 45 69 20 28 66 6f 72 6d 20 41 29 20 6f 72 20 6a  Ei (form A) or j
1adb0 75 73 74 20 45 69 20 28 66 6f 72 6d 20 42 29 20  ust Ei (form B) 
1adc0 2a 2f 0a 20 20 20 20 20 20 56 56 41 5f 4f 4e 4c  */.      VVA_ONL
1add0 59 28 20 69 6e 74 20 69 43 61 63 68 65 4c 65 76  Y( int iCacheLev
1ade0 65 6c 20 3d 20 70 50 61 72 73 65 2d 3e 69 43 61  el = pParse->iCa
1adf0 63 68 65 4c 65 76 65 6c 3b 20 29 0a 0a 20 20 20  cheLevel; )..   
1ae00 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
1ae10 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
1ae20 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
1ae30 20 26 26 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69   && pExpr->x.pLi
1ae40 73 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  st );.      asse
1ae50 72 74 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73  rt(pExpr->x.pLis
1ae60 74 2d 3e 6e 45 78 70 72 20 3e 20 30 29 3b 0a 20  t->nExpr > 0);. 
1ae70 20 20 20 20 20 70 45 4c 69 73 74 20 3d 20 70 45       pEList = pE
1ae80 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20  xpr->x.pList;.  
1ae90 20 20 20 20 61 4c 69 73 74 65 6c 65 6d 20 3d 20      aListelem = 
1aea0 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20  pEList->a;.     
1aeb0 20 6e 45 78 70 72 20 3d 20 70 45 4c 69 73 74 2d   nExpr = pEList-
1aec0 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 65 6e  >nExpr;.      en
1aed0 64 4c 61 62 65 6c 20 3d 20 73 71 6c 69 74 65 33  dLabel = sqlite3
1aee0 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
1aef0 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 58 20  ;.      if( (pX 
1af00 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 21  = pExpr->pLeft)!
1af10 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 74 65  =0 ){.        te
1af20 6d 70 58 20 3d 20 2a 70 58 3b 0a 20 20 20 20 20  mpX = *pX;.     
1af30 20 20 20 74 65 73 74 63 61 73 65 28 20 70 58 2d     testcase( pX-
1af40 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29  >op==TK_COLUMN )
1af50 3b 0a 20 20 20 20 20 20 20 20 65 78 70 72 54 6f  ;.        exprTo
1af60 52 65 67 69 73 74 65 72 28 26 74 65 6d 70 58 2c  Register(&tempX,
1af70 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1af80 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 58 2c  Temp(pParse, pX,
1af90 20 26 72 65 67 46 72 65 65 31 29 29 3b 0a 20 20   &regFree1));.  
1afa0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1afb0 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
1afc0 20 20 20 20 20 20 20 6f 70 43 6f 6d 70 61 72 65         opCompare
1afd0 2e 6f 70 20 3d 20 54 4b 5f 45 51 3b 0a 20 20 20  .op = TK_EQ;.   
1afe0 20 20 20 20 20 6f 70 43 6f 6d 70 61 72 65 2e 70       opCompare.p
1aff0 4c 65 66 74 20 3d 20 26 74 65 6d 70 58 3b 0a 20  Left = &tempX;. 
1b000 20 20 20 20 20 20 20 70 54 65 73 74 20 3d 20 26         pTest = &
1b010 6f 70 43 6f 6d 70 61 72 65 3b 0a 20 20 20 20 20  opCompare;.     
1b020 20 20 20 2f 2a 20 54 69 63 6b 65 74 20 62 33 35     /* Ticket b35
1b030 31 64 39 35 66 39 63 64 35 65 66 31 37 65 39 64  1d95f9cd5ef17e9d
1b040 39 64 62 61 65 31 38 66 35 63 61 38 36 31 31 31  9dbae18f5ca86111
1b050 39 30 30 30 31 3a 0a 20 20 20 20 20 20 20 20 2a  90001:.        *
1b060 2a 20 54 68 65 20 76 61 6c 75 65 20 69 6e 20 72  * The value in r
1b070 65 67 46 72 65 65 31 20 6d 69 67 68 74 20 67 65  egFree1 might ge
1b080 74 20 53 43 6f 70 79 2d 65 64 20 69 6e 74 6f 20  t SCopy-ed into 
1b090 74 68 65 20 66 69 6c 65 20 72 65 73 75 6c 74 2e  the file result.
1b0a0 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 6f 20 6d  .        ** So m
1b0b0 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68  ake sure that th
1b0c0 65 20 72 65 67 46 72 65 65 31 20 72 65 67 69 73  e regFree1 regis
1b0d0 74 65 72 20 69 73 20 6e 6f 74 20 72 65 75 73 65  ter is not reuse
1b0e0 64 20 66 6f 72 20 6f 74 68 65 72 0a 20 20 20 20  d for other.    
1b0f0 20 20 20 20 2a 2a 20 70 75 72 70 6f 73 65 73 20      ** purposes 
1b100 61 6e 64 20 70 6f 73 73 69 62 6c 79 20 6f 76 65  and possibly ove
1b110 72 77 72 69 74 74 65 6e 2e 20 20 2a 2f 0a 20 20  rwritten.  */.  
1b120 20 20 20 20 20 20 72 65 67 46 72 65 65 31 20 3d        regFree1 =
1b130 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
1b140 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78    for(i=0; i<nEx
1b150 70 72 2d 31 3b 20 69 3d 69 2b 32 29 7b 0a 20 20  pr-1; i=i+2){.  
1b160 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1b170 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73  rCachePush(pPars
1b180 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
1b190 70 58 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  pX ){.          
1b1a0 61 73 73 65 72 74 28 20 70 54 65 73 74 21 3d 30  assert( pTest!=0
1b1b0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6f 70   );.          op
1b1c0 43 6f 6d 70 61 72 65 2e 70 52 69 67 68 74 20 3d  Compare.pRight =
1b1d0 20 61 4c 69 73 74 65 6c 65 6d 5b 69 5d 2e 70 45   aListelem[i].pE
1b1e0 78 70 72 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  xpr;.        }el
1b1f0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 54  se{.          pT
1b200 65 73 74 20 3d 20 61 4c 69 73 74 65 6c 65 6d 5b  est = aListelem[
1b210 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  i].pExpr;.      
1b220 20 20 7d 0a 20 20 20 20 20 20 20 20 6e 65 78 74    }.        next
1b230 43 61 73 65 20 3d 20 73 71 6c 69 74 65 33 56 64  Case = sqlite3Vd
1b240 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
1b250 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
1b260 28 20 70 54 65 73 74 2d 3e 6f 70 3d 3d 54 4b 5f  ( pTest->op==TK_
1b270 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20  COLUMN );.      
1b280 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
1b290 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 54 65  alse(pParse, pTe
1b2a0 73 74 2c 20 6e 65 78 74 43 61 73 65 2c 20 53 51  st, nextCase, SQ
1b2b0 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29  LITE_JUMPIFNULL)
1b2c0 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
1b2d0 73 65 28 20 61 4c 69 73 74 65 6c 65 6d 5b 69 2b  se( aListelem[i+
1b2e0 31 5d 2e 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  1].pExpr->op==TK
1b2f0 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20  _COLUMN );.     
1b300 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
1b310 64 65 28 70 50 61 72 73 65 2c 20 61 4c 69 73 74  de(pParse, aList
1b320 65 6c 65 6d 5b 69 2b 31 5d 2e 70 45 78 70 72 2c  elem[i+1].pExpr,
1b330 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
1b340 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74    sqlite3VdbeGot
1b350 6f 28 76 2c 20 65 6e 64 4c 61 62 65 6c 29 3b 0a  o(v, endLabel);.
1b360 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1b370 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72  xprCachePop(pPar
1b380 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  se);.        sql
1b390 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
1b3a0 61 62 65 6c 28 76 2c 20 6e 65 78 74 43 61 73 65  abel(v, nextCase
1b3b0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1b3c0 20 69 66 28 20 28 6e 45 78 70 72 26 31 29 21 3d   if( (nExpr&1)!=
1b3d0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
1b3e0 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73  ite3ExprCachePus
1b3f0 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  h(pParse);.     
1b400 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
1b410 64 65 28 70 50 61 72 73 65 2c 20 70 45 4c 69 73  de(pParse, pELis
1b420 74 2d 3e 61 5b 6e 45 78 70 72 2d 31 5d 2e 70 45  t->a[nExpr-1].pE
1b430 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  xpr, target);.  
1b440 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1b450 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65  rCachePop(pParse
1b460 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
1b470 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
1b480 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1b490 4e 75 6c 6c 2c 20 30 2c 20 74 61 72 67 65 74 29  Null, 0, target)
1b4a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1b4b0 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c  assert( db->mall
1b4c0 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70 50 61 72  ocFailed || pPar
1b4d0 73 65 2d 3e 6e 45 72 72 3e 30 20 0a 20 20 20 20  se->nErr>0 .    
1b4e0 20 20 20 20 20 20 20 7c 7c 20 70 50 61 72 73 65         || pParse
1b4f0 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 3d 3d 69  ->iCacheLevel==i
1b500 43 61 63 68 65 4c 65 76 65 6c 20 29 3b 0a 20 20  CacheLevel );.  
1b510 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
1b520 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65  esolveLabel(v, e
1b530 6e 64 4c 61 62 65 6c 29 3b 0a 20 20 20 20 20 20  ndLabel);.      
1b540 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66  break;.    }.#if
1b550 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1b560 5f 54 52 49 47 47 45 52 0a 20 20 20 20 63 61 73  _TRIGGER.    cas
1b570 65 20 54 4b 5f 52 41 49 53 45 3a 20 7b 0a 20 20  e TK_RAISE: {.  
1b580 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
1b590 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f  r->affinity==OE_
1b5a0 52 6f 6c 6c 62 61 63 6b 20 0a 20 20 20 20 20 20  Rollback .      
1b5b0 20 20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 61       || pExpr->a
1b5c0 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 41 62 6f 72  ffinity==OE_Abor
1b5d0 74 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  t.           || 
1b5e0 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d  pExpr->affinity=
1b5f0 3d 4f 45 5f 46 61 69 6c 0a 20 20 20 20 20 20 20  =OE_Fail.       
1b600 20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 61 66      || pExpr->af
1b610 66 69 6e 69 74 79 3d 3d 4f 45 5f 49 67 6e 6f 72  finity==OE_Ignor
1b620 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20  e.      );.     
1b630 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 70 54   if( !pParse->pT
1b640 72 69 67 67 65 72 54 61 62 20 29 7b 0a 20 20 20  riggerTab ){.   
1b650 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
1b660 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20  rMsg(pParse,.   
1b670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b680 20 20 20 20 22 52 41 49 53 45 28 29 20 6d 61 79      "RAISE() may
1b690 20 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 77 69   only be used wi
1b6a0 74 68 69 6e 20 61 20 74 72 69 67 67 65 72 2d 70  thin a trigger-p
1b6b0 72 6f 67 72 61 6d 22 29 3b 0a 20 20 20 20 20 20  rogram");.      
1b6c0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
1b6d0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 45    }.      if( pE
1b6e0 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f  xpr->affinity==O
1b6f0 45 5f 41 62 6f 72 74 20 29 7b 0a 20 20 20 20 20  E_Abort ){.     
1b700 20 20 20 73 71 6c 69 74 65 33 4d 61 79 41 62 6f     sqlite3MayAbo
1b710 72 74 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  rt(pParse);.    
1b720 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
1b730 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
1b740 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74  ty(pExpr, EP_Int
1b750 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20  Value) );.      
1b760 69 66 28 20 70 45 78 70 72 2d 3e 61 66 66 69 6e  if( pExpr->affin
1b770 69 74 79 3d 3d 4f 45 5f 49 67 6e 6f 72 65 20 29  ity==OE_Ignore )
1b780 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1b790 33 56 64 62 65 41 64 64 4f 70 34 28 0a 20 20 20  3VdbeAddOp4(.   
1b7a0 20 20 20 20 20 20 20 20 20 76 2c 20 4f 50 5f 48           v, OP_H
1b7b0 61 6c 74 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20  alt, SQLITE_OK, 
1b7c0 4f 45 5f 49 67 6e 6f 72 65 2c 20 30 2c 20 70 45  OE_Ignore, 0, pE
1b7d0 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 30 29  xpr->u.zToken,0)
1b7e0 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
1b7f0 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
1b800 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1b810 73 71 6c 69 74 65 33 48 61 6c 74 43 6f 6e 73 74  sqlite3HaltConst
1b820 72 61 69 6e 74 28 70 50 61 72 73 65 2c 20 53 51  raint(pParse, SQ
1b830 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  LITE_CONSTRAINT_
1b840 54 52 49 47 47 45 52 2c 0a 20 20 20 20 20 20 20  TRIGGER,.       
1b850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b860 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 61 66         pExpr->af
1b870 66 69 6e 69 74 79 2c 20 70 45 78 70 72 2d 3e 75  finity, pExpr->u
1b880 2e 7a 54 6f 6b 65 6e 2c 20 30 2c 20 30 29 3b 0a  .zToken, 0, 0);.
1b890 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 62        }..      b
1b8a0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
1b8b0 69 66 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  if.  }.  sqlite3
1b8c0 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
1b8d0 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 31 29  Parse, regFree1)
1b8e0 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  ;.  sqlite3Relea
1b8f0 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
1b900 2c 20 72 65 67 46 72 65 65 32 29 3b 0a 20 20 72  , regFree2);.  r
1b910 65 74 75 72 6e 20 69 6e 52 65 67 3b 0a 7d 0a 0a  eturn inReg;.}..
1b920 2f 2a 0a 2a 2a 20 46 61 63 74 6f 72 20 6f 75 74  /*.** Factor out
1b930 20 74 68 65 20 63 6f 64 65 20 6f 66 20 74 68 65   the code of the
1b940 20 67 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f   given expressio
1b950 6e 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 61 74  n to initializat
1b960 69 6f 6e 20 74 69 6d 65 2e 0a 2a 2f 0a 76 6f 69  ion time..*/.voi
1b970 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  d sqlite3ExprCod
1b980 65 41 74 49 6e 69 74 28 0a 20 20 50 61 72 73 65  eAtInit(.  Parse
1b990 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20   *pParse,    /* 
1b9a0 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
1b9b0 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  */.  Expr *pExpr
1b9c0 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78  ,      /* The ex
1b9d0 70 72 65 73 73 69 6f 6e 20 74 6f 20 63 6f 64 65  pression to code
1b9e0 20 77 68 65 6e 20 74 68 65 20 56 44 42 45 20 69   when the VDBE i
1b9f0 6e 69 74 69 61 6c 69 7a 65 73 20 2a 2f 0a 20 20  nitializes */.  
1ba00 69 6e 74 20 72 65 67 44 65 73 74 2c 20 20 20 20  int regDest,    
1ba10 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 76    /* Store the v
1ba20 61 6c 75 65 20 69 6e 20 74 68 69 73 20 72 65 67  alue in this reg
1ba30 69 73 74 65 72 20 2a 2f 0a 20 20 75 38 20 72 65  ister */.  u8 re
1ba40 75 73 61 62 6c 65 20 20 20 20 20 20 20 2f 2a 20  usable       /* 
1ba50 54 72 75 65 20 69 66 20 74 68 69 73 20 65 78 70  True if this exp
1ba60 72 65 73 73 69 6f 6e 20 69 73 20 72 65 75 73 61  ression is reusa
1ba70 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72  ble */.){.  Expr
1ba80 4c 69 73 74 20 2a 70 3b 0a 20 20 61 73 73 65 72  List *p;.  asser
1ba90 74 28 20 43 6f 6e 73 74 46 61 63 74 6f 72 4f 6b  t( ConstFactorOk
1baa0 28 70 50 61 72 73 65 29 20 29 3b 0a 20 20 70 20  (pParse) );.  p 
1bab0 3d 20 70 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74  = pParse->pConst
1bac0 45 78 70 72 3b 0a 20 20 70 45 78 70 72 20 3d 20  Expr;.  pExpr = 
1bad0 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70  sqlite3ExprDup(p
1bae0 50 61 72 73 65 2d 3e 64 62 2c 20 70 45 78 70 72  Parse->db, pExpr
1baf0 2c 20 30 29 3b 0a 20 20 70 20 3d 20 73 71 6c 69  , 0);.  p = sqli
1bb00 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
1bb10 64 28 70 50 61 72 73 65 2c 20 70 2c 20 70 45 78  d(pParse, p, pEx
1bb20 70 72 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a  pr);.  if( p ){.
1bb30 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72       struct Expr
1bb40 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
1bb50 20 3d 20 26 70 2d 3e 61 5b 70 2d 3e 6e 45 78 70   = &p->a[p->nExp
1bb60 72 2d 31 5d 3b 0a 20 20 20 20 20 70 49 74 65 6d  r-1];.     pItem
1bb70 2d 3e 75 2e 69 43 6f 6e 73 74 45 78 70 72 52 65  ->u.iConstExprRe
1bb80 67 20 3d 20 72 65 67 44 65 73 74 3b 0a 20 20 20  g = regDest;.   
1bb90 20 20 70 49 74 65 6d 2d 3e 72 65 75 73 61 62 6c    pItem->reusabl
1bba0 65 20 3d 20 72 65 75 73 61 62 6c 65 3b 0a 20 20  e = reusable;.  
1bbb0 7d 0a 20 20 70 50 61 72 73 65 2d 3e 70 43 6f 6e  }.  pParse->pCon
1bbc0 73 74 45 78 70 72 20 3d 20 70 3b 0a 7d 0a 0a 2f  stExpr = p;.}../
1bbd0 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
1bbe0 64 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20 61  de to evaluate a
1bbf0 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64  n expression and
1bc00 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   store the resul
1bc10 74 73 0a 2a 2a 20 69 6e 74 6f 20 61 20 72 65 67  ts.** into a reg
1bc20 69 73 74 65 72 2e 20 20 52 65 74 75 72 6e 20 74  ister.  Return t
1bc30 68 65 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62  he register numb
1bc40 65 72 20 77 68 65 72 65 20 74 68 65 20 72 65 73  er where the res
1bc50 75 6c 74 73 0a 2a 2a 20 61 72 65 20 73 74 6f 72  ults.** are stor
1bc60 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
1bc70 20 72 65 67 69 73 74 65 72 20 69 73 20 61 20 74   register is a t
1bc80 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74 65  emporary registe
1bc90 72 20 74 68 61 74 20 63 61 6e 20 62 65 20 64 65  r that can be de
1bca0 61 6c 6c 6f 63 61 74 65 64 2c 0a 2a 2a 20 74 68  allocated,.** th
1bcb0 65 6e 20 77 72 69 74 65 20 69 74 73 20 6e 75 6d  en write its num
1bcc0 62 65 72 20 69 6e 74 6f 20 2a 70 52 65 67 2e 20  ber into *pReg. 
1bcd0 20 49 66 20 74 68 65 20 72 65 73 75 6c 74 20 72   If the result r
1bce0 65 67 69 73 74 65 72 20 69 73 20 6e 6f 74 0a 2a  egister is not.*
1bcf0 2a 20 61 20 74 65 6d 70 6f 72 61 72 79 2c 20 74  * a temporary, t
1bd00 68 65 6e 20 73 65 74 20 2a 70 52 65 67 20 74 6f  hen set *pReg to
1bd10 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   zero..**.** If 
1bd20 70 45 78 70 72 20 69 73 20 61 20 63 6f 6e 73 74  pExpr is a const
1bd30 61 6e 74 2c 20 74 68 65 6e 20 74 68 69 73 20 72  ant, then this r
1bd40 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 67 65 6e  outine might gen
1bd50 65 72 61 74 65 20 74 68 69 73 0a 2a 2a 20 63 6f  erate this.** co
1bd60 64 65 20 74 6f 20 66 69 6c 6c 20 74 68 65 20 72  de to fill the r
1bd70 65 67 69 73 74 65 72 20 69 6e 20 74 68 65 20 69  egister in the i
1bd80 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 73 65  nitialization se
1bd90 63 74 69 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a 20  ction of the.** 
1bda0 56 44 42 45 20 70 72 6f 67 72 61 6d 2c 20 69 6e  VDBE program, in
1bdb0 20 6f 72 64 65 72 20 74 6f 20 66 61 63 74 6f 72   order to factor
1bdc0 20 69 74 20 6f 75 74 20 6f 66 20 74 68 65 20 65   it out of the e
1bdd0 76 61 6c 75 61 74 69 6f 6e 20 6c 6f 6f 70 2e 0a  valuation loop..
1bde0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
1bdf0 70 72 43 6f 64 65 54 65 6d 70 28 50 61 72 73 65  prCodeTemp(Parse
1be00 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
1be10 70 45 78 70 72 2c 20 69 6e 74 20 2a 70 52 65 67  pExpr, int *pReg
1be20 29 7b 0a 20 20 69 6e 74 20 72 32 3b 0a 20 20 70  ){.  int r2;.  p
1be30 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78  Expr = sqlite3Ex
1be40 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 45  prSkipCollate(pE
1be50 78 70 72 29 3b 0a 20 20 69 66 28 20 43 6f 6e 73  xpr);.  if( Cons
1be60 74 46 61 63 74 6f 72 4f 6b 28 70 50 61 72 73 65  tFactorOk(pParse
1be70 29 0a 20 20 20 26 26 20 70 45 78 70 72 2d 3e 6f  ).   && pExpr->o
1be80 70 21 3d 54 4b 5f 52 45 47 49 53 54 45 52 0a 20  p!=TK_REGISTER. 
1be90 20 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72    && sqlite3Expr
1bea0 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69  IsConstantNotJoi
1beb0 6e 28 70 45 78 70 72 29 0a 20 20 29 7b 0a 20 20  n(pExpr).  ){.  
1bec0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 20 3d 20    ExprList *p = 
1bed0 70 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74 45 78  pParse->pConstEx
1bee0 70 72 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20  pr;.    int i;. 
1bef0 20 20 20 2a 70 52 65 67 20 20 3d 20 30 3b 0a 20     *pReg  = 0;. 
1bf00 20 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20     if( p ){.    
1bf10 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
1bf20 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
1bf30 20 20 20 20 20 66 6f 72 28 70 49 74 65 6d 3d 70       for(pItem=p
1bf40 2d 3e 61 2c 20 69 3d 70 2d 3e 6e 45 78 70 72 3b  ->a, i=p->nExpr;
1bf50 20 69 3e 30 3b 20 70 49 74 65 6d 2b 2b 2c 20 69   i>0; pItem++, i
1bf60 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  --){.        if(
1bf70 20 70 49 74 65 6d 2d 3e 72 65 75 73 61 62 6c 65   pItem->reusable
1bf80 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 43   && sqlite3ExprC
1bf90 6f 6d 70 61 72 65 28 70 49 74 65 6d 2d 3e 70 45  ompare(pItem->pE
1bfa0 78 70 72 2c 70 45 78 70 72 2c 2d 31 29 3d 3d 30  xpr,pExpr,-1)==0
1bfb0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
1bfc0 74 75 72 6e 20 70 49 74 65 6d 2d 3e 75 2e 69 43  turn pItem->u.iC
1bfd0 6f 6e 73 74 45 78 70 72 52 65 67 3b 0a 20 20 20  onstExprReg;.   
1bfe0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
1bff0 20 20 20 7d 0a 20 20 20 20 72 32 20 3d 20 2b 2b     }.    r2 = ++
1c000 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
1c010 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
1c020 65 41 74 49 6e 69 74 28 70 50 61 72 73 65 2c 20  eAtInit(pParse, 
1c030 70 45 78 70 72 2c 20 72 32 2c 20 31 29 3b 0a 20  pExpr, r2, 1);. 
1c040 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
1c050 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r1 = sqlite3GetT
1c060 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
1c070 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33      r2 = sqlite3
1c080 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70  ExprCodeTarget(p
1c090 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 72 31  Parse, pExpr, r1
1c0a0 29 3b 0a 20 20 20 20 69 66 28 20 72 32 3d 3d 72  );.    if( r2==r
1c0b0 31 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 67  1 ){.      *pReg
1c0c0 20 3d 20 72 31 3b 0a 20 20 20 20 7d 65 6c 73 65   = r1;.    }else
1c0d0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  {.      sqlite3R
1c0e0 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
1c0f0 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20  arse, r1);.     
1c100 20 2a 70 52 65 67 20 3d 20 30 3b 0a 20 20 20 20   *pReg = 0;.    
1c110 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
1c120 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  2;.}../*.** Gene
1c130 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77  rate code that w
1c140 69 6c 6c 20 65 76 61 6c 75 61 74 65 20 65 78 70  ill evaluate exp
1c150 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20 61 6e  ression pExpr an
1c160 64 20 73 74 6f 72 65 20 74 68 65 0a 2a 2a 20 72  d store the.** r
1c170 65 73 75 6c 74 73 20 69 6e 20 72 65 67 69 73 74  esults in regist
1c180 65 72 20 74 61 72 67 65 74 2e 20 20 54 68 65 20  er target.  The 
1c190 72 65 73 75 6c 74 73 20 61 72 65 20 67 75 61 72  results are guar
1c1a0 61 6e 74 65 65 64 20 74 6f 20 61 70 70 65 61 72  anteed to appear
1c1b0 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74 65 72 20  .** in register 
1c1c0 74 61 72 67 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20  target..*/.void 
1c1d0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
1c1e0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
1c1f0 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20  xpr *pExpr, int 
1c200 74 61 72 67 65 74 29 7b 0a 20 20 69 6e 74 20 69  target){.  int i
1c210 6e 52 65 67 3b 0a 0a 20 20 61 73 73 65 72 74 28  nReg;..  assert(
1c220 20 74 61 72 67 65 74 3e 30 20 26 26 20 74 61 72   target>0 && tar
1c230 67 65 74 3c 3d 70 50 61 72 73 65 2d 3e 6e 4d 65  get<=pParse->nMe
1c240 6d 20 29 3b 0a 20 20 69 66 28 20 70 45 78 70 72  m );.  if( pExpr
1c250 20 26 26 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54   && pExpr->op==T
1c260 4b 5f 52 45 47 49 53 54 45 52 20 29 7b 0a 20 20  K_REGISTER ){.  
1c270 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1c280 4f 70 32 28 70 50 61 72 73 65 2d 3e 70 56 64 62  Op2(pParse->pVdb
1c290 65 2c 20 4f 50 5f 43 6f 70 79 2c 20 70 45 78 70  e, OP_Copy, pExp
1c2a0 72 2d 3e 69 54 61 62 6c 65 2c 20 74 61 72 67 65  r->iTable, targe
1c2b0 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  t);.  }else{.   
1c2c0 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33   inReg = sqlite3
1c2d0 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70  ExprCodeTarget(p
1c2e0 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61  Parse, pExpr, ta
1c2f0 72 67 65 74 29 3b 0a 20 20 20 20 61 73 73 65 72  rget);.    asser
1c300 74 28 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65  t( pParse->pVdbe
1c310 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e   || pParse->db->
1c320 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
1c330 20 20 20 20 69 66 28 20 69 6e 52 65 67 21 3d 74      if( inReg!=t
1c340 61 72 67 65 74 20 26 26 20 70 50 61 72 73 65 2d  arget && pParse-
1c350 3e 70 56 64 62 65 20 29 7b 0a 20 20 20 20 20 20  >pVdbe ){.      
1c360 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1c370 32 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c  2(pParse->pVdbe,
1c380 20 4f 50 5f 53 43 6f 70 79 2c 20 69 6e 52 65 67   OP_SCopy, inReg
1c390 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 7d  , target);.    }
1c3a0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  .  }.}../*.** Ge
1c3b0 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
1c3c0 20 77 69 6c 6c 20 65 76 61 6c 75 61 74 65 20 65   will evaluate e
1c3d0 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20  xpression pExpr 
1c3e0 61 6e 64 20 73 74 6f 72 65 20 74 68 65 0a 2a 2a  and store the.**
1c3f0 20 72 65 73 75 6c 74 73 20 69 6e 20 72 65 67 69   results in regi
1c400 73 74 65 72 20 74 61 72 67 65 74 2e 20 20 54 68  ster target.  Th
1c410 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 67 75  e results are gu
1c420 61 72 61 6e 74 65 65 64 20 74 6f 20 61 70 70 65  aranteed to appe
1c430 61 72 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74 65  ar.** in registe
1c440 72 20 74 61 72 67 65 74 2e 20 20 49 66 20 74 68  r target.  If th
1c450 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
1c460 63 6f 6e 73 74 61 6e 74 2c 20 74 68 65 6e 20 74  constant, then t
1c470 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 6d  his routine.** m
1c480 69 67 68 74 20 63 68 6f 6f 73 65 20 74 6f 20 63  ight choose to c
1c490 6f 64 65 20 74 68 65 20 65 78 70 72 65 73 73 69  ode the expressi
1c4a0 6f 6e 20 61 74 20 69 6e 69 74 69 61 6c 69 7a 61  on at initializa
1c4b0 74 69 6f 6e 20 74 69 6d 65 2e 0a 2a 2f 0a 76 6f  tion time..*/.vo
1c4c0 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  id sqlite3ExprCo
1c4d0 64 65 46 61 63 74 6f 72 61 62 6c 65 28 50 61 72  deFactorable(Par
1c4e0 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
1c4f0 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 74 61 72   *pExpr, int tar
1c500 67 65 74 29 7b 0a 20 20 69 66 28 20 70 50 61 72  get){.  if( pPar
1c510 73 65 2d 3e 6f 6b 43 6f 6e 73 74 46 61 63 74 6f  se->okConstFacto
1c520 72 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72  r && sqlite3Expr
1c530 49 73 43 6f 6e 73 74 61 6e 74 28 70 45 78 70 72  IsConstant(pExpr
1c540 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
1c550 45 78 70 72 43 6f 64 65 41 74 49 6e 69 74 28 70  ExprCodeAtInit(p
1c560 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61  Parse, pExpr, ta
1c570 72 67 65 74 2c 20 30 29 3b 0a 20 20 7d 65 6c 73  rget, 0);.  }els
1c580 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  e{.    sqlite3Ex
1c590 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
1c5a0 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20  Expr, target);. 
1c5b0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65   }.}../*.** Gene
1c5c0 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 65  rate code that e
1c5d0 76 61 6c 75 61 74 65 73 20 74 68 65 20 67 69 76  valuates the giv
1c5e0 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e  en expression an
1c5f0 64 20 70 75 74 73 20 74 68 65 20 72 65 73 75 6c  d puts the resul
1c600 74 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74 65 72  t.** in register
1c610 20 74 61 72 67 65 74 2e 0a 2a 2a 0a 2a 2a 20 41   target..**.** A
1c620 6c 73 6f 20 6d 61 6b 65 20 61 20 63 6f 70 79 20  lso make a copy 
1c630 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  of the expressio
1c640 6e 20 72 65 73 75 6c 74 73 20 69 6e 74 6f 20 61  n results into a
1c650 6e 6f 74 68 65 72 20 22 63 61 63 68 65 22 20 72  nother "cache" r
1c660 65 67 69 73 74 65 72 0a 2a 2a 20 61 6e 64 20 6d  egister.** and m
1c670 6f 64 69 66 79 20 74 68 65 20 65 78 70 72 65 73  odify the expres
1c680 73 69 6f 6e 20 73 6f 20 74 68 61 74 20 74 68 65  sion so that the
1c690 20 6e 65 78 74 20 74 69 6d 65 20 69 74 20 69 73   next time it is
1c6a0 20 65 76 61 6c 75 61 74 65 64 2c 0a 2a 2a 20 74   evaluated,.** t
1c6b0 68 65 20 72 65 73 75 6c 74 20 69 73 20 61 20 63  he result is a c
1c6c0 6f 70 79 20 6f 66 20 74 68 65 20 63 61 63 68 65  opy of the cache
1c6d0 20 72 65 67 69 73 74 65 72 2e 0a 2a 2a 0a 2a 2a   register..**.**
1c6e0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
1c6f0 20 75 73 65 64 20 66 6f 72 20 65 78 70 72 65 73   used for expres
1c700 73 69 6f 6e 73 20 74 68 61 74 20 61 72 65 20 75  sions that are u
1c710 73 65 64 20 6d 75 6c 74 69 70 6c 65 20 0a 2a 2a  sed multiple .**
1c720 20 74 69 6d 65 73 2e 20 20 54 68 65 79 20 61 72   times.  They ar
1c730 65 20 65 76 61 6c 75 61 74 65 64 20 6f 6e 63 65  e evaluated once
1c740 20 61 6e 64 20 74 68 65 20 72 65 73 75 6c 74 73   and the results
1c750 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
1c760 6f 6e 0a 2a 2a 20 61 72 65 20 72 65 75 73 65 64  on.** are reused
1c770 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1c780 33 45 78 70 72 43 6f 64 65 41 6e 64 43 61 63 68  3ExprCodeAndCach
1c790 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
1c7a0 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e   Expr *pExpr, in
1c7b0 74 20 74 61 72 67 65 74 29 7b 0a 20 20 56 64 62  t target){.  Vdb
1c7c0 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
1c7d0 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 4d 65 6d  Vdbe;.  int iMem
1c7e0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 74 61 72  ;..  assert( tar
1c7f0 67 65 74 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  get>0 );.  asser
1c800 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  t( pExpr->op!=TK
1c810 5f 52 45 47 49 53 54 45 52 20 29 3b 0a 20 20 73  _REGISTER );.  s
1c820 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
1c830 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61  Parse, pExpr, ta
1c840 72 67 65 74 29 3b 0a 20 20 69 4d 65 6d 20 3d 20  rget);.  iMem = 
1c850 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
1c860 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1c870 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20  Op2(v, OP_Copy, 
1c880 74 61 72 67 65 74 2c 20 69 4d 65 6d 29 3b 0a 20  target, iMem);. 
1c890 20 65 78 70 72 54 6f 52 65 67 69 73 74 65 72 28   exprToRegister(
1c8a0 70 45 78 70 72 2c 20 69 4d 65 6d 29 3b 0a 7d 0a  pExpr, iMem);.}.
1c8b0 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
1c8c0 63 6f 64 65 20 74 68 61 74 20 70 75 73 68 65 73  code that pushes
1c8d0 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 65 76   the value of ev
1c8e0 65 72 79 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74  ery element of t
1c8f0 68 65 20 67 69 76 65 6e 0a 2a 2a 20 65 78 70 72  he given.** expr
1c900 65 73 73 69 6f 6e 20 6c 69 73 74 20 69 6e 74 6f  ession list into
1c910 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20 72   a sequence of r
1c920 65 67 69 73 74 65 72 73 20 62 65 67 69 6e 6e 69  egisters beginni
1c930 6e 67 20 61 74 20 74 61 72 67 65 74 2e 0a 2a 2a  ng at target..**
1c940 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
1c950 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74  umber of element
1c960 73 20 65 76 61 6c 75 61 74 65 64 2e 0a 2a 2a 0a  s evaluated..**.
1c970 2a 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 45 43  ** The SQLITE_EC
1c980 45 4c 5f 44 55 50 20 66 6c 61 67 20 70 72 65 76  EL_DUP flag prev
1c990 65 6e 74 73 20 74 68 65 20 61 72 67 75 6d 65 6e  ents the argumen
1c9a0 74 73 20 66 72 6f 6d 20 62 65 69 6e 67 0a 2a 2a  ts from being.**
1c9b0 20 66 69 6c 6c 65 64 20 75 73 69 6e 67 20 4f 50   filled using OP
1c9c0 5f 53 43 6f 70 79 2e 20 20 4f 50 5f 43 6f 70 79  _SCopy.  OP_Copy
1c9d0 20 6d 75 73 74 20 62 65 20 75 73 65 64 20 69 6e   must be used in
1c9e0 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  stead..**.** The
1c9f0 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 46 41 43   SQLITE_ECEL_FAC
1ca00 54 4f 52 20 61 72 67 75 6d 65 6e 74 20 61 6c 6c  TOR argument all
1ca10 6f 77 73 20 63 6f 6e 73 74 61 6e 74 20 61 72 67  ows constant arg
1ca20 75 6d 65 6e 74 73 20 74 6f 20 62 65 0a 2a 2a 20  uments to be.** 
1ca30 66 61 63 74 6f 72 65 64 20 6f 75 74 20 69 6e 74  factored out int
1ca40 6f 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  o initialization
1ca50 20 63 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71   code..*/.int sq
1ca60 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70  lite3ExprCodeExp
1ca70 72 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20 2a  rList(.  Parse *
1ca80 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 50  pParse,     /* P
1ca90 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
1caa0 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  /.  ExprList *pL
1cab0 69 73 74 2c 20 20 20 2f 2a 20 54 68 65 20 65 78  ist,   /* The ex
1cac0 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 74 6f  pression list to
1cad0 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69   be coded */.  i
1cae0 6e 74 20 74 61 72 67 65 74 2c 20 20 20 20 20 20  nt target,      
1caf0 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 77 72    /* Where to wr
1cb00 69 74 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20  ite results */. 
1cb10 20 69 6e 74 20 73 72 63 52 65 67 2c 20 20 20 20   int srcReg,    
1cb20 20 20 20 20 2f 2a 20 53 6f 75 72 63 65 20 72 65      /* Source re
1cb30 67 69 73 74 65 72 73 20 69 66 20 53 51 4c 49 54  gisters if SQLIT
1cb40 45 5f 45 43 45 4c 5f 52 45 46 20 2a 2f 0a 20 20  E_ECEL_REF */.  
1cb50 75 38 20 66 6c 61 67 73 20 20 20 20 20 20 20 20  u8 flags        
1cb60 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 45 43 45     /* SQLITE_ECE
1cb70 4c 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a  L_* flags */.){.
1cb80 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
1cb90 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
1cba0 20 69 6e 74 20 69 2c 20 6a 2c 20 6e 3b 0a 20 20   int i, j, n;.  
1cbb0 75 38 20 63 6f 70 79 4f 70 20 3d 20 28 66 6c 61  u8 copyOp = (fla
1cbc0 67 73 20 26 20 53 51 4c 49 54 45 5f 45 43 45 4c  gs & SQLITE_ECEL
1cbd0 5f 44 55 50 29 20 3f 20 4f 50 5f 43 6f 70 79 20  _DUP) ? OP_Copy 
1cbe0 3a 20 4f 50 5f 53 43 6f 70 79 3b 0a 20 20 56 64  : OP_SCopy;.  Vd
1cbf0 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
1cc00 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72 74 28  pVdbe;.  assert(
1cc10 20 70 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 61   pList!=0 );.  a
1cc20 73 73 65 72 74 28 20 74 61 72 67 65 74 3e 30 20  ssert( target>0 
1cc30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
1cc40 72 73 65 2d 3e 70 56 64 62 65 21 3d 30 20 29 3b  rse->pVdbe!=0 );
1cc50 20 20 2f 2a 20 4e 65 76 65 72 20 67 65 74 73 20    /* Never gets 
1cc60 74 68 69 73 20 66 61 72 20 6f 74 68 65 72 77 69  this far otherwi
1cc70 73 65 20 2a 2f 0a 20 20 6e 20 3d 20 70 4c 69 73  se */.  n = pLis
1cc80 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 69 66 28 20  t->nExpr;.  if( 
1cc90 21 43 6f 6e 73 74 46 61 63 74 6f 72 4f 6b 28 70  !ConstFactorOk(p
1cca0 50 61 72 73 65 29 20 29 20 66 6c 61 67 73 20 26  Parse) ) flags &
1ccb0 3d 20 7e 53 51 4c 49 54 45 5f 45 43 45 4c 5f 46  = ~SQLITE_ECEL_F
1ccc0 41 43 54 4f 52 3b 0a 20 20 66 6f 72 28 70 49 74  ACTOR;.  for(pIt
1ccd0 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30  em=pList->a, i=0
1cce0 3b 20 69 3c 6e 3b 20 69 2b 2b 2c 20 70 49 74 65  ; i<n; i++, pIte
1ccf0 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  m++){.    Expr *
1cd00 70 45 78 70 72 20 3d 20 70 49 74 65 6d 2d 3e 70  pExpr = pItem->p
1cd10 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 28 66  Expr;.    if( (f
1cd20 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 45 43  lags & SQLITE_EC
1cd30 45 4c 5f 52 45 46 29 21 3d 30 20 26 26 20 28 6a  EL_REF)!=0 && (j
1cd40 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 75   = pList->a[i].u
1cd50 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 29 3e  .x.iOrderByCol)>
1cd60 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
1cd70 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1cd80 63 6f 70 79 4f 70 2c 20 6a 2b 73 72 63 52 65 67  copyOp, j+srcReg
1cd90 2d 31 2c 20 74 61 72 67 65 74 2b 69 29 3b 0a 20  -1, target+i);. 
1cda0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 66 6c     }else if( (fl
1cdb0 61 67 73 20 26 20 53 51 4c 49 54 45 5f 45 43 45  ags & SQLITE_ECE
1cdc0 4c 5f 46 41 43 54 4f 52 29 21 3d 30 20 26 26 20  L_FACTOR)!=0 && 
1cdd0 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
1cde0 73 74 61 6e 74 28 70 45 78 70 72 29 20 29 7b 0a  stant(pExpr) ){.
1cdf0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1ce00 72 43 6f 64 65 41 74 49 6e 69 74 28 70 50 61 72  rCodeAtInit(pPar
1ce10 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65  se, pExpr, targe
1ce20 74 2b 69 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c  t+i, 0);.    }el
1ce30 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 6e  se{.      int in
1ce40 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Reg = sqlite3Exp
1ce50 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72  rCodeTarget(pPar
1ce60 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65  se, pExpr, targe
1ce70 74 2b 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20  t+i);.      if( 
1ce80 69 6e 52 65 67 21 3d 74 61 72 67 65 74 2b 69 20  inReg!=target+i 
1ce90 29 7b 0a 20 20 20 20 20 20 20 20 56 64 62 65 4f  ){.        VdbeO
1cea0 70 20 2a 70 4f 70 3b 0a 20 20 20 20 20 20 20 20  p *pOp;.        
1ceb0 69 66 28 20 63 6f 70 79 4f 70 3d 3d 4f 50 5f 43  if( copyOp==OP_C
1cec0 6f 70 79 0a 20 20 20 20 20 20 20 20 20 26 26 20  opy.         && 
1ced0 28 70 4f 70 3d 73 71 6c 69 74 65 33 56 64 62 65  (pOp=sqlite3Vdbe
1cee0 47 65 74 4f 70 28 76 2c 20 2d 31 29 29 2d 3e 6f  GetOp(v, -1))->o
1cef0 70 63 6f 64 65 3d 3d 4f 50 5f 43 6f 70 79 0a 20  pcode==OP_Copy. 
1cf00 20 20 20 20 20 20 20 20 26 26 20 70 4f 70 2d 3e          && pOp->
1cf10 70 31 2b 70 4f 70 2d 3e 70 33 2b 31 3d 3d 69 6e  p1+pOp->p3+1==in
1cf20 52 65 67 0a 20 20 20 20 20 20 20 20 20 26 26 20  Reg.         && 
1cf30 70 4f 70 2d 3e 70 32 2b 70 4f 70 2d 3e 70 33 2b  pOp->p2+pOp->p3+
1cf40 31 3d 3d 74 61 72 67 65 74 2b 69 0a 20 20 20 20  1==target+i.    
1cf50 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
1cf60 20 70 4f 70 2d 3e 70 33 2b 2b 3b 0a 20 20 20 20   pOp->p3++;.    
1cf70 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1cf80 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1cf90 41 64 64 4f 70 32 28 76 2c 20 63 6f 70 79 4f 70  AddOp2(v, copyOp
1cfa0 2c 20 69 6e 52 65 67 2c 20 74 61 72 67 65 74 2b  , inReg, target+
1cfb0 69 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  i);.        }.  
1cfc0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1cfd0 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f    return n;.}../
1cfe0 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
1cff0 64 65 20 66 6f 72 20 61 20 42 45 54 57 45 45 4e  de for a BETWEEN
1d000 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a   operator..**.**
1d010 20 20 20 20 78 20 42 45 54 57 45 45 4e 20 79 20      x BETWEEN y 
1d020 41 4e 44 20 7a 0a 2a 2a 0a 2a 2a 20 54 68 65 20  AND z.**.** The 
1d030 61 62 6f 76 65 20 69 73 20 65 71 75 69 76 61 6c  above is equival
1d040 65 6e 74 20 74 6f 20 0a 2a 2a 0a 2a 2a 20 20 20  ent to .**.**   
1d050 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 0a 2a   x>=y AND x<=z.*
1d060 2a 0a 2a 2a 20 43 6f 64 65 20 69 74 20 61 73 20  *.** Code it as 
1d070 73 75 63 68 2c 20 74 61 6b 69 6e 67 20 63 61 72  such, taking car
1d080 65 20 74 6f 20 64 6f 20 74 68 65 20 63 6f 6d 6d  e to do the comm
1d090 6f 6e 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  on subexpression
1d0a0 0a 2a 2a 20 65 6c 69 6d 69 6e 61 74 69 6f 6e 20  .** elimination 
1d0b0 6f 66 20 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  of x..*/.static 
1d0c0 76 6f 69 64 20 65 78 70 72 43 6f 64 65 42 65 74  void exprCodeBet
1d0d0 77 65 65 6e 28 0a 20 20 50 61 72 73 65 20 2a 70  ween(.  Parse *p
1d0e0 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72  Parse,    /* Par
1d0f0 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65  sing and code ge
1d100 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74  nerating context
1d110 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70   */.  Expr *pExp
1d120 72 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 42  r,      /* The B
1d130 45 54 57 45 45 4e 20 65 78 70 72 65 73 73 69 6f  ETWEEN expressio
1d140 6e 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 2c  n */.  int dest,
1d150 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70           /* Jump
1d160 20 68 65 72 65 20 69 66 20 74 68 65 20 6a 75 6d   here if the jum
1d170 70 20 69 73 20 74 61 6b 65 6e 20 2a 2f 0a 20 20  p is taken */.  
1d180 69 6e 74 20 6a 75 6d 70 49 66 54 72 75 65 2c 20  int jumpIfTrue, 
1d190 20 20 2f 2a 20 54 61 6b 65 20 74 68 65 20 6a 75    /* Take the ju
1d1a0 6d 70 20 69 66 20 74 68 65 20 42 45 54 57 45 45  mp if the BETWEE
1d1b0 4e 20 69 73 20 74 72 75 65 20 2a 2f 0a 20 20 69  N is true */.  i
1d1c0 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 20 20  nt jumpIfNull   
1d1d0 20 2f 2a 20 54 61 6b 65 20 74 68 65 20 6a 75 6d   /* Take the jum
1d1e0 70 20 69 66 20 74 68 65 20 42 45 54 57 45 45 4e  p if the BETWEEN
1d1f0 20 69 73 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20   is NULL */.){. 
1d200 20 45 78 70 72 20 65 78 70 72 41 6e 64 3b 20 20   Expr exprAnd;  
1d210 20 20 20 2f 2a 20 54 68 65 20 41 4e 44 20 6f 70     /* The AND op
1d220 65 72 61 74 6f 72 20 69 6e 20 20 78 3e 3d 79 20  erator in  x>=y 
1d230 41 4e 44 20 78 3c 3d 7a 20 20 2a 2f 0a 20 20 45  AND x<=z  */.  E
1d240 78 70 72 20 63 6f 6d 70 4c 65 66 74 3b 20 20 20  xpr compLeft;   
1d250 20 2f 2a 20 54 68 65 20 20 78 3e 3d 79 20 20 74   /* The  x>=y  t
1d260 65 72 6d 20 2a 2f 0a 20 20 45 78 70 72 20 63 6f  erm */.  Expr co
1d270 6d 70 52 69 67 68 74 3b 20 20 20 2f 2a 20 54 68  mpRight;   /* Th
1d280 65 20 20 78 3c 3d 7a 20 20 74 65 72 6d 20 2a 2f  e  x<=z  term */
1d290 0a 20 20 45 78 70 72 20 65 78 70 72 58 3b 20 20  .  Expr exprX;  
1d2a0 20 20 20 20 20 2f 2a 20 54 68 65 20 20 78 20 20       /* The  x  
1d2b0 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f  subexpression */
1d2c0 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65 31 20  .  int regFree1 
1d2d0 3d 20 30 3b 20 2f 2a 20 54 65 6d 70 6f 72 61 72  = 0; /* Temporar
1d2e0 79 20 75 73 65 20 72 65 67 69 73 74 65 72 20 2a  y use register *
1d2f0 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 21 45 78  /..  assert( !Ex
1d300 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
1d310 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  xpr, EP_xIsSelec
1d320 74 29 20 29 3b 0a 20 20 65 78 70 72 58 20 3d 20  t) );.  exprX = 
1d330 2a 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20  *pExpr->pLeft;. 
1d340 20 65 78 70 72 41 6e 64 2e 6f 70 20 3d 20 54 4b   exprAnd.op = TK
1d350 5f 41 4e 44 3b 0a 20 20 65 78 70 72 41 6e 64 2e  _AND;.  exprAnd.
1d360 70 4c 65 66 74 20 3d 20 26 63 6f 6d 70 4c 65 66  pLeft = &compLef
1d370 74 3b 0a 20 20 65 78 70 72 41 6e 64 2e 70 52 69  t;.  exprAnd.pRi
1d380 67 68 74 20 3d 20 26 63 6f 6d 70 52 69 67 68 74  ght = &compRight
1d390 3b 0a 20 20 63 6f 6d 70 4c 65 66 74 2e 6f 70 20  ;.  compLeft.op 
1d3a0 3d 20 54 4b 5f 47 45 3b 0a 20 20 63 6f 6d 70 4c  = TK_GE;.  compL
1d3b0 65 66 74 2e 70 4c 65 66 74 20 3d 20 26 65 78 70  eft.pLeft = &exp
1d3c0 72 58 3b 0a 20 20 63 6f 6d 70 4c 65 66 74 2e 70  rX;.  compLeft.p
1d3d0 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 78  Right = pExpr->x
1d3e0 2e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  .pList->a[0].pEx
1d3f0 70 72 3b 0a 20 20 63 6f 6d 70 52 69 67 68 74 2e  pr;.  compRight.
1d400 6f 70 20 3d 20 54 4b 5f 4c 45 3b 0a 20 20 63 6f  op = TK_LE;.  co
1d410 6d 70 52 69 67 68 74 2e 70 4c 65 66 74 20 3d 20  mpRight.pLeft = 
1d420 26 65 78 70 72 58 3b 0a 20 20 63 6f 6d 70 52 69  &exprX;.  compRi
1d430 67 68 74 2e 70 52 69 67 68 74 20 3d 20 70 45 78  ght.pRight = pEx
1d440 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 31  pr->x.pList->a[1
1d450 5d 2e 70 45 78 70 72 3b 0a 20 20 65 78 70 72 54  ].pExpr;.  exprT
1d460 6f 52 65 67 69 73 74 65 72 28 26 65 78 70 72 58  oRegister(&exprX
1d470 2c 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  , sqlite3ExprCod
1d480 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 26 65  eTemp(pParse, &e
1d490 78 70 72 58 2c 20 26 72 65 67 46 72 65 65 31 29  xprX, &regFree1)
1d4a0 29 3b 0a 20 20 69 66 28 20 6a 75 6d 70 49 66 54  );.  if( jumpIfT
1d4b0 72 75 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  rue ){.    sqlit
1d4c0 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61  e3ExprIfTrue(pPa
1d4d0 72 73 65 2c 20 26 65 78 70 72 41 6e 64 2c 20 64  rse, &exprAnd, d
1d4e0 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
1d4f0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
1d500 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
1d510 65 28 70 50 61 72 73 65 2c 20 26 65 78 70 72 41  e(pParse, &exprA
1d520 6e 64 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  nd, dest, jumpIf
1d530 4e 75 6c 6c 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  Null);.  }.  sql
1d540 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
1d550 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72  eg(pParse, regFr
1d560 65 65 31 29 3b 0a 0a 20 20 2f 2a 20 45 6e 73 75  ee1);..  /* Ensu
1d570 72 65 20 61 64 65 71 75 61 74 65 20 74 65 73 74  re adequate test
1d580 20 63 6f 76 65 72 61 67 65 20 2a 2f 0a 20 20 74   coverage */.  t
1d590 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 54  estcase( jumpIfT
1d5a0 72 75 65 3d 3d 30 20 26 26 20 6a 75 6d 70 49 66  rue==0 && jumpIf
1d5b0 4e 75 6c 6c 3d 3d 30 20 26 26 20 72 65 67 46 72  Null==0 && regFr
1d5c0 65 65 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74  ee1==0 );.  test
1d5d0 63 61 73 65 28 20 6a 75 6d 70 49 66 54 72 75 65  case( jumpIfTrue
1d5e0 3d 3d 30 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c  ==0 && jumpIfNul
1d5f0 6c 3d 3d 30 20 26 26 20 72 65 67 46 72 65 65 31  l==0 && regFree1
1d600 21 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73  !=0 );.  testcas
1d610 65 28 20 6a 75 6d 70 49 66 54 72 75 65 3d 3d 30  e( jumpIfTrue==0
1d620 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d   && jumpIfNull!=
1d630 30 20 26 26 20 72 65 67 46 72 65 65 31 3d 3d 30  0 && regFree1==0
1d640 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
1d650 6a 75 6d 70 49 66 54 72 75 65 3d 3d 30 20 26 26  jumpIfTrue==0 &&
1d660 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 20 26   jumpIfNull!=0 &
1d670 26 20 72 65 67 46 72 65 65 31 21 3d 30 20 29 3b  & regFree1!=0 );
1d680 0a 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d  .  testcase( jum
1d690 70 49 66 54 72 75 65 21 3d 30 20 26 26 20 6a 75  pIfTrue!=0 && ju
1d6a0 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26 20 72  mpIfNull==0 && r
1d6b0 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
1d6c0 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
1d6d0 54 72 75 65 21 3d 30 20 26 26 20 6a 75 6d 70 49  True!=0 && jumpI
1d6e0 66 4e 75 6c 6c 3d 3d 30 20 26 26 20 72 65 67 46  fNull==0 && regF
1d6f0 72 65 65 31 21 3d 30 20 29 3b 0a 20 20 74 65 73  ree1!=0 );.  tes
1d700 74 63 61 73 65 28 20 6a 75 6d 70 49 66 54 72 75  tcase( jumpIfTru
1d710 65 21 3d 30 20 26 26 20 6a 75 6d 70 49 66 4e 75  e!=0 && jumpIfNu
1d720 6c 6c 21 3d 30 20 26 26 20 72 65 67 46 72 65 65  ll!=0 && regFree
1d730 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61  1==0 );.  testca
1d740 73 65 28 20 6a 75 6d 70 49 66 54 72 75 65 21 3d  se( jumpIfTrue!=
1d750 30 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21  0 && jumpIfNull!
1d760 3d 30 20 26 26 20 72 65 67 46 72 65 65 31 21 3d  =0 && regFree1!=
1d770 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  0 );.}../*.** Ge
1d780 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
1d790 61 20 62 6f 6f 6c 65 61 6e 20 65 78 70 72 65 73  a boolean expres
1d7a0 73 69 6f 6e 20 73 75 63 68 20 74 68 61 74 20 61  sion such that a
1d7b0 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 0a 2a 2a   jump is made.**
1d7c0 20 74 6f 20 74 68 65 20 6c 61 62 65 6c 20 22 64   to the label "d
1d7d0 65 73 74 22 20 69 66 20 74 68 65 20 65 78 70 72  est" if the expr
1d7e0 65 73 73 69 6f 6e 20 69 73 20 74 72 75 65 20 62  ession is true b
1d7f0 75 74 20 65 78 65 63 75 74 69 6f 6e 0a 2a 2a 20  ut execution.** 
1d800 63 6f 6e 74 69 6e 75 65 73 20 73 74 72 61 69 67  continues straig
1d810 68 74 20 74 68 72 75 20 69 66 20 74 68 65 20 65  ht thru if the e
1d820 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66 61 6c  xpression is fal
1d830 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  se..**.** If the
1d840 20 65 78 70 72 65 73 73 69 6f 6e 20 65 76 61 6c   expression eval
1d850 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c 20 28 6e  uates to NULL (n
1d860 65 69 74 68 65 72 20 74 72 75 65 20 6e 6f 72 20  either true nor 
1d870 66 61 6c 73 65 29 2c 20 74 68 65 6e 0a 2a 2a 20  false), then.** 
1d880 74 61 6b 65 20 74 68 65 20 6a 75 6d 70 20 69 66  take the jump if
1d890 20 74 68 65 20 6a 75 6d 70 49 66 4e 75 6c 6c 20   the jumpIfNull 
1d8a0 66 6c 61 67 20 69 73 20 53 51 4c 49 54 45 5f 4a  flag is SQLITE_J
1d8b0 55 4d 50 49 46 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  UMPIFNULL..**.**
1d8c0 20 54 68 69 73 20 63 6f 64 65 20 64 65 70 65 6e   This code depen
1d8d0 64 73 20 6f 6e 20 74 68 65 20 66 61 63 74 20 74  ds on the fact t
1d8e0 68 61 74 20 63 65 72 74 61 69 6e 20 74 6f 6b 65  hat certain toke
1d8f0 6e 20 76 61 6c 75 65 73 20 28 65 78 3a 20 54 4b  n values (ex: TK
1d900 5f 45 51 29 0a 2a 2a 20 61 72 65 20 74 68 65 20  _EQ).** are the 
1d910 73 61 6d 65 20 61 73 20 6f 70 63 6f 64 65 20 76  same as opcode v
1d920 61 6c 75 65 73 20 28 65 78 3a 20 4f 50 5f 45 71  alues (ex: OP_Eq
1d930 29 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74  ) that implement
1d940 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
1d950 6e 67 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 2e  ng.** operation.
1d960 20 20 53 70 65 63 69 61 6c 20 63 6f 6d 6d 65 6e    Special commen
1d970 74 73 20 69 6e 20 76 64 62 65 2e 63 20 61 6e 64  ts in vdbe.c and
1d980 20 74 68 65 20 6d 6b 6f 70 63 6f 64 65 68 2e 61   the mkopcodeh.a
1d990 77 6b 20 73 63 72 69 70 74 20 69 6e 0a 2a 2a 20  wk script in.** 
1d9a0 74 68 65 20 6d 61 6b 65 20 70 72 6f 63 65 73 73  the make process
1d9b0 20 63 61 75 73 65 20 74 68 65 73 65 20 76 61 6c   cause these val
1d9c0 75 65 73 20 74 6f 20 61 6c 69 67 6e 2e 20 20 41  ues to align.  A
1d9d0 73 73 65 72 74 28 29 73 20 69 6e 20 74 68 65 20  ssert()s in the 
1d9e0 63 6f 64 65 0a 2a 2a 20 62 65 6c 6f 77 20 76 65  code.** below ve
1d9f0 72 69 66 79 20 74 68 61 74 20 74 68 65 20 6e 75  rify that the nu
1da00 6d 62 65 72 73 20 61 72 65 20 61 6c 69 67 6e 65  mbers are aligne
1da10 64 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a  d correctly..*/.
1da20 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
1da30 49 66 54 72 75 65 28 50 61 72 73 65 20 2a 70 50  IfTrue(Parse *pP
1da40 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
1da50 72 2c 20 69 6e 74 20 64 65 73 74 2c 20 69 6e 74  r, int dest, int
1da60 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20   jumpIfNull){.  
1da70 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
1da80 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 6f  ->pVdbe;.  int o
1da90 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 67  p = 0;.  int reg
1daa0 46 72 65 65 31 20 3d 20 30 3b 0a 20 20 69 6e 74  Free1 = 0;.  int
1dab0 20 72 65 67 46 72 65 65 32 20 3d 20 30 3b 0a 20   regFree2 = 0;. 
1dac0 20 69 6e 74 20 72 31 2c 20 72 32 3b 0a 0a 20 20   int r1, r2;..  
1dad0 61 73 73 65 72 74 28 20 6a 75 6d 70 49 66 4e 75  assert( jumpIfNu
1dae0 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4a 55 4d 50 49  ll==SQLITE_JUMPI
1daf0 46 4e 55 4c 4c 20 7c 7c 20 6a 75 6d 70 49 66 4e  FNULL || jumpIfN
1db00 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  ull==0 );.  if( 
1db10 4e 45 56 45 52 28 76 3d 3d 30 29 20 29 20 20 20  NEVER(v==0) )   
1db20 20 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 45 78    return;  /* Ex
1db30 69 73 74 65 6e 63 65 20 6f 66 20 56 44 42 45 20  istence of VDBE 
1db40 63 68 65 63 6b 65 64 20 62 79 20 63 61 6c 6c 65  checked by calle
1db50 72 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52  r */.  if( NEVER
1db60 28 70 45 78 70 72 3d 3d 30 29 20 29 20 72 65 74  (pExpr==0) ) ret
1db70 75 72 6e 3b 20 20 2f 2a 20 4e 6f 20 77 61 79 20  urn;  /* No way 
1db80 74 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e 20  this can happen 
1db90 2a 2f 0a 20 20 6f 70 20 3d 20 70 45 78 70 72 2d  */.  op = pExpr-
1dba0 3e 6f 70 3b 0a 20 20 73 77 69 74 63 68 28 20 6f  >op;.  switch( o
1dbb0 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
1dbc0 5f 41 4e 44 3a 20 7b 0a 20 20 20 20 20 20 69 6e  _AND: {.      in
1dbd0 74 20 64 32 20 3d 20 73 71 6c 69 74 65 33 56 64  t d2 = sqlite3Vd
1dbe0 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
1dbf0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1dc00 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
1dc10 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1dc20 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
1dc30 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
1dc40 64 32 2c 6a 75 6d 70 49 66 4e 75 6c 6c 5e 53 51  d2,jumpIfNull^SQ
1dc50 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29  LITE_JUMPIFNULL)
1dc60 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1dc70 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61  xprCachePush(pPa
1dc80 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  rse);.      sqli
1dc90 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50  te3ExprIfTrue(pP
1dca0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69  arse, pExpr->pRi
1dcb0 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49  ght, dest, jumpI
1dcc0 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71  fNull);.      sq
1dcd0 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
1dce0 4c 61 62 65 6c 28 76 2c 20 64 32 29 3b 0a 20 20  Label(v, d2);.  
1dcf0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
1dd00 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b  achePop(pParse);
1dd10 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1dd20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
1dd30 4f 52 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74  OR: {.      test
1dd40 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  case( jumpIfNull
1dd50 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ==0 );.      sql
1dd60 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70  ite3ExprIfTrue(p
1dd70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
1dd80 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49  eft, dest, jumpI
1dd90 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71  fNull);.      sq
1dda0 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75  lite3ExprCachePu
1ddb0 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  sh(pParse);.    
1ddc0 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54    sqlite3ExprIfT
1ddd0 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  rue(pParse, pExp
1dde0 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c  r->pRight, dest,
1ddf0 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
1de00 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
1de10 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b  achePop(pParse);
1de20 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1de30 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
1de40 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 74 65 73  NOT: {.      tes
1de50 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c  tcase( jumpIfNul
1de60 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71  l==0 );.      sq
1de70 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
1de80 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
1de90 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d  pLeft, dest, jum
1dea0 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
1deb0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1dec0 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20   case TK_LT:.   
1ded0 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20   case TK_LE:.   
1dee0 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20   case TK_GT:.   
1def0 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20   case TK_GE:.   
1df00 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20   case TK_NE:.   
1df10 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20   case TK_EQ: {. 
1df20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
1df30 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
1df40 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
1df50 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
1df60 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
1df70 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b  eft, &regFree1);
1df80 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69  .      r2 = sqli
1df90 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
1dfa0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
1dfb0 52 69 67 68 74 2c 20 26 72 65 67 46 72 65 65 32  Right, &regFree2
1dfc0 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d  );.      codeCom
1dfd0 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 45 78  pare(pParse, pEx
1dfe0 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72  pr->pLeft, pExpr
1dff0 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20  ->pRight, op,.  
1e000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e010 72 31 2c 20 72 32 2c 20 64 65 73 74 2c 20 6a 75  r1, r2, dest, ju
1e020 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
1e030 20 61 73 73 65 72 74 28 54 4b 5f 4c 54 3d 3d 4f   assert(TK_LT==O
1e040 50 5f 4c 74 29 3b 20 74 65 73 74 63 61 73 65 28  P_Lt); testcase(
1e050 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 20 56 64 62 65  op==OP_Lt); Vdbe
1e060 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d  CoverageIf(v,op=
1e070 3d 4f 50 5f 4c 74 29 3b 0a 20 20 20 20 20 20 61  =OP_Lt);.      a
1e080 73 73 65 72 74 28 54 4b 5f 4c 45 3d 3d 4f 50 5f  ssert(TK_LE==OP_
1e090 4c 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70  Le); testcase(op
1e0a0 3d 3d 4f 50 5f 4c 65 29 3b 20 56 64 62 65 43 6f  ==OP_Le); VdbeCo
1e0b0 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f  verageIf(v,op==O
1e0c0 50 5f 4c 65 29 3b 0a 20 20 20 20 20 20 61 73 73  P_Le);.      ass
1e0d0 65 72 74 28 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74  ert(TK_GT==OP_Gt
1e0e0 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d  ); testcase(op==
1e0f0 4f 50 5f 47 74 29 3b 20 56 64 62 65 43 6f 76 65  OP_Gt); VdbeCove
1e100 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f  rageIf(v,op==OP_
1e110 47 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Gt);.      asser
1e120 74 28 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65 29 3b  t(TK_GE==OP_Ge);
1e130 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50   testcase(op==OP
1e140 5f 47 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61  _Ge); VdbeCovera
1e150 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 65  geIf(v,op==OP_Ge
1e160 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1e170 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71 29 3b 20 74  TK_EQ==OP_Eq); t
1e180 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 45  estcase(op==OP_E
1e190 71 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  q); VdbeCoverage
1e1a0 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 45 71 29 3b  If(v,op==OP_Eq);
1e1b0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b  .      assert(TK
1e1c0 5f 4e 45 3d 3d 4f 50 5f 4e 65 29 3b 20 74 65 73  _NE==OP_Ne); tes
1e1d0 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4e 65 29  tcase(op==OP_Ne)
1e1e0 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66  ; VdbeCoverageIf
1e1f0 28 76 2c 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 0a 20  (v,op==OP_Ne);. 
1e200 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
1e210 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
1e220 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
1e230 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20  gFree2==0 );.   
1e240 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1e250 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 3a 0a      case TK_IS:.
1e260 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f      case TK_ISNO
1e270 54 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63  T: {.      testc
1e280 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 20 29  ase( op==TK_IS )
1e290 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1e2a0 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29  ( op==TK_ISNOT )
1e2b0 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  ;.      r1 = sql
1e2c0 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
1e2d0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
1e2e0 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31  pLeft, &regFree1
1e2f0 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71  );.      r2 = sq
1e300 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
1e310 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
1e320 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46 72 65  >pRight, &regFre
1e330 65 32 29 3b 0a 20 20 20 20 20 20 6f 70 20 3d 20  e2);.      op = 
1e340 28 6f 70 3d 3d 54 4b 5f 49 53 29 20 3f 20 54 4b  (op==TK_IS) ? TK
1e350 5f 45 51 20 3a 20 54 4b 5f 4e 45 3b 0a 20 20 20  _EQ : TK_NE;.   
1e360 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70     codeCompare(p
1e370 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
1e380 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  eft, pExpr->pRig
1e390 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20 20  ht, op,.        
1e3a0 20 20 20 20 20 20 20 20 20 20 72 31 2c 20 72 32            r1, r2
1e3b0 2c 20 64 65 73 74 2c 20 53 51 4c 49 54 45 5f 4e  , dest, SQLITE_N
1e3c0 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 56 64  ULLEQ);.      Vd
1e3d0 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
1e3e0 6f 70 3d 3d 54 4b 5f 45 51 29 3b 0a 20 20 20 20  op==TK_EQ);.    
1e3f0 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
1e400 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4e 45 29 3b 0a  (v, op==TK_NE);.
1e410 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1e420 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
1e430 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
1e440 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20  egFree2==0 );.  
1e450 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1e460 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e  .    case TK_ISN
1e470 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  ULL:.    case TK
1e480 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20  _NOTNULL: {.    
1e490 20 20 61 73 73 65 72 74 28 20 54 4b 5f 49 53 4e    assert( TK_ISN
1e4a0 55 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29  ULL==OP_IsNull )
1e4b0 3b 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70  ;   testcase( op
1e4c0 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20  ==TK_ISNULL );. 
1e4d0 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
1e4e0 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e  NOTNULL==OP_NotN
1e4f0 75 6c 6c 20 29 3b 20 74 65 73 74 63 61 73 65 28  ull ); testcase(
1e500 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20   op==TK_NOTNULL 
1e510 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71  );.      r1 = sq
1e520 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
1e530 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
1e540 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65  >pLeft, &regFree
1e550 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
1e560 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 6f  3VdbeAddOp2(v, o
1e570 70 2c 20 72 31 2c 20 64 65 73 74 29 3b 0a 20 20  p, r1, dest);.  
1e580 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
1e590 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 49 53 4e  If(v, op==TK_ISN
1e5a0 55 4c 4c 29 3b 0a 20 20 20 20 20 20 56 64 62 65  ULL);.      Vdbe
1e5b0 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70  CoverageIf(v, op
1e5c0 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a 20  ==TK_NOTNULL);. 
1e5d0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
1e5e0 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
1e5f0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1e600 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54  .    case TK_BET
1e610 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 74 65  WEEN: {.      te
1e620 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75  stcase( jumpIfNu
1e630 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 65  ll==0 );.      e
1e640 78 70 72 43 6f 64 65 42 65 74 77 65 65 6e 28 70  xprCodeBetween(p
1e650 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64 65  Parse, pExpr, de
1e660 73 74 2c 20 31 2c 20 6a 75 6d 70 49 66 4e 75 6c  st, 1, jumpIfNul
1e670 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  l);.      break;
1e680 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
1e690 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
1e6a0 45 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ERY.    case TK_
1e6b0 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  IN: {.      int 
1e6c0 64 65 73 74 49 66 46 61 6c 73 65 20 3d 20 73 71  destIfFalse = sq
1e6d0 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
1e6e0 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 6e 74  el(v);.      int
1e6f0 20 64 65 73 74 49 66 4e 75 6c 6c 20 3d 20 6a 75   destIfNull = ju
1e700 6d 70 49 66 4e 75 6c 6c 20 3f 20 64 65 73 74 20  mpIfNull ? dest 
1e710 3a 20 64 65 73 74 49 66 46 61 6c 73 65 3b 0a 20  : destIfFalse;. 
1e720 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1e730 43 6f 64 65 49 4e 28 70 50 61 72 73 65 2c 20 70  CodeIN(pParse, p
1e740 45 78 70 72 2c 20 64 65 73 74 49 66 46 61 6c 73  Expr, destIfFals
1e750 65 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a  e, destIfNull);.
1e760 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1e770 65 47 6f 74 6f 28 76 2c 20 64 65 73 74 29 3b 0a  eGoto(v, dest);.
1e780 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1e790 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
1e7a0 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 20   destIfFalse);. 
1e7b0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1e7c0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 64 65 66  }.#endif.    def
1e7d0 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 69 66  ault: {.      if
1e7e0 28 20 65 78 70 72 41 6c 77 61 79 73 54 72 75 65  ( exprAlwaysTrue
1e7f0 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20  (pExpr) ){.     
1e800 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f     sqlite3VdbeGo
1e810 74 6f 28 76 2c 20 64 65 73 74 29 3b 0a 20 20 20  to(v, dest);.   
1e820 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 78 70     }else if( exp
1e830 72 41 6c 77 61 79 73 46 61 6c 73 65 28 70 45 78  rAlwaysFalse(pEx
1e840 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  pr) ){.        /
1e850 2a 20 4e 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20 20  * No-op */.     
1e860 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1e870 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
1e880 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
1e890 20 70 45 78 70 72 2c 20 26 72 65 67 46 72 65 65   pExpr, &regFree
1e8a0 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  1);.        sqli
1e8b0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
1e8c0 20 4f 50 5f 49 66 2c 20 72 31 2c 20 64 65 73 74   OP_If, r1, dest
1e8d0 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 29  , jumpIfNull!=0)
1e8e0 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
1e8f0 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
1e900 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
1e910 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
1e920 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75      testcase( ju
1e930 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
1e940 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
1e950 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
1e960 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
1e970 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
1e980 67 46 72 65 65 31 29 3b 0a 20 20 73 71 6c 69 74  gFree1);.  sqlit
1e990 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
1e9a0 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65  (pParse, regFree
1e9b0 32 29 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  2);  .}../*.** G
1e9c0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
1e9d0 20 61 20 62 6f 6f 6c 65 61 6e 20 65 78 70 72 65   a boolean expre
1e9e0 73 73 69 6f 6e 20 73 75 63 68 20 74 68 61 74 20  ssion such that 
1e9f0 61 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 0a 2a  a jump is made.*
1ea00 2a 20 74 6f 20 74 68 65 20 6c 61 62 65 6c 20 22  * to the label "
1ea10 64 65 73 74 22 20 69 66 20 74 68 65 20 65 78 70  dest" if the exp
1ea20 72 65 73 73 69 6f 6e 20 69 73 20 66 61 6c 73 65  ression is false
1ea30 20 62 75 74 20 65 78 65 63 75 74 69 6f 6e 0a 2a   but execution.*
1ea40 2a 20 63 6f 6e 74 69 6e 75 65 73 20 73 74 72 61  * continues stra
1ea50 69 67 68 74 20 74 68 72 75 20 69 66 20 74 68 65  ight thru if the
1ea60 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74   expression is t
1ea70 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  rue..**.** If th
1ea80 65 20 65 78 70 72 65 73 73 69 6f 6e 20 65 76 61  e expression eva
1ea90 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c 20 28  luates to NULL (
1eaa0 6e 65 69 74 68 65 72 20 74 72 75 65 20 6e 6f 72  neither true nor
1eab0 20 66 61 6c 73 65 29 20 74 68 65 6e 0a 2a 2a 20   false) then.** 
1eac0 6a 75 6d 70 20 69 66 20 6a 75 6d 70 49 66 4e 75  jump if jumpIfNu
1ead0 6c 6c 20 69 73 20 53 51 4c 49 54 45 5f 4a 55 4d  ll is SQLITE_JUM
1eae0 50 49 46 4e 55 4c 4c 20 6f 72 20 66 61 6c 6c 20  PIFNULL or fall 
1eaf0 74 68 72 6f 75 67 68 20 69 66 20 6a 75 6d 70 49  through if jumpI
1eb00 66 4e 75 6c 6c 0a 2a 2a 20 69 73 20 30 2e 0a 2a  fNull.** is 0..*
1eb10 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
1eb20 70 72 49 66 46 61 6c 73 65 28 50 61 72 73 65 20  prIfFalse(Parse 
1eb30 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
1eb40 45 78 70 72 2c 20 69 6e 74 20 64 65 73 74 2c 20  Expr, int dest, 
1eb50 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b  int jumpIfNull){
1eb60 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
1eb70 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
1eb80 74 20 6f 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20  t op = 0;.  int 
1eb90 72 65 67 46 72 65 65 31 20 3d 20 30 3b 0a 20 20  regFree1 = 0;.  
1eba0 69 6e 74 20 72 65 67 46 72 65 65 32 20 3d 20 30  int regFree2 = 0
1ebb0 3b 0a 20 20 69 6e 74 20 72 31 2c 20 72 32 3b 0a  ;.  int r1, r2;.
1ebc0 0a 20 20 61 73 73 65 72 74 28 20 6a 75 6d 70 49  .  assert( jumpI
1ebd0 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4a 55  fNull==SQLITE_JU
1ebe0 4d 50 49 46 4e 55 4c 4c 20 7c 7c 20 6a 75 6d 70  MPIFNULL || jump
1ebf0 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 69  IfNull==0 );.  i
1ec00 66 28 20 4e 45 56 45 52 28 76 3d 3d 30 29 20 29  f( NEVER(v==0) )
1ec10 20 72 65 74 75 72 6e 3b 20 2f 2a 20 45 78 69 73   return; /* Exis
1ec20 74 65 6e 63 65 20 6f 66 20 56 44 42 45 20 63 68  tence of VDBE ch
1ec30 65 63 6b 65 64 20 62 79 20 63 61 6c 6c 65 72 20  ecked by caller 
1ec40 2a 2f 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d  */.  if( pExpr==
1ec50 30 20 29 20 20 20 20 72 65 74 75 72 6e 3b 0a 0a  0 )    return;..
1ec60 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 6f    /* The value o
1ec70 66 20 70 45 78 70 72 2d 3e 6f 70 20 61 6e 64 20  f pExpr->op and 
1ec80 6f 70 20 61 72 65 20 72 65 6c 61 74 65 64 20 61  op are related a
1ec90 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a  s follows:.  **.
1eca0 20 20 2a 2a 20 20 20 20 20 20 20 70 45 78 70 72    **       pExpr
1ecb0 2d 3e 6f 70 20 20 20 20 20 20 20 20 20 20 20 20  ->op            
1ecc0 6f 70 0a 20 20 2a 2a 20 20 20 20 20 20 20 2d 2d  op.  **       --
1ecd0 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 20 20 20 20  -------         
1ece0 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 20 2a 2a   ----------.  **
1ecf0 20 20 20 20 20 20 20 54 4b 5f 49 53 4e 55 4c 4c         TK_ISNULL
1ed00 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4e 6f 74            OP_Not
1ed10 4e 75 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 20 20  Null.  **       
1ed20 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 20 20 20 20 20  TK_NOTNULL      
1ed30 20 20 20 4f 50 5f 49 73 4e 75 6c 6c 0a 20 20 2a     OP_IsNull.  *
1ed40 2a 20 20 20 20 20 20 20 54 4b 5f 4e 45 20 20 20  *       TK_NE   
1ed50 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 45 71             OP_Eq
1ed60 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 45  .  **       TK_E
1ed70 51 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f  Q              O
1ed80 50 5f 4e 65 0a 20 20 2a 2a 20 20 20 20 20 20 20  P_Ne.  **       
1ed90 54 4b 5f 47 54 20 20 20 20 20 20 20 20 20 20 20  TK_GT           
1eda0 20 20 20 4f 50 5f 4c 65 0a 20 20 2a 2a 20 20 20     OP_Le.  **   
1edb0 20 20 20 20 54 4b 5f 4c 45 20 20 20 20 20 20 20      TK_LE       
1edc0 20 20 20 20 20 20 20 4f 50 5f 47 74 0a 20 20 2a         OP_Gt.  *
1edd0 2a 20 20 20 20 20 20 20 54 4b 5f 47 45 20 20 20  *       TK_GE   
1ede0 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4c 74             OP_Lt
1edf0 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4c  .  **       TK_L
1ee00 54 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f  T              O
1ee10 50 5f 47 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46  P_Ge.  **.  ** F
1ee20 6f 72 20 6f 74 68 65 72 20 76 61 6c 75 65 73 20  or other values 
1ee30 6f 66 20 70 45 78 70 72 2d 3e 6f 70 2c 20 6f 70  of pExpr->op, op
1ee40 20 69 73 20 75 6e 64 65 66 69 6e 65 64 20 61 6e   is undefined an
1ee50 64 20 75 6e 75 73 65 64 2e 0a 20 20 2a 2a 20 54  d unused..  ** T
1ee60 68 65 20 76 61 6c 75 65 20 6f 66 20 54 4b 5f 20  he value of TK_ 
1ee70 61 6e 64 20 4f 50 5f 20 63 6f 6e 73 74 61 6e 74  and OP_ constant
1ee80 73 20 61 72 65 20 61 72 72 61 6e 67 65 64 20 73  s are arranged s
1ee90 75 63 68 20 74 68 61 74 20 77 65 0a 20 20 2a 2a  uch that we.  **
1eea0 20 63 61 6e 20 63 6f 6d 70 75 74 65 20 74 68 65   can compute the
1eeb0 20 6d 61 70 70 69 6e 67 20 61 62 6f 76 65 20 75   mapping above u
1eec0 73 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69  sing the followi
1eed0 6e 67 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 20  ng expression.. 
1eee0 20 2a 2a 20 41 73 73 65 72 74 28 29 73 20 76 65   ** Assert()s ve
1eef0 72 69 66 79 20 74 68 61 74 20 74 68 65 20 63 6f  rify that the co
1ef00 6d 70 75 74 61 74 69 6f 6e 20 69 73 20 63 6f 72  mputation is cor
1ef10 72 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 6f 70 20  rect..  */.  op 
1ef20 3d 20 28 28 70 45 78 70 72 2d 3e 6f 70 2b 28 54  = ((pExpr->op+(T
1ef30 4b 5f 49 53 4e 55 4c 4c 26 31 29 29 5e 31 29 2d  K_ISNULL&1))^1)-
1ef40 28 54 4b 5f 49 53 4e 55 4c 4c 26 31 29 3b 0a 0a  (TK_ISNULL&1);..
1ef50 20 20 2f 2a 20 56 65 72 69 66 79 20 63 6f 72 72    /* Verify corr
1ef60 65 63 74 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66  ect alignment of
1ef70 20 54 4b 5f 20 61 6e 64 20 4f 50 5f 20 63 6f 6e   TK_ and OP_ con
1ef80 73 74 61 6e 74 73 0a 20 20 2a 2f 0a 20 20 61 73  stants.  */.  as
1ef90 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21  sert( pExpr->op!
1efa0 3d 54 4b 5f 49 53 4e 55 4c 4c 20 7c 7c 20 6f 70  =TK_ISNULL || op
1efb0 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 0a  ==OP_NotNull );.
1efc0 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
1efd0 3e 6f 70 21 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20  >op!=TK_NOTNULL 
1efe0 7c 7c 20 6f 70 3d 3d 4f 50 5f 49 73 4e 75 6c 6c  || op==OP_IsNull
1eff0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
1f000 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 45 20 7c  xpr->op!=TK_NE |
1f010 7c 20 6f 70 3d 3d 4f 50 5f 45 71 20 29 3b 0a 20  | op==OP_Eq );. 
1f020 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
1f030 6f 70 21 3d 54 4b 5f 45 51 20 7c 7c 20 6f 70 3d  op!=TK_EQ || op=
1f040 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20 61 73 73 65  =OP_Ne );.  asse
1f050 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  rt( pExpr->op!=T
1f060 4b 5f 4c 54 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47  K_LT || op==OP_G
1f070 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
1f080 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4c 45 20  Expr->op!=TK_LE 
1f090 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 74 20 29 3b 0a  || op==OP_Gt );.
1f0a0 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
1f0b0 3e 6f 70 21 3d 54 4b 5f 47 54 20 7c 7c 20 6f 70  >op!=TK_GT || op
1f0c0 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20 61 73 73  ==OP_Le );.  ass
1f0d0 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d  ert( pExpr->op!=
1f0e0 54 4b 5f 47 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f  TK_GE || op==OP_
1f0f0 4c 74 20 29 3b 0a 0a 20 20 73 77 69 74 63 68 28  Lt );..  switch(
1f100 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20   pExpr->op ){.  
1f110 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20 7b    case TK_AND: {
1f120 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1f130 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
1f140 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1f150 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
1f160 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
1f170 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
1f180 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  l);.      sqlite
1f190 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70  3ExprCachePush(p
1f1a0 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71  Parse);.      sq
1f1b0 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
1f1c0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
1f1d0 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75  pRight, dest, ju
1f1e0 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
1f1f0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
1f200 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20  ePop(pParse);.  
1f210 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1f220 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a  .    case TK_OR:
1f230 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 32 20   {.      int d2 
1f240 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
1f250 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
1f260 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
1f270 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  fNull==0 );.    
1f280 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54    sqlite3ExprIfT
1f290 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  rue(pParse, pExp
1f2a0 72 2d 3e 70 4c 65 66 74 2c 20 64 32 2c 20 6a 75  r->pLeft, d2, ju
1f2b0 6d 70 49 66 4e 75 6c 6c 5e 53 51 4c 49 54 45 5f  mpIfNull^SQLITE_
1f2c0 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20  JUMPIFNULL);.   
1f2d0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
1f2e0 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b  chePush(pParse);
1f2f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1f300 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
1f310 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
1f320 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
1f330 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  l);.      sqlite
1f340 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
1f350 6c 28 76 2c 20 64 32 29 3b 0a 20 20 20 20 20 20  l(v, d2);.      
1f360 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
1f370 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Pop(pParse);.   
1f380 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1f390 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a      case TK_NOT:
1f3a0 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   {.      testcas
1f3b0 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  e( jumpIfNull==0
1f3c0 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
1f3d0 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72  3ExprIfTrue(pPar
1f3e0 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
1f3f0 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
1f400 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ll);.      break
1f410 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1f420 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65   TK_LT:.    case
1f430 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65   TK_LE:.    case
1f440 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65   TK_GT:.    case
1f450 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65   TK_GE:.    case
1f460 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65   TK_NE:.    case
1f470 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20   TK_EQ: {.      
1f480 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
1f490 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Null==0 );.     
1f4a0 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r1 = sqlite3Exp
1f4b0 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
1f4c0 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
1f4d0 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20  &regFree1);.    
1f4e0 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78    r2 = sqlite3Ex
1f4f0 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
1f500 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  e, pExpr->pRight
1f510 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20  , &regFree2);.  
1f520 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28      codeCompare(
1f530 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
1f540 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69  Left, pExpr->pRi
1f550 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20  ght, op,.       
1f560 20 20 20 20 20 20 20 20 20 20 20 72 31 2c 20 72             r1, r
1f570 32 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  2, dest, jumpIfN
1f580 75 6c 6c 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ull);.      asse
1f590 72 74 28 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 29  rt(TK_LT==OP_Lt)
1f5a0 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f  ; testcase(op==O
1f5b0 50 5f 4c 74 29 3b 20 56 64 62 65 43 6f 76 65 72  P_Lt); VdbeCover
1f5c0 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c  ageIf(v,op==OP_L
1f5d0 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  t);.      assert
1f5e0 28 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 29 3b 20  (TK_LE==OP_Le); 
1f5f0 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
1f600 4c 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Le); VdbeCoverag
1f610 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 65 29  eIf(v,op==OP_Le)
1f620 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54  ;.      assert(T
1f630 4b 5f 47 54 3d 3d 4f 50 5f 47 74 29 3b 20 74 65  K_GT==OP_Gt); te
1f640 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 74  stcase(op==OP_Gt
1f650 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49  ); VdbeCoverageI
1f660 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 74 29 3b 0a  f(v,op==OP_Gt);.
1f670 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f        assert(TK_
1f680 47 45 3d 3d 4f 50 5f 47 65 29 3b 20 74 65 73 74  GE==OP_Ge); test
1f690 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 65 29 3b  case(op==OP_Ge);
1f6a0 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
1f6b0 76 2c 6f 70 3d 3d 4f 50 5f 47 65 29 3b 0a 20 20  v,op==OP_Ge);.  
1f6c0 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 45 51      assert(TK_EQ
1f6d0 3d 3d 4f 50 5f 45 71 29 3b 20 74 65 73 74 63 61  ==OP_Eq); testca
1f6e0 73 65 28 6f 70 3d 3d 4f 50 5f 45 71 29 3b 20 56  se(op==OP_Eq); V
1f6f0 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
1f700 6f 70 3d 3d 4f 50 5f 45 71 29 3b 0a 20 20 20 20  op==OP_Eq);.    
1f710 20 20 61 73 73 65 72 74 28 54 4b 5f 4e 45 3d 3d    assert(TK_NE==
1f720 4f 50 5f 4e 65 29 3b 20 74 65 73 74 63 61 73 65  OP_Ne); testcase
1f730 28 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 20 56 64 62  (op==OP_Ne); Vdb
1f740 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70  eCoverageIf(v,op
1f750 3d 3d 4f 50 5f 4e 65 29 3b 0a 20 20 20 20 20 20  ==OP_Ne);.      
1f760 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
1f770 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74  e1==0 );.      t
1f780 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
1f790 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72  2==0 );.      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 49 53 3a 0a 20 20 20 20 63  ase TK_IS:.    c
1f7c0 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 20 7b 0a  ase TK_ISNOT: {.
1f7d0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1f7e0 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53  pExpr->op==TK_IS
1f7f0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
1f800 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
1f810 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20 20 20 20 20  K_ISNOT );.     
1f820 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r1 = sqlite3Exp
1f830 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
1f840 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
1f850 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20  &regFree1);.    
1f860 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78    r2 = sqlite3Ex
1f870 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
1f880 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  e, pExpr->pRight
1f890 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20  , &regFree2);.  
1f8a0 20 20 20 20 6f 70 20 3d 20 28 70 45 78 70 72 2d      op = (pExpr-
1f8b0 3e 6f 70 3d 3d 54 4b 5f 49 53 29 20 3f 20 54 4b  >op==TK_IS) ? TK
1f8c0 5f 4e 45 20 3a 20 54 4b 5f 45 51 3b 0a 20 20 20  _NE : TK_EQ;.   
1f8d0 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70     codeCompare(p
1f8e0 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
1f8f0 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  eft, pExpr->pRig
1f900 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20 20  ht, op,.        
1f910 20 20 20 20 20 20 20 20 20 20 72 31 2c 20 72 32            r1, r2
1f920 2c 20 64 65 73 74 2c 20 53 51 4c 49 54 45 5f 4e  , dest, SQLITE_N
1f930 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 56 64  ULLEQ);.      Vd
1f940 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
1f950 6f 70 3d 3d 54 4b 5f 45 51 29 3b 0a 20 20 20 20  op==TK_EQ);.    
1f960 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
1f970 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4e 45 29 3b 0a  (v, op==TK_NE);.
1f980 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1f990 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
1f9a0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
1f9b0 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20  egFree2==0 );.  
1f9c0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1f9d0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e  .    case TK_ISN
1f9e0 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  ULL:.    case TK
1f9f0 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20  _NOTNULL: {.    
1fa00 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78    r1 = sqlite3Ex
1fa10 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
1fa20 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
1fa30 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20   &regFree1);.   
1fa40 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1fa50 64 4f 70 32 28 76 2c 20 6f 70 2c 20 72 31 2c 20  dOp2(v, op, r1, 
1fa60 64 65 73 74 29 3b 0a 20 20 20 20 20 20 74 65 73  dest);.      tes
1fa70 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53  tcase( op==TK_IS
1fa80 4e 55 4c 4c 20 29 3b 20 20 20 56 64 62 65 43 6f  NULL );   VdbeCo
1fa90 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
1faa0 54 4b 5f 49 53 4e 55 4c 4c 29 3b 0a 20 20 20 20  TK_ISNULL);.    
1fab0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1fac0 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 20 20 56  TK_NOTNULL );  V
1fad0 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
1fae0 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 29   op==TK_NOTNULL)
1faf0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1fb00 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  ( regFree1==0 );
1fb10 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1fb20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
1fb30 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20  BETWEEN: {.     
1fb40 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
1fb50 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  fNull==0 );.    
1fb60 20 20 65 78 70 72 43 6f 64 65 42 65 74 77 65 65    exprCodeBetwee
1fb70 6e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  n(pParse, pExpr,
1fb80 20 64 65 73 74 2c 20 30 2c 20 6a 75 6d 70 49 66   dest, 0, jumpIf
1fb90 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65  Null);.      bre
1fba0 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  ak;.    }.#ifnde
1fbb0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
1fbc0 42 51 55 45 52 59 0a 20 20 20 20 63 61 73 65 20  BQUERY.    case 
1fbd0 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69  TK_IN: {.      i
1fbe0 66 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 29 7b  f( jumpIfNull ){
1fbf0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1fc00 45 78 70 72 43 6f 64 65 49 4e 28 70 50 61 72 73  ExprCodeIN(pPars
1fc10 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74 2c 20  e, pExpr, dest, 
1fc20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c  dest);.      }el
1fc30 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  se{.        int 
1fc40 64 65 73 74 49 66 4e 75 6c 6c 20 3d 20 73 71 6c  destIfNull = sql
1fc50 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
1fc60 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71  l(v);.        sq
1fc70 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e 28  lite3ExprCodeIN(
1fc80 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64  pParse, pExpr, d
1fc90 65 73 74 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29  est, destIfNull)
1fca0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
1fcb0 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
1fcc0 6c 28 76 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29  l(v, destIfNull)
1fcd0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1fce0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
1fcf0 64 69 66 0a 20 20 20 20 64 65 66 61 75 6c 74 3a  dif.    default:
1fd00 20 7b 0a 20 20 20 20 20 20 69 66 28 20 65 78 70   {.      if( exp
1fd10 72 41 6c 77 61 79 73 46 61 6c 73 65 28 70 45 78  rAlwaysFalse(pEx
1fd20 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73  pr) ){.        s
1fd30 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76  qlite3VdbeGoto(v
1fd40 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 7d  , dest);.      }
1fd50 65 6c 73 65 20 69 66 28 20 65 78 70 72 41 6c 77  else if( exprAlw
1fd60 61 79 73 54 72 75 65 28 70 45 78 70 72 29 20 29  aysTrue(pExpr) )
1fd70 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 6e 6f 2d  {.        /* no-
1fd80 6f 70 20 2a 2f 0a 20 20 20 20 20 20 7d 65 6c 73  op */.      }els
1fd90 65 7b 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20  e{.        r1 = 
1fda0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
1fdb0 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
1fdc0 72 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20  r, &regFree1);. 
1fdd0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
1fde0 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
1fdf0 66 4e 6f 74 2c 20 72 31 2c 20 64 65 73 74 2c 20  fNot, r1, dest, 
1fe00 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 29 3b 0a  jumpIfNull!=0);.
1fe10 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
1fe20 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
1fe30 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
1fe40 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee1==0 );.      
1fe50 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
1fe60 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  IfNull==0 );.   
1fe70 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
1fe80 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
1fe90 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
1fea0 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46  Reg(pParse, regF
1feb0 72 65 65 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  ree1);.  sqlite3
1fec0 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
1fed0 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 32 29  Parse, regFree2)
1fee0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 69 6b 65 20  ;.}../*.** Like 
1fef0 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
1ff00 73 65 28 29 20 65 78 63 65 70 74 20 74 68 61 74  se() except that
1ff10 20 61 20 63 6f 70 79 20 69 73 20 6d 61 64 65 20   a copy is made 
1ff20 6f 66 20 70 45 78 70 72 20 62 65 66 6f 72 65 0a  of pExpr before.
1ff30 2a 2a 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69  ** code generati
1ff40 6f 6e 2c 20 61 6e 64 20 74 68 61 74 20 63 6f 70  on, and that cop
1ff50 79 20 69 73 20 64 65 6c 65 74 65 64 20 61 66 74  y is deleted aft
1ff60 65 72 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69  er code generati
1ff70 6f 6e 2e 20 54 68 69 73 0a 2a 2a 20 65 6e 73 75  on. This.** ensu
1ff80 72 65 73 20 74 68 61 74 20 74 68 65 20 6f 72 69  res that the ori
1ff90 67 69 6e 61 6c 20 70 45 78 70 72 20 69 73 20 75  ginal pExpr is u
1ffa0 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 76 6f 69  nchanged..*/.voi
1ffb0 64 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46  d sqlite3ExprIfF
1ffc0 61 6c 73 65 44 75 70 28 50 61 72 73 65 20 2a 70  alseDup(Parse *p
1ffd0 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
1ffe0 70 72 2c 20 69 6e 74 20 64 65 73 74 2c 69 6e 74  pr, int dest,int
1fff0 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20   jumpIfNull){.  
20000 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
20010 61 72 73 65 2d 3e 64 62 3b 0a 20 20 45 78 70 72  arse->db;.  Expr
20020 20 2a 70 43 6f 70 79 20 3d 20 73 71 6c 69 74 65   *pCopy = sqlite
20030 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 45 78  3ExprDup(db, pEx
20040 70 72 2c 20 30 29 3b 0a 20 20 69 66 28 20 64 62  pr, 0);.  if( db
20050 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d  ->mallocFailed==
20060 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
20070 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
20080 73 65 2c 20 70 43 6f 70 79 2c 20 64 65 73 74 2c  se, pCopy, dest,
20090 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
200a0 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  }.  sqlite3ExprD
200b0 65 6c 65 74 65 28 64 62 2c 20 70 43 6f 70 79 29  elete(db, pCopy)
200c0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 61  ;.}.../*.** Do a
200d0 20 64 65 65 70 20 63 6f 6d 70 61 72 69 73 6f 6e   deep comparison
200e0 20 6f 66 20 74 77 6f 20 65 78 70 72 65 73 73 69   of two expressi
200f0 6f 6e 20 74 72 65 65 73 2e 20 20 52 65 74 75 72  on trees.  Retur
20100 6e 20 30 20 69 66 20 74 68 65 20 74 77 6f 0a 2a  n 0 if the two.*
20110 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72  * expressions ar
20120 65 20 63 6f 6d 70 6c 65 74 65 6c 79 20 69 64 65  e completely ide
20130 6e 74 69 63 61 6c 2e 20 20 52 65 74 75 72 6e 20  ntical.  Return 
20140 31 20 69 66 20 74 68 65 79 20 64 69 66 66 65 72  1 if they differ
20150 20 6f 6e 6c 79 0a 2a 2a 20 62 79 20 61 20 43 4f   only.** by a CO
20160 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 20 61  LLATE operator a
20170 74 20 74 68 65 20 74 6f 70 20 6c 65 76 65 6c 2e  t the top level.
20180 20 20 52 65 74 75 72 6e 20 32 20 69 66 20 74 68    Return 2 if th
20190 65 72 65 20 61 72 65 20 64 69 66 66 65 72 65 6e  ere are differen
201a0 63 65 73 0a 2a 2a 20 6f 74 68 65 72 20 74 68 61  ces.** other tha
201b0 6e 20 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c 20  n the top-level 
201c0 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72  COLLATE operator
201d0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 20 73  ..**.** If any s
201e0 75 62 65 6c 65 6d 65 6e 74 20 6f 66 20 70 42 20  ubelement of pB 
201f0 68 61 73 20 45 78 70 72 2e 69 54 61 62 6c 65 3d  has Expr.iTable=
20200 3d 28 2d 31 29 20 74 68 65 6e 20 69 74 20 69 73  =(-1) then it is
20210 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 63   allowed.** to c
20220 6f 6d 70 61 72 65 20 65 71 75 61 6c 20 74 6f 20  ompare equal to 
20230 61 6e 20 65 71 75 69 76 61 6c 65 6e 74 20 65 6c  an equivalent el
20240 65 6d 65 6e 74 20 69 6e 20 70 41 20 77 69 74 68  ement in pA with
20250 20 45 78 70 72 2e 69 54 61 62 6c 65 3d 3d 69 54   Expr.iTable==iT
20260 61 62 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 41  ab..**.** The pA
20270 20 73 69 64 65 20 6d 69 67 68 74 20 62 65 20 75   side might be u
20280 73 69 6e 67 20 54 4b 5f 52 45 47 49 53 54 45 52  sing TK_REGISTER
20290 2e 20 20 49 66 20 74 68 61 74 20 69 73 20 74 68  .  If that is th
202a0 65 20 63 61 73 65 20 61 6e 64 20 70 42 20 69 73  e case and pB is
202b0 0a 2a 2a 20 6e 6f 74 20 75 73 69 6e 67 20 54 4b  .** not using TK
202c0 5f 52 45 47 49 53 54 45 52 20 62 75 74 20 69 73  _REGISTER but is
202d0 20 6f 74 68 65 72 77 69 73 65 20 65 71 75 69 76   otherwise equiv
202e0 61 6c 65 6e 74 2c 20 74 68 65 6e 20 73 74 69 6c  alent, then stil
202f0 6c 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2a 0a 2a  l return 0..**.*
20300 2a 20 53 6f 6d 65 74 69 6d 65 73 20 74 68 69 73  * Sometimes this
20310 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65   routine will re
20320 74 75 72 6e 20 32 20 65 76 65 6e 20 69 66 20 74  turn 2 even if t
20330 68 65 20 74 77 6f 20 65 78 70 72 65 73 73 69 6f  he two expressio
20340 6e 73 0a 2a 2a 20 72 65 61 6c 6c 79 20 61 72 65  ns.** really are
20350 20 65 71 75 69 76 61 6c 65 6e 74 2e 20 20 49 66   equivalent.  If
20360 20 77 65 20 63 61 6e 6e 6f 74 20 70 72 6f 76 65   we cannot prove
20370 20 74 68 61 74 20 74 68 65 20 65 78 70 72 65 73   that the expres
20380 73 69 6f 6e 73 20 61 72 65 0a 2a 2a 20 69 64 65  sions are.** ide
20390 6e 74 69 63 61 6c 2c 20 77 65 20 72 65 74 75 72  ntical, we retur
203a0 6e 20 32 20 6a 75 73 74 20 74 6f 20 62 65 20 73  n 2 just to be s
203b0 61 66 65 2e 20 20 53 6f 20 69 66 20 74 68 69 73  afe.  So if this
203c0 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75   routine.** retu
203d0 72 6e 73 20 32 2c 20 74 68 65 6e 20 79 6f 75 20  rns 2, then you 
203e0 64 6f 20 6e 6f 74 20 72 65 61 6c 6c 79 20 6b 6e  do not really kn
203f0 6f 77 20 66 6f 72 20 63 65 72 74 61 69 6e 20 69  ow for certain i
20400 66 20 74 68 65 20 74 77 6f 0a 2a 2a 20 65 78 70  f the two.** exp
20410 72 65 73 73 69 6f 6e 73 20 61 72 65 20 74 68 65  ressions are the
20420 20 73 61 6d 65 2e 20 20 42 75 74 20 69 66 20 79   same.  But if y
20430 6f 75 20 67 65 74 20 61 20 30 20 6f 72 20 31 20  ou get a 0 or 1 
20440 72 65 74 75 72 6e 2c 20 74 68 65 6e 20 79 6f 75  return, then you
20450 0a 2a 2a 20 63 61 6e 20 62 65 20 73 75 72 65 20  .** can be sure 
20460 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20  the expressions 
20470 61 72 65 20 74 68 65 20 73 61 6d 65 2e 20 20 49  are the same.  I
20480 6e 20 74 68 65 20 70 6c 61 63 65 73 20 77 68 65  n the places whe
20490 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  re.** this routi
204a0 6e 65 20 69 73 20 75 73 65 64 2c 20 69 74 20 64  ne is used, it d
204b0 6f 65 73 20 6e 6f 74 20 68 75 72 74 20 74 6f 20  oes not hurt to 
204c0 67 65 74 20 61 6e 20 65 78 74 72 61 20 32 20 2d  get an extra 2 -
204d0 20 74 68 61 74 0a 2a 2a 20 6a 75 73 74 20 6d 69   that.** just mi
204e0 67 68 74 20 72 65 73 75 6c 74 20 69 6e 20 73 6f  ght result in so
204f0 6d 65 20 73 6c 69 67 68 74 6c 79 20 73 6c 6f 77  me slightly slow
20500 65 72 20 63 6f 64 65 2e 20 20 42 75 74 20 72 65  er code.  But re
20510 74 75 72 6e 69 6e 67 0a 2a 2a 20 61 6e 20 69 6e  turning.** an in
20520 63 6f 72 72 65 63 74 20 30 20 6f 72 20 31 20 63  correct 0 or 1 c
20530 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20 61 20 6d  ould lead to a m
20540 61 6c 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69  alfunction..*/.i
20550 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  nt sqlite3ExprCo
20560 6d 70 61 72 65 28 45 78 70 72 20 2a 70 41 2c 20  mpare(Expr *pA, 
20570 45 78 70 72 20 2a 70 42 2c 20 69 6e 74 20 69 54  Expr *pB, int iT
20580 61 62 29 7b 0a 20 20 75 33 32 20 63 6f 6d 62 69  ab){.  u32 combi
20590 6e 65 64 46 6c 61 67 73 3b 0a 20 20 69 66 28 20  nedFlags;.  if( 
205a0 70 41 3d 3d 30 20 7c 7c 20 70 42 3d 3d 30 20 29  pA==0 || pB==0 )
205b0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 42 3d  {.    return pB=
205c0 3d 70 41 20 3f 20 30 20 3a 20 32 3b 0a 20 20 7d  =pA ? 0 : 2;.  }
205d0 0a 20 20 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73  .  combinedFlags
205e0 20 3d 20 70 41 2d 3e 66 6c 61 67 73 20 7c 20 70   = pA->flags | p
205f0 42 2d 3e 66 6c 61 67 73 3b 0a 20 20 69 66 28 20  B->flags;.  if( 
20600 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20 26 20  combinedFlags & 
20610 45 50 5f 49 6e 74 56 61 6c 75 65 20 29 7b 0a 20  EP_IntValue ){. 
20620 20 20 20 69 66 28 20 28 70 41 2d 3e 66 6c 61 67     if( (pA->flag
20630 73 26 70 42 2d 3e 66 6c 61 67 73 26 45 50 5f 49  s&pB->flags&EP_I
20640 6e 74 56 61 6c 75 65 29 21 3d 30 20 26 26 20 70  ntValue)!=0 && p
20650 41 2d 3e 75 2e 69 56 61 6c 75 65 3d 3d 70 42 2d  A->u.iValue==pB-
20660 3e 75 2e 69 56 61 6c 75 65 20 29 7b 0a 20 20 20  >u.iValue ){.   
20670 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
20680 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 32 3b   }.    return 2;
20690 0a 20 20 7d 0a 20 20 69 66 28 20 70 41 2d 3e 6f  .  }.  if( pA->o
206a0 70 21 3d 70 42 2d 3e 6f 70 20 29 7b 0a 20 20 20  p!=pB->op ){.   
206b0 20 69 66 28 20 70 41 2d 3e 6f 70 3d 3d 54 4b 5f   if( pA->op==TK_
206c0 43 4f 4c 4c 41 54 45 20 26 26 20 73 71 6c 69 74  COLLATE && sqlit
206d0 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 41  e3ExprCompare(pA
206e0 2d 3e 70 4c 65 66 74 2c 20 70 42 2c 20 69 54 61  ->pLeft, pB, iTa
206f0 62 29 3c 32 20 29 7b 0a 20 20 20 20 20 20 72 65  b)<2 ){.      re
20700 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
20710 20 20 69 66 28 20 70 42 2d 3e 6f 70 3d 3d 54 4b    if( pB->op==TK
20720 5f 43 4f 4c 4c 41 54 45 20 26 26 20 73 71 6c 69  _COLLATE && sqli
20730 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70  te3ExprCompare(p
20740 41 2c 20 70 42 2d 3e 70 4c 65 66 74 2c 20 69 54  A, pB->pLeft, iT
20750 61 62 29 3c 32 20 29 7b 0a 20 20 20 20 20 20 72  ab)<2 ){.      r
20760 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
20770 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 7d     return 2;.  }
20780 0a 20 20 69 66 28 20 70 41 2d 3e 6f 70 21 3d 54  .  if( pA->op!=T
20790 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 41 4c 57 41  K_COLUMN && ALWA
207a0 59 53 28 70 41 2d 3e 6f 70 21 3d 54 4b 5f 41 47  YS(pA->op!=TK_AG
207b0 47 5f 43 4f 4c 55 4d 4e 29 20 26 26 20 70 41 2d  G_COLUMN) && pA-
207c0 3e 75 2e 7a 54 6f 6b 65 6e 20 29 7b 0a 20 20 20  >u.zToken ){.   
207d0 20 69 66 28 20 70 41 2d 3e 6f 70 3d 3d 54 4b 5f   if( pA->op==TK_
207e0 46 55 4e 43 54 49 4f 4e 20 29 7b 0a 20 20 20 20  FUNCTION ){.    
207f0 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
20800 49 43 6d 70 28 70 41 2d 3e 75 2e 7a 54 6f 6b 65  ICmp(pA->u.zToke
20810 6e 2c 70 42 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 21  n,pB->u.zToken)!
20820 3d 30 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20  =0 ) return 2;. 
20830 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
20840 63 6d 70 28 70 41 2d 3e 75 2e 7a 54 6f 6b 65 6e  cmp(pA->u.zToken
20850 2c 70 42 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 21 3d  ,pB->u.zToken)!=
20860 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  0 ){.      retur
20870 6e 20 70 41 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  n pA->op==TK_COL
20880 4c 41 54 45 20 3f 20 31 20 3a 20 32 3b 0a 20 20  LATE ? 1 : 2;.  
20890 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 28 70    }.  }.  if( (p
208a0 41 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 44 69  A->flags & EP_Di
208b0 73 74 69 6e 63 74 29 21 3d 28 70 42 2d 3e 66 6c  stinct)!=(pB->fl
208c0 61 67 73 20 26 20 45 50 5f 44 69 73 74 69 6e 63  ags & EP_Distinc
208d0 74 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20  t) ) return 2;. 
208e0 20 69 66 28 20 41 4c 57 41 59 53 28 28 63 6f 6d   if( ALWAYS((com
208f0 62 69 6e 65 64 46 6c 61 67 73 20 26 20 45 50 5f  binedFlags & EP_
20900 54 6f 6b 65 6e 4f 6e 6c 79 29 3d 3d 30 29 20 29  TokenOnly)==0) )
20910 7b 0a 20 20 20 20 69 66 28 20 63 6f 6d 62 69 6e  {.    if( combin
20920 65 64 46 6c 61 67 73 20 26 20 45 50 5f 78 49 73  edFlags & EP_xIs
20930 53 65 6c 65 63 74 20 29 20 72 65 74 75 72 6e 20  Select ) return 
20940 32 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  2;.    if( sqlit
20950 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 41  e3ExprCompare(pA
20960 2d 3e 70 4c 65 66 74 2c 20 70 42 2d 3e 70 4c 65  ->pLeft, pB->pLe
20970 66 74 2c 20 69 54 61 62 29 20 29 20 72 65 74 75  ft, iTab) ) retu
20980 72 6e 20 32 3b 0a 20 20 20 20 69 66 28 20 73 71  rn 2;.    if( sq
20990 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65  lite3ExprCompare
209a0 28 70 41 2d 3e 70 52 69 67 68 74 2c 20 70 42 2d  (pA->pRight, pB-
209b0 3e 70 52 69 67 68 74 2c 20 69 54 61 62 29 20 29  >pRight, iTab) )
209c0 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 69   return 2;.    i
209d0 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  f( sqlite3ExprLi
209e0 73 74 43 6f 6d 70 61 72 65 28 70 41 2d 3e 78 2e  stCompare(pA->x.
209f0 70 4c 69 73 74 2c 20 70 42 2d 3e 78 2e 70 4c 69  pList, pB->x.pLi
20a00 73 74 2c 20 69 54 61 62 29 20 29 20 72 65 74 75  st, iTab) ) retu
20a10 72 6e 20 32 3b 0a 20 20 20 20 69 66 28 20 41 4c  rn 2;.    if( AL
20a20 57 41 59 53 28 28 63 6f 6d 62 69 6e 65 64 46 6c  WAYS((combinedFl
20a30 61 67 73 20 26 20 45 50 5f 52 65 64 75 63 65 64  ags & EP_Reduced
20a40 29 3d 3d 30 29 20 26 26 20 70 41 2d 3e 6f 70 21  )==0) && pA->op!
20a50 3d 54 4b 5f 53 54 52 49 4e 47 20 29 7b 0a 20 20  =TK_STRING ){.  
20a60 20 20 20 20 69 66 28 20 70 41 2d 3e 69 43 6f 6c      if( pA->iCol
20a70 75 6d 6e 21 3d 70 42 2d 3e 69 43 6f 6c 75 6d 6e  umn!=pB->iColumn
20a80 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20   ) return 2;.   
20a90 20 20 20 69 66 28 20 70 41 2d 3e 69 54 61 62 6c     if( pA->iTabl
20aa0 65 21 3d 70 42 2d 3e 69 54 61 62 6c 65 20 0a 20  e!=pB->iTable . 
20ab0 20 20 20 20 20 20 26 26 20 28 70 41 2d 3e 69 54        && (pA->iT
20ac0 61 62 6c 65 21 3d 69 54 61 62 20 7c 7c 20 4e 45  able!=iTab || NE
20ad0 56 45 52 28 70 42 2d 3e 69 54 61 62 6c 65 3e 3d  VER(pB->iTable>=
20ae0 30 29 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a  0)) ) return 2;.
20af0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
20b00 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rn 0;.}../*.** C
20b10 6f 6d 70 61 72 65 20 74 77 6f 20 45 78 70 72 4c  ompare two ExprL
20b20 69 73 74 20 6f 62 6a 65 63 74 73 2e 20 20 52 65  ist objects.  Re
20b30 74 75 72 6e 20 30 20 69 66 20 74 68 65 79 20 61  turn 0 if they a
20b40 72 65 20 69 64 65 6e 74 69 63 61 6c 20 61 6e 64  re identical and
20b50 20 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66   .** non-zero if
20b60 20 74 68 65 79 20 64 69 66 66 65 72 20 69 6e 20   they differ in 
20b70 61 6e 79 20 77 61 79 2e 0a 2a 2a 0a 2a 2a 20 49  any way..**.** I
20b80 66 20 61 6e 79 20 73 75 62 65 6c 65 6d 65 6e 74  f any subelement
20b90 20 6f 66 20 70 42 20 68 61 73 20 45 78 70 72 2e   of pB has Expr.
20ba0 69 54 61 62 6c 65 3d 3d 28 2d 31 29 20 74 68 65  iTable==(-1) the
20bb0 6e 20 69 74 20 69 73 20 61 6c 6c 6f 77 65 64 0a  n it is allowed.
20bc0 2a 2a 20 74 6f 20 63 6f 6d 70 61 72 65 20 65 71  ** to compare eq
20bd0 75 61 6c 20 74 6f 20 61 6e 20 65 71 75 69 76 61  ual to an equiva
20be0 6c 65 6e 74 20 65 6c 65 6d 65 6e 74 20 69 6e 20  lent element in 
20bf0 70 41 20 77 69 74 68 20 45 78 70 72 2e 69 54 61  pA with Expr.iTa
20c00 62 6c 65 3d 3d 69 54 61 62 2e 0a 2a 2a 0a 2a 2a  ble==iTab..**.**
20c10 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69   This routine mi
20c20 67 68 74 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a  ght return non-z
20c30 65 72 6f 20 66 6f 72 20 65 71 75 69 76 61 6c 65  ero for equivale
20c40 6e 74 20 45 78 70 72 4c 69 73 74 73 2e 20 20 54  nt ExprLists.  T
20c50 68 65 0a 2a 2a 20 6f 6e 6c 79 20 63 6f 6e 73 65  he.** only conse
20c60 71 75 65 6e 63 65 20 77 69 6c 6c 20 62 65 20 64  quence will be d
20c70 69 73 61 62 6c 65 64 20 6f 70 74 69 6d 69 7a 61  isabled optimiza
20c80 74 69 6f 6e 73 2e 20 20 42 75 74 20 74 68 69 73  tions.  But this
20c90 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 6d 75 73 74   routine.** must
20ca0 20 6e 65 76 65 72 20 72 65 74 75 72 6e 20 30 20   never return 0 
20cb0 69 66 20 74 68 65 20 74 77 6f 20 45 78 70 72 4c  if the two ExprL
20cc0 69 73 74 20 6f 62 6a 65 63 74 73 20 61 72 65 20  ist objects are 
20cd0 64 69 66 66 65 72 65 6e 74 2c 20 6f 72 0a 2a 2a  different, or.**
20ce0 20 61 20 6d 61 6c 66 75 6e 63 74 69 6f 6e 20 77   a malfunction w
20cf0 69 6c 6c 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a  ill result..**.*
20d00 2a 20 54 77 6f 20 4e 55 4c 4c 20 70 6f 69 6e 74  * Two NULL point
20d10 65 72 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72  ers are consider
20d20 65 64 20 74 6f 20 62 65 20 74 68 65 20 73 61 6d  ed to be the sam
20d30 65 2e 20 20 42 75 74 20 61 20 4e 55 4c 4c 20 70  e.  But a NULL p
20d40 6f 69 6e 74 65 72 0a 2a 2a 20 61 6c 77 61 79 73  ointer.** always
20d50 20 64 69 66 66 65 72 73 20 66 72 6f 6d 20 61 20   differs from a 
20d60 6e 6f 6e 2d 4e 55 4c 4c 20 70 6f 69 6e 74 65 72  non-NULL pointer
20d70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
20d80 45 78 70 72 4c 69 73 74 43 6f 6d 70 61 72 65 28  ExprListCompare(
20d90 45 78 70 72 4c 69 73 74 20 2a 70 41 2c 20 45 78  ExprList *pA, Ex
20da0 70 72 4c 69 73 74 20 2a 70 42 2c 20 69 6e 74 20  prList *pB, int 
20db0 69 54 61 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  iTab){.  int i;.
20dc0 20 20 69 66 28 20 70 41 3d 3d 30 20 26 26 20 70    if( pA==0 && p
20dd0 42 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  B==0 ) return 0;
20de0 0a 20 20 69 66 28 20 70 41 3d 3d 30 20 7c 7c 20  .  if( pA==0 || 
20df0 70 42 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31  pB==0 ) return 1
20e00 3b 0a 20 20 69 66 28 20 70 41 2d 3e 6e 45 78 70  ;.  if( pA->nExp
20e10 72 21 3d 70 42 2d 3e 6e 45 78 70 72 20 29 20 72  r!=pB->nExpr ) r
20e20 65 74 75 72 6e 20 31 3b 0a 20 20 66 6f 72 28 69  eturn 1;.  for(i
20e30 3d 30 3b 20 69 3c 70 41 2d 3e 6e 45 78 70 72 3b  =0; i<pA->nExpr;
20e40 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20   i++){.    Expr 
20e50 2a 70 45 78 70 72 41 20 3d 20 70 41 2d 3e 61 5b  *pExprA = pA->a[
20e60 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 45 78  i].pExpr;.    Ex
20e70 70 72 20 2a 70 45 78 70 72 42 20 3d 20 70 42 2d  pr *pExprB = pB-
20e80 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
20e90 20 69 66 28 20 70 41 2d 3e 61 5b 69 5d 2e 73 6f   if( pA->a[i].so
20ea0 72 74 4f 72 64 65 72 21 3d 70 42 2d 3e 61 5b 69  rtOrder!=pB->a[i
20eb0 5d 2e 73 6f 72 74 4f 72 64 65 72 20 29 20 72 65  ].sortOrder ) re
20ec0 74 75 72 6e 20 31 3b 0a 20 20 20 20 69 66 28 20  turn 1;.    if( 
20ed0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
20ee0 72 65 28 70 45 78 70 72 41 2c 20 70 45 78 70 72  re(pExprA, pExpr
20ef0 42 2c 20 69 54 61 62 29 20 29 20 72 65 74 75 72  B, iTab) ) retur
20f00 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 1;.  }.  retur
20f10 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  n 0;.}../*.** Re
20f20 74 75 72 6e 20 74 72 75 65 20 69 66 20 77 65 20  turn true if we 
20f30 63 61 6e 20 70 72 6f 76 65 20 74 68 65 20 70 45  can prove the pE
20f40 32 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 62 65  2 will always be
20f50 20 74 72 75 65 20 69 66 20 70 45 31 20 69 73 0a   true if pE1 is.
20f60 2a 2a 20 74 72 75 65 2e 20 20 52 65 74 75 72 6e  ** true.  Return
20f70 20 66 61 6c 73 65 20 69 66 20 77 65 20 63 61 6e   false if we can
20f80 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 20 74 68 65  not complete the
20f90 20 70 72 6f 6f 66 20 6f 72 20 69 66 20 70 45 32   proof or if pE2
20fa0 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20 66 61 6c   might.** be fal
20fb0 73 65 2e 20 20 45 78 61 6d 70 6c 65 73 3a 0a 2a  se.  Examples:.*
20fc0 2a 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78 3d  *.**     pE1: x=
20fd0 3d 35 20 20 20 20 20 20 20 70 45 32 3a 20 78 3d  =5       pE2: x=
20fe0 3d 35 20 20 20 20 20 20 20 20 20 20 20 20 20 52  =5             R
20ff0 65 73 75 6c 74 3a 20 74 72 75 65 0a 2a 2a 20 20  esult: true.**  
21000 20 20 20 70 45 31 3a 20 78 3e 30 20 20 20 20 20     pE1: x>0     
21010 20 20 20 70 45 32 3a 20 78 3d 3d 35 20 20 20 20     pE2: x==5    
21020 20 20 20 20 20 20 20 20 20 52 65 73 75 6c 74 3a           Result:
21030 20 66 61 6c 73 65 0a 2a 2a 20 20 20 20 20 70 45   false.**     pE
21040 31 3a 20 78 3d 32 31 20 20 20 20 20 20 20 70 45  1: x=21       pE
21050 32 3a 20 78 3d 32 31 20 4f 52 20 79 3d 34 33 20  2: x=21 OR y=43 
21060 20 20 20 20 52 65 73 75 6c 74 3a 20 74 72 75 65      Result: true
21070 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78 21 3d  .**     pE1: x!=
21080 31 32 33 20 20 20 20 20 70 45 32 3a 20 78 20 49  123     pE2: x I
21090 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 52 65  S NOT NULL    Re
210a0 73 75 6c 74 3a 20 74 72 75 65 0a 2a 2a 20 20 20  sult: true.**   
210b0 20 20 70 45 31 3a 20 78 21 3d 3f 31 20 20 20 20    pE1: x!=?1    
210c0 20 20 70 45 32 3a 20 78 20 49 53 20 4e 4f 54 20    pE2: x IS NOT 
210d0 4e 55 4c 4c 20 20 20 20 52 65 73 75 6c 74 3a 20  NULL    Result: 
210e0 74 72 75 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a  true.**     pE1:
210f0 20 78 20 49 53 20 4e 55 4c 4c 20 20 70 45 32 3a   x IS NULL  pE2:
21100 20 78 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20   x IS NOT NULL  
21110 20 20 52 65 73 75 6c 74 3a 20 66 61 6c 73 65 0a    Result: false.
21120 2a 2a 20 20 20 20 20 70 45 31 3a 20 78 20 49 53  **     pE1: x IS
21130 20 3f 32 20 20 20 20 70 45 32 3a 20 78 20 49 53   ?2    pE2: x IS
21140 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 52 65 75   NOT NULL    Reu
21150 73 6c 74 3a 20 66 61 6c 73 65 0a 2a 2a 0a 2a 2a  slt: false.**.**
21160 20 57 68 65 6e 20 63 6f 6d 70 61 72 69 6e 67 20   When comparing 
21170 54 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73 20  TK_COLUMN nodes 
21180 62 65 74 77 65 65 6e 20 70 45 31 20 61 6e 64 20  between pE1 and 
21190 70 45 32 2c 20 69 66 20 70 45 32 20 68 61 73 0a  pE2, if pE2 has.
211a0 2a 2a 20 45 78 70 72 2e 69 54 61 62 6c 65 3c 30  ** Expr.iTable<0
211b0 20 74 68 65 6e 20 61 73 73 75 6d 65 20 61 20 74   then assume a t
211c0 61 62 6c 65 20 6e 75 6d 62 65 72 20 67 69 76 65  able number give
211d0 6e 20 62 79 20 69 54 61 62 2e 0a 2a 2a 0a 2a 2a  n by iTab..**.**
211e0 20 57 68 65 6e 20 69 6e 20 64 6f 75 62 74 2c 20   When in doubt, 
211f0 72 65 74 75 72 6e 20 66 61 6c 73 65 2e 20 20 52  return false.  R
21200 65 74 75 72 6e 69 6e 67 20 74 72 75 65 20 6d 69  eturning true mi
21210 67 68 74 20 67 69 76 65 20 61 20 70 65 72 66 6f  ght give a perfo
21220 72 6d 61 6e 63 65 0a 2a 2a 20 69 6d 70 72 6f 76  rmance.** improv
21230 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 69 6e  ement.  Returnin
21240 67 20 66 61 6c 73 65 20 6d 69 67 68 74 20 63 61  g false might ca
21250 75 73 65 20 61 20 70 65 72 66 6f 72 6d 61 6e 63  use a performanc
21260 65 20 72 65 64 75 63 74 69 6f 6e 2c 20 62 75 74  e reduction, but
21270 0a 2a 2a 20 69 74 20 77 69 6c 6c 20 61 6c 77 61  .** it will alwa
21280 79 73 20 67 69 76 65 20 74 68 65 20 63 6f 72 72  ys give the corr
21290 65 63 74 20 61 6e 73 77 65 72 20 61 6e 64 20 69  ect answer and i
212a0 73 20 68 65 6e 63 65 20 61 6c 77 61 79 73 20 73  s hence always s
212b0 61 66 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  afe..*/.int sqli
212c0 74 65 33 45 78 70 72 49 6d 70 6c 69 65 73 45 78  te3ExprImpliesEx
212d0 70 72 28 45 78 70 72 20 2a 70 45 31 2c 20 45 78  pr(Expr *pE1, Ex
212e0 70 72 20 2a 70 45 32 2c 20 69 6e 74 20 69 54 61  pr *pE2, int iTa
212f0 62 29 7b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  b){.  if( sqlite
21300 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 45 31  3ExprCompare(pE1
21310 2c 20 70 45 32 2c 20 69 54 61 62 29 3d 3d 30 20  , pE2, iTab)==0 
21320 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  ){.    return 1;
21330 0a 20 20 7d 0a 20 20 69 66 28 20 70 45 32 2d 3e  .  }.  if( pE2->
21340 6f 70 3d 3d 54 4b 5f 4f 52 0a 20 20 20 26 26 20  op==TK_OR.   && 
21350 28 73 71 6c 69 74 65 33 45 78 70 72 49 6d 70 6c  (sqlite3ExprImpl
21360 69 65 73 45 78 70 72 28 70 45 31 2c 20 70 45 32  iesExpr(pE1, pE2
21370 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 29 0a 20  ->pLeft, iTab). 
21380 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73              || s
21390 71 6c 69 74 65 33 45 78 70 72 49 6d 70 6c 69 65  qlite3ExprImplie
213a0 73 45 78 70 72 28 70 45 31 2c 20 70 45 32 2d 3e  sExpr(pE1, pE2->
213b0 70 52 69 67 68 74 2c 20 69 54 61 62 29 20 29 0a  pRight, iTab) ).
213c0 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20    ){.    return 
213d0 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 45 32  1;.  }.  if( pE2
213e0 2d 3e 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c  ->op==TK_NOTNULL
213f0 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33 45 78  .   && sqlite3Ex
21400 70 72 43 6f 6d 70 61 72 65 28 70 45 31 2d 3e 70  prCompare(pE1->p
21410 4c 65 66 74 2c 20 70 45 32 2d 3e 70 4c 65 66 74  Left, pE2->pLeft
21420 2c 20 69 54 61 62 29 3d 3d 30 0a 20 20 20 26 26  , iTab)==0.   &&
21430 20 28 70 45 31 2d 3e 6f 70 21 3d 54 4b 5f 49 53   (pE1->op!=TK_IS
21440 4e 55 4c 4c 20 26 26 20 70 45 31 2d 3e 6f 70 21  NULL && pE1->op!
21450 3d 54 4b 5f 49 53 29 0a 20 20 29 7b 0a 20 20 20  =TK_IS).  ){.   
21460 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
21470 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
21480 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20  .** An instance 
21490 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
214a0 20 73 74 72 75 63 74 75 72 65 20 69 73 20 75 73   structure is us
214b0 65 64 20 62 79 20 74 68 65 20 74 72 65 65 20 77  ed by the tree w
214c0 61 6c 6b 65 72 0a 2a 2a 20 74 6f 20 63 6f 75 6e  alker.** to coun
214d0 74 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  t references to 
214e0 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 20 69 6e  table columns in
214f0 20 74 68 65 20 61 72 67 75 6d 65 6e 74 73 20 6f   the arguments o
21500 66 20 61 6e 20 0a 2a 2a 20 61 67 67 72 65 67 61  f an .** aggrega
21510 74 65 20 66 75 6e 63 74 69 6f 6e 2c 20 69 6e 20  te function, in 
21520 6f 72 64 65 72 20 74 6f 20 69 6d 70 6c 65 6d 65  order to impleme
21530 6e 74 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65  nt the.** sqlite
21540 33 46 75 6e 63 74 69 6f 6e 54 68 69 73 53 72 63  3FunctionThisSrc
21550 28 29 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73  () routine..*/.s
21560 74 72 75 63 74 20 53 72 63 43 6f 75 6e 74 20 7b  truct SrcCount {
21570 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
21580 3b 20 20 20 2f 2a 20 4f 6e 65 20 70 61 72 74 69  ;   /* One parti
21590 63 75 6c 61 72 20 46 52 4f 4d 20 63 6c 61 75 73  cular FROM claus
215a0 65 20 69 6e 20 61 20 6e 65 73 74 65 64 20 71 75  e in a nested qu
215b0 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 68  ery */.  int nTh
215c0 69 73 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  is;       /* Num
215d0 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65  ber of reference
215e0 73 20 74 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  s to columns in 
215f0 70 53 72 63 4c 69 73 74 20 2a 2f 0a 20 20 69 6e  pSrcList */.  in
21600 74 20 6e 4f 74 68 65 72 3b 20 20 20 20 20 20 2f  t nOther;      /
21610 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 66 65  * Number of refe
21620 72 65 6e 63 65 73 20 74 6f 20 63 6f 6c 75 6d 6e  rences to column
21630 73 20 69 6e 20 6f 74 68 65 72 20 46 52 4f 4d 20  s in other FROM 
21640 63 6c 61 75 73 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f  clauses */.};../
21650 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e  *.** Count the n
21660 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e  umber of referen
21670 63 65 73 20 74 6f 20 63 6f 6c 75 6d 6e 73 2e 0a  ces to columns..
21680 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78  */.static int ex
21690 70 72 53 72 63 43 6f 75 6e 74 28 57 61 6c 6b 65  prSrcCount(Walke
216a0 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72  r *pWalker, Expr
216b0 20 2a 70 45 78 70 72 29 7b 0a 20 20 2f 2a 20 54   *pExpr){.  /* T
216c0 68 65 20 4e 45 56 45 52 28 29 20 6f 6e 20 74 68  he NEVER() on th
216d0 65 20 73 65 63 6f 6e 64 20 74 65 72 6d 20 69 73  e second term is
216e0 20 62 65 63 61 75 73 65 20 73 71 6c 69 74 65 33   because sqlite3
216f0 46 75 6e 63 74 69 6f 6e 55 73 65 73 54 68 69 73  FunctionUsesThis
21700 53 72 63 28 29 0a 20 20 2a 2a 20 69 73 20 61 6c  Src().  ** is al
21710 77 61 79 73 20 63 61 6c 6c 65 64 20 62 65 66 6f  ways called befo
21720 72 65 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e  re sqlite3ExprAn
21730 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28  alyzeAggregates(
21740 29 20 61 6e 64 20 73 6f 20 74 68 65 0a 20 20 2a  ) and so the.  *
21750 2a 20 54 4b 5f 43 4f 4c 55 4d 4e 73 20 68 61 76  * TK_COLUMNs hav
21760 65 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 63  e not yet been c
21770 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 54 4b  onverted into TK
21780 5f 41 47 47 5f 43 4f 4c 55 4d 4e 2e 20 20 49 66  _AGG_COLUMN.  If
21790 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 46 75 6e  .  ** sqlite3Fun
217a0 63 74 69 6f 6e 55 73 65 73 54 68 69 73 53 72 63  ctionUsesThisSrc
217b0 28 29 20 69 73 20 75 73 65 64 20 64 69 66 66 65  () is used diffe
217c0 72 65 6e 74 6c 79 20 69 6e 20 74 68 65 20 66 75  rently in the fu
217d0 74 75 72 65 2c 20 74 68 65 0a 20 20 2a 2a 20 4e  ture, the.  ** N
217e0 45 56 45 52 28 29 20 77 69 6c 6c 20 6e 65 65 64  EVER() will need
217f0 20 74 6f 20 62 65 20 72 65 6d 6f 76 65 64 2e 20   to be removed. 
21800 2a 2f 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  */.  if( pExpr->
21810 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c  op==TK_COLUMN ||
21820 20 4e 45 56 45 52 28 70 45 78 70 72 2d 3e 6f 70   NEVER(pExpr->op
21830 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 29  ==TK_AGG_COLUMN)
21840 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
21850 20 20 20 73 74 72 75 63 74 20 53 72 63 43 6f 75     struct SrcCou
21860 6e 74 20 2a 70 20 3d 20 70 57 61 6c 6b 65 72 2d  nt *p = pWalker-
21870 3e 75 2e 70 53 72 63 43 6f 75 6e 74 3b 0a 20 20  >u.pSrcCount;.  
21880 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 20    SrcList *pSrc 
21890 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20 69  = p->pSrc;.    i
218a0 6e 74 20 6e 53 72 63 20 3d 20 70 53 72 63 20 3f  nt nSrc = pSrc ?
218b0 20 70 53 72 63 2d 3e 6e 53 72 63 20 3a 20 30 3b   pSrc->nSrc : 0;
218c0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
218d0 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nSrc; i++){.    
218e0 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 54 61    if( pExpr->iTa
218f0 62 6c 65 3d 3d 70 53 72 63 2d 3e 61 5b 69 5d 2e  ble==pSrc->a[i].
21900 69 43 75 72 73 6f 72 20 29 20 62 72 65 61 6b 3b  iCursor ) break;
21910 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
21920 3c 6e 53 72 63 20 29 7b 0a 20 20 20 20 20 20 70  <nSrc ){.      p
21930 2d 3e 6e 54 68 69 73 2b 2b 3b 0a 20 20 20 20 7d  ->nThis++;.    }
21940 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 6e  else{.      p->n
21950 4f 74 68 65 72 2b 2b 3b 0a 20 20 20 20 7d 0a 20  Other++;.    }. 
21960 20 7d 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f   }.  return WRC_
21970 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a  Continue;.}../*.
21980 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 69 66 20  ** Determine if 
21990 61 6e 79 20 6f 66 20 74 68 65 20 61 72 67 75 6d  any of the argum
219a0 65 6e 74 73 20 74 6f 20 74 68 65 20 70 45 78 70  ents to the pExp
219b0 72 20 46 75 6e 63 74 69 6f 6e 20 72 65 66 65 72  r Function refer
219c0 65 6e 63 65 0a 2a 2a 20 70 53 72 63 4c 69 73 74  ence.** pSrcList
219d0 2e 20 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  .  Return true i
219e0 66 20 74 68 65 79 20 64 6f 2e 20 20 41 6c 73 6f  f they do.  Also
219f0 20 72 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   return true if 
21a00 74 68 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  the function.** 
21a10 68 61 73 20 6e 6f 20 61 72 67 75 6d 65 6e 74 73  has no arguments
21a20 20 6f 72 20 68 61 73 20 6f 6e 6c 79 20 63 6f 6e   or has only con
21a30 73 74 61 6e 74 20 61 72 67 75 6d 65 6e 74 73 2e  stant arguments.
21a40 20 20 52 65 74 75 72 6e 20 66 61 6c 73 65 20 69    Return false i
21a50 66 20 70 45 78 70 72 0a 2a 2a 20 72 65 66 65 72  f pExpr.** refer
21a60 65 6e 63 65 73 20 63 6f 6c 75 6d 6e 73 20 62 75  ences columns bu
21a70 74 20 6e 6f 74 20 63 6f 6c 75 6d 6e 73 20 6f 66  t not columns of
21a80 20 74 61 62 6c 65 73 20 66 6f 75 6e 64 20 69 6e   tables found in
21a90 20 70 53 72 63 4c 69 73 74 2e 0a 2a 2f 0a 69 6e   pSrcList..*/.in
21aa0 74 20 73 71 6c 69 74 65 33 46 75 6e 63 74 69 6f  t sqlite3Functio
21ab0 6e 55 73 65 73 54 68 69 73 53 72 63 28 45 78 70  nUsesThisSrc(Exp
21ac0 72 20 2a 70 45 78 70 72 2c 20 53 72 63 4c 69 73  r *pExpr, SrcLis
21ad0 74 20 2a 70 53 72 63 4c 69 73 74 29 7b 0a 20 20  t *pSrcList){.  
21ae0 57 61 6c 6b 65 72 20 77 3b 0a 20 20 73 74 72 75  Walker w;.  stru
21af0 63 74 20 53 72 63 43 6f 75 6e 74 20 63 6e 74 3b  ct SrcCount cnt;
21b00 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
21b10 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e  ->op==TK_AGG_FUN
21b20 43 54 49 4f 4e 20 29 3b 0a 20 20 6d 65 6d 73 65  CTION );.  memse
21b30 74 28 26 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28  t(&w, 0, sizeof(
21b40 77 29 29 3b 0a 20 20 77 2e 78 45 78 70 72 43 61  w));.  w.xExprCa
21b50 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72 53 72 63  llback = exprSrc
21b60 43 6f 75 6e 74 3b 0a 20 20 77 2e 75 2e 70 53 72  Count;.  w.u.pSr
21b70 63 43 6f 75 6e 74 20 3d 20 26 63 6e 74 3b 0a 20  cCount = &cnt;. 
21b80 20 63 6e 74 2e 70 53 72 63 20 3d 20 70 53 72 63   cnt.pSrc = pSrc
21b90 4c 69 73 74 3b 0a 20 20 63 6e 74 2e 6e 54 68 69  List;.  cnt.nThi
21ba0 73 20 3d 20 30 3b 0a 20 20 63 6e 74 2e 6e 4f 74  s = 0;.  cnt.nOt
21bb0 68 65 72 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  her = 0;.  sqlit
21bc0 65 33 57 61 6c 6b 45 78 70 72 4c 69 73 74 28 26  e3WalkExprList(&
21bd0 77 2c 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73  w, pExpr->x.pLis
21be0 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 63 6e 74  t);.  return cnt
21bf0 2e 6e 54 68 69 73 3e 30 20 7c 7c 20 63 6e 74 2e  .nThis>0 || cnt.
21c00 6e 4f 74 68 65 72 3d 3d 30 3b 0a 7d 0a 0a 2f 2a  nOther==0;.}../*
21c10 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 65 6c  .** Add a new el
21c20 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 70 41 67  ement to the pAg
21c30 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 61 72  gInfo->aCol[] ar
21c40 72 61 79 2e 20 20 52 65 74 75 72 6e 20 74 68 65  ray.  Return the
21c50 20 69 6e 64 65 78 20 6f 66 0a 2a 2a 20 74 68 65   index of.** the
21c60 20 6e 65 77 20 65 6c 65 6d 65 6e 74 2e 20 20 52   new element.  R
21c70 65 74 75 72 6e 20 61 20 6e 65 67 61 74 69 76 65  eturn a negative
21c80 20 6e 75 6d 62 65 72 20 69 66 20 6d 61 6c 6c 6f   number if mallo
21c90 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74  c fails..*/.stat
21ca0 69 63 20 69 6e 74 20 61 64 64 41 67 67 49 6e 66  ic int addAggInf
21cb0 6f 43 6f 6c 75 6d 6e 28 73 71 6c 69 74 65 33 20  oColumn(sqlite3 
21cc0 2a 64 62 2c 20 41 67 67 49 6e 66 6f 20 2a 70 49  *db, AggInfo *pI
21cd0 6e 66 6f 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  nfo){.  int i;. 
21ce0 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 20 3d 20 73   pInfo->aCol = s
21cf0 71 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f 63  qlite3ArrayAlloc
21d00 61 74 65 28 0a 20 20 20 20 20 20 20 64 62 2c 0a  ate(.       db,.
21d10 20 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61 43         pInfo->aC
21d20 6f 6c 2c 0a 20 20 20 20 20 20 20 73 69 7a 65 6f  ol,.       sizeo
21d30 66 28 70 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 30 5d  f(pInfo->aCol[0]
21d40 29 2c 0a 20 20 20 20 20 20 20 26 70 49 6e 66 6f  ),.       &pInfo
21d50 2d 3e 6e 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20  ->nColumn,.     
21d60 20 20 26 69 0a 20 20 29 3b 0a 20 20 72 65 74 75    &i.  );.  retu
21d70 72 6e 20 69 3b 0a 7d 20 20 20 20 0a 0a 2f 2a 0a  rn i;.}    ../*.
21d80 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 65 6c 65  ** Add a new ele
21d90 6d 65 6e 74 20 74 6f 20 74 68 65 20 70 41 67 67  ment to the pAgg
21da0 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 20 61 72  Info->aFunc[] ar
21db0 72 61 79 2e 20 20 52 65 74 75 72 6e 20 74 68 65  ray.  Return the
21dc0 20 69 6e 64 65 78 20 6f 66 0a 2a 2a 20 74 68 65   index of.** the
21dd0 20 6e 65 77 20 65 6c 65 6d 65 6e 74 2e 20 20 52   new element.  R
21de0 65 74 75 72 6e 20 61 20 6e 65 67 61 74 69 76 65  eturn a negative
21df0 20 6e 75 6d 62 65 72 20 69 66 20 6d 61 6c 6c 6f   number if mallo
21e00 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74  c fails..*/.stat
21e10 69 63 20 69 6e 74 20 61 64 64 41 67 67 49 6e 66  ic int addAggInf
21e20 6f 46 75 6e 63 28 73 71 6c 69 74 65 33 20 2a 64  oFunc(sqlite3 *d
21e30 62 2c 20 41 67 67 49 6e 66 6f 20 2a 70 49 6e 66  b, AggInfo *pInf
21e40 6f 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 70  o){.  int i;.  p
21e50 49 6e 66 6f 2d 3e 61 46 75 6e 63 20 3d 20 73 71  Info->aFunc = sq
21e60 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61  lite3ArrayAlloca
21e70 74 65 28 0a 20 20 20 20 20 20 20 64 62 2c 20 0a  te(.       db, .
21e80 20 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61 46         pInfo->aF
21e90 75 6e 63 2c 0a 20 20 20 20 20 20 20 73 69 7a 65  unc,.       size
21ea0 6f 66 28 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b  of(pInfo->aFunc[
21eb0 30 5d 29 2c 0a 20 20 20 20 20 20 20 26 70 49 6e  0]),.       &pIn
21ec0 66 6f 2d 3e 6e 46 75 6e 63 2c 0a 20 20 20 20 20  fo->nFunc,.     
21ed0 20 20 26 69 0a 20 20 29 3b 0a 20 20 72 65 74 75    &i.  );.  retu
21ee0 72 6e 20 69 3b 0a 7d 20 20 20 20 0a 0a 2f 2a 0a  rn i;.}    ../*.
21ef0 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 78  ** This is the x
21f00 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 66 6f 72  ExprCallback for
21f10 20 61 20 74 72 65 65 20 77 61 6c 6b 65 72 2e 20   a tree walker. 
21f20 20 49 74 20 69 73 20 75 73 65 64 20 74 6f 0a 2a   It is used to.*
21f30 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 73 71 6c 69  * implement sqli
21f40 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
21f50 67 72 65 67 61 74 65 73 28 29 2e 20 20 53 65 65  gregates().  See
21f60 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
21f70 79 7a 65 41 67 67 72 65 67 61 74 65 73 0a 2a 2a  yzeAggregates.**
21f80 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20   for additional 
21f90 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a  information..*/.
21fa0 73 74 61 74 69 63 20 69 6e 74 20 61 6e 61 6c 79  static int analy
21fb0 7a 65 41 67 67 72 65 67 61 74 65 28 57 61 6c 6b  zeAggregate(Walk
21fc0 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70  er *pWalker, Exp
21fd0 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74  r *pExpr){.  int
21fe0 20 69 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78   i;.  NameContex
21ff0 74 20 2a 70 4e 43 20 3d 20 70 57 61 6c 6b 65 72  t *pNC = pWalker
22000 2d 3e 75 2e 70 4e 43 3b 0a 20 20 50 61 72 73 65  ->u.pNC;.  Parse
22010 20 2a 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e   *pParse = pNC->
22020 70 50 61 72 73 65 3b 0a 20 20 53 72 63 4c 69 73  pParse;.  SrcLis
22030 74 20 2a 70 53 72 63 4c 69 73 74 20 3d 20 70 4e  t *pSrcList = pN
22040 43 2d 3e 70 53 72 63 4c 69 73 74 3b 0a 20 20 41  C->pSrcList;.  A
22050 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f  ggInfo *pAggInfo
22060 20 3d 20 70 4e 43 2d 3e 70 41 67 67 49 6e 66 6f   = pNC->pAggInfo
22070 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45 78  ;..  switch( pEx
22080 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61  pr->op ){.    ca
22090 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  se TK_AGG_COLUMN
220a0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  :.    case TK_CO
220b0 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 74 65  LUMN: {.      te
220c0 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
220d0 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  p==TK_AGG_COLUMN
220e0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
220f0 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
22100 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20  K_COLUMN );.    
22110 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65    /* Check to se
22120 65 20 69 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20  e if the column 
22130 69 73 20 69 6e 20 6f 6e 65 20 6f 66 20 74 68 65  is in one of the
22140 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46   tables in the F
22150 52 4f 4d 0a 20 20 20 20 20 20 2a 2a 20 63 6c 61  ROM.      ** cla
22160 75 73 65 20 6f 66 20 74 68 65 20 61 67 67 72 65  use of the aggre
22170 67 61 74 65 20 71 75 65 72 79 20 2a 2f 0a 20 20  gate query */.  
22180 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 70      if( ALWAYS(p
22190 53 72 63 4c 69 73 74 21 3d 30 29 20 29 7b 0a 20  SrcList!=0) ){. 
221a0 20 20 20 20 20 20 20 73 74 72 75 63 74 20 53 72         struct Sr
221b0 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
221c0 6d 20 3d 20 70 53 72 63 4c 69 73 74 2d 3e 61 3b  m = pSrcList->a;
221d0 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
221e0 3b 20 69 3c 70 53 72 63 4c 69 73 74 2d 3e 6e 53  ; i<pSrcList->nS
221f0 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b  rc; i++, pItem++
22200 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 72  ){.          str
22210 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20  uct AggInfo_col 
22220 2a 70 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20  *pCol;.         
22230 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
22240 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
22250 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50   EP_TokenOnly|EP
22260 5f 52 65 64 75 63 65 64 29 20 29 3b 0a 20 20 20  _Reduced) );.   
22270 20 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72         if( pExpr
22280 2d 3e 69 54 61 62 6c 65 3d 3d 70 49 74 65 6d 2d  ->iTable==pItem-
22290 3e 69 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20  >iCursor ){.    
222a0 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65          /* If we
222b0 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e   reach this poin
222c0 74 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  t, it means that
222d0 20 70 45 78 70 72 20 72 65 66 65 72 73 20 74 6f   pExpr refers to
222e0 20 61 20 74 61 62 6c 65 0a 20 20 20 20 20 20 20   a table.       
222f0 20 20 20 20 20 2a 2a 20 74 68 61 74 20 69 73 20       ** that is 
22300 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
22310 73 65 20 6f 66 20 74 68 65 20 61 67 67 72 65 67  se of the aggreg
22320 61 74 65 20 71 75 65 72 79 2e 20 20 0a 20 20 20  ate query.  .   
22330 20 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20           **.    
22340 20 20 20 20 20 20 20 20 2a 2a 20 4d 61 6b 65 20          ** Make 
22350 61 6e 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65  an entry for the
22360 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 41 67 67 49   column in pAggI
22370 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 69 66 20 74  nfo->aCol[] if t
22380 68 65 72 65 0a 20 20 20 20 20 20 20 20 20 20 20  here.           
22390 20 2a 2a 20 69 73 20 6e 6f 74 20 61 6e 20 65 6e   ** is not an en
223a0 74 72 79 20 74 68 65 72 65 20 61 6c 72 65 61 64  try there alread
223b0 79 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  y..            *
223c0 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  /.            in
223d0 74 20 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  t k;.           
223e0 20 70 43 6f 6c 20 3d 20 70 41 67 67 49 6e 66 6f   pCol = pAggInfo
223f0 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20  ->aCol;.        
22400 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70      for(k=0; k<p
22410 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e  AggInfo->nColumn
22420 3b 20 6b 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a  ; k++, pCol++){.
22430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
22440 28 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 3d 3d  ( pCol->iTable==
22450 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 26 26  pExpr->iTable &&
22460 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
22470 20 20 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e     pCol->iColumn
22480 3d 3d 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ==pExpr->iColumn
22490 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
224a0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
224b0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
224c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
224d0 20 20 20 20 20 69 66 28 20 28 6b 3e 3d 70 41 67       if( (k>=pAg
224e0 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 29 0a  gInfo->nColumn).
224f0 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
22500 28 6b 20 3d 20 61 64 64 41 67 67 49 6e 66 6f 43  (k = addAggInfoC
22510 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2d 3e 64 62  olumn(pParse->db
22520 2c 20 70 41 67 67 49 6e 66 6f 29 29 3e 3d 30 20  , pAggInfo))>=0 
22530 0a 20 20 20 20 20 20 20 20 20 20 20 20 29 7b 0a  .            ){.
22540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
22550 6f 6c 20 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e  ol = &pAggInfo->
22560 61 43 6f 6c 5b 6b 5d 3b 0a 20 20 20 20 20 20 20  aCol[k];.       
22570 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 54 61         pCol->pTa
22580 62 20 3d 20 70 45 78 70 72 2d 3e 70 54 61 62 3b  b = pExpr->pTab;
22590 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
225a0 43 6f 6c 2d 3e 69 54 61 62 6c 65 20 3d 20 70 45  Col->iTable = pE
225b0 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20  xpr->iTable;.   
225c0 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
225d0 3e 69 43 6f 6c 75 6d 6e 20 3d 20 70 45 78 70 72  >iColumn = pExpr
225e0 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  ->iColumn;.     
225f0 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69           pCol->i
22600 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  Mem = ++pParse->
22610 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 20 20  nMem;.          
22620 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65      pCol->iSorte
22630 72 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20  rColumn = -1;.  
22640 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
22650 2d 3e 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b  ->pExpr = pExpr;
22660 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
22670 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e 70 47 72  f( pAggInfo->pGr
22680 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20 20  oupBy ){.       
22690 20 20 20 20 20 20 20 20 20 69 6e 74 20 6a 2c 20           int j, 
226a0 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n;.             
226b0 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47 42     ExprList *pGB
226c0 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 70 47 72   = pAggInfo->pGr
226d0 6f 75 70 42 79 3b 0a 20 20 20 20 20 20 20 20 20  oupBy;.         
226e0 20 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78         struct Ex
226f0 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 65  prList_item *pTe
22700 72 6d 20 3d 20 70 47 42 2d 3e 61 3b 0a 20 20 20  rm = pGB->a;.   
22710 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 20 3d               n =
22720 20 70 47 42 2d 3e 6e 45 78 70 72 3b 0a 20 20 20   pGB->nExpr;.   
22730 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72               for
22740 28 6a 3d 30 3b 20 6a 3c 6e 3b 20 6a 2b 2b 2c 20  (j=0; j<n; j++, 
22750 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pTerm++){.      
22760 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72              Expr
22770 20 2a 70 45 20 3d 20 70 54 65 72 6d 2d 3e 70 45   *pE = pTerm->pE
22780 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20  xpr;.           
22790 20 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e 6f         if( pE->o
227a0 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20  p==TK_COLUMN && 
227b0 70 45 2d 3e 69 54 61 62 6c 65 3d 3d 70 45 78 70  pE->iTable==pExp
227c0 72 2d 3e 69 54 61 62 6c 65 20 26 26 0a 20 20 20  r->iTable &&.   
227d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
227e0 20 20 20 70 45 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d     pE->iColumn==
227f0 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 29  pExpr->iColumn )
22800 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
22810 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72        pCol->iSor
22820 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 6a 3b 0a 20  terColumn = j;. 
22830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22840 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
22850 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
22860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
22870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
22880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
22890 28 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43  ( pCol->iSorterC
228a0 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20  olumn<0 ){.     
228b0 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
228c0 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 20 3d  >iSorterColumn =
228d0 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 53 6f 72 74   pAggInfo->nSort
228e0 69 6e 67 43 6f 6c 75 6d 6e 2b 2b 3b 0a 20 20 20  ingColumn++;.   
228f0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
22900 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
22910 20 20 20 20 20 20 20 2f 2a 20 54 68 65 72 65 20         /* There 
22920 69 73 20 6e 6f 77 20 61 6e 20 65 6e 74 72 79 20  is now an entry 
22930 66 6f 72 20 70 45 78 70 72 20 69 6e 20 70 41 67  for pExpr in pAg
22940 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 28 65  gInfo->aCol[] (e
22950 69 74 68 65 72 0a 20 20 20 20 20 20 20 20 20 20  ither.          
22960 20 20 2a 2a 20 62 65 63 61 75 73 65 20 69 74 20    ** because it 
22970 77 61 73 20 74 68 65 72 65 20 62 65 66 6f 72 65  was there before
22980 20 6f 72 20 62 65 63 61 75 73 65 20 77 65 20 6a   or because we j
22990 75 73 74 20 63 72 65 61 74 65 64 20 69 74 29 2e  ust created it).
229a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
229b0 43 6f 6e 76 65 72 74 20 74 68 65 20 70 45 78 70  Convert the pExp
229c0 72 20 74 6f 20 62 65 20 61 20 54 4b 5f 41 47 47  r to be a TK_AGG
229d0 5f 43 4f 4c 55 4d 4e 20 72 65 66 65 72 72 69 6e  _COLUMN referrin
229e0 67 20 74 6f 20 74 68 61 74 0a 20 20 20 20 20 20  g to that.      
229f0 20 20 20 20 20 20 2a 2a 20 70 41 67 67 49 6e 66        ** pAggInf
22a00 6f 2d 3e 61 43 6f 6c 5b 5d 20 65 6e 74 72 79 2e  o->aCol[] entry.
22a10 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  .            */.
22a20 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72              Expr
22a30 53 65 74 56 56 41 50 72 6f 70 65 72 74 79 28 70  SetVVAProperty(p
22a40 45 78 70 72 2c 20 45 50 5f 4e 6f 52 65 64 75 63  Expr, EP_NoReduc
22a50 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
22a60 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f 20  pExpr->pAggInfo 
22a70 3d 20 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20  = pAggInfo;.    
22a80 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f          pExpr->o
22a90 70 20 3d 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  p = TK_AGG_COLUM
22aa0 4e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  N;.            p
22ab0 45 78 70 72 2d 3e 69 41 67 67 20 3d 20 28 69 31  Expr->iAgg = (i1
22ac0 36 29 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  6)k;.           
22ad0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
22ae0 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20 70 45 78    } /* endif pEx
22af0 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 49 74 65  pr->iTable==pIte
22b00 6d 2d 3e 69 43 75 72 73 6f 72 20 2a 2f 0a 20 20  m->iCursor */.  
22b10 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64 20 6c        } /* end l
22b20 6f 6f 70 20 6f 76 65 72 20 70 53 72 63 4c 69 73  oop over pSrcLis
22b30 74 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20  t */.      }.   
22b40 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72     return WRC_Pr
22b50 75 6e 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  une;.    }.    c
22b60 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54  ase TK_AGG_FUNCT
22b70 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  ION: {.      if(
22b80 20 28 70 4e 43 2d 3e 6e 63 46 6c 61 67 73 20 26   (pNC->ncFlags &
22b90 20 4e 43 5f 49 6e 41 67 67 46 75 6e 63 29 3d 3d   NC_InAggFunc)==
22ba0 30 0a 20 20 20 20 20 20 20 26 26 20 70 57 61 6c  0.       && pWal
22bb0 6b 65 72 2d 3e 77 61 6c 6b 65 72 44 65 70 74 68  ker->walkerDepth
22bc0 3d 3d 70 45 78 70 72 2d 3e 6f 70 32 0a 20 20 20  ==pExpr->op2.   
22bd0 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a     ){.        /*
22be0 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
22bf0 20 70 45 78 70 72 20 69 73 20 61 20 64 75 70 6c   pExpr is a dupl
22c00 69 63 61 74 65 20 6f 66 20 61 6e 6f 74 68 65 72  icate of another
22c10 20 61 67 67 72 65 67 61 74 65 20 0a 20 20 20 20   aggregate .    
22c20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20      ** function 
22c30 74 68 61 74 20 69 73 20 61 6c 72 65 61 64 79 20  that is already 
22c40 69 6e 20 74 68 65 20 70 41 67 67 49 6e 66 6f 20  in the pAggInfo 
22c50 73 74 72 75 63 74 75 72 65 0a 20 20 20 20 20 20  structure.      
22c60 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 74 72    */.        str
22c70 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63  uct AggInfo_func
22c80 20 2a 70 49 74 65 6d 20 3d 20 70 41 67 67 49 6e   *pItem = pAggIn
22c90 66 6f 2d 3e 61 46 75 6e 63 3b 0a 20 20 20 20 20  fo->aFunc;.     
22ca0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41     for(i=0; i<pA
22cb0 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69  ggInfo->nFunc; i
22cc0 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
22cd0 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
22ce0 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70  te3ExprCompare(p
22cf0 49 74 65 6d 2d 3e 70 45 78 70 72 2c 20 70 45 78  Item->pExpr, pEx
22d00 70 72 2c 20 2d 31 29 3d 3d 30 20 29 7b 0a 20 20  pr, -1)==0 ){.  
22d10 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
22d20 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
22d30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
22d40 66 28 20 69 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e  f( i>=pAggInfo->
22d50 6e 46 75 6e 63 20 29 7b 0a 20 20 20 20 20 20 20  nFunc ){.       
22d60 20 20 20 2f 2a 20 70 45 78 70 72 20 69 73 20 6f     /* pExpr is o
22d70 72 69 67 69 6e 61 6c 2e 20 20 4d 61 6b 65 20 61  riginal.  Make a
22d80 20 6e 65 77 20 65 6e 74 72 79 20 69 6e 20 70 41   new entry in pA
22d90 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 0a  ggInfo->aFunc[].
22da0 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
22db0 20 20 20 20 20 20 20 75 38 20 65 6e 63 20 3d 20         u8 enc = 
22dc0 45 4e 43 28 70 50 61 72 73 65 2d 3e 64 62 29 3b  ENC(pParse->db);
22dd0 0a 20 20 20 20 20 20 20 20 20 20 69 20 3d 20 61  .          i = a
22de0 64 64 41 67 67 49 6e 66 6f 46 75 6e 63 28 70 50  ddAggInfoFunc(pP
22df0 61 72 73 65 2d 3e 64 62 2c 20 70 41 67 67 49 6e  arse->db, pAggIn
22e00 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  fo);.          i
22e10 66 28 20 69 3e 3d 30 20 29 7b 0a 20 20 20 20 20  f( i>=0 ){.     
22e20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
22e30 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
22e40 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
22e50 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20 20 20  ect) );.        
22e60 20 20 20 20 70 49 74 65 6d 20 3d 20 26 70 41 67      pItem = &pAg
22e70 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d 3b  gInfo->aFunc[i];
22e80 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74  .            pIt
22e90 65 6d 2d 3e 70 45 78 70 72 20 3d 20 70 45 78 70  em->pExpr = pExp
22ea0 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  r;.            p
22eb0 49 74 65 6d 2d 3e 69 4d 65 6d 20 3d 20 2b 2b 70  Item->iMem = ++p
22ec0 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
22ed0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
22ee0 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
22ef0 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56  y(pExpr, EP_IntV
22f00 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 20  alue) );.       
22f10 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 46 75 6e       pItem->pFun
22f20 63 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46  c = sqlite3FindF
22f30 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2d 3e  unction(pParse->
22f40 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  db,.            
22f50 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 75 2e         pExpr->u.
22f60 7a 54 6f 6b 65 6e 2c 20 73 71 6c 69 74 65 33 53  zToken, sqlite3S
22f70 74 72 6c 65 6e 33 30 28 70 45 78 70 72 2d 3e 75  trlen30(pExpr->u
22f80 2e 7a 54 6f 6b 65 6e 29 2c 0a 20 20 20 20 20 20  .zToken),.      
22f90 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
22fa0 70 72 2d 3e 78 2e 70 4c 69 73 74 20 3f 20 70 45  pr->x.pList ? pE
22fb0 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45  xpr->x.pList->nE
22fc0 78 70 72 20 3a 20 30 2c 20 65 6e 63 2c 20 30 29  xpr : 0, enc, 0)
22fd0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
22fe0 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26  ( pExpr->flags &
22ff0 20 45 50 5f 44 69 73 74 69 6e 63 74 20 29 7b 0a   EP_Distinct ){.
23000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49                pI
23010 74 65 6d 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d  tem->iDistinct =
23020 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
23030 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c  .            }el
23040 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
23050 20 20 70 49 74 65 6d 2d 3e 69 44 69 73 74 69 6e    pItem->iDistin
23060 63 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20  ct = -1;.       
23070 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
23080 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
23090 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 70 45 78       /* Make pEx
230a0 70 72 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  pr point to the 
230b0 61 70 70 72 6f 70 72 69 61 74 65 20 70 41 67 67  appropriate pAgg
230c0 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 20 65 6e  Info->aFunc[] en
230d0 74 72 79 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  try.        */. 
230e0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
230f0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
23100 70 45 78 70 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f  pExpr, EP_TokenO
23110 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64 29 20  nly|EP_Reduced) 
23120 29 3b 0a 20 20 20 20 20 20 20 20 45 78 70 72 53  );.        ExprS
23130 65 74 56 56 41 50 72 6f 70 65 72 74 79 28 70 45  etVVAProperty(pE
23140 78 70 72 2c 20 45 50 5f 4e 6f 52 65 64 75 63 65  xpr, EP_NoReduce
23150 29 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72  );.        pExpr
23160 2d 3e 69 41 67 67 20 3d 20 28 69 31 36 29 69 3b  ->iAgg = (i16)i;
23170 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e  .        pExpr->
23180 70 41 67 67 49 6e 66 6f 20 3d 20 70 41 67 67 49  pAggInfo = pAggI
23190 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 72 65 74  nfo;.        ret
231a0 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20  urn WRC_Prune;. 
231b0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
231c0 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43      return WRC_C
231d0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d  ontinue;.      }
231e0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
231f0 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
23200 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 61  ;.}.static int a
23210 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73  nalyzeAggregates
23220 49 6e 53 65 6c 65 63 74 28 57 61 6c 6b 65 72 20  InSelect(Walker 
23230 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74  *pWalker, Select
23240 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 55 4e   *pSelect){.  UN
23250 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
23260 57 61 6c 6b 65 72 29 3b 0a 20 20 55 4e 55 53 45  Walker);.  UNUSE
23270 44 5f 50 41 52 41 4d 45 54 45 52 28 70 53 65 6c  D_PARAMETER(pSel
23280 65 63 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 57  ect);.  return W
23290 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a  RC_Continue;.}..
232a0 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 74 68  /*.** Analyze th
232b0 65 20 70 45 78 70 72 20 65 78 70 72 65 73 73 69  e pExpr expressi
232c0 6f 6e 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61  on looking for a
232d0 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
232e0 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f 72 20 76 61  ns and.** for va
232f0 72 69 61 62 6c 65 73 20 74 68 61 74 20 6e 65 65  riables that nee
23300 64 20 74 6f 20 62 65 20 61 64 64 65 64 20 74 6f  d to be added to
23310 20 41 67 67 49 6e 66 6f 20 6f 62 6a 65 63 74 20   AggInfo object 
23320 74 68 61 74 20 70 4e 43 2d 3e 70 41 67 67 49 6e  that pNC->pAggIn
23330 66 6f 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 2e  fo.** points to.
23340 20 20 41 64 64 69 74 69 6f 6e 61 6c 20 65 6e 74    Additional ent
23350 72 69 65 73 20 61 72 65 20 6d 61 64 65 20 6f 6e  ries are made on
23360 20 74 68 65 20 41 67 67 49 6e 66 6f 20 6f 62 6a   the AggInfo obj
23370 65 63 74 20 61 73 0a 2a 2a 20 6e 65 63 65 73 73  ect as.** necess
23380 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ary..**.** This 
23390 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 6f  routine should o
233a0 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 61 66  nly be called af
233b0 74 65 72 20 74 68 65 20 65 78 70 72 65 73 73 69  ter the expressi
233c0 6f 6e 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 61  on has been.** a
233d0 6e 61 6c 79 7a 65 64 20 62 79 20 73 71 6c 69 74  nalyzed by sqlit
233e0 65 33 52 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d  e3ResolveExprNam
233f0 65 73 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  es()..*/.void sq
23400 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65  lite3ExprAnalyze
23410 41 67 67 72 65 67 61 74 65 73 28 4e 61 6d 65 43  Aggregates(NameC
23420 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 45 78 70  ontext *pNC, Exp
23430 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 57 61 6c  r *pExpr){.  Wal
23440 6b 65 72 20 77 3b 0a 20 20 6d 65 6d 73 65 74 28  ker w;.  memset(
23450 26 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 29  &w, 0, sizeof(w)
23460 29 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c  );.  w.xExprCall
23470 62 61 63 6b 20 3d 20 61 6e 61 6c 79 7a 65 41 67  back = analyzeAg
23480 67 72 65 67 61 74 65 3b 0a 20 20 77 2e 78 53 65  gregate;.  w.xSe
23490 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 61  lectCallback = a
234a0 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73  nalyzeAggregates
234b0 49 6e 53 65 6c 65 63 74 3b 0a 20 20 77 2e 75 2e  InSelect;.  w.u.
234c0 70 4e 43 20 3d 20 70 4e 43 3b 0a 20 20 61 73 73  pNC = pNC;.  ass
234d0 65 72 74 28 20 70 4e 43 2d 3e 70 53 72 63 4c 69  ert( pNC->pSrcLi
234e0 73 74 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74  st!=0 );.  sqlit
234f0 65 33 57 61 6c 6b 45 78 70 72 28 26 77 2c 20 70  e3WalkExpr(&w, p
23500 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Expr);.}../*.** 
23510 43 61 6c 6c 20 73 71 6c 69 74 65 33 45 78 70 72  Call sqlite3Expr
23520 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  AnalyzeAggregate
23530 73 28 29 20 66 6f 72 20 65 76 65 72 79 20 65 78  s() for every ex
23540 70 72 65 73 73 69 6f 6e 20 69 6e 20 61 6e 0a 2a  pression in an.*
23550 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  * expression lis
23560 74 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e  t.  Return the n
23570 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e  umber of errors.
23580 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
23590 6f 72 20 69 73 20 66 6f 75 6e 64 2c 20 74 68 65  or is found, the
235a0 20 61 6e 61 6c 79 73 69 73 20 69 73 20 63 75 74   analysis is cut
235b0 20 73 68 6f 72 74 2e 0a 2a 2f 0a 76 6f 69 64 20   short..*/.void 
235c0 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79  sqlite3ExprAnaly
235d0 7a 65 41 67 67 4c 69 73 74 28 4e 61 6d 65 43 6f  zeAggList(NameCo
235e0 6e 74 65 78 74 20 2a 70 4e 43 2c 20 45 78 70 72  ntext *pNC, Expr
235f0 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20  List *pList){.  
23600 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
23610 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69  item *pItem;.  i
23620 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73  nt i;.  if( pLis
23630 74 20 29 7b 0a 20 20 20 20 66 6f 72 28 70 49 74  t ){.    for(pIt
23640 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30  em=pList->a, i=0
23650 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ; i<pList->nExpr
23660 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i++, pItem++){
23670 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
23680 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  prAnalyzeAggrega
23690 74 65 73 28 70 4e 43 2c 20 70 49 74 65 6d 2d 3e  tes(pNC, pItem->
236a0 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20  pExpr);.    }.  
236b0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  }.}../*.** Alloc
236c0 61 74 65 20 61 20 73 69 6e 67 6c 65 20 6e 65 77  ate a single new
236d0 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 75 73   register for us
236e0 65 20 74 6f 20 68 6f 6c 64 20 73 6f 6d 65 20 69  e to hold some i
236f0 6e 74 65 72 6d 65 64 69 61 74 65 20 72 65 73 75  ntermediate resu
23700 6c 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  lt..*/.int sqlit
23710 65 33 47 65 74 54 65 6d 70 52 65 67 28 50 61 72  e3GetTempReg(Par
23720 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 69  se *pParse){.  i
23730 66 28 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70  f( pParse->nTemp
23740 52 65 67 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  Reg==0 ){.    re
23750 74 75 72 6e 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  turn ++pParse->n
23760 4d 65 6d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  Mem;.  }.  retur
23770 6e 20 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52  n pParse->aTempR
23780 65 67 5b 2d 2d 70 50 61 72 73 65 2d 3e 6e 54 65  eg[--pParse->nTe
23790 6d 70 52 65 67 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  mpReg];.}../*.**
237a0 20 44 65 61 6c 6c 6f 63 61 74 65 20 61 20 72 65   Deallocate a re
237b0 67 69 73 74 65 72 2c 20 6d 61 6b 69 6e 67 20 61  gister, making a
237c0 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 72 65 75  vailable for reu
237d0 73 65 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65  se for some othe
237e0 72 0a 2a 2a 20 70 75 72 70 6f 73 65 2e 0a 2a 2a  r.** purpose..**
237f0 0a 2a 2a 20 49 66 20 61 20 72 65 67 69 73 74 65  .** If a registe
23800 72 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 62  r is currently b
23810 65 69 6e 67 20 75 73 65 64 20 62 79 20 74 68 65  eing used by the
23820 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2c 20 74   column cache, t
23830 68 65 6e 0a 2a 2a 20 74 68 65 20 64 65 61 6c 6c  hen.** the deall
23840 6f 63 61 74 69 6f 6e 20 69 73 20 64 65 66 65 72  ocation is defer
23850 72 65 64 20 75 6e 74 69 6c 20 74 68 65 20 63 6f  red until the co
23860 6c 75 6d 6e 20 63 61 63 68 65 20 6c 69 6e 65 20  lumn cache line 
23870 74 68 61 74 20 75 73 65 73 0a 2a 2a 20 74 68 65  that uses.** the
23880 20 72 65 67 69 73 74 65 72 20 62 65 63 6f 6d 65   register become
23890 73 20 73 74 61 6c 65 2e 0a 2a 2f 0a 76 6f 69 64  s stale..*/.void
238a0 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
238b0 65 6d 70 52 65 67 28 50 61 72 73 65 20 2a 70 50  empReg(Parse *pP
238c0 61 72 73 65 2c 20 69 6e 74 20 69 52 65 67 29 7b  arse, int iReg){
238d0 0a 20 20 69 66 28 20 69 52 65 67 20 26 26 20 70  .  if( iReg && p
238e0 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 3c  Parse->nTempReg<
238f0 41 72 72 61 79 53 69 7a 65 28 70 50 61 72 73 65  ArraySize(pParse
23900 2d 3e 61 54 65 6d 70 52 65 67 29 20 29 7b 0a 20  ->aTempReg) ){. 
23910 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 73 74     int i;.    st
23920 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a  ruct yColCache *
23930 70 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20  p;.    for(i=0, 
23940 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61  p=pParse->aColCa
23950 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f  che; i<SQLITE_N_
23960 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70  COLCACHE; i++, p
23970 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ++){.      if( p
23980 2d 3e 69 52 65 67 3d 3d 69 52 65 67 20 29 7b 0a  ->iReg==iReg ){.
23990 20 20 20 20 20 20 20 20 70 2d 3e 74 65 6d 70 52          p->tempR
239a0 65 67 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  eg = 1;.        
239b0 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a  return;.      }.
239c0 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65      }.    pParse
239d0 2d 3e 61 54 65 6d 70 52 65 67 5b 70 50 61 72 73  ->aTempReg[pPars
239e0 65 2d 3e 6e 54 65 6d 70 52 65 67 2b 2b 5d 20 3d  e->nTempReg++] =
239f0 20 69 52 65 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a   iReg;.  }.}../*
23a00 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6f 72 20  .** Allocate or 
23a10 64 65 61 6c 6c 6f 63 61 74 65 20 61 20 62 6c 6f  deallocate a blo
23a20 63 6b 20 6f 66 20 6e 52 65 67 20 63 6f 6e 73 65  ck of nReg conse
23a30 63 75 74 69 76 65 20 72 65 67 69 73 74 65 72 73  cutive registers
23a40 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 47  .*/.int sqlite3G
23a50 65 74 54 65 6d 70 52 61 6e 67 65 28 50 61 72 73  etTempRange(Pars
23a60 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 6e  e *pParse, int n
23a70 52 65 67 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6e  Reg){.  int i, n
23a80 3b 0a 20 20 69 20 3d 20 70 50 61 72 73 65 2d 3e  ;.  i = pParse->
23a90 69 52 61 6e 67 65 52 65 67 3b 0a 20 20 6e 20 3d  iRangeReg;.  n =
23aa0 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52   pParse->nRangeR
23ab0 65 67 3b 0a 20 20 69 66 28 20 6e 52 65 67 3c 3d  eg;.  if( nReg<=
23ac0 6e 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  n ){.    assert(
23ad0 20 21 75 73 65 64 41 73 43 6f 6c 75 6d 6e 43 61   !usedAsColumnCa
23ae0 63 68 65 28 70 50 61 72 73 65 2c 20 69 2c 20 69  che(pParse, i, i
23af0 2b 6e 2d 31 29 20 29 3b 0a 20 20 20 20 70 50 61  +n-1) );.    pPa
23b00 72 73 65 2d 3e 69 52 61 6e 67 65 52 65 67 20 2b  rse->iRangeReg +
23b10 3d 20 6e 52 65 67 3b 0a 20 20 20 20 70 50 61 72  = nReg;.    pPar
23b20 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20 2d 3d  se->nRangeReg -=
23b30 20 6e 52 65 67 3b 0a 20 20 7d 65 6c 73 65 7b 0a   nReg;.  }else{.
23b40 20 20 20 20 69 20 3d 20 70 50 61 72 73 65 2d 3e      i = pParse->
23b50 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72  nMem+1;.    pPar
23b60 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 67  se->nMem += nReg
23b70 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69  ;.  }.  return i
23b80 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  ;.}.void sqlite3
23b90 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65  ReleaseTempRange
23ba0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
23bb0 69 6e 74 20 69 52 65 67 2c 20 69 6e 74 20 6e 52  int iReg, int nR
23bc0 65 67 29 7b 0a 20 20 73 71 6c 69 74 65 33 45 78  eg){.  sqlite3Ex
23bd0 70 72 43 61 63 68 65 52 65 6d 6f 76 65 28 70 50  prCacheRemove(pP
23be0 61 72 73 65 2c 20 69 52 65 67 2c 20 6e 52 65 67  arse, iReg, nReg
23bf0 29 3b 0a 20 20 69 66 28 20 6e 52 65 67 3e 70 50  );.  if( nReg>pP
23c00 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20  arse->nRangeReg 
23c10 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  ){.    pParse->n
23c20 52 61 6e 67 65 52 65 67 20 3d 20 6e 52 65 67 3b  RangeReg = nReg;
23c30 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 69 52 61  .    pParse->iRa
23c40 6e 67 65 52 65 67 20 3d 20 69 52 65 67 3b 0a 20  ngeReg = iReg;. 
23c50 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b   }.}../*.** Mark
23c60 20 61 6c 6c 20 74 65 6d 70 6f 72 61 72 79 20 72   all temporary r
23c70 65 67 69 73 74 65 72 73 20 61 73 20 62 65 69 6e  egisters as bein
23c80 67 20 75 6e 61 76 61 69 6c 61 62 6c 65 20 66 6f  g unavailable fo
23c90 72 20 72 65 75 73 65 2e 0a 2a 2f 0a 76 6f 69 64  r reuse..*/.void
23ca0 20 73 71 6c 69 74 65 33 43 6c 65 61 72 54 65 6d   sqlite3ClearTem
23cb0 70 52 65 67 43 61 63 68 65 28 50 61 72 73 65 20  pRegCache(Parse 
23cc0 2a 70 50 61 72 73 65 29 7b 0a 20 20 70 50 61 72  *pParse){.  pPar
23cd0 73 65 2d 3e 6e 54 65 6d 70 52 65 67 20 3d 20 30  se->nTempReg = 0
23ce0 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e  ;.  pParse->nRan
23cf0 67 65 52 65 67 20 3d 20 30 3b 0a 7d 0a           geReg = 0;.}.