/ Hex Artifact Content
Login

Artifact 9a1a4150864f002b633d12f170a4114c28bbe94d:


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 52 61 77 28 64 62 2c 20 73 69  MallocRaw(db, si
3a60: 7a 65 6f 66 28 45 78 70 72 29 2b 6e 45 78 74 72  zeof(Expr)+nExtr
3a70: 61 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 20 29  a);.  if( pNew )
3a80: 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 4e 65  {.    memset(pNe
3a90: 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 45 78 70  w, 0, sizeof(Exp
3aa0: 72 29 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6f  r));.    pNew->o
3ab0: 70 20 3d 20 28 75 38 29 6f 70 3b 0a 20 20 20 20  p = (u8)op;.    
3ac0: 70 4e 65 77 2d 3e 69 41 67 67 20 3d 20 2d 31 3b  pNew->iAgg = -1;
3ad0: 0a 20 20 20 20 69 66 28 20 70 54 6f 6b 65 6e 20  .    if( pToken 
3ae0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 45 78  ){.      if( nEx
3af0: 74 72 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  tra==0 ){.      
3b00: 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d    pNew->flags |=
3b10: 20 45 50 5f 49 6e 74 56 61 6c 75 65 3b 0a 20 20   EP_IntValue;.  
3b20: 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 69 56        pNew->u.iV
3b30: 61 6c 75 65 20 3d 20 69 56 61 6c 75 65 3b 0a 20  alue = iValue;. 
3b40: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
3b50: 20 20 20 20 69 6e 74 20 63 3b 0a 20 20 20 20 20      int c;.     
3b60: 20 20 20 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65     pNew->u.zToke
3b70: 6e 20 3d 20 28 63 68 61 72 2a 29 26 70 4e 65 77  n = (char*)&pNew
3b80: 5b 31 5d 3b 0a 20 20 20 20 20 20 20 20 61 73 73  [1];.        ass
3b90: 65 72 74 28 20 70 54 6f 6b 65 6e 2d 3e 7a 21 3d  ert( pToken->z!=
3ba0: 30 20 7c 7c 20 70 54 6f 6b 65 6e 2d 3e 6e 3d 3d  0 || pToken->n==
3bb0: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  0 );.        if(
3bc0: 20 70 54 6f 6b 65 6e 2d 3e 6e 20 29 20 6d 65 6d   pToken->n ) mem
3bd0: 63 70 79 28 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b  cpy(pNew->u.zTok
3be0: 65 6e 2c 20 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 70  en, pToken->z, p
3bf0: 54 6f 6b 65 6e 2d 3e 6e 29 3b 0a 20 20 20 20 20  Token->n);.     
3c00: 20 20 20 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65     pNew->u.zToke
3c10: 6e 5b 70 54 6f 6b 65 6e 2d 3e 6e 5d 20 3d 20 30  n[pToken->n] = 0
3c20: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 65  ;.        if( de
3c30: 71 75 6f 74 65 20 26 26 20 6e 45 78 74 72 61 3e  quote && nExtra>
3c40: 3d 33 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  =3 .            
3c50: 20 26 26 20 28 28 63 20 3d 20 70 54 6f 6b 65 6e   && ((c = pToken
3c60: 2d 3e 7a 5b 30 5d 29 3d 3d 27 5c 27 27 20 7c 7c  ->z[0])=='\'' ||
3c70: 20 63 3d 3d 27 22 27 20 7c 7c 20 63 3d 3d 27 5b   c=='"' || c=='[
3c80: 27 20 7c 7c 20 63 3d 3d 27 60 27 29 20 29 7b 0a  ' || c=='`') ){.
3c90: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
3ca0: 33 44 65 71 75 6f 74 65 28 70 4e 65 77 2d 3e 75  3Dequote(pNew->u
3cb0: 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20  .zToken);.      
3cc0: 20 20 20 20 69 66 28 20 63 3d 3d 27 22 27 20 29      if( c=='"' )
3cd0: 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20   pNew->flags |= 
3ce0: 45 50 5f 44 62 6c 51 75 6f 74 65 64 3b 0a 20 20  EP_DblQuoted;.  
3cf0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
3d00: 20 20 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45      }.#if SQLITE
3d10: 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48 3e  _MAX_EXPR_DEPTH>
3d20: 30 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 48 65 69  0.    pNew->nHei
3d30: 67 68 74 20 3d 20 31 3b 0a 23 65 6e 64 69 66 20  ght = 1;.#endif 
3d40: 20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70   .  }.  return p
3d50: 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c  New;.}../*.** Al
3d60: 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 65 78 70  locate a new exp
3d70: 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 66 72 6f  ression node fro
3d80: 6d 20 61 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61  m a zero-termina
3d90: 74 65 64 20 74 6f 6b 65 6e 20 74 68 61 74 20 68  ted token that h
3da0: 61 73 0a 2a 2a 20 61 6c 72 65 61 64 79 20 62 65  as.** already be
3db0: 65 6e 20 64 65 71 75 6f 74 65 64 2e 0a 2a 2f 0a  en dequoted..*/.
3dc0: 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70  Expr *sqlite3Exp
3dd0: 72 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  r(.  sqlite3 *db
3de0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
3df0: 48 61 6e 64 6c 65 20 66 6f 72 20 73 71 6c 69 74  Handle for sqlit
3e00: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 29  e3DbMallocZero()
3e10: 20 28 6d 61 79 20 62 65 20 6e 75 6c 6c 29 20 2a   (may be null) *
3e20: 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20  /.  int op,     
3e30: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
3e40: 78 70 72 65 73 73 69 6f 6e 20 6f 70 63 6f 64 65  xpression opcode
3e50: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
3e60: 20 2a 7a 54 6f 6b 65 6e 20 20 20 20 20 20 2f 2a   *zToken      /*
3e70: 20 54 6f 6b 65 6e 20 61 72 67 75 6d 65 6e 74 2e   Token argument.
3e80: 20 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20    Might be NULL 
3e90: 2a 2f 0a 29 7b 0a 20 20 54 6f 6b 65 6e 20 78 3b  */.){.  Token x;
3ea0: 0a 20 20 78 2e 7a 20 3d 20 7a 54 6f 6b 65 6e 3b  .  x.z = zToken;
3eb0: 0a 20 20 78 2e 6e 20 3d 20 7a 54 6f 6b 65 6e 20  .  x.n = zToken 
3ec0: 3f 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  ? sqlite3Strlen3
3ed0: 30 28 7a 54 6f 6b 65 6e 29 20 3a 20 30 3b 0a 20  0(zToken) : 0;. 
3ee0: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45   return sqlite3E
3ef0: 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 6f 70 2c  xprAlloc(db, op,
3f00: 20 26 78 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   &x, 0);.}../*.*
3f10: 2a 20 41 74 74 61 63 68 20 73 75 62 74 72 65 65  * Attach subtree
3f20: 73 20 70 4c 65 66 74 20 61 6e 64 20 70 52 69 67  s pLeft and pRig
3f30: 68 74 20 74 6f 20 74 68 65 20 45 78 70 72 20 6e  ht to the Expr n
3f40: 6f 64 65 20 70 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a  ode pRoot..**.**
3f50: 20 49 66 20 70 52 6f 6f 74 3d 3d 4e 55 4c 4c 20   If pRoot==NULL 
3f60: 74 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20  that means that 
3f70: 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  a memory allocat
3f80: 69 6f 6e 20 65 72 72 6f 72 20 68 61 73 20 6f 63  ion error has oc
3f90: 63 75 72 72 65 64 2e 0a 2a 2a 20 49 6e 20 74 68  curred..** In th
3fa0: 61 74 20 63 61 73 65 2c 20 64 65 6c 65 74 65 20  at case, delete 
3fb0: 74 68 65 20 73 75 62 74 72 65 65 73 20 70 4c 65  the subtrees pLe
3fc0: 66 74 20 61 6e 64 20 70 52 69 67 68 74 2e 0a 2a  ft and pRight..*
3fd0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
3fe0: 70 72 41 74 74 61 63 68 53 75 62 74 72 65 65 73  prAttachSubtrees
3ff0: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
4000: 0a 20 20 45 78 70 72 20 2a 70 52 6f 6f 74 2c 0a  .  Expr *pRoot,.
4010: 20 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 0a 20    Expr *pLeft,. 
4020: 20 45 78 70 72 20 2a 70 52 69 67 68 74 0a 29 7b   Expr *pRight.){
4030: 0a 20 20 69 66 28 20 70 52 6f 6f 74 3d 3d 30 20  .  if( pRoot==0 
4040: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64  ){.    assert( d
4050: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
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 4c 65  prDelete(db, pLe
4080: 66 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ft);.    sqlite3
4090: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
40a0: 52 69 67 68 74 29 3b 0a 20 20 7d 65 6c 73 65 7b  Right);.  }else{
40b0: 0a 20 20 20 20 69 66 28 20 70 52 69 67 68 74 20  .    if( pRight 
40c0: 29 7b 0a 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e  ){.      pRoot->
40d0: 70 52 69 67 68 74 20 3d 20 70 52 69 67 68 74 3b  pRight = pRight;
40e0: 0a 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e 66 6c  .      pRoot->fl
40f0: 61 67 73 20 7c 3d 20 45 50 5f 50 72 6f 70 61 67  ags |= EP_Propag
4100: 61 74 65 20 26 20 70 52 69 67 68 74 2d 3e 66 6c  ate & pRight->fl
4110: 61 67 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ags;.    }.    i
4120: 66 28 20 70 4c 65 66 74 20 29 7b 0a 20 20 20 20  f( pLeft ){.    
4130: 20 20 70 52 6f 6f 74 2d 3e 70 4c 65 66 74 20 3d    pRoot->pLeft =
4140: 20 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 70 52   pLeft;.      pR
4150: 6f 6f 74 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50  oot->flags |= EP
4160: 5f 50 72 6f 70 61 67 61 74 65 20 26 20 70 4c 65  _Propagate & pLe
4170: 66 74 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 7d  ft->flags;.    }
4180: 0a 20 20 20 20 65 78 70 72 53 65 74 48 65 69 67  .    exprSetHeig
4190: 68 74 28 70 52 6f 6f 74 29 3b 0a 20 20 7d 0a 7d  ht(pRoot);.  }.}
41a0: 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
41b0: 20 61 6e 20 45 78 70 72 20 6e 6f 64 65 20 77 68   an Expr node wh
41c0: 69 63 68 20 6a 6f 69 6e 73 20 61 73 20 6d 61 6e  ich joins as man
41d0: 79 20 61 73 20 74 77 6f 20 73 75 62 74 72 65 65  y as two subtree
41e0: 73 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 65 20 6f 72 20  s..**.** One or 
41f0: 62 6f 74 68 20 6f 66 20 74 68 65 20 73 75 62 74  both of the subt
4200: 72 65 65 73 20 63 61 6e 20 62 65 20 4e 55 4c 4c  rees can be NULL
4210: 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  .  Return a poin
4220: 74 65 72 20 74 6f 20 74 68 65 20 6e 65 77 0a 2a  ter to the new.*
4230: 2a 20 45 78 70 72 20 6e 6f 64 65 2e 20 20 4f 72  * Expr node.  Or
4240: 2c 20 69 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f  , if an OOM erro
4250: 72 20 6f 63 63 75 72 73 2c 20 73 65 74 20 70 50  r occurs, set pP
4260: 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
4270: 46 61 69 6c 65 64 2c 0a 2a 2a 20 66 72 65 65 20  Failed,.** free 
4280: 74 68 65 20 73 75 62 74 72 65 65 73 20 61 6e 64  the subtrees and
4290: 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f   return NULL..*/
42a0: 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 50 45  .Expr *sqlite3PE
42b0: 78 70 72 28 0a 20 20 50 61 72 73 65 20 2a 70 50  xpr(.  Parse *pP
42c0: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f  arse,          /
42d0: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
42e0: 74 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20  t */.  int op,  
42f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4300: 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 6f 70 63  * Expression opc
4310: 6f 64 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ode */.  Expr *p
4320: 4c 65 66 74 2c 20 20 20 20 20 20 20 20 20 20 20  Left,           
4330: 20 2f 2a 20 4c 65 66 74 20 6f 70 65 72 61 6e 64   /* Left operand
4340: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 52 69 67   */.  Expr *pRig
4350: 68 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ht,           /*
4360: 20 52 69 67 68 74 20 6f 70 65 72 61 6e 64 20 2a   Right operand *
4370: 2f 0a 20 20 63 6f 6e 73 74 20 54 6f 6b 65 6e 20  /.  const Token 
4380: 2a 70 54 6f 6b 65 6e 20 20 20 20 20 2f 2a 20 41  *pToken     /* A
4390: 72 67 75 6d 65 6e 74 20 74 6f 6b 65 6e 20 2a 2f  rgument token */
43a0: 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70 3b 0a 20  .){.  Expr *p;. 
43b0: 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4e 44 20   if( op==TK_AND 
43c0: 26 26 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d  && pParse->nErr=
43d0: 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 61 6b  =0 ){.    /* Tak
43e0: 65 20 61 64 76 61 6e 74 61 67 65 20 6f 66 20 73  e advantage of s
43f0: 68 6f 72 74 2d 63 69 72 63 75 69 74 20 66 61 6c  hort-circuit fal
4400: 73 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  se optimization 
4410: 66 6f 72 20 41 4e 44 20 2a 2f 0a 20 20 20 20 70  for AND */.    p
4420: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e   = sqlite3ExprAn
4430: 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c  d(pParse->db, pL
4440: 65 66 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20  eft, pRight);.  
4450: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 20 3d 20 73  }else{.    p = s
4460: 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28  qlite3ExprAlloc(
4470: 70 50 61 72 73 65 2d 3e 64 62 2c 20 6f 70 20 26  pParse->db, op &
4480: 20 54 4b 46 4c 47 5f 4d 41 53 4b 2c 20 70 54 6f   TKFLG_MASK, pTo
4490: 6b 65 6e 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c  ken, 1);.    sql
44a0: 69 74 65 33 45 78 70 72 41 74 74 61 63 68 53 75  ite3ExprAttachSu
44b0: 62 74 72 65 65 73 28 70 50 61 72 73 65 2d 3e 64  btrees(pParse->d
44c0: 62 2c 20 70 2c 20 70 4c 65 66 74 2c 20 70 52 69  b, p, pLeft, pRi
44d0: 67 68 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ght);.  }.  if( 
44e0: 70 20 29 20 7b 0a 20 20 20 20 73 71 6c 69 74 65  p ) {.    sqlite
44f0: 33 45 78 70 72 43 68 65 63 6b 48 65 69 67 68 74  3ExprCheckHeight
4500: 28 70 50 61 72 73 65 2c 20 70 2d 3e 6e 48 65 69  (pParse, p->nHei
4510: 67 68 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ght);.  }.  retu
4520: 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  rn p;.}../*.** I
4530: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
4540: 20 69 73 20 61 6c 77 61 79 73 20 65 69 74 68 65   is always eithe
4550: 72 20 54 52 55 45 20 6f 72 20 46 41 4c 53 45 20  r TRUE or FALSE 
4560: 28 72 65 73 70 65 63 74 69 76 65 6c 79 29 2c 0a  (respectively),.
4570: 2a 2a 20 74 68 65 6e 20 72 65 74 75 72 6e 20 31  ** then return 1
4580: 2e 20 20 49 66 20 6f 6e 65 20 63 61 6e 6e 6f 74  .  If one cannot
4590: 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 74   determine the t
45a0: 72 75 74 68 20 76 61 6c 75 65 20 6f 66 20 74 68  ruth value of th
45b0: 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20  e.** expression 
45c0: 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  at compile-time 
45d0: 72 65 74 75 72 6e 20 30 2e 0a 2a 2a 0a 2a 2a 20  return 0..**.** 
45e0: 54 68 69 73 20 69 73 20 61 6e 20 6f 70 74 69 6d  This is an optim
45f0: 69 7a 61 74 69 6f 6e 2e 20 20 49 66 20 69 73 20  ization.  If is 
4600: 4f 4b 20 74 6f 20 72 65 74 75 72 6e 20 30 20 68  OK to return 0 h
4610: 65 72 65 20 65 76 65 6e 20 69 66 0a 2a 2a 20 74  ere even if.** t
4620: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 72 65  he expression re
4630: 61 6c 6c 79 20 69 73 20 61 6c 77 61 79 73 20 66  ally is always f
4640: 61 6c 73 65 20 6f 72 20 66 61 6c 73 65 20 28 61  alse or false (a
4650: 20 66 61 6c 73 65 20 6e 65 67 61 74 69 76 65 29   false negative)
4660: 2e 0a 2a 2a 20 42 75 74 20 69 74 20 69 73 20 61  ..** But it is a
4670: 20 62 75 67 20 74 6f 20 72 65 74 75 72 6e 20 31   bug to return 1
4680: 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
4690: 6f 6e 20 6d 69 67 68 74 20 68 61 76 65 20 64 69  on might have di
46a0: 66 66 65 72 65 6e 74 0a 2a 2a 20 62 6f 6f 6c 65  fferent.** boole
46b0: 61 6e 20 76 61 6c 75 65 73 20 69 6e 20 64 69 66  an values in dif
46c0: 66 65 72 65 6e 74 20 63 69 72 63 75 6d 73 74 61  ferent circumsta
46d0: 6e 63 65 73 20 28 61 20 66 61 6c 73 65 20 70 6f  nces (a false po
46e0: 73 69 74 69 76 65 2e 29 0a 2a 2a 0a 2a 2a 20 4e  sitive.).**.** N
46f0: 6f 74 65 20 74 68 61 74 20 69 66 20 74 68 65 20  ote that if the 
4700: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 70 61  expression is pa
4710: 72 74 20 6f 66 20 63 6f 6e 64 69 74 69 6f 6e 61  rt of conditiona
4720: 6c 20 66 6f 72 20 61 0a 2a 2a 20 4c 45 46 54 20  l for a.** LEFT 
4730: 4a 4f 49 4e 2c 20 74 68 65 6e 20 77 65 20 63 61  JOIN, then we ca
4740: 6e 6e 6f 74 20 64 65 74 65 72 6d 69 6e 65 20 61  nnot determine a
4750: 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 77  t compile-time w
4760: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a  hether or not.**
4770: 20 69 73 20 69 74 20 74 72 75 65 20 6f 72 20 66   is it true or f
4780: 61 6c 73 65 2c 20 73 6f 20 61 6c 77 61 79 73 20  alse, so always 
4790: 72 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61  return 0..*/.sta
47a0: 74 69 63 20 69 6e 74 20 65 78 70 72 41 6c 77 61  tic int exprAlwa
47b0: 79 73 54 72 75 65 28 45 78 70 72 20 2a 70 29 7b  ysTrue(Expr *p){
47c0: 0a 20 20 69 6e 74 20 76 20 3d 20 30 3b 0a 20 20  .  int v = 0;.  
47d0: 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
47e0: 72 74 79 28 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f  rty(p, EP_FromJo
47f0: 69 6e 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  in) ) return 0;.
4800: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 45 78    if( !sqlite3Ex
4810: 70 72 49 73 49 6e 74 65 67 65 72 28 70 2c 20 26  prIsInteger(p, &
4820: 76 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  v) ) return 0;. 
4830: 20 72 65 74 75 72 6e 20 76 21 3d 30 3b 0a 7d 0a   return v!=0;.}.
4840: 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 41  static int exprA
4850: 6c 77 61 79 73 46 61 6c 73 65 28 45 78 70 72 20  lwaysFalse(Expr 
4860: 2a 70 29 7b 0a 20 20 69 6e 74 20 76 20 3d 20 30  *p){.  int v = 0
4870: 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50  ;.  if( ExprHasP
4880: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 46 72  roperty(p, EP_Fr
4890: 6f 6d 4a 6f 69 6e 29 20 29 20 72 65 74 75 72 6e  omJoin) ) return
48a0: 20 30 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74   0;.  if( !sqlit
48b0: 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28  e3ExprIsInteger(
48c0: 70 2c 20 26 76 29 20 29 20 72 65 74 75 72 6e 20  p, &v) ) return 
48d0: 30 3b 0a 20 20 72 65 74 75 72 6e 20 76 3d 3d 30  0;.  return v==0
48e0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 69 6e 20  ;.}../*.** Join 
48f0: 74 77 6f 20 65 78 70 72 65 73 73 69 6f 6e 73 20  two expressions 
4900: 75 73 69 6e 67 20 61 6e 20 41 4e 44 20 6f 70 65  using an AND ope
4910: 72 61 74 6f 72 2e 20 20 49 66 20 65 69 74 68 65  rator.  If eithe
4920: 72 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 0a  r expression is.
4930: 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 6a 75  ** NULL, then ju
4940: 73 74 20 72 65 74 75 72 6e 20 74 68 65 20 6f 74  st return the ot
4950: 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a  her expression..
4960: 2a 2a 0a 2a 2a 20 49 66 20 6f 6e 65 20 73 69 64  **.** If one sid
4970: 65 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20 6f  e or the other o
4980: 66 20 74 68 65 20 41 4e 44 20 69 73 20 6b 6e 6f  f the AND is kno
4990: 77 6e 20 74 6f 20 62 65 20 66 61 6c 73 65 2c 20  wn to be false, 
49a0: 74 68 65 6e 20 69 6e 73 74 65 61 64 0a 2a 2a 20  then instead.** 
49b0: 6f 66 20 72 65 74 75 72 6e 69 6e 67 20 61 6e 20  of returning an 
49c0: 41 4e 44 20 65 78 70 72 65 73 73 69 6f 6e 2c 20  AND expression, 
49d0: 6a 75 73 74 20 72 65 74 75 72 6e 20 61 20 63 6f  just return a co
49e0: 6e 73 74 61 6e 74 20 65 78 70 72 65 73 73 69 6f  nstant expressio
49f0: 6e 20 77 69 74 68 0a 2a 2a 20 61 20 76 61 6c 75  n with.** a valu
4a00: 65 20 6f 66 20 66 61 6c 73 65 2e 0a 2a 2f 0a 45  e of false..*/.E
4a10: 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72  xpr *sqlite3Expr
4a20: 41 6e 64 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  And(sqlite3 *db,
4a30: 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 45 78   Expr *pLeft, Ex
4a40: 70 72 20 2a 70 52 69 67 68 74 29 7b 0a 20 20 69  pr *pRight){.  i
4a50: 66 28 20 70 4c 65 66 74 3d 3d 30 20 29 7b 0a 20  f( pLeft==0 ){. 
4a60: 20 20 20 72 65 74 75 72 6e 20 70 52 69 67 68 74     return pRight
4a70: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 52  ;.  }else if( pR
4a80: 69 67 68 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72  ight==0 ){.    r
4a90: 65 74 75 72 6e 20 70 4c 65 66 74 3b 0a 20 20 7d  eturn pLeft;.  }
4aa0: 65 6c 73 65 20 69 66 28 20 65 78 70 72 41 6c 77  else if( exprAlw
4ab0: 61 79 73 46 61 6c 73 65 28 70 4c 65 66 74 29 20  aysFalse(pLeft) 
4ac0: 7c 7c 20 65 78 70 72 41 6c 77 61 79 73 46 61 6c  || exprAlwaysFal
4ad0: 73 65 28 70 52 69 67 68 74 29 20 29 7b 0a 20 20  se(pRight) ){.  
4ae0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
4af0: 65 74 65 28 64 62 2c 20 70 4c 65 66 74 29 3b 0a  ete(db, pLeft);.
4b00: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
4b10: 65 6c 65 74 65 28 64 62 2c 20 70 52 69 67 68 74  elete(db, pRight
4b20: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71  );.    return sq
4b30: 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 64  lite3ExprAlloc(d
4b40: 62 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c 20 26  b, TK_INTEGER, &
4b50: 73 71 6c 69 74 65 33 49 6e 74 54 6f 6b 65 6e 73  sqlite3IntTokens
4b60: 5b 30 5d 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65  [0], 0);.  }else
4b70: 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77  {.    Expr *pNew
4b80: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c   = sqlite3ExprAl
4b90: 6c 6f 63 28 64 62 2c 20 54 4b 5f 41 4e 44 2c 20  loc(db, TK_AND, 
4ba0: 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
4bb0: 65 33 45 78 70 72 41 74 74 61 63 68 53 75 62 74  e3ExprAttachSubt
4bc0: 72 65 65 73 28 64 62 2c 20 70 4e 65 77 2c 20 70  rees(db, pNew, p
4bd0: 4c 65 66 74 2c 20 70 52 69 67 68 74 29 3b 0a 20  Left, pRight);. 
4be0: 20 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a     return pNew;.
4bf0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e    }.}../*.** Con
4c00: 73 74 72 75 63 74 20 61 20 6e 65 77 20 65 78 70  struct a new exp
4c10: 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 66 6f 72  ression node for
4c20: 20 61 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68   a function with
4c30: 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 61 72 67   multiple.** arg
4c40: 75 6d 65 6e 74 73 2e 0a 2a 2f 0a 45 78 70 72 20  uments..*/.Expr 
4c50: 2a 73 71 6c 69 74 65 33 45 78 70 72 46 75 6e 63  *sqlite3ExprFunc
4c60: 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72  tion(Parse *pPar
4c70: 73 65 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  se, ExprList *pL
4c80: 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b  ist, Token *pTok
4c90: 65 6e 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65  en){.  Expr *pNe
4ca0: 77 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  w;.  sqlite3 *db
4cb0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
4cc0: 20 61 73 73 65 72 74 28 20 70 54 6f 6b 65 6e 20   assert( pToken 
4cd0: 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  );.  pNew = sqli
4ce0: 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c  te3ExprAlloc(db,
4cf0: 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 2c 20 70 54   TK_FUNCTION, pT
4d00: 6f 6b 65 6e 2c 20 31 29 3b 0a 20 20 69 66 28 20  oken, 1);.  if( 
4d10: 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 73  pNew==0 ){.    s
4d20: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
4d30: 6c 65 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b  lete(db, pList);
4d40: 20 2f 2a 20 41 76 6f 69 64 20 6d 65 6d 6f 72 79   /* Avoid memory
4d50: 20 6c 65 61 6b 20 77 68 65 6e 20 6d 61 6c 6c 6f   leak when mallo
4d60: 63 20 66 61 69 6c 73 20 2a 2f 0a 20 20 20 20 72  c fails */.    r
4d70: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70  eturn 0;.  }.  p
4d80: 4e 65 77 2d 3e 78 2e 70 4c 69 73 74 20 3d 20 70  New->x.pList = p
4d90: 4c 69 73 74 3b 0a 20 20 61 73 73 65 72 74 28 20  List;.  assert( 
4da0: 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
4db0: 28 70 4e 65 77 2c 20 45 50 5f 78 49 73 53 65 6c  (pNew, EP_xIsSel
4dc0: 65 63 74 29 20 29 3b 0a 20 20 73 71 6c 69 74 65  ect) );.  sqlite
4dd0: 33 45 78 70 72 53 65 74 48 65 69 67 68 74 41 6e  3ExprSetHeightAn
4de0: 64 46 6c 61 67 73 28 70 50 61 72 73 65 2c 20 70  dFlags(pParse, p
4df0: 4e 65 77 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  New);.  return p
4e00: 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73  New;.}../*.** As
4e10: 73 69 67 6e 20 61 20 76 61 72 69 61 62 6c 65 20  sign a variable 
4e20: 6e 75 6d 62 65 72 20 74 6f 20 61 6e 20 65 78 70  number to an exp
4e30: 72 65 73 73 69 6f 6e 20 74 68 61 74 20 65 6e 63  ression that enc
4e40: 6f 64 65 73 20 61 20 77 69 6c 64 63 61 72 64 0a  odes a wildcard.
4e50: 2a 2a 20 69 6e 20 74 68 65 20 6f 72 69 67 69 6e  ** in the origin
4e60: 61 6c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  al SQL statement
4e70: 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61  .  .**.** Wildca
4e80: 72 64 73 20 63 6f 6e 73 69 73 74 69 6e 67 20 6f  rds consisting o
4e90: 66 20 61 20 73 69 6e 67 6c 65 20 22 3f 22 20 61  f a single "?" a
4ea0: 72 65 20 61 73 73 69 67 6e 65 64 20 74 68 65 20  re assigned the 
4eb0: 6e 65 78 74 20 73 65 71 75 65 6e 74 69 61 6c 0a  next sequential.
4ec0: 2a 2a 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62  ** variable numb
4ed0: 65 72 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61  er..**.** Wildca
4ee0: 72 64 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  rds of the form 
4ef0: 22 3f 6e 6e 6e 22 20 61 72 65 20 61 73 73 69 67  "?nnn" are assig
4f00: 6e 65 64 20 74 68 65 20 6e 75 6d 62 65 72 20 22  ned the number "
4f10: 6e 6e 6e 22 2e 20 20 57 65 20 6d 61 6b 65 0a 2a  nnn".  We make.*
4f20: 2a 20 73 75 72 65 20 22 6e 6e 6e 22 20 69 73 20  * sure "nnn" is 
4f30: 6e 6f 74 20 74 6f 6f 20 62 65 20 74 6f 20 61 76  not too be to av
4f40: 6f 69 64 20 61 20 64 65 6e 69 61 6c 20 6f 66 20  oid a denial of 
4f50: 73 65 72 76 69 63 65 20 61 74 74 61 63 6b 20 77  service attack w
4f60: 68 65 6e 0a 2a 2a 20 74 68 65 20 53 51 4c 20 73  hen.** the SQL s
4f70: 74 61 74 65 6d 65 6e 74 20 63 6f 6d 65 73 20 66  tatement comes f
4f80: 72 6f 6d 20 61 6e 20 65 78 74 65 72 6e 61 6c 20  rom an external 
4f90: 73 6f 75 72 63 65 2e 0a 2a 2a 0a 2a 2a 20 57 69  source..**.** Wi
4fa0: 6c 64 63 61 72 64 73 20 6f 66 20 74 68 65 20 66  ldcards of the f
4fb0: 6f 72 6d 20 22 3a 61 61 61 22 2c 20 22 40 61 61  orm ":aaa", "@aa
4fc0: 61 22 2c 20 6f 72 20 22 24 61 61 61 22 20 61 72  a", or "$aaa" ar
4fd0: 65 20 61 73 73 69 67 6e 65 64 20 74 68 65 20 73  e assigned the s
4fe0: 61 6d 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 61 73  ame number.** as
4ff0: 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 69 6e   the previous in
5000: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 73 61  stance of the sa
5010: 6d 65 20 77 69 6c 64 63 61 72 64 2e 20 20 4f 72  me wildcard.  Or
5020: 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65 20   if this is the 
5030: 66 69 72 73 74 0a 2a 2a 20 69 6e 73 74 61 6e 63  first.** instanc
5040: 65 20 6f 66 20 74 68 65 20 77 69 6c 64 63 61 72  e of the wildcar
5050: 64 2c 20 74 68 65 20 6e 65 78 74 20 73 65 71 75  d, the next sequ
5060: 65 6e 74 69 61 6c 20 76 61 72 69 61 62 6c 65 20  ential variable 
5070: 6e 75 6d 62 65 72 20 69 73 0a 2a 2a 20 61 73 73  number is.** ass
5080: 69 67 6e 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  igned..*/.void s
5090: 71 6c 69 74 65 33 45 78 70 72 41 73 73 69 67 6e  qlite3ExprAssign
50a0: 56 61 72 4e 75 6d 62 65 72 28 50 61 72 73 65 20  VarNumber(Parse 
50b0: 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
50c0: 45 78 70 72 29 7b 0a 20 20 73 71 6c 69 74 65 33  Expr){.  sqlite3
50d0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
50e0: 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  b;.  const char 
50f0: 2a 7a 3b 0a 0a 20 20 69 66 28 20 70 45 78 70 72  *z;..  if( pExpr
5100: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
5110: 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
5120: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
5130: 45 50 5f 49 6e 74 56 61 6c 75 65 7c 45 50 5f 52  EP_IntValue|EP_R
5140: 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f  educed|EP_TokenO
5150: 6e 6c 79 29 20 29 3b 0a 20 20 7a 20 3d 20 70 45  nly) );.  z = pE
5160: 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20  xpr->u.zToken;. 
5170: 20 61 73 73 65 72 74 28 20 7a 21 3d 30 20 29 3b   assert( z!=0 );
5180: 0a 20 20 61 73 73 65 72 74 28 20 7a 5b 30 5d 21  .  assert( z[0]!
5190: 3d 30 20 29 3b 0a 20 20 69 66 28 20 7a 5b 31 5d  =0 );.  if( z[1]
51a0: 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 57 69  ==0 ){.    /* Wi
51b0: 6c 64 63 61 72 64 20 6f 66 20 74 68 65 20 66 6f  ldcard of the fo
51c0: 72 6d 20 22 3f 22 2e 20 20 41 73 73 69 67 6e 20  rm "?".  Assign 
51d0: 74 68 65 20 6e 65 78 74 20 76 61 72 69 61 62 6c  the next variabl
51e0: 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20  e number */.    
51f0: 61 73 73 65 72 74 28 20 7a 5b 30 5d 3d 3d 27 3f  assert( z[0]=='?
5200: 27 20 29 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e  ' );.    pExpr->
5210: 69 43 6f 6c 75 6d 6e 20 3d 20 28 79 6e 56 61 72  iColumn = (ynVar
5220: 29 28 2b 2b 70 50 61 72 73 65 2d 3e 6e 56 61 72  )(++pParse->nVar
5230: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
5240: 79 6e 56 61 72 20 78 20 3d 20 30 3b 0a 20 20 20  ynVar x = 0;.   
5250: 20 75 33 32 20 6e 20 3d 20 73 71 6c 69 74 65 33   u32 n = sqlite3
5260: 53 74 72 6c 65 6e 33 30 28 7a 29 3b 0a 20 20 20  Strlen30(z);.   
5270: 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 3f 27 20 29   if( z[0]=='?' )
5280: 7b 0a 20 20 20 20 20 20 2f 2a 20 57 69 6c 64 63  {.      /* Wildc
5290: 61 72 64 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  ard of the form 
52a0: 22 3f 6e 6e 6e 22 2e 20 20 43 6f 6e 76 65 72 74  "?nnn".  Convert
52b0: 20 22 6e 6e 6e 22 20 74 6f 20 61 6e 20 69 6e 74   "nnn" to an int
52c0: 65 67 65 72 20 61 6e 64 0a 20 20 20 20 20 20 2a  eger and.      *
52d0: 2a 20 75 73 65 20 69 74 20 61 73 20 74 68 65 20  * use it as the 
52e0: 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20  variable number 
52f0: 2a 2f 0a 20 20 20 20 20 20 69 36 34 20 69 3b 0a  */.      i64 i;.
5300: 20 20 20 20 20 20 69 6e 74 20 62 4f 6b 20 3d 20        int bOk = 
5310: 30 3d 3d 73 71 6c 69 74 65 33 41 74 6f 69 36 34  0==sqlite3Atoi64
5320: 28 26 7a 5b 31 5d 2c 20 26 69 2c 20 6e 2d 31 2c  (&z[1], &i, n-1,
5330: 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20   SQLITE_UTF8);. 
5340: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c       pExpr->iCol
5350: 75 6d 6e 20 3d 20 78 20 3d 20 28 79 6e 56 61 72  umn = x = (ynVar
5360: 29 69 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  )i;.      testca
5370: 73 65 28 20 69 3d 3d 30 20 29 3b 0a 20 20 20 20  se( i==0 );.    
5380: 20 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d 31    testcase( i==1
5390: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
53a0: 73 65 28 20 69 3d 3d 64 62 2d 3e 61 4c 69 6d 69  se( i==db->aLimi
53b0: 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56  t[SQLITE_LIMIT_V
53c0: 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 2d  ARIABLE_NUMBER]-
53d0: 31 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  1 );.      testc
53e0: 61 73 65 28 20 69 3d 3d 64 62 2d 3e 61 4c 69 6d  ase( i==db->aLim
53f0: 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
5400: 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d  VARIABLE_NUMBER]
5410: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 62 4f   );.      if( bO
5420: 6b 3d 3d 30 20 7c 7c 20 69 3c 31 20 7c 7c 20 69  k==0 || i<1 || i
5430: 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49  >db->aLimit[SQLI
5440: 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c  TE_LIMIT_VARIABL
5450: 45 5f 4e 55 4d 42 45 52 5d 20 29 7b 0a 20 20 20  E_NUMBER] ){.   
5460: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
5470: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 76 61  rMsg(pParse, "va
5480: 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 6d 75  riable number mu
5490: 73 74 20 62 65 20 62 65 74 77 65 65 6e 20 3f 31  st be between ?1
54a0: 20 61 6e 64 20 3f 25 64 22 2c 0a 20 20 20 20 20   and ?%d",.     
54b0: 20 20 20 20 20 20 20 64 62 2d 3e 61 4c 69 6d 69         db->aLimi
54c0: 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56  t[SQLITE_LIMIT_V
54d0: 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 29  ARIABLE_NUMBER])
54e0: 3b 0a 20 20 20 20 20 20 20 20 78 20 3d 20 30 3b  ;.        x = 0;
54f0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
5500: 66 28 20 69 3e 70 50 61 72 73 65 2d 3e 6e 56 61  f( i>pParse->nVa
5510: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61  r ){.        pPa
5520: 72 73 65 2d 3e 6e 56 61 72 20 3d 20 28 69 6e 74  rse->nVar = (int
5530: 29 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  )i;.      }.    
5540: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
5550: 57 69 6c 64 63 61 72 64 73 20 6c 69 6b 65 20 22  Wildcards like "
5560: 3a 61 61 61 22 2c 20 22 24 61 61 61 22 20 6f 72  :aaa", "$aaa" or
5570: 20 22 40 61 61 61 22 2e 20 20 52 65 75 73 65 20   "@aaa".  Reuse 
5580: 74 68 65 20 73 61 6d 65 20 76 61 72 69 61 62 6c  the same variabl
5590: 65 0a 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65  e.      ** numbe
55a0: 72 20 61 73 20 74 68 65 20 70 72 69 6f 72 20 61  r as the prior a
55b0: 70 70 65 61 72 61 6e 63 65 20 6f 66 20 74 68 65  ppearance of the
55c0: 20 73 61 6d 65 20 6e 61 6d 65 2c 20 6f 72 20 69   same name, or i
55d0: 66 20 74 68 65 20 6e 61 6d 65 0a 20 20 20 20 20  f the name.     
55e0: 20 2a 2a 20 68 61 73 20 6e 65 76 65 72 20 61 70   ** has never ap
55f0: 70 65 61 72 65 64 20 62 65 66 6f 72 65 2c 20 72  peared before, r
5600: 65 75 73 65 20 74 68 65 20 73 61 6d 65 20 76 61  euse the same va
5610: 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 0a 20 20  riable number.  
5620: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 79 6e 56      */.      ynV
5630: 61 72 20 69 3b 0a 20 20 20 20 20 20 66 6f 72 28  ar i;.      for(
5640: 69 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e  i=0; i<pParse->n
5650: 7a 56 61 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  zVar; i++){.    
5660: 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e      if( pParse->
5670: 61 7a 56 61 72 5b 69 5d 20 26 26 20 73 74 72 63  azVar[i] && strc
5680: 6d 70 28 70 50 61 72 73 65 2d 3e 61 7a 56 61 72  mp(pParse->azVar
5690: 5b 69 5d 2c 7a 29 3d 3d 30 20 29 7b 0a 20 20 20  [i],z)==0 ){.   
56a0: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43         pExpr->iC
56b0: 6f 6c 75 6d 6e 20 3d 20 78 20 3d 20 28 79 6e 56  olumn = x = (ynV
56c0: 61 72 29 69 2b 31 3b 0a 20 20 20 20 20 20 20 20  ar)i+1;.        
56d0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
56e0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
56f0: 20 69 66 28 20 78 3d 3d 30 20 29 20 78 20 3d 20   if( x==0 ) x = 
5700: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d  pExpr->iColumn =
5710: 20 28 79 6e 56 61 72 29 28 2b 2b 70 50 61 72 73   (ynVar)(++pPars
5720: 65 2d 3e 6e 56 61 72 29 3b 0a 20 20 20 20 7d 0a  e->nVar);.    }.
5730: 20 20 20 20 69 66 28 20 78 3e 30 20 29 7b 0a 20      if( x>0 ){. 
5740: 20 20 20 20 20 69 66 28 20 78 3e 70 50 61 72 73       if( x>pPars
5750: 65 2d 3e 6e 7a 56 61 72 20 29 7b 0a 20 20 20 20  e->nzVar ){.    
5760: 20 20 20 20 63 68 61 72 20 2a 2a 61 3b 0a 20 20      char **a;.  
5770: 20 20 20 20 20 20 61 20 3d 20 73 71 6c 69 74 65        a = sqlite
5780: 33 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70  3DbRealloc(db, p
5790: 50 61 72 73 65 2d 3e 61 7a 56 61 72 2c 20 78 2a  Parse->azVar, x*
57a0: 73 69 7a 65 6f 66 28 61 5b 30 5d 29 29 3b 0a 20  sizeof(a[0]));. 
57b0: 20 20 20 20 20 20 20 69 66 28 20 61 3d 3d 30 20         if( a==0 
57c0: 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 45 72  ) return;  /* Er
57d0: 72 6f 72 20 72 65 70 6f 72 74 65 64 20 74 68 72  ror reported thr
57e0: 6f 75 67 68 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ough db->mallocF
57f0: 61 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20 20  ailed */.       
5800: 20 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 20 3d   pParse->azVar =
5810: 20 61 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73   a;.        mems
5820: 65 74 28 26 61 5b 70 50 61 72 73 65 2d 3e 6e 7a  et(&a[pParse->nz
5830: 56 61 72 5d 2c 20 30 2c 20 28 78 2d 70 50 61 72  Var], 0, (x-pPar
5840: 73 65 2d 3e 6e 7a 56 61 72 29 2a 73 69 7a 65 6f  se->nzVar)*sizeo
5850: 66 28 61 5b 30 5d 29 29 3b 0a 20 20 20 20 20 20  f(a[0]));.      
5860: 20 20 70 50 61 72 73 65 2d 3e 6e 7a 56 61 72 20    pParse->nzVar 
5870: 3d 20 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = x;.      }.   
5880: 20 20 20 69 66 28 20 7a 5b 30 5d 21 3d 27 3f 27     if( z[0]!='?'
5890: 20 7c 7c 20 70 50 61 72 73 65 2d 3e 61 7a 56 61   || pParse->azVa
58a0: 72 5b 78 2d 31 5d 3d 3d 30 20 29 7b 0a 20 20 20  r[x-1]==0 ){.   
58b0: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
58c0: 65 65 28 64 62 2c 20 70 50 61 72 73 65 2d 3e 61  ee(db, pParse->a
58d0: 7a 56 61 72 5b 78 2d 31 5d 29 3b 0a 20 20 20 20  zVar[x-1]);.    
58e0: 20 20 20 20 70 50 61 72 73 65 2d 3e 61 7a 56 61      pParse->azVa
58f0: 72 5b 78 2d 31 5d 20 3d 20 73 71 6c 69 74 65 33  r[x-1] = sqlite3
5900: 44 62 53 74 72 4e 44 75 70 28 64 62 2c 20 7a 2c  DbStrNDup(db, z,
5910: 20 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   n);.      }.   
5920: 20 7d 0a 20 20 7d 20 0a 20 20 69 66 28 20 21 70   }.  } .  if( !p
5930: 50 61 72 73 65 2d 3e 6e 45 72 72 20 26 26 20 70  Parse->nErr && p
5940: 50 61 72 73 65 2d 3e 6e 56 61 72 3e 64 62 2d 3e  Parse->nVar>db->
5950: 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
5960: 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d  MIT_VARIABLE_NUM
5970: 42 45 52 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69  BER] ){.    sqli
5980: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
5990: 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 53 51  se, "too many SQ
59a0: 4c 20 76 61 72 69 61 62 6c 65 73 22 29 3b 0a 20  L variables");. 
59b0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 75   }.}../*.** Recu
59c0: 72 73 69 76 65 6c 79 20 64 65 6c 65 74 65 20 61  rsively delete a
59d0: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  n expression tre
59e0: 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
59f0: 65 33 45 78 70 72 44 65 6c 65 74 65 28 73 71 6c  e3ExprDelete(sql
5a00: 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a  ite3 *db, Expr *
5a10: 70 29 7b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29  p){.  if( p==0 )
5a20: 20 72 65 74 75 72 6e 3b 0a 20 20 2f 2a 20 53 61   return;.  /* Sa
5a30: 6e 69 74 79 20 63 68 65 63 6b 3a 20 41 73 73 65  nity check: Asse
5a40: 72 74 20 74 68 61 74 20 74 68 65 20 49 6e 74 56  rt that the IntV
5a50: 61 6c 75 65 20 69 73 20 6e 6f 6e 2d 6e 65 67 61  alue is non-nega
5a60: 74 69 76 65 20 69 66 20 69 74 20 65 78 69 73 74  tive if it exist
5a70: 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21  s */.  assert( !
5a80: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
5a90: 70 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20  p, EP_IntValue) 
5aa0: 7c 7c 20 70 2d 3e 75 2e 69 56 61 6c 75 65 3e 3d  || p->u.iValue>=
5ab0: 30 20 29 3b 0a 20 20 69 66 28 20 21 45 78 70 72  0 );.  if( !Expr
5ac0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
5ad0: 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a  P_TokenOnly) ){.
5ae0: 20 20 20 20 2f 2a 20 54 68 65 20 45 78 70 72 2e      /* The Expr.
5af0: 78 20 75 6e 69 6f 6e 20 69 73 20 6e 65 76 65 72  x union is never
5b00: 20 75 73 65 64 20 61 74 20 74 68 65 20 73 61 6d   used at the sam
5b10: 65 20 74 69 6d 65 20 61 73 20 45 78 70 72 2e 70  e time as Expr.p
5b20: 52 69 67 68 74 20 2a 2f 0a 20 20 20 20 61 73 73  Right */.    ass
5b30: 65 72 74 28 20 70 2d 3e 78 2e 70 4c 69 73 74 3d  ert( p->x.pList=
5b40: 3d 30 20 7c 7c 20 70 2d 3e 70 52 69 67 68 74 3d  =0 || p->pRight=
5b50: 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  =0 );.    sqlite
5b60: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
5b70: 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 73  p->pLeft);.    s
5b80: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
5b90: 28 64 62 2c 20 70 2d 3e 70 52 69 67 68 74 29 3b  (db, p->pRight);
5ba0: 0a 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73  .    if( ExprHas
5bb0: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 4d  Property(p, EP_M
5bc0: 65 6d 54 6f 6b 65 6e 29 20 29 20 73 71 6c 69 74  emToken) ) sqlit
5bd0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
5be0: 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 69  u.zToken);.    i
5bf0: 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
5c00: 74 79 28 70 2c 20 45 50 5f 78 49 73 53 65 6c 65  ty(p, EP_xIsSele
5c10: 63 74 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ct) ){.      sql
5c20: 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
5c30: 28 64 62 2c 20 70 2d 3e 78 2e 70 53 65 6c 65 63  (db, p->x.pSelec
5c40: 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  t);.    }else{. 
5c50: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
5c60: 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
5c70: 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20  ->x.pList);.    
5c80: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 21 45 78 70  }.  }.  if( !Exp
5c90: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
5ca0: 45 50 5f 53 74 61 74 69 63 29 20 29 7b 0a 20 20  EP_Static) ){.  
5cb0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
5cc0: 64 62 2c 20 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  db, p);.  }.}../
5cd0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
5ce0: 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
5cf0: 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 74 68  allocated for th
5d00: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 73 74 72  e expression str
5d10: 75 63 74 75 72 65 20 0a 2a 2a 20 70 61 73 73 65  ucture .** passe
5d20: 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61  d as the first a
5d30: 72 67 75 6d 65 6e 74 2e 20 54 68 69 73 20 69 73  rgument. This is
5d40: 20 61 6c 77 61 79 73 20 6f 6e 65 20 6f 66 20 45   always one of E
5d50: 58 50 52 5f 46 55 4c 4c 53 49 5a 45 2c 0a 2a 2a  XPR_FULLSIZE,.**
5d60: 20 45 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a   EXPR_REDUCEDSIZ
5d70: 45 20 6f 72 20 45 58 50 52 5f 54 4f 4b 45 4e 4f  E or EXPR_TOKENO
5d80: 4e 4c 59 53 49 5a 45 2e 0a 2a 2f 0a 73 74 61 74  NLYSIZE..*/.stat
5d90: 69 63 20 69 6e 74 20 65 78 70 72 53 74 72 75 63  ic int exprStruc
5da0: 74 53 69 7a 65 28 45 78 70 72 20 2a 70 29 7b 0a  tSize(Expr *p){.
5db0: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
5dc0: 70 65 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65  perty(p, EP_Toke
5dd0: 6e 4f 6e 6c 79 29 20 29 20 72 65 74 75 72 6e 20  nOnly) ) return 
5de0: 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49  EXPR_TOKENONLYSI
5df0: 5a 45 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61  ZE;.  if( ExprHa
5e00: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
5e10: 52 65 64 75 63 65 64 29 20 29 20 72 65 74 75 72  Reduced) ) retur
5e20: 6e 20 45 58 50 52 5f 52 45 44 55 43 45 44 53 49  n EXPR_REDUCEDSI
5e30: 5a 45 3b 0a 20 20 72 65 74 75 72 6e 20 45 58 50  ZE;.  return EXP
5e40: 52 5f 46 55 4c 4c 53 49 5a 45 3b 0a 7d 0a 0a 2f  R_FULLSIZE;.}../
5e50: 2a 0a 2a 2a 20 54 68 65 20 64 75 70 65 64 45 78  *.** The dupedEx
5e60: 70 72 2a 53 69 7a 65 28 29 20 72 6f 75 74 69 6e  pr*Size() routin
5e70: 65 73 20 65 61 63 68 20 72 65 74 75 72 6e 20 74  es each return t
5e80: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
5e90: 65 73 20 72 65 71 75 69 72 65 64 0a 2a 2a 20 74  es required.** t
5ea0: 6f 20 73 74 6f 72 65 20 61 20 63 6f 70 79 20 6f  o store a copy o
5eb0: 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  f an expression 
5ec0: 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  or expression tr
5ed0: 65 65 2e 20 20 54 68 65 79 20 64 69 66 66 65 72  ee.  They differ
5ee0: 20 69 6e 0a 2a 2a 20 68 6f 77 20 6d 75 63 68 20   in.** how much 
5ef0: 6f 66 20 74 68 65 20 74 72 65 65 20 69 73 20 6d  of the tree is m
5f00: 65 61 73 75 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 20  easured..**.**  
5f10: 20 20 20 64 75 70 65 64 45 78 70 72 53 74 72 75     dupedExprStru
5f20: 63 74 53 69 7a 65 28 29 20 20 20 20 20 53 69 7a  ctSize()     Siz
5f30: 65 20 6f 66 20 6f 6e 6c 79 20 74 68 65 20 45 78  e of only the Ex
5f40: 70 72 20 73 74 72 75 63 74 75 72 65 20 0a 2a 2a  pr structure .**
5f50: 20 20 20 20 20 64 75 70 65 64 45 78 70 72 4e 6f       dupedExprNo
5f60: 64 65 53 69 7a 65 28 29 20 20 20 20 20 20 20 53  deSize()       S
5f70: 69 7a 65 20 6f 66 20 45 78 70 72 20 2b 20 73 70  ize of Expr + sp
5f80: 61 63 65 20 66 6f 72 20 74 6f 6b 65 6e 0a 2a 2a  ace for token.**
5f90: 20 20 20 20 20 64 75 70 65 64 45 78 70 72 53 69       dupedExprSi
5fa0: 7a 65 28 29 20 20 20 20 20 20 20 20 20 20 20 45  ze()           E
5fb0: 78 70 72 20 2b 20 74 6f 6b 65 6e 20 2b 20 73 75  xpr + token + su
5fc0: 62 74 72 65 65 20 63 6f 6d 70 6f 6e 65 6e 74 73  btree components
5fd0: 0a 2a 2a 0a 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 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6010: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
6020: 2a 2a 0a 2a 2a 20 54 68 65 20 64 75 70 65 64 45  **.** The dupedE
6030: 78 70 72 53 74 72 75 63 74 53 69 7a 65 28 29 20  xprStructSize() 
6040: 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
6050: 20 74 77 6f 20 76 61 6c 75 65 73 20 4f 52 2d 65   two values OR-e
6060: 64 20 74 6f 67 65 74 68 65 72 3a 20 20 0a 2a 2a  d together:  .**
6070: 20 28 31 29 20 74 68 65 20 73 70 61 63 65 20 72   (1) the space r
6080: 65 71 75 69 72 65 64 20 66 6f 72 20 61 20 63 6f  equired for a co
6090: 70 79 20 6f 66 20 74 68 65 20 45 78 70 72 20 73  py of the Expr s
60a0: 74 72 75 63 74 75 72 65 20 6f 6e 6c 79 20 61 6e  tructure only an
60b0: 64 20 0a 2a 2a 20 28 32 29 20 74 68 65 20 45 50  d .** (2) the EP
60c0: 5f 78 78 78 20 66 6c 61 67 73 20 74 68 61 74 20  _xxx flags that 
60d0: 69 6e 64 69 63 61 74 65 20 77 68 61 74 20 74 68  indicate what th
60e0: 65 20 73 74 72 75 63 74 75 72 65 20 73 69 7a 65  e structure size
60f0: 20 73 68 6f 75 6c 64 20 62 65 2e 0a 2a 2a 20 54   should be..** T
6100: 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 73  he return values
6110: 20 69 73 20 61 6c 77 61 79 73 20 6f 6e 65 20 6f   is always one o
6120: 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 45 58  f:.**.**      EX
6130: 50 52 5f 46 55 4c 4c 53 49 5a 45 0a 2a 2a 20 20  PR_FULLSIZE.**  
6140: 20 20 20 20 45 58 50 52 5f 52 45 44 55 43 45 44      EXPR_REDUCED
6150: 53 49 5a 45 20 20 20 7c 20 45 50 5f 52 65 64 75  SIZE   | EP_Redu
6160: 63 65 64 0a 2a 2a 20 20 20 20 20 20 45 58 50 52  ced.**      EXPR
6170: 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 20 7c  _TOKENONLYSIZE |
6180: 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 0a 2a 2a   EP_TokenOnly.**
6190: 0a 2a 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20  .** The size of 
61a0: 74 68 65 20 73 74 72 75 63 74 75 72 65 20 63 61  the structure ca
61b0: 6e 20 62 65 20 66 6f 75 6e 64 20 62 79 20 6d 61  n be found by ma
61c0: 73 6b 69 6e 67 20 74 68 65 20 72 65 74 75 72 6e  sking the return
61d0: 20 76 61 6c 75 65 0a 2a 2a 20 6f 66 20 74 68 69   value.** of thi
61e0: 73 20 72 6f 75 74 69 6e 65 20 77 69 74 68 20 30  s routine with 0
61f0: 78 66 66 66 2e 20 20 54 68 65 20 66 6c 61 67 73  xfff.  The flags
6200: 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 20 62 79   can be found by
6210: 20 6d 61 73 6b 69 6e 67 20 74 68 65 0a 2a 2a 20   masking the.** 
6220: 72 65 74 75 72 6e 20 76 61 6c 75 65 20 77 69 74  return value wit
6230: 68 20 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f  h EP_Reduced|EP_
6240: 54 6f 6b 65 6e 4f 6e 6c 79 2e 0a 2a 2a 0a 2a 2a  TokenOnly..**.**
6250: 20 4e 6f 74 65 20 74 68 61 74 20 77 69 74 68 20   Note that with 
6260: 66 6c 61 67 73 3d 3d 45 58 50 52 44 55 50 5f 52  flags==EXPRDUP_R
6270: 45 44 55 43 45 2c 20 74 68 69 73 20 72 6f 75 74  EDUCE, this rout
6280: 69 6e 65 73 20 77 6f 72 6b 73 20 6f 6e 20 66 75  ines works on fu
6290: 6c 6c 2d 73 69 7a 65 0a 2a 2a 20 28 75 6e 72 65  ll-size.** (unre
62a0: 64 75 63 65 64 29 20 45 78 70 72 20 6f 62 6a 65  duced) Expr obje
62b0: 63 74 73 20 61 73 20 74 68 65 79 20 6f 72 20 6f  cts as they or o
62c0: 72 69 67 69 6e 61 6c 6c 79 20 63 6f 6e 73 74 72  riginally constr
62d0: 75 63 74 65 64 20 62 79 20 74 68 65 20 70 61 72  ucted by the par
62e0: 73 65 72 2e 0a 2a 2a 20 44 75 72 69 6e 67 20 65  ser..** During e
62f0: 78 70 72 65 73 73 69 6f 6e 20 61 6e 61 6c 79 73  xpression analys
6300: 69 73 2c 20 65 78 74 72 61 20 69 6e 66 6f 72 6d  is, extra inform
6310: 61 74 69 6f 6e 20 69 73 20 63 6f 6d 70 75 74 65  ation is compute
6320: 64 20 61 6e 64 20 6d 6f 76 65 64 20 69 6e 74 6f  d and moved into
6330: 0a 2a 2a 20 6c 61 74 65 72 20 70 61 72 74 73 20  .** later parts 
6340: 6f 66 20 74 65 68 20 45 78 70 72 20 6f 62 6a 65  of teh Expr obje
6350: 63 74 20 61 6e 64 20 74 68 61 74 20 65 78 74 72  ct and that extr
6360: 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6d 69  a information mi
6370: 67 68 74 20 67 65 74 20 63 68 6f 70 70 65 64 0a  ght get chopped.
6380: 2a 2a 20 6f 66 66 20 69 66 20 74 68 65 20 65 78  ** off if the ex
6390: 70 72 65 73 73 69 6f 6e 20 69 73 20 72 65 64 75  pression is redu
63a0: 63 65 64 2e 20 20 4e 6f 74 65 20 61 6c 73 6f 20  ced.  Note also 
63b0: 74 68 61 74 20 69 74 20 64 6f 65 73 20 6e 6f 74  that it does not
63c0: 20 77 6f 72 6b 20 74 6f 0a 2a 2a 20 6d 61 6b 65   work to.** make
63d0: 20 61 6e 20 45 58 50 52 44 55 50 5f 52 45 44 55   an EXPRDUP_REDU
63e0: 43 45 20 63 6f 70 79 20 6f 66 20 61 20 72 65 64  CE copy of a red
63f0: 75 63 65 64 20 65 78 70 72 65 73 73 69 6f 6e 2e  uced expression.
6400: 20 20 49 74 20 69 73 20 6f 6e 6c 79 20 6c 65 67    It is only leg
6410: 61 6c 0a 2a 2a 20 74 6f 20 72 65 64 75 63 65 20  al.** to reduce 
6420: 61 20 70 72 69 73 74 69 6e 65 20 65 78 70 72 65  a pristine expre
6430: 73 73 69 6f 6e 20 74 72 65 65 20 66 72 6f 6d 20  ssion tree from 
6440: 74 68 65 20 70 61 72 73 65 72 2e 20 20 54 68 65  the parser.  The
6450: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 0a   implementation.
6460: 2a 2a 20 6f 66 20 64 75 70 65 64 45 78 70 72 53  ** of dupedExprS
6470: 74 72 75 63 74 53 69 7a 65 28 29 20 63 6f 6e 74  tructSize() cont
6480: 61 69 6e 20 6d 75 6c 74 69 70 6c 65 20 61 73 73  ain multiple ass
6490: 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73  ert() statements
64a0: 20 74 68 61 74 20 61 74 74 65 6d 70 74 0a 2a 2a   that attempt.**
64b0: 20 74 6f 20 65 6e 66 6f 72 63 65 20 74 68 69 73   to enforce this
64c0: 20 63 6f 6e 73 74 72 61 69 6e 74 2e 0a 2a 2f 0a   constraint..*/.
64d0: 73 74 61 74 69 63 20 69 6e 74 20 64 75 70 65 64  static int duped
64e0: 45 78 70 72 53 74 72 75 63 74 53 69 7a 65 28 45  ExprStructSize(E
64f0: 78 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67  xpr *p, int flag
6500: 73 29 7b 0a 20 20 69 6e 74 20 6e 53 69 7a 65 3b  s){.  int nSize;
6510: 0a 20 20 61 73 73 65 72 74 28 20 66 6c 61 67 73  .  assert( flags
6520: 3d 3d 45 58 50 52 44 55 50 5f 52 45 44 55 43 45  ==EXPRDUP_REDUCE
6530: 20 7c 7c 20 66 6c 61 67 73 3d 3d 30 20 29 3b 20   || flags==0 ); 
6540: 2f 2a 20 4f 6e 6c 79 20 6f 6e 65 20 66 6c 61 67  /* Only one flag
6550: 20 76 61 6c 75 65 20 61 6c 6c 6f 77 65 64 20 2a   value allowed *
6560: 2f 0a 20 20 61 73 73 65 72 74 28 20 45 58 50 52  /.  assert( EXPR
6570: 5f 46 55 4c 4c 53 49 5a 45 3c 3d 30 78 66 66 66  _FULLSIZE<=0xfff
6580: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 30   );.  assert( (0
6590: 78 66 66 66 20 26 20 28 45 50 5f 52 65 64 75 63  xfff & (EP_Reduc
65a0: 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29  ed|EP_TokenOnly)
65b0: 29 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 30 3d  )==0 );.  if( 0=
65c0: 3d 28 66 6c 61 67 73 26 45 58 50 52 44 55 50 5f  =(flags&EXPRDUP_
65d0: 52 45 44 55 43 45 29 20 29 7b 0a 20 20 20 20 6e  REDUCE) ){.    n
65e0: 53 69 7a 65 20 3d 20 45 58 50 52 5f 46 55 4c 4c  Size = EXPR_FULL
65f0: 53 49 5a 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  SIZE;.  }else{. 
6600: 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
6610: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
6620: 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52  P_TokenOnly|EP_R
6630: 65 64 75 63 65 64 29 20 29 3b 0a 20 20 20 20 61  educed) );.    a
6640: 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
6650: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 46 72  roperty(p, EP_Fr
6660: 6f 6d 4a 6f 69 6e 29 20 29 3b 20 0a 20 20 20 20  omJoin) ); .    
6670: 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
6680: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 4d  Property(p, EP_M
6690: 65 6d 54 6f 6b 65 6e 29 20 29 3b 0a 20 20 20 20  emToken) );.    
66a0: 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
66b0: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 4e  Property(p, EP_N
66c0: 6f 52 65 64 75 63 65 29 20 29 3b 0a 20 20 20 20  oReduce) );.    
66d0: 69 66 28 20 70 2d 3e 70 4c 65 66 74 20 7c 7c 20  if( p->pLeft || 
66e0: 70 2d 3e 78 2e 70 4c 69 73 74 20 29 7b 0a 20 20  p->x.pList ){.  
66f0: 20 20 20 20 6e 53 69 7a 65 20 3d 20 45 58 50 52      nSize = EXPR
6700: 5f 52 45 44 55 43 45 44 53 49 5a 45 20 7c 20 45  _REDUCEDSIZE | E
6710: 50 5f 52 65 64 75 63 65 64 3b 0a 20 20 20 20 7d  P_Reduced;.    }
6720: 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
6730: 72 74 28 20 70 2d 3e 70 52 69 67 68 74 3d 3d 30  rt( p->pRight==0
6740: 20 29 3b 0a 20 20 20 20 20 20 6e 53 69 7a 65 20   );.      nSize 
6750: 3d 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59  = EXPR_TOKENONLY
6760: 53 49 5a 45 20 7c 20 45 50 5f 54 6f 6b 65 6e 4f  SIZE | EP_TokenO
6770: 6e 6c 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  nly;.    }.  }. 
6780: 20 72 65 74 75 72 6e 20 6e 53 69 7a 65 3b 0a 7d   return nSize;.}
6790: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
67a0: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68  ction returns th
67b0: 65 20 73 70 61 63 65 20 69 6e 20 62 79 74 65 73  e space in bytes
67c0: 20 72 65 71 75 69 72 65 64 20 74 6f 20 73 74 6f   required to sto
67d0: 72 65 20 74 68 65 20 63 6f 70 79 20 0a 2a 2a 20  re the copy .** 
67e0: 6f 66 20 74 68 65 20 45 78 70 72 20 73 74 72 75  of the Expr stru
67f0: 63 74 75 72 65 20 61 6e 64 20 61 20 63 6f 70 79  cture and a copy
6800: 20 6f 66 20 74 68 65 20 45 78 70 72 2e 75 2e 7a   of the Expr.u.z
6810: 54 6f 6b 65 6e 20 73 74 72 69 6e 67 20 28 69 66  Token string (if
6820: 20 74 68 61 74 0a 2a 2a 20 73 74 72 69 6e 67 20   that.** string 
6830: 69 73 20 64 65 66 69 6e 65 64 2e 29 0a 2a 2f 0a  is defined.).*/.
6840: 73 74 61 74 69 63 20 69 6e 74 20 64 75 70 65 64  static int duped
6850: 45 78 70 72 4e 6f 64 65 53 69 7a 65 28 45 78 70  ExprNodeSize(Exp
6860: 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29  r *p, int flags)
6870: 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20  {.  int nByte = 
6880: 64 75 70 65 64 45 78 70 72 53 74 72 75 63 74 53  dupedExprStructS
6890: 69 7a 65 28 70 2c 20 66 6c 61 67 73 29 20 26 20  ize(p, flags) & 
68a0: 30 78 66 66 66 3b 0a 20 20 69 66 28 20 21 45 78  0xfff;.  if( !Ex
68b0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
68c0: 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 26 26   EP_IntValue) &&
68d0: 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 29 7b 0a   p->u.zToken ){.
68e0: 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 73 71 6c      nByte += sql
68f0: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 2d 3e  ite3Strlen30(p->
6900: 75 2e 7a 54 6f 6b 65 6e 29 2b 31 3b 0a 20 20 7d  u.zToken)+1;.  }
6910: 0a 20 20 72 65 74 75 72 6e 20 52 4f 55 4e 44 38  .  return ROUND8
6920: 28 6e 42 79 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  (nByte);.}../*.*
6930: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
6940: 62 65 72 20 6f 66 20 62 79 74 65 73 20 72 65 71  ber of bytes req
6950: 75 69 72 65 64 20 74 6f 20 63 72 65 61 74 65 20  uired to create 
6960: 61 20 64 75 70 6c 69 63 61 74 65 20 6f 66 20 74  a duplicate of t
6970: 68 65 20 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  he .** expressio
6980: 6e 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  n passed as the 
6990: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20  first argument. 
69a0: 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  The second argum
69b0: 65 6e 74 20 69 73 20 61 0a 2a 2a 20 6d 61 73 6b  ent is a.** mask
69c0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 45 58 50 52   containing EXPR
69d0: 44 55 50 5f 58 58 58 20 66 6c 61 67 73 2e 0a 2a  DUP_XXX flags..*
69e0: 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 72  *.** The value r
69f0: 65 74 75 72 6e 65 64 20 69 6e 63 6c 75 64 65 73  eturned includes
6a00: 20 73 70 61 63 65 20 74 6f 20 63 72 65 61 74 65   space to create
6a10: 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 45   a copy of the E
6a20: 78 70 72 20 73 74 72 75 63 74 0a 2a 2a 20 69 74  xpr struct.** it
6a30: 73 65 6c 66 20 61 6e 64 20 74 68 65 20 62 75 66  self and the buf
6a40: 66 65 72 20 72 65 66 65 72 72 65 64 20 74 6f 20  fer referred to 
6a50: 62 79 20 45 78 70 72 2e 75 2e 7a 54 6f 6b 65 6e  by Expr.u.zToken
6a60: 2c 20 69 66 20 61 6e 79 2e 0a 2a 2a 0a 2a 2a 20  , if any..**.** 
6a70: 49 66 20 74 68 65 20 45 58 50 52 44 55 50 5f 52  If the EXPRDUP_R
6a80: 45 44 55 43 45 20 66 6c 61 67 20 69 73 20 73 65  EDUCE flag is se
6a90: 74 2c 20 74 68 65 6e 20 74 68 65 20 72 65 74 75  t, then the retu
6aa0: 72 6e 20 76 61 6c 75 65 20 69 6e 63 6c 75 64 65  rn value include
6ab0: 73 20 0a 2a 2a 20 73 70 61 63 65 20 74 6f 20 64  s .** space to d
6ac0: 75 70 6c 69 63 61 74 65 20 61 6c 6c 20 45 78 70  uplicate all Exp
6ad0: 72 20 6e 6f 64 65 73 20 69 6e 20 74 68 65 20 74  r nodes in the t
6ae0: 72 65 65 20 66 6f 72 6d 65 64 20 62 79 20 45 78  ree formed by Ex
6af0: 70 72 2e 70 4c 65 66 74 20 0a 2a 2a 20 61 6e 64  pr.pLeft .** and
6b00: 20 45 78 70 72 2e 70 52 69 67 68 74 20 76 61 72   Expr.pRight var
6b10: 69 61 62 6c 65 73 20 28 62 75 74 20 6e 6f 74 20  iables (but not 
6b20: 66 6f 72 20 61 6e 79 20 73 74 72 75 63 74 75 72  for any structur
6b30: 65 73 20 70 6f 69 6e 74 65 64 20 74 6f 20 6f 72  es pointed to or
6b40: 20 0a 2a 2a 20 64 65 73 63 65 6e 64 65 64 20 66   .** descended f
6b50: 72 6f 6d 20 74 68 65 20 45 78 70 72 2e 78 2e 70  rom the Expr.x.p
6b60: 4c 69 73 74 20 6f 72 20 45 78 70 72 2e 78 2e 70  List or Expr.x.p
6b70: 53 65 6c 65 63 74 20 76 61 72 69 61 62 6c 65 73  Select variables
6b80: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
6b90: 20 64 75 70 65 64 45 78 70 72 53 69 7a 65 28 45   dupedExprSize(E
6ba0: 78 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67  xpr *p, int flag
6bb0: 73 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 20  s){.  int nByte 
6bc0: 3d 20 30 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a  = 0;.  if( p ){.
6bd0: 20 20 20 20 6e 42 79 74 65 20 3d 20 64 75 70 65      nByte = dupe
6be0: 64 45 78 70 72 4e 6f 64 65 53 69 7a 65 28 70 2c  dExprNodeSize(p,
6bf0: 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 69 66 28   flags);.    if(
6c00: 20 66 6c 61 67 73 26 45 58 50 52 44 55 50 5f 52   flags&EXPRDUP_R
6c10: 45 44 55 43 45 20 29 7b 0a 20 20 20 20 20 20 6e  EDUCE ){.      n
6c20: 42 79 74 65 20 2b 3d 20 64 75 70 65 64 45 78 70  Byte += dupedExp
6c30: 72 53 69 7a 65 28 70 2d 3e 70 4c 65 66 74 2c 20  rSize(p->pLeft, 
6c40: 66 6c 61 67 73 29 20 2b 20 64 75 70 65 64 45 78  flags) + dupedEx
6c50: 70 72 53 69 7a 65 28 70 2d 3e 70 52 69 67 68 74  prSize(p->pRight
6c60: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 7d 0a  , flags);.    }.
6c70: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 42 79    }.  return nBy
6c80: 74 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  te;.}../*.** Thi
6c90: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 73 69  s function is si
6ca0: 6d 69 6c 61 72 20 74 6f 20 73 71 6c 69 74 65 33  milar to sqlite3
6cb0: 45 78 70 72 44 75 70 28 29 2c 20 65 78 63 65 70  ExprDup(), excep
6cc0: 74 20 74 68 61 74 20 69 66 20 70 7a 42 75 66 66  t that if pzBuff
6cd0: 65 72 20 0a 2a 2a 20 69 73 20 6e 6f 74 20 4e 55  er .** is not NU
6ce0: 4c 4c 20 74 68 65 6e 20 2a 70 7a 42 75 66 66 65  LL then *pzBuffe
6cf0: 72 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20  r is assumed to 
6d00: 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65  point to a buffe
6d10: 72 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 0a  r large enough .
6d20: 2a 2a 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20  ** to store the 
6d30: 63 6f 70 79 20 6f 66 20 65 78 70 72 65 73 73 69  copy of expressi
6d40: 6f 6e 20 70 2c 20 74 68 65 20 63 6f 70 69 65 73  on p, the copies
6d50: 20 6f 66 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 0a   of p->u.zToken.
6d60: 2a 2a 20 28 69 66 20 61 70 70 6c 69 63 61 62 6c  ** (if applicabl
6d70: 65 29 2c 20 61 6e 64 20 74 68 65 20 63 6f 70 69  e), and the copi
6d80: 65 73 20 6f 66 20 74 68 65 20 70 2d 3e 70 4c 65  es of the p->pLe
6d90: 66 74 20 61 6e 64 20 70 2d 3e 70 52 69 67 68 74  ft and p->pRight
6da0: 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 0a 2a 2a   expressions,.**
6db0: 20 69 66 20 61 6e 79 2e 20 42 65 66 6f 72 65 20   if any. Before 
6dc0: 72 65 74 75 72 6e 69 6e 67 2c 20 2a 70 7a 42 75  returning, *pzBu
6dd0: 66 66 65 72 20 69 73 20 73 65 74 20 74 6f 20 74  ffer is set to t
6de0: 68 65 20 66 69 72 73 74 20 62 79 74 65 20 70 61  he first byte pa
6df0: 73 74 20 74 68 65 0a 2a 2a 20 70 6f 72 74 69 6f  st the.** portio
6e00: 6e 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20  n of the buffer 
6e10: 63 6f 70 69 65 64 20 69 6e 74 6f 20 62 79 20 74  copied into by t
6e20: 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  his function..*/
6e30: 0a 73 74 61 74 69 63 20 45 78 70 72 20 2a 65 78  .static Expr *ex
6e40: 70 72 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64  prDup(sqlite3 *d
6e50: 62 2c 20 45 78 70 72 20 2a 70 2c 20 69 6e 74 20  b, Expr *p, int 
6e60: 66 6c 61 67 73 2c 20 75 38 20 2a 2a 70 7a 42 75  flags, u8 **pzBu
6e70: 66 66 65 72 29 7b 0a 20 20 45 78 70 72 20 2a 70  ffer){.  Expr *p
6e80: 4e 65 77 20 3d 20 30 3b 20 20 20 20 20 20 20 20  New = 0;        
6e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6ea0: 20 56 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e   Value to return
6eb0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 66 6c   */.  assert( fl
6ec0: 61 67 73 3d 3d 30 20 7c 7c 20 66 6c 61 67 73 3d  ags==0 || flags=
6ed0: 3d 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 20  =EXPRDUP_REDUCE 
6ee0: 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  );.  if( p ){.  
6ef0: 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 52 65    const int isRe
6f00: 64 75 63 65 64 20 3d 20 28 66 6c 61 67 73 26 45  duced = (flags&E
6f10: 58 50 52 44 55 50 5f 52 45 44 55 43 45 29 3b 0a  XPRDUP_REDUCE);.
6f20: 20 20 20 20 75 38 20 2a 7a 41 6c 6c 6f 63 3b 0a      u8 *zAlloc;.
6f30: 20 20 20 20 75 33 32 20 73 74 61 74 69 63 46 6c      u32 staticFl
6f40: 61 67 20 3d 20 30 3b 0a 0a 20 20 20 20 61 73 73  ag = 0;..    ass
6f50: 65 72 74 28 20 70 7a 42 75 66 66 65 72 3d 3d 30  ert( pzBuffer==0
6f60: 20 7c 7c 20 69 73 52 65 64 75 63 65 64 20 29 3b   || isReduced );
6f70: 0a 0a 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20  ..    /* Figure 
6f80: 6f 75 74 20 77 68 65 72 65 20 74 6f 20 77 72 69  out where to wri
6f90: 74 65 20 74 68 65 20 6e 65 77 20 45 78 70 72 20  te the new Expr 
6fa0: 73 74 72 75 63 74 75 72 65 2e 20 2a 2f 0a 20 20  structure. */.  
6fb0: 20 20 69 66 28 20 70 7a 42 75 66 66 65 72 20 29    if( pzBuffer )
6fc0: 7b 0a 20 20 20 20 20 20 7a 41 6c 6c 6f 63 20 3d  {.      zAlloc =
6fd0: 20 2a 70 7a 42 75 66 66 65 72 3b 0a 20 20 20 20   *pzBuffer;.    
6fe0: 20 20 73 74 61 74 69 63 46 6c 61 67 20 3d 20 45    staticFlag = E
6ff0: 50 5f 53 74 61 74 69 63 3b 0a 20 20 20 20 7d 65  P_Static;.    }e
7000: 6c 73 65 7b 0a 20 20 20 20 20 20 7a 41 6c 6c 6f  lse{.      zAllo
7010: 63 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  c = sqlite3DbMal
7020: 6c 6f 63 52 61 77 28 64 62 2c 20 64 75 70 65 64  locRaw(db, duped
7030: 45 78 70 72 53 69 7a 65 28 70 2c 20 66 6c 61 67  ExprSize(p, flag
7040: 73 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  s));.    }.    p
7050: 4e 65 77 20 3d 20 28 45 78 70 72 20 2a 29 7a 41  New = (Expr *)zA
7060: 6c 6c 6f 63 3b 0a 0a 20 20 20 20 69 66 28 20 70  lloc;..    if( p
7070: 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  New ){.      /* 
7080: 53 65 74 20 6e 4e 65 77 53 69 7a 65 20 74 6f 20  Set nNewSize to 
7090: 74 68 65 20 73 69 7a 65 20 61 6c 6c 6f 63 61 74  the size allocat
70a0: 65 64 20 66 6f 72 20 74 68 65 20 73 74 72 75 63  ed for the struc
70b0: 74 75 72 65 20 70 6f 69 6e 74 65 64 20 74 6f 0a  ture pointed to.
70c0: 20 20 20 20 20 20 2a 2a 20 62 79 20 70 4e 65 77        ** by pNew
70d0: 2e 20 54 68 69 73 20 69 73 20 65 69 74 68 65 72  . This is either
70e0: 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 2c 20   EXPR_FULLSIZE, 
70f0: 45 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45  EXPR_REDUCEDSIZE
7100: 20 6f 72 0a 20 20 20 20 20 20 2a 2a 20 45 58 50   or.      ** EXP
7110: 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 2e  R_TOKENONLYSIZE.
7120: 20 6e 54 6f 6b 65 6e 20 69 73 20 73 65 74 20 74   nToken is set t
7130: 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  o the number of 
7140: 62 79 74 65 73 20 63 6f 6e 73 75 6d 65 64 0a 20  bytes consumed. 
7150: 20 20 20 20 20 2a 2a 20 62 79 20 74 68 65 20 63       ** by the c
7160: 6f 70 79 20 6f 66 20 74 68 65 20 70 2d 3e 75 2e  opy of the p->u.
7170: 7a 54 6f 6b 65 6e 20 73 74 72 69 6e 67 20 28 69  zToken string (i
7180: 66 20 61 6e 79 29 2e 0a 20 20 20 20 20 20 2a 2f  f any)..      */
7190: 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 75 6e 73  .      const uns
71a0: 69 67 6e 65 64 20 6e 53 74 72 75 63 74 53 69 7a  igned nStructSiz
71b0: 65 20 3d 20 64 75 70 65 64 45 78 70 72 53 74 72  e = dupedExprStr
71c0: 75 63 74 53 69 7a 65 28 70 2c 20 66 6c 61 67 73  uctSize(p, flags
71d0: 29 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 69  );.      const i
71e0: 6e 74 20 6e 4e 65 77 53 69 7a 65 20 3d 20 6e 53  nt nNewSize = nS
71f0: 74 72 75 63 74 53 69 7a 65 20 26 20 30 78 66 66  tructSize & 0xff
7200: 66 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 54 6f  f;.      int nTo
7210: 6b 65 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 21  ken;.      if( !
7220: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
7230: 70 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20  p, EP_IntValue) 
7240: 26 26 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 29  && p->u.zToken )
7250: 7b 0a 20 20 20 20 20 20 20 20 6e 54 6f 6b 65 6e  {.        nToken
7260: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
7270: 33 30 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 20  30(p->u.zToken) 
7280: 2b 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  + 1;.      }else
7290: 7b 0a 20 20 20 20 20 20 20 20 6e 54 6f 6b 65 6e  {.        nToken
72a0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
72b0: 20 20 20 20 69 66 28 20 69 73 52 65 64 75 63 65      if( isReduce
72c0: 64 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  d ){.        ass
72d0: 65 72 74 28 20 45 78 70 72 48 61 73 50 72 6f 70  ert( ExprHasProp
72e0: 65 72 74 79 28 70 2c 20 45 50 5f 52 65 64 75 63  erty(p, EP_Reduc
72f0: 65 64 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ed)==0 );.      
7300: 20 20 6d 65 6d 63 70 79 28 7a 41 6c 6c 6f 63 2c    memcpy(zAlloc,
7310: 20 70 2c 20 6e 4e 65 77 53 69 7a 65 29 3b 0a 20   p, nNewSize);. 
7320: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
7330: 20 20 20 20 75 33 32 20 6e 53 69 7a 65 20 3d 20      u32 nSize = 
7340: 28 75 33 32 29 65 78 70 72 53 74 72 75 63 74 53  (u32)exprStructS
7350: 69 7a 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20  ize(p);.        
7360: 6d 65 6d 63 70 79 28 7a 41 6c 6c 6f 63 2c 20 70  memcpy(zAlloc, p
7370: 2c 20 6e 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  , nSize);.      
7380: 20 20 69 66 28 20 6e 53 69 7a 65 3c 45 58 50 52    if( nSize<EXPR
7390: 5f 46 55 4c 4c 53 49 5a 45 20 29 7b 20 0a 20 20  _FULLSIZE ){ .  
73a0: 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26          memset(&
73b0: 7a 41 6c 6c 6f 63 5b 6e 53 69 7a 65 5d 2c 20 30  zAlloc[nSize], 0
73c0: 2c 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 2d  , EXPR_FULLSIZE-
73d0: 6e 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20  nSize);.        
73e0: 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  }.      }..     
73f0: 20 2f 2a 20 53 65 74 20 74 68 65 20 45 50 5f 52   /* Set the EP_R
7400: 65 64 75 63 65 64 2c 20 45 50 5f 54 6f 6b 65 6e  educed, EP_Token
7410: 4f 6e 6c 79 2c 20 61 6e 64 20 45 50 5f 53 74 61  Only, and EP_Sta
7420: 74 69 63 20 66 6c 61 67 73 20 61 70 70 72 6f 70  tic flags approp
7430: 72 69 61 74 65 6c 79 2e 20 2a 2f 0a 20 20 20 20  riately. */.    
7440: 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 26 3d    pNew->flags &=
7450: 20 7e 28 45 50 5f 52 65 64 75 63 65 64 7c 45 50   ~(EP_Reduced|EP
7460: 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 53 74  _TokenOnly|EP_St
7470: 61 74 69 63 7c 45 50 5f 4d 65 6d 54 6f 6b 65 6e  atic|EP_MemToken
7480: 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 66  );.      pNew->f
7490: 6c 61 67 73 20 7c 3d 20 6e 53 74 72 75 63 74 53  lags |= nStructS
74a0: 69 7a 65 20 26 20 28 45 50 5f 52 65 64 75 63 65  ize & (EP_Reduce
74b0: 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 3b  d|EP_TokenOnly);
74c0: 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61  .      pNew->fla
74d0: 67 73 20 7c 3d 20 73 74 61 74 69 63 46 6c 61 67  gs |= staticFlag
74e0: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 70 79  ;..      /* Copy
74f0: 20 74 68 65 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e   the p->u.zToken
7500: 20 73 74 72 69 6e 67 2c 20 69 66 20 61 6e 79 2e   string, if any.
7510: 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6e 54   */.      if( nT
7520: 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  oken ){.        
7530: 63 68 61 72 20 2a 7a 54 6f 6b 65 6e 20 3d 20 70  char *zToken = p
7540: 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 3d 20  New->u.zToken = 
7550: 28 63 68 61 72 2a 29 26 7a 41 6c 6c 6f 63 5b 6e  (char*)&zAlloc[n
7560: 4e 65 77 53 69 7a 65 5d 3b 0a 20 20 20 20 20 20  NewSize];.      
7570: 20 20 6d 65 6d 63 70 79 28 7a 54 6f 6b 65 6e 2c    memcpy(zToken,
7580: 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 6e 54   p->u.zToken, nT
7590: 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  oken);.      }..
75a0: 20 20 20 20 20 20 69 66 28 20 30 3d 3d 28 28 70        if( 0==((p
75b0: 2d 3e 66 6c 61 67 73 7c 70 4e 65 77 2d 3e 66 6c  ->flags|pNew->fl
75c0: 61 67 73 29 20 26 20 45 50 5f 54 6f 6b 65 6e 4f  ags) & EP_TokenO
75d0: 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 20 20  nly) ){.        
75e0: 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 70  /* Fill in the p
75f0: 4e 65 77 2d 3e 78 2e 70 53 65 6c 65 63 74 20 6f  New->x.pSelect o
7600: 72 20 70 4e 65 77 2d 3e 78 2e 70 4c 69 73 74 20  r pNew->x.pList 
7610: 6d 65 6d 62 65 72 2e 20 2a 2f 0a 20 20 20 20 20  member. */.     
7620: 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72     if( ExprHasPr
7630: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 78 49 73  operty(p, EP_xIs
7640: 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20  Select) ){.     
7650: 20 20 20 20 20 70 4e 65 77 2d 3e 78 2e 70 53 65       pNew->x.pSe
7660: 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65  lect = sqlite3Se
7670: 6c 65 63 74 44 75 70 28 64 62 2c 20 70 2d 3e 78  lectDup(db, p->x
7680: 2e 70 53 65 6c 65 63 74 2c 20 69 73 52 65 64 75  .pSelect, isRedu
7690: 63 65 64 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  ced);.        }e
76a0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70  lse{.          p
76b0: 4e 65 77 2d 3e 78 2e 70 4c 69 73 74 20 3d 20 73  New->x.pList = s
76c0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
76d0: 70 28 64 62 2c 20 70 2d 3e 78 2e 70 4c 69 73 74  p(db, p->x.pList
76e0: 2c 20 69 73 52 65 64 75 63 65 64 29 3b 0a 20 20  , isReduced);.  
76f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
7700: 0a 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69  .      /* Fill i
7710: 6e 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 61 6e  n pNew->pLeft an
7720: 64 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 2e 20  d pNew->pRight. 
7730: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 45 78 70  */.      if( Exp
7740: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 4e 65  rHasProperty(pNe
7750: 77 2c 20 45 50 5f 52 65 64 75 63 65 64 7c 45 50  w, EP_Reduced|EP
7760: 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20  _TokenOnly) ){. 
7770: 20 20 20 20 20 20 20 7a 41 6c 6c 6f 63 20 2b 3d         zAlloc +=
7780: 20 64 75 70 65 64 45 78 70 72 4e 6f 64 65 53 69   dupedExprNodeSi
7790: 7a 65 28 70 2c 20 66 6c 61 67 73 29 3b 0a 20 20  ze(p, flags);.  
77a0: 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61        if( ExprHa
77b0: 73 50 72 6f 70 65 72 74 79 28 70 4e 65 77 2c 20  sProperty(pNew, 
77c0: 45 50 5f 52 65 64 75 63 65 64 29 20 29 7b 0a 20  EP_Reduced) ){. 
77d0: 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70           pNew->p
77e0: 4c 65 66 74 20 3d 20 65 78 70 72 44 75 70 28 64  Left = exprDup(d
77f0: 62 2c 20 70 2d 3e 70 4c 65 66 74 2c 20 45 58 50  b, p->pLeft, EXP
7800: 52 44 55 50 5f 52 45 44 55 43 45 2c 20 26 7a 41  RDUP_REDUCE, &zA
7810: 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20 20 20 20  lloc);.         
7820: 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 20 3d 20   pNew->pRight = 
7830: 65 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70  exprDup(db, p->p
7840: 52 69 67 68 74 2c 20 45 58 50 52 44 55 50 5f 52  Right, EXPRDUP_R
7850: 45 44 55 43 45 2c 20 26 7a 41 6c 6c 6f 63 29 3b  EDUCE, &zAlloc);
7860: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
7870: 20 20 20 69 66 28 20 70 7a 42 75 66 66 65 72 20     if( pzBuffer 
7880: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 7a  ){.          *pz
7890: 42 75 66 66 65 72 20 3d 20 7a 41 6c 6c 6f 63 3b  Buffer = zAlloc;
78a0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
78b0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
78c0: 69 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  if( !ExprHasProp
78d0: 65 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e  erty(p, EP_Token
78e0: 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 20  Only) ){.       
78f0: 20 20 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d     pNew->pLeft =
7900: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
7910: 64 62 2c 20 70 2d 3e 70 4c 65 66 74 2c 20 30 29  db, p->pLeft, 0)
7920: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77  ;.          pNew
7930: 2d 3e 70 52 69 67 68 74 20 3d 20 73 71 6c 69 74  ->pRight = sqlit
7940: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d  e3ExprDup(db, p-
7950: 3e 70 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 20  >pRight, 0);.   
7960: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a       }.      }..
7970: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
7980: 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pNew;.}../*.*
7990: 2a 20 43 72 65 61 74 65 20 61 6e 64 20 72 65 74  * Create and ret
79a0: 75 72 6e 20 61 20 64 65 65 70 20 63 6f 70 79 20  urn a deep copy 
79b0: 6f 66 20 74 68 65 20 6f 62 6a 65 63 74 20 70 61  of the object pa
79c0: 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
79d0: 6e 64 20 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e  nd .** argument.
79e0: 20 49 66 20 61 6e 20 4f 4f 4d 20 63 6f 6e 64 69   If an OOM condi
79f0: 74 69 6f 6e 20 69 73 20 65 6e 63 6f 75 6e 74 65  tion is encounte
7a00: 72 65 64 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74  red, NULL is ret
7a10: 75 72 6e 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65  urned.** and the
7a20: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
7a30: 64 20 66 6c 61 67 20 73 65 74 2e 0a 2a 2f 0a 23  d flag set..*/.#
7a40: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
7a50: 49 54 5f 43 54 45 0a 73 74 61 74 69 63 20 57 69  IT_CTE.static Wi
7a60: 74 68 20 2a 77 69 74 68 44 75 70 28 73 71 6c 69  th *withDup(sqli
7a70: 74 65 33 20 2a 64 62 2c 20 57 69 74 68 20 2a 70  te3 *db, With *p
7a80: 29 7b 0a 20 20 57 69 74 68 20 2a 70 52 65 74 20  ){.  With *pRet 
7a90: 3d 20 30 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a  = 0;.  if( p ){.
7aa0: 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20      int nByte = 
7ab0: 73 69 7a 65 6f 66 28 2a 70 29 20 2b 20 73 69 7a  sizeof(*p) + siz
7ac0: 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 2a 20 28  eof(p->a[0]) * (
7ad0: 70 2d 3e 6e 43 74 65 2d 31 29 3b 0a 20 20 20 20  p->nCte-1);.    
7ae0: 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33 44 62  pRet = sqlite3Db
7af0: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e  MallocZero(db, n
7b00: 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28 20 70  Byte);.    if( p
7b10: 52 65 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  Ret ){.      int
7b20: 20 69 3b 0a 20 20 20 20 20 20 70 52 65 74 2d 3e   i;.      pRet->
7b30: 6e 43 74 65 20 3d 20 70 2d 3e 6e 43 74 65 3b 0a  nCte = p->nCte;.
7b40: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
7b50: 3c 70 2d 3e 6e 43 74 65 3b 20 69 2b 2b 29 7b 0a  <p->nCte; i++){.
7b60: 20 20 20 20 20 20 20 20 70 52 65 74 2d 3e 61 5b          pRet->a[
7b70: 69 5d 2e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c  i].pSelect = sql
7b80: 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62  ite3SelectDup(db
7b90: 2c 20 70 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63  , p->a[i].pSelec
7ba0: 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70  t, 0);.        p
7bb0: 52 65 74 2d 3e 61 5b 69 5d 2e 70 43 6f 6c 73 20  Ret->a[i].pCols 
7bc0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
7bd0: 74 44 75 70 28 64 62 2c 20 70 2d 3e 61 5b 69 5d  tDup(db, p->a[i]
7be0: 2e 70 43 6f 6c 73 2c 20 30 29 3b 0a 20 20 20 20  .pCols, 0);.    
7bf0: 20 20 20 20 70 52 65 74 2d 3e 61 5b 69 5d 2e 7a      pRet->a[i].z
7c00: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62  Name = sqlite3Db
7c10: 53 74 72 44 75 70 28 64 62 2c 20 70 2d 3e 61 5b  StrDup(db, p->a[
7c20: 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  i].zName);.     
7c30: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
7c40: 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 23 65  eturn pRet;.}.#e
7c50: 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 77 69 74  lse.# define wit
7c60: 68 44 75 70 28 78 2c 79 29 20 30 0a 23 65 6e 64  hDup(x,y) 0.#end
7c70: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  if../*.** The fo
7c80: 6c 6c 6f 77 69 6e 67 20 67 72 6f 75 70 20 6f 66  llowing group of
7c90: 20 72 6f 75 74 69 6e 65 73 20 6d 61 6b 65 20 64   routines make d
7ca0: 65 65 70 20 63 6f 70 69 65 73 20 6f 66 20 65 78  eep copies of ex
7cb0: 70 72 65 73 73 69 6f 6e 73 2c 0a 2a 2a 20 65 78  pressions,.** ex
7cc0: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 73 2c 20  pression lists, 
7cd0: 49 44 20 6c 69 73 74 73 2c 20 61 6e 64 20 73 65  ID lists, and se
7ce0: 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 73 2e  lect statements.
7cf0: 20 20 54 68 65 20 63 6f 70 69 65 73 20 63 61 6e    The copies can
7d00: 0a 2a 2a 20 62 65 20 64 65 6c 65 74 65 64 20 28  .** be deleted (
7d10: 62 79 20 62 65 69 6e 67 20 70 61 73 73 65 64 20  by being passed 
7d20: 74 6f 20 74 68 65 69 72 20 72 65 73 70 65 63 74  to their respect
7d30: 69 76 65 20 2e 2e 2e 44 65 6c 65 74 65 28 29 20  ive ...Delete() 
7d40: 72 6f 75 74 69 6e 65 73 29 0a 2a 2a 20 77 69 74  routines).** wit
7d50: 68 6f 75 74 20 65 66 66 65 63 74 69 6e 67 20 74  hout effecting t
7d60: 68 65 20 6f 72 69 67 69 6e 61 6c 73 2e 0a 2a 2a  he originals..**
7d70: 0a 2a 2a 20 54 68 65 20 65 78 70 72 65 73 73 69  .** The expressi
7d80: 6f 6e 20 6c 69 73 74 2c 20 49 44 2c 20 61 6e 64  on list, ID, and
7d90: 20 73 6f 75 72 63 65 20 6c 69 73 74 73 20 72 65   source lists re
7da0: 74 75 72 6e 20 62 79 20 73 71 6c 69 74 65 33 45  turn by sqlite3E
7db0: 78 70 72 4c 69 73 74 44 75 70 28 29 2c 0a 2a 2a  xprListDup(),.**
7dc0: 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 75   sqlite3IdListDu
7dd0: 70 28 29 2c 20 61 6e 64 20 73 71 6c 69 74 65 33  p(), and sqlite3
7de0: 53 72 63 4c 69 73 74 44 75 70 28 29 20 63 61 6e  SrcListDup() can
7df0: 20 6e 6f 74 20 62 65 20 66 75 72 74 68 65 72 20   not be further 
7e00: 65 78 70 61 6e 64 65 64 20 0a 2a 2a 20 62 79 20  expanded .** by 
7e10: 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73  subsequent calls
7e20: 20 74 6f 20 73 71 6c 69 74 65 2a 4c 69 73 74 41   to sqlite*ListA
7e30: 70 70 65 6e 64 28 29 20 72 6f 75 74 69 6e 65 73  ppend() routines
7e40: 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 74 61 62 6c  ..**.** Any tabl
7e50: 65 73 20 74 68 61 74 20 74 68 65 20 53 72 63 4c  es that the SrcL
7e60: 69 73 74 20 6d 69 67 68 74 20 70 6f 69 6e 74 20  ist might point 
7e70: 74 6f 20 61 72 65 20 6e 6f 74 20 64 75 70 6c 69  to are not dupli
7e80: 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  cated..**.** The
7e90: 20 66 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72   flags parameter
7ea0: 20 63 6f 6e 74 61 69 6e 73 20 61 20 63 6f 6d 62   contains a comb
7eb0: 69 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 45  ination of the E
7ec0: 58 50 52 44 55 50 5f 58 58 58 20 66 6c 61 67 73  XPRDUP_XXX flags
7ed0: 2e 0a 2a 2a 20 49 66 20 74 68 65 20 45 58 50 52  ..** If the EXPR
7ee0: 44 55 50 5f 52 45 44 55 43 45 20 66 6c 61 67 20  DUP_REDUCE flag 
7ef0: 69 73 20 73 65 74 2c 20 74 68 65 6e 20 74 68 65  is set, then the
7f00: 20 73 74 72 75 63 74 75 72 65 20 72 65 74 75 72   structure retur
7f10: 6e 65 64 20 69 73 20 61 0a 2a 2a 20 74 72 75 6e  ned is a.** trun
7f20: 63 61 74 65 64 20 76 65 72 73 69 6f 6e 20 6f 66  cated version of
7f30: 20 74 68 65 20 75 73 75 61 6c 20 45 78 70 72 20   the usual Expr 
7f40: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 77  structure that w
7f50: 69 6c 6c 20 62 65 20 73 74 6f 72 65 64 20 61 73  ill be stored as
7f60: 0a 2a 2a 20 70 61 72 74 20 6f 66 20 74 68 65 20  .** part of the 
7f70: 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65 73  in-memory repres
7f80: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
7f90: 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e  database schema.
7fa0: 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65  .*/.Expr *sqlite
7fb0: 33 45 78 70 72 44 75 70 28 73 71 6c 69 74 65 33  3ExprDup(sqlite3
7fc0: 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 2c 20 69   *db, Expr *p, i
7fd0: 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 61 73 73  nt flags){.  ass
7fe0: 65 72 74 28 20 66 6c 61 67 73 3d 3d 30 20 7c 7c  ert( flags==0 ||
7ff0: 20 66 6c 61 67 73 3d 3d 45 58 50 52 44 55 50 5f   flags==EXPRDUP_
8000: 52 45 44 55 43 45 20 29 3b 0a 20 20 72 65 74 75  REDUCE );.  retu
8010: 72 6e 20 65 78 70 72 44 75 70 28 64 62 2c 20 70  rn exprDup(db, p
8020: 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 7d 0a 45  , flags, 0);.}.E
8030: 78 70 72 4c 69 73 74 20 2a 73 71 6c 69 74 65 33  xprList *sqlite3
8040: 45 78 70 72 4c 69 73 74 44 75 70 28 73 71 6c 69  ExprListDup(sqli
8050: 74 65 33 20 2a 64 62 2c 20 45 78 70 72 4c 69 73  te3 *db, ExprLis
8060: 74 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29  t *p, int flags)
8070: 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4e  {.  ExprList *pN
8080: 65 77 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70  ew;.  struct Exp
8090: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
80a0: 6d 2c 20 2a 70 4f 6c 64 49 74 65 6d 3b 0a 20 20  m, *pOldItem;.  
80b0: 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 3d 3d  int i;.  if( p==
80c0: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
80d0: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62  pNew = sqlite3Db
80e0: 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69  MallocRaw(db, si
80f0: 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20  zeof(*pNew) );. 
8100: 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72   if( pNew==0 ) r
8110: 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d  eturn 0;.  pNew-
8120: 3e 6e 45 78 70 72 20 3d 20 69 20 3d 20 70 2d 3e  >nExpr = i = p->
8130: 6e 45 78 70 72 3b 0a 20 20 69 66 28 20 28 66 6c  nExpr;.  if( (fl
8140: 61 67 73 20 26 20 45 58 50 52 44 55 50 5f 52 45  ags & EXPRDUP_RE
8150: 44 55 43 45 29 3d 3d 30 20 29 20 66 6f 72 28 69  DUCE)==0 ) for(i
8160: 3d 31 3b 20 69 3c 70 2d 3e 6e 45 78 70 72 3b 20  =1; i<p->nExpr; 
8170: 69 2b 3d 69 29 7b 7d 0a 20 20 70 4e 65 77 2d 3e  i+=i){}.  pNew->
8180: 61 20 3d 20 70 49 74 65 6d 20 3d 20 73 71 6c 69  a = pItem = sqli
8190: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64  te3DbMallocRaw(d
81a0: 62 2c 20 20 69 2a 73 69 7a 65 6f 66 28 70 2d 3e  b,  i*sizeof(p->
81b0: 61 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 70  a[0]) );.  if( p
81c0: 49 74 65 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 73  Item==0 ){.    s
81d0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
81e0: 20 70 4e 65 77 29 3b 0a 20 20 20 20 72 65 74 75   pNew);.    retu
81f0: 72 6e 20 30 3b 0a 20 20 7d 20 0a 20 20 70 4f 6c  rn 0;.  } .  pOl
8200: 64 49 74 65 6d 20 3d 20 70 2d 3e 61 3b 0a 20 20  dItem = p->a;.  
8210: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 45  for(i=0; i<p->nE
8220: 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b  xpr; i++, pItem+
8230: 2b 2c 20 70 4f 6c 64 49 74 65 6d 2b 2b 29 7b 0a  +, pOldItem++){.
8240: 20 20 20 20 45 78 70 72 20 2a 70 4f 6c 64 45 78      Expr *pOldEx
8250: 70 72 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70  pr = pOldItem->p
8260: 45 78 70 72 3b 0a 20 20 20 20 70 49 74 65 6d 2d  Expr;.    pItem-
8270: 3e 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  >pExpr = sqlite3
8280: 45 78 70 72 44 75 70 28 64 62 2c 20 70 4f 6c 64  ExprDup(db, pOld
8290: 45 78 70 72 2c 20 66 6c 61 67 73 29 3b 0a 20 20  Expr, flags);.  
82a0: 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d    pItem->zName =
82b0: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
82c0: 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a  (db, pOldItem->z
82d0: 4e 61 6d 65 29 3b 0a 20 20 20 20 70 49 74 65 6d  Name);.    pItem
82e0: 2d 3e 7a 53 70 61 6e 20 3d 20 73 71 6c 69 74 65  ->zSpan = sqlite
82f0: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f  3DbStrDup(db, pO
8300: 6c 64 49 74 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a  ldItem->zSpan);.
8310: 20 20 20 20 70 49 74 65 6d 2d 3e 73 6f 72 74 4f      pItem->sortO
8320: 72 64 65 72 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  rder = pOldItem-
8330: 3e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20  >sortOrder;.    
8340: 70 49 74 65 6d 2d 3e 64 6f 6e 65 20 3d 20 30 3b  pItem->done = 0;
8350: 0a 20 20 20 20 70 49 74 65 6d 2d 3e 62 53 70 61  .    pItem->bSpa
8360: 6e 49 73 54 61 62 20 3d 20 70 4f 6c 64 49 74 65  nIsTab = pOldIte
8370: 6d 2d 3e 62 53 70 61 6e 49 73 54 61 62 3b 0a 20  m->bSpanIsTab;. 
8380: 20 20 20 70 49 74 65 6d 2d 3e 75 20 3d 20 70 4f     pItem->u = pO
8390: 6c 64 49 74 65 6d 2d 3e 75 3b 0a 20 20 7d 0a 20  ldItem->u;.  }. 
83a0: 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a   return pNew;.}.
83b0: 0a 2f 2a 0a 2a 2a 20 49 66 20 63 75 72 73 6f 72  ./*.** If cursor
83c0: 73 2c 20 74 72 69 67 67 65 72 73 2c 20 76 69 65  s, triggers, vie
83d0: 77 73 20 61 6e 64 20 73 75 62 71 75 65 72 69 65  ws and subquerie
83e0: 73 20 61 72 65 20 61 6c 6c 20 6f 6d 69 74 74 65  s are all omitte
83f0: 64 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 62 75  d from.** the bu
8400: 69 6c 64 2c 20 74 68 65 6e 20 6e 6f 6e 65 20 6f  ild, then none o
8410: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
8420: 72 6f 75 74 69 6e 65 73 2c 20 65 78 63 65 70 74  routines, except
8430: 20 66 6f 72 20 0a 2a 2a 20 73 71 6c 69 74 65 33   for .** sqlite3
8440: 53 65 6c 65 63 74 44 75 70 28 29 2c 20 63 61 6e  SelectDup(), can
8450: 20 62 65 20 63 61 6c 6c 65 64 2e 20 73 71 6c 69   be called. sqli
8460: 74 65 33 53 65 6c 65 63 74 44 75 70 28 29 20 69  te3SelectDup() i
8470: 73 20 73 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20 63  s sometimes.** c
8480: 61 6c 6c 65 64 20 77 69 74 68 20 61 20 4e 55 4c  alled with a NUL
8490: 4c 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 23  L argument..*/.#
84a0: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
84b0: 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c  TE_OMIT_VIEW) ||
84c0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
84d0: 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 29 20 5c  _OMIT_TRIGGER) \
84e0: 0a 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  . || !defined(SQ
84f0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
8500: 52 59 29 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c  RY).SrcList *sql
8510: 69 74 65 33 53 72 63 4c 69 73 74 44 75 70 28 73  ite3SrcListDup(s
8520: 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 72 63 4c  qlite3 *db, SrcL
8530: 69 73 74 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67  ist *p, int flag
8540: 73 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  s){.  SrcList *p
8550: 4e 65 77 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  New;.  int i;.  
8560: 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 69 66 28  int nByte;.  if(
8570: 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30   p==0 ) return 0
8580: 3b 0a 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65  ;.  nByte = size
8590: 6f 66 28 2a 70 29 20 2b 20 28 70 2d 3e 6e 53 72  of(*p) + (p->nSr
85a0: 63 3e 30 20 3f 20 73 69 7a 65 6f 66 28 70 2d 3e  c>0 ? sizeof(p->
85b0: 61 5b 30 5d 29 20 2a 20 28 70 2d 3e 6e 53 72 63  a[0]) * (p->nSrc
85c0: 2d 31 29 20 3a 20 30 29 3b 0a 20 20 70 4e 65 77  -1) : 0);.  pNew
85d0: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
85e0: 6f 63 52 61 77 28 64 62 2c 20 6e 42 79 74 65 20  ocRaw(db, nByte 
85f0: 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30  );.  if( pNew==0
8600: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
8610: 4e 65 77 2d 3e 6e 53 72 63 20 3d 20 70 4e 65 77  New->nSrc = pNew
8620: 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 53  ->nAlloc = p->nS
8630: 72 63 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  rc;.  for(i=0; i
8640: 3c 70 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a  <p->nSrc; i++){.
8650: 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
8660: 73 74 5f 69 74 65 6d 20 2a 70 4e 65 77 49 74 65  st_item *pNewIte
8670: 6d 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b  m = &pNew->a[i];
8680: 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c  .    struct SrcL
8690: 69 73 74 5f 69 74 65 6d 20 2a 70 4f 6c 64 49 74  ist_item *pOldIt
86a0: 65 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20  em = &p->a[i];. 
86b0: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a     Table *pTab;.
86c0: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 53      pNewItem->pS
86d0: 63 68 65 6d 61 20 3d 20 70 4f 6c 64 49 74 65 6d  chema = pOldItem
86e0: 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 70  ->pSchema;.    p
86f0: 4e 65 77 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61  NewItem->zDataba
8700: 73 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  se = sqlite3DbSt
8710: 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65  rDup(db, pOldIte
8720: 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20  m->zDatabase);. 
8730: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61     pNewItem->zNa
8740: 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  me = sqlite3DbSt
8750: 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65  rDup(db, pOldIte
8760: 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70  m->zName);.    p
8770: 4e 65 77 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20  NewItem->zAlias 
8780: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
8790: 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e  p(db, pOldItem->
87a0: 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 70 4e 65  zAlias);.    pNe
87b0: 77 49 74 65 6d 2d 3e 66 67 20 3d 20 70 4f 6c 64  wItem->fg = pOld
87c0: 49 74 65 6d 2d 3e 66 67 3b 0a 20 20 20 20 70 4e  Item->fg;.    pN
87d0: 65 77 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20  ewItem->iCursor 
87e0: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 43 75 72  = pOldItem->iCur
87f0: 73 6f 72 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  sor;.    pNewIte
8800: 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 3d  m->addrFillSub =
8810: 20 70 4f 6c 64 49 74 65 6d 2d 3e 61 64 64 72 46   pOldItem->addrF
8820: 69 6c 6c 53 75 62 3b 0a 20 20 20 20 70 4e 65 77  illSub;.    pNew
8830: 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 20  Item->regReturn 
8840: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 72 65 67 52  = pOldItem->regR
8850: 65 74 75 72 6e 3b 0a 20 20 20 20 69 66 28 20 70  eturn;.    if( p
8860: 4e 65 77 49 74 65 6d 2d 3e 66 67 2e 69 73 49 6e  NewItem->fg.isIn
8870: 64 65 78 65 64 42 79 20 29 7b 0a 20 20 20 20 20  dexedBy ){.     
8880: 20 70 4e 65 77 49 74 65 6d 2d 3e 75 31 2e 7a 49   pNewItem->u1.zI
8890: 6e 64 65 78 65 64 42 79 20 3d 20 73 71 6c 69 74  ndexedBy = sqlit
88a0: 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70  e3DbStrDup(db, p
88b0: 4f 6c 64 49 74 65 6d 2d 3e 75 31 2e 7a 49 6e 64  OldItem->u1.zInd
88c0: 65 78 65 64 42 79 29 3b 0a 20 20 20 20 7d 0a 20  exedBy);.    }. 
88d0: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 49 42     pNewItem->pIB
88e0: 49 6e 64 65 78 20 3d 20 70 4f 6c 64 49 74 65 6d  Index = pOldItem
88f0: 2d 3e 70 49 42 49 6e 64 65 78 3b 0a 20 20 20 20  ->pIBIndex;.    
8900: 69 66 28 20 70 4e 65 77 49 74 65 6d 2d 3e 66 67  if( pNewItem->fg
8910: 2e 69 73 54 61 62 46 75 6e 63 20 29 7b 0a 20 20  .isTabFunc ){.  
8920: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 75 31      pNewItem->u1
8930: 2e 70 46 75 6e 63 41 72 67 20 3d 20 0a 20 20 20  .pFuncArg = .   
8940: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
8950: 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 4f  prListDup(db, pO
8960: 6c 64 49 74 65 6d 2d 3e 75 31 2e 70 46 75 6e 63  ldItem->u1.pFunc
8970: 41 72 67 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20  Arg, flags);.   
8980: 20 7d 0a 20 20 20 20 70 54 61 62 20 3d 20 70 4e   }.    pTab = pN
8990: 65 77 49 74 65 6d 2d 3e 70 54 61 62 20 3d 20 70  ewItem->pTab = p
89a0: 4f 6c 64 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20  OldItem->pTab;. 
89b0: 20 20 20 69 66 28 20 70 54 61 62 20 29 7b 0a 20     if( pTab ){. 
89c0: 20 20 20 20 20 70 54 61 62 2d 3e 6e 52 65 66 2b       pTab->nRef+
89d0: 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e 65  +;.    }.    pNe
89e0: 77 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 3d  wItem->pSelect =
89f0: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75   sqlite3SelectDu
8a00: 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e  p(db, pOldItem->
8a10: 70 53 65 6c 65 63 74 2c 20 66 6c 61 67 73 29 3b  pSelect, flags);
8a20: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70  .    pNewItem->p
8a30: 4f 6e 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  On = sqlite3Expr
8a40: 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d  Dup(db, pOldItem
8a50: 2d 3e 70 4f 6e 2c 20 66 6c 61 67 73 29 3b 0a 20  ->pOn, flags);. 
8a60: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 55 73     pNewItem->pUs
8a70: 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 49 64 4c  ing = sqlite3IdL
8a80: 69 73 74 44 75 70 28 64 62 2c 20 70 4f 6c 64 49  istDup(db, pOldI
8a90: 74 65 6d 2d 3e 70 55 73 69 6e 67 29 3b 0a 20 20  tem->pUsing);.  
8aa0: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 63 6f 6c 55    pNewItem->colU
8ab0: 73 65 64 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e  sed = pOldItem->
8ac0: 63 6f 6c 55 73 65 64 3b 0a 20 20 7d 0a 20 20 72  colUsed;.  }.  r
8ad0: 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 49 64  eturn pNew;.}.Id
8ae0: 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 49 64 4c  List *sqlite3IdL
8af0: 69 73 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a  istDup(sqlite3 *
8b00: 64 62 2c 20 49 64 4c 69 73 74 20 2a 70 29 7b 0a  db, IdList *p){.
8b10: 20 20 49 64 4c 69 73 74 20 2a 70 4e 65 77 3b 0a    IdList *pNew;.
8b20: 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70    int i;.  if( p
8b30: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
8b40: 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
8b50: 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20  DbMallocRaw(db, 
8b60: 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b  sizeof(*pNew) );
8b70: 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29  .  if( pNew==0 )
8b80: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65   return 0;.  pNe
8b90: 77 2d 3e 6e 49 64 20 3d 20 70 2d 3e 6e 49 64 3b  w->nId = p->nId;
8ba0: 0a 20 20 70 4e 65 77 2d 3e 61 20 3d 20 73 71 6c  .  pNew->a = sql
8bb0: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28  ite3DbMallocRaw(
8bc0: 64 62 2c 20 70 2d 3e 6e 49 64 2a 73 69 7a 65 6f  db, p->nId*sizeo
8bd0: 66 28 70 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20  f(p->a[0]) );.  
8be0: 69 66 28 20 70 4e 65 77 2d 3e 61 3d 3d 30 20 29  if( pNew->a==0 )
8bf0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  {.    sqlite3DbF
8c00: 72 65 65 28 64 62 2c 20 70 4e 65 77 29 3b 0a 20  ree(db, pNew);. 
8c10: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
8c20: 0a 20 20 2f 2a 20 4e 6f 74 65 20 74 68 61 74 20  .  /* Note that 
8c30: 62 65 63 61 75 73 65 20 74 68 65 20 73 69 7a 65  because the size
8c40: 20 6f 66 20 74 68 65 20 61 6c 6c 6f 63 61 74 69   of the allocati
8c50: 6f 6e 20 66 6f 72 20 70 2d 3e 61 5b 5d 20 69 73  on for p->a[] is
8c60: 20 6e 6f 74 0a 20 20 2a 2a 20 6e 65 63 65 73 73   not.  ** necess
8c70: 61 72 69 6c 79 20 61 20 70 6f 77 65 72 20 6f 66  arily a power of
8c80: 20 74 77 6f 2c 20 73 71 6c 69 74 65 33 49 64 4c   two, sqlite3IdL
8c90: 69 73 74 41 70 70 65 6e 64 28 29 20 6d 61 79 20  istAppend() may 
8ca0: 6e 6f 74 20 62 65 20 63 61 6c 6c 65 64 0a 20 20  not be called.  
8cb0: 2a 2a 20 6f 6e 20 74 68 65 20 64 75 70 6c 69 63  ** on the duplic
8cc0: 61 74 65 20 63 72 65 61 74 65 64 20 62 79 20 74  ate created by t
8cd0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 2a 2f  his function. */
8ce0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d  .  for(i=0; i<p-
8cf0: 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nId; i++){.    
8d00: 73 74 72 75 63 74 20 49 64 4c 69 73 74 5f 69 74  struct IdList_it
8d10: 65 6d 20 2a 70 4e 65 77 49 74 65 6d 20 3d 20 26  em *pNewItem = &
8d20: 70 4e 65 77 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20  pNew->a[i];.    
8d30: 73 74 72 75 63 74 20 49 64 4c 69 73 74 5f 69 74  struct IdList_it
8d40: 65 6d 20 2a 70 4f 6c 64 49 74 65 6d 20 3d 20 26  em *pOldItem = &
8d50: 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 70 4e 65  p->a[i];.    pNe
8d60: 77 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73  wItem->zName = s
8d70: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
8d80: 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61  b, pOldItem->zNa
8d90: 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  me);.    pNewIte
8da0: 6d 2d 3e 69 64 78 20 3d 20 70 4f 6c 64 49 74 65  m->idx = pOldIte
8db0: 6d 2d 3e 69 64 78 3b 0a 20 20 7d 0a 20 20 72 65  m->idx;.  }.  re
8dc0: 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 53 65 6c  turn pNew;.}.Sel
8dd0: 65 63 74 20 2a 73 71 6c 69 74 65 33 53 65 6c 65  ect *sqlite3Sele
8de0: 63 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64  ctDup(sqlite3 *d
8df0: 62 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e  b, Select *p, in
8e00: 74 20 66 6c 61 67 73 29 7b 0a 20 20 53 65 6c 65  t flags){.  Sele
8e10: 63 74 20 2a 70 4e 65 77 2c 20 2a 70 50 72 69 6f  ct *pNew, *pPrio
8e20: 72 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  r;.  if( p==0 ) 
8e30: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77  return 0;.  pNew
8e40: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
8e50: 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66  ocRaw(db, sizeof
8e60: 28 2a 70 29 20 29 3b 0a 20 20 69 66 28 20 70 4e  (*p) );.  if( pN
8e70: 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ew==0 ) return 0
8e80: 3b 0a 20 20 70 4e 65 77 2d 3e 70 45 4c 69 73 74  ;.  pNew->pEList
8e90: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
8ea0: 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 45 4c  stDup(db, p->pEL
8eb0: 69 73 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70  ist, flags);.  p
8ec0: 4e 65 77 2d 3e 70 53 72 63 20 3d 20 73 71 6c 69  New->pSrc = sqli
8ed0: 74 65 33 53 72 63 4c 69 73 74 44 75 70 28 64 62  te3SrcListDup(db
8ee0: 2c 20 70 2d 3e 70 53 72 63 2c 20 66 6c 61 67 73  , p->pSrc, flags
8ef0: 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 57 68 65 72  );.  pNew->pWher
8f00: 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  e = sqlite3ExprD
8f10: 75 70 28 64 62 2c 20 70 2d 3e 70 57 68 65 72 65  up(db, p->pWhere
8f20: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77  , flags);.  pNew
8f30: 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71 6c  ->pGroupBy = sql
8f40: 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
8f50: 64 62 2c 20 70 2d 3e 70 47 72 6f 75 70 42 79 2c  db, p->pGroupBy,
8f60: 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d   flags);.  pNew-
8f70: 3e 70 48 61 76 69 6e 67 20 3d 20 73 71 6c 69 74  >pHaving = sqlit
8f80: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d  e3ExprDup(db, p-
8f90: 3e 70 48 61 76 69 6e 67 2c 20 66 6c 61 67 73 29  >pHaving, flags)
8fa0: 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72  ;.  pNew->pOrder
8fb0: 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  By = sqlite3Expr
8fc0: 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70  ListDup(db, p->p
8fd0: 4f 72 64 65 72 42 79 2c 20 66 6c 61 67 73 29 3b  OrderBy, flags);
8fe0: 0a 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 70 2d  .  pNew->op = p-
8ff0: 3e 6f 70 3b 0a 20 20 70 4e 65 77 2d 3e 70 50 72  >op;.  pNew->pPr
9000: 69 6f 72 20 3d 20 70 50 72 69 6f 72 20 3d 20 73  ior = pPrior = s
9010: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28  qlite3SelectDup(
9020: 64 62 2c 20 70 2d 3e 70 50 72 69 6f 72 2c 20 66  db, p->pPrior, f
9030: 6c 61 67 73 29 3b 0a 20 20 69 66 28 20 70 50 72  lags);.  if( pPr
9040: 69 6f 72 20 29 20 70 50 72 69 6f 72 2d 3e 70 4e  ior ) pPrior->pN
9050: 65 78 74 20 3d 20 70 4e 65 77 3b 0a 20 20 70 4e  ext = pNew;.  pN
9060: 65 77 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20  ew->pNext = 0;. 
9070: 20 70 4e 65 77 2d 3e 70 4c 69 6d 69 74 20 3d 20   pNew->pLimit = 
9080: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
9090: 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 2c 20 66 6c  b, p->pLimit, fl
90a0: 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f  ags);.  pNew->pO
90b0: 66 66 73 65 74 20 3d 20 73 71 6c 69 74 65 33 45  ffset = sqlite3E
90c0: 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 4f  xprDup(db, p->pO
90d0: 66 66 73 65 74 2c 20 66 6c 61 67 73 29 3b 0a 20  ffset, flags);. 
90e0: 20 70 4e 65 77 2d 3e 69 4c 69 6d 69 74 20 3d 20   pNew->iLimit = 
90f0: 30 3b 0a 20 20 70 4e 65 77 2d 3e 69 4f 66 66 73  0;.  pNew->iOffs
9100: 65 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  et = 0;.  pNew->
9110: 73 65 6c 46 6c 61 67 73 20 3d 20 70 2d 3e 73 65  selFlags = p->se
9120: 6c 46 6c 61 67 73 20 26 20 7e 53 46 5f 55 73 65  lFlags & ~SF_Use
9130: 73 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20 70 4e  sEphemeral;.  pN
9140: 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d  ew->addrOpenEphm
9150: 5b 30 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77  [0] = -1;.  pNew
9160: 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31  ->addrOpenEphm[1
9170: 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e  ] = -1;.  pNew->
9180: 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 70 2d 3e  nSelectRow = p->
9190: 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 70 4e  nSelectRow;.  pN
91a0: 65 77 2d 3e 70 57 69 74 68 20 3d 20 77 69 74 68  ew->pWith = with
91b0: 44 75 70 28 64 62 2c 20 70 2d 3e 70 57 69 74 68  Dup(db, p->pWith
91c0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  );.  sqlite3Sele
91d0: 63 74 53 65 74 4e 61 6d 65 28 70 4e 65 77 2c 20  ctSetName(pNew, 
91e0: 70 2d 3e 7a 53 65 6c 4e 61 6d 65 29 3b 0a 20 20  p->zSelName);.  
91f0: 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 23  return pNew;.}.#
9200: 65 6c 73 65 0a 53 65 6c 65 63 74 20 2a 73 71 6c  else.Select *sql
9210: 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 73 71  ite3SelectDup(sq
9220: 6c 69 74 65 33 20 2a 64 62 2c 20 53 65 6c 65 63  lite3 *db, Selec
9230: 74 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29  t *p, int flags)
9240: 7b 0a 20 20 61 73 73 65 72 74 28 20 70 3d 3d 30  {.  assert( p==0
9250: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a   );.  return 0;.
9260: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  }.#endif.../*.**
9270: 20 41 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65   Add a new eleme
9280: 6e 74 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  nt to the end of
9290: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c   an expression l
92a0: 69 73 74 2e 20 20 49 66 20 70 4c 69 73 74 20 69  ist.  If pList i
92b0: 73 0a 2a 2a 20 69 6e 69 74 69 61 6c 6c 79 20 4e  s.** initially N
92c0: 55 4c 4c 2c 20 74 68 65 6e 20 63 72 65 61 74 65  ULL, then create
92d0: 20 61 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f   a new expressio
92e0: 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  n list..**.** If
92f0: 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61   a memory alloca
9300: 74 69 6f 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  tion error occur
9310: 73 2c 20 74 68 65 20 65 6e 74 69 72 65 20 6c 69  s, the entire li
9320: 73 74 20 69 73 20 66 72 65 65 64 20 61 6e 64 0a  st is freed and.
9330: 2a 2a 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72  ** NULL is retur
9340: 6e 65 64 2e 20 20 49 66 20 6e 6f 6e 2d 4e 55 4c  ned.  If non-NUL
9350: 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 74  L is returned, t
9360: 68 65 6e 20 69 74 20 69 73 20 67 75 61 72 61 6e  hen it is guaran
9370: 74 65 65 64 0a 2a 2a 20 74 68 61 74 20 74 68 65  teed.** that the
9380: 20 6e 65 77 20 65 6e 74 72 79 20 77 61 73 20 73   new entry was s
9390: 75 63 63 65 73 73 66 75 6c 6c 79 20 61 70 70 65  uccessfully appe
93a0: 6e 64 65 64 2e 0a 2a 2f 0a 45 78 70 72 4c 69 73  nded..*/.ExprLis
93b0: 74 20 2a 73 71 6c 69 74 65 33 45 78 70 72 4c 69  t *sqlite3ExprLi
93c0: 73 74 41 70 70 65 6e 64 28 0a 20 20 50 61 72 73  stAppend(.  Pars
93d0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
93e0: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
93f0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
9400: 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20  List *pList,    
9410: 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 77      /* List to w
9420: 68 69 63 68 20 74 6f 20 61 70 70 65 6e 64 2e 20  hich to append. 
9430: 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f  Might be NULL */
9440: 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 20  .  Expr *pExpr  
9450: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
9460: 70 72 65 73 73 69 6f 6e 20 74 6f 20 62 65 20 61  pression to be a
9470: 70 70 65 6e 64 65 64 2e 20 4d 69 67 68 74 20 62  ppended. Might b
9480: 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 73  e NULL */.){.  s
9490: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
94a0: 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70  rse->db;.  if( p
94b0: 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70  List==0 ){.    p
94c0: 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 44 62  List = sqlite3Db
94d0: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  MallocZero(db, s
94e0: 69 7a 65 6f 66 28 45 78 70 72 4c 69 73 74 29 20  izeof(ExprList) 
94f0: 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  );.    if( pList
9500: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  ==0 ){.      got
9510: 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 7d 0a  o no_mem;.    }.
9520: 20 20 20 20 70 4c 69 73 74 2d 3e 61 20 3d 20 73      pList->a = s
9530: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
9540: 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 70 4c 69  w(db, sizeof(pLi
9550: 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 20 20  st->a[0]));.    
9560: 69 66 28 20 70 4c 69 73 74 2d 3e 61 3d 3d 30 20  if( pList->a==0 
9570: 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20  ) goto no_mem;. 
9580: 20 7d 65 6c 73 65 20 69 66 28 20 28 70 4c 69 73   }else if( (pLis
9590: 74 2d 3e 6e 45 78 70 72 20 26 20 28 70 4c 69 73  t->nExpr & (pLis
95a0: 74 2d 3e 6e 45 78 70 72 2d 31 29 29 3d 3d 30 20  t->nExpr-1))==0 
95b0: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45 78  ){.    struct Ex
95c0: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 3b 0a  prList_item *a;.
95d0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73      assert( pLis
95e0: 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20  t->nExpr>0 );.  
95f0: 20 20 61 20 3d 20 73 71 6c 69 74 65 33 44 62 52    a = sqlite3DbR
9600: 65 61 6c 6c 6f 63 28 64 62 2c 20 70 4c 69 73 74  ealloc(db, pList
9610: 2d 3e 61 2c 20 70 4c 69 73 74 2d 3e 6e 45 78 70  ->a, pList->nExp
9620: 72 2a 32 2a 73 69 7a 65 6f 66 28 70 4c 69 73 74  r*2*sizeof(pList
9630: 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 20 20 69 66  ->a[0]));.    if
9640: 28 20 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( a==0 ){.      
9650: 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20  goto no_mem;.   
9660: 20 7d 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 20   }.    pList->a 
9670: 3d 20 61 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  = a;.  }.  asser
9680: 74 28 20 70 4c 69 73 74 2d 3e 61 21 3d 30 20 29  t( pList->a!=0 )
9690: 3b 0a 20 20 69 66 28 20 31 20 29 7b 0a 20 20 20  ;.  if( 1 ){.   
96a0: 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
96b0: 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26  _item *pItem = &
96c0: 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e  pList->a[pList->
96d0: 6e 45 78 70 72 2b 2b 5d 3b 0a 20 20 20 20 6d 65  nExpr++];.    me
96e0: 6d 73 65 74 28 70 49 74 65 6d 2c 20 30 2c 20 73  mset(pItem, 0, s
96f0: 69 7a 65 6f 66 28 2a 70 49 74 65 6d 29 29 3b 0a  izeof(*pItem));.
9700: 20 20 20 20 70 49 74 65 6d 2d 3e 70 45 78 70 72      pItem->pExpr
9710: 20 3d 20 70 45 78 70 72 3b 0a 20 20 7d 0a 20 20   = pExpr;.  }.  
9720: 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 0a 6e  return pList;..n
9730: 6f 5f 6d 65 6d 3a 20 20 20 20 20 0a 20 20 2f 2a  o_mem:     .  /*
9740: 20 41 76 6f 69 64 20 6c 65 61 6b 69 6e 67 20 6d   Avoid leaking m
9750: 65 6d 6f 72 79 20 69 66 20 6d 61 6c 6c 6f 63 20  emory if malloc 
9760: 68 61 73 20 66 61 69 6c 65 64 2e 20 2a 2f 0a 20  has failed. */. 
9770: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
9780: 74 65 28 64 62 2c 20 70 45 78 70 72 29 3b 0a 20  te(db, pExpr);. 
9790: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
97a0: 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69 73 74  Delete(db, pList
97b0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  );.  return 0;.}
97c0: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
97d0: 73 6f 72 74 20 6f 72 64 65 72 20 66 6f 72 20 74  sort order for t
97e0: 68 65 20 6c 61 73 74 20 65 6c 65 6d 65 6e 74 20  he last element 
97f0: 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 45 78 70  on the given Exp
9800: 72 4c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  rList..*/.void s
9810: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 53 65  qlite3ExprListSe
9820: 74 53 6f 72 74 4f 72 64 65 72 28 45 78 70 72 4c  tSortOrder(ExprL
9830: 69 73 74 20 2a 70 2c 20 69 6e 74 20 69 53 6f 72  ist *p, int iSor
9840: 74 4f 72 64 65 72 29 7b 0a 20 20 69 66 28 20 70  tOrder){.  if( p
9850: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
9860: 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 53  assert( SQLITE_S
9870: 4f 5f 55 4e 44 45 46 49 4e 45 44 3c 30 20 26 26  O_UNDEFINED<0 &&
9880: 20 53 51 4c 49 54 45 5f 53 4f 5f 41 53 43 3e 3d   SQLITE_SO_ASC>=
9890: 30 20 26 26 20 53 51 4c 49 54 45 5f 53 4f 5f 44  0 && SQLITE_SO_D
98a0: 45 53 43 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  ESC>0 );.  asser
98b0: 74 28 20 70 2d 3e 6e 45 78 70 72 3e 30 20 29 3b  t( p->nExpr>0 );
98c0: 0a 20 20 69 66 28 20 69 53 6f 72 74 4f 72 64 65  .  if( iSortOrde
98d0: 72 3c 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72  r<0 ){.    asser
98e0: 74 28 20 70 2d 3e 61 5b 70 2d 3e 6e 45 78 70 72  t( p->a[p->nExpr
98f0: 2d 31 5d 2e 73 6f 72 74 4f 72 64 65 72 3d 3d 53  -1].sortOrder==S
9900: 51 4c 49 54 45 5f 53 4f 5f 41 53 43 20 29 3b 0a  QLITE_SO_ASC );.
9910: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
9920: 20 20 70 2d 3e 61 5b 70 2d 3e 6e 45 78 70 72 2d    p->a[p->nExpr-
9930: 31 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3d 20 28  1].sortOrder = (
9940: 75 38 29 69 53 6f 72 74 4f 72 64 65 72 3b 0a 7d  u8)iSortOrder;.}
9950: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
9960: 45 78 70 72 4c 69 73 74 2e 61 5b 5d 2e 7a 4e 61  ExprList.a[].zNa
9970: 6d 65 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68  me element of th
9980: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20  e most recently 
9990: 61 64 64 65 64 20 69 74 65 6d 0a 2a 2a 20 6f 6e  added item.** on
99a0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
99b0: 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73  list..**.** pLis
99c0: 74 20 6d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20  t might be NULL 
99d0: 66 6f 6c 6c 6f 77 69 6e 67 20 61 6e 20 4f 4f 4d  following an OOM
99e0: 20 65 72 72 6f 72 2e 20 20 42 75 74 20 70 4e 61   error.  But pNa
99f0: 6d 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20  me should never 
9a00: 62 65 0a 2a 2a 20 4e 55 4c 4c 2e 20 20 49 66 20  be.** NULL.  If 
9a10: 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  a memory allocat
9a20: 69 6f 6e 20 66 61 69 6c 73 2c 20 74 68 65 20 70  ion fails, the p
9a30: 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
9a40: 63 46 61 69 6c 65 64 20 66 6c 61 67 0a 2a 2a 20  cFailed flag.** 
9a50: 69 73 20 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20  is set..*/.void 
9a60: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 53  sqlite3ExprListS
9a70: 65 74 4e 61 6d 65 28 0a 20 20 50 61 72 73 65 20  etName(.  Parse 
9a80: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
9a90: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
9aa0: 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69  text */.  ExprLi
9ab0: 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20  st *pList,      
9ac0: 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 77 68 69    /* List to whi
9ad0: 63 68 20 74 6f 20 61 64 64 20 74 68 65 20 73 70  ch to add the sp
9ae0: 61 6e 2e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  an. */.  Token *
9af0: 70 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 20 20  pName,          
9b00: 20 2f 2a 20 4e 61 6d 65 20 74 6f 20 62 65 20 61   /* Name to be a
9b10: 64 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 64 65  dded */.  int de
9b20: 71 75 6f 74 65 20 20 20 20 20 20 20 20 20 20 20  quote           
9b30: 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 63 61 75    /* True to cau
9b40: 73 65 20 74 68 65 20 6e 61 6d 65 20 74 6f 20 62  se the name to b
9b50: 65 20 64 65 71 75 6f 74 65 64 20 2a 2f 0a 29 7b  e dequoted */.){
9b60: 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74  .  assert( pList
9b70: 21 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64  !=0 || pParse->d
9b80: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 21  b->mallocFailed!
9b90: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 4c 69 73  =0 );.  if( pLis
9ba0: 74 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  t ){.    struct 
9bb0: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
9bc0: 49 74 65 6d 3b 0a 20 20 20 20 61 73 73 65 72 74  Item;.    assert
9bd0: 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30  ( pList->nExpr>0
9be0: 20 29 3b 0a 20 20 20 20 70 49 74 65 6d 20 3d 20   );.    pItem = 
9bf0: 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d  &pList->a[pList-
9c00: 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20 20 20 20 61  >nExpr-1];.    a
9c10: 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 7a 4e  ssert( pItem->zN
9c20: 61 6d 65 3d 3d 30 20 29 3b 0a 20 20 20 20 70 49  ame==0 );.    pI
9c30: 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c  tem->zName = sql
9c40: 69 74 65 33 44 62 53 74 72 4e 44 75 70 28 70 50  ite3DbStrNDup(pP
9c50: 61 72 73 65 2d 3e 64 62 2c 20 70 4e 61 6d 65 2d  arse->db, pName-
9c60: 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20  >z, pName->n);. 
9c70: 20 20 20 69 66 28 20 64 65 71 75 6f 74 65 20 26     if( dequote &
9c80: 26 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 29  & pItem->zName )
9c90: 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28   sqlite3Dequote(
9ca0: 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  pItem->zName);. 
9cb0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20   }.}../*.** Set 
9cc0: 74 68 65 20 45 78 70 72 4c 69 73 74 2e 61 5b 5d  the ExprList.a[]
9cd0: 2e 7a 53 70 61 6e 20 65 6c 65 6d 65 6e 74 20 6f  .zSpan element o
9ce0: 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  f the most recen
9cf0: 74 6c 79 20 61 64 64 65 64 20 69 74 65 6d 0a 2a  tly added item.*
9d00: 2a 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73  * on the express
9d10: 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20  ion list..**.** 
9d20: 70 4c 69 73 74 20 6d 69 67 68 74 20 62 65 20 4e  pList might be N
9d30: 55 4c 4c 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 6e  ULL following an
9d40: 20 4f 4f 4d 20 65 72 72 6f 72 2e 20 20 42 75 74   OOM error.  But
9d50: 20 70 53 70 61 6e 20 73 68 6f 75 6c 64 20 6e 65   pSpan should ne
9d60: 76 65 72 20 62 65 0a 2a 2a 20 4e 55 4c 4c 2e 20  ver be.** NULL. 
9d70: 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c   If a memory all
9d80: 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c 20 74  ocation fails, t
9d90: 68 65 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  he pParse->db->m
9da0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67  allocFailed flag
9db0: 0a 2a 2a 20 69 73 20 73 65 74 2e 0a 2a 2f 0a 76  .** is set..*/.v
9dc0: 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 4c  oid sqlite3ExprL
9dd0: 69 73 74 53 65 74 53 70 61 6e 28 0a 20 20 50 61  istSetSpan(.  Pa
9de0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
9df0: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
9e00: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
9e10: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20  prList *pList,  
9e20: 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f        /* List to
9e30: 20 77 68 69 63 68 20 74 6f 20 61 64 64 20 74 68   which to add th
9e40: 65 20 73 70 61 6e 2e 20 2a 2f 0a 20 20 45 78 70  e span. */.  Exp
9e50: 72 53 70 61 6e 20 2a 70 53 70 61 6e 20 20 20 20  rSpan *pSpan    
9e60: 20 20 20 20 20 2f 2a 20 54 68 65 20 73 70 61 6e       /* The span
9e70: 20 74 6f 20 62 65 20 61 64 64 65 64 20 2a 2f 0a   to be added */.
9e80: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
9e90: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
9ea0: 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d   assert( pList!=
9eb0: 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  0 || db->mallocF
9ec0: 61 69 6c 65 64 21 3d 30 20 29 3b 0a 20 20 69 66  ailed!=0 );.  if
9ed0: 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 73  ( pList ){.    s
9ee0: 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
9ef0: 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 4c  tem *pItem = &pL
9f00: 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45  ist->a[pList->nE
9f10: 78 70 72 2d 31 5d 3b 0a 20 20 20 20 61 73 73 65  xpr-1];.    asse
9f20: 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  rt( pList->nExpr
9f30: 3e 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  >0 );.    assert
9f40: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
9f50: 65 64 20 7c 7c 20 70 49 74 65 6d 2d 3e 70 45 78  ed || pItem->pEx
9f60: 70 72 3d 3d 70 53 70 61 6e 2d 3e 70 45 78 70 72  pr==pSpan->pExpr
9f70: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   );.    sqlite3D
9f80: 62 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d  bFree(db, pItem-
9f90: 3e 7a 53 70 61 6e 29 3b 0a 20 20 20 20 70 49 74  >zSpan);.    pIt
9fa0: 65 6d 2d 3e 7a 53 70 61 6e 20 3d 20 73 71 6c 69  em->zSpan = sqli
9fb0: 74 65 33 44 62 53 74 72 4e 44 75 70 28 64 62 2c  te3DbStrNDup(db,
9fc0: 20 28 63 68 61 72 2a 29 70 53 70 61 6e 2d 3e 7a   (char*)pSpan->z
9fd0: 53 74 61 72 74 2c 0a 20 20 20 20 20 20 20 20 20  Start,.         
9fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ff0: 20 20 20 20 20 20 20 20 20 20 20 28 69 6e 74 29             (int)
a000: 28 70 53 70 61 6e 2d 3e 7a 45 6e 64 20 2d 20 70  (pSpan->zEnd - p
a010: 53 70 61 6e 2d 3e 7a 53 74 61 72 74 29 29 3b 0a  Span->zStart));.
a020: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20    }.}../*.** If 
a030: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  the expression l
a040: 69 73 74 20 70 45 4c 69 73 74 20 63 6f 6e 74 61  ist pEList conta
a050: 69 6e 73 20 6d 6f 72 65 20 74 68 61 6e 20 69 4c  ins more than iL
a060: 69 6d 69 74 20 65 6c 65 6d 65 6e 74 73 2c 0a 2a  imit elements,.*
a070: 2a 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72  * leave an error
a080: 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72   message in pPar
a090: 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  se..*/.void sqli
a0a0: 74 65 33 45 78 70 72 4c 69 73 74 43 68 65 63 6b  te3ExprListCheck
a0b0: 4c 65 6e 67 74 68 28 0a 20 20 50 61 72 73 65 20  Length(.  Parse 
a0c0: 2a 70 50 61 72 73 65 2c 0a 20 20 45 78 70 72 4c  *pParse,.  ExprL
a0d0: 69 73 74 20 2a 70 45 4c 69 73 74 2c 0a 20 20 63  ist *pEList,.  c
a0e0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 62 6a 65  onst char *zObje
a0f0: 63 74 0a 29 7b 0a 20 20 69 6e 74 20 6d 78 20 3d  ct.){.  int mx =
a100: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 4c 69   pParse->db->aLi
a110: 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
a120: 5f 43 4f 4c 55 4d 4e 5d 3b 0a 20 20 74 65 73 74  _COLUMN];.  test
a130: 63 61 73 65 28 20 70 45 4c 69 73 74 20 26 26 20  case( pEList && 
a140: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 6d  pEList->nExpr==m
a150: 78 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  x );.  testcase(
a160: 20 70 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73   pEList && pELis
a170: 74 2d 3e 6e 45 78 70 72 3d 3d 6d 78 2b 31 20 29  t->nExpr==mx+1 )
a180: 3b 0a 20 20 69 66 28 20 70 45 4c 69 73 74 20 26  ;.  if( pEList &
a190: 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e  & pEList->nExpr>
a1a0: 6d 78 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  mx ){.    sqlite
a1b0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
a1c0: 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75  , "too many colu
a1d0: 6d 6e 73 20 69 6e 20 25 73 22 2c 20 7a 4f 62 6a  mns in %s", zObj
a1e0: 65 63 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ect);.  }.}../*.
a1f0: 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74  ** Delete an ent
a200: 69 72 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  ire expression l
a210: 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ist..*/.void sql
a220: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
a230: 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  te(sqlite3 *db, 
a240: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29  ExprList *pList)
a250: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72  {.  int i;.  str
a260: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
a270: 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 66 28 20  m *pItem;.  if( 
a280: 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72  pList==0 ) retur
a290: 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69  n;.  assert( pLi
a2a0: 73 74 2d 3e 61 21 3d 30 20 7c 7c 20 70 4c 69 73  st->a!=0 || pLis
a2b0: 74 2d 3e 6e 45 78 70 72 3d 3d 30 20 29 3b 0a 20  t->nExpr==0 );. 
a2c0: 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74   for(pItem=pList
a2d0: 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70 4c 69 73  ->a, i=0; i<pLis
a2e0: 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70  t->nExpr; i++, p
a2f0: 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  Item++){.    sql
a300: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
a310: 62 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29  b, pItem->pExpr)
a320: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
a330: 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a  ree(db, pItem->z
a340: 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  Name);.    sqlit
a350: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 74  e3DbFree(db, pIt
a360: 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a 20 20 7d 0a  em->zSpan);.  }.
a370: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
a380: 64 62 2c 20 70 4c 69 73 74 2d 3e 61 29 3b 0a 20  db, pList->a);. 
a390: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
a3a0: 62 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a  b, pList);.}../*
a3b0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 62  .** Return the b
a3c0: 69 74 77 69 73 65 2d 4f 52 20 6f 66 20 61 6c 6c  itwise-OR of all
a3d0: 20 45 78 70 72 2e 66 6c 61 67 73 20 66 69 65 6c   Expr.flags fiel
a3e0: 64 73 20 69 6e 20 74 68 65 20 67 69 76 65 6e 0a  ds in the given.
a3f0: 2a 2a 20 45 78 70 72 4c 69 73 74 2e 0a 2a 2f 0a  ** ExprList..*/.
a400: 75 33 32 20 73 71 6c 69 74 65 33 45 78 70 72 4c  u32 sqlite3ExprL
a410: 69 73 74 46 6c 61 67 73 28 63 6f 6e 73 74 20 45  istFlags(const E
a420: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b  xprList *pList){
a430: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75 33 32 20  .  int i;.  u32 
a440: 6d 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 4c 69  m = 0;.  if( pLi
a450: 73 74 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  st ){.    for(i=
a460: 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70  0; i<pList->nExp
a470: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  r; i++){.       
a480: 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4c  Expr *pExpr = pL
a490: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  ist->a[i].pExpr;
a4a0: 0a 20 20 20 20 20 20 20 69 66 28 20 41 4c 57 41  .       if( ALWA
a4b0: 59 53 28 70 45 78 70 72 29 20 29 20 6d 20 7c 3d  YS(pExpr) ) m |=
a4c0: 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 3b 0a 20   pExpr->flags;. 
a4d0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
a4e0: 6e 20 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  n m;.}../*.** Th
a4f0: 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65  ese routines are
a500: 20 57 61 6c 6b 65 72 20 63 61 6c 6c 62 61 63 6b   Walker callback
a510: 73 20 75 73 65 64 20 74 6f 20 63 68 65 63 6b 20  s used to check 
a520: 65 78 70 72 65 73 73 69 6f 6e 73 20 74 6f 0a 2a  expressions to.*
a530: 2a 20 73 65 65 20 69 66 20 74 68 65 79 20 61 72  * see if they ar
a540: 65 20 22 63 6f 6e 73 74 61 6e 74 22 20 66 6f 72  e "constant" for
a550: 20 73 6f 6d 65 20 64 65 66 69 6e 69 74 69 6f 6e   some definition
a560: 20 6f 66 20 63 6f 6e 73 74 61 6e 74 2e 20 20 54   of constant.  T
a570: 68 65 0a 2a 2a 20 57 61 6c 6b 65 72 2e 65 43 6f  he.** Walker.eCo
a580: 64 65 20 76 61 6c 75 65 20 64 65 74 65 72 6d 69  de value determi
a590: 6e 65 73 20 74 68 65 20 74 79 70 65 20 6f 66 20  nes the type of 
a5a0: 22 63 6f 6e 73 74 61 6e 74 22 20 77 65 20 61 72  "constant" we ar
a5b0: 65 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20 66 6f 72  e looking.** for
a5c0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 63 61  ..**.** These ca
a5d0: 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 73 20  llback routines 
a5e0: 61 72 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c  are used to impl
a5f0: 65 6d 65 6e 74 20 74 68 65 20 66 6f 6c 6c 6f 77  ement the follow
a600: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 73  ing:.**.**     s
a610: 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
a620: 74 61 6e 74 28 29 20 20 20 20 20 20 20 20 20 20  tant()          
a630: 20 20 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d          pWalker-
a640: 3e 65 43 6f 64 65 3d 3d 31 0a 2a 2a 20 20 20 20  >eCode==1.**    
a650: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
a660: 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 29 20  nstantNotJoin() 
a670: 20 20 20 20 20 20 20 20 20 20 70 57 61 6c 6b 65            pWalke
a680: 72 2d 3e 65 43 6f 64 65 3d 3d 32 0a 2a 2a 20 20  r->eCode==2.**  
a690: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 73     sqlite3ExprIs
a6a0: 54 61 62 6c 65 43 6f 6e 73 74 61 6e 74 28 29 20  TableConstant() 
a6b0: 20 20 20 20 20 20 20 20 20 20 20 20 70 57 61 6c              pWal
a6c0: 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 33 0a 2a 2a  ker->eCode==3.**
a6d0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
a6e0: 49 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63  IsConstantOrFunc
a6f0: 74 69 6f 6e 28 29 20 20 20 20 20 20 20 20 70 57  tion()        pW
a700: 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 34 20  alker->eCode==4 
a710: 6f 72 20 35 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6c  or 5.**.** In al
a720: 6c 20 63 61 73 65 73 2c 20 74 68 65 20 63 61 6c  l cases, the cal
a730: 6c 62 61 63 6b 73 20 73 65 74 20 57 61 6c 6b 65  lbacks set Walke
a740: 72 2e 65 43 6f 64 65 3d 30 20 61 6e 64 20 61 62  r.eCode=0 and ab
a750: 6f 72 74 20 69 66 20 74 68 65 20 65 78 70 72 65  ort if the expre
a760: 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 66 6f 75 6e  ssion.** is foun
a770: 64 20 74 6f 20 6e 6f 74 20 62 65 20 61 20 63 6f  d to not be a co
a780: 6e 73 74 61 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  nstant..**.** Th
a790: 65 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43  e sqlite3ExprIsC
a7a0: 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f  onstantOrFunctio
a7b0: 6e 28 29 20 69 73 20 75 73 65 64 20 66 6f 72 20  n() is used for 
a7c0: 65 76 61 6c 75 61 74 69 6e 67 20 65 78 70 72 65  evaluating expre
a7d0: 73 73 69 6f 6e 73 0a 2a 2a 20 69 6e 20 61 20 43  ssions.** in a C
a7e0: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
a7f0: 65 6d 65 6e 74 2e 20 20 54 68 65 20 57 61 6c 6b  ement.  The Walk
a800: 65 72 2e 65 43 6f 64 65 20 76 61 6c 75 65 20 69  er.eCode value i
a810: 73 20 35 20 77 68 65 6e 20 70 61 72 73 69 6e 67  s 5 when parsing
a820: 0a 2a 2a 20 61 6e 20 65 78 69 73 74 69 6e 67 20  .** an existing 
a830: 73 63 68 65 6d 61 20 61 6e 64 20 34 20 77 68 65  schema and 4 whe
a840: 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 61 20 6e  n processing a n
a850: 65 77 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 41  ew statement.  A
a860: 20 62 6f 75 6e 64 0a 2a 2a 20 70 61 72 61 6d 65   bound.** parame
a870: 74 65 72 20 72 61 69 73 65 73 20 61 6e 20 65 72  ter raises an er
a880: 72 6f 72 20 66 6f 72 20 6e 65 77 20 73 74 61 74  ror for new stat
a890: 65 6d 65 6e 74 73 2c 20 62 75 74 20 69 73 20 73  ements, but is s
a8a0: 69 6c 65 6e 74 6c 79 20 63 6f 6e 76 65 72 74 65  ilently converte
a8b0: 64 0a 2a 2a 20 74 6f 20 4e 55 4c 4c 20 66 6f 72  d.** to NULL for
a8c0: 20 65 78 69 73 74 69 6e 67 20 73 63 68 65 6d 61   existing schema
a8d0: 73 2e 20 20 54 68 69 73 20 61 6c 6c 6f 77 73 20  s.  This allows 
a8e0: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
a8f0: 62 6c 65 73 20 74 68 61 74 20 0a 2a 2a 20 63 6f  bles that .** co
a900: 6e 74 61 69 6e 20 61 20 62 6f 75 6e 64 20 70 61  ntain a bound pa
a910: 72 61 6d 65 74 65 72 20 62 65 63 61 75 73 65 20  rameter because 
a920: 74 68 65 79 20 77 65 72 65 20 67 65 6e 65 72 61  they were genera
a930: 74 65 64 20 62 79 20 6f 6c 64 65 72 20 76 65 72  ted by older ver
a940: 73 69 6f 6e 73 0a 2a 2a 20 6f 66 20 53 51 4c 69  sions.** of SQLi
a950: 74 65 20 74 6f 20 62 65 20 70 61 72 73 65 64 20  te to be parsed 
a960: 62 79 20 6e 65 77 65 72 20 76 65 72 73 69 6f 6e  by newer version
a970: 73 20 6f 66 20 53 51 4c 69 74 65 20 77 69 74 68  s of SQLite with
a980: 6f 75 74 20 72 61 69 73 69 6e 67 20 61 0a 2a 2a  out raising a.**
a990: 20 6d 61 6c 66 6f 72 6d 65 64 20 73 63 68 65 6d   malformed schem
a9a0: 61 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74  a error..*/.stat
a9b0: 69 63 20 69 6e 74 20 65 78 70 72 4e 6f 64 65 49  ic int exprNodeI
a9c0: 73 43 6f 6e 73 74 61 6e 74 28 57 61 6c 6b 65 72  sConstant(Walker
a9d0: 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20   *pWalker, Expr 
a9e0: 2a 70 45 78 70 72 29 7b 0a 0a 20 20 2f 2a 20 49  *pExpr){..  /* I
a9f0: 66 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65  f pWalker->eCode
aa00: 20 69 73 20 32 20 74 68 65 6e 20 61 6e 79 20 74   is 2 then any t
aa10: 65 72 6d 20 6f 66 20 74 68 65 20 65 78 70 72 65  erm of the expre
aa20: 73 73 69 6f 6e 20 74 68 61 74 20 63 6f 6d 65 73  ssion that comes
aa30: 20 66 72 6f 6d 0a 20 20 2a 2a 20 74 68 65 20 4f   from.  ** the O
aa40: 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73  N or USING claus
aa50: 65 73 20 6f 66 20 61 20 6c 65 66 74 20 6a 6f 69  es of a left joi
aa60: 6e 20 64 69 73 71 75 61 6c 69 66 69 65 73 20 74  n disqualifies t
aa70: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20  he expression.  
aa80: 2a 2a 20 66 72 6f 6d 20 62 65 69 6e 67 20 63 6f  ** from being co
aa90: 6e 73 69 64 65 72 65 64 20 63 6f 6e 73 74 61 6e  nsidered constan
aaa0: 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 57 61 6c  t. */.  if( pWal
aab0: 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 32 20 26 26  ker->eCode==2 &&
aac0: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
aad0: 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a  (pExpr, EP_FromJ
aae0: 6f 69 6e 29 20 29 7b 0a 20 20 20 20 70 57 61 6c  oin) ){.    pWal
aaf0: 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20 30 3b 0a  ker->eCode = 0;.
ab00: 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41      return WRC_A
ab10: 62 6f 72 74 3b 0a 20 20 7d 0a 0a 20 20 73 77 69  bort;.  }..  swi
ab20: 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29  tch( pExpr->op )
ab30: 7b 0a 20 20 20 20 2f 2a 20 43 6f 6e 73 69 64 65  {.    /* Conside
ab40: 72 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20 62  r functions to b
ab50: 65 20 63 6f 6e 73 74 61 6e 74 20 69 66 20 61 6c  e constant if al
ab60: 6c 20 74 68 65 69 72 20 61 72 67 75 6d 65 6e 74  l their argument
ab70: 73 20 61 72 65 20 63 6f 6e 73 74 61 6e 74 0a 20  s are constant. 
ab80: 20 20 20 2a 2a 20 61 6e 64 20 65 69 74 68 65 72     ** and either
ab90: 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d   pWalker->eCode=
aba0: 3d 34 20 6f 72 20 35 20 6f 72 20 74 68 65 20 66  =4 or 5 or the f
abb0: 75 6e 63 74 69 6f 6e 20 68 61 73 20 74 68 65 0a  unction has the.
abc0: 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 46 55      ** SQLITE_FU
abd0: 4e 43 5f 43 4f 4e 53 54 20 66 6c 61 67 2e 20 2a  NC_CONST flag. *
abe0: 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55  /.    case TK_FU
abf0: 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 20 20 69 66  NCTION:.      if
ac00: 28 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65  ( pWalker->eCode
ac10: 3e 3d 34 20 7c 7c 20 45 78 70 72 48 61 73 50 72  >=4 || ExprHasPr
ac20: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 45 50 5f  operty(pExpr,EP_
ac30: 43 6f 6e 73 74 46 75 6e 63 29 20 29 7b 0a 20 20  ConstFunc) ){.  
ac40: 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
ac50: 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20  _Continue;.     
ac60: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
ac70: 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d  pWalker->eCode =
ac80: 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75   0;.        retu
ac90: 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
aca0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
acb0: 4b 5f 49 44 3a 0a 20 20 20 20 63 61 73 65 20 54  K_ID:.    case T
acc0: 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61  K_COLUMN:.    ca
acd0: 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49  se TK_AGG_FUNCTI
ace0: 4f 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ON:.    case TK_
acf0: 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20  AGG_COLUMN:.    
ad00: 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
ad10: 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 3b 0a  r->op==TK_ID );.
ad20: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
ad30: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  pExpr->op==TK_CO
ad40: 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 74 65  LUMN );.      te
ad50: 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
ad60: 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49  p==TK_AGG_FUNCTI
ad70: 4f 4e 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ON );.      test
ad80: 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
ad90: 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29  =TK_AGG_COLUMN )
ada0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57 61 6c  ;.      if( pWal
adb0: 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 33 20 26 26  ker->eCode==3 &&
adc0: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d   pExpr->iTable==
add0: 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 43 75 72 20  pWalker->u.iCur 
ade0: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
adf0: 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
ae00: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
ae10: 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43       pWalker->eC
ae20: 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ode = 0;.       
ae30: 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
ae40: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 63  t;.      }.    c
ae50: 61 73 65 20 54 4b 5f 56 41 52 49 41 42 4c 45 3a  ase TK_VARIABLE:
ae60: 0a 20 20 20 20 20 20 69 66 28 20 70 57 61 6c 6b  .      if( pWalk
ae70: 65 72 2d 3e 65 43 6f 64 65 3d 3d 35 20 29 7b 0a  er->eCode==5 ){.
ae80: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 6c 65 6e          /* Silen
ae90: 74 6c 79 20 63 6f 6e 76 65 72 74 20 62 6f 75 6e  tly convert boun
aea0: 64 20 70 61 72 61 6d 65 74 65 72 73 20 74 68 61  d parameters tha
aeb0: 74 20 61 70 70 65 61 72 20 69 6e 73 69 64 65 20  t appear inside 
aec0: 6f 66 20 43 52 45 41 54 45 0a 20 20 20 20 20 20  of CREATE.      
aed0: 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 20    ** statements 
aee0: 69 6e 74 6f 20 61 20 4e 55 4c 4c 20 77 68 65 6e  into a NULL when
aef0: 20 70 61 72 73 69 6e 67 20 74 68 65 20 43 52 45   parsing the CRE
af00: 41 54 45 20 73 74 61 74 65 6d 65 6e 74 20 74 65  ATE statement te
af10: 78 74 20 6f 75 74 0a 20 20 20 20 20 20 20 20 2a  xt out.        *
af20: 2a 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 5f  * of the sqlite_
af30: 6d 61 73 74 65 72 20 74 61 62 6c 65 20 2a 2f 0a  master table */.
af40: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f          pExpr->o
af50: 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20  p = TK_NULL;.   
af60: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 57 61     }else if( pWa
af70: 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 34 20 29  lker->eCode==4 )
af80: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 20 62  {.        /* A b
af90: 6f 75 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69  ound parameter i
afa0: 6e 20 61 20 43 52 45 41 54 45 20 73 74 61 74 65  n a CREATE state
afb0: 6d 65 6e 74 20 74 68 61 74 20 6f 72 69 67 69 6e  ment that origin
afc0: 61 74 65 73 20 66 72 6f 6d 0a 20 20 20 20 20 20  ates from.      
afd0: 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 70 72 65    ** sqlite3_pre
afe0: 70 61 72 65 28 29 20 63 61 75 73 65 73 20 61 6e  pare() causes an
aff0: 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20   error */.      
b000: 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65    pWalker->eCode
b010: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65   = 0;.        re
b020: 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
b030: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a        }.      /*
b040: 20 46 61 6c 6c 20 74 68 72 6f 75 67 68 20 2a 2f   Fall through */
b050: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20  .    default:.  
b060: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
b070: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45  xpr->op==TK_SELE
b080: 43 54 20 29 3b 20 2f 2a 20 73 65 6c 65 63 74 4e  CT ); /* selectN
b090: 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 20 77 69  odeIsConstant wi
b0a0: 6c 6c 20 64 69 73 61 6c 6c 6f 77 20 2a 2f 0a 20  ll disallow */. 
b0b0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
b0c0: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 49  Expr->op==TK_EXI
b0d0: 53 54 53 20 29 3b 20 2f 2a 20 73 65 6c 65 63 74  STS ); /* select
b0e0: 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 20 77  NodeIsConstant w
b0f0: 69 6c 6c 20 64 69 73 61 6c 6c 6f 77 20 2a 2f 0a  ill disallow */.
b100: 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
b110: 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 7d 0a 7d  _Continue;.  }.}
b120: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 6c 65  .static int sele
b130: 63 74 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74  ctNodeIsConstant
b140: 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72  (Walker *pWalker
b150: 2c 20 53 65 6c 65 63 74 20 2a 4e 6f 74 55 73 65  , Select *NotUse
b160: 64 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  d){.  UNUSED_PAR
b170: 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b  AMETER(NotUsed);
b180: 0a 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64  .  pWalker->eCod
b190: 65 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  e = 0;.  return 
b1a0: 57 52 43 5f 41 62 6f 72 74 3b 0a 7d 0a 73 74 61  WRC_Abort;.}.sta
b1b0: 74 69 63 20 69 6e 74 20 65 78 70 72 49 73 43 6f  tic int exprIsCo
b1c0: 6e 73 74 28 45 78 70 72 20 2a 70 2c 20 69 6e 74  nst(Expr *p, int
b1d0: 20 69 6e 69 74 46 6c 61 67 2c 20 69 6e 74 20 69   initFlag, int i
b1e0: 43 75 72 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77  Cur){.  Walker w
b1f0: 3b 0a 20 20 6d 65 6d 73 65 74 28 26 77 2c 20 30  ;.  memset(&w, 0
b200: 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20  , sizeof(w));.  
b210: 77 2e 65 43 6f 64 65 20 3d 20 69 6e 69 74 46 6c  w.eCode = initFl
b220: 61 67 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c  ag;.  w.xExprCal
b230: 6c 62 61 63 6b 20 3d 20 65 78 70 72 4e 6f 64 65  lback = exprNode
b240: 49 73 43 6f 6e 73 74 61 6e 74 3b 0a 20 20 77 2e  IsConstant;.  w.
b250: 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20  xSelectCallback 
b260: 3d 20 73 65 6c 65 63 74 4e 6f 64 65 49 73 43 6f  = selectNodeIsCo
b270: 6e 73 74 61 6e 74 3b 0a 20 20 77 2e 75 2e 69 43  nstant;.  w.u.iC
b280: 75 72 20 3d 20 69 43 75 72 3b 0a 20 20 73 71 6c  ur = iCur;.  sql
b290: 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77 2c  ite3WalkExpr(&w,
b2a0: 20 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 77 2e   p);.  return w.
b2b0: 65 43 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  eCode;.}../*.** 
b2c0: 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69  Walk an expressi
b2d0: 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e  on tree.  Return
b2e0: 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65   non-zero if the
b2f0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63   expression is c
b300: 6f 6e 73 74 61 6e 74 0a 2a 2a 20 61 6e 64 20 30  onstant.** and 0
b310: 20 69 66 20 69 74 20 69 6e 76 6f 6c 76 65 73 20   if it involves 
b320: 76 61 72 69 61 62 6c 65 73 20 6f 72 20 66 75 6e  variables or fun
b330: 63 74 69 6f 6e 20 63 61 6c 6c 73 2e 0a 2a 2a 0a  ction calls..**.
b340: 2a 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f  ** For the purpo
b350: 73 65 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63  ses of this func
b360: 74 69 6f 6e 2c 20 61 20 64 6f 75 62 6c 65 2d 71  tion, a double-q
b370: 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65 78  uoted string (ex
b380: 3a 20 22 61 62 63 22 29 0a 2a 2a 20 69 73 20 63  : "abc").** is c
b390: 6f 6e 73 69 64 65 72 65 64 20 61 20 76 61 72 69  onsidered a vari
b3a0: 61 62 6c 65 20 62 75 74 20 61 20 73 69 6e 67 6c  able but a singl
b3b0: 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20  e-quoted string 
b3c0: 28 65 78 3a 20 27 61 62 63 27 29 20 69 73 0a 2a  (ex: 'abc') is.*
b3d0: 2a 20 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f  * a constant..*/
b3e0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
b3f0: 49 73 43 6f 6e 73 74 61 6e 74 28 45 78 70 72 20  IsConstant(Expr 
b400: 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 65 78  *p){.  return ex
b410: 70 72 49 73 43 6f 6e 73 74 28 70 2c 20 31 2c 20  prIsConst(p, 1, 
b420: 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c  0);.}../*.** Wal
b430: 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  k an expression 
b440: 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20 6e 6f  tree.  Return no
b450: 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 65 78  n-zero if the ex
b460: 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73  pression is cons
b470: 74 61 6e 74 0a 2a 2a 20 74 68 61 74 20 64 6f 65  tant.** that doe
b480: 73 20 6e 6f 20 6f 72 69 67 69 6e 61 74 65 20 66  s no originate f
b490: 72 6f 6d 20 74 68 65 20 4f 4e 20 6f 72 20 55 53  rom the ON or US
b4a0: 49 4e 47 20 63 6c 61 75 73 65 73 20 6f 66 20 61  ING clauses of a
b4b0: 20 6a 6f 69 6e 2e 0a 2a 2a 20 52 65 74 75 72 6e   join..** Return
b4c0: 20 30 20 69 66 20 69 74 20 69 6e 76 6f 6c 76 65   0 if it involve
b4d0: 73 20 76 61 72 69 61 62 6c 65 73 20 6f 72 20 66  s variables or f
b4e0: 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 73 20 6f 72  unction calls or
b4f0: 20 74 65 72 6d 73 20 66 72 6f 6d 0a 2a 2a 20 61   terms from.** a
b500: 6e 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c  n ON or USING cl
b510: 61 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ause..*/.int sql
b520: 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
b530: 6e 74 4e 6f 74 4a 6f 69 6e 28 45 78 70 72 20 2a  ntNotJoin(Expr *
b540: 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 65 78 70  p){.  return exp
b550: 72 49 73 43 6f 6e 73 74 28 70 2c 20 32 2c 20 30  rIsConst(p, 2, 0
b560: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b  );.}../*.** Walk
b570: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74   an expression t
b580: 72 65 65 2e 20 20 52 65 74 75 72 6e 20 6e 6f 6e  ree.  Return non
b590: 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 65 78 70  -zero if the exp
b5a0: 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74  ression is const
b5b0: 61 6e 74 0a 2a 2a 20 66 6f 72 20 61 6e 79 20 73  ant.** for any s
b5c0: 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 74 68 65  ingle row of the
b5d0: 20 74 61 62 6c 65 20 77 69 74 68 20 63 75 72 73   table with curs
b5e0: 6f 72 20 69 43 75 72 2e 20 20 49 6e 20 6f 74 68  or iCur.  In oth
b5f0: 65 72 20 77 6f 72 64 73 2c 20 74 68 65 0a 2a 2a  er words, the.**
b600: 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 75 73 74   expression must
b610: 20 6e 6f 74 20 72 65 66 65 72 20 74 6f 20 61 6e   not refer to an
b620: 79 20 6e 6f 6e 2d 64 65 74 65 72 6d 69 6e 69 73  y non-determinis
b630: 74 69 63 20 66 75 6e 63 74 69 6f 6e 20 6e 6f 72  tic function nor
b640: 20 61 6e 79 0a 2a 2a 20 74 61 62 6c 65 20 6f 74   any.** table ot
b650: 68 65 72 20 74 68 61 6e 20 69 43 75 72 2e 0a 2a  her than iCur..*
b660: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
b670: 72 49 73 54 61 62 6c 65 43 6f 6e 73 74 61 6e 74  rIsTableConstant
b680: 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 69 43  (Expr *p, int iC
b690: 75 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 65 78  ur){.  return ex
b6a0: 70 72 49 73 43 6f 6e 73 74 28 70 2c 20 33 2c 20  prIsConst(p, 3, 
b6b0: 69 43 75 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  iCur);.}../*.** 
b6c0: 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69  Walk an expressi
b6d0: 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e  on tree.  Return
b6e0: 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65   non-zero if the
b6f0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63   expression is c
b700: 6f 6e 73 74 61 6e 74 0a 2a 2a 20 6f 72 20 61 20  onstant.** or a 
b710: 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 77 69  function call wi
b720: 74 68 20 63 6f 6e 73 74 61 6e 74 20 61 72 67 75  th constant argu
b730: 6d 65 6e 74 73 2e 20 20 52 65 74 75 72 6e 20 61  ments.  Return a
b740: 6e 64 20 30 20 69 66 20 74 68 65 72 65 0a 2a 2a  nd 0 if there.**
b750: 20 61 72 65 20 61 6e 79 20 76 61 72 69 61 62 6c   are any variabl
b760: 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68  es..**.** For th
b770: 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68  e purposes of th
b780: 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20 64  is function, a d
b790: 6f 75 62 6c 65 2d 71 75 6f 74 65 64 20 73 74 72  ouble-quoted str
b7a0: 69 6e 67 20 28 65 78 3a 20 22 61 62 63 22 29 0a  ing (ex: "abc").
b7b0: 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64  ** is considered
b7c0: 20 61 20 76 61 72 69 61 62 6c 65 20 62 75 74 20   a variable but 
b7d0: 61 20 73 69 6e 67 6c 65 2d 71 75 6f 74 65 64 20  a single-quoted 
b7e0: 73 74 72 69 6e 67 20 28 65 78 3a 20 27 61 62 63  string (ex: 'abc
b7f0: 27 29 20 69 73 0a 2a 2a 20 61 20 63 6f 6e 73 74  ') is.** a const
b800: 61 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ant..*/.int sqli
b810: 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
b820: 74 4f 72 46 75 6e 63 74 69 6f 6e 28 45 78 70 72  tOrFunction(Expr
b830: 20 2a 70 2c 20 75 38 20 69 73 49 6e 69 74 29 7b   *p, u8 isInit){
b840: 0a 20 20 61 73 73 65 72 74 28 20 69 73 49 6e 69  .  assert( isIni
b850: 74 3d 3d 30 20 7c 7c 20 69 73 49 6e 69 74 3d 3d  t==0 || isInit==
b860: 31 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 65 78  1 );.  return ex
b870: 70 72 49 73 43 6f 6e 73 74 28 70 2c 20 34 2b 69  prIsConst(p, 4+i
b880: 73 49 6e 69 74 2c 20 30 29 3b 0a 7d 0a 0a 23 69  sInit, 0);.}..#i
b890: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
b8a0: 4c 45 5f 43 55 52 53 4f 52 5f 48 49 4e 54 53 0a  LE_CURSOR_HINTS.
b8b0: 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78  /*.** Walk an ex
b8c0: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20  pression tree.  
b8d0: 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20  Return 1 if the 
b8e0: 65 78 70 72 65 73 73 69 6f 6e 20 63 6f 6e 74 61  expression conta
b8f0: 69 6e 73 20 61 0a 2a 2a 20 73 75 62 71 75 65 72  ins a.** subquer
b900: 79 20 6f 66 20 73 6f 6d 65 20 6b 69 6e 64 2e 20  y of some kind. 
b910: 20 52 65 74 75 72 6e 20 30 20 69 66 20 74 68 65   Return 0 if the
b920: 72 65 20 61 72 65 20 6e 6f 20 73 75 62 71 75 65  re are no subque
b930: 72 69 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ries..*/.int sql
b940: 69 74 65 33 45 78 70 72 43 6f 6e 74 61 69 6e 73  ite3ExprContains
b950: 53 75 62 71 75 65 72 79 28 45 78 70 72 20 2a 70  Subquery(Expr *p
b960: 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20  ){.  Walker w;. 
b970: 20 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c 20 73   memset(&w, 0, s
b980: 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20 77 2e 65  izeof(w));.  w.e
b990: 43 6f 64 65 20 3d 20 31 3b 0a 20 20 77 2e 78 45  Code = 1;.  w.xE
b9a0: 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 73 71  xprCallback = sq
b9b0: 6c 69 74 65 33 45 78 70 72 57 61 6c 6b 4e 6f 6f  lite3ExprWalkNoo
b9c0: 70 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61  p;.  w.xSelectCa
b9d0: 6c 6c 62 61 63 6b 20 3d 20 73 65 6c 65 63 74 4e  llback = selectN
b9e0: 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 3b 0a 20  odeIsConstant;. 
b9f0: 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72   sqlite3WalkExpr
ba00: 28 26 77 2c 20 70 29 3b 0a 20 20 72 65 74 75 72  (&w, p);.  retur
ba10: 6e 20 77 2e 65 43 6f 64 65 3d 3d 30 3b 0a 7d 0a  n w.eCode==0;.}.
ba20: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66  #endif../*.** If
ba30: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
ba40: 70 20 63 6f 64 65 73 20 61 20 63 6f 6e 73 74 61  p codes a consta
ba50: 6e 74 20 69 6e 74 65 67 65 72 20 74 68 61 74 20  nt integer that 
ba60: 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 0a  is small enough.
ba70: 2a 2a 20 74 6f 20 66 69 74 20 69 6e 20 61 20 33  ** to fit in a 3
ba80: 32 2d 62 69 74 20 69 6e 74 65 67 65 72 2c 20 72  2-bit integer, r
ba90: 65 74 75 72 6e 20 31 20 61 6e 64 20 70 75 74 20  eturn 1 and put 
baa0: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
bab0: 20 69 6e 74 65 67 65 72 0a 2a 2a 20 69 6e 20 2a   integer.** in *
bac0: 70 56 61 6c 75 65 2e 20 20 49 66 20 74 68 65 20  pValue.  If the 
bad0: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6e 6f  expression is no
bae0: 74 20 61 6e 20 69 6e 74 65 67 65 72 20 6f 72 20  t an integer or 
baf0: 69 66 20 69 74 20 69 73 20 74 6f 6f 20 62 69 67  if it is too big
bb00: 0a 2a 2a 20 74 6f 20 66 69 74 20 69 6e 20 61 20  .** to fit in a 
bb10: 73 69 67 6e 65 64 20 33 32 2d 62 69 74 20 69 6e  signed 32-bit in
bb20: 74 65 67 65 72 2c 20 72 65 74 75 72 6e 20 30 20  teger, return 0 
bb30: 61 6e 64 20 6c 65 61 76 65 20 2a 70 56 61 6c 75  and leave *pValu
bb40: 65 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a  e unchanged..*/.
bb50: 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 49  int sqlite3ExprI
bb60: 73 49 6e 74 65 67 65 72 28 45 78 70 72 20 2a 70  sInteger(Expr *p
bb70: 2c 20 69 6e 74 20 2a 70 56 61 6c 75 65 29 7b 0a  , int *pValue){.
bb80: 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 0a 20    int rc = 0;.. 
bb90: 20 2f 2a 20 49 66 20 61 6e 20 65 78 70 72 65 73   /* If an expres
bba0: 73 69 6f 6e 20 69 73 20 61 6e 20 69 6e 74 65 67  sion is an integ
bbb0: 65 72 20 6c 69 74 65 72 61 6c 20 74 68 61 74 20  er literal that 
bbc0: 66 69 74 73 20 69 6e 20 61 20 73 69 67 6e 65 64  fits in a signed
bbd0: 20 33 32 2d 62 69 74 0a 20 20 2a 2a 20 69 6e 74   32-bit.  ** int
bbe0: 65 67 65 72 2c 20 74 68 65 6e 20 74 68 65 20 45  eger, then the E
bbf0: 50 5f 49 6e 74 56 61 6c 75 65 20 66 6c 61 67 20  P_IntValue flag 
bc00: 77 69 6c 6c 20 68 61 76 65 20 61 6c 72 65 61 64  will have alread
bc10: 79 20 62 65 65 6e 20 73 65 74 20 2a 2f 0a 20 20  y been set */.  
bc20: 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 21 3d 54  assert( p->op!=T
bc30: 4b 5f 49 4e 54 45 47 45 52 20 7c 7c 20 28 70 2d  K_INTEGER || (p-
bc40: 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e 74 56  >flags & EP_IntV
bc50: 61 6c 75 65 29 21 3d 30 0a 20 20 20 20 20 20 20  alue)!=0.       
bc60: 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 47 65      || sqlite3Ge
bc70: 74 49 6e 74 33 32 28 70 2d 3e 75 2e 7a 54 6f 6b  tInt32(p->u.zTok
bc80: 65 6e 2c 20 26 72 63 29 3d 3d 30 20 29 3b 0a 0a  en, &rc)==0 );..
bc90: 20 20 69 66 28 20 70 2d 3e 66 6c 61 67 73 20 26    if( p->flags &
bca0: 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 29 7b 0a   EP_IntValue ){.
bcb0: 20 20 20 20 2a 70 56 61 6c 75 65 20 3d 20 70 2d      *pValue = p-
bcc0: 3e 75 2e 69 56 61 6c 75 65 3b 0a 20 20 20 20 72  >u.iValue;.    r
bcd0: 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 73  eturn 1;.  }.  s
bce0: 77 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a  witch( p->op ){.
bcf0: 20 20 20 20 63 61 73 65 20 54 4b 5f 55 50 4c 55      case TK_UPLU
bd00: 53 3a 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  S: {.      rc = 
bd10: 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74  sqlite3ExprIsInt
bd20: 65 67 65 72 28 70 2d 3e 70 4c 65 66 74 2c 20 70  eger(p->pLeft, p
bd30: 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 62 72  Value);.      br
bd40: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
bd50: 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b  ase TK_UMINUS: {
bd60: 0a 20 20 20 20 20 20 69 6e 74 20 76 3b 0a 20 20  .      int v;.  
bd70: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
bd80: 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 2d 3e  xprIsInteger(p->
bd90: 70 4c 65 66 74 2c 20 26 76 29 20 29 7b 0a 20 20  pLeft, &v) ){.  
bda0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 76 21        assert( v!
bdb0: 3d 28 2d 32 31 34 37 34 38 33 36 34 37 2d 31 29  =(-2147483647-1)
bdc0: 20 29 3b 0a 20 20 20 20 20 20 20 20 2a 70 56 61   );.        *pVa
bdd0: 6c 75 65 20 3d 20 2d 76 3b 0a 20 20 20 20 20 20  lue = -v;.      
bde0: 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20    rc = 1;.      
bdf0: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
be00: 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74     }.    default
be10: 3a 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72  : break;.  }.  r
be20: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
be30: 2a 2a 20 52 65 74 75 72 6e 20 46 41 4c 53 45 20  ** Return FALSE 
be40: 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 63  if there is no c
be50: 68 61 6e 63 65 20 74 68 61 74 20 74 68 65 20 65  hance that the e
be60: 78 70 72 65 73 73 69 6f 6e 20 63 61 6e 20 62 65  xpression can be
be70: 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   NULL..**.** If 
be80: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6d  the expression m
be90: 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 6f 72 20  ight be NULL or 
bea0: 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
beb0: 6e 20 69 73 20 74 6f 6f 20 63 6f 6d 70 6c 65 78  n is too complex
bec0: 0a 2a 2a 20 74 6f 20 74 65 6c 6c 20 72 65 74 75  .** to tell retu
bed0: 72 6e 20 54 52 55 45 2e 20 20 0a 2a 2a 0a 2a 2a  rn TRUE.  .**.**
bee0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
bef0: 20 75 73 65 64 20 61 73 20 61 6e 20 6f 70 74 69   used as an opti
bf00: 6d 69 7a 61 74 69 6f 6e 2c 20 74 6f 20 73 6b 69  mization, to ski
bf10: 70 20 4f 50 5f 49 73 4e 75 6c 6c 20 6f 70 63 6f  p OP_IsNull opco
bf20: 64 65 73 0a 2a 2a 20 77 68 65 6e 20 77 65 20 6b  des.** when we k
bf30: 6e 6f 77 20 74 68 61 74 20 61 20 76 61 6c 75 65  now that a value
bf40: 20 63 61 6e 6e 6f 74 20 62 65 20 4e 55 4c 4c 2e   cannot be NULL.
bf50: 20 20 48 65 6e 63 65 2c 20 61 20 66 61 6c 73 65    Hence, a false
bf60: 20 70 6f 73 69 74 69 76 65 0a 2a 2a 20 28 72 65   positive.** (re
bf70: 74 75 72 6e 69 6e 67 20 54 52 55 45 20 77 68 65  turning TRUE whe
bf80: 6e 20 69 6e 20 66 61 63 74 20 74 68 65 20 65 78  n in fact the ex
bf90: 70 72 65 73 73 69 6f 6e 20 63 61 6e 20 6e 65 76  pression can nev
bfa0: 65 72 20 62 65 20 4e 55 4c 4c 29 20 6d 69 67 68  er be NULL) migh
bfb0: 74 0a 2a 2a 20 62 65 20 61 20 73 6d 61 6c 6c 20  t.** be a small 
bfc0: 70 65 72 66 6f 72 6d 61 6e 63 65 20 68 69 74 20  performance hit 
bfd0: 62 75 74 20 69 73 20 6f 74 68 65 72 77 69 73 65  but is otherwise
bfe0: 20 68 61 72 6d 6c 65 73 73 2e 20 20 4f 6e 20 74   harmless.  On t
bff0: 68 65 20 6f 74 68 65 72 0a 2a 2a 20 68 61 6e 64  he other.** hand
c000: 2c 20 61 20 66 61 6c 73 65 20 6e 65 67 61 74 69  , a false negati
c010: 76 65 20 28 72 65 74 75 72 6e 69 6e 67 20 46 41  ve (returning FA
c020: 4c 53 45 20 77 68 65 6e 20 74 68 65 20 72 65 73  LSE when the res
c030: 75 6c 74 20 63 6f 75 6c 64 20 62 65 20 4e 55 4c  ult could be NUL
c040: 4c 29 0a 2a 2a 20 77 69 6c 6c 20 6c 69 6b 65 6c  L).** will likel
c050: 79 20 72 65 73 75 6c 74 20 69 6e 20 61 6e 20 69  y result in an i
c060: 6e 63 6f 72 72 65 63 74 20 61 6e 73 77 65 72 2e  ncorrect answer.
c070: 20 20 53 6f 20 77 68 65 6e 20 69 6e 20 64 6f 75    So when in dou
c080: 62 74 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 54 52  bt, return.** TR
c090: 55 45 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  UE..*/.int sqlit
c0a0: 65 33 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28  e3ExprCanBeNull(
c0b0: 63 6f 6e 73 74 20 45 78 70 72 20 2a 70 29 7b 0a  const Expr *p){.
c0c0: 20 20 75 38 20 6f 70 3b 0a 20 20 77 68 69 6c 65    u8 op;.  while
c0d0: 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 50 4c 55  ( p->op==TK_UPLU
c0e0: 53 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55  S || p->op==TK_U
c0f0: 4d 49 4e 55 53 20 29 7b 20 70 20 3d 20 70 2d 3e  MINUS ){ p = p->
c100: 70 4c 65 66 74 3b 20 7d 0a 20 20 6f 70 20 3d 20  pLeft; }.  op = 
c110: 70 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d  p->op;.  if( op=
c120: 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29 20 6f  =TK_REGISTER ) o
c130: 70 20 3d 20 70 2d 3e 6f 70 32 3b 0a 20 20 73 77  p = p->op2;.  sw
c140: 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20  itch( op ){.    
c150: 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a  case TK_INTEGER:
c160: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52  .    case TK_STR
c170: 49 4e 47 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  ING:.    case TK
c180: 5f 46 4c 4f 41 54 3a 0a 20 20 20 20 63 61 73 65  _FLOAT:.    case
c190: 20 54 4b 5f 42 4c 4f 42 3a 0a 20 20 20 20 20 20   TK_BLOB:.      
c1a0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 63 61  return 0;.    ca
c1b0: 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20 20  se TK_COLUMN:.  
c1c0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
c1d0: 54 61 62 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  Tab!=0 );.      
c1e0: 72 65 74 75 72 6e 20 45 78 70 72 48 61 73 50 72  return ExprHasPr
c1f0: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 43 61 6e  operty(p, EP_Can
c200: 42 65 4e 75 6c 6c 29 20 7c 7c 0a 20 20 20 20 20  BeNull) ||.     
c210: 20 20 20 20 20 20 20 20 28 70 2d 3e 69 43 6f 6c          (p->iCol
c220: 75 6d 6e 3e 3d 30 20 26 26 20 70 2d 3e 70 54 61  umn>=0 && p->pTa
c230: 62 2d 3e 61 43 6f 6c 5b 70 2d 3e 69 43 6f 6c 75  b->aCol[p->iColu
c240: 6d 6e 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 29 3b  mn].notNull==0);
c250: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20  .    default:.  
c260: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
c270: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  }.}../*.** Retur
c280: 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 67 69  n TRUE if the gi
c290: 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69  ven expression i
c2a0: 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 77 68 69  s a constant whi
c2b0: 63 68 20 77 6f 75 6c 64 20 62 65 0a 2a 2a 20 75  ch would be.** u
c2c0: 6e 63 68 61 6e 67 65 64 20 62 79 20 4f 50 5f 41  nchanged by OP_A
c2d0: 66 66 69 6e 69 74 79 20 77 69 74 68 20 74 68 65  ffinity with the
c2e0: 20 61 66 66 69 6e 69 74 79 20 67 69 76 65 6e 20   affinity given 
c2f0: 69 6e 20 74 68 65 20 73 65 63 6f 6e 64 0a 2a 2a  in the second.**
c300: 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a   argument..**.**
c310: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
c320: 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69   used to determi
c330: 6e 65 20 69 66 20 74 68 65 20 4f 50 5f 41 66 66  ne if the OP_Aff
c340: 69 6e 69 74 79 20 6f 70 65 72 61 74 69 6f 6e 0a  inity operation.
c350: 2a 2a 20 63 61 6e 20 62 65 20 6f 6d 69 74 74 65  ** can be omitte
c360: 64 2e 20 20 57 68 65 6e 20 69 6e 20 64 6f 75 62  d.  When in doub
c370: 74 20 72 65 74 75 72 6e 20 46 41 4c 53 45 2e 20  t return FALSE. 
c380: 20 41 20 66 61 6c 73 65 20 6e 65 67 61 74 69 76   A false negativ
c390: 65 0a 2a 2a 20 69 73 20 68 61 72 6d 6c 65 73 73  e.** is harmless
c3a0: 2e 20 20 41 20 66 61 6c 73 65 20 70 6f 73 69 74  .  A false posit
c3b0: 69 76 65 2c 20 68 6f 77 65 76 65 72 2c 20 63 61  ive, however, ca
c3c0: 6e 20 72 65 73 75 6c 74 20 69 6e 20 74 68 65 20  n result in the 
c3d0: 77 72 6f 6e 67 0a 2a 2a 20 61 6e 73 77 65 72 2e  wrong.** answer.
c3e0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
c3f0: 78 70 72 4e 65 65 64 73 4e 6f 41 66 66 69 6e 69  xprNeedsNoAffini
c400: 74 79 43 68 61 6e 67 65 28 63 6f 6e 73 74 20 45  tyChange(const E
c410: 78 70 72 20 2a 70 2c 20 63 68 61 72 20 61 66 66  xpr *p, char aff
c420: 29 7b 0a 20 20 75 38 20 6f 70 3b 0a 20 20 69 66  ){.  u8 op;.  if
c430: 28 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46  ( aff==SQLITE_AF
c440: 46 5f 42 4c 4f 42 20 29 20 72 65 74 75 72 6e 20  F_BLOB ) return 
c450: 31 3b 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 6f  1;.  while( p->o
c460: 70 3d 3d 54 4b 5f 55 50 4c 55 53 20 7c 7c 20 70  p==TK_UPLUS || p
c470: 2d 3e 6f 70 3d 3d 54 4b 5f 55 4d 49 4e 55 53 20  ->op==TK_UMINUS 
c480: 29 7b 20 70 20 3d 20 70 2d 3e 70 4c 65 66 74 3b  ){ p = p->pLeft;
c490: 20 7d 0a 20 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b   }.  op = p->op;
c4a0: 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 52 45  .  if( op==TK_RE
c4b0: 47 49 53 54 45 52 20 29 20 6f 70 20 3d 20 70 2d  GISTER ) op = p-
c4c0: 3e 6f 70 32 3b 0a 20 20 73 77 69 74 63 68 28 20  >op2;.  switch( 
c4d0: 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
c4e0: 4b 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20  K_INTEGER: {.   
c4f0: 20 20 20 72 65 74 75 72 6e 20 61 66 66 3d 3d 53     return aff==S
c500: 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45  QLITE_AFF_INTEGE
c510: 52 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45  R || aff==SQLITE
c520: 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20  _AFF_NUMERIC;.  
c530: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
c540: 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20 72  FLOAT: {.      r
c550: 65 74 75 72 6e 20 61 66 66 3d 3d 53 51 4c 49 54  eturn aff==SQLIT
c560: 45 5f 41 46 46 5f 52 45 41 4c 20 7c 7c 20 61 66  E_AFF_REAL || af
c570: 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55  f==SQLITE_AFF_NU
c580: 4d 45 52 49 43 3b 0a 20 20 20 20 7d 0a 20 20 20  MERIC;.    }.   
c590: 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a   case TK_STRING:
c5a0: 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   {.      return 
c5b0: 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
c5c0: 54 45 58 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  TEXT;.    }.    
c5d0: 63 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 20 7b 0a  case TK_BLOB: {.
c5e0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
c5f0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
c600: 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20  K_COLUMN: {.    
c610: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 54 61    assert( p->iTa
c620: 62 6c 65 3e 3d 30 20 29 3b 20 20 2f 2a 20 70 20  ble>=0 );  /* p 
c630: 63 61 6e 6e 6f 74 20 62 65 20 70 61 72 74 20 6f  cannot be part o
c640: 66 20 61 20 43 48 45 43 4b 20 63 6f 6e 73 74 72  f a CHECK constr
c650: 61 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20 72 65  aint */.      re
c660: 74 75 72 6e 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3c  turn p->iColumn<
c670: 30 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 28  0.          && (
c680: 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
c690: 49 4e 54 45 47 45 52 20 7c 7c 20 61 66 66 3d 3d  INTEGER || aff==
c6a0: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
c6b0: 49 43 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64  IC);.    }.    d
c6c0: 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
c6d0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
c6e0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74    }.}../*.** Ret
c6f0: 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
c700: 67 69 76 65 6e 20 73 74 72 69 6e 67 20 69 73 20  given string is 
c710: 61 20 72 6f 77 2d 69 64 20 63 6f 6c 75 6d 6e 20  a row-id column 
c720: 6e 61 6d 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  name..*/.int sql
c730: 69 74 65 33 49 73 52 6f 77 69 64 28 63 6f 6e 73  ite3IsRowid(cons
c740: 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 66  t char *z){.  if
c750: 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
c760: 28 7a 2c 20 22 5f 52 4f 57 49 44 5f 22 29 3d 3d  (z, "_ROWID_")==
c770: 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
c780: 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
c790: 6d 70 28 7a 2c 20 22 52 4f 57 49 44 22 29 3d 3d  mp(z, "ROWID")==
c7a0: 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
c7b0: 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
c7c0: 6d 70 28 7a 2c 20 22 4f 49 44 22 29 3d 3d 30 20  mp(z, "OID")==0 
c7d0: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 72 65  ) return 1;.  re
c7e0: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
c7f0: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
c800: 77 65 20 61 72 65 20 61 62 6c 65 20 74 6f 20 74  we are able to t
c810: 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 6f  he IN operator o
c820: 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6f 6e 20 61  ptimization on a
c830: 0a 2a 2a 20 71 75 65 72 79 20 6f 66 20 74 68 65  .** query of the
c840: 20 66 6f 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20   form.**.**     
c850: 20 20 78 20 49 4e 20 28 53 45 4c 45 43 54 20 2e    x IN (SELECT .
c860: 2e 2e 29 0a 2a 2a 0a 2a 2a 20 57 68 65 72 65 20  ..).**.** Where 
c870: 74 68 65 20 53 45 4c 45 43 54 2e 2e 2e 20 63 6c  the SELECT... cl
c880: 61 75 73 65 20 69 73 20 61 73 20 73 70 65 63 69  ause is as speci
c890: 66 69 65 64 20 62 79 20 74 68 65 20 70 61 72 61  fied by the para
c8a0: 6d 65 74 65 72 20 74 6f 20 74 68 69 73 0a 2a 2a  meter to this.**
c8b0: 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20   routine..**.** 
c8c0: 54 68 65 20 53 65 6c 65 63 74 20 6f 62 6a 65 63  The Select objec
c8d0: 74 20 70 61 73 73 65 64 20 69 6e 20 68 61 73 20  t passed in has 
c8e0: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 70 72 65  already been pre
c8f0: 70 72 6f 63 65 73 73 65 64 20 61 6e 64 20 6e 6f  processed and no
c900: 0a 2a 2a 20 65 72 72 6f 72 73 20 68 61 76 65 20  .** errors have 
c910: 62 65 65 6e 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 23  been found..*/.#
c920: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
c930: 49 54 5f 53 55 42 51 55 45 52 59 0a 73 74 61 74  IT_SUBQUERY.stat
c940: 69 63 20 69 6e 74 20 69 73 43 61 6e 64 69 64 61  ic int isCandida
c950: 74 65 46 6f 72 49 6e 4f 70 74 28 53 65 6c 65 63  teForInOpt(Selec
c960: 74 20 2a 70 29 7b 0a 20 20 53 72 63 4c 69 73 74  t *p){.  SrcList
c970: 20 2a 70 53 72 63 3b 0a 20 20 45 78 70 72 4c 69   *pSrc;.  ExprLi
c980: 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 54 61  st *pEList;.  Ta
c990: 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 69 66 28  ble *pTab;.  if(
c9a0: 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30   p==0 ) return 0
c9b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
c9c0: 20 20 20 20 2f 2a 20 72 69 67 68 74 2d 68 61 6e      /* right-han
c9d0: 64 20 73 69 64 65 20 6f 66 20 49 4e 20 69 73 20  d side of IN is 
c9e0: 53 45 4c 45 43 54 20 2a 2f 0a 20 20 69 66 28 20  SELECT */.  if( 
c9f0: 70 2d 3e 70 50 72 69 6f 72 20 29 20 72 65 74 75  p->pPrior ) retu
ca00: 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
ca10: 20 20 20 2f 2a 20 4e 6f 74 20 61 20 63 6f 6d 70     /* Not a comp
ca20: 6f 75 6e 64 20 53 45 4c 45 43 54 20 2a 2f 0a 20  ound SELECT */. 
ca30: 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73   if( p->selFlags
ca40: 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c   & (SF_Distinct|
ca50: 53 46 5f 41 67 67 72 65 67 61 74 65 29 20 29 7b  SF_Aggregate) ){
ca60: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28  .    testcase( (
ca70: 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53  p->selFlags & (S
ca80: 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67  F_Distinct|SF_Ag
ca90: 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 44 69  gregate))==SF_Di
caa0: 73 74 69 6e 63 74 20 29 3b 0a 20 20 20 20 74 65  stinct );.    te
cab0: 73 74 63 61 73 65 28 20 28 70 2d 3e 73 65 6c 46  stcase( (p->selF
cac0: 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74 69  lags & (SF_Disti
cad0: 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65  nct|SF_Aggregate
cae0: 29 29 3d 3d 53 46 5f 41 67 67 72 65 67 61 74 65  ))==SF_Aggregate
caf0: 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   );.    return 0
cb00: 3b 20 2f 2a 20 4e 6f 20 44 49 53 54 49 4e 43 54  ; /* No DISTINCT
cb10: 20 6b 65 79 77 6f 72 64 20 61 6e 64 20 6e 6f 20   keyword and no 
cb20: 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
cb30: 6f 6e 73 20 2a 2f 0a 20 20 7d 0a 20 20 61 73 73  ons */.  }.  ass
cb40: 65 72 74 28 20 70 2d 3e 70 47 72 6f 75 70 42 79  ert( p->pGroupBy
cb50: 3d 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20 20  ==0 );          
cb60: 20 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20 47 52      /* Has no GR
cb70: 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  OUP BY clause */
cb80: 0a 20 20 69 66 28 20 70 2d 3e 70 4c 69 6d 69 74  .  if( p->pLimit
cb90: 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
cba0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 73            /* Has
cbb0: 20 6e 6f 20 4c 49 4d 49 54 20 63 6c 61 75 73 65   no LIMIT clause
cbc0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d   */.  assert( p-
cbd0: 3e 70 4f 66 66 73 65 74 3d 3d 30 20 29 3b 20 20  >pOffset==0 );  
cbe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
cbf0: 4e 6f 20 4c 49 4d 49 54 20 6d 65 61 6e 73 20 6e  No LIMIT means n
cc00: 6f 20 4f 46 46 53 45 54 20 2a 2f 0a 20 20 69 66  o OFFSET */.  if
cc10: 28 20 70 2d 3e 70 57 68 65 72 65 20 29 20 72 65  ( p->pWhere ) re
cc20: 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
cc30: 20 20 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20 57       /* Has no W
cc40: 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
cc50: 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b   pSrc = p->pSrc;
cc60: 0a 20 20 61 73 73 65 72 74 28 20 70 53 72 63 21  .  assert( pSrc!
cc70: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 53 72 63  =0 );.  if( pSrc
cc80: 2d 3e 6e 53 72 63 21 3d 31 20 29 20 72 65 74 75  ->nSrc!=1 ) retu
cc90: 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f  rn 0;          /
cca0: 2a 20 53 69 6e 67 6c 65 20 74 65 72 6d 20 69 6e  * Single term in
ccb0: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a   FROM clause */.
ccc0: 20 20 69 66 28 20 70 53 72 63 2d 3e 61 5b 30 5d    if( pSrc->a[0]
ccd0: 2e 70 53 65 6c 65 63 74 20 29 20 72 65 74 75 72  .pSelect ) retur
cce0: 6e 20 30 3b 20 20 20 20 20 2f 2a 20 46 52 4f 4d  n 0;     /* FROM
ccf0: 20 69 73 20 6e 6f 74 20 61 20 73 75 62 71 75 65   is not a subque
cd00: 72 79 20 6f 72 20 76 69 65 77 20 2a 2f 0a 20 20  ry or view */.  
cd10: 70 54 61 62 20 3d 20 70 53 72 63 2d 3e 61 5b 30  pTab = pSrc->a[0
cd20: 5d 2e 70 54 61 62 3b 0a 20 20 69 66 28 20 4e 45  ].pTab;.  if( NE
cd30: 56 45 52 28 70 54 61 62 3d 3d 30 29 20 29 20 72  VER(pTab==0) ) r
cd40: 65 74 75 72 6e 20 30 3b 0a 20 20 61 73 73 65 72  eturn 0;.  asser
cd50: 74 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74  t( pTab->pSelect
cd60: 3d 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20 20  ==0 );          
cd70: 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65    /* FROM clause
cd80: 20 69 73 20 6e 6f 74 20 61 20 76 69 65 77 20 2a   is not a view *
cd90: 2f 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61  /.  if( IsVirtua
cda0: 6c 28 70 54 61 62 29 20 29 20 72 65 74 75 72 6e  l(pTab) ) return
cdb0: 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 52   0;        /* FR
cdc0: 4f 4d 20 63 6c 61 75 73 65 20 6e 6f 74 20 61 20  OM clause not a 
cdd0: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f  virtual table */
cde0: 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70  .  pEList = p->p
cdf0: 45 4c 69 73 74 3b 0a 20 20 69 66 28 20 70 45 4c  EList;.  if( pEL
ce00: 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29 20  ist->nExpr!=1 ) 
ce10: 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
ce20: 2f 2a 20 4f 6e 65 20 63 6f 6c 75 6d 6e 20 69 6e  /* One column in
ce30: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
ce40: 2a 2f 0a 20 20 69 66 28 20 70 45 4c 69 73 74 2d  */.  if( pEList-
ce50: 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 21  >a[0].pExpr->op!
ce60: 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 72 65 74  =TK_COLUMN ) ret
ce70: 75 72 6e 20 30 3b 20 2f 2a 20 52 65 73 75 6c 74  urn 0; /* Result
ce80: 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 2a 2f 0a   is a column */.
ce90: 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65    return 1;.}.#e
cea0: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
ceb0: 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a  MIT_SUBQUERY */.
cec0: 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f  ./*.** Code an O
ced0: 50 5f 4f 6e 63 65 20 69 6e 73 74 72 75 63 74 69  P_Once instructi
cee0: 6f 6e 20 61 6e 64 20 61 6c 6c 6f 63 61 74 65 20  on and allocate 
cef0: 73 70 61 63 65 20 66 6f 72 20 69 74 73 20 66 6c  space for its fl
cf00: 61 67 2e 20 52 65 74 75 72 6e 20 74 68 65 20 0a  ag. Return the .
cf10: 2a 2a 20 61 64 64 72 65 73 73 20 6f 66 20 74 68  ** address of th
cf20: 65 20 6e 65 77 20 69 6e 73 74 72 75 63 74 69 6f  e new instructio
cf30: 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  n..*/.int sqlite
cf40: 33 43 6f 64 65 4f 6e 63 65 28 50 61 72 73 65 20  3CodeOnce(Parse 
cf50: 2a 70 50 61 72 73 65 29 7b 0a 20 20 56 64 62 65  *pParse){.  Vdbe
cf60: 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74   *v = sqlite3Get
cf70: 56 64 62 65 28 70 50 61 72 73 65 29 3b 20 20 20  Vdbe(pParse);   
cf80: 20 20 20 2f 2a 20 56 69 72 74 75 61 6c 20 6d 61     /* Virtual ma
cf90: 63 68 69 6e 65 20 62 65 69 6e 67 20 63 6f 64 65  chine being code
cfa0: 64 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 73 71  d */.  return sq
cfb0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
cfc0: 76 2c 20 4f 50 5f 4f 6e 63 65 2c 20 70 50 61 72  v, OP_Once, pPar
cfd0: 73 65 2d 3e 6e 4f 6e 63 65 2b 2b 29 3b 0a 7d 0a  se->nOnce++);.}.
cfe0: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
cff0: 63 6f 64 65 20 74 68 61 74 20 63 68 65 63 6b 73  code that checks
d000: 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 63   the left-most c
d010: 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78 20 74  olumn of index t
d020: 61 62 6c 65 20 69 43 75 72 20 74 6f 20 73 65 65  able iCur to see
d030: 20 69 66 0a 2a 2a 20 69 74 20 63 6f 6e 74 61 69   if.** it contai
d040: 6e 73 20 61 6e 79 20 4e 55 4c 4c 20 65 6e 74 72  ns any NULL entr
d050: 69 65 73 2e 20 20 43 61 75 73 65 20 74 68 65 20  ies.  Cause the 
d060: 72 65 67 69 73 74 65 72 20 61 74 20 72 65 67 48  register at regH
d070: 61 73 4e 75 6c 6c 20 74 6f 20 62 65 20 73 65 74  asNull to be set
d080: 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 4e 55 4c  .** to a non-NUL
d090: 4c 20 76 61 6c 75 65 20 69 66 20 69 43 75 72 20  L value if iCur 
d0a0: 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 4e 55 4c 4c  contains no NULL
d0b0: 73 2e 20 20 43 61 75 73 65 20 72 65 67 69 73 74  s.  Cause regist
d0c0: 65 72 20 72 65 67 48 61 73 4e 75 6c 6c 0a 2a 2a  er regHasNull.**
d0d0: 20 74 6f 20 62 65 20 73 65 74 20 74 6f 20 4e 55   to be set to NU
d0e0: 4c 4c 20 69 66 20 69 43 75 72 20 63 6f 6e 74 61  LL if iCur conta
d0f0: 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  ins one or more 
d100: 4e 55 4c 4c 20 76 61 6c 75 65 73 2e 0a 2a 2f 0a  NULL values..*/.
d110: 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69  static void sqli
d120: 74 65 33 53 65 74 48 61 73 4e 75 6c 6c 46 6c 61  te3SetHasNullFla
d130: 67 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 69  g(Vdbe *v, int i
d140: 43 75 72 2c 20 69 6e 74 20 72 65 67 48 61 73 4e  Cur, int regHasN
d150: 75 6c 6c 29 7b 0a 20 20 69 6e 74 20 61 64 64 72  ull){.  int addr
d160: 31 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  1;.  sqlite3Vdbe
d170: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
d180: 65 67 65 72 2c 20 30 2c 20 72 65 67 48 61 73 4e  eger, 0, regHasN
d190: 75 6c 6c 29 3b 0a 20 20 61 64 64 72 31 20 3d 20  ull);.  addr1 = 
d1a0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
d1b0: 31 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20  1(v, OP_Rewind, 
d1c0: 69 43 75 72 29 3b 20 56 64 62 65 43 6f 76 65 72  iCur); VdbeCover
d1d0: 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65  age(v);.  sqlite
d1e0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
d1f0: 50 5f 43 6f 6c 75 6d 6e 2c 20 69 43 75 72 2c 20  P_Column, iCur, 
d200: 30 2c 20 72 65 67 48 61 73 4e 75 6c 6c 29 3b 0a  0, regHasNull);.
d210: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
d220: 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f  ngeP5(v, OPFLAG_
d230: 54 59 50 45 4f 46 41 52 47 29 3b 0a 20 20 56 64  TYPEOFARG);.  Vd
d240: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 66  beComment((v, "f
d250: 69 72 73 74 5f 65 6e 74 72 79 5f 69 6e 28 25 64  irst_entry_in(%d
d260: 29 22 2c 20 69 43 75 72 29 29 3b 0a 20 20 73 71  )", iCur));.  sq
d270: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
d280: 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 7d 0a 0a  e(v, addr1);.}..
d290: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
d2a0: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a  OMIT_SUBQUERY./*
d2b0: 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74  .** The argument
d2c0: 20 69 73 20 61 6e 20 49 4e 20 6f 70 65 72 61 74   is an IN operat
d2d0: 6f 72 20 77 69 74 68 20 61 20 6c 69 73 74 20 28  or with a list (
d2e0: 6e 6f 74 20 61 20 73 75 62 71 75 65 72 79 29 20  not a subquery) 
d2f0: 6f 6e 20 74 68 65 20 0a 2a 2a 20 72 69 67 68 74  on the .** right
d300: 2d 68 61 6e 64 20 73 69 64 65 2e 20 20 52 65 74  -hand side.  Ret
d310: 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 61 74  urn TRUE if that
d320: 20 6c 69 73 74 20 69 73 20 63 6f 6e 73 74 61 6e   list is constan
d330: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
d340: 20 73 71 6c 69 74 65 33 49 6e 52 68 73 49 73 43   sqlite3InRhsIsC
d350: 6f 6e 73 74 61 6e 74 28 45 78 70 72 20 2a 70 49  onstant(Expr *pI
d360: 6e 29 7b 0a 20 20 45 78 70 72 20 2a 70 4c 48 53  n){.  Expr *pLHS
d370: 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 61  ;.  int res;.  a
d380: 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
d390: 72 6f 70 65 72 74 79 28 70 49 6e 2c 20 45 50 5f  roperty(pIn, EP_
d3a0: 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20  xIsSelect) );.  
d3b0: 70 4c 48 53 20 3d 20 70 49 6e 2d 3e 70 4c 65 66  pLHS = pIn->pLef
d3c0: 74 3b 0a 20 20 70 49 6e 2d 3e 70 4c 65 66 74 20  t;.  pIn->pLeft 
d3d0: 3d 20 30 3b 0a 20 20 72 65 73 20 3d 20 73 71 6c  = 0;.  res = sql
d3e0: 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
d3f0: 6e 74 28 70 49 6e 29 3b 0a 20 20 70 49 6e 2d 3e  nt(pIn);.  pIn->
d400: 70 4c 65 66 74 20 3d 20 70 4c 48 53 3b 0a 20 20  pLeft = pLHS;.  
d410: 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 23 65  return res;.}.#e
d420: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ndif../*.** This
d430: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
d440: 64 20 62 79 20 74 68 65 20 69 6d 70 6c 65 6d 65  d by the impleme
d450: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 49  ntation of the I
d460: 4e 20 28 2e 2e 2e 29 20 6f 70 65 72 61 74 6f 72  N (...) operator
d470: 2e 0a 2a 2a 20 54 68 65 20 70 58 20 70 61 72 61  ..** The pX para
d480: 6d 65 74 65 72 20 69 73 20 74 68 65 20 65 78 70  meter is the exp
d490: 72 65 73 73 69 6f 6e 20 6f 6e 20 74 68 65 20 52  ression on the R
d4a0: 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65  HS of the IN ope
d4b0: 72 61 74 6f 72 2c 20 77 68 69 63 68 0a 2a 2a 20  rator, which.** 
d4c0: 6d 69 67 68 74 20 62 65 20 65 69 74 68 65 72 20  might be either 
d4d0: 61 20 6c 69 73 74 20 6f 66 20 65 78 70 72 65 73  a list of expres
d4e0: 73 69 6f 6e 73 20 6f 72 20 61 20 73 75 62 71 75  sions or a subqu
d4f0: 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a  ery..**.** The j
d500: 6f 62 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69  ob of this routi
d510: 6e 65 20 69 73 20 74 6f 20 66 69 6e 64 20 6f 72  ne is to find or
d520: 20 63 72 65 61 74 65 20 61 20 62 2d 74 72 65 65   create a b-tree
d530: 20 6f 62 6a 65 63 74 20 74 68 61 74 20 63 61 6e   object that can
d540: 0a 2a 2a 20 62 65 20 75 73 65 64 20 65 69 74 68  .** be used eith
d550: 65 72 20 74 6f 20 74 65 73 74 20 66 6f 72 20 6d  er to test for m
d560: 65 6d 62 65 72 73 68 69 70 20 69 6e 20 74 68 65  embership in the
d570: 20 52 48 53 20 73 65 74 20 6f 72 20 74 6f 20 69   RHS set or to i
d580: 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 0a 2a  terate through.*
d590: 2a 20 61 6c 6c 20 6d 65 6d 62 65 72 73 20 6f 66  * all members of
d5a0: 20 74 68 65 20 52 48 53 20 73 65 74 2c 20 73 6b   the RHS set, sk
d5b0: 69 70 70 69 6e 67 20 64 75 70 6c 69 63 61 74 65  ipping duplicate
d5c0: 73 2e 0a 2a 2a 0a 2a 2a 20 41 20 63 75 72 73 6f  s..**.** A curso
d5d0: 72 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e 20 74  r is opened on t
d5e0: 68 65 20 62 2d 74 72 65 65 20 6f 62 6a 65 63 74  he b-tree object
d5f0: 20 74 68 61 74 20 69 73 20 74 68 65 20 52 48 53   that is the RHS
d600: 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61   of the IN opera
d610: 74 6f 72 0a 2a 2a 20 61 6e 64 20 70 58 2d 3e 69  tor.** and pX->i
d620: 54 61 62 6c 65 20 69 73 20 73 65 74 20 74 6f 20  Table is set to 
d630: 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 61  the index of tha
d640: 74 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20  t cursor..**.** 
d650: 54 68 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c  The returned val
d660: 75 65 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74  ue of this funct
d670: 69 6f 6e 20 69 6e 64 69 63 61 74 65 73 20 74 68  ion indicates th
d680: 65 20 62 2d 74 72 65 65 20 74 79 70 65 2c 20 61  e b-tree type, a
d690: 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
d6a0: 20 20 20 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49     IN_INDEX_ROWI
d6b0: 44 20 20 20 20 20 20 2d 20 54 68 65 20 63 75 72  D      - The cur
d6c0: 73 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f  sor was opened o
d6d0: 6e 20 61 20 64 61 74 61 62 61 73 65 20 74 61 62  n a database tab
d6e0: 6c 65 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45  le..**   IN_INDE
d6f0: 58 5f 49 4e 44 45 58 5f 41 53 43 20 20 2d 20 54  X_INDEX_ASC  - T
d700: 68 65 20 63 75 72 73 6f 72 20 77 61 73 20 6f 70  he cursor was op
d710: 65 6e 65 64 20 6f 6e 20 61 6e 20 61 73 63 65 6e  ened on an ascen
d720: 64 69 6e 67 20 69 6e 64 65 78 2e 0a 2a 2a 20 20  ding index..**  
d730: 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f   IN_INDEX_INDEX_
d740: 44 45 53 43 20 2d 20 54 68 65 20 63 75 72 73 6f  DESC - The curso
d750: 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20  r was opened on 
d760: 61 20 64 65 73 63 65 6e 64 69 6e 67 20 69 6e 64  a descending ind
d770: 65 78 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45  ex..**   IN_INDE
d780: 58 5f 45 50 48 20 20 20 20 20 20 20 20 2d 20 54  X_EPH        - T
d790: 68 65 20 63 75 72 73 6f 72 20 77 61 73 20 6f 70  he cursor was op
d7a0: 65 6e 65 64 20 6f 6e 20 61 20 73 70 65 63 69 61  ened on a specia
d7b0: 6c 6c 79 20 63 72 65 61 74 65 64 20 61 6e 64 0a  lly created and.
d7c0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
d7d0: 20 20 20 20 20 20 20 20 20 20 20 70 6f 70 75 6c             popul
d7e0: 61 74 65 64 20 65 70 68 65 72 65 6d 61 6c 20 74  ated epheremal t
d7f0: 61 62 6c 65 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e  able..**   IN_IN
d800: 44 45 58 5f 4e 4f 4f 50 20 20 20 20 20 20 20 2d  DEX_NOOP       -
d810: 20 4e 6f 20 63 75 72 73 6f 72 20 77 61 73 20 61   No cursor was a
d820: 6c 6c 6f 63 61 74 65 64 2e 20 20 54 68 65 20 49  llocated.  The I
d830: 4e 20 6f 70 65 72 61 74 6f 72 20 6d 75 73 74 20  N operator must 
d840: 62 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  be.**           
d850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6d                im
d860: 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 20 73  plemented as a s
d870: 65 71 75 65 6e 63 65 20 6f 66 20 63 6f 6d 70 61  equence of compa
d880: 72 69 73 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e  risons..**.** An
d890: 20 65 78 69 73 74 69 6e 67 20 62 2d 74 72 65 65   existing b-tree
d8a0: 20 6d 69 67 68 74 20 62 65 20 75 73 65 64 20 69   might be used i
d8b0: 66 20 74 68 65 20 52 48 53 20 65 78 70 72 65 73  f the RHS expres
d8c0: 73 69 6f 6e 20 70 58 20 69 73 20 61 20 73 69 6d  sion pX is a sim
d8d0: 70 6c 65 0a 2a 2a 20 73 75 62 71 75 65 72 79 20  ple.** subquery 
d8e0: 73 75 63 68 20 61 73 3a 0a 2a 2a 0a 2a 2a 20 20  such as:.**.**  
d8f0: 20 20 20 53 45 4c 45 43 54 20 3c 63 6f 6c 75 6d     SELECT <colum
d900: 6e 3e 20 46 52 4f 4d 20 3c 74 61 62 6c 65 3e 0a  n> FROM <table>.
d910: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 52 48 53  **.** If the RHS
d920: 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61   of the IN opera
d930: 74 6f 72 20 69 73 20 61 20 6c 69 73 74 20 6f 72  tor is a list or
d940: 20 61 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20   a more complex 
d950: 73 75 62 71 75 65 72 79 2c 20 74 68 65 6e 0a 2a  subquery, then.*
d960: 2a 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 74  * an ephemeral t
d970: 61 62 6c 65 20 6d 69 67 68 74 20 6e 65 65 64 20  able might need 
d980: 74 6f 20 62 65 20 67 65 6e 65 72 61 74 65 64 20  to be generated 
d990: 66 72 6f 6d 20 74 68 65 20 52 48 53 20 61 6e 64  from the RHS and
d9a0: 20 74 68 65 6e 0a 2a 2a 20 70 58 2d 3e 69 54 61   then.** pX->iTa
d9b0: 62 6c 65 20 6d 61 64 65 20 74 6f 20 70 6f 69 6e  ble made to poin
d9c0: 74 20 74 6f 20 74 68 65 20 65 70 68 65 6d 65 72  t to the ephemer
d9d0: 61 6c 20 74 61 62 6c 65 20 69 6e 73 74 65 61 64  al table instead
d9e0: 20 6f 66 20 61 6e 0a 2a 2a 20 65 78 69 73 74 69   of an.** existi
d9f0: 6e 67 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ng table..**.** 
da00: 54 68 65 20 69 6e 46 6c 61 67 73 20 70 61 72 61  The inFlags para
da10: 6d 65 74 65 72 20 6d 75 73 74 20 63 6f 6e 74 61  meter must conta
da20: 69 6e 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 6f  in exactly one o
da30: 66 20 74 68 65 20 62 69 74 73 0a 2a 2a 20 49 4e  f the bits.** IN
da40: 5f 49 4e 44 45 58 5f 4d 45 4d 42 45 52 53 48 49  _INDEX_MEMBERSHI
da50: 50 20 6f 72 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f  P or IN_INDEX_LO
da60: 4f 50 2e 20 20 49 66 20 69 6e 46 6c 61 67 73 20  OP.  If inFlags 
da70: 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 49 4e 5f 49  contains.** IN_I
da80: 4e 44 45 58 5f 4d 45 4d 42 45 52 53 48 49 50 2c  NDEX_MEMBERSHIP,
da90: 20 74 68 65 6e 20 74 68 65 20 67 65 6e 65 72 61   then the genera
daa0: 74 65 64 20 74 61 62 6c 65 20 77 69 6c 6c 20 62  ted table will b
dab0: 65 20 75 73 65 64 20 66 6f 72 20 61 0a 2a 2a 20  e used for a.** 
dac0: 66 61 73 74 20 6d 65 6d 62 65 72 73 68 69 70 20  fast membership 
dad0: 74 65 73 74 2e 20 20 57 68 65 6e 20 74 68 65 20  test.  When the 
dae0: 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 20 62 69  IN_INDEX_LOOP bi
daf0: 74 20 69 73 20 73 65 74 2c 20 74 68 65 0a 2a 2a  t is set, the.**
db00: 20 49 4e 20 69 6e 64 65 78 20 77 69 6c 6c 20 62   IN index will b
db10: 65 20 75 73 65 64 20 74 6f 20 6c 6f 6f 70 20 6f  e used to loop o
db20: 76 65 72 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f  ver all values o
db30: 66 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 65  f the RHS of the
db40: 0a 2a 2a 20 49 4e 20 6f 70 65 72 61 74 6f 72 2e  .** IN operator.
db50: 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 49 4e 5f 49  .**.** When IN_I
db60: 4e 44 45 58 5f 4c 4f 4f 50 20 69 73 20 75 73 65  NDEX_LOOP is use
db70: 64 20 28 61 6e 64 20 74 68 65 20 62 2d 74 72 65  d (and the b-tre
db80: 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74  e will be used t
db90: 6f 20 69 74 65 72 61 74 65 0a 2a 2a 20 74 68 72  o iterate.** thr
dba0: 6f 75 67 68 20 74 68 65 20 73 65 74 20 6d 65 6d  ough the set mem
dbb0: 62 65 72 73 29 20 74 68 65 6e 20 74 68 65 20 62  bers) then the b
dbc0: 2d 74 72 65 65 20 6d 75 73 74 20 6e 6f 74 20 63  -tree must not c
dbd0: 6f 6e 74 61 69 6e 20 64 75 70 6c 69 63 61 74 65  ontain duplicate
dbe0: 73 2e 0a 2a 2a 20 41 6e 20 65 70 68 65 72 65 6d  s..** An epherem
dbf0: 61 6c 20 74 61 62 6c 65 20 6d 75 73 74 20 62 65  al table must be
dc00: 20 75 73 65 64 20 75 6e 6c 65 73 73 20 74 68 65   used unless the
dc10: 20 73 65 6c 65 63 74 65 64 20 3c 63 6f 6c 75 6d   selected <colum
dc20: 6e 3e 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  n> is guaranteed
dc30: 0a 2a 2a 20 74 6f 20 62 65 20 75 6e 69 71 75 65  .** to be unique
dc40: 20 2d 20 65 69 74 68 65 72 20 62 65 63 61 75 73   - either becaus
dc50: 65 20 69 74 20 69 73 20 61 6e 20 49 4e 54 45 47  e it is an INTEG
dc60: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f  ER PRIMARY KEY o
dc70: 72 20 69 74 0a 2a 2a 20 68 61 73 20 61 20 55 4e  r it.** has a UN
dc80: 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20  IQUE constraint 
dc90: 6f 72 20 55 4e 49 51 55 45 20 69 6e 64 65 78 2e  or UNIQUE index.
dca0: 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 49 4e 5f 49  .**.** When IN_I
dcb0: 4e 44 45 58 5f 4d 45 4d 42 45 52 53 48 49 50 20  NDEX_MEMBERSHIP 
dcc0: 69 73 20 75 73 65 64 20 28 61 6e 64 20 74 68 65  is used (and the
dcd0: 20 62 2d 74 72 65 65 20 77 69 6c 6c 20 62 65 20   b-tree will be 
dce0: 75 73 65 64 20 0a 2a 2a 20 66 6f 72 20 66 61 73  used .** for fas
dcf0: 74 20 73 65 74 20 6d 65 6d 62 65 72 73 68 69 70  t set membership
dd00: 20 74 65 73 74 73 29 20 74 68 65 6e 20 61 6e 20   tests) then an 
dd10: 65 70 68 65 72 65 6d 61 6c 20 74 61 62 6c 65 20  epheremal table 
dd20: 6d 75 73 74 20 0a 2a 2a 20 62 65 20 75 73 65 64  must .** be used
dd30: 20 75 6e 6c 65 73 73 20 3c 63 6f 6c 75 6d 6e 3e   unless <column>
dd40: 20 69 73 20 61 6e 20 49 4e 54 45 47 45 52 20 50   is an INTEGER P
dd50: 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 61 6e  RIMARY KEY or an
dd60: 20 69 6e 64 65 78 20 63 61 6e 20 0a 2a 2a 20 62   index can .** b
dd70: 65 20 66 6f 75 6e 64 20 77 69 74 68 20 3c 63 6f  e found with <co
dd80: 6c 75 6d 6e 3e 20 61 73 20 69 74 73 20 6c 65 66  lumn> as its lef
dd90: 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 2e 0a 2a  t-most column..*
dda0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 49 4e 5f 49  *.** If the IN_I
ddb0: 4e 44 45 58 5f 4e 4f 4f 50 5f 4f 4b 20 61 6e 64  NDEX_NOOP_OK and
ddc0: 20 49 4e 5f 49 4e 44 45 58 5f 4d 45 4d 42 45 52   IN_INDEX_MEMBER
ddd0: 53 48 49 50 20 61 72 65 20 62 6f 74 68 20 73 65  SHIP are both se
dde0: 74 20 61 6e 64 0a 2a 2a 20 69 66 20 74 68 65 20  t and.** if the 
ddf0: 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70  RHS of the IN op
de00: 65 72 61 74 6f 72 20 69 73 20 61 20 6c 69 73 74  erator is a list
de10: 20 28 6e 6f 74 20 61 20 73 75 62 71 75 65 72 79   (not a subquery
de20: 29 20 74 68 65 6e 20 74 68 69 73 0a 2a 2a 20 72  ) then this.** r
de30: 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 64 65 63  outine might dec
de40: 69 64 65 20 74 68 61 74 20 63 72 65 61 74 69 6e  ide that creatin
de50: 67 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 62  g an ephemeral b
de60: 2d 74 72 65 65 20 66 6f 72 20 6d 65 6d 62 65 72  -tree for member
de70: 73 68 69 70 0a 2a 2a 20 74 65 73 74 69 6e 67 20  ship.** testing 
de80: 69 73 20 74 6f 6f 20 65 78 70 65 6e 73 69 76 65  is too expensive
de90: 20 61 6e 64 20 72 65 74 75 72 6e 20 49 4e 5f 49   and return IN_I
dea0: 4e 44 45 58 5f 4e 4f 4f 50 2e 20 20 49 6e 20 74  NDEX_NOOP.  In t
deb0: 68 61 74 20 63 61 73 65 2c 20 74 68 65 0a 2a 2a  hat case, the.**
dec0: 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65   calling routine
ded0: 20 73 68 6f 75 6c 64 20 69 6d 70 6c 65 6d 65 6e   should implemen
dee0: 74 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f  t the IN operato
def0: 72 20 75 73 69 6e 67 20 61 20 73 65 71 75 65 6e  r using a sequen
df00: 63 65 0a 2a 2a 20 6f 66 20 45 71 20 6f 72 20 4e  ce.** of Eq or N
df10: 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65  e comparison ope
df20: 72 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 57  rations..**.** W
df30: 68 65 6e 20 74 68 65 20 62 2d 74 72 65 65 20 69  hen the b-tree i
df40: 73 20 62 65 69 6e 67 20 75 73 65 64 20 66 6f 72  s being used for
df50: 20 6d 65 6d 62 65 72 73 68 69 70 20 74 65 73 74   membership test
df60: 73 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66  s, the calling f
df70: 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 69 67 68 74  unction.** might
df80: 20 6e 65 65 64 20 74 6f 20 6b 6e 6f 77 20 77 68   need to know wh
df90: 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65  ether or not the
dfa0: 20 52 48 53 20 73 69 64 65 20 6f 66 20 74 68 65   RHS side of the
dfb0: 20 49 4e 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20   IN operator.** 
dfc0: 63 6f 6e 74 61 69 6e 73 20 61 20 4e 55 4c 4c 2e  contains a NULL.
dfd0: 20 20 49 66 20 70 72 52 68 73 48 61 73 4e 75 6c    If prRhsHasNul
dfe0: 6c 20 69 73 20 6e 6f 74 20 61 20 4e 55 4c 4c 20  l is not a NULL 
dff0: 70 6f 69 6e 74 65 72 20 61 6e 64 20 0a 2a 2a 20  pointer and .** 
e000: 69 66 20 74 68 65 72 65 20 69 73 20 61 6e 79 20  if there is any 
e010: 63 68 61 6e 63 65 20 74 68 61 74 20 74 68 65 20  chance that the 
e020: 28 2e 2e 2e 29 20 6d 69 67 68 74 20 63 6f 6e 74  (...) might cont
e030: 61 69 6e 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65  ain a NULL value
e040: 20 61 74 0a 2a 2a 20 72 75 6e 74 69 6d 65 2c 20   at.** runtime, 
e050: 74 68 65 6e 20 61 20 72 65 67 69 73 74 65 72 20  then a register 
e060: 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  is allocated and
e070: 20 74 68 65 20 72 65 67 69 73 74 65 72 20 6e 75   the register nu
e080: 6d 62 65 72 20 77 72 69 74 74 65 6e 0a 2a 2a 20  mber written.** 
e090: 74 6f 20 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c  to *prRhsHasNull
e0a0: 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f  . If there is no
e0b0: 20 63 68 61 6e 63 65 20 74 68 61 74 20 74 68 65   chance that the
e0c0: 20 28 2e 2e 2e 29 20 63 6f 6e 74 61 69 6e 73 20   (...) contains 
e0d0: 61 0a 2a 2a 20 4e 55 4c 4c 20 76 61 6c 75 65 2c  a.** NULL value,
e0e0: 20 74 68 65 6e 20 2a 70 72 52 68 73 48 61 73 4e   then *prRhsHasN
e0f0: 75 6c 6c 20 69 73 20 6c 65 66 74 20 75 6e 63 68  ull is left unch
e100: 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  anged..**.** If 
e110: 61 20 72 65 67 69 73 74 65 72 20 69 73 20 61 6c  a register is al
e120: 6c 6f 63 61 74 65 64 20 61 6e 64 20 69 74 73 20  located and its 
e130: 6c 6f 63 61 74 69 6f 6e 20 73 74 6f 72 65 64 20  location stored 
e140: 69 6e 20 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c  in *prRhsHasNull
e150: 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 76 61  , then.** the va
e160: 6c 75 65 20 69 6e 20 74 68 61 74 20 72 65 67 69  lue in that regi
e170: 73 74 65 72 20 77 69 6c 6c 20 62 65 20 4e 55 4c  ster will be NUL
e180: 4c 20 69 66 20 74 68 65 20 62 2d 74 72 65 65 20  L if the b-tree 
e190: 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20  contains one or 
e1a0: 6d 6f 72 65 0a 2a 2a 20 4e 55 4c 4c 20 76 61 6c  more.** NULL val
e1b0: 75 65 73 2c 20 61 6e 64 20 69 74 20 77 69 6c 6c  ues, and it will
e1c0: 20 62 65 20 73 6f 6d 65 20 6e 6f 6e 2d 4e 55 4c   be some non-NUL
e1d0: 4c 20 76 61 6c 75 65 20 69 66 20 74 68 65 20 62  L value if the b
e1e0: 2d 74 72 65 65 20 63 6f 6e 74 61 69 6e 73 20 6e  -tree contains n
e1f0: 6f 0a 2a 2a 20 4e 55 4c 4c 20 76 61 6c 75 65 73  o.** NULL values
e200: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
e210: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
e220: 59 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 69 6e  Y.int sqlite3Fin
e230: 64 49 6e 49 6e 64 65 78 28 50 61 72 73 65 20 2a  dInIndex(Parse *
e240: 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 58  pParse, Expr *pX
e250: 2c 20 75 33 32 20 69 6e 46 6c 61 67 73 2c 20 69  , u32 inFlags, i
e260: 6e 74 20 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c  nt *prRhsHasNull
e270: 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 3b 20  ){.  Select *p; 
e280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e290: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 45             /* SE
e2a0: 4c 45 43 54 20 74 6f 20 74 68 65 20 72 69 67 68  LECT to the righ
e2b0: 74 20 6f 66 20 49 4e 20 6f 70 65 72 61 74 6f 72  t of IN operator
e2c0: 20 2a 2f 0a 20 20 69 6e 74 20 65 54 79 70 65 20   */.  int eType 
e2d0: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
e2e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
e2f0: 79 70 65 20 6f 66 20 52 48 53 20 74 61 62 6c 65  ype of RHS table
e300: 2e 20 49 4e 5f 49 4e 44 45 58 5f 2a 20 2a 2f 0a  . IN_INDEX_* */.
e310: 20 20 69 6e 74 20 69 54 61 62 20 3d 20 70 50 61    int iTab = pPa
e320: 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20 20  rse->nTab++;    
e330: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f          /* Curso
e340: 72 20 6f 66 20 74 68 65 20 52 48 53 20 74 61 62  r of the RHS tab
e350: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6d 75 73 74  le */.  int must
e360: 42 65 55 6e 69 71 75 65 3b 20 20 20 20 20 20 20  BeUnique;       
e370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e380: 20 54 72 75 65 20 69 66 20 52 48 53 20 6d 75 73   True if RHS mus
e390: 74 20 62 65 20 75 6e 69 71 75 65 20 2a 2f 0a 20  t be unique */. 
e3a0: 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74   Vdbe *v = sqlit
e3b0: 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
e3c0: 29 3b 20 20 20 20 20 2f 2a 20 56 69 72 74 75 61  );     /* Virtua
e3d0: 6c 20 6d 61 63 68 69 6e 65 20 62 65 69 6e 67 20  l machine being 
e3e0: 63 6f 64 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65  coded */..  asse
e3f0: 72 74 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 49  rt( pX->op==TK_I
e400: 4e 20 29 3b 0a 20 20 6d 75 73 74 42 65 55 6e 69  N );.  mustBeUni
e410: 71 75 65 20 3d 20 28 69 6e 46 6c 61 67 73 20 26  que = (inFlags &
e420: 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 29 21   IN_INDEX_LOOP)!
e430: 3d 30 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20  =0;..  /* Check 
e440: 74 6f 20 73 65 65 20 69 66 20 61 6e 20 65 78 69  to see if an exi
e450: 73 74 69 6e 67 20 74 61 62 6c 65 20 6f 72 20 69  sting table or i
e460: 6e 64 65 78 20 63 61 6e 20 62 65 20 75 73 65 64  ndex can be used
e470: 20 74 6f 0a 20 20 2a 2a 20 73 61 74 69 73 66 79   to.  ** satisfy
e480: 20 74 68 65 20 71 75 65 72 79 2e 20 20 54 68 69   the query.  Thi
e490: 73 20 69 73 20 70 72 65 66 65 72 61 62 6c 65 20  s is preferable 
e4a0: 74 6f 20 67 65 6e 65 72 61 74 69 6e 67 20 61 20  to generating a 
e4b0: 6e 65 77 20 0a 20 20 2a 2a 20 65 70 68 65 6d 65  new .  ** epheme
e4c0: 72 61 6c 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a  ral table..  */.
e4d0: 20 20 70 20 3d 20 28 45 78 70 72 48 61 73 50 72    p = (ExprHasPr
e4e0: 6f 70 65 72 74 79 28 70 58 2c 20 45 50 5f 78 49  operty(pX, EP_xI
e4f0: 73 53 65 6c 65 63 74 29 20 3f 20 70 58 2d 3e 78  sSelect) ? pX->x
e500: 2e 70 53 65 6c 65 63 74 20 3a 20 30 29 3b 0a 20  .pSelect : 0);. 
e510: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
e520: 72 3d 3d 30 20 26 26 20 69 73 43 61 6e 64 69 64  r==0 && isCandid
e530: 61 74 65 46 6f 72 49 6e 4f 70 74 28 70 29 20 29  ateForInOpt(p) )
e540: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64  {.    sqlite3 *d
e550: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20  b = pParse->db; 
e560: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e570: 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
e580: 69 6f 6e 20 2a 2f 0a 20 20 20 20 54 61 62 6c 65  ion */.    Table
e590: 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20 20   *pTab;         
e5a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e5b0: 20 20 2f 2a 20 54 61 62 6c 65 20 3c 74 61 62 6c    /* Table <tabl
e5c0: 65 3e 2e 20 2a 2f 0a 20 20 20 20 45 78 70 72 20  e>. */.    Expr 
e5d0: 2a 70 45 78 70 72 3b 20 20 20 20 20 20 20 20 20  *pExpr;         
e5e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e5f0: 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20    /* Expression 
e600: 3c 63 6f 6c 75 6d 6e 3e 20 2a 2f 0a 20 20 20 20  <column> */.    
e610: 69 31 36 20 69 43 6f 6c 3b 20 20 20 20 20 20 20  i16 iCol;       
e620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e630: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
e640: 6f 66 20 63 6f 6c 75 6d 6e 20 3c 63 6f 6c 75 6d  of column <colum
e650: 6e 3e 20 2a 2f 0a 20 20 20 20 69 31 36 20 69 44  n> */.    i16 iD
e660: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
e670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e680: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 69 64 78   /* Database idx
e690: 20 66 6f 72 20 70 54 61 62 20 2a 2f 0a 0a 20 20   for pTab */..  
e6a0: 20 20 61 73 73 65 72 74 28 20 70 20 29 3b 20 20    assert( p );  
e6b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e6c0: 20 20 20 20 20 20 2f 2a 20 42 65 63 61 75 73 65        /* Because
e6d0: 20 6f 66 20 69 73 43 61 6e 64 69 64 61 74 65 46   of isCandidateF
e6e0: 6f 72 49 6e 4f 70 74 28 70 29 20 2a 2f 0a 20 20  orInOpt(p) */.  
e6f0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c    assert( p->pEL
e700: 69 73 74 21 3d 30 20 29 3b 20 20 20 20 20 20 20  ist!=0 );       
e710: 20 20 20 20 20 20 2f 2a 20 42 65 63 61 75 73 65        /* Because
e720: 20 6f 66 20 69 73 43 61 6e 64 69 64 61 74 65 46   of isCandidateF
e730: 6f 72 49 6e 4f 70 74 28 70 29 20 2a 2f 0a 20 20  orInOpt(p) */.  
e740: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c    assert( p->pEL
e750: 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 21  ist->a[0].pExpr!
e760: 3d 30 20 29 3b 20 2f 2a 20 42 65 63 61 75 73 65  =0 ); /* Because
e770: 20 6f 66 20 69 73 43 61 6e 64 69 64 61 74 65 46   of isCandidateF
e780: 6f 72 49 6e 4f 70 74 28 70 29 20 2a 2f 0a 20 20  orInOpt(p) */.  
e790: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 53 72    assert( p->pSr
e7a0: 63 21 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20  c!=0 );         
e7b0: 20 20 20 20 20 20 2f 2a 20 42 65 63 61 75 73 65        /* Because
e7c0: 20 6f 66 20 69 73 43 61 6e 64 69 64 61 74 65 46   of isCandidateF
e7d0: 6f 72 49 6e 4f 70 74 28 70 29 20 2a 2f 0a 20 20  orInOpt(p) */.  
e7e0: 20 20 70 54 61 62 20 3d 20 70 2d 3e 70 53 72 63    pTab = p->pSrc
e7f0: 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 20 20 20  ->a[0].pTab;.   
e800: 20 70 45 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69   pExpr = p->pELi
e810: 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a  st->a[0].pExpr;.
e820: 20 20 20 20 69 43 6f 6c 20 3d 20 28 69 31 36 29      iCol = (i16)
e830: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a  pExpr->iColumn;.
e840: 20 20 20 0a 20 20 20 20 2f 2a 20 43 6f 64 65 20     .    /* Code 
e850: 61 6e 20 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f  an OP_Transactio
e860: 6e 20 61 6e 64 20 4f 50 5f 54 61 62 6c 65 4c 6f  n and OP_TableLo
e870: 63 6b 20 66 6f 72 20 3c 74 61 62 6c 65 3e 2e 20  ck for <table>. 
e880: 2a 2f 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c  */.    iDb = sql
e890: 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
e8a0: 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68  x(db, pTab->pSch
e8b0: 65 6d 61 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ema);.    sqlite
e8c0: 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d  3CodeVerifySchem
e8d0: 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a  a(pParse, iDb);.
e8e0: 20 20 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65      sqlite3Table
e8f0: 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69 44 62  Lock(pParse, iDb
e900: 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c  , pTab->tnum, 0,
e910: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a   pTab->zName);..
e920: 20 20 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63      /* This func
e930: 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 63 61 6c  tion is only cal
e940: 6c 65 64 20 66 72 6f 6d 20 74 77 6f 20 70 6c 61  led from two pla
e950: 63 65 73 2e 20 49 6e 20 62 6f 74 68 20 63 61 73  ces. In both cas
e960: 65 73 20 74 68 65 20 76 64 62 65 0a 20 20 20 20  es the vdbe.    
e970: 2a 2a 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  ** has already b
e980: 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2e 20 53  een allocated. S
e990: 6f 20 61 73 73 75 6d 65 20 73 71 6c 69 74 65 33  o assume sqlite3
e9a0: 47 65 74 56 64 62 65 28 29 20 69 73 20 61 6c 77  GetVdbe() is alw
e9b0: 61 79 73 0a 20 20 20 20 2a 2a 20 73 75 63 63 65  ays.    ** succe
e9c0: 73 73 66 75 6c 20 68 65 72 65 2e 0a 20 20 20 20  ssful here..    
e9d0: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 76 29  */.    assert(v)
e9e0: 3b 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30  ;.    if( iCol<0
e9f0: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 41   ){.      int iA
ea00: 64 64 72 20 3d 20 73 71 6c 69 74 65 33 43 6f 64  ddr = sqlite3Cod
ea10: 65 4f 6e 63 65 28 70 50 61 72 73 65 29 3b 0a 20  eOnce(pParse);. 
ea20: 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
ea30: 65 28 76 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c  e(v);..      sql
ea40: 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50  ite3OpenTable(pP
ea50: 61 72 73 65 2c 20 69 54 61 62 2c 20 69 44 62 2c  arse, iTab, iDb,
ea60: 20 70 54 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65   pTab, OP_OpenRe
ea70: 61 64 29 3b 0a 20 20 20 20 20 20 65 54 79 70 65  ad);.      eType
ea80: 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49   = IN_INDEX_ROWI
ea90: 44 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65  D;..      sqlite
eaa0: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
eab0: 20 69 41 64 64 72 29 3b 0a 20 20 20 20 7d 65 6c   iAddr);.    }el
eac0: 73 65 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20  se{.      Index 
ead0: 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20 20 20  *pIdx;          
eae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
eaf0: 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72 69 61  * Iterator varia
eb00: 62 6c 65 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a  ble */..      /*
eb10: 20 54 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   The collation s
eb20: 65 71 75 65 6e 63 65 20 75 73 65 64 20 62 79 20  equence used by 
eb30: 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20  the comparison. 
eb40: 49 66 20 61 6e 20 69 6e 64 65 78 20 69 73 20 74  If an index is t
eb50: 6f 0a 20 20 20 20 20 20 2a 2a 20 62 65 20 75 73  o.      ** be us
eb60: 65 64 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 61  ed in place of a
eb70: 20 74 65 6d 70 2d 74 61 62 6c 65 2c 20 69 74 20   temp-table, it 
eb80: 6d 75 73 74 20 62 65 20 6f 72 64 65 72 65 64 20  must be ordered 
eb90: 61 63 63 6f 72 64 69 6e 67 0a 20 20 20 20 20 20  according.      
eba0: 2a 2a 20 74 6f 20 74 68 69 73 20 63 6f 6c 6c 61  ** to this colla
ebb0: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 2e 20 20  tion sequence.  
ebc0: 2a 2f 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71  */.      CollSeq
ebd0: 20 2a 70 52 65 71 20 3d 20 73 71 6c 69 74 65 33   *pReq = sqlite3
ebe0: 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c  BinaryCompareCol
ebf0: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 58 2d  lSeq(pParse, pX-
ec00: 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 29 3b 0a  >pLeft, pExpr);.
ec10: 0a 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  .      /* Check 
ec20: 74 68 61 74 20 74 68 65 20 61 66 66 69 6e 69 74  that the affinit
ec30: 79 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 75  y that will be u
ec40: 73 65 64 20 74 6f 20 70 65 72 66 6f 72 6d 20 74  sed to perform t
ec50: 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6d  he .      ** com
ec60: 70 61 72 69 73 6f 6e 20 69 73 20 74 68 65 20 73  parison is the s
ec70: 61 6d 65 20 61 73 20 74 68 65 20 61 66 66 69 6e  ame as the affin
ec80: 69 74 79 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  ity of the colum
ec90: 6e 2e 20 49 66 0a 20 20 20 20 20 20 2a 2a 20 69  n. If.      ** i
eca0: 74 20 69 73 20 6e 6f 74 2c 20 69 74 20 69 73 20  t is not, it is 
ecb0: 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20  not possible to 
ecc0: 75 73 65 20 61 6e 79 20 69 6e 64 65 78 2e 0a 20  use any index.. 
ecd0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e       */.      in
ece0: 74 20 61 66 66 69 6e 69 74 79 5f 6f 6b 20 3d 20  t affinity_ok = 
ecf0: 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69  sqlite3IndexAffi
ed00: 6e 69 74 79 4f 6b 28 70 58 2c 20 70 54 61 62 2d  nityOk(pX, pTab-
ed10: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 61 66 66 69  >aCol[iCol].affi
ed20: 6e 69 74 79 29 3b 0a 0a 20 20 20 20 20 20 66 6f  nity);..      fo
ed30: 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  r(pIdx=pTab->pIn
ed40: 64 65 78 3b 20 70 49 64 78 20 26 26 20 65 54 79  dex; pIdx && eTy
ed50: 70 65 3d 3d 30 20 26 26 20 61 66 66 69 6e 69 74  pe==0 && affinit
ed60: 79 5f 6f 6b 3b 20 70 49 64 78 3d 70 49 64 78 2d  y_ok; pIdx=pIdx-
ed70: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20  >pNext){.       
ed80: 20 69 66 28 20 28 70 49 64 78 2d 3e 61 69 43 6f   if( (pIdx->aiCo
ed90: 6c 75 6d 6e 5b 30 5d 3d 3d 69 43 6f 6c 29 0a 20  lumn[0]==iCol). 
eda0: 20 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74          && sqlit
edb0: 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62  e3FindCollSeq(db
edc0: 2c 20 45 4e 43 28 64 62 29 2c 20 70 49 64 78 2d  , ENC(db), pIdx-
edd0: 3e 61 7a 43 6f 6c 6c 5b 30 5d 2c 20 30 29 3d 3d  >azColl[0], 0)==
ede0: 70 52 65 71 0a 20 20 20 20 20 20 20 20 20 26 26  pReq.         &&
edf0: 20 28 21 6d 75 73 74 42 65 55 6e 69 71 75 65 20   (!mustBeUnique 
ee00: 7c 7c 20 28 70 49 64 78 2d 3e 6e 4b 65 79 43 6f  || (pIdx->nKeyCo
ee10: 6c 3d 3d 31 20 26 26 20 49 73 55 6e 69 71 75 65  l==1 && IsUnique
ee20: 49 6e 64 65 78 28 70 49 64 78 29 29 29 0a 20 20  Index(pIdx))).  
ee30: 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
ee40: 20 20 20 69 6e 74 20 69 41 64 64 72 20 3d 20 73     int iAddr = s
ee50: 71 6c 69 74 65 33 43 6f 64 65 4f 6e 63 65 28 70  qlite3CodeOnce(p
ee60: 50 61 72 73 65 29 3b 20 56 64 62 65 43 6f 76 65  Parse); VdbeCove
ee70: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
ee80: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
ee90: 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 52  dOp3(v, OP_OpenR
eea0: 65 61 64 2c 20 69 54 61 62 2c 20 70 49 64 78 2d  ead, iTab, pIdx-
eeb0: 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20 20  >tnum, iDb);.   
eec0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
eed0: 62 65 53 65 74 50 34 4b 65 79 49 6e 66 6f 28 70  beSetP4KeyInfo(p
eee0: 50 61 72 73 65 2c 20 70 49 64 78 29 3b 0a 20 20  Parse, pIdx);.  
eef0: 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d          VdbeComm
ef00: 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70 49  ent((v, "%s", pI
ef10: 64 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20  dx->zName));.   
ef20: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 49         assert( I
ef30: 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 44 45  N_INDEX_INDEX_DE
ef40: 53 43 20 3d 3d 20 49 4e 5f 49 4e 44 45 58 5f 49  SC == IN_INDEX_I
ef50: 4e 44 45 58 5f 41 53 43 2b 31 20 29 3b 0a 20 20  NDEX_ASC+1 );.  
ef60: 20 20 20 20 20 20 20 20 65 54 79 70 65 20 3d 20          eType = 
ef70: 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 41  IN_INDEX_INDEX_A
ef80: 53 43 20 2b 20 70 49 64 78 2d 3e 61 53 6f 72 74  SC + pIdx->aSort
ef90: 4f 72 64 65 72 5b 30 5d 3b 0a 0a 20 20 20 20 20  Order[0];..     
efa0: 20 20 20 20 20 69 66 28 20 70 72 52 68 73 48 61       if( prRhsHa
efb0: 73 4e 75 6c 6c 20 26 26 20 21 70 54 61 62 2d 3e  sNull && !pTab->
efc0: 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 6e 6f 74 4e 75  aCol[iCol].notNu
efd0: 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ll ){.          
efe0: 20 20 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c 20    *prRhsHasNull 
eff0: 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
f000: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
f010: 6c 69 74 65 33 53 65 74 48 61 73 4e 75 6c 6c 46  lite3SetHasNullF
f020: 6c 61 67 28 76 2c 20 69 54 61 62 2c 20 2a 70 72  lag(v, iTab, *pr
f030: 52 68 73 48 61 73 4e 75 6c 6c 29 3b 0a 20 20 20  RhsHasNull);.   
f040: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
f050: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
f060: 6d 70 48 65 72 65 28 76 2c 20 69 41 64 64 72 29  mpHere(v, iAddr)
f070: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
f080: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
f090: 20 2f 2a 20 49 66 20 6e 6f 20 70 72 65 65 78 69   /* If no preexi
f0a0: 73 74 69 6e 67 20 69 6e 64 65 78 20 69 73 20 61  sting index is a
f0b0: 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 74 68 65  vailable for the
f0c0: 20 49 4e 20 63 6c 61 75 73 65 0a 20 20 2a 2a 20   IN clause.  ** 
f0d0: 61 6e 64 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f  and IN_INDEX_NOO
f0e0: 50 20 69 73 20 61 6e 20 61 6c 6c 6f 77 65 64 20  P is an allowed 
f0f0: 72 65 70 6c 79 0a 20 20 2a 2a 20 61 6e 64 20 74  reply.  ** and t
f100: 68 65 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e  he RHS of the IN
f110: 20 6f 70 65 72 61 74 6f 72 20 69 73 20 61 20 6c   operator is a l
f120: 69 73 74 2c 20 6e 6f 74 20 61 20 73 75 62 71 75  ist, not a subqu
f130: 65 72 79 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65  ery.  ** and the
f140: 20 52 48 53 20 69 73 20 6e 6f 74 20 63 6f 6e 74   RHS is not cont
f150: 61 6e 74 20 6f 72 20 68 61 73 20 74 77 6f 20 6f  ant or has two o
f160: 72 20 66 65 77 65 72 20 74 65 72 6d 73 2c 0a 20  r fewer terms,. 
f170: 20 2a 2a 20 74 68 65 6e 20 69 74 20 69 73 20 6e   ** then it is n
f180: 6f 74 20 77 6f 72 74 68 20 63 72 65 61 74 69 6e  ot worth creatin
f190: 67 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 74  g an ephemeral t
f1a0: 61 62 6c 65 20 74 6f 20 65 76 61 6c 75 61 74 65  able to evaluate
f1b0: 0a 20 20 2a 2a 20 74 68 65 20 49 4e 20 6f 70 65  .  ** the IN ope
f1c0: 72 61 74 6f 72 20 73 6f 20 72 65 74 75 72 6e 20  rator so return 
f1d0: 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 2e 0a 20  IN_INDEX_NOOP.. 
f1e0: 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65 3d   */.  if( eType=
f1f0: 3d 30 0a 20 20 20 26 26 20 28 69 6e 46 6c 61 67  =0.   && (inFlag
f200: 73 20 26 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f  s & IN_INDEX_NOO
f210: 50 5f 4f 4b 29 0a 20 20 20 26 26 20 21 45 78 70  P_OK).   && !Exp
f220: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 58 2c  rHasProperty(pX,
f230: 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 0a 20   EP_xIsSelect). 
f240: 20 20 26 26 20 28 21 73 71 6c 69 74 65 33 49 6e    && (!sqlite3In
f250: 52 68 73 49 73 43 6f 6e 73 74 61 6e 74 28 70 58  RhsIsConstant(pX
f260: 29 20 7c 7c 20 70 58 2d 3e 78 2e 70 4c 69 73 74  ) || pX->x.pList
f270: 2d 3e 6e 45 78 70 72 3c 3d 32 29 0a 20 20 29 7b  ->nExpr<=2).  ){
f280: 0a 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f  .    eType = IN_
f290: 49 4e 44 45 58 5f 4e 4f 4f 50 3b 0a 20 20 7d 0a  INDEX_NOOP;.  }.
f2a0: 20 20 20 20 20 0a 0a 20 20 69 66 28 20 65 54 79       ..  if( eTy
f2b0: 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  pe==0 ){.    /* 
f2c0: 43 6f 75 6c 64 20 6e 6f 74 20 66 69 6e 64 20 61  Could not find a
f2d0: 6e 20 65 78 69 73 74 69 6e 67 20 74 61 62 6c 65  n existing table
f2e0: 20 6f 72 20 69 6e 64 65 78 20 74 6f 20 75 73 65   or index to use
f2f0: 20 61 73 20 74 68 65 20 52 48 53 20 62 2d 74 72   as the RHS b-tr
f300: 65 65 2e 0a 20 20 20 20 2a 2a 20 57 65 20 77 69  ee..    ** We wi
f310: 6c 6c 20 68 61 76 65 20 74 6f 20 67 65 6e 65 72  ll have to gener
f320: 61 74 65 20 61 6e 20 65 70 68 65 6d 65 72 61 6c  ate an ephemeral
f330: 20 74 61 62 6c 65 20 74 6f 20 64 6f 20 74 68 65   table to do the
f340: 20 6a 6f 62 2e 0a 20 20 20 20 2a 2f 0a 20 20 20   job..    */.   
f350: 20 75 33 32 20 73 61 76 65 64 4e 51 75 65 72 79   u32 savedNQuery
f360: 4c 6f 6f 70 20 3d 20 70 50 61 72 73 65 2d 3e 6e  Loop = pParse->n
f370: 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 20 20 69  QueryLoop;.    i
f380: 6e 74 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20  nt rMayHaveNull 
f390: 3d 20 30 3b 0a 20 20 20 20 65 54 79 70 65 20 3d  = 0;.    eType =
f3a0: 20 49 4e 5f 49 4e 44 45 58 5f 45 50 48 3b 0a 20   IN_INDEX_EPH;. 
f3b0: 20 20 20 69 66 28 20 69 6e 46 6c 61 67 73 20 26     if( inFlags &
f3c0: 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 20 29   IN_INDEX_LOOP )
f3d0: 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  {.      pParse->
f3e0: 6e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 30 3b 0a  nQueryLoop = 0;.
f3f0: 20 20 20 20 20 20 69 66 28 20 70 58 2d 3e 70 4c        if( pX->pL
f400: 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 26  eft->iColumn<0 &
f410: 26 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  & !ExprHasProper
f420: 74 79 28 70 58 2c 20 45 50 5f 78 49 73 53 65 6c  ty(pX, EP_xIsSel
f430: 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ect) ){.        
f440: 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58  eType = IN_INDEX
f450: 5f 52 4f 57 49 44 3b 0a 20 20 20 20 20 20 7d 0a  _ROWID;.      }.
f460: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 72      }else if( pr
f470: 52 68 73 48 61 73 4e 75 6c 6c 20 29 7b 0a 20 20  RhsHasNull ){.  
f480: 20 20 20 20 2a 70 72 52 68 73 48 61 73 4e 75 6c      *prRhsHasNul
f490: 6c 20 3d 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c  l = rMayHaveNull
f4a0: 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
f4b0: 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  m;.    }.    sql
f4c0: 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63  ite3CodeSubselec
f4d0: 74 28 70 50 61 72 73 65 2c 20 70 58 2c 20 72 4d  t(pParse, pX, rM
f4e0: 61 79 48 61 76 65 4e 75 6c 6c 2c 20 65 54 79 70  ayHaveNull, eTyp
f4f0: 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49  e==IN_INDEX_ROWI
f500: 44 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  D);.    pParse->
f510: 6e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 73 61 76  nQueryLoop = sav
f520: 65 64 4e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20  edNQueryLoop;.  
f530: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 58 2d 3e 69  }else{.    pX->i
f540: 54 61 62 6c 65 20 3d 20 69 54 61 62 3b 0a 20 20  Table = iTab;.  
f550: 7d 0a 20 20 72 65 74 75 72 6e 20 65 54 79 70 65  }.  return eType
f560: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
f570: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
f580: 66 6f 72 20 73 63 61 6c 61 72 20 73 75 62 71 75  for scalar subqu
f590: 65 72 69 65 73 20 75 73 65 64 20 61 73 20 61 20  eries used as a 
f5a0: 73 75 62 71 75 65 72 79 20 65 78 70 72 65 73 73  subquery express
f5b0: 69 6f 6e 2c 20 45 58 49 53 54 53 2c 0a 2a 2a 20  ion, EXISTS,.** 
f5c0: 6f 72 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 2e  or IN operators.
f5d0: 20 20 45 78 61 6d 70 6c 65 73 3a 0a 2a 2a 0a 2a    Examples:.**.*
f5e0: 2a 20 20 20 20 20 28 53 45 4c 45 43 54 20 61 20  *     (SELECT a 
f5f0: 46 52 4f 4d 20 62 29 20 20 20 20 20 20 20 20 20  FROM b)         
f600: 20 2d 2d 20 73 75 62 71 75 65 72 79 0a 2a 2a 20   -- subquery.** 
f610: 20 20 20 20 45 58 49 53 54 53 20 28 53 45 4c 45      EXISTS (SELE
f620: 43 54 20 61 20 46 52 4f 4d 20 62 29 20 20 20 2d  CT a FROM b)   -
f630: 2d 20 45 58 49 53 54 53 20 73 75 62 71 75 65 72  - EXISTS subquer
f640: 79 0a 2a 2a 20 20 20 20 20 78 20 49 4e 20 28 34  y.**     x IN (4
f650: 2c 35 2c 31 31 29 20 20 20 20 20 20 20 20 20 20  ,5,11)          
f660: 20 20 20 20 2d 2d 20 49 4e 20 6f 70 65 72 61 74      -- IN operat
f670: 6f 72 20 77 69 74 68 20 6c 69 73 74 20 6f 6e 20  or with list on 
f680: 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 0a  right-hand side.
f690: 2a 2a 20 20 20 20 20 78 20 49 4e 20 28 53 45 4c  **     x IN (SEL
f6a0: 45 43 54 20 61 20 46 52 4f 4d 20 62 29 20 20 20  ECT a FROM b)   
f6b0: 20 20 2d 2d 20 49 4e 20 6f 70 65 72 61 74 6f 72    -- IN operator
f6c0: 20 77 69 74 68 20 73 75 62 71 75 65 72 79 20 6f   with subquery o
f6d0: 6e 20 74 68 65 20 72 69 67 68 74 0a 2a 2a 0a 2a  n the right.**.*
f6e0: 2a 20 54 68 65 20 70 45 78 70 72 20 70 61 72 61  * The pExpr para
f6f0: 6d 65 74 65 72 20 64 65 73 63 72 69 62 65 73 20  meter describes 
f700: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74  the expression t
f710: 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
f720: 20 49 4e 0a 2a 2a 20 6f 70 65 72 61 74 6f 72 20   IN.** operator 
f730: 6f 72 20 73 75 62 71 75 65 72 79 2e 0a 2a 2a 0a  or subquery..**.
f740: 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72 20  ** If parameter 
f750: 69 73 52 6f 77 69 64 20 69 73 20 6e 6f 6e 2d 7a  isRowid is non-z
f760: 65 72 6f 2c 20 74 68 65 6e 20 65 78 70 72 65 73  ero, then expres
f770: 73 69 6f 6e 20 70 45 78 70 72 20 69 73 20 67 75  sion pExpr is gu
f780: 61 72 61 6e 74 65 65 64 0a 2a 2a 20 74 6f 20 62  aranteed.** to b
f790: 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3c  e of the form "<
f7a0: 72 6f 77 69 64 3e 20 49 4e 20 28 3f 2c 20 3f 2c  rowid> IN (?, ?,
f7b0: 20 3f 29 22 2c 20 77 68 65 72 65 20 3c 72 6f 77   ?)", where <row
f7c0: 69 64 3e 20 69 73 20 61 20 72 65 66 65 72 65 6e  id> is a referen
f7d0: 63 65 0a 2a 2a 20 74 6f 20 73 6f 6d 65 20 69 6e  ce.** to some in
f7e0: 74 65 67 65 72 20 6b 65 79 20 63 6f 6c 75 6d 6e  teger key column
f7f0: 20 6f 66 20 61 20 74 61 62 6c 65 20 42 2d 54 72   of a table B-Tr
f800: 65 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ee. In this case
f810: 2c 20 75 73 65 20 61 6e 0a 2a 2a 20 69 6e 74 6b  , use an.** intk
f820: 65 79 20 42 2d 54 72 65 65 20 74 6f 20 73 74 6f  ey B-Tree to sto
f830: 72 65 20 74 68 65 20 73 65 74 20 6f 66 20 49 4e  re the set of IN
f840: 28 2e 2e 2e 29 20 76 61 6c 75 65 73 20 69 6e 73  (...) values ins
f850: 74 65 61 64 20 6f 66 20 74 68 65 20 75 73 75 61  tead of the usua
f860: 6c 0a 2a 2a 20 28 73 6c 6f 77 65 72 29 20 76 61  l.** (slower) va
f870: 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 6b 65  riable length ke
f880: 79 73 20 42 2d 54 72 65 65 2e 0a 2a 2a 0a 2a 2a  ys B-Tree..**.**
f890: 20 49 66 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c   If rMayHaveNull
f8a0: 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
f8b0: 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  at means that th
f8c0: 65 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 61  e operation is a
f8d0: 6e 20 49 4e 0a 2a 2a 20 28 6e 6f 74 20 61 20 53  n IN.** (not a S
f8e0: 45 4c 45 43 54 20 6f 72 20 45 58 49 53 54 53 29  ELECT or EXISTS)
f8f0: 20 61 6e 64 20 74 68 61 74 20 74 68 65 20 52 48   and that the RH
f900: 53 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 73  S might contains
f910: 20 4e 55 4c 4c 73 2e 0a 2a 2a 20 41 6c 6c 20 74   NULLs..** All t
f920: 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73  his routine does
f930: 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 20 74   is initialize t
f940: 68 65 20 72 65 67 69 73 74 65 72 20 67 69 76 65  he register give
f950: 6e 20 62 79 20 72 4d 61 79 48 61 76 65 4e 75 6c  n by rMayHaveNul
f960: 6c 0a 2a 2a 20 74 6f 20 4e 55 4c 4c 2e 20 20 43  l.** to NULL.  C
f970: 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 73 20  alling routines 
f980: 77 69 6c 6c 20 74 61 6b 65 20 63 61 72 65 20 6f  will take care o
f990: 66 20 63 68 61 6e 67 69 6e 67 20 74 68 69 73 20  f changing this 
f9a0: 72 65 67 69 73 74 65 72 0a 2a 2a 20 76 61 6c 75  register.** valu
f9b0: 65 20 74 6f 20 6e 6f 6e 2d 4e 55 4c 4c 20 69 66  e to non-NULL if
f9c0: 20 74 68 65 20 52 48 53 20 69 73 20 4e 55 4c 4c   the RHS is NULL
f9d0: 2d 66 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  -free..**.** For
f9e0: 20 61 20 53 45 4c 45 43 54 20 6f 72 20 45 58 49   a SELECT or EXI
f9f0: 53 54 53 20 6f 70 65 72 61 74 6f 72 2c 20 72 65  STS operator, re
fa00: 74 75 72 6e 20 74 68 65 20 72 65 67 69 73 74 65  turn the registe
fa10: 72 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65  r that holds the
fa20: 0a 2a 2a 20 72 65 73 75 6c 74 2e 20 20 46 6f 72  .** result.  For
fa30: 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 20 6f 72   IN operators or
fa40: 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   if an error occ
fa50: 75 72 73 2c 20 74 68 65 20 72 65 74 75 72 6e 20  urs, the return 
fa60: 76 61 6c 75 65 20 69 73 20 30 2e 0a 2a 2f 0a 23  value is 0..*/.#
fa70: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
fa80: 49 54 5f 53 55 42 51 55 45 52 59 0a 69 6e 74 20  IT_SUBQUERY.int 
fa90: 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65  sqlite3CodeSubse
faa0: 6c 65 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70  lect(.  Parse *p
fab0: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
fac0: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
fad0: 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45  xt */.  Expr *pE
fae0: 78 70 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  xpr,            
faf0: 2f 2a 20 54 68 65 20 49 4e 2c 20 53 45 4c 45 43  /* The IN, SELEC
fb00: 54 2c 20 6f 72 20 45 58 49 53 54 53 20 6f 70 65  T, or EXISTS ope
fb10: 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 72  rator */.  int r
fb20: 48 61 73 4e 75 6c 6c 46 6c 61 67 2c 20 20 20 20  HasNullFlag,    
fb30: 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 74     /* Register t
fb40: 68 61 74 20 72 65 63 6f 72 64 73 20 77 68 65 74  hat records whet
fb50: 68 65 72 20 4e 55 4c 4c 73 20 65 78 69 73 74 20  her NULLs exist 
fb60: 69 6e 20 52 48 53 20 2a 2f 0a 20 20 69 6e 74 20  in RHS */.  int 
fb70: 69 73 52 6f 77 69 64 20 20 20 20 20 20 20 20 20  isRowid         
fb80: 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20      /* If true, 
fb90: 4c 48 53 20 6f 66 20 49 4e 20 6f 70 65 72 61 74  LHS of IN operat
fba0: 6f 72 20 69 73 20 61 20 72 6f 77 69 64 20 2a 2f  or is a rowid */
fbb0: 0a 29 7b 0a 20 20 69 6e 74 20 6a 6d 70 49 66 44  .){.  int jmpIfD
fbc0: 79 6e 61 6d 69 63 20 3d 20 2d 31 3b 20 20 20 20  ynamic = -1;    
fbd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fbe0: 20 20 2f 2a 20 4f 6e 65 2d 74 69 6d 65 20 74 65    /* One-time te
fbf0: 73 74 20 61 64 64 72 65 73 73 20 2a 2f 0a 20 20  st address */.  
fc00: 69 6e 74 20 72 52 65 67 20 3d 20 30 3b 20 20 20  int rReg = 0;   
fc10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc20: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73          /* Regis
fc30: 74 65 72 20 73 74 6f 72 69 6e 67 20 72 65 73 75  ter storing resu
fc40: 6c 74 69 6e 67 20 2a 2f 0a 20 20 56 64 62 65 20  lting */.  Vdbe 
fc50: 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  *v = sqlite3GetV
fc60: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
fc70: 66 28 20 4e 45 56 45 52 28 76 3d 3d 30 29 20 29  f( NEVER(v==0) )
fc80: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 71 6c   return 0;.  sql
fc90: 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73  ite3ExprCachePus
fca0: 68 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 2f 2a  h(pParse);..  /*
fcb0: 20 54 68 69 73 20 63 6f 64 65 20 6d 75 73 74 20   This code must 
fcc0: 62 65 20 72 75 6e 20 69 6e 20 69 74 73 20 65 6e  be run in its en
fcd0: 74 69 72 65 74 79 20 65 76 65 72 79 20 74 69 6d  tirety every tim
fce0: 65 20 69 74 20 69 73 20 65 6e 63 6f 75 6e 74 65  e it is encounte
fcf0: 72 65 64 0a 20 20 2a 2a 20 69 66 20 61 6e 79 20  red.  ** if any 
fd00: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
fd10: 20 69 73 20 74 72 75 65 3a 0a 20 20 2a 2a 0a 20   is true:.  **. 
fd20: 20 2a 2a 20 20 20 20 2a 20 20 54 68 65 20 72 69   **    *  The ri
fd30: 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 69 73  ght-hand side is
fd40: 20 61 20 63 6f 72 72 65 6c 61 74 65 64 20 73 75   a correlated su
fd50: 62 71 75 65 72 79 0a 20 20 2a 2a 20 20 20 20 2a  bquery.  **    *
fd60: 20 20 54 68 65 20 72 69 67 68 74 2d 68 61 6e 64    The right-hand
fd70: 20 73 69 64 65 20 69 73 20 61 6e 20 65 78 70 72   side is an expr
fd80: 65 73 73 69 6f 6e 20 6c 69 73 74 20 63 6f 6e 74  ession list cont
fd90: 61 69 6e 69 6e 67 20 76 61 72 69 61 62 6c 65 73  aining variables
fda0: 0a 20 20 2a 2a 20 20 20 20 2a 20 20 57 65 20 61  .  **    *  We a
fdb0: 72 65 20 69 6e 73 69 64 65 20 61 20 74 72 69 67  re inside a trig
fdc0: 67 65 72 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  ger.  **.  ** If
fdd0: 20 61 6c 6c 20 6f 66 20 74 68 65 20 61 62 6f 76   all of the abov
fde0: 65 20 61 72 65 20 66 61 6c 73 65 2c 20 74 68 65  e are false, the
fdf0: 6e 20 77 65 20 63 61 6e 20 72 75 6e 20 74 68 69  n we can run thi
fe00: 73 20 63 6f 64 65 20 6a 75 73 74 20 6f 6e 63 65  s code just once
fe10: 0a 20 20 2a 2a 20 73 61 76 65 20 74 68 65 20 72  .  ** save the r
fe20: 65 73 75 6c 74 73 2c 20 61 6e 64 20 72 65 75 73  esults, and reus
fe30: 65 20 74 68 65 20 73 61 6d 65 20 72 65 73 75 6c  e the same resul
fe40: 74 20 6f 6e 20 73 75 62 73 65 71 75 65 6e 74 20  t on subsequent 
fe50: 69 6e 76 6f 63 61 74 69 6f 6e 73 2e 0a 20 20 2a  invocations..  *
fe60: 2f 0a 20 20 69 66 28 20 21 45 78 70 72 48 61 73  /.  if( !ExprHas
fe70: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
fe80: 45 50 5f 56 61 72 53 65 6c 65 63 74 29 20 29 7b  EP_VarSelect) ){
fe90: 0a 20 20 20 20 6a 6d 70 49 66 44 79 6e 61 6d 69  .    jmpIfDynami
fea0: 63 20 3d 20 73 71 6c 69 74 65 33 43 6f 64 65 4f  c = sqlite3CodeO
feb0: 6e 63 65 28 70 50 61 72 73 65 29 3b 20 56 64 62  nce(pParse); Vdb
fec0: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
fed0: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
fee0: 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20  E_OMIT_EXPLAIN. 
fef0: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70   if( pParse->exp
ff00: 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 63  lain==2 ){.    c
ff10: 68 61 72 20 2a 7a 4d 73 67 20 3d 20 73 71 6c 69  har *zMsg = sqli
ff20: 74 65 33 4d 50 72 69 6e 74 66 28 70 50 61 72 73  te3MPrintf(pPars
ff30: 65 2d 3e 64 62 2c 20 22 45 58 45 43 55 54 45 20  e->db, "EXECUTE 
ff40: 25 73 25 73 20 53 55 42 51 55 45 52 59 20 25 64  %s%s SUBQUERY %d
ff50: 22 2c 0a 20 20 20 20 20 20 20 20 6a 6d 70 49 66  ",.        jmpIf
ff60: 44 79 6e 61 6d 69 63 3e 3d 30 3f 22 22 3a 22 43  Dynamic>=0?"":"C
ff70: 4f 52 52 45 4c 41 54 45 44 20 22 2c 0a 20 20 20  ORRELATED ",.   
ff80: 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 3d 3d       pExpr->op==
ff90: 54 4b 5f 49 4e 3f 22 4c 49 53 54 22 3a 22 53 43  TK_IN?"LIST":"SC
ffa0: 41 4c 41 52 22 2c 0a 20 20 20 20 20 20 20 20 70  ALAR",.        p
ffb0: 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65  Parse->iNextSele
ffc0: 63 74 49 64 0a 20 20 20 20 29 3b 0a 20 20 20 20  ctId.    );.    
ffd0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
ffe0: 34 28 76 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c  4(v, OP_Explain,
fff0: 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74   pParse->iSelect
10000 49 64 2c 20 30 2c 20 30 2c 20 7a 4d 73 67 2c 20  Id, 0, 0, zMsg, 
10010 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d  P4_DYNAMIC);.  }
10020 0a 23 65 6e 64 69 66 0a 0a 20 20 73 77 69 74 63  .#endif..  switc
10030 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a  h( pExpr->op ){.
10040 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20      case TK_IN: 
10050 7b 0a 20 20 20 20 20 20 63 68 61 72 20 61 66 66  {.      char aff
10060 69 6e 69 74 79 3b 20 20 20 20 20 20 20 20 20 20  inity;          
10070 20 20 20 20 2f 2a 20 41 66 66 69 6e 69 74 79 20      /* Affinity 
10080 6f 66 20 74 68 65 20 4c 48 53 20 6f 66 20 74 68  of the LHS of th
10090 65 20 49 4e 20 2a 2f 0a 20 20 20 20 20 20 69 6e  e IN */.      in
100a0 74 20 61 64 64 72 3b 20 20 20 20 20 20 20 20 20  t addr;         
100b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
100c0 72 65 73 73 20 6f 66 20 4f 50 5f 4f 70 65 6e 45  ress of OP_OpenE
100d0 70 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 75 63  phemeral instruc
100e0 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45 78  tion */.      Ex
100f0 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70  pr *pLeft = pExp
10100 72 2d 3e 70 4c 65 66 74 3b 20 2f 2a 20 74 68 65  r->pLeft; /* the
10110 20 4c 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f   LHS of the IN o
10120 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20  perator */.     
10130 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
10140 66 6f 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20  fo = 0;      /* 
10150 4b 65 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  Key information 
10160 2a 2f 0a 0a 20 20 20 20 20 20 61 66 66 69 6e 69  */..      affini
10170 74 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ty = sqlite3Expr
10180 41 66 66 69 6e 69 74 79 28 70 4c 65 66 74 29 3b  Affinity(pLeft);
10190 0a 0a 20 20 20 20 20 20 2f 2a 20 57 68 65 74 68  ..      /* Wheth
101a0 65 72 20 74 68 69 73 20 69 73 20 61 6e 20 27 78  er this is an 'x
101b0 20 49 4e 28 53 45 4c 45 43 54 2e 2e 2e 29 27 20   IN(SELECT...)' 
101c0 6f 72 20 61 6e 20 27 78 20 49 4e 28 3c 65 78 70  or an 'x IN(<exp
101d0 72 6c 69 73 74 3e 29 27 0a 20 20 20 20 20 20 2a  rlist>)'.      *
101e0 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 69 74 20  * expression it 
101f0 69 73 20 68 61 6e 64 6c 65 64 20 74 68 65 20 73  is handled the s
10200 61 6d 65 20 77 61 79 2e 20 20 41 6e 20 65 70 68  ame way.  An eph
10210 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 69 73 20  emeral table is 
10220 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 6c 65 64  .      ** filled
10230 20 77 69 74 68 20 73 69 6e 67 6c 65 2d 66 69 65   with single-fie
10240 6c 64 20 69 6e 64 65 78 20 6b 65 79 73 20 72 65  ld index keys re
10250 70 72 65 73 65 6e 74 69 6e 67 20 74 68 65 20 72  presenting the r
10260 65 73 75 6c 74 73 0a 20 20 20 20 20 20 2a 2a 20  esults.      ** 
10270 66 72 6f 6d 20 74 68 65 20 53 45 4c 45 43 54 20  from the SELECT 
10280 6f 72 20 74 68 65 20 3c 65 78 70 72 6c 69 73 74  or the <exprlist
10290 3e 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  >..      **.    
102a0 20 20 2a 2a 20 49 66 20 74 68 65 20 27 78 27 20    ** If the 'x' 
102b0 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20  expression is a 
102c0 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 2c 20 6f 72  column value, or
102d0 20 74 68 65 20 53 45 4c 45 43 54 2e 2e 2e 0a 20   the SELECT.... 
102e0 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e       ** statemen
102f0 74 20 72 65 74 75 72 6e 73 20 61 20 63 6f 6c 75  t returns a colu
10300 6d 6e 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 74  mn value, then t
10310 68 65 20 61 66 66 69 6e 69 74 79 20 6f 66 20 74  he affinity of t
10320 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6c  hat.      ** col
10330 75 6d 6e 20 69 73 20 75 73 65 64 20 74 6f 20 62  umn is used to b
10340 75 69 6c 64 20 74 68 65 20 69 6e 64 65 78 20 6b  uild the index k
10350 65 79 73 2e 20 49 66 20 62 6f 74 68 20 27 78 27  eys. If both 'x'
10360 20 61 6e 64 20 74 68 65 0a 20 20 20 20 20 20 2a   and the.      *
10370 2a 20 53 45 4c 45 43 54 2e 2e 2e 20 73 74 61 74  * SELECT... stat
10380 65 6d 65 6e 74 20 61 72 65 20 63 6f 6c 75 6d 6e  ement are column
10390 73 2c 20 74 68 65 6e 20 6e 75 6d 65 72 69 63 20  s, then numeric 
103a0 61 66 66 69 6e 69 74 79 20 69 73 20 75 73 65 64  affinity is used
103b0 0a 20 20 20 20 20 20 2a 2a 20 69 66 20 65 69 74  .      ** if eit
103c0 68 65 72 20 63 6f 6c 75 6d 6e 20 68 61 73 20 4e  her column has N
103d0 55 4d 45 52 49 43 20 6f 72 20 49 4e 54 45 47 45  UMERIC or INTEGE
103e0 52 20 61 66 66 69 6e 69 74 79 2e 20 49 66 20 6e  R affinity. If n
103f0 65 69 74 68 65 72 0a 20 20 20 20 20 20 2a 2a 20  either.      ** 
10400 27 78 27 20 6e 6f 72 20 74 68 65 20 53 45 4c 45  'x' nor the SELE
10410 43 54 2e 2e 2e 20 73 74 61 74 65 6d 65 6e 74 20  CT... statement 
10420 61 72 65 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65  are columns, the
10430 6e 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e 69  n numeric affini
10440 74 79 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 75  ty.      ** is u
10450 73 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  sed..      */.  
10460 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c      pExpr->iTabl
10470 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  e = pParse->nTab
10480 2b 2b 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d  ++;.      addr =
10490 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
104a0 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p2(v, OP_OpenEph
104b0 65 6d 65 72 61 6c 2c 20 70 45 78 70 72 2d 3e 69  emeral, pExpr->i
104c0 54 61 62 6c 65 2c 20 21 69 73 52 6f 77 69 64 29  Table, !isRowid)
104d0 3b 0a 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f  ;.      pKeyInfo
104e0 20 3d 20 69 73 52 6f 77 69 64 20 3f 20 30 20 3a   = isRowid ? 0 :
104f0 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41   sqlite3KeyInfoA
10500 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64 62 2c  lloc(pParse->db,
10510 20 31 2c 20 31 29 3b 0a 0a 20 20 20 20 20 20 69   1, 1);..      i
10520 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
10530 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73  ty(pExpr, EP_xIs
10540 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20  Select) ){.     
10550 20 20 20 2f 2a 20 43 61 73 65 20 31 3a 20 20 20     /* Case 1:   
10560 20 20 65 78 70 72 20 49 4e 20 28 53 45 4c 45 43    expr IN (SELEC
10570 54 20 2e 2e 2e 29 0a 20 20 20 20 20 20 20 20 2a  T ...).        *
10580 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 47 65 6e  *.        ** Gen
10590 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 77 72  erate code to wr
105a0 69 74 65 20 74 68 65 20 72 65 73 75 6c 74 73 20  ite the results 
105b0 6f 66 20 74 68 65 20 73 65 6c 65 63 74 20 69 6e  of the select in
105c0 74 6f 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  to the temporary
105d0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c  .        ** tabl
105e0 65 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20  e allocated and 
105f0 6f 70 65 6e 65 64 20 61 62 6f 76 65 2e 0a 20 20  opened above..  
10600 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
10610 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
10620 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c   = pExpr->x.pSel
10630 65 63 74 3b 0a 20 20 20 20 20 20 20 20 53 65 6c  ect;.        Sel
10640 65 63 74 44 65 73 74 20 64 65 73 74 3b 0a 20 20  ectDest dest;.  
10650 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a        ExprList *
10660 70 45 4c 69 73 74 3b 0a 0a 20 20 20 20 20 20 20  pEList;..       
10670 20 61 73 73 65 72 74 28 20 21 69 73 52 6f 77 69   assert( !isRowi
10680 64 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  d );.        sql
10690 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e  ite3SelectDestIn
106a0 69 74 28 26 64 65 73 74 2c 20 53 52 54 5f 53 65  it(&dest, SRT_Se
106b0 74 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  t, pExpr->iTable
106c0 29 3b 0a 20 20 20 20 20 20 20 20 64 65 73 74 2e  );.        dest.
106d0 61 66 66 53 64 73 74 20 3d 20 28 75 38 29 61 66  affSdst = (u8)af
106e0 66 69 6e 69 74 79 3b 0a 20 20 20 20 20 20 20 20  finity;.        
106f0 61 73 73 65 72 74 28 20 28 70 45 78 70 72 2d 3e  assert( (pExpr->
10700 69 54 61 62 6c 65 26 30 78 30 30 30 30 46 46 46  iTable&0x0000FFF
10710 46 29 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c  F)==pExpr->iTabl
10720 65 20 29 3b 0a 20 20 20 20 20 20 20 20 70 53 65  e );.        pSe
10730 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 20 3d 20 30  lect->iLimit = 0
10740 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
10750 73 65 28 20 70 53 65 6c 65 63 74 2d 3e 73 65 6c  se( pSelect->sel
10760 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69  Flags & SF_Disti
10770 6e 63 74 20 29 3b 0a 20 20 20 20 20 20 20 20 74  nct );.        t
10780 65 73 74 63 61 73 65 28 20 70 4b 65 79 49 6e 66  estcase( pKeyInf
10790 6f 3d 3d 30 20 29 3b 20 2f 2a 20 43 61 75 73 65  o==0 ); /* Cause
107a0 64 20 62 79 20 4f 4f 4d 20 69 6e 20 73 71 6c 69  d by OOM in sqli
107b0 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28  te3KeyInfoAlloc(
107c0 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28  ) */.        if(
107d0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
107e0 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2c 20  Parse, pSelect, 
107f0 26 64 65 73 74 29 20 29 7b 0a 20 20 20 20 20 20  &dest) ){.      
10800 20 20 20 20 73 71 6c 69 74 65 33 4b 65 79 49 6e      sqlite3KeyIn
10810 66 6f 55 6e 72 65 66 28 70 4b 65 79 49 6e 66 6f  foUnref(pKeyInfo
10820 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
10830 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  urn 0;.        }
10840 0a 20 20 20 20 20 20 20 20 70 45 4c 69 73 74 20  .        pEList 
10850 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73  = pSelect->pELis
10860 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  t;.        asser
10870 74 28 20 70 4b 65 79 49 6e 66 6f 21 3d 30 20 29  t( pKeyInfo!=0 )
10880 3b 20 2f 2a 20 4f 4f 4d 20 77 69 6c 6c 20 63 61  ; /* OOM will ca
10890 75 73 65 20 65 78 69 74 20 61 66 74 65 72 20 73  use exit after s
108a0 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29 20 2a  qlite3Select() *
108b0 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
108c0 28 20 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a 20  ( pEList!=0 );. 
108d0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
108e0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29  EList->nExpr>0 )
108f0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
10900 28 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  ( sqlite3KeyInfo
10910 49 73 57 72 69 74 65 61 62 6c 65 28 70 4b 65 79  IsWriteable(pKey
10920 49 6e 66 6f 29 20 29 3b 0a 20 20 20 20 20 20 20  Info) );.       
10930 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c   pKeyInfo->aColl
10940 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 42 69 6e  [0] = sqlite3Bin
10950 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65  aryCompareCollSe
10960 71 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  q(pParse, pExpr-
10970 3e 70 4c 65 66 74 2c 0a 20 20 20 20 20 20 20 20  >pLeft,.        
10980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
109a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
109b0 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45   pEList->a[0].pE
109c0 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  xpr);.      }els
109d0 65 20 69 66 28 20 41 4c 57 41 59 53 28 70 45 78  e if( ALWAYS(pEx
109e0 70 72 2d 3e 78 2e 70 4c 69 73 74 21 3d 30 29 20  pr->x.pList!=0) 
109f0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 61  ){.        /* Ca
10a00 73 65 20 32 3a 20 20 20 20 20 65 78 70 72 20 49  se 2:     expr I
10a10 4e 20 28 65 78 70 72 6c 69 73 74 29 0a 20 20 20  N (exprlist).   
10a20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
10a30 2a 2a 20 46 6f 72 20 65 61 63 68 20 65 78 70 72  ** For each expr
10a40 65 73 73 69 6f 6e 2c 20 62 75 69 6c 64 20 61 6e  ession, build an
10a50 20 69 6e 64 65 78 20 6b 65 79 20 66 72 6f 6d 20   index key from 
10a60 74 68 65 20 65 76 61 6c 75 61 74 69 6f 6e 20 61  the evaluation a
10a70 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 74  nd.        ** st
10a80 6f 72 65 20 69 74 20 69 6e 20 74 68 65 20 74 65  ore it in the te
10a90 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2e 20 49  mporary table. I
10aa0 66 20 3c 65 78 70 72 3e 20 69 73 20 61 20 63 6f  f <expr> is a co
10ab0 6c 75 6d 6e 2c 20 74 68 65 6e 20 75 73 65 0a 20  lumn, then use. 
10ac0 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 63         ** that c
10ad0 6f 6c 75 6d 6e 73 20 61 66 66 69 6e 69 74 79 20  olumns affinity 
10ae0 77 68 65 6e 20 62 75 69 6c 64 69 6e 67 20 69 6e  when building in
10af0 64 65 78 20 6b 65 79 73 2e 20 49 66 20 3c 65 78  dex keys. If <ex
10b00 70 72 3e 20 69 73 20 6e 6f 74 0a 20 20 20 20 20  pr> is not.     
10b10 20 20 20 2a 2a 20 61 20 63 6f 6c 75 6d 6e 2c 20     ** a column, 
10b20 75 73 65 20 6e 75 6d 65 72 69 63 20 61 66 66 69  use numeric affi
10b30 6e 69 74 79 2e 0a 20 20 20 20 20 20 20 20 2a 2f  nity..        */
10b40 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  .        int i;.
10b50 20 20 20 20 20 20 20 20 45 78 70 72 4c 69 73 74          ExprList
10b60 20 2a 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d   *pList = pExpr-
10b70 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20  >x.pList;.      
10b80 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
10b90 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
10ba0 20 20 20 20 20 20 20 69 6e 74 20 72 31 2c 20 72         int r1, r
10bb0 32 2c 20 72 33 3b 0a 0a 20 20 20 20 20 20 20 20  2, r3;..        
10bc0 69 66 28 20 21 61 66 66 69 6e 69 74 79 20 29 7b  if( !affinity ){
10bd0 0a 20 20 20 20 20 20 20 20 20 20 61 66 66 69 6e  .          affin
10be0 69 74 79 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  ity = SQLITE_AFF
10bf0 5f 42 4c 4f 42 3b 0a 20 20 20 20 20 20 20 20 7d  _BLOB;.        }
10c00 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4b 65  .        if( pKe
10c10 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 20  yInfo ){.       
10c20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
10c30 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65  e3KeyInfoIsWrite
10c40 61 62 6c 65 28 70 4b 65 79 49 6e 66 6f 29 20 29  able(pKeyInfo) )
10c50 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4b 65 79  ;.          pKey
10c60 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 30 5d 20 3d  Info->aColl[0] =
10c70 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
10c80 53 65 71 28 70 50 61 72 73 65 2c 20 70 45 78 70  Seq(pParse, pExp
10c90 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20  r->pLeft);.     
10ca0 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a     }..        /*
10cb0 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 65 61   Loop through ea
10cc0 63 68 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e  ch expression in
10cd0 20 3c 65 78 70 72 6c 69 73 74 3e 2e 20 2a 2f 0a   <exprlist>. */.
10ce0 20 20 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c          r1 = sql
10cf0 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
10d00 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
10d10 72 32 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r2 = sqlite3GetT
10d20 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
10d30 20 20 20 20 20 20 20 20 69 66 28 20 69 73 52 6f          if( isRo
10d40 77 69 64 20 29 20 73 71 6c 69 74 65 33 56 64 62  wid ) sqlite3Vdb
10d50 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75  eAddOp2(v, OP_Nu
10d60 6c 6c 2c 20 30 2c 20 72 32 29 3b 0a 20 20 20 20  ll, 0, r2);.    
10d70 20 20 20 20 66 6f 72 28 69 3d 70 4c 69 73 74 2d      for(i=pList-
10d80 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d 70 4c  >nExpr, pItem=pL
10d90 69 73 74 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d  ist->a; i>0; i--
10da0 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
10db0 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 32 20        Expr *pE2 
10dc0 3d 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a  = pItem->pExpr;.
10dd0 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 56            int iV
10de0 61 6c 54 6f 49 6e 73 3b 0a 0a 20 20 20 20 20 20  alToIns;..      
10df0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 65 78      /* If the ex
10e00 70 72 65 73 73 69 6f 6e 20 69 73 20 6e 6f 74 20  pression is not 
10e10 63 6f 6e 73 74 61 6e 74 20 74 68 65 6e 20 77 65  constant then we
10e20 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 0a 20 20   will need to.  
10e30 20 20 20 20 20 20 20 20 2a 2a 20 64 69 73 61 62          ** disab
10e40 6c 65 20 74 68 65 20 74 65 73 74 20 74 68 61 74  le the test that
10e50 20 77 61 73 20 67 65 6e 65 72 61 74 65 64 20 61   was generated a
10e60 62 6f 76 65 20 74 68 61 74 20 6d 61 6b 65 73 20  bove that makes 
10e70 73 75 72 65 0a 20 20 20 20 20 20 20 20 20 20 2a  sure.          *
10e80 2a 20 74 68 69 73 20 63 6f 64 65 20 6f 6e 6c 79  * this code only
10e90 20 65 78 65 63 75 74 65 73 20 6f 6e 63 65 2e 20   executes once. 
10ea0 20 42 65 63 61 75 73 65 20 66 6f 72 20 61 20 6e   Because for a n
10eb0 6f 6e 2d 63 6f 6e 73 74 61 6e 74 0a 20 20 20 20  on-constant.    
10ec0 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65 73 73        ** express
10ed0 69 6f 6e 20 77 65 20 6e 65 65 64 20 74 6f 20 72  ion we need to r
10ee0 65 72 75 6e 20 74 68 69 73 20 63 6f 64 65 20 65  erun this code e
10ef0 61 63 68 20 74 69 6d 65 2e 0a 20 20 20 20 20 20  ach time..      
10f00 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
10f10 20 69 66 28 20 6a 6d 70 49 66 44 79 6e 61 6d 69   if( jmpIfDynami
10f20 63 3e 3d 30 20 26 26 20 21 73 71 6c 69 74 65 33  c>=0 && !sqlite3
10f30 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70  ExprIsConstant(p
10f40 45 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  E2) ){.         
10f50 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
10f60 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 6a 6d  angeToNoop(v, jm
10f70 70 49 66 44 79 6e 61 6d 69 63 29 3b 0a 20 20 20  pIfDynamic);.   
10f80 20 20 20 20 20 20 20 20 20 6a 6d 70 49 66 44 79           jmpIfDy
10f90 6e 61 6d 69 63 20 3d 20 2d 31 3b 0a 20 20 20 20  namic = -1;.    
10fa0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
10fb0 20 20 20 2f 2a 20 45 76 61 6c 75 61 74 65 20 74     /* Evaluate t
10fc0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e  he expression an
10fd0 64 20 69 6e 73 65 72 74 20 69 74 20 69 6e 74 6f  d insert it into
10fe0 20 74 68 65 20 74 65 6d 70 20 74 61 62 6c 65 20   the temp table 
10ff0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
11000 20 69 73 52 6f 77 69 64 20 26 26 20 73 71 6c 69   isRowid && sqli
11010 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72  te3ExprIsInteger
11020 28 70 45 32 2c 20 26 69 56 61 6c 54 6f 49 6e 73  (pE2, &iValToIns
11030 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
11040 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
11050 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 49  p3(v, OP_InsertI
11060 6e 74 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  nt, pExpr->iTabl
11070 65 2c 20 72 32 2c 20 69 56 61 6c 54 6f 49 6e 73  e, r2, iValToIns
11080 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  );.          }el
11090 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
110a0 72 33 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r3 = sqlite3Expr
110b0 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73  CodeTarget(pPars
110c0 65 2c 20 70 45 32 2c 20 72 31 29 3b 0a 20 20 20  e, pE2, r1);.   
110d0 20 20 20 20 20 20 20 20 20 69 66 28 20 69 73 52           if( isR
110e0 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20  owid ){.        
110f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
11100 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4d 75  eAddOp2(v, OP_Mu
11110 73 74 42 65 49 6e 74 2c 20 72 33 2c 0a 20 20 20  stBeInt, r3,.   
11120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11130 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
11140 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
11150 64 64 72 28 76 29 2b 32 29 3b 0a 20 20 20 20 20  ddr(v)+2);.     
11160 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76           VdbeCov
11170 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
11180 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
11190 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
111a0 49 6e 73 65 72 74 2c 20 70 45 78 70 72 2d 3e 69  Insert, pExpr->i
111b0 54 61 62 6c 65 2c 20 72 32 2c 20 72 33 29 3b 0a  Table, r2, r3);.
111c0 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73              }els
111d0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e{.             
111e0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
111f0 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p4(v, OP_MakeRec
11200 6f 72 64 2c 20 72 33 2c 20 31 2c 20 72 32 2c 20  ord, r3, 1, r2, 
11210 26 61 66 66 69 6e 69 74 79 2c 20 31 29 3b 0a 20  &affinity, 1);. 
11220 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
11230 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66  ite3ExprCacheAff
11240 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72  inityChange(pPar
11250 73 65 2c 20 72 33 2c 20 31 29 3b 0a 20 20 20 20  se, r3, 1);.    
11260 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
11270 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
11280 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 70 45 78  P_IdxInsert, pEx
11290 70 72 2d 3e 69 54 61 62 6c 65 2c 20 72 32 29 3b  pr->iTable, r2);
112a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
112b0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
112c0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
112d0 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
112e0 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a  eg(pParse, r1);.
112f0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
11300 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
11310 61 72 73 65 2c 20 72 32 29 3b 0a 20 20 20 20 20  arse, r2);.     
11320 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 4b 65   }.      if( pKe
11330 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 20  yInfo ){.       
11340 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
11350 67 65 50 34 28 76 2c 20 61 64 64 72 2c 20 28 76  geP4(v, addr, (v
11360 6f 69 64 20 2a 29 70 4b 65 79 49 6e 66 6f 2c 20  oid *)pKeyInfo, 
11370 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20  P4_KEYINFO);.   
11380 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
11390 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73  ;.    }..    cas
113a0 65 20 54 4b 5f 45 58 49 53 54 53 3a 0a 20 20 20  e TK_EXISTS:.   
113b0 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a   case TK_SELECT:
113c0 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
113d0 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73        /* If this
113e0 20 68 61 73 20 74 6f 20 62 65 20 61 20 73 63 61   has to be a sca
113f0 6c 61 72 20 53 45 4c 45 43 54 2e 20 20 47 65 6e  lar SELECT.  Gen
11400 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 70 75  erate code to pu
11410 74 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 76  t the.      ** v
11420 61 6c 75 65 20 6f 66 20 74 68 69 73 20 73 65 6c  alue of this sel
11430 65 63 74 20 69 6e 20 61 20 6d 65 6d 6f 72 79 20  ect in a memory 
11440 63 65 6c 6c 20 61 6e 64 20 72 65 63 6f 72 64 20  cell and record 
11450 74 68 65 20 6e 75 6d 62 65 72 0a 20 20 20 20 20  the number.     
11460 20 2a 2a 20 6f 66 20 74 68 65 20 6d 65 6d 6f 72   ** of the memor
11470 79 20 63 65 6c 6c 20 69 6e 20 69 43 6f 6c 75 6d  y cell in iColum
11480 6e 2e 20 20 49 66 20 74 68 69 73 20 69 73 20 61  n.  If this is a
11490 6e 20 45 58 49 53 54 53 2c 20 77 72 69 74 65 0a  n EXISTS, write.
114a0 20 20 20 20 20 20 2a 2a 20 61 6e 20 69 6e 74 65        ** an inte
114b0 67 65 72 20 30 20 28 6e 6f 74 20 65 78 69 73 74  ger 0 (not exist
114c0 73 29 20 6f 72 20 31 20 28 65 78 69 73 74 73 29  s) or 1 (exists)
114d0 20 69 6e 74 6f 20 61 20 6d 65 6d 6f 72 79 20 63   into a memory c
114e0 65 6c 6c 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64  ell.      ** and
114f0 20 72 65 63 6f 72 64 20 74 68 61 74 20 6d 65 6d   record that mem
11500 6f 72 79 20 63 65 6c 6c 20 69 6e 20 69 43 6f 6c  ory cell in iCol
11510 75 6d 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  umn..      */.  
11520 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c      Select *pSel
11530 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
11540 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 45 4c            /* SEL
11550 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 6f  ECT statement to
11560 20 65 6e 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20   encode */.     
11570 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74   SelectDest dest
11580 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
11590 20 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f         /* How to
115a0 20 64 65 61 6c 20 77 69 74 68 20 53 45 4c 45 43   deal with SELEC
115b0 74 20 72 65 73 75 6c 74 20 2a 2f 0a 0a 20 20 20  t result */..   
115c0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
115d0 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53 54  pr->op==TK_EXIST
115e0 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  S );.      testc
115f0 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
11600 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 20 20 20  TK_SELECT );.   
11610 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
11620 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53 54 53 20  ->op==TK_EXISTS 
11630 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  || pExpr->op==TK
11640 5f 53 45 4c 45 43 54 20 29 3b 0a 0a 20 20 20 20  _SELECT );..    
11650 20 20 61 73 73 65 72 74 28 20 45 78 70 72 48 61    assert( ExprHa
11660 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
11670 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
11680 3b 0a 20 20 20 20 20 20 70 53 65 6c 20 3d 20 70  ;.      pSel = p
11690 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 3b  Expr->x.pSelect;
116a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65  .      sqlite3Se
116b0 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65  lectDestInit(&de
116c0 73 74 2c 20 30 2c 20 2b 2b 70 50 61 72 73 65 2d  st, 0, ++pParse-
116d0 3e 6e 4d 65 6d 29 3b 0a 20 20 20 20 20 20 69 66  >nMem);.      if
116e0 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
116f0 53 45 4c 45 43 54 20 29 7b 0a 20 20 20 20 20 20  SELECT ){.      
11700 20 20 64 65 73 74 2e 65 44 65 73 74 20 3d 20 53    dest.eDest = S
11710 52 54 5f 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20  RT_Mem;.        
11720 64 65 73 74 2e 69 53 64 73 74 20 3d 20 64 65 73  dest.iSdst = des
11730 74 2e 69 53 44 50 61 72 6d 3b 0a 20 20 20 20 20  t.iSDParm;.     
11740 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
11750 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c  dOp2(v, OP_Null,
11760 20 30 2c 20 64 65 73 74 2e 69 53 44 50 61 72 6d   0, dest.iSDParm
11770 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43  );.        VdbeC
11780 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 49 6e 69 74  omment((v, "Init
11790 20 73 75 62 71 75 65 72 79 20 72 65 73 75 6c 74   subquery result
117a0 22 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  "));.      }else
117b0 7b 0a 20 20 20 20 20 20 20 20 64 65 73 74 2e 65  {.        dest.e
117c0 44 65 73 74 20 3d 20 53 52 54 5f 45 78 69 73 74  Dest = SRT_Exist
117d0 73 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  s;.        sqlit
117e0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
117f0 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 64  OP_Integer, 0, d
11800 65 73 74 2e 69 53 44 50 61 72 6d 29 3b 0a 20 20  est.iSDParm);.  
11810 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
11820 74 28 28 76 2c 20 22 49 6e 69 74 20 45 58 49 53  t((v, "Init EXIS
11830 54 53 20 72 65 73 75 6c 74 22 29 29 3b 0a 20 20  TS result"));.  
11840 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
11850 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 50  te3ExprDelete(pP
11860 61 72 73 65 2d 3e 64 62 2c 20 70 53 65 6c 2d 3e  arse->db, pSel->
11870 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 70  pLimit);.      p
11880 53 65 6c 2d 3e 70 4c 69 6d 69 74 20 3d 20 73 71  Sel->pLimit = sq
11890 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
118a0 65 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c 20 30  e, TK_INTEGER, 0
118b0 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
118c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
118d0 20 20 20 20 20 20 20 26 73 71 6c 69 74 65 33 49         &sqlite3I
118e0 6e 74 54 6f 6b 65 6e 73 5b 31 5d 29 3b 0a 20 20  ntTokens[1]);.  
118f0 20 20 20 20 70 53 65 6c 2d 3e 69 4c 69 6d 69 74      pSel->iLimit
11900 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 53 65 6c   = 0;.      pSel
11910 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53  ->selFlags &= ~S
11920 46 5f 4d 75 6c 74 69 56 61 6c 75 65 3b 0a 20 20  F_MultiValue;.  
11930 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
11940 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53  elect(pParse, pS
11950 65 6c 2c 20 26 64 65 73 74 29 20 29 7b 0a 20 20  el, &dest) ){.  
11960 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
11970 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 52        }.      rR
11980 65 67 20 3d 20 64 65 73 74 2e 69 53 44 50 61 72  eg = dest.iSDPar
11990 6d 3b 0a 20 20 20 20 20 20 45 78 70 72 53 65 74  m;.      ExprSet
119a0 56 56 41 50 72 6f 70 65 72 74 79 28 70 45 78 70  VVAProperty(pExp
119b0 72 2c 20 45 50 5f 4e 6f 52 65 64 75 63 65 29 3b  r, EP_NoReduce);
119c0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
119d0 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72    }.  }..  if( r
119e0 48 61 73 4e 75 6c 6c 46 6c 61 67 20 29 7b 0a 20  HasNullFlag ){. 
119f0 20 20 20 73 71 6c 69 74 65 33 53 65 74 48 61 73     sqlite3SetHas
11a00 4e 75 6c 6c 46 6c 61 67 28 76 2c 20 70 45 78 70  NullFlag(v, pExp
11a10 72 2d 3e 69 54 61 62 6c 65 2c 20 72 48 61 73 4e  r->iTable, rHasN
11a20 75 6c 6c 46 6c 61 67 29 3b 0a 20 20 7d 0a 0a 20  ullFlag);.  }.. 
11a30 20 69 66 28 20 6a 6d 70 49 66 44 79 6e 61 6d 69   if( jmpIfDynami
11a40 63 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  c>=0 ){.    sqli
11a50 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
11a60 76 2c 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63 29  v, jmpIfDynamic)
11a70 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45  ;.  }.  sqlite3E
11a80 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72  xprCachePop(pPar
11a90 73 65 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72  se);..  return r
11aa0 52 65 67 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  Reg;.}.#endif /*
11ab0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
11ac0 51 55 45 52 59 20 2a 2f 0a 0a 23 69 66 6e 64 65  QUERY */..#ifnde
11ad0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
11ae0 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 47 65 6e  BQUERY./*.** Gen
11af0 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61  erate code for a
11b00 6e 20 49 4e 20 65 78 70 72 65 73 73 69 6f 6e 2e  n IN expression.
11b10 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 78 20 49 4e  .**.**      x IN
11b20 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 2a 2a   (SELECT ...).**
11b30 20 20 20 20 20 20 78 20 49 4e 20 28 76 61 6c 75        x IN (valu
11b40 65 2c 20 76 61 6c 75 65 2c 20 2e 2e 2e 29 0a 2a  e, value, ...).*
11b50 2a 0a 2a 2a 20 54 68 65 20 6c 65 66 74 2d 68 61  *.** The left-ha
11b60 6e 64 20 73 69 64 65 20 28 4c 48 53 29 20 69 73  nd side (LHS) is
11b70 20 61 20 73 63 61 6c 61 72 20 65 78 70 72 65 73   a scalar expres
11b80 73 69 6f 6e 2e 20 20 54 68 65 20 72 69 67 68 74  sion.  The right
11b90 2d 68 61 6e 64 20 73 69 64 65 20 28 52 48 53 29  -hand side (RHS)
11ba0 0a 2a 2a 20 69 73 20 61 6e 20 61 72 72 61 79 20  .** is an array 
11bb0 6f 66 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20  of zero or more 
11bc0 76 61 6c 75 65 73 2e 20 20 54 68 65 20 65 78 70  values.  The exp
11bd0 72 65 73 73 69 6f 6e 20 69 73 20 74 72 75 65 20  ression is true 
11be0 69 66 20 74 68 65 20 4c 48 53 20 69 73 0a 2a 2a  if the LHS is.**
11bf0 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69   contained withi
11c00 6e 20 74 68 65 20 52 48 53 2e 20 20 54 68 65 20  n the RHS.  The 
11c10 76 61 6c 75 65 20 6f 66 20 74 68 65 20 65 78 70  value of the exp
11c20 72 65 73 73 69 6f 6e 20 69 73 20 75 6e 6b 6e 6f  ression is unkno
11c30 77 6e 20 28 4e 55 4c 4c 29 0a 2a 2a 20 69 66 20  wn (NULL).** if 
11c40 74 68 65 20 4c 48 53 20 69 73 20 4e 55 4c 4c 20  the LHS is NULL 
11c50 6f 72 20 69 66 20 74 68 65 20 4c 48 53 20 69 73  or if the LHS is
11c60 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20 77   not contained w
11c70 69 74 68 69 6e 20 74 68 65 20 52 48 53 20 61 6e  ithin the RHS an
11c80 64 20 74 68 65 0a 2a 2a 20 52 48 53 20 63 6f 6e  d the.** RHS con
11c90 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72  tains one or mor
11ca0 65 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2e 0a 2a  e NULL values..*
11cb0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
11cc0 65 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65  e generates code
11cd0 20 74 68 61 74 20 6a 75 6d 70 73 20 74 6f 20 64   that jumps to d
11ce0 65 73 74 49 66 46 61 6c 73 65 20 69 66 20 74 68  estIfFalse if th
11cf0 65 20 4c 48 53 20 69 73 20 6e 6f 74 20 0a 2a 2a  e LHS is not .**
11d00 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69   contained withi
11d10 6e 20 74 68 65 20 52 48 53 2e 20 20 49 66 20 64  n the RHS.  If d
11d20 75 65 20 74 6f 20 4e 55 4c 4c 73 20 77 65 20 63  ue to NULLs we c
11d30 61 6e 6e 6f 74 20 64 65 74 65 72 6d 69 6e 65 20  annot determine 
11d40 69 66 20 74 68 65 20 4c 48 53 0a 2a 2a 20 69 73  if the LHS.** is
11d50 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68   contained in th
11d60 65 20 52 48 53 20 74 68 65 6e 20 6a 75 6d 70 20  e RHS then jump 
11d70 74 6f 20 64 65 73 74 49 66 4e 75 6c 6c 2e 20 20  to destIfNull.  
11d80 49 66 20 74 68 65 20 4c 48 53 20 69 73 20 63 6f  If the LHS is co
11d90 6e 74 61 69 6e 65 64 0a 2a 2a 20 77 69 74 68 69  ntained.** withi
11da0 6e 20 74 68 65 20 52 48 53 20 74 68 65 6e 20 66  n the RHS then f
11db0 61 6c 6c 20 74 68 72 6f 75 67 68 2e 0a 2a 2f 0a  all through..*/.
11dc0 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69  static void sqli
11dd0 74 65 33 45 78 70 72 43 6f 64 65 49 4e 28 0a 20  te3ExprCodeIN(. 
11de0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
11df0 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
11e00 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72  g and code gener
11e10 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  ating context */
11e20 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  .  Expr *pExpr, 
11e30 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
11e40 49 4e 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f  IN expression */
11e50 0a 20 20 69 6e 74 20 64 65 73 74 49 66 46 61 6c  .  int destIfFal
11e60 73 65 2c 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70  se,      /* Jump
11e70 20 68 65 72 65 20 69 66 20 4c 48 53 20 69 73 20   here if LHS is 
11e80 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e  not contained in
11e90 20 74 68 65 20 52 48 53 20 2a 2f 0a 20 20 69 6e   the RHS */.  in
11ea0 74 20 64 65 73 74 49 66 4e 75 6c 6c 20 20 20 20  t destIfNull    
11eb0 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65      /* Jump here
11ec0 20 69 66 20 74 68 65 20 72 65 73 75 6c 74 73 20   if the results 
11ed0 61 72 65 20 75 6e 6b 6e 6f 77 6e 20 64 75 65 20  are unknown due 
11ee0 74 6f 20 4e 55 4c 4c 73 20 2a 2f 0a 29 7b 0a 20  to NULLs */.){. 
11ef0 20 69 6e 74 20 72 52 68 73 48 61 73 4e 75 6c 6c   int rRhsHasNull
11f00 20 3d 20 30 3b 20 20 2f 2a 20 52 65 67 69 73 74   = 0;  /* Regist
11f10 65 72 20 74 68 61 74 20 69 73 20 74 72 75 65 20  er that is true 
11f20 69 66 20 52 48 53 20 63 6f 6e 74 61 69 6e 73 20  if RHS contains 
11f30 4e 55 4c 4c 20 76 61 6c 75 65 73 20 2a 2f 0a 20  NULL values */. 
11f40 20 63 68 61 72 20 61 66 66 69 6e 69 74 79 3b 20   char affinity; 
11f50 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 61 72         /* Compar
11f60 69 73 6f 6e 20 61 66 66 69 6e 69 74 79 20 74 6f  ison affinity to
11f70 20 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 65 54   use */.  int eT
11f80 79 70 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ype;            
11f90 2f 2a 20 54 79 70 65 20 6f 66 20 74 68 65 20 52  /* Type of the R
11fa0 48 53 20 2a 2f 0a 20 20 69 6e 74 20 72 31 3b 20  HS */.  int r1; 
11fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11fc0 20 54 65 6d 70 6f 72 61 72 79 20 75 73 65 20 72   Temporary use r
11fd0 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 56 64 62  egister */.  Vdb
11fe0 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20  e *v;           
11ff0 20 20 20 2f 2a 20 53 74 61 74 65 6d 65 6e 74 20     /* Statement 
12000 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
12010 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 43 6f 6d 70  on */..  /* Comp
12020 75 74 65 20 74 68 65 20 52 48 53 2e 20 20 20 41  ute the RHS.   A
12030 66 74 65 72 20 74 68 69 73 20 73 74 65 70 2c 20  fter this step, 
12040 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 63  the table with c
12050 75 72 73 6f 72 0a 20 20 2a 2a 20 70 45 78 70 72  ursor.  ** pExpr
12060 2d 3e 69 54 61 62 6c 65 20 77 69 6c 6c 20 63 6f  ->iTable will co
12070 6e 74 61 69 6e 73 20 74 68 65 20 76 61 6c 75 65  ntains the value
12080 73 20 74 68 61 74 20 6d 61 6b 65 20 75 70 20 74  s that make up t
12090 68 65 20 52 48 53 2e 0a 20 20 2a 2f 0a 20 20 76  he RHS..  */.  v
120a0 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
120b0 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30  ;.  assert( v!=0
120c0 20 29 3b 20 20 20 20 20 20 20 2f 2a 20 4f 4f 4d   );       /* OOM
120d0 20 64 65 74 65 63 74 65 64 20 70 72 69 6f 72 20   detected prior 
120e0 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  to this routine 
120f0 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d  */.  VdbeNoopCom
12100 6d 65 6e 74 28 28 76 2c 20 22 62 65 67 69 6e 20  ment((v, "begin 
12110 49 4e 20 65 78 70 72 22 29 29 3b 0a 20 20 65 54  IN expr"));.  eT
12120 79 70 65 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  ype = sqlite3Fin
12130 64 49 6e 49 6e 64 65 78 28 70 50 61 72 73 65 2c  dInIndex(pParse,
12140 20 70 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20   pExpr,.        
12150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12160 20 20 20 20 20 49 4e 5f 49 4e 44 45 58 5f 4d 45       IN_INDEX_ME
12170 4d 42 45 52 53 48 49 50 20 7c 20 49 4e 5f 49 4e  MBERSHIP | IN_IN
12180 44 45 58 5f 4e 4f 4f 50 5f 4f 4b 2c 0a 20 20 20  DEX_NOOP_OK,.   
12190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
121a0 20 20 20 20 20 20 20 20 20 20 64 65 73 74 49 66            destIf
121b0 46 61 6c 73 65 3d 3d 64 65 73 74 49 66 4e 75 6c  False==destIfNul
121c0 6c 20 3f 20 30 20 3a 20 26 72 52 68 73 48 61 73  l ? 0 : &rRhsHas
121d0 4e 75 6c 6c 29 3b 0a 0a 20 20 2f 2a 20 46 69 67  Null);..  /* Fig
121e0 75 72 65 20 6f 75 74 20 74 68 65 20 61 66 66 69  ure out the affi
121f0 6e 69 74 79 20 74 6f 20 75 73 65 20 74 6f 20 63  nity to use to c
12200 72 65 61 74 65 20 61 20 6b 65 79 20 66 72 6f 6d  reate a key from
12210 20 74 68 65 20 72 65 73 75 6c 74 73 0a 20 20 2a   the results.  *
12220 2a 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73  * of the express
12230 69 6f 6e 2e 20 61 66 66 69 6e 69 74 79 53 74 72  ion. affinityStr
12240 20 73 74 6f 72 65 73 20 61 20 73 74 61 74 69 63   stores a static
12250 20 73 74 72 69 6e 67 20 73 75 69 74 61 62 6c 65   string suitable
12260 20 66 6f 72 0a 20 20 2a 2a 20 50 34 20 6f 66 20   for.  ** P4 of 
12270 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2e 0a 20  OP_MakeRecord.. 
12280 20 2a 2f 0a 20 20 61 66 66 69 6e 69 74 79 20 3d   */.  affinity =
12290 20 63 6f 6d 70 61 72 69 73 6f 6e 41 66 66 69 6e   comparisonAffin
122a0 69 74 79 28 70 45 78 70 72 29 3b 0a 0a 20 20 2f  ity(pExpr);..  /
122b0 2a 20 43 6f 64 65 20 74 68 65 20 4c 48 53 2c 20  * Code the LHS, 
122c0 74 68 65 20 3c 65 78 70 72 3e 20 66 72 6f 6d 20  the <expr> from 
122d0 22 3c 65 78 70 72 3e 20 49 4e 20 28 2e 2e 2e 29  "<expr> IN (...)
122e0 22 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  "..  */.  sqlite
122f0 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70  3ExprCachePush(p
12300 50 61 72 73 65 29 3b 0a 20 20 72 31 20 3d 20 73  Parse);.  r1 = s
12310 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
12320 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69  (pParse);.  sqli
12330 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
12340 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
12350 2c 20 72 31 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  , r1);..  /* If 
12360 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e 64  sqlite3FindInInd
12370 65 78 28 29 20 64 69 64 20 6e 6f 74 20 66 69 6e  ex() did not fin
12380 64 20 6f 72 20 63 72 65 61 74 65 20 61 6e 20 69  d or create an i
12390 6e 64 65 78 20 74 68 61 74 20 69 73 0a 20 20 2a  ndex that is.  *
123a0 2a 20 73 75 69 74 61 62 6c 65 20 66 6f 72 20 65  * suitable for e
123b0 76 61 6c 75 61 74 69 6e 67 20 74 68 65 20 49 4e  valuating the IN
123c0 20 6f 70 65 72 61 74 6f 72 2c 20 74 68 65 6e 20   operator, then 
123d0 65 76 61 6c 75 61 74 65 20 75 73 69 6e 67 20 61  evaluate using a
123e0 0a 20 20 2a 2a 20 73 65 71 75 65 6e 63 65 20 6f  .  ** sequence o
123f0 66 20 63 6f 6d 70 61 72 69 73 6f 6e 73 2e 0a 20  f comparisons.. 
12400 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65 3d   */.  if( eType=
12410 3d 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 20 29  =IN_INDEX_NOOP )
12420 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a  {.    ExprList *
12430 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78  pList = pExpr->x
12440 2e 70 4c 69 73 74 3b 0a 20 20 20 20 43 6f 6c 6c  .pList;.    Coll
12450 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c  Seq *pColl = sql
12460 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
12470 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
12480 4c 65 66 74 29 3b 0a 20 20 20 20 69 6e 74 20 6c  Left);.    int l
12490 61 62 65 6c 4f 6b 20 3d 20 73 71 6c 69 74 65 33  abelOk = sqlite3
124a0 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
124b0 3b 0a 20 20 20 20 69 6e 74 20 72 32 2c 20 72 65  ;.    int r2, re
124c0 67 54 6f 46 72 65 65 3b 0a 20 20 20 20 69 6e 74  gToFree;.    int
124d0 20 72 65 67 43 6b 4e 75 6c 6c 20 3d 20 30 3b 0a   regCkNull = 0;.
124e0 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20      int ii;.    
124f0 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
12500 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
12510 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b  EP_xIsSelect) );
12520 0a 20 20 20 20 69 66 28 20 64 65 73 74 49 66 4e  .    if( destIfN
12530 75 6c 6c 21 3d 64 65 73 74 49 66 46 61 6c 73 65  ull!=destIfFalse
12540 20 29 7b 0a 20 20 20 20 20 20 72 65 67 43 6b 4e   ){.      regCkN
12550 75 6c 6c 20 3d 20 73 71 6c 69 74 65 33 47 65 74  ull = sqlite3Get
12560 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
12570 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
12580 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 42  beAddOp3(v, OP_B
12590 69 74 41 6e 64 2c 20 72 31 2c 20 72 31 2c 20 72  itAnd, r1, r1, r
125a0 65 67 43 6b 4e 75 6c 6c 29 3b 0a 20 20 20 20 7d  egCkNull);.    }
125b0 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  .    for(ii=0; i
125c0 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  i<pList->nExpr; 
125d0 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 32 20  ii++){.      r2 
125e0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
125f0 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 4c  eTemp(pParse, pL
12600 69 73 74 2d 3e 61 5b 69 69 5d 2e 70 45 78 70 72  ist->a[ii].pExpr
12610 2c 20 26 72 65 67 54 6f 46 72 65 65 29 3b 0a 20  , &regToFree);. 
12620 20 20 20 20 20 69 66 28 20 72 65 67 43 6b 4e 75       if( regCkNu
12630 6c 6c 20 26 26 20 73 71 6c 69 74 65 33 45 78 70  ll && sqlite3Exp
12640 72 43 61 6e 42 65 4e 75 6c 6c 28 70 4c 69 73 74  rCanBeNull(pList
12650 2d 3e 61 5b 69 69 5d 2e 70 45 78 70 72 29 20 29  ->a[ii].pExpr) )
12660 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
12670 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
12680 50 5f 42 69 74 41 6e 64 2c 20 72 65 67 43 6b 4e  P_BitAnd, regCkN
12690 75 6c 6c 2c 20 72 32 2c 20 72 65 67 43 6b 4e 75  ull, r2, regCkNu
126a0 6c 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ll);.      }.   
126b0 20 20 20 69 66 28 20 69 69 3c 70 4c 69 73 74 2d     if( ii<pList-
126c0 3e 6e 45 78 70 72 2d 31 20 7c 7c 20 64 65 73 74  >nExpr-1 || dest
126d0 49 66 4e 75 6c 6c 21 3d 64 65 73 74 49 66 46 61  IfNull!=destIfFa
126e0 6c 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73  lse ){.        s
126f0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
12700 28 76 2c 20 4f 50 5f 45 71 2c 20 72 31 2c 20 6c  (v, OP_Eq, r1, l
12710 61 62 65 6c 4f 6b 2c 20 72 32 2c 0a 20 20 20 20  abelOk, r2,.    
12720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12730 20 20 20 20 20 20 28 76 6f 69 64 2a 29 70 43 6f        (void*)pCo
12740 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b  ll, P4_COLLSEQ);
12750 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76  .        VdbeCov
12760 65 72 61 67 65 49 66 28 76 2c 20 69 69 3c 70 4c  erageIf(v, ii<pL
12770 69 73 74 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a 20  ist->nExpr-1);. 
12780 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
12790 61 67 65 49 66 28 76 2c 20 69 69 3d 3d 70 4c 69  ageIf(v, ii==pLi
127a0 73 74 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a 20 20  st->nExpr-1);.  
127b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
127c0 65 43 68 61 6e 67 65 50 35 28 76 2c 20 61 66 66  eChangeP5(v, aff
127d0 69 6e 69 74 79 29 3b 0a 20 20 20 20 20 20 7d 65  inity);.      }e
127e0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73  lse{.        ass
127f0 65 72 74 28 20 64 65 73 74 49 66 4e 75 6c 6c 3d  ert( destIfNull=
12800 3d 64 65 73 74 49 66 46 61 6c 73 65 20 29 3b 0a  =destIfFalse );.
12810 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
12820 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
12830 4e 65 2c 20 72 31 2c 20 64 65 73 74 49 66 46 61  Ne, r1, destIfFa
12840 6c 73 65 2c 20 72 32 2c 0a 20 20 20 20 20 20 20  lse, r2,.       
12850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12860 20 20 20 28 76 6f 69 64 2a 29 70 43 6f 6c 6c 2c     (void*)pColl,
12870 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 20 56 64   P4_COLLSEQ); Vd
12880 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
12890 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
128a0 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 61 66  beChangeP5(v, af
128b0 66 69 6e 69 74 79 20 7c 20 53 51 4c 49 54 45 5f  finity | SQLITE_
128c0 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20  JUMPIFNULL);.   
128d0 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
128e0 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
128f0 28 70 50 61 72 73 65 2c 20 72 65 67 54 6f 46 72  (pParse, regToFr
12900 65 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ee);.    }.    i
12910 66 28 20 72 65 67 43 6b 4e 75 6c 6c 20 29 7b 0a  f( regCkNull ){.
12920 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
12930 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73  eAddOp2(v, OP_Is
12940 4e 75 6c 6c 2c 20 72 65 67 43 6b 4e 75 6c 6c 2c  Null, regCkNull,
12950 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 20 56 64   destIfNull); Vd
12960 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
12970 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
12980 47 6f 74 6f 28 76 2c 20 64 65 73 74 49 66 46 61  Goto(v, destIfFa
12990 6c 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  lse);.    }.    
129a0 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
129b0 76 65 4c 61 62 65 6c 28 76 2c 20 6c 61 62 65 6c  veLabel(v, label
129c0 4f 6b 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Ok);.    sqlite3
129d0 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
129e0 50 61 72 73 65 2c 20 72 65 67 43 6b 4e 75 6c 6c  Parse, regCkNull
129f0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 0a 20  );.  }else{.  . 
12a00 20 20 20 2f 2a 20 49 66 20 74 68 65 20 4c 48 53     /* If the LHS
12a10 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74   is NULL, then t
12a20 68 65 20 72 65 73 75 6c 74 20 69 73 20 65 69 74  he result is eit
12a30 68 65 72 20 66 61 6c 73 65 20 6f 72 20 4e 55 4c  her false or NUL
12a40 4c 20 64 65 70 65 6e 64 69 6e 67 0a 20 20 20 20  L depending.    
12a50 2a 2a 20 6f 6e 20 77 68 65 74 68 65 72 20 74 68  ** on whether th
12a60 65 20 52 48 53 20 69 73 20 65 6d 70 74 79 20 6f  e RHS is empty o
12a70 72 20 6e 6f 74 2c 20 72 65 73 70 65 63 74 69 76  r not, respectiv
12a80 65 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ely..    */.    
12a90 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43  if( sqlite3ExprC
12aa0 61 6e 42 65 4e 75 6c 6c 28 70 45 78 70 72 2d 3e  anBeNull(pExpr->
12ab0 70 4c 65 66 74 29 20 29 7b 0a 20 20 20 20 20 20  pLeft) ){.      
12ac0 69 66 28 20 64 65 73 74 49 66 4e 75 6c 6c 3d 3d  if( destIfNull==
12ad0 64 65 73 74 49 66 46 61 6c 73 65 20 29 7b 0a 20  destIfFalse ){. 
12ae0 20 20 20 20 20 20 20 2f 2a 20 53 68 6f 72 74 63         /* Shortc
12af0 75 74 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f  ut for the commo
12b00 6e 20 63 61 73 65 20 77 68 65 72 65 20 74 68 65  n case where the
12b10 20 66 61 6c 73 65 20 61 6e 64 20 4e 55 4c 4c 20   false and NULL 
12b20 6f 75 74 63 6f 6d 65 73 20 61 72 65 0a 20 20 20  outcomes are.   
12b30 20 20 20 20 20 2a 2a 20 74 68 65 20 73 61 6d 65       ** the same
12b40 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c  . */.        sql
12b50 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
12b60 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 31 2c  , OP_IsNull, r1,
12b70 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 20 56 64   destIfNull); Vd
12b80 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
12b90 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
12ba0 20 20 20 20 69 6e 74 20 61 64 64 72 31 20 3d 20      int addr1 = 
12bb0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
12bc0 31 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c  1(v, OP_NotNull,
12bd0 20 72 31 29 3b 20 56 64 62 65 43 6f 76 65 72 61   r1); VdbeCovera
12be0 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73  ge(v);.        s
12bf0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
12c00 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 70  (v, OP_Rewind, p
12c10 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 64 65  Expr->iTable, de
12c20 73 74 49 66 46 61 6c 73 65 29 3b 0a 20 20 20 20  stIfFalse);.    
12c30 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
12c40 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  (v);.        sql
12c50 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20  ite3VdbeGoto(v, 
12c60 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  destIfNull);.   
12c70 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
12c80 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
12c90 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  1);.      }.    
12ca0 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 65 54 79  }.  .    if( eTy
12cb0 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52 4f 57  pe==IN_INDEX_ROW
12cc0 49 44 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  ID ){.      /* I
12cd0 6e 20 74 68 69 73 20 63 61 73 65 2c 20 74 68 65  n this case, the
12ce0 20 52 48 53 20 69 73 20 74 68 65 20 52 4f 57 49   RHS is the ROWI
12cf0 44 20 6f 66 20 74 61 62 6c 65 20 62 2d 74 72 65  D of table b-tre
12d00 65 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  e.      */.     
12d10 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12d20 70 32 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49  p2(v, OP_MustBeI
12d30 6e 74 2c 20 72 31 2c 20 64 65 73 74 49 66 46 61  nt, r1, destIfFa
12d40 6c 73 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61  lse); VdbeCovera
12d50 67 65 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c  ge(v);.      sql
12d60 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
12d70 2c 20 4f 50 5f 4e 6f 74 45 78 69 73 74 73 2c 20  , OP_NotExists, 
12d80 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 64  pExpr->iTable, d
12d90 65 73 74 49 66 46 61 6c 73 65 2c 20 72 31 29 3b  estIfFalse, r1);
12da0 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
12db0 61 67 65 28 76 29 3b 0a 20 20 20 20 7d 65 6c 73  age(v);.    }els
12dc0 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20 74  e{.      /* In t
12dd0 68 69 73 20 63 61 73 65 2c 20 74 68 65 20 52 48  his case, the RH
12de0 53 20 69 73 20 61 6e 20 69 6e 64 65 78 20 62 2d  S is an index b-
12df0 74 72 65 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  tree..      */. 
12e00 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
12e10 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 41 66 66  AddOp4(v, OP_Aff
12e20 69 6e 69 74 79 2c 20 72 31 2c 20 31 2c 20 30 2c  inity, r1, 1, 0,
12e30 20 26 61 66 66 69 6e 69 74 79 2c 20 31 29 3b 0a   &affinity, 1);.
12e40 20 20 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74    .      /* If t
12e50 68 65 20 73 65 74 20 6d 65 6d 62 65 72 73 68 69  he set membershi
12e60 70 20 74 65 73 74 20 66 61 69 6c 73 2c 20 74 68  p test fails, th
12e70 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66  en the result of
12e80 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 22   the .      ** "
12e90 78 20 49 4e 20 28 2e 2e 2e 29 22 20 65 78 70 72  x IN (...)" expr
12ea0 65 73 73 69 6f 6e 20 6d 75 73 74 20 62 65 20 65  ession must be e
12eb0 69 74 68 65 72 20 30 20 6f 72 20 4e 55 4c 4c 2e  ither 0 or NULL.
12ec0 20 49 66 20 74 68 65 20 73 65 74 0a 20 20 20 20   If the set.    
12ed0 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 6e 6f    ** contains no
12ee0 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2c 20 74 68   NULL values, th
12ef0 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 69 73  en the result is
12f00 20 30 2e 20 49 66 20 74 68 65 20 73 65 74 20 0a   0. If the set .
12f10 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e        ** contain
12f20 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 4e 55  s one or more NU
12f30 4c 4c 20 76 61 6c 75 65 73 2c 20 74 68 65 6e 20  LL values, then 
12f40 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68  the result of th
12f50 65 0a 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65  e.      ** expre
12f60 73 73 69 6f 6e 20 69 73 20 61 6c 73 6f 20 4e 55  ssion is also NU
12f70 4c 4c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  LL..      */.   
12f80 20 20 20 61 73 73 65 72 74 28 20 64 65 73 74 49     assert( destI
12f90 66 46 61 6c 73 65 21 3d 64 65 73 74 49 66 4e 75  fFalse!=destIfNu
12fa0 6c 6c 20 7c 7c 20 72 52 68 73 48 61 73 4e 75 6c  ll || rRhsHasNul
12fb0 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  l==0 );.      if
12fc0 28 20 72 52 68 73 48 61 73 4e 75 6c 6c 3d 3d 30  ( rRhsHasNull==0
12fd0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
12fe0 68 69 73 20 62 72 61 6e 63 68 20 72 75 6e 73 20  his branch runs 
12ff0 69 66 20 69 74 20 69 73 20 6b 6e 6f 77 6e 20 61  if it is known a
13000 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 20 74  t compile time t
13010 68 61 74 20 74 68 65 20 52 48 53 0a 20 20 20 20  hat the RHS.    
13020 20 20 20 20 2a 2a 20 63 61 6e 6e 6f 74 20 63 6f      ** cannot co
13030 6e 74 61 69 6e 20 4e 55 4c 4c 20 76 61 6c 75 65  ntain NULL value
13040 73 2e 20 54 68 69 73 20 68 61 70 70 65 6e 73 20  s. This happens 
13050 61 73 20 74 68 65 20 72 65 73 75 6c 74 0a 20 20  as the result.  
13060 20 20 20 20 20 20 2a 2a 20 6f 66 20 61 20 22 4e        ** of a "N
13070 4f 54 20 4e 55 4c 4c 22 20 63 6f 6e 73 74 72 61  OT NULL" constra
13080 69 6e 74 20 69 6e 20 74 68 65 20 64 61 74 61 62  int in the datab
13090 61 73 65 20 73 63 68 65 6d 61 2e 0a 20 20 20 20  ase schema..    
130a0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
130b0 2a 20 41 6c 73 6f 20 72 75 6e 20 74 68 69 73 20  * Also run this 
130c0 62 72 61 6e 63 68 20 69 66 20 4e 55 4c 4c 20 69  branch if NULL i
130d0 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20  s equivalent to 
130e0 46 41 4c 53 45 0a 20 20 20 20 20 20 20 20 2a 2a  FALSE.        **
130f0 20 66 6f 72 20 74 68 69 73 20 70 61 72 74 69 63   for this partic
13100 75 6c 61 72 20 49 4e 20 6f 70 65 72 61 74 6f 72  ular IN operator
13110 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
13120 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
13130 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f  AddOp4Int(v, OP_
13140 4e 6f 74 46 6f 75 6e 64 2c 20 70 45 78 70 72 2d  NotFound, pExpr-
13150 3e 69 54 61 62 6c 65 2c 20 64 65 73 74 49 66 46  >iTable, destIfF
13160 61 6c 73 65 2c 20 72 31 2c 20 31 29 3b 0a 20 20  alse, r1, 1);.  
13170 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
13180 67 65 28 76 29 3b 0a 20 20 20 20 20 20 7d 65 6c  ge(v);.      }el
13190 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49  se{.        /* I
131a0 6e 20 74 68 69 73 20 62 72 61 6e 63 68 2c 20 74  n this branch, t
131b0 68 65 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e  he RHS of the IN
131c0 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 61   might contain a
131d0 20 4e 55 4c 4c 20 61 6e 64 0a 20 20 20 20 20 20   NULL and.      
131e0 20 20 2a 2a 20 74 68 65 20 70 72 65 73 65 6e 63    ** the presenc
131f0 65 20 6f 66 20 61 20 4e 55 4c 4c 20 6f 6e 20 74  e of a NULL on t
13200 68 65 20 52 48 53 20 6d 61 6b 65 73 20 61 20 64  he RHS makes a d
13210 69 66 66 65 72 65 6e 63 65 20 69 6e 20 74 68 65  ifference in the
13220 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 75 74 63  .        ** outc
13230 6f 6d 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ome..        */.
13240 20 20 20 20 20 20 20 20 69 6e 74 20 61 64 64 72          int addr
13250 31 3b 0a 20 20 0a 20 20 20 20 20 20 20 20 2f 2a  1;.  .        /*
13260 20 46 69 72 73 74 20 63 68 65 63 6b 20 74 6f 20   First check to 
13270 73 65 65 20 69 66 20 74 68 65 20 4c 48 53 20 69  see if the LHS i
13280 73 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74  s contained in t
13290 68 65 20 52 48 53 2e 20 20 49 66 20 73 6f 2c 0a  he RHS.  If so,.
132a0 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20          ** then 
132b0 74 68 65 20 61 6e 73 77 65 72 20 69 73 20 54 52  the answer is TR
132c0 55 45 20 74 68 65 20 70 72 65 73 65 6e 63 65 20  UE the presence 
132d0 6f 66 20 4e 55 4c 4c 73 20 69 6e 20 74 68 65 20  of NULLs in the 
132e0 52 48 53 20 64 6f 65 73 0a 20 20 20 20 20 20 20  RHS does.       
132f0 20 2a 2a 20 6e 6f 74 20 6d 61 74 74 65 72 2e 20   ** not matter. 
13300 20 49 66 20 74 68 65 20 4c 48 53 20 69 73 20 6e   If the LHS is n
13310 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20  ot contained in 
13320 74 68 65 20 52 48 53 2c 20 74 68 65 6e 20 74 68  the RHS, then th
13330 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 73  e.        ** ans
13340 77 65 72 20 69 73 20 4e 55 4c 4c 20 69 66 20 74  wer is NULL if t
13350 68 65 20 52 48 53 20 63 6f 6e 74 61 69 6e 73 20  he RHS contains 
13360 4e 55 4c 4c 73 20 61 6e 64 20 74 68 65 20 61 6e  NULLs and the an
13370 73 77 65 72 20 69 73 0a 20 20 20 20 20 20 20 20  swer is.        
13380 2a 2a 20 46 41 4c 53 45 20 69 66 20 74 68 65 20  ** FALSE if the 
13390 52 48 53 20 69 73 20 4e 55 4c 4c 2d 66 72 65 65  RHS is NULL-free
133a0 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
133b0 20 20 20 20 20 61 64 64 72 31 20 3d 20 73 71 6c       addr1 = sql
133c0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
133d0 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 70  t(v, OP_Found, p
133e0 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 30 2c  Expr->iTable, 0,
133f0 20 72 31 2c 20 31 29 3b 0a 20 20 20 20 20 20 20   r1, 1);.       
13400 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
13410 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
13420 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
13430 50 5f 49 73 4e 75 6c 6c 2c 20 72 52 68 73 48 61  P_IsNull, rRhsHa
13440 73 4e 75 6c 6c 2c 20 64 65 73 74 49 66 4e 75 6c  sNull, destIfNul
13450 6c 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  l);.        Vdbe
13460 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
13470 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
13480 47 6f 74 6f 28 76 2c 20 64 65 73 74 49 66 46 61  Goto(v, destIfFa
13490 6c 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71  lse);.        sq
134a0 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
134b0 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 20  e(v, addr1);.   
134c0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
134d0 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
134e0 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
134f0 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  1);.  sqlite3Exp
13500 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65  rCachePop(pParse
13510 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  );.  VdbeComment
13520 28 28 76 2c 20 22 65 6e 64 20 49 4e 20 65 78 70  ((v, "end IN exp
13530 72 22 29 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  r"));.}.#endif /
13540 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  * SQLITE_OMIT_SU
13550 42 51 55 45 52 59 20 2a 2f 0a 0a 23 69 66 6e 64  BQUERY */..#ifnd
13560 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ef SQLITE_OMIT_F
13570 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 2f 2a  LOATING_POINT./*
13580 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 6e 20  .** Generate an 
13590 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 61 74  instruction that
135a0 20 77 69 6c 6c 20 70 75 74 20 74 68 65 20 66 6c   will put the fl
135b0 6f 61 74 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20  oating point.** 
135c0 76 61 6c 75 65 20 64 65 73 63 72 69 62 65 64 20  value described 
135d0 62 79 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 69 6e 74  by z[0..n-1] int
135e0 6f 20 72 65 67 69 73 74 65 72 20 69 4d 65 6d 2e  o register iMem.
135f0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 5b 5d 20 73  .**.** The z[] s
13600 74 72 69 6e 67 20 77 69 6c 6c 20 70 72 6f 62 61  tring will proba
13610 62 6c 79 20 6e 6f 74 20 62 65 20 7a 65 72 6f 2d  bly not be zero-
13620 74 65 72 6d 69 6e 61 74 65 64 2e 20 20 42 75 74  terminated.  But
13630 20 74 68 65 20 0a 2a 2a 20 7a 5b 6e 5d 20 63 68   the .** z[n] ch
13640 61 72 61 63 74 65 72 20 69 73 20 67 75 61 72 61  aracter is guara
13650 6e 74 65 65 64 20 74 6f 20 62 65 20 73 6f 6d 65  nteed to be some
13660 74 68 69 6e 67 20 74 68 61 74 20 64 6f 65 73 20  thing that does 
13670 6e 6f 74 20 6c 6f 6f 6b 0a 2a 2a 20 6c 69 6b 65  not look.** like
13680 20 74 68 65 20 63 6f 6e 74 69 6e 75 61 74 69 6f   the continuatio
13690 6e 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 2e  n of the number.
136a0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
136b0 63 6f 64 65 52 65 61 6c 28 56 64 62 65 20 2a 76  codeReal(Vdbe *v
136c0 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c  , const char *z,
136d0 20 69 6e 74 20 6e 65 67 61 74 65 46 6c 61 67 2c   int negateFlag,
136e0 20 69 6e 74 20 69 4d 65 6d 29 7b 0a 20 20 69 66   int iMem){.  if
136f0 28 20 41 4c 57 41 59 53 28 7a 21 3d 30 29 20 29  ( ALWAYS(z!=0) )
13700 7b 0a 20 20 20 20 64 6f 75 62 6c 65 20 76 61 6c  {.    double val
13710 75 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 41  ue;.    sqlite3A
13720 74 6f 46 28 7a 2c 20 26 76 61 6c 75 65 2c 20 73  toF(z, &value, s
13730 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
13740 29 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3b  ), SQLITE_UTF8);
13750 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 73 71  .    assert( !sq
13760 6c 69 74 65 33 49 73 4e 61 4e 28 76 61 6c 75 65  lite3IsNaN(value
13770 29 20 29 3b 20 2f 2a 20 54 68 65 20 6e 65 77 20  ) ); /* The new 
13780 41 74 6f 46 20 6e 65 76 65 72 20 72 65 74 75 72  AtoF never retur
13790 6e 73 20 4e 61 4e 20 2a 2f 0a 20 20 20 20 69 66  ns NaN */.    if
137a0 28 20 6e 65 67 61 74 65 46 6c 61 67 20 29 20 76  ( negateFlag ) v
137b0 61 6c 75 65 20 3d 20 2d 76 61 6c 75 65 3b 0a 20  alue = -value;. 
137c0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
137d0 64 4f 70 34 44 75 70 38 28 76 2c 20 4f 50 5f 52  dOp4Dup8(v, OP_R
137e0 65 61 6c 2c 20 30 2c 20 69 4d 65 6d 2c 20 30 2c  eal, 0, iMem, 0,
137f0 20 28 75 38 2a 29 26 76 61 6c 75 65 2c 20 50 34   (u8*)&value, P4
13800 5f 52 45 41 4c 29 3b 0a 20 20 7d 0a 7d 0a 23 65  _REAL);.  }.}.#e
13810 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  ndif.../*.** Gen
13820 65 72 61 74 65 20 61 6e 20 69 6e 73 74 72 75 63  erate an instruc
13830 74 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20 70  tion that will p
13840 75 74 20 74 68 65 20 69 6e 74 65 67 65 72 20 64  ut the integer d
13850 65 73 63 72 69 62 65 20 62 79 0a 2a 2a 20 74 65  escribe by.** te
13860 78 74 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 69 6e 74  xt z[0..n-1] int
13870 6f 20 72 65 67 69 73 74 65 72 20 69 4d 65 6d 2e  o register iMem.
13880 0a 2a 2a 0a 2a 2a 20 45 78 70 72 2e 75 2e 7a 54  .**.** Expr.u.zT
13890 6f 6b 65 6e 20 69 73 20 61 6c 77 61 79 73 20 55  oken is always U
138a0 54 46 38 20 61 6e 64 20 7a 65 72 6f 2d 74 65 72  TF8 and zero-ter
138b0 6d 69 6e 61 74 65 64 2e 0a 2a 2f 0a 73 74 61 74  minated..*/.stat
138c0 69 63 20 76 6f 69 64 20 63 6f 64 65 49 6e 74 65  ic void codeInte
138d0 67 65 72 28 50 61 72 73 65 20 2a 70 50 61 72 73  ger(Parse *pPars
138e0 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  e, Expr *pExpr, 
138f0 69 6e 74 20 6e 65 67 46 6c 61 67 2c 20 69 6e 74  int negFlag, int
13900 20 69 4d 65 6d 29 7b 0a 20 20 56 64 62 65 20 2a   iMem){.  Vdbe *
13910 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
13920 65 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  e;.  if( pExpr->
13930 66 6c 61 67 73 20 26 20 45 50 5f 49 6e 74 56 61  flags & EP_IntVa
13940 6c 75 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  lue ){.    int i
13950 20 3d 20 70 45 78 70 72 2d 3e 75 2e 69 56 61 6c   = pExpr->u.iVal
13960 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ue;.    assert( 
13970 69 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  i>=0 );.    if( 
13980 6e 65 67 46 6c 61 67 20 29 20 69 20 3d 20 2d 69  negFlag ) i = -i
13990 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
139a0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
139b0 74 65 67 65 72 2c 20 69 2c 20 69 4d 65 6d 29 3b  teger, i, iMem);
139c0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
139d0 74 20 63 3b 0a 20 20 20 20 69 36 34 20 76 61 6c  t c;.    i64 val
139e0 75 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  ue;.    const ch
139f0 61 72 20 2a 7a 20 3d 20 70 45 78 70 72 2d 3e 75  ar *z = pExpr->u
13a00 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 61 73 73  .zToken;.    ass
13a10 65 72 74 28 20 7a 21 3d 30 20 29 3b 0a 20 20 20  ert( z!=0 );.   
13a20 20 63 20 3d 20 73 71 6c 69 74 65 33 44 65 63 4f   c = sqlite3DecO
13a30 72 48 65 78 54 6f 49 36 34 28 7a 2c 20 26 76 61  rHexToI64(z, &va
13a40 6c 75 65 29 3b 0a 20 20 20 20 69 66 28 20 63 3d  lue);.    if( c=
13a50 3d 30 20 7c 7c 20 28 63 3d 3d 32 20 26 26 20 6e  =0 || (c==2 && n
13a60 65 67 46 6c 61 67 29 20 29 7b 0a 20 20 20 20 20  egFlag) ){.     
13a70 20 69 66 28 20 6e 65 67 46 6c 61 67 20 29 7b 20   if( negFlag ){ 
13a80 76 61 6c 75 65 20 3d 20 63 3d 3d 32 20 3f 20 53  value = c==2 ? S
13a90 4d 41 4c 4c 45 53 54 5f 49 4e 54 36 34 20 3a 20  MALLEST_INT64 : 
13aa0 2d 76 61 6c 75 65 3b 20 7d 0a 20 20 20 20 20 20  -value; }.      
13ab0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
13ac0 34 44 75 70 38 28 76 2c 20 4f 50 5f 49 6e 74 36  4Dup8(v, OP_Int6
13ad0 34 2c 20 30 2c 20 69 4d 65 6d 2c 20 30 2c 20 28  4, 0, iMem, 0, (
13ae0 75 38 2a 29 26 76 61 6c 75 65 2c 20 50 34 5f 49  u8*)&value, P4_I
13af0 4e 54 36 34 29 3b 0a 20 20 20 20 7d 65 6c 73 65  NT64);.    }else
13b00 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
13b10 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f  OMIT_FLOATING_PO
13b20 49 4e 54 0a 20 20 20 20 20 20 73 71 6c 69 74 65  INT.      sqlite
13b30 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
13b40 2c 20 22 6f 76 65 72 73 69 7a 65 64 20 69 6e 74  , "oversized int
13b50 65 67 65 72 3a 20 25 73 25 73 22 2c 20 6e 65 67  eger: %s%s", neg
13b60 46 6c 61 67 20 3f 20 22 2d 22 20 3a 20 22 22 2c  Flag ? "-" : "",
13b70 20 7a 29 3b 0a 23 65 6c 73 65 0a 23 69 66 6e 64   z);.#else.#ifnd
13b80 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 48  ef SQLITE_OMIT_H
13b90 45 58 5f 49 4e 54 45 47 45 52 0a 20 20 20 20 20  EX_INTEGER.     
13ba0 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72   if( sqlite3_str
13bb0 6e 69 63 6d 70 28 7a 2c 22 30 78 22 2c 32 29 3d  nicmp(z,"0x",2)=
13bc0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
13bd0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
13be0 61 72 73 65 2c 20 22 68 65 78 20 6c 69 74 65 72  arse, "hex liter
13bf0 61 6c 20 74 6f 6f 20 62 69 67 3a 20 25 73 22 2c  al too big: %s",
13c00 20 7a 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   z);.      }else
13c10 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7b 0a  .#endif.      {.
13c20 20 20 20 20 20 20 20 20 63 6f 64 65 52 65 61 6c          codeReal
13c30 28 76 2c 20 7a 2c 20 6e 65 67 46 6c 61 67 2c 20  (v, z, negFlag, 
13c40 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 23  iMem);.      }.#
13c50 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a  endif.    }.  }.
13c60 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 61  }../*.** Clear a
13c70 20 63 61 63 68 65 20 65 6e 74 72 79 2e 0a 2a 2f   cache entry..*/
13c80 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 61 63  .static void cac
13c90 68 65 45 6e 74 72 79 43 6c 65 61 72 28 50 61 72  heEntryClear(Par
13ca0 73 65 20 2a 70 50 61 72 73 65 2c 20 73 74 72 75  se *pParse, stru
13cb0 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 29  ct yColCache *p)
13cc0 7b 0a 20 20 69 66 28 20 70 2d 3e 74 65 6d 70 52  {.  if( p->tempR
13cd0 65 67 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50  eg ){.    if( pP
13ce0 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 3c 41  arse->nTempReg<A
13cf0 72 72 61 79 53 69 7a 65 28 70 50 61 72 73 65 2d  rraySize(pParse-
13d00 3e 61 54 65 6d 70 52 65 67 29 20 29 7b 0a 20 20  >aTempReg) ){.  
13d10 20 20 20 20 70 50 61 72 73 65 2d 3e 61 54 65 6d      pParse->aTem
13d20 70 52 65 67 5b 70 50 61 72 73 65 2d 3e 6e 54 65  pReg[pParse->nTe
13d30 6d 70 52 65 67 2b 2b 5d 20 3d 20 70 2d 3e 69 52  mpReg++] = p->iR
13d40 65 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d  eg;.    }.    p-
13d50 3e 74 65 6d 70 52 65 67 20 3d 20 30 3b 0a 20 20  >tempReg = 0;.  
13d60 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f  }.}.../*.** Reco
13d70 72 64 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e  rd in the column
13d80 20 63 61 63 68 65 20 74 68 61 74 20 61 20 70 61   cache that a pa
13d90 72 74 69 63 75 6c 61 72 20 63 6f 6c 75 6d 6e 20  rticular column 
13da0 66 72 6f 6d 20 61 0a 2a 2a 20 70 61 72 74 69 63  from a.** partic
13db0 75 6c 61 72 20 74 61 62 6c 65 20 69 73 20 73 74  ular table is st
13dc0 6f 72 65 64 20 69 6e 20 61 20 70 61 72 74 69 63  ored in a partic
13dd0 75 6c 61 72 20 72 65 67 69 73 74 65 72 2e 0a 2a  ular register..*
13de0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
13df0 70 72 43 61 63 68 65 53 74 6f 72 65 28 50 61 72  prCacheStore(Par
13e00 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
13e10 69 54 61 62 2c 20 69 6e 74 20 69 43 6f 6c 2c 20  iTab, int iCol, 
13e20 69 6e 74 20 69 52 65 67 29 7b 0a 20 20 69 6e 74  int iReg){.  int
13e30 20 69 3b 0a 20 20 69 6e 74 20 6d 69 6e 4c 72 75   i;.  int minLru
13e40 3b 0a 20 20 69 6e 74 20 69 64 78 4c 72 75 3b 0a  ;.  int idxLru;.
13e50 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63    struct yColCac
13e60 68 65 20 2a 70 3b 0a 0a 20 20 2f 2a 20 55 6e 6c  he *p;..  /* Unl
13e70 65 73 73 20 61 6e 20 65 72 72 6f 72 20 68 61 73  ess an error has
13e80 20 6f 63 63 75 72 72 65 64 2c 20 72 65 67 69 73   occurred, regis
13e90 74 65 72 20 6e 75 6d 62 65 72 73 20 61 72 65 20  ter numbers are 
13ea0 61 6c 77 61 79 73 20 70 6f 73 69 74 69 76 65 2e  always positive.
13eb0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 52   */.  assert( iR
13ec0 65 67 3e 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e  eg>0 || pParse->
13ed0 6e 45 72 72 20 7c 7c 20 70 50 61 72 73 65 2d 3e  nErr || pParse->
13ee0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
13ef0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 43   );.  assert( iC
13f00 6f 6c 3e 3d 2d 31 20 26 26 20 69 43 6f 6c 3c 33  ol>=-1 && iCol<3
13f10 32 37 36 38 20 29 3b 20 20 2f 2a 20 46 69 6e 69  2768 );  /* Fini
13f20 74 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72  te column number
13f30 73 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 53  s */..  /* The S
13f40 51 4c 49 54 45 5f 43 6f 6c 75 6d 6e 43 61 63 68  QLITE_ColumnCach
13f50 65 20 66 6c 61 67 20 64 69 73 61 62 6c 65 73 20  e flag disables 
13f60 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65  the column cache
13f70 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64 0a  .  This is used.
13f80 20 20 2a 2a 20 66 6f 72 20 74 65 73 74 69 6e 67    ** for testing
13f90 20 6f 6e 6c 79 20 2d 20 74 6f 20 76 65 72 69 66   only - to verif
13fa0 79 20 74 68 61 74 20 53 51 4c 69 74 65 20 61 6c  y that SQLite al
13fb0 77 61 79 73 20 67 65 74 73 20 74 68 65 20 73 61  ways gets the sa
13fc0 6d 65 20 61 6e 73 77 65 72 0a 20 20 2a 2a 20 77  me answer.  ** w
13fd0 69 74 68 20 61 6e 64 20 77 69 74 68 6f 75 74 20  ith and without 
13fe0 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65  the column cache
13ff0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4f 70 74  ..  */.  if( Opt
14000 69 6d 69 7a 61 74 69 6f 6e 44 69 73 61 62 6c 65  imizationDisable
14010 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 53 51  d(pParse->db, SQ
14020 4c 49 54 45 5f 43 6f 6c 75 6d 6e 43 61 63 68 65  LITE_ColumnCache
14030 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f  ) ) return;..  /
14040 2a 20 46 69 72 73 74 20 72 65 70 6c 61 63 65 20  * First replace 
14050 61 6e 79 20 65 78 69 73 74 69 6e 67 20 65 6e 74  any existing ent
14060 72 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 63  ry..  **.  ** Ac
14070 74 75 61 6c 6c 79 2c 20 74 68 65 20 77 61 79 20  tually, the way 
14080 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65  the column cache
14090 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 75 73   is currently us
140a0 65 64 2c 20 77 65 20 61 72 65 20 67 75 61 72 61  ed, we are guara
140b0 6e 74 65 65 64 0a 20 20 2a 2a 20 74 68 61 74 20  nteed.  ** that 
140c0 74 68 65 20 6f 62 6a 65 63 74 20 77 69 6c 6c 20  the object will 
140d0 6e 65 76 65 72 20 61 6c 72 65 61 64 79 20 62 65  never already be
140e0 20 69 6e 20 63 61 63 68 65 2e 20 20 56 65 72 69   in cache.  Veri
140f0 66 79 20 74 68 69 73 20 67 75 61 72 61 6e 74 65  fy this guarante
14100 65 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20  e..  */.#ifndef 
14110 4e 44 45 42 55 47 0a 20 20 66 6f 72 28 69 3d 30  NDEBUG.  for(i=0
14120 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c  , p=pParse->aCol
14130 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f  Cache; i<SQLITE_
14140 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c  N_COLCACHE; i++,
14150 20 70 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72   p++){.    asser
14160 74 28 20 70 2d 3e 69 52 65 67 3d 3d 30 20 7c 7c  t( p->iReg==0 ||
14170 20 70 2d 3e 69 54 61 62 6c 65 21 3d 69 54 61 62   p->iTable!=iTab
14180 20 7c 7c 20 70 2d 3e 69 43 6f 6c 75 6d 6e 21 3d   || p->iColumn!=
14190 69 43 6f 6c 20 29 3b 0a 20 20 7d 0a 23 65 6e 64  iCol );.  }.#end
141a0 69 66 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 61 6e  if..  /* Find an
141b0 20 65 6d 70 74 79 20 73 6c 6f 74 20 61 6e 64 20   empty slot and 
141c0 72 65 70 6c 61 63 65 20 69 74 20 2a 2f 0a 20 20  replace it */.  
141d0 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73  for(i=0, p=pPars
141e0 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c  e->aColCache; i<
141f0 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48  SQLITE_N_COLCACH
14200 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20  E; i++, p++){.  
14210 20 20 69 66 28 20 70 2d 3e 69 52 65 67 3d 3d 30    if( p->iReg==0
14220 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69 4c 65   ){.      p->iLe
14230 76 65 6c 20 3d 20 70 50 61 72 73 65 2d 3e 69 43  vel = pParse->iC
14240 61 63 68 65 4c 65 76 65 6c 3b 0a 20 20 20 20 20  acheLevel;.     
14250 20 70 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54 61   p->iTable = iTa
14260 62 3b 0a 20 20 20 20 20 20 70 2d 3e 69 43 6f 6c  b;.      p->iCol
14270 75 6d 6e 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20  umn = iCol;.    
14280 20 20 70 2d 3e 69 52 65 67 20 3d 20 69 52 65 67    p->iReg = iReg
14290 3b 0a 20 20 20 20 20 20 70 2d 3e 74 65 6d 70 52  ;.      p->tempR
142a0 65 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d  eg = 0;.      p-
142b0 3e 6c 72 75 20 3d 20 70 50 61 72 73 65 2d 3e 69  >lru = pParse->i
142c0 43 61 63 68 65 43 6e 74 2b 2b 3b 0a 20 20 20 20  CacheCnt++;.    
142d0 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
142e0 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 70 6c 61 63    }..  /* Replac
142f0 65 20 74 68 65 20 6c 61 73 74 20 72 65 63 65 6e  e the last recen
14300 74 6c 79 20 75 73 65 64 20 2a 2f 0a 20 20 6d 69  tly used */.  mi
14310 6e 4c 72 75 20 3d 20 30 78 37 66 66 66 66 66 66  nLru = 0x7ffffff
14320 66 3b 0a 20 20 69 64 78 4c 72 75 20 3d 20 2d 31  f;.  idxLru = -1
14330 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70  ;.  for(i=0, p=p
14340 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65  Parse->aColCache
14350 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c  ; i<SQLITE_N_COL
14360 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29  CACHE; i++, p++)
14370 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6c 72 75  {.    if( p->lru
14380 3c 6d 69 6e 4c 72 75 20 29 7b 0a 20 20 20 20 20  <minLru ){.     
14390 20 69 64 78 4c 72 75 20 3d 20 69 3b 0a 20 20 20   idxLru = i;.   
143a0 20 20 20 6d 69 6e 4c 72 75 20 3d 20 70 2d 3e 6c     minLru = p->l
143b0 72 75 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ru;.    }.  }.  
143c0 69 66 28 20 41 4c 57 41 59 53 28 69 64 78 4c 72  if( ALWAYS(idxLr
143d0 75 3e 3d 30 29 20 29 7b 0a 20 20 20 20 70 20 3d  u>=0) ){.    p =
143e0 20 26 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61   &pParse->aColCa
143f0 63 68 65 5b 69 64 78 4c 72 75 5d 3b 0a 20 20 20  che[idxLru];.   
14400 20 70 2d 3e 69 4c 65 76 65 6c 20 3d 20 70 50 61   p->iLevel = pPa
14410 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c  rse->iCacheLevel
14420 3b 0a 20 20 20 20 70 2d 3e 69 54 61 62 6c 65 20  ;.    p->iTable 
14430 3d 20 69 54 61 62 3b 0a 20 20 20 20 70 2d 3e 69  = iTab;.    p->i
14440 43 6f 6c 75 6d 6e 20 3d 20 69 43 6f 6c 3b 0a 20  Column = iCol;. 
14450 20 20 20 70 2d 3e 69 52 65 67 20 3d 20 69 52 65     p->iReg = iRe
14460 67 3b 0a 20 20 20 20 70 2d 3e 74 65 6d 70 52 65  g;.    p->tempRe
14470 67 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 6c 72  g = 0;.    p->lr
14480 75 20 3d 20 70 50 61 72 73 65 2d 3e 69 43 61 63  u = pParse->iCac
14490 68 65 43 6e 74 2b 2b 3b 0a 20 20 20 20 72 65 74  heCnt++;.    ret
144a0 75 72 6e 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  urn;.  }.}../*.*
144b0 2a 20 49 6e 64 69 63 61 74 65 20 74 68 61 74 20  * Indicate that 
144c0 72 65 67 69 73 74 65 72 73 20 62 65 74 77 65 65  registers betwee
144d0 6e 20 69 52 65 67 2e 2e 69 52 65 67 2b 6e 52 65  n iReg..iReg+nRe
144e0 67 2d 31 20 61 72 65 20 62 65 69 6e 67 20 6f 76  g-1 are being ov
144f0 65 72 77 72 69 74 74 65 6e 2e 0a 2a 2a 20 50 75  erwritten..** Pu
14500 72 67 65 20 74 68 65 20 72 61 6e 67 65 20 6f 66  rge the range of
14510 20 72 65 67 69 73 74 65 72 73 20 66 72 6f 6d 20   registers from 
14520 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65  the column cache
14530 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
14540 33 45 78 70 72 43 61 63 68 65 52 65 6d 6f 76 65  3ExprCacheRemove
14550 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
14560 69 6e 74 20 69 52 65 67 2c 20 69 6e 74 20 6e 52  int iReg, int nR
14570 65 67 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  eg){.  int i;.  
14580 69 6e 74 20 69 4c 61 73 74 20 3d 20 69 52 65 67  int iLast = iReg
14590 20 2b 20 6e 52 65 67 20 2d 20 31 3b 0a 20 20 73   + nReg - 1;.  s
145a0 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20  truct yColCache 
145b0 2a 70 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70  *p;.  for(i=0, p
145c0 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63  =pParse->aColCac
145d0 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43  he; i<SQLITE_N_C
145e0 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b  OLCACHE; i++, p+
145f0 2b 29 7b 0a 20 20 20 20 69 6e 74 20 72 20 3d 20  +){.    int r = 
14600 70 2d 3e 69 52 65 67 3b 0a 20 20 20 20 69 66 28  p->iReg;.    if(
14610 20 72 3e 3d 69 52 65 67 20 26 26 20 72 3c 3d 69   r>=iReg && r<=i
14620 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20 63 61  Last ){.      ca
14630 63 68 65 45 6e 74 72 79 43 6c 65 61 72 28 70 50  cheEntryClear(pP
14640 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 20 20  arse, p);.      
14650 70 2d 3e 69 52 65 67 20 3d 20 30 3b 0a 20 20 20  p->iReg = 0;.   
14660 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
14670 52 65 6d 65 6d 62 65 72 20 74 68 65 20 63 75 72  Remember the cur
14680 72 65 6e 74 20 63 6f 6c 75 6d 6e 20 63 61 63 68  rent column cach
14690 65 20 63 6f 6e 74 65 78 74 2e 20 20 41 6e 79 20  e context.  Any 
146a0 6e 65 77 20 65 6e 74 72 69 65 73 20 61 64 64 65  new entries adde
146b0 64 0a 2a 2a 20 61 64 64 65 64 20 74 6f 20 74 68  d.** added to th
146c0 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 61  e column cache a
146d0 66 74 65 72 20 74 68 69 73 20 63 61 6c 6c 20 61  fter this call a
146e0 72 65 20 72 65 6d 6f 76 65 64 20 77 68 65 6e 20  re removed when 
146f0 74 68 65 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e  the.** correspon
14700 64 69 6e 67 20 70 6f 70 20 6f 63 63 75 72 73 2e  ding pop occurs.
14710 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
14720 45 78 70 72 43 61 63 68 65 50 75 73 68 28 50 61  ExprCachePush(Pa
14730 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
14740 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65  pParse->iCacheLe
14750 76 65 6c 2b 2b 3b 0a 23 69 66 64 65 66 20 53 51  vel++;.#ifdef SQ
14760 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69 66 28  LITE_DEBUG.  if(
14770 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61   pParse->db->fla
14780 67 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65  gs & SQLITE_Vdbe
14790 41 64 64 6f 70 54 72 61 63 65 20 29 7b 0a 20 20  AddopTrace ){.  
147a0 20 20 70 72 69 6e 74 66 28 22 50 55 53 48 20 74    printf("PUSH t
147b0 6f 20 25 64 5c 6e 22 2c 20 70 50 61 72 73 65 2d  o %d\n", pParse-
147c0 3e 69 43 61 63 68 65 4c 65 76 65 6c 29 3b 0a 20  >iCacheLevel);. 
147d0 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a   }.#endif.}../*.
147e0 2a 2a 20 52 65 6d 6f 76 65 20 66 72 6f 6d 20 74  ** Remove from t
147f0 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20  he column cache 
14800 61 6e 79 20 65 6e 74 72 69 65 73 20 74 68 61 74  any entries that
14810 20 77 65 72 65 20 61 64 64 65 64 20 73 69 6e 63   were added sinc
14820 65 20 74 68 65 0a 2a 2a 20 74 68 65 20 70 72 65  e the.** the pre
14830 76 69 6f 75 73 20 73 71 6c 69 74 65 33 45 78 70  vious sqlite3Exp
14840 72 43 61 63 68 65 50 75 73 68 20 6f 70 65 72 61  rCachePush opera
14850 74 69 6f 6e 2e 20 20 49 6e 20 6f 74 68 65 72 20  tion.  In other 
14860 77 6f 72 64 73 2c 20 72 65 73 74 6f 72 65 0a 2a  words, restore.*
14870 2a 20 74 68 65 20 63 61 63 68 65 20 74 6f 20 74  * the cache to t
14880 68 65 20 73 74 61 74 65 20 69 74 20 77 61 73 20  he state it was 
14890 69 6e 20 70 72 69 6f 72 20 74 68 65 20 6d 6f 73  in prior the mos
148a0 74 20 72 65 63 65 6e 74 20 50 75 73 68 2e 0a 2a  t recent Push..*
148b0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
148c0 70 72 43 61 63 68 65 50 6f 70 28 50 61 72 73 65  prCachePop(Parse
148d0 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 69 6e 74   *pParse){.  int
148e0 20 69 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f   i;.  struct yCo
148f0 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20 61 73 73  lCache *p;.  ass
14900 65 72 74 28 20 70 50 61 72 73 65 2d 3e 69 43 61  ert( pParse->iCa
14910 63 68 65 4c 65 76 65 6c 3e 3d 31 20 29 3b 0a 20  cheLevel>=1 );. 
14920 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c   pParse->iCacheL
14930 65 76 65 6c 2d 2d 3b 0a 23 69 66 64 65 66 20 53  evel--;.#ifdef S
14940 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69 66  QLITE_DEBUG.  if
14950 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c  ( pParse->db->fl
14960 61 67 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62  ags & SQLITE_Vdb
14970 65 41 64 64 6f 70 54 72 61 63 65 20 29 7b 0a 20  eAddopTrace ){. 
14980 20 20 20 70 72 69 6e 74 66 28 22 50 4f 50 20 20     printf("POP  
14990 74 6f 20 25 64 5c 6e 22 2c 20 70 50 61 72 73 65  to %d\n", pParse
149a0 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 29 3b 0a  ->iCacheLevel);.
149b0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 66 6f 72    }.#endif.  for
149c0 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e  (i=0, p=pParse->
149d0 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c  aColCache; i<SQL
149e0 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20  ITE_N_COLCACHE; 
149f0 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69  i++, p++){.    i
14a00 66 28 20 70 2d 3e 69 52 65 67 20 26 26 20 70 2d  f( p->iReg && p-
14a10 3e 69 4c 65 76 65 6c 3e 70 50 61 72 73 65 2d 3e  >iLevel>pParse->
14a20 69 43 61 63 68 65 4c 65 76 65 6c 20 29 7b 0a 20  iCacheLevel ){. 
14a30 20 20 20 20 20 63 61 63 68 65 45 6e 74 72 79 43       cacheEntryC
14a40 6c 65 61 72 28 70 50 61 72 73 65 2c 20 70 29 3b  lear(pParse, p);
14a50 0a 20 20 20 20 20 20 70 2d 3e 69 52 65 67 20 3d  .      p->iReg =
14a60 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a   0;.    }.  }.}.
14a70 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 61 20 63 61  ./*.** When a ca
14a80 63 68 65 64 20 63 6f 6c 75 6d 6e 20 69 73 20 72  ched column is r
14a90 65 75 73 65 64 2c 20 6d 61 6b 65 20 73 75 72 65  eused, make sure
14aa0 20 74 68 61 74 20 69 74 73 20 72 65 67 69 73 74   that its regist
14ab0 65 72 20 69 73 0a 2a 2a 20 6e 6f 20 6c 6f 6e 67  er is.** no long
14ac0 65 72 20 61 76 61 69 6c 61 62 6c 65 20 61 73 20  er available as 
14ad0 61 20 74 65 6d 70 20 72 65 67 69 73 74 65 72 2e  a temp register.
14ae0 20 20 74 69 63 6b 65 74 20 23 33 38 37 39 3a 20    ticket #3879: 
14af0 20 74 68 61 74 20 73 61 6d 65 0a 2a 2a 20 72 65   that same.** re
14b00 67 69 73 74 65 72 20 6d 69 67 68 74 20 62 65 20  gister might be 
14b10 69 6e 20 74 68 65 20 63 61 63 68 65 20 69 6e 20  in the cache in 
14b20 6d 75 6c 74 69 70 6c 65 20 70 6c 61 63 65 73 2c  multiple places,
14b30 20 73 6f 20 62 65 20 73 75 72 65 20 74 6f 0a 2a   so be sure to.*
14b40 2a 20 67 65 74 20 74 68 65 6d 20 61 6c 6c 2e 0a  * get them all..
14b50 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
14b60 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
14b70 69 6e 52 65 67 69 73 74 65 72 28 50 61 72 73 65  inRegister(Parse
14b80 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 52   *pParse, int iR
14b90 65 67 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  eg){.  int i;.  
14ba0 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65  struct yColCache
14bb0 20 2a 70 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20   *p;.  for(i=0, 
14bc0 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61  p=pParse->aColCa
14bd0 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f  che; i<SQLITE_N_
14be0 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70  COLCACHE; i++, p
14bf0 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  ++){.    if( p->
14c00 69 52 65 67 3d 3d 69 52 65 67 20 29 7b 0a 20 20  iReg==iReg ){.  
14c10 20 20 20 20 70 2d 3e 74 65 6d 70 52 65 67 20 3d      p->tempReg =
14c20 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a   0;.    }.  }.}.
14c30 0a 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  ./* Generate cod
14c40 65 20 74 68 61 74 20 77 69 6c 6c 20 6c 6f 61 64  e that will load
14c50 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20 72   into register r
14c60 65 67 4f 75 74 20 61 20 76 61 6c 75 65 20 74 68  egOut a value th
14c70 61 74 20 69 73 0a 2a 2a 20 61 70 70 72 6f 70 72  at is.** appropr
14c80 69 61 74 65 20 66 6f 72 20 74 68 65 20 69 49 64  iate for the iId
14c90 78 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f  xCol-th column o
14ca0 66 20 69 6e 64 65 78 20 70 49 64 78 2e 0a 2a 2f  f index pIdx..*/
14cb0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
14cc0 72 43 6f 64 65 4c 6f 61 64 49 6e 64 65 78 43 6f  rCodeLoadIndexCo
14cd0 6c 75 6d 6e 28 0a 20 20 50 61 72 73 65 20 2a 70  lumn(.  Parse *p
14ce0 50 61 72 73 65 2c 20 20 2f 2a 20 54 68 65 20 70  Parse,  /* The p
14cf0 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
14d00 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 2c  /.  Index *pIdx,
14d10 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78      /* The index
14d20 20 77 68 6f 73 65 20 63 6f 6c 75 6d 6e 20 69 73   whose column is
14d30 20 74 6f 20 62 65 20 6c 6f 61 64 65 64 20 2a 2f   to be loaded */
14d40 0a 20 20 69 6e 74 20 69 54 61 62 43 75 72 2c 20  .  int iTabCur, 
14d50 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69     /* Cursor poi
14d60 6e 74 69 6e 67 20 74 6f 20 61 20 74 61 62 6c 65  nting to a table
14d70 20 72 6f 77 20 2a 2f 0a 20 20 69 6e 74 20 69 49   row */.  int iI
14d80 64 78 43 6f 6c 2c 20 20 20 20 2f 2a 20 54 68 65  dxCol,    /* The
14d90 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69   column of the i
14da0 6e 64 65 78 20 74 6f 20 62 65 20 6c 6f 61 64 65  ndex to be loade
14db0 64 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75  d */.  int regOu
14dc0 74 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20  t      /* Store 
14dd0 74 68 65 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e  the index column
14de0 20 76 61 6c 75 65 20 69 6e 20 74 68 69 73 20 72   value in this r
14df0 65 67 69 73 74 65 72 20 2a 2f 0a 29 7b 0a 20 20  egister */.){.  
14e00 69 31 36 20 69 54 61 62 43 6f 6c 20 3d 20 70 49  i16 iTabCol = pI
14e10 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 49 64  dx->aiColumn[iId
14e20 78 43 6f 6c 5d 3b 0a 20 20 69 66 28 20 69 54 61  xCol];.  if( iTa
14e30 62 43 6f 6c 3d 3d 58 4e 5f 45 58 50 52 20 29 7b  bCol==XN_EXPR ){
14e40 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64  .    assert( pId
14e50 78 2d 3e 61 43 6f 6c 45 78 70 72 20 29 3b 0a 20  x->aColExpr );. 
14e60 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d     assert( pIdx-
14e70 3e 61 43 6f 6c 45 78 70 72 2d 3e 6e 45 78 70 72  >aColExpr->nExpr
14e80 3e 69 49 64 78 43 6f 6c 20 29 3b 0a 20 20 20 20  >iIdxCol );.    
14e90 70 50 61 72 73 65 2d 3e 69 53 65 6c 66 54 61 62  pParse->iSelfTab
14ea0 20 3d 20 69 54 61 62 43 75 72 3b 0a 20 20 20 20   = iTabCur;.    
14eb0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 43  sqlite3ExprCodeC
14ec0 6f 70 79 28 70 50 61 72 73 65 2c 20 70 49 64 78  opy(pParse, pIdx
14ed0 2d 3e 61 43 6f 6c 45 78 70 72 2d 3e 61 5b 69 49  ->aColExpr->a[iI
14ee0 64 78 43 6f 6c 5d 2e 70 45 78 70 72 2c 20 72 65  dxCol].pExpr, re
14ef0 67 4f 75 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  gOut);.  }else{.
14f00 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
14f10 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 4f 66 54 61  odeGetColumnOfTa
14f20 62 6c 65 28 70 50 61 72 73 65 2d 3e 70 56 64 62  ble(pParse->pVdb
14f30 65 2c 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2c  e, pIdx->pTable,
14f40 20 69 54 61 62 43 75 72 2c 0a 20 20 20 20 20 20   iTabCur,.      
14f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 54                iT
14f70 61 62 43 6f 6c 2c 20 72 65 67 4f 75 74 29 3b 0a  abCol, regOut);.
14f80 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e    }.}../*.** Gen
14f90 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 65 78  erate code to ex
14fa0 74 72 61 63 74 20 74 68 65 20 76 61 6c 75 65 20  tract the value 
14fb0 6f 66 20 74 68 65 20 69 43 6f 6c 2d 74 68 20 63  of the iCol-th c
14fc0 6f 6c 75 6d 6e 20 6f 66 20 61 20 74 61 62 6c 65  olumn of a table
14fd0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
14fe0 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75  3ExprCodeGetColu
14ff0 6d 6e 4f 66 54 61 62 6c 65 28 0a 20 20 56 64 62  mnOfTable(.  Vdb
15000 65 20 2a 76 2c 20 20 20 20 20 20 20 20 2f 2a 20  e *v,        /* 
15010 54 68 65 20 56 44 42 45 20 75 6e 64 65 72 20 63  The VDBE under c
15020 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20  onstruction */. 
15030 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20   Table *pTab,   
15040 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 63 6f   /* The table co
15050 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 76 61 6c  ntaining the val
15060 75 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  ue */.  int iTab
15070 43 75 72 2c 20 20 20 20 2f 2a 20 54 68 65 20 74  Cur,    /* The t
15080 61 62 6c 65 20 63 75 72 73 6f 72 2e 20 20 4f 72  able cursor.  Or
15090 20 74 68 65 20 50 4b 20 63 75 72 73 6f 72 20 66   the PK cursor f
150a0 6f 72 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44  or WITHOUT ROWID
150b0 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 20   */.  int iCol, 
150c0 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
150d0 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74 6f 20  f the column to 
150e0 65 78 74 72 61 63 74 20 2a 2f 0a 20 20 69 6e 74  extract */.  int
150f0 20 72 65 67 4f 75 74 20 20 20 20 20 20 2f 2a 20   regOut      /* 
15100 45 78 74 72 61 63 74 20 74 68 65 20 76 61 6c 75  Extract the valu
15110 65 20 69 6e 74 6f 20 74 68 69 73 20 72 65 67 69  e into this regi
15120 73 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 66 28  ster */.){.  if(
15130 20 69 43 6f 6c 3c 30 20 7c 7c 20 69 43 6f 6c 3d   iCol<0 || iCol=
15140 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20 29 7b 0a  =pTab->iPKey ){.
15150 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
15160 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 69  ddOp2(v, OP_Rowi
15170 64 2c 20 69 54 61 62 43 75 72 2c 20 72 65 67 4f  d, iTabCur, regO
15180 75 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ut);.  }else{.  
15190 20 20 69 6e 74 20 6f 70 20 3d 20 49 73 56 69 72    int op = IsVir
151a0 74 75 61 6c 28 70 54 61 62 29 20 3f 20 4f 50 5f  tual(pTab) ? OP_
151b0 56 43 6f 6c 75 6d 6e 20 3a 20 4f 50 5f 43 6f 6c  VColumn : OP_Col
151c0 75 6d 6e 3b 0a 20 20 20 20 69 6e 74 20 78 20 3d  umn;.    int x =
151d0 20 69 43 6f 6c 3b 0a 20 20 20 20 69 66 28 20 21   iCol;.    if( !
151e0 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 29  HasRowid(pTab) )
151f0 7b 0a 20 20 20 20 20 20 78 20 3d 20 73 71 6c 69  {.      x = sqli
15200 74 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78  te3ColumnOfIndex
15210 28 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b  (sqlite3PrimaryK
15220 65 79 49 6e 64 65 78 28 70 54 61 62 29 2c 20 69  eyIndex(pTab), i
15230 43 6f 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Col);.    }.    
15240 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15250 33 28 76 2c 20 6f 70 2c 20 69 54 61 62 43 75 72  3(v, op, iTabCur
15260 2c 20 78 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20  , x, regOut);.  
15270 7d 0a 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20  }.  if( iCol>=0 
15280 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f  ){.    sqlite3Co
15290 6c 75 6d 6e 44 65 66 61 75 6c 74 28 76 2c 20 70  lumnDefault(v, p
152a0 54 61 62 2c 20 69 43 6f 6c 2c 20 72 65 67 4f 75  Tab, iCol, regOu
152b0 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  t);.  }.}../*.**
152c0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
152d0 68 61 74 20 77 69 6c 6c 20 65 78 74 72 61 63 74  hat will extract
152e0 20 74 68 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 20   the iColumn-th 
152f0 63 6f 6c 75 6d 6e 20 66 72 6f 6d 0a 2a 2a 20 74  column from.** t
15300 61 62 6c 65 20 70 54 61 62 20 61 6e 64 20 73 74  able pTab and st
15310 6f 72 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 76  ore the column v
15320 61 6c 75 65 20 69 6e 20 61 20 72 65 67 69 73 74  alue in a regist
15330 65 72 2e 20 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 66  er. .**.** An ef
15340 66 6f 72 74 20 69 73 20 6d 61 64 65 20 74 6f 20  fort is made to 
15350 73 74 6f 72 65 20 74 68 65 20 63 6f 6c 75 6d 6e  store the column
15360 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74   value in regist
15370 65 72 20 69 52 65 67 2e 20 20 54 68 69 73 0a 2a  er iReg.  This.*
15380 2a 20 69 73 20 6e 6f 74 20 67 61 72 61 6e 74 65  * is not garante
15390 65 65 64 20 66 6f 72 20 47 65 74 43 6f 6c 75 6d  eed for GetColum
153a0 6e 28 29 20 2d 20 74 68 65 20 72 65 73 75 6c 74  n() - the result
153b0 20 63 61 6e 20 62 65 20 73 74 6f 72 65 64 20 69   can be stored i
153c0 6e 0a 2a 2a 20 61 6e 79 20 72 65 67 69 73 74 65  n.** any registe
153d0 72 2e 20 20 42 75 74 20 74 68 65 20 72 65 73 75  r.  But the resu
153e0 6c 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  lt is guaranteed
153f0 20 74 6f 20 6c 61 6e 64 20 69 6e 20 72 65 67 69   to land in regi
15400 73 74 65 72 20 69 52 65 67 0a 2a 2a 20 66 6f 72  ster iReg.** for
15410 20 47 65 74 43 6f 6c 75 6d 6e 54 6f 52 65 67 28   GetColumnToReg(
15420 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 6d  )..**.** There m
15430 75 73 74 20 62 65 20 61 6e 20 6f 70 65 6e 20 63  ust be an open c
15440 75 72 73 6f 72 20 74 6f 20 70 54 61 62 20 69 6e  ursor to pTab in
15450 20 69 54 61 62 6c 65 20 77 68 65 6e 20 74 68 69   iTable when thi
15460 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20  s routine.** is 
15470 63 61 6c 6c 65 64 2e 20 20 49 66 20 69 43 6f 6c  called.  If iCol
15480 75 6d 6e 3c 30 20 74 68 65 6e 20 63 6f 64 65 20  umn<0 then code 
15490 69 73 20 67 65 6e 65 72 61 74 65 64 20 74 68 61  is generated tha
154a0 74 20 65 78 74 72 61 63 74 73 20 74 68 65 20 72  t extracts the r
154b0 6f 77 69 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  owid..*/.int sql
154c0 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43  ite3ExprCodeGetC
154d0 6f 6c 75 6d 6e 28 0a 20 20 50 61 72 73 65 20 2a  olumn(.  Parse *
154e0 70 50 61 72 73 65 2c 20 20 20 2f 2a 20 50 61 72  pParse,   /* Par
154f0 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65  sing and code ge
15500 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74  nerating context
15510 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   */.  Table *pTa
15520 62 2c 20 20 20 20 20 2f 2a 20 44 65 73 63 72 69  b,     /* Descri
15530 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 74 61 62  ption of the tab
15540 6c 65 20 77 65 20 61 72 65 20 72 65 61 64 69 6e  le we are readin
15550 67 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20  g from */.  int 
15560 69 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 2f 2a 20  iColumn,     /* 
15570 49 6e 64 65 78 20 6f 66 20 74 68 65 20 74 61 62  Index of the tab
15580 6c 65 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 69  le column */.  i
15590 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20  nt iTable,      
155a0 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 70 6f  /* The cursor po
155b0 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 74 61  inting to the ta
155c0 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65  ble */.  int iRe
155d0 67 2c 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f  g,        /* Sto
155e0 72 65 20 72 65 73 75 6c 74 73 20 68 65 72 65 20  re results here 
155f0 2a 2f 0a 20 20 75 38 20 70 35 20 20 20 20 20 20  */.  u8 p5      
15600 20 20 20 20 20 20 2f 2a 20 50 35 20 76 61 6c 75        /* P5 valu
15610 65 20 66 6f 72 20 4f 50 5f 43 6f 6c 75 6d 6e 20  e for OP_Column 
15620 2b 20 46 4c 41 47 53 20 2a 2f 0a 29 7b 0a 20 20  + FLAGS */.){.  
15630 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
15640 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
15650 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43  ;.  struct yColC
15660 61 63 68 65 20 2a 70 3b 0a 0a 20 20 66 6f 72 28  ache *p;..  for(
15670 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61  i=0, p=pParse->a
15680 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49  ColCache; i<SQLI
15690 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69  TE_N_COLCACHE; i
156a0 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66  ++, p++){.    if
156b0 28 20 70 2d 3e 69 52 65 67 3e 30 20 26 26 20 70  ( p->iReg>0 && p
156c0 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62 6c 65  ->iTable==iTable
156d0 20 26 26 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d   && p->iColumn==
156e0 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20  iColumn ){.     
156f0 20 70 2d 3e 6c 72 75 20 3d 20 70 50 61 72 73 65   p->lru = pParse
15700 2d 3e 69 43 61 63 68 65 43 6e 74 2b 2b 3b 0a 20  ->iCacheCnt++;. 
15710 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
15720 43 61 63 68 65 50 69 6e 52 65 67 69 73 74 65 72  CachePinRegister
15730 28 70 50 61 72 73 65 2c 20 70 2d 3e 69 52 65 67  (pParse, p->iReg
15740 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
15750 70 2d 3e 69 52 65 67 3b 0a 20 20 20 20 7d 0a 20  p->iReg;.    }. 
15760 20 7d 20 20 0a 20 20 61 73 73 65 72 74 28 20 76   }  .  assert( v
15770 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  !=0 );.  sqlite3
15780 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d  ExprCodeGetColum
15790 6e 4f 66 54 61 62 6c 65 28 76 2c 20 70 54 61 62  nOfTable(v, pTab
157a0 2c 20 69 54 61 62 6c 65 2c 20 69 43 6f 6c 75 6d  , iTable, iColum
157b0 6e 2c 20 69 52 65 67 29 3b 0a 20 20 69 66 28 20  n, iReg);.  if( 
157c0 70 35 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  p5 ){.    sqlite
157d0 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
157e0 20 70 35 29 3b 0a 20 20 7d 65 6c 73 65 7b 20 20   p5);.  }else{  
157f0 20 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70   .    sqlite3Exp
15800 72 43 61 63 68 65 53 74 6f 72 65 28 70 50 61 72  rCacheStore(pPar
15810 73 65 2c 20 69 54 61 62 6c 65 2c 20 69 43 6f 6c  se, iTable, iCol
15820 75 6d 6e 2c 20 69 52 65 67 29 3b 0a 20 20 7d 0a  umn, iReg);.  }.
15830 20 20 72 65 74 75 72 6e 20 69 52 65 67 3b 0a 7d    return iReg;.}
15840 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
15850 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 54 6f  rCodeGetColumnTo
15860 52 65 67 28 0a 20 20 50 61 72 73 65 20 2a 70 50  Reg(.  Parse *pP
15870 61 72 73 65 2c 20 20 20 2f 2a 20 50 61 72 73 69  arse,   /* Parsi
15880 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65  ng and code gene
15890 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  rating context *
158a0 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c  /.  Table *pTab,
158b0 20 20 20 20 20 2f 2a 20 44 65 73 63 72 69 70 74       /* Descript
158c0 69 6f 6e 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ion of the table
158d0 20 77 65 20 61 72 65 20 72 65 61 64 69 6e 67 20   we are reading 
158e0 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 43  from */.  int iC
158f0 6f 6c 75 6d 6e 2c 20 20 20 20 20 2f 2a 20 49 6e  olumn,     /* In
15900 64 65 78 20 6f 66 20 74 68 65 20 74 61 62 6c 65  dex of the table
15910 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 69 6e 74   column */.  int
15920 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 2f 2a   iTable,      /*
15930 20 54 68 65 20 63 75 72 73 6f 72 20 70 6f 69 6e   The cursor poin
15940 74 69 6e 67 20 74 6f 20 74 68 65 20 74 61 62 6c  ting to the tabl
15950 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65 67 20  e */.  int iReg 
15960 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65          /* Store
15970 20 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f   results here */
15980 0a 29 7b 0a 20 20 69 6e 74 20 72 31 20 3d 20 73  .){.  int r1 = s
15990 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65  qlite3ExprCodeGe
159a0 74 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20  tColumn(pParse, 
159b0 70 54 61 62 2c 20 69 43 6f 6c 75 6d 6e 2c 20 69  pTab, iColumn, i
159c0 54 61 62 6c 65 2c 20 69 52 65 67 2c 20 30 29 3b  Table, iReg, 0);
159d0 0a 20 20 69 66 28 20 72 31 21 3d 69 52 65 67 20  .  if( r1!=iReg 
159e0 29 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  ) sqlite3VdbeAdd
159f0 4f 70 32 28 70 50 61 72 73 65 2d 3e 70 56 64 62  Op2(pParse->pVdb
15a00 65 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 72 31 2c  e, OP_SCopy, r1,
15a10 20 69 52 65 67 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a   iReg);.}.../*.*
15a20 2a 20 43 6c 65 61 72 20 61 6c 6c 20 63 6f 6c 75  * Clear all colu
15a30 6d 6e 20 63 61 63 68 65 20 65 6e 74 72 69 65 73  mn cache entries
15a40 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
15a50 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28  3ExprCacheClear(
15a60 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
15a70 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63    int i;.  struc
15a80 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a  t yColCache *p;.
15a90 0a 23 69 66 20 53 51 4c 49 54 45 5f 44 45 42 55  .#if SQLITE_DEBU
15aa0 47 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  G.  if( pParse->
15ab0 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
15ac0 54 45 5f 56 64 62 65 41 64 64 6f 70 54 72 61 63  TE_VdbeAddopTrac
15ad0 65 20 29 7b 0a 20 20 20 20 70 72 69 6e 74 66 28  e ){.    printf(
15ae0 22 43 4c 45 41 52 5c 6e 22 29 3b 0a 20 20 7d 0a  "CLEAR\n");.  }.
15af0 23 65 6e 64 69 66 0a 20 20 66 6f 72 28 69 3d 30  #endif.  for(i=0
15b00 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c  , p=pParse->aCol
15b10 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f  Cache; i<SQLITE_
15b20 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c  N_COLCACHE; i++,
15b30 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70   p++){.    if( p
15b40 2d 3e 69 52 65 67 20 29 7b 0a 20 20 20 20 20 20  ->iReg ){.      
15b50 63 61 63 68 65 45 6e 74 72 79 43 6c 65 61 72 28  cacheEntryClear(
15b60 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20  pParse, p);.    
15b70 20 20 70 2d 3e 69 52 65 67 20 3d 20 30 3b 0a 20    p->iReg = 0;. 
15b80 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
15b90 2a 20 52 65 63 6f 72 64 20 74 68 65 20 66 61 63  * Record the fac
15ba0 74 20 74 68 61 74 20 61 6e 20 61 66 66 69 6e 69  t that an affini
15bb0 74 79 20 63 68 61 6e 67 65 20 68 61 73 20 6f 63  ty change has oc
15bc0 63 75 72 72 65 64 20 6f 6e 20 69 43 6f 75 6e 74  curred on iCount
15bd0 0a 2a 2a 20 72 65 67 69 73 74 65 72 73 20 73 74  .** registers st
15be0 61 72 74 69 6e 67 20 77 69 74 68 20 69 53 74 61  arting with iSta
15bf0 72 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  rt..*/.void sqli
15c00 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69  te3ExprCacheAffi
15c10 6e 69 74 79 43 68 61 6e 67 65 28 50 61 72 73 65  nityChange(Parse
15c20 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 53   *pParse, int iS
15c30 74 61 72 74 2c 20 69 6e 74 20 69 43 6f 75 6e 74  tart, int iCount
15c40 29 7b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  ){.  sqlite3Expr
15c50 43 61 63 68 65 52 65 6d 6f 76 65 28 70 50 61 72  CacheRemove(pPar
15c60 73 65 2c 20 69 53 74 61 72 74 2c 20 69 43 6f 75  se, iStart, iCou
15c70 6e 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  nt);.}../*.** Ge
15c80 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 6d  nerate code to m
15c90 6f 76 65 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d  ove content from
15ca0 20 72 65 67 69 73 74 65 72 73 20 69 46 72 6f 6d   registers iFrom
15cb0 2e 2e 2e 69 46 72 6f 6d 2b 6e 52 65 67 2d 31 0a  ...iFrom+nReg-1.
15cc0 2a 2a 20 6f 76 65 72 20 74 6f 20 69 54 6f 2e 2e  ** over to iTo..
15cd0 69 54 6f 2b 6e 52 65 67 2d 31 2e 20 4b 65 65 70  iTo+nReg-1. Keep
15ce0 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68   the column cach
15cf0 65 20 75 70 2d 74 6f 2d 64 61 74 65 2e 0a 2a 2f  e up-to-date..*/
15d00 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
15d10 72 43 6f 64 65 4d 6f 76 65 28 50 61 72 73 65 20  rCodeMove(Parse 
15d20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 46 72  *pParse, int iFr
15d30 6f 6d 2c 20 69 6e 74 20 69 54 6f 2c 20 69 6e 74  om, int iTo, int
15d40 20 6e 52 65 67 29 7b 0a 20 20 61 73 73 65 72 74   nReg){.  assert
15d50 28 20 69 46 72 6f 6d 3e 3d 69 54 6f 2b 6e 52 65  ( iFrom>=iTo+nRe
15d60 67 20 7c 7c 20 69 46 72 6f 6d 2b 6e 52 65 67 3c  g || iFrom+nReg<
15d70 3d 69 54 6f 20 29 3b 0a 20 20 73 71 6c 69 74 65  =iTo );.  sqlite
15d80 33 56 64 62 65 41 64 64 4f 70 33 28 70 50 61 72  3VdbeAddOp3(pPar
15d90 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 4d 6f  se->pVdbe, OP_Mo
15da0 76 65 2c 20 69 46 72 6f 6d 2c 20 69 54 6f 2c 20  ve, iFrom, iTo, 
15db0 6e 52 65 67 29 3b 0a 20 20 73 71 6c 69 74 65 33  nReg);.  sqlite3
15dc0 45 78 70 72 43 61 63 68 65 52 65 6d 6f 76 65 28  ExprCacheRemove(
15dd0 70 50 61 72 73 65 2c 20 69 46 72 6f 6d 2c 20 6e  pParse, iFrom, n
15de0 52 65 67 29 3b 0a 7d 0a 0a 23 69 66 20 64 65 66  Reg);.}..#if def
15df0 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
15e00 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  G) || defined(SQ
15e10 4c 49 54 45 5f 43 4f 56 45 52 41 47 45 5f 54 45  LITE_COVERAGE_TE
15e20 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  ST)./*.** Return
15e30 20 74 72 75 65 20 69 66 20 61 6e 79 20 72 65 67   true if any reg
15e40 69 73 74 65 72 20 69 6e 20 74 68 65 20 72 61 6e  ister in the ran
15e50 67 65 20 69 46 72 6f 6d 2e 2e 69 54 6f 20 28 69  ge iFrom..iTo (i
15e60 6e 63 6c 75 73 69 76 65 29 0a 2a 2a 20 69 73 20  nclusive).** is 
15e70 75 73 65 64 20 61 73 20 70 61 72 74 20 6f 66 20  used as part of 
15e80 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65  the column cache
15e90 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
15ea0 74 69 6e 65 20 69 73 20 75 73 65 64 20 77 69 74  tine is used wit
15eb0 68 69 6e 20 61 73 73 65 72 74 28 29 20 61 6e 64  hin assert() and
15ec0 20 74 65 73 74 63 61 73 65 28 29 20 6d 61 63 72   testcase() macr
15ed0 6f 73 20 6f 6e 6c 79 0a 2a 2a 20 61 6e 64 20 64  os only.** and d
15ee0 6f 65 73 20 6e 6f 74 20 61 70 70 65 61 72 20 69  oes not appear i
15ef0 6e 20 61 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64  n a normal build
15f00 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
15f10 75 73 65 64 41 73 43 6f 6c 75 6d 6e 43 61 63 68  usedAsColumnCach
15f20 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
15f30 20 69 6e 74 20 69 46 72 6f 6d 2c 20 69 6e 74 20   int iFrom, int 
15f40 69 54 6f 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  iTo){.  int i;. 
15f50 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68   struct yColCach
15f60 65 20 2a 70 3b 0a 20 20 66 6f 72 28 69 3d 30 2c  e *p;.  for(i=0,
15f70 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43   p=pParse->aColC
15f80 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e  ache; i<SQLITE_N
15f90 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20  _COLCACHE; i++, 
15fa0 70 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 72 20  p++){.    int r 
15fb0 3d 20 70 2d 3e 69 52 65 67 3b 0a 20 20 20 20 69  = p->iReg;.    i
15fc0 66 28 20 72 3e 3d 69 46 72 6f 6d 20 26 26 20 72  f( r>=iFrom && r
15fd0 3c 3d 69 54 6f 20 29 20 72 65 74 75 72 6e 20 31  <=iTo ) return 1
15fe0 3b 20 20 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a 2f  ;    /*NO_TEST*/
15ff0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
16000 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
16010 49 54 45 5f 44 45 42 55 47 20 7c 7c 20 53 51 4c  ITE_DEBUG || SQL
16020 49 54 45 5f 43 4f 56 45 52 41 47 45 5f 54 45 53  ITE_COVERAGE_TES
16030 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76  T */../*.** Conv
16040 65 72 74 20 61 6e 20 65 78 70 72 65 73 73 69 6f  ert an expressio
16050 6e 20 6e 6f 64 65 20 74 6f 20 61 20 54 4b 5f 52  n node to a TK_R
16060 45 47 49 53 54 45 52 0a 2a 2f 0a 73 74 61 74 69  EGISTER.*/.stati
16070 63 20 76 6f 69 64 20 65 78 70 72 54 6f 52 65 67  c void exprToReg
16080 69 73 74 65 72 28 45 78 70 72 20 2a 70 2c 20 69  ister(Expr *p, i
16090 6e 74 20 69 52 65 67 29 7b 0a 20 20 70 2d 3e 6f  nt iReg){.  p->o
160a0 70 32 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 70 2d  p2 = p->op;.  p-
160b0 3e 6f 70 20 3d 20 54 4b 5f 52 45 47 49 53 54 45  >op = TK_REGISTE
160c0 52 3b 0a 20 20 70 2d 3e 69 54 61 62 6c 65 20 3d  R;.  p->iTable =
160d0 20 69 52 65 67 3b 0a 20 20 45 78 70 72 43 6c 65   iReg;.  ExprCle
160e0 61 72 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  arProperty(p, EP
160f0 5f 53 6b 69 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  _Skip);.}../*.**
16100 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69   Generate code i
16110 6e 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20  nto the current 
16120 56 64 62 65 20 74 6f 20 65 76 61 6c 75 61 74 65  Vdbe to evaluate
16130 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 65 78   the given.** ex
16140 70 72 65 73 73 69 6f 6e 2e 20 20 41 74 74 65 6d  pression.  Attem
16150 70 74 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20  pt to store the 
16160 72 65 73 75 6c 74 73 20 69 6e 20 72 65 67 69 73  results in regis
16170 74 65 72 20 22 74 61 72 67 65 74 22 2e 0a 2a 2a  ter "target"..**
16180 20 52 65 74 75 72 6e 20 74 68 65 20 72 65 67 69   Return the regi
16190 73 74 65 72 20 77 68 65 72 65 20 72 65 73 75 6c  ster where resul
161a0 74 73 20 61 72 65 20 73 74 6f 72 65 64 2e 0a 2a  ts are stored..*
161b0 2a 0a 2a 2a 20 57 69 74 68 20 74 68 69 73 20 72  *.** With this r
161c0 6f 75 74 69 6e 65 2c 20 74 68 65 72 65 20 69 73  outine, there is
161d0 20 6e 6f 20 67 75 61 72 61 6e 74 65 65 20 74 68   no guarantee th
161e0 61 74 20 72 65 73 75 6c 74 73 20 77 69 6c 6c 0a  at results will.
161f0 2a 2a 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20  ** be stored in 
16200 74 61 72 67 65 74 2e 20 20 54 68 65 20 72 65 73  target.  The res
16210 75 6c 74 20 6d 69 67 68 74 20 62 65 20 73 74 6f  ult might be sto
16220 72 65 64 20 69 6e 20 73 6f 6d 65 20 6f 74 68 65  red in some othe
16230 72 0a 2a 2a 20 72 65 67 69 73 74 65 72 20 69 66  r.** register if
16240 20 69 74 20 69 73 20 63 6f 6e 76 65 6e 69 65 6e   it is convenien
16250 74 20 74 6f 20 64 6f 20 73 6f 2e 20 20 54 68 65  t to do so.  The
16260 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f   calling functio
16270 6e 0a 2a 2a 20 6d 75 73 74 20 63 68 65 63 6b 20  n.** must check 
16280 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20  the return code 
16290 61 6e 64 20 6d 6f 76 65 20 74 68 65 20 72 65 73  and move the res
162a0 75 6c 74 73 20 74 6f 20 74 68 65 20 64 65 73 69  ults to the desi
162b0 72 65 64 0a 2a 2a 20 72 65 67 69 73 74 65 72 2e  red.** register.
162c0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
162d0 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 50 61  xprCodeTarget(Pa
162e0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
162f0 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 74 61  r *pExpr, int ta
16300 72 67 65 74 29 7b 0a 20 20 56 64 62 65 20 2a 76  rget){.  Vdbe *v
16310 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
16320 3b 20 20 2f 2a 20 54 68 65 20 56 4d 20 75 6e 64  ;  /* The VM und
16330 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20  er construction 
16340 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20 20  */.  int op;    
16350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16360 2a 20 54 68 65 20 6f 70 63 6f 64 65 20 62 65 69  * The opcode bei
16370 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e  ng coded */.  in
16380 74 20 69 6e 52 65 67 20 3d 20 74 61 72 67 65 74  t inReg = target
16390 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c  ;       /* Resul
163a0 74 73 20 73 74 6f 72 65 64 20 69 6e 20 72 65 67  ts stored in reg
163b0 69 73 74 65 72 20 69 6e 52 65 67 20 2a 2f 0a 20  ister inReg */. 
163c0 20 69 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20   int regFree1 = 
163d0 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66  0;         /* If
163e0 20 6e 6f 6e 2d 7a 65 72 6f 20 66 72 65 65 20 74   non-zero free t
163f0 68 69 73 20 74 65 6d 70 6f 72 61 72 79 20 72 65  his temporary re
16400 67 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  gister */.  int 
16410 72 65 67 46 72 65 65 32 20 3d 20 30 3b 20 20 20  regFree2 = 0;   
16420 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d        /* If non-
16430 7a 65 72 6f 20 66 72 65 65 20 74 68 69 73 20 74  zero free this t
16440 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74 65  emporary registe
16450 72 20 2a 2f 0a 20 20 69 6e 74 20 72 31 2c 20 72  r */.  int r1, r
16460 32 2c 20 72 33 2c 20 72 34 3b 20 20 20 20 20 20  2, r3, r4;      
16470 20 2f 2a 20 56 61 72 69 6f 75 73 20 72 65 67 69   /* Various regi
16480 73 74 65 72 20 6e 75 6d 62 65 72 73 20 2a 2f 0a  ster numbers */.
16490 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
164a0 70 50 61 72 73 65 2d 3e 64 62 3b 20 2f 2a 20 54  pParse->db; /* T
164b0 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
164c0 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72  ection */.  Expr
164d0 20 74 65 6d 70 58 3b 20 20 20 20 20 20 20 20 20   tempX;         
164e0 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61        /* Tempora
164f0 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f  ry expression no
16500 64 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  de */..  assert(
16510 20 74 61 72 67 65 74 3e 30 20 26 26 20 74 61 72   target>0 && tar
16520 67 65 74 3c 3d 70 50 61 72 73 65 2d 3e 6e 4d 65  get<=pParse->nMe
16530 6d 20 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20  m );.  if( v==0 
16540 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
16550 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
16560 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 72  cFailed );.    r
16570 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20  eturn 0;.  }..  
16580 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 7b 0a  if( pExpr==0 ){.
16590 20 20 20 20 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c      op = TK_NULL
165a0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f  ;.  }else{.    o
165b0 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20  p = pExpr->op;. 
165c0 20 7d 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20   }.  switch( op 
165d0 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41  ){.    case TK_A
165e0 47 47 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20  GG_COLUMN: {.   
165f0 20 20 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67     AggInfo *pAgg
16600 49 6e 66 6f 20 3d 20 70 45 78 70 72 2d 3e 70 41  Info = pExpr->pA
16610 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 73 74  ggInfo;.      st
16620 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c  ruct AggInfo_col
16630 20 2a 70 43 6f 6c 20 3d 20 26 70 41 67 67 49 6e   *pCol = &pAggIn
16640 66 6f 2d 3e 61 43 6f 6c 5b 70 45 78 70 72 2d 3e  fo->aCol[pExpr->
16650 69 41 67 67 5d 3b 0a 20 20 20 20 20 20 69 66 28  iAgg];.      if(
16660 20 21 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65   !pAggInfo->dire
16670 63 74 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20 20  ctMode ){.      
16680 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c 2d 3e    assert( pCol->
16690 69 4d 65 6d 3e 30 20 29 3b 0a 20 20 20 20 20 20  iMem>0 );.      
166a0 20 20 69 6e 52 65 67 20 3d 20 70 43 6f 6c 2d 3e    inReg = pCol->
166b0 69 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 62 72  iMem;.        br
166c0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  eak;.      }else
166d0 20 69 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e 75   if( pAggInfo->u
166e0 73 65 53 6f 72 74 69 6e 67 49 64 78 20 29 7b 0a  seSortingIdx ){.
166f0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
16700 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
16710 43 6f 6c 75 6d 6e 2c 20 70 41 67 67 49 6e 66 6f  Column, pAggInfo
16720 2d 3e 73 6f 72 74 69 6e 67 49 64 78 50 54 61 62  ->sortingIdxPTab
16730 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
16740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16750 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c  pCol->iSorterCol
16760 75 6d 6e 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  umn, target);.  
16770 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
16780 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 4f 74     }.      /* Ot
16790 68 65 72 77 69 73 65 2c 20 66 61 6c 6c 20 74 68  herwise, fall th
167a0 72 75 20 69 6e 74 6f 20 74 68 65 20 54 4b 5f 43  ru into the TK_C
167b0 4f 4c 55 4d 4e 20 63 61 73 65 20 2a 2f 0a 20 20  OLUMN case */.  
167c0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
167d0 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20  COLUMN: {.      
167e0 69 6e 74 20 69 54 61 62 20 3d 20 70 45 78 70 72  int iTab = pExpr
167f0 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20  ->iTable;.      
16800 69 66 28 20 69 54 61 62 3c 30 20 29 7b 0a 20 20  if( iTab<0 ){.  
16810 20 20 20 20 20 20 69 66 28 20 70 50 61 72 73 65        if( pParse
16820 2d 3e 63 6b 42 61 73 65 3e 30 20 29 7b 0a 20 20  ->ckBase>0 ){.  
16830 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72          /* Gener
16840 61 74 69 6e 67 20 43 48 45 43 4b 20 63 6f 6e 73  ating CHECK cons
16850 74 72 61 69 6e 74 73 20 6f 72 20 69 6e 73 65 72  traints or inser
16860 74 69 6e 67 20 69 6e 74 6f 20 70 61 72 74 69 61  ting into partia
16870 6c 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20  l index */.     
16880 20 20 20 20 20 69 6e 52 65 67 20 3d 20 70 45 78       inReg = pEx
16890 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 2b 20 70 50  pr->iColumn + pP
168a0 61 72 73 65 2d 3e 63 6b 42 61 73 65 3b 0a 20 20  arse->ckBase;.  
168b0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
168c0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
168d0 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 64 69 6e          /* Codin
168e0 67 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  g an expression 
168f0 74 68 61 74 20 69 73 20 70 61 72 74 20 6f 66 20  that is part of 
16900 61 6e 20 69 6e 64 65 78 20 77 68 65 72 65 20 63  an index where c
16910 6f 6c 75 6d 6e 20 6e 61 6d 65 73 0a 20 20 20 20  olumn names.    
16920 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20        ** in the 
16930 69 6e 64 65 78 20 72 65 66 65 72 20 74 6f 20 74  index refer to t
16940 68 65 20 74 61 62 6c 65 20 74 6f 20 77 68 69 63  he table to whic
16950 68 20 74 68 65 20 69 6e 64 65 78 20 62 65 6c 6f  h the index belo
16960 6e 67 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ngs */.         
16970 20 69 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e   iTab = pParse->
16980 69 53 65 6c 66 54 61 62 3b 0a 20 20 20 20 20 20  iSelfTab;.      
16990 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
169a0 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65    inReg = sqlite
169b0 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75  3ExprCodeGetColu
169c0 6d 6e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mn(pParse, pExpr
169d0 2d 3e 70 54 61 62 2c 0a 20 20 20 20 20 20 20 20  ->pTab,.        
169e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
169f0 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43         pExpr->iC
16a00 6f 6c 75 6d 6e 2c 20 69 54 61 62 2c 20 74 61 72  olumn, iTab, tar
16a10 67 65 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  get,.           
16a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16a30 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 32 29 3b      pExpr->op2);
16a40 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
16a50 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
16a60 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20 20  INTEGER: {.     
16a70 20 63 6f 64 65 49 6e 74 65 67 65 72 28 70 50 61   codeInteger(pPa
16a80 72 73 65 2c 20 70 45 78 70 72 2c 20 30 2c 20 74  rse, pExpr, 0, t
16a90 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 62 72  arget);.      br
16aa0 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  eak;.    }.#ifnd
16ab0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ef SQLITE_OMIT_F
16ac0 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20  LOATING_POINT.  
16ad0 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a    case TK_FLOAT:
16ae0 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
16af0 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
16b00 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56  y(pExpr, EP_IntV
16b10 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 63  alue) );.      c
16b20 6f 64 65 52 65 61 6c 28 76 2c 20 70 45 78 70 72  odeReal(v, pExpr
16b30 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30 2c 20 74  ->u.zToken, 0, t
16b40 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 62 72  arget);.      br
16b50 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
16b60 66 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54  f.    case TK_ST
16b70 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20 61 73  RING: {.      as
16b80 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
16b90 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
16ba0 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20  _IntValue) );.  
16bb0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c      sqlite3VdbeL
16bc0 6f 61 64 53 74 72 69 6e 67 28 76 2c 20 74 61 72  oadString(v, tar
16bd0 67 65 74 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54  get, pExpr->u.zT
16be0 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 62 72 65  oken);.      bre
16bf0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
16c00 73 65 20 54 4b 5f 4e 55 4c 4c 3a 20 7b 0a 20 20  se TK_NULL: {.  
16c10 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
16c20 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp2(v, OP_Null
16c30 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  , 0, target);.  
16c40 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
16c50 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
16c60 4f 4d 49 54 5f 42 4c 4f 42 5f 4c 49 54 45 52 41  OMIT_BLOB_LITERA
16c70 4c 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 4c  L.    case TK_BL
16c80 4f 42 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  OB: {.      int 
16c90 6e 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  n;.      const c
16ca0 68 61 72 20 2a 7a 3b 0a 20 20 20 20 20 20 63 68  har *z;.      ch
16cb0 61 72 20 2a 7a 42 6c 6f 62 3b 0a 20 20 20 20 20  ar *zBlob;.     
16cc0 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
16cd0 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
16ce0 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b   EP_IntValue) );
16cf0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
16d00 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30  Expr->u.zToken[0
16d10 5d 3d 3d 27 78 27 20 7c 7c 20 70 45 78 70 72 2d  ]=='x' || pExpr-
16d20 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 58  >u.zToken[0]=='X
16d30 27 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ' );.      asser
16d40 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  t( pExpr->u.zTok
16d50 65 6e 5b 31 5d 3d 3d 27 5c 27 27 20 29 3b 0a 20  en[1]=='\'' );. 
16d60 20 20 20 20 20 7a 20 3d 20 26 70 45 78 70 72 2d       z = &pExpr-
16d70 3e 75 2e 7a 54 6f 6b 65 6e 5b 32 5d 3b 0a 20 20  >u.zToken[2];.  
16d80 20 20 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 53      n = sqlite3S
16d90 74 72 6c 65 6e 33 30 28 7a 29 20 2d 20 31 3b 0a  trlen30(z) - 1;.
16da0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 5b        assert( z[
16db0 6e 5d 3d 3d 27 5c 27 27 20 29 3b 0a 20 20 20 20  n]=='\'' );.    
16dc0 20 20 7a 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65    zBlob = sqlite
16dd0 33 48 65 78 54 6f 42 6c 6f 62 28 73 71 6c 69 74  3HexToBlob(sqlit
16de0 65 33 56 64 62 65 44 62 28 76 29 2c 20 7a 2c 20  e3VdbeDb(v), z, 
16df0 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  n);.      sqlite
16e00 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
16e10 50 5f 42 6c 6f 62 2c 20 6e 2f 32 2c 20 74 61 72  P_Blob, n/2, tar
16e20 67 65 74 2c 20 30 2c 20 7a 42 6c 6f 62 2c 20 50  get, 0, zBlob, P
16e30 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20  4_DYNAMIC);.    
16e40 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
16e50 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 54  endif.    case T
16e60 4b 5f 56 41 52 49 41 42 4c 45 3a 20 7b 0a 20 20  K_VARIABLE: {.  
16e70 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
16e80 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
16e90 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  pr, EP_IntValue)
16ea0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
16eb0 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  ( pExpr->u.zToke
16ec0 6e 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73  n!=0 );.      as
16ed0 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a  sert( pExpr->u.z
16ee0 54 6f 6b 65 6e 5b 30 5d 21 3d 30 20 29 3b 0a 20  Token[0]!=0 );. 
16ef0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
16f00 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 56 61 72  AddOp2(v, OP_Var
16f10 69 61 62 6c 65 2c 20 70 45 78 70 72 2d 3e 69 43  iable, pExpr->iC
16f20 6f 6c 75 6d 6e 2c 20 74 61 72 67 65 74 29 3b 0a  olumn, target);.
16f30 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
16f40 3e 75 2e 7a 54 6f 6b 65 6e 5b 31 5d 21 3d 30 20  >u.zToken[1]!=0 
16f50 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
16f60 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  t( pExpr->u.zTok
16f70 65 6e 5b 30 5d 3d 3d 27 3f 27 20 0a 20 20 20 20  en[0]=='?' .    
16f80 20 20 20 20 20 20 20 20 20 7c 7c 20 73 74 72 63           || strc
16f90 6d 70 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  mp(pExpr->u.zTok
16fa0 65 6e 2c 20 70 50 61 72 73 65 2d 3e 61 7a 56 61  en, pParse->azVa
16fb0 72 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  r[pExpr->iColumn
16fc0 2d 31 5d 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20  -1])==0 );.     
16fd0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
16fe0 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 70 50  angeP4(v, -1, pP
16ff0 61 72 73 65 2d 3e 61 7a 56 61 72 5b 70 45 78 70  arse->azVar[pExp
17000 72 2d 3e 69 43 6f 6c 75 6d 6e 2d 31 5d 2c 20 50  r->iColumn-1], P
17010 34 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20  4_STATIC);.     
17020 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
17030 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
17040 4b 5f 52 45 47 49 53 54 45 52 3a 20 7b 0a 20 20  K_REGISTER: {.  
17050 20 20 20 20 69 6e 52 65 67 20 3d 20 70 45 78 70      inReg = pExp
17060 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20  r->iTable;.     
17070 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69   break;.    }.#i
17080 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
17090 54 5f 43 41 53 54 0a 20 20 20 20 63 61 73 65 20  T_CAST.    case 
170a0 54 4b 5f 43 41 53 54 3a 20 7b 0a 20 20 20 20 20  TK_CAST: {.     
170b0 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 73 20   /* Expressions 
170c0 6f 66 20 74 68 65 20 66 6f 72 6d 3a 20 20 20 43  of the form:   C
170d0 41 53 54 28 70 4c 65 66 74 20 41 53 20 74 6f 6b  AST(pLeft AS tok
170e0 65 6e 29 20 2a 2f 0a 20 20 20 20 20 20 69 6e 52  en) */.      inR
170f0 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  eg = sqlite3Expr
17100 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73  CodeTarget(pPars
17110 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
17120 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
17130 69 66 28 20 69 6e 52 65 67 21 3d 74 61 72 67 65  if( inReg!=targe
17140 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
17150 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
17160 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 69 6e 52 65  , OP_SCopy, inRe
17170 67 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  g, target);.    
17180 20 20 20 20 69 6e 52 65 67 20 3d 20 74 61 72 67      inReg = targ
17190 65 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  et;.      }.    
171a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
171b0 4f 70 32 28 76 2c 20 4f 50 5f 43 61 73 74 2c 20  Op2(v, OP_Cast, 
171c0 74 61 72 67 65 74 2c 0a 20 20 20 20 20 20 20 20  target,.        
171d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
171e0 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54  sqlite3AffinityT
171f0 79 70 65 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  ype(pExpr->u.zTo
17200 6b 65 6e 2c 20 30 29 29 3b 0a 20 20 20 20 20 20  ken, 0));.      
17210 74 65 73 74 63 61 73 65 28 20 75 73 65 64 41 73  testcase( usedAs
17220 43 6f 6c 75 6d 6e 43 61 63 68 65 28 70 50 61 72  ColumnCache(pPar
17230 73 65 2c 20 69 6e 52 65 67 2c 20 69 6e 52 65 67  se, inReg, inReg
17240 29 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) );.      sqlit
17250 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e  e3ExprCacheAffin
17260 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65  ityChange(pParse
17270 2c 20 69 6e 52 65 67 2c 20 31 29 3b 0a 20 20 20  , inReg, 1);.   
17280 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
17290 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
172a0 5f 4f 4d 49 54 5f 43 41 53 54 20 2a 2f 0a 20 20  _OMIT_CAST */.  
172b0 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20    case TK_LT:.  
172c0 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20    case TK_LE:.  
172d0 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20    case TK_GT:.  
172e0 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20    case TK_GE:.  
172f0 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20    case TK_NE:.  
17300 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a    case TK_EQ: {.
17310 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
17320 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
17330 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
17340 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b  eft, &regFree1);
17350 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69  .      r2 = sqli
17360 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
17370 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
17380 52 69 67 68 74 2c 20 26 72 65 67 46 72 65 65 32  Right, &regFree2
17390 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d  );.      codeCom
173a0 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 45 78  pare(pParse, pEx
173b0 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72  pr->pLeft, pExpr
173c0 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20  ->pRight, op,.  
173d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
173e0 72 31 2c 20 72 32 2c 20 69 6e 52 65 67 2c 20 53  r1, r2, inReg, S
173f0 51 4c 49 54 45 5f 53 54 4f 52 45 50 32 29 3b 0a  QLITE_STOREP2);.
17400 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f        assert(TK_
17410 4c 54 3d 3d 4f 50 5f 4c 74 29 3b 20 74 65 73 74  LT==OP_Lt); test
17420 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 74 29 3b  case(op==OP_Lt);
17430 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
17440 76 2c 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a 20 20  v,op==OP_Lt);.  
17450 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4c 45      assert(TK_LE
17460 3d 3d 4f 50 5f 4c 65 29 3b 20 74 65 73 74 63 61  ==OP_Le); testca
17470 73 65 28 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 20 56  se(op==OP_Le); V
17480 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
17490 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 0a 20 20 20 20  op==OP_Le);.    
174a0 20 20 61 73 73 65 72 74 28 54 4b 5f 47 54 3d 3d    assert(TK_GT==
174b0 4f 50 5f 47 74 29 3b 20 74 65 73 74 63 61 73 65  OP_Gt); testcase
174c0 28 6f 70 3d 3d 4f 50 5f 47 74 29 3b 20 56 64 62  (op==OP_Gt); Vdb
174d0 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70  eCoverageIf(v,op
174e0 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20 20 20 20 20  ==OP_Gt);.      
174f0 61 73 73 65 72 74 28 54 4b 5f 47 45 3d 3d 4f 50  assert(TK_GE==OP
17500 5f 47 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f  _Ge); testcase(o
17510 70 3d 3d 4f 50 5f 47 65 29 3b 20 56 64 62 65 43  p==OP_Ge); VdbeC
17520 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d  overageIf(v,op==
17530 4f 50 5f 47 65 29 3b 0a 20 20 20 20 20 20 61 73  OP_Ge);.      as
17540 73 65 72 74 28 54 4b 5f 45 51 3d 3d 4f 50 5f 45  sert(TK_EQ==OP_E
17550 71 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d  q); testcase(op=
17560 3d 4f 50 5f 45 71 29 3b 20 56 64 62 65 43 6f 76  =OP_Eq); VdbeCov
17570 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50  erageIf(v,op==OP
17580 5f 45 71 29 3b 0a 20 20 20 20 20 20 61 73 73 65  _Eq);.      asse
17590 72 74 28 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 29  rt(TK_NE==OP_Ne)
175a0 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f  ; testcase(op==O
175b0 50 5f 4e 65 29 3b 20 56 64 62 65 43 6f 76 65 72  P_Ne); VdbeCover
175c0 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4e  ageIf(v,op==OP_N
175d0 65 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  e);.      testca
175e0 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20  se( regFree1==0 
175f0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
17600 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29  e( regFree2==0 )
17610 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
17620 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
17630 5f 49 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _IS:.    case TK
17640 5f 49 53 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20  _ISNOT: {.      
17650 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
17660 5f 49 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _IS );.      tes
17670 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53  tcase( op==TK_IS
17680 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20 72 31 20  NOT );.      r1 
17690 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
176a0 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
176b0 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67  xpr->pLeft, &reg
176c0 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32  Free1);.      r2
176d0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
176e0 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
176f0 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72  Expr->pRight, &r
17700 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20  egFree2);.      
17710 6f 70 20 3d 20 28 6f 70 3d 3d 54 4b 5f 49 53 29  op = (op==TK_IS)
17720 20 3f 20 54 4b 5f 45 51 20 3a 20 54 4b 5f 4e 45   ? TK_EQ : TK_NE
17730 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70  ;.      codeComp
17740 61 72 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  are(pParse, pExp
17750 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d  r->pLeft, pExpr-
17760 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20  >pRight, op,.   
17770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
17780 31 2c 20 72 32 2c 20 69 6e 52 65 67 2c 20 53 51  1, r2, inReg, SQ
17790 4c 49 54 45 5f 53 54 4f 52 45 50 32 20 7c 20 53  LITE_STOREP2 | S
177a0 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20  QLITE_NULLEQ);. 
177b0 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
177c0 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 45 51  eIf(v, op==TK_EQ
177d0 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
177e0 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54  erageIf(v, op==T
177f0 4b 5f 4e 45 29 3b 0a 20 20 20 20 20 20 74 65 73  K_NE);.      tes
17800 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
17810 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  =0 );.      test
17820 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d  case( regFree2==
17830 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
17840 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
17850 20 54 4b 5f 41 4e 44 3a 0a 20 20 20 20 63 61 73   TK_AND:.    cas
17860 65 20 54 4b 5f 4f 52 3a 0a 20 20 20 20 63 61 73  e TK_OR:.    cas
17870 65 20 54 4b 5f 50 4c 55 53 3a 0a 20 20 20 20 63  e TK_PLUS:.    c
17880 61 73 65 20 54 4b 5f 53 54 41 52 3a 0a 20 20 20  ase TK_STAR:.   
17890 20 63 61 73 65 20 54 4b 5f 4d 49 4e 55 53 3a 0a   case TK_MINUS:.
178a0 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45 4d 3a      case TK_REM:
178b0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54  .    case TK_BIT
178c0 41 4e 44 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  AND:.    case TK
178d0 5f 42 49 54 4f 52 3a 0a 20 20 20 20 63 61 73 65  _BITOR:.    case
178e0 20 54 4b 5f 53 4c 41 53 48 3a 0a 20 20 20 20 63   TK_SLASH:.    c
178f0 61 73 65 20 54 4b 5f 4c 53 48 49 46 54 3a 0a 20  ase TK_LSHIFT:. 
17900 20 20 20 63 61 73 65 20 54 4b 5f 52 53 48 49 46     case TK_RSHIF
17910 54 3a 20 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  T: .    case TK_
17920 43 4f 4e 43 41 54 3a 20 7b 0a 20 20 20 20 20 20  CONCAT: {.      
17930 61 73 73 65 72 74 28 20 54 4b 5f 41 4e 44 3d 3d  assert( TK_AND==
17940 4f 50 5f 41 6e 64 20 29 3b 20 20 20 20 20 20 20  OP_And );       
17950 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
17960 70 3d 3d 54 4b 5f 41 4e 44 20 29 3b 0a 20 20 20  p==TK_AND );.   
17970 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4f 52     assert( TK_OR
17980 3d 3d 4f 50 5f 4f 72 20 29 3b 20 20 20 20 20 20  ==OP_Or );      
17990 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
179a0 28 20 6f 70 3d 3d 54 4b 5f 4f 52 20 29 3b 0a 20  ( op==TK_OR );. 
179b0 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
179c0 50 4c 55 53 3d 3d 4f 50 5f 41 64 64 20 29 3b 20  PLUS==OP_Add ); 
179d0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
179e0 73 65 28 20 6f 70 3d 3d 54 4b 5f 50 4c 55 53 20  se( op==TK_PLUS 
179f0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
17a00 20 54 4b 5f 4d 49 4e 55 53 3d 3d 4f 50 5f 53 75   TK_MINUS==OP_Su
17a10 62 74 72 61 63 74 20 29 3b 20 20 20 20 20 74 65  btract );     te
17a20 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4d  stcase( op==TK_M
17a30 49 4e 55 53 20 29 3b 0a 20 20 20 20 20 20 61 73  INUS );.      as
17a40 73 65 72 74 28 20 54 4b 5f 52 45 4d 3d 3d 4f 50  sert( TK_REM==OP
17a50 5f 52 65 6d 61 69 6e 64 65 72 20 29 3b 20 20 20  _Remainder );   
17a60 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
17a70 3d 54 4b 5f 52 45 4d 20 29 3b 0a 20 20 20 20 20  =TK_REM );.     
17a80 20 61 73 73 65 72 74 28 20 54 4b 5f 42 49 54 41   assert( TK_BITA
17a90 4e 44 3d 3d 4f 50 5f 42 69 74 41 6e 64 20 29 3b  ND==OP_BitAnd );
17aa0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
17ab0 6f 70 3d 3d 54 4b 5f 42 49 54 41 4e 44 20 29 3b  op==TK_BITAND );
17ac0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
17ad0 4b 5f 42 49 54 4f 52 3d 3d 4f 50 5f 42 69 74 4f  K_BITOR==OP_BitO
17ae0 72 20 29 3b 20 20 20 20 20 20 20 20 74 65 73 74  r );        test
17af0 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 42 49 54  case( op==TK_BIT
17b00 4f 52 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  OR );.      asse
17b10 72 74 28 20 54 4b 5f 53 4c 41 53 48 3d 3d 4f 50  rt( TK_SLASH==OP
17b20 5f 44 69 76 69 64 65 20 29 3b 20 20 20 20 20 20  _Divide );      
17b30 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
17b40 4b 5f 53 4c 41 53 48 20 29 3b 0a 20 20 20 20 20  K_SLASH );.     
17b50 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 53 48 49   assert( TK_LSHI
17b60 46 54 3d 3d 4f 50 5f 53 68 69 66 74 4c 65 66 74  FT==OP_ShiftLeft
17b70 20 29 3b 20 20 20 74 65 73 74 63 61 73 65 28 20   );   testcase( 
17b80 6f 70 3d 3d 54 4b 5f 4c 53 48 49 46 54 20 29 3b  op==TK_LSHIFT );
17b90 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
17ba0 4b 5f 52 53 48 49 46 54 3d 3d 4f 50 5f 53 68 69  K_RSHIFT==OP_Shi
17bb0 66 74 52 69 67 68 74 20 29 3b 20 20 74 65 73 74  ftRight );  test
17bc0 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 52 53 48  case( op==TK_RSH
17bd0 49 46 54 20 29 3b 0a 20 20 20 20 20 20 61 73 73  IFT );.      ass
17be0 65 72 74 28 20 54 4b 5f 43 4f 4e 43 41 54 3d 3d  ert( TK_CONCAT==
17bf0 4f 50 5f 43 6f 6e 63 61 74 20 29 3b 20 20 20 20  OP_Concat );    
17c00 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
17c10 54 4b 5f 43 4f 4e 43 41 54 20 29 3b 0a 20 20 20  TK_CONCAT );.   
17c20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
17c30 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
17c40 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
17c50 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20  , &regFree1);.  
17c60 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33      r2 = sqlite3
17c70 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
17c80 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
17c90 68 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a  ht, &regFree2);.
17ca0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
17cb0 65 41 64 64 4f 70 33 28 76 2c 20 6f 70 2c 20 72  eAddOp3(v, op, r
17cc0 32 2c 20 72 31 2c 20 74 61 72 67 65 74 29 3b 0a  2, r1, target);.
17cd0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
17ce0 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
17cf0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
17d00 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20  egFree2==0 );.  
17d10 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
17d20 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4d 49  .    case TK_UMI
17d30 4e 55 53 3a 20 7b 0a 20 20 20 20 20 20 45 78 70  NUS: {.      Exp
17d40 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72  r *pLeft = pExpr
17d50 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 61  ->pLeft;.      a
17d60 73 73 65 72 74 28 20 70 4c 65 66 74 20 29 3b 0a  ssert( pLeft );.
17d70 20 20 20 20 20 20 69 66 28 20 70 4c 65 66 74 2d        if( pLeft-
17d80 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47 45 52 20  >op==TK_INTEGER 
17d90 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 49  ){.        codeI
17da0 6e 74 65 67 65 72 28 70 50 61 72 73 65 2c 20 70  nteger(pParse, p
17db0 4c 65 66 74 2c 20 31 2c 20 74 61 72 67 65 74 29  Left, 1, target)
17dc0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
17dd0 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50  _OMIT_FLOATING_P
17de0 4f 49 4e 54 0a 20 20 20 20 20 20 7d 65 6c 73 65  OINT.      }else
17df0 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d   if( pLeft->op==
17e00 54 4b 5f 46 4c 4f 41 54 20 29 7b 0a 20 20 20 20  TK_FLOAT ){.    
17e10 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
17e20 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
17e30 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  pr, EP_IntValue)
17e40 20 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 64 65   );.        code
17e50 52 65 61 6c 28 76 2c 20 70 4c 65 66 74 2d 3e 75  Real(v, pLeft->u
17e60 2e 7a 54 6f 6b 65 6e 2c 20 31 2c 20 74 61 72 67  .zToken, 1, targ
17e70 65 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  et);.#endif.    
17e80 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
17e90 20 74 65 6d 70 58 2e 6f 70 20 3d 20 54 4b 5f 49   tempX.op = TK_I
17ea0 4e 54 45 47 45 52 3b 0a 20 20 20 20 20 20 20 20  NTEGER;.        
17eb0 74 65 6d 70 58 2e 66 6c 61 67 73 20 3d 20 45 50  tempX.flags = EP
17ec0 5f 49 6e 74 56 61 6c 75 65 7c 45 50 5f 54 6f 6b  _IntValue|EP_Tok
17ed0 65 6e 4f 6e 6c 79 3b 0a 20 20 20 20 20 20 20 20  enOnly;.        
17ee0 74 65 6d 70 58 2e 75 2e 69 56 61 6c 75 65 20 3d  tempX.u.iValue =
17ef0 20 30 3b 0a 20 20 20 20 20 20 20 20 72 31 20 3d   0;.        r1 =
17f00 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
17f10 54 65 6d 70 28 70 50 61 72 73 65 2c 20 26 74 65  Temp(pParse, &te
17f20 6d 70 58 2c 20 26 72 65 67 46 72 65 65 31 29 3b  mpX, &regFree1);
17f30 0a 20 20 20 20 20 20 20 20 72 32 20 3d 20 73 71  .        r2 = sq
17f40 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
17f50 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
17f60 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65  >pLeft, &regFree
17f70 32 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  2);.        sqli
17f80 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
17f90 20 4f 50 5f 53 75 62 74 72 61 63 74 2c 20 72 32   OP_Subtract, r2
17fa0 2c 20 72 31 2c 20 74 61 72 67 65 74 29 3b 0a 20  , r1, target);. 
17fb0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
17fc0 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a   regFree2==0 );.
17fd0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 6e        }.      in
17fe0 52 65 67 20 3d 20 74 61 72 67 65 74 3b 0a 20 20  Reg = target;.  
17ff0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
18000 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54  .    case TK_BIT
18010 4e 4f 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  NOT:.    case TK
18020 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 61 73  _NOT: {.      as
18030 73 65 72 74 28 20 54 4b 5f 42 49 54 4e 4f 54 3d  sert( TK_BITNOT=
18040 3d 4f 50 5f 42 69 74 4e 6f 74 20 29 3b 20 20 20  =OP_BitNot );   
18050 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
18060 5f 42 49 54 4e 4f 54 20 29 3b 0a 20 20 20 20 20  _BITNOT );.     
18070 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54 3d   assert( TK_NOT=
18080 3d 4f 50 5f 4e 6f 74 20 29 3b 20 20 20 20 20 20  =OP_Not );      
18090 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
180a0 3d 54 4b 5f 4e 4f 54 20 29 3b 0a 20 20 20 20 20  =TK_NOT );.     
180b0 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r1 = sqlite3Exp
180c0 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
180d0 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
180e0 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20  &regFree1);.    
180f0 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
18100 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
18110 20 69 6e 52 65 67 20 3d 20 74 61 72 67 65 74 3b   inReg = target;
18120 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
18130 62 65 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20  beAddOp2(v, op, 
18140 72 31 2c 20 69 6e 52 65 67 29 3b 0a 20 20 20 20  r1, inReg);.    
18150 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
18160 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c     case TK_ISNUL
18170 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  L:.    case TK_N
18180 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20  OTNULL: {.      
18190 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20  int addr;.      
181a0 61 73 73 65 72 74 28 20 54 4b 5f 49 53 4e 55 4c  assert( TK_ISNUL
181b0 4c 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 20  L==OP_IsNull ); 
181c0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
181d0 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20  TK_ISNULL );.   
181e0 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f     assert( TK_NO
181f0 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c  TNULL==OP_NotNul
18200 6c 20 29 3b 20 74 65 73 74 63 61 73 65 28 20 6f  l ); testcase( o
18210 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b  p==TK_NOTNULL );
18220 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
18230 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
18240 6e 74 65 67 65 72 2c 20 31 2c 20 74 61 72 67 65  nteger, 1, targe
18250 74 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73  t);.      r1 = s
18260 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
18270 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
18280 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65  ->pLeft, &regFre
18290 65 31 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  e1);.      testc
182a0 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30  ase( regFree1==0
182b0 20 29 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d   );.      addr =
182c0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
182d0 70 31 28 76 2c 20 6f 70 2c 20 72 31 29 3b 0a 20  p1(v, op, r1);. 
182e0 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
182f0 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 49 53  eIf(v, op==TK_IS
18300 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 56 64 62  NULL);.      Vdb
18310 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f  eCoverageIf(v, o
18320 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a  p==TK_NOTNULL);.
18330 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
18340 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
18350 74 65 67 65 72 2c 20 30 2c 20 74 61 72 67 65 74  teger, 0, target
18360 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
18370 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
18380 61 64 64 72 29 3b 0a 20 20 20 20 20 20 62 72 65  addr);.      bre
18390 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
183a0 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49  se TK_AGG_FUNCTI
183b0 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 41 67 67 49  ON: {.      AggI
183c0 6e 66 6f 20 2a 70 49 6e 66 6f 20 3d 20 70 45 78  nfo *pInfo = pEx
183d0 70 72 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a 20 20  pr->pAggInfo;.  
183e0 20 20 20 20 69 66 28 20 70 49 6e 66 6f 3d 3d 30      if( pInfo==0
183f0 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
18400 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
18410 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49  erty(pExpr, EP_I
18420 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20  ntValue) );.    
18430 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
18440 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6d 69 73  Msg(pParse, "mis
18450 75 73 65 20 6f 66 20 61 67 67 72 65 67 61 74 65  use of aggregate
18460 3a 20 25 73 28 29 22 2c 20 70 45 78 70 72 2d 3e  : %s()", pExpr->
18470 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20  u.zToken);.     
18480 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
18490 69 6e 52 65 67 20 3d 20 70 49 6e 66 6f 2d 3e 61  inReg = pInfo->a
184a0 46 75 6e 63 5b 70 45 78 70 72 2d 3e 69 41 67 67  Func[pExpr->iAgg
184b0 5d 2e 69 4d 65 6d 3b 0a 20 20 20 20 20 20 7d 0a  ].iMem;.      }.
184c0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
184d0 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46   }.    case TK_F
184e0 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20  UNCTION: {.     
184f0 20 45 78 70 72 4c 69 73 74 20 2a 70 46 61 72 67   ExprList *pFarg
18500 3b 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20  ;       /* List 
18510 6f 66 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75  of function argu
18520 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 69  ments */.      i
18530 6e 74 20 6e 46 61 72 67 3b 20 20 20 20 20 20 20  nt nFarg;       
18540 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
18550 6f 66 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75  of function argu
18560 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 46  ments */.      F
18570 75 6e 63 44 65 66 20 2a 70 44 65 66 3b 20 20 20  uncDef *pDef;   
18580 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 75 6e        /* The fun
18590 63 74 69 6f 6e 20 64 65 66 69 6e 69 74 69 6f 6e  ction definition
185a0 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20 20   object */.     
185b0 20 69 6e 74 20 6e 49 64 3b 20 20 20 20 20 20 20   int nId;       
185c0 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74          /* Lengt
185d0 68 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f  h of the functio
185e0 6e 20 6e 61 6d 65 20 69 6e 20 62 79 74 65 73 20  n name in bytes 
185f0 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  */.      const c
18600 68 61 72 20 2a 7a 49 64 3b 20 20 20 20 20 20 20  har *zId;       
18610 2f 2a 20 54 68 65 20 66 75 6e 63 74 69 6f 6e 20  /* The function 
18620 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 75 33  name */.      u3
18630 32 20 63 6f 6e 73 74 4d 61 73 6b 20 3d 20 30 3b  2 constMask = 0;
18640 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
18650 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e  function argumen
18660 74 73 20 74 68 61 74 20 61 72 65 20 63 6f 6e 73  ts that are cons
18670 74 61 6e 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e  tant */.      in
18680 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
18690 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
186a0 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 75 38  nter */.      u8
186b0 20 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 20   enc = ENC(db); 
186c0 20 20 20 20 20 2f 2a 20 54 68 65 20 74 65 78 74       /* The text
186d0 20 65 6e 63 6f 64 69 6e 67 20 75 73 65 64 20 62   encoding used b
186e0 79 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20  y this database 
186f0 2a 2f 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71  */.      CollSeq
18700 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 20 20 20 20   *pColl = 0;    
18710 2f 2a 20 41 20 63 6f 6c 6c 61 74 69 6e 67 20 73  /* A collating s
18720 65 71 75 65 6e 63 65 20 2a 2f 0a 0a 20 20 20 20  equence */..    
18730 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
18740 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
18750 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
18760 29 3b 0a 20 20 20 20 20 20 69 66 28 20 45 78 70  );.      if( Exp
18770 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
18780 70 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  pr, EP_TokenOnly
18790 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 61  ) ){.        pFa
187a0 72 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65  rg = 0;.      }e
187b0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 46 61  lse{.        pFa
187c0 72 67 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c  rg = pExpr->x.pL
187d0 69 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ist;.      }.   
187e0 20 20 20 6e 46 61 72 67 20 3d 20 70 46 61 72 67     nFarg = pFarg
187f0 20 3f 20 70 46 61 72 67 2d 3e 6e 45 78 70 72 20   ? pFarg->nExpr 
18800 3a 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65 72  : 0;.      asser
18810 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
18820 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e  rty(pExpr, EP_In
18830 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20  tValue) );.     
18840 20 7a 49 64 20 3d 20 70 45 78 70 72 2d 3e 75 2e   zId = pExpr->u.
18850 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 6e 49  zToken;.      nI
18860 64 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  d = sqlite3Strle
18870 6e 33 30 28 7a 49 64 29 3b 0a 20 20 20 20 20 20  n30(zId);.      
18880 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33 46 69  pDef = sqlite3Fi
18890 6e 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 7a  ndFunction(db, z
188a0 49 64 2c 20 6e 49 64 2c 20 6e 46 61 72 67 2c 20  Id, nId, nFarg, 
188b0 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  enc, 0);.      i
188c0 66 28 20 70 44 65 66 3d 3d 30 20 7c 7c 20 70 44  f( pDef==0 || pD
188d0 65 66 2d 3e 78 46 69 6e 61 6c 69 7a 65 21 3d 30  ef->xFinalize!=0
188e0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
188f0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
18900 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20 66 75 6e  se, "unknown fun
18910 63 74 69 6f 6e 3a 20 25 2e 2a 73 28 29 22 2c 20  ction: %.*s()", 
18920 6e 49 64 2c 20 7a 49 64 29 3b 0a 20 20 20 20 20  nId, zId);.     
18930 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
18940 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 41 74 74 65  }..      /* Atte
18950 6d 70 74 20 61 20 64 69 72 65 63 74 20 69 6d 70  mpt a direct imp
18960 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
18970 68 65 20 62 75 69 6c 74 2d 69 6e 20 43 4f 41 4c  he built-in COAL
18980 45 53 43 45 28 29 20 61 6e 64 0a 20 20 20 20 20  ESCE() and.     
18990 20 2a 2a 20 49 46 4e 55 4c 4c 28 29 20 66 75 6e   ** IFNULL() fun
189a0 63 74 69 6f 6e 73 2e 20 20 54 68 69 73 20 61 76  ctions.  This av
189b0 6f 69 64 73 20 75 6e 6e 65 63 65 73 73 61 72 79  oids unnecessary
189c0 20 65 76 61 6c 75 61 74 69 6f 6e 20 6f 66 0a 20   evaluation of. 
189d0 20 20 20 20 20 2a 2a 20 61 72 67 75 6d 65 6e 74       ** argument
189e0 73 20 70 61 73 74 20 74 68 65 20 66 69 72 73 74  s past the first
189f0 20 6e 6f 6e 2d 4e 55 4c 4c 20 61 72 67 75 6d 65   non-NULL argume
18a00 6e 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  nt..      */.   
18a10 20 20 20 69 66 28 20 70 44 65 66 2d 3e 66 75 6e     if( pDef->fun
18a20 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  cFlags & SQLITE_
18a30 46 55 4e 43 5f 43 4f 41 4c 45 53 43 45 20 29 7b  FUNC_COALESCE ){
18a40 0a 20 20 20 20 20 20 20 20 69 6e 74 20 65 6e 64  .        int end
18a50 43 6f 61 6c 65 73 63 65 20 3d 20 73 71 6c 69 74  Coalesce = sqlit
18a60 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
18a70 76 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  v);.        asse
18a80 72 74 28 20 6e 46 61 72 67 3e 3d 32 20 29 3b 0a  rt( nFarg>=2 );.
18a90 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
18aa0 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
18ab0 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70  pFarg->a[0].pExp
18ac0 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  r, target);.    
18ad0 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e      for(i=1; i<n
18ae0 46 61 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Farg; i++){.    
18af0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
18b00 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 6f  eAddOp2(v, OP_No
18b10 74 4e 75 6c 6c 2c 20 74 61 72 67 65 74 2c 20 65  tNull, target, e
18b20 6e 64 43 6f 61 6c 65 73 63 65 29 3b 0a 20 20 20  ndCoalesce);.   
18b30 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
18b40 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
18b50 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
18b60 68 65 52 65 6d 6f 76 65 28 70 50 61 72 73 65 2c  heRemove(pParse,
18b70 20 74 61 72 67 65 74 2c 20 31 29 3b 0a 20 20 20   target, 1);.   
18b80 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
18b90 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72  prCachePush(pPar
18ba0 73 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  se);.          s
18bb0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
18bc0 50 61 72 73 65 2c 20 70 46 61 72 67 2d 3e 61 5b  Parse, pFarg->a[
18bd0 69 5d 2e 70 45 78 70 72 2c 20 74 61 72 67 65 74  i].pExpr, target
18be0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
18bf0 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70  ite3ExprCachePop
18c00 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
18c10 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69    }.        sqli
18c20 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
18c30 62 65 6c 28 76 2c 20 65 6e 64 43 6f 61 6c 65 73  bel(v, endCoales
18c40 63 65 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  ce);.        bre
18c50 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ak;.      }..   
18c60 20 20 20 2f 2a 20 54 68 65 20 55 4e 4c 49 4b 45     /* The UNLIKE
18c70 4c 59 28 29 20 66 75 6e 63 74 69 6f 6e 20 69 73  LY() function is
18c80 20 61 20 6e 6f 2d 6f 70 2e 20 20 54 68 65 20 72   a no-op.  The r
18c90 65 73 75 6c 74 20 69 73 20 74 68 65 20 76 61 6c  esult is the val
18ca0 75 65 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74  ue.      ** of t
18cb0 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
18cc0 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  t..      */.    
18cd0 20 20 69 66 28 20 70 44 65 66 2d 3e 66 75 6e 63    if( pDef->func
18ce0 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  Flags & SQLITE_F
18cf0 55 4e 43 5f 55 4e 4c 49 4b 45 4c 59 20 29 7b 0a  UNC_UNLIKELY ){.
18d00 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
18d10 6e 46 61 72 67 3e 3d 31 20 29 3b 0a 20 20 20 20  nFarg>=1 );.    
18d20 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69      inReg = sqli
18d30 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65  te3ExprCodeTarge
18d40 74 28 70 50 61 72 73 65 2c 20 70 46 61 72 67 2d  t(pParse, pFarg-
18d50 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20 74 61 72  >a[0].pExpr, tar
18d60 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 62 72  get);.        br
18d70 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  eak;.      }..  
18d80 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
18d90 46 61 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Farg; i++){.    
18da0 20 20 20 20 69 66 28 20 69 3c 33 32 20 26 26 20      if( i<32 && 
18db0 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
18dc0 73 74 61 6e 74 28 70 46 61 72 67 2d 3e 61 5b 69  stant(pFarg->a[i
18dd0 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20  ].pExpr) ){.    
18de0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
18df0 69 3d 3d 33 31 20 29 3b 0a 20 20 20 20 20 20 20  i==31 );.       
18e00 20 20 20 63 6f 6e 73 74 4d 61 73 6b 20 7c 3d 20     constMask |= 
18e10 4d 41 53 4b 42 49 54 33 32 28 69 29 3b 0a 20 20  MASKBIT32(i);.  
18e20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
18e30 69 66 28 20 28 70 44 65 66 2d 3e 66 75 6e 63 46  if( (pDef->funcF
18e40 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55  lags & SQLITE_FU
18e50 4e 43 5f 4e 45 45 44 43 4f 4c 4c 29 21 3d 30 20  NC_NEEDCOLL)!=0 
18e60 26 26 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20  && !pColl ){.   
18e70 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73         pColl = s
18e80 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
18e90 71 28 70 50 61 72 73 65 2c 20 70 46 61 72 67 2d  q(pParse, pFarg-
18ea0 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[i].pExpr);.  
18eb0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
18ec0 20 20 20 20 20 20 69 66 28 20 70 46 61 72 67 20        if( pFarg 
18ed0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63  ){.        if( c
18ee0 6f 6e 73 74 4d 61 73 6b 20 29 7b 0a 20 20 20 20  onstMask ){.    
18ef0 20 20 20 20 20 20 72 31 20 3d 20 70 50 61 72 73        r1 = pPars
18f00 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 20  e->nMem+1;.     
18f10 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65       pParse->nMe
18f20 6d 20 2b 3d 20 6e 46 61 72 67 3b 0a 20 20 20 20  m += nFarg;.    
18f30 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
18f40 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
18f50 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50  3GetTempRange(pP
18f60 61 72 73 65 2c 20 6e 46 61 72 67 29 3b 0a 20 20  arse, nFarg);.  
18f70 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
18f80 20 2f 2a 20 46 6f 72 20 6c 65 6e 67 74 68 28 29   /* For length()
18f90 20 61 6e 64 20 74 79 70 65 6f 66 28 29 20 66 75   and typeof() fu
18fa0 6e 63 74 69 6f 6e 73 20 77 69 74 68 20 61 20 63  nctions with a c
18fb0 6f 6c 75 6d 6e 20 61 72 67 75 6d 65 6e 74 2c 0a  olumn argument,.
18fc0 20 20 20 20 20 20 20 20 2a 2a 20 73 65 74 20 74          ** set t
18fd0 68 65 20 50 35 20 70 61 72 61 6d 65 74 65 72 20  he P5 parameter 
18fe0 74 6f 20 74 68 65 20 4f 50 5f 43 6f 6c 75 6d 6e  to the OP_Column
18ff0 20 6f 70 63 6f 64 65 20 74 6f 20 4f 50 46 4c 41   opcode to OPFLA
19000 47 5f 4c 45 4e 47 54 48 41 52 47 0a 20 20 20 20  G_LENGTHARG.    
19010 20 20 20 20 2a 2a 20 6f 72 20 4f 50 46 4c 41 47      ** or OPFLAG
19020 5f 54 59 50 45 4f 46 41 52 47 20 72 65 73 70 65  _TYPEOFARG respe
19030 63 74 69 76 65 6c 79 2c 20 74 6f 20 61 76 6f 69  ctively, to avoi
19040 64 20 75 6e 6e 65 63 65 73 73 61 72 79 20 64 61  d unnecessary da
19050 74 61 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c 6f  ta.        ** lo
19060 61 64 69 6e 67 2e 0a 20 20 20 20 20 20 20 20 2a  ading..        *
19070 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70  /.        if( (p
19080 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26  Def->funcFlags &
19090 20 28 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4c 45   (SQLITE_FUNC_LE
190a0 4e 47 54 48 7c 53 51 4c 49 54 45 5f 46 55 4e 43  NGTH|SQLITE_FUNC
190b0 5f 54 59 50 45 4f 46 29 29 21 3d 30 20 29 7b 0a  _TYPEOF))!=0 ){.
190c0 20 20 20 20 20 20 20 20 20 20 75 38 20 65 78 70            u8 exp
190d0 72 4f 70 3b 0a 20 20 20 20 20 20 20 20 20 20 61  rOp;.          a
190e0 73 73 65 72 74 28 20 6e 46 61 72 67 3d 3d 31 20  ssert( nFarg==1 
190f0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  );.          ass
19100 65 72 74 28 20 70 46 61 72 67 2d 3e 61 5b 30 5d  ert( pFarg->a[0]
19110 2e 70 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 20  .pExpr!=0 );.   
19120 20 20 20 20 20 20 20 65 78 70 72 4f 70 20 3d 20         exprOp = 
19130 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70  pFarg->a[0].pExp
19140 72 2d 3e 6f 70 3b 0a 20 20 20 20 20 20 20 20 20  r->op;.         
19150 20 69 66 28 20 65 78 70 72 4f 70 3d 3d 54 4b 5f   if( exprOp==TK_
19160 43 4f 4c 55 4d 4e 20 7c 7c 20 65 78 70 72 4f 70  COLUMN || exprOp
19170 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20  ==TK_AGG_COLUMN 
19180 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  ){.            a
19190 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 46 55  ssert( SQLITE_FU
191a0 4e 43 5f 4c 45 4e 47 54 48 3d 3d 4f 50 46 4c 41  NC_LENGTH==OPFLA
191b0 47 5f 4c 45 4e 47 54 48 41 52 47 20 29 3b 0a 20  G_LENGTHARG );. 
191c0 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
191d0 74 28 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 54  t( SQLITE_FUNC_T
191e0 59 50 45 4f 46 3d 3d 4f 50 46 4c 41 47 5f 54 59  YPEOF==OPFLAG_TY
191f0 50 45 4f 46 41 52 47 20 29 3b 0a 20 20 20 20 20  PEOFARG );.     
19200 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
19210 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73   pDef->funcFlags
19220 20 26 20 4f 50 46 4c 41 47 5f 4c 45 4e 47 54 48   & OPFLAG_LENGTH
19230 41 52 47 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ARG );.         
19240 20 20 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70     pFarg->a[0].p
19250 45 78 70 72 2d 3e 6f 70 32 20 3d 20 0a 20 20 20  Expr->op2 = .   
19260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
19270 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26  Def->funcFlags &
19280 20 28 4f 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41   (OPFLAG_LENGTHA
19290 52 47 7c 4f 50 46 4c 41 47 5f 54 59 50 45 4f 46  RG|OPFLAG_TYPEOF
192a0 41 52 47 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ARG);.          
192b0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  }.        }..   
192c0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
192d0 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65  CachePush(pParse
192e0 29 3b 20 20 20 20 20 2f 2a 20 54 69 63 6b 65 74  );     /* Ticket
192f0 20 32 65 61 32 34 32 35 64 33 34 62 65 20 2a 2f   2ea2425d34be */
19300 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
19310 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74  ExprCodeExprList
19320 28 70 50 61 72 73 65 2c 20 70 46 61 72 67 2c 20  (pParse, pFarg, 
19330 72 31 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20  r1, 0,.         
19340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19350 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 45 43         SQLITE_EC
19360 45 4c 5f 44 55 50 7c 53 51 4c 49 54 45 5f 45 43  EL_DUP|SQLITE_EC
19370 45 4c 5f 46 41 43 54 4f 52 29 3b 0a 20 20 20 20  EL_FACTOR);.    
19380 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
19390 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b  achePop(pParse);
193a0 20 20 20 20 20 20 2f 2a 20 54 69 63 6b 65 74 20        /* Ticket 
193b0 32 65 61 32 34 32 35 64 33 34 62 65 20 2a 2f 0a  2ea2425d34be */.
193c0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
193d0 20 20 20 20 20 72 31 20 3d 20 30 3b 0a 20 20 20       r1 = 0;.   
193e0 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
193f0 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
19400 54 41 42 4c 45 0a 20 20 20 20 20 20 2f 2a 20 50  TABLE.      /* P
19410 6f 73 73 69 62 6c 79 20 6f 76 65 72 6c 6f 61 64  ossibly overload
19420 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 69 66   the function if
19430 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
19440 65 6e 74 20 69 73 0a 20 20 20 20 20 20 2a 2a 20  ent is.      ** 
19450 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  a virtual table 
19460 63 6f 6c 75 6d 6e 2e 0a 20 20 20 20 20 20 2a 2a  column..      **
19470 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72 20 69 6e  .      ** For in
19480 66 69 78 20 66 75 6e 63 74 69 6f 6e 73 20 28 4c  fix functions (L
19490 49 4b 45 2c 20 47 4c 4f 42 2c 20 52 45 47 45 58  IKE, GLOB, REGEX
194a0 50 2c 20 61 6e 64 20 4d 41 54 43 48 29 20 75 73  P, and MATCH) us
194b0 65 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 73  e the.      ** s
194c0 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 20  econd argument, 
194d0 6e 6f 74 20 74 68 65 20 66 69 72 73 74 2c 20 61  not the first, a
194e0 73 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 74  s the argument t
194f0 6f 20 74 65 73 74 20 74 6f 0a 20 20 20 20 20 20  o test to.      
19500 2a 2a 20 73 65 65 20 69 66 20 69 74 20 69 73 20  ** see if it is 
19510 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 61 20 76 69  a column in a vi
19520 72 74 75 61 6c 20 74 61 62 6c 65 2e 20 20 54 68  rtual table.  Th
19530 69 73 20 69 73 20 64 6f 6e 65 20 62 65 63 61 75  is is done becau
19540 73 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  se.      ** the 
19550 6c 65 66 74 20 6f 70 65 72 61 6e 64 20 6f 66 20  left operand of 
19560 69 6e 66 69 78 20 66 75 6e 63 74 69 6f 6e 73 20  infix functions 
19570 28 74 68 65 20 6f 70 65 72 61 6e 64 20 77 65 20  (the operand we 
19580 77 61 6e 74 20 74 6f 0a 20 20 20 20 20 20 2a 2a  want to.      **
19590 20 63 6f 6e 74 72 6f 6c 20 6f 76 65 72 6c 6f 61   control overloa
195a0 64 69 6e 67 29 20 65 6e 64 73 20 75 70 20 61 73  ding) ends up as
195b0 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
195c0 6d 65 6e 74 20 74 6f 20 74 68 65 0a 20 20 20 20  ment to the.    
195d0 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 20 20    ** function.  
195e0 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 22  The expression "
195f0 41 20 67 6c 6f 62 20 42 22 20 69 73 20 65 71 75  A glob B" is equ
19600 69 76 61 6c 65 6e 74 20 74 6f 20 0a 20 20 20 20  ivalent to .    
19610 20 20 2a 2a 20 22 67 6c 6f 62 28 42 2c 41 29 2e    ** "glob(B,A).
19620 20 20 57 65 20 77 61 6e 74 20 74 6f 20 75 73 65    We want to use
19630 20 74 68 65 20 41 20 69 6e 20 22 41 20 67 6c 6f   the A in "A glo
19640 62 20 42 22 20 74 6f 20 74 65 73 74 0a 20 20 20  b B" to test.   
19650 20 20 20 2a 2a 20 66 6f 72 20 66 75 6e 63 74 69     ** for functi
19660 6f 6e 20 6f 76 65 72 6c 6f 61 64 69 6e 67 2e 20  on overloading. 
19670 20 42 75 74 20 77 65 20 75 73 65 20 74 68 65 20   But we use the 
19680 42 20 74 65 72 6d 20 69 6e 20 22 67 6c 6f 62 28  B term in "glob(
19690 42 2c 41 29 22 2e 0a 20 20 20 20 20 20 2a 2f 0a  B,A)"..      */.
196a0 20 20 20 20 20 20 69 66 28 20 6e 46 61 72 67 3e        if( nFarg>
196b0 3d 32 20 26 26 20 28 70 45 78 70 72 2d 3e 66 6c  =2 && (pExpr->fl
196c0 61 67 73 20 26 20 45 50 5f 49 6e 66 69 78 46 75  ags & EP_InfixFu
196d0 6e 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  nc) ){.        p
196e0 44 65 66 20 3d 20 73 71 6c 69 74 65 33 56 74 61  Def = sqlite3Vta
196f0 62 4f 76 65 72 6c 6f 61 64 46 75 6e 63 74 69 6f  bOverloadFunctio
19700 6e 28 64 62 2c 20 70 44 65 66 2c 20 6e 46 61 72  n(db, pDef, nFar
19710 67 2c 20 70 46 61 72 67 2d 3e 61 5b 31 5d 2e 70  g, pFarg->a[1].p
19720 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c  Expr);.      }el
19730 73 65 20 69 66 28 20 6e 46 61 72 67 3e 30 20 29  se if( nFarg>0 )
19740 7b 0a 20 20 20 20 20 20 20 20 70 44 65 66 20 3d  {.        pDef =
19750 20 73 71 6c 69 74 65 33 56 74 61 62 4f 76 65 72   sqlite3VtabOver
19760 6c 6f 61 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c  loadFunction(db,
19770 20 70 44 65 66 2c 20 6e 46 61 72 67 2c 20 70 46   pDef, nFarg, pF
19780 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29  arg->a[0].pExpr)
19790 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
197a0 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 66 2d  .      if( pDef-
197b0 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c  >funcFlags & SQL
197c0 49 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c  ITE_FUNC_NEEDCOL
197d0 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  L ){.        if(
197e0 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20   !pColl ) pColl 
197f0 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b  = db->pDfltColl;
19800 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65   .        sqlite
19810 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
19820 50 5f 43 6f 6c 6c 53 65 71 2c 20 30 2c 20 30 2c  P_CollSeq, 0, 0,
19830 20 30 2c 20 28 63 68 61 72 20 2a 29 70 43 6f 6c   0, (char *)pCol
19840 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a  l, P4_COLLSEQ);.
19850 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
19860 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
19870 76 2c 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 30 2c  v, OP_Function0,
19880 20 63 6f 6e 73 74 4d 61 73 6b 2c 20 72 31 2c 20   constMask, r1, 
19890 74 61 72 67 65 74 2c 0a 20 20 20 20 20 20 20 20  target,.        
198a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
198b0 28 63 68 61 72 2a 29 70 44 65 66 2c 20 50 34 5f  (char*)pDef, P4_
198c0 46 55 4e 43 44 45 46 29 3b 0a 20 20 20 20 20 20  FUNCDEF);.      
198d0 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
198e0 65 50 35 28 76 2c 20 28 75 38 29 6e 46 61 72 67  eP5(v, (u8)nFarg
198f0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 46 61  );.      if( nFa
19900 72 67 20 26 26 20 63 6f 6e 73 74 4d 61 73 6b 3d  rg && constMask=
19910 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
19920 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
19930 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 31  Range(pParse, r1
19940 2c 20 6e 46 61 72 67 29 3b 0a 20 20 20 20 20 20  , nFarg);.      
19950 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
19960 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
19970 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
19980 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58  Y.    case TK_EX
19990 49 53 54 53 3a 0a 20 20 20 20 63 61 73 65 20 54  ISTS:.    case T
199a0 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20  K_SELECT: {.    
199b0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
199c0 54 4b 5f 45 58 49 53 54 53 20 29 3b 0a 20 20 20  TK_EXISTS );.   
199d0 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
199e0 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 20 20  =TK_SELECT );.  
199f0 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69      inReg = sqli
19a00 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74  te3CodeSubselect
19a10 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
19a20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65  0, 0);.      bre
19a30 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
19a40 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20  se TK_IN: {.    
19a50 20 20 69 6e 74 20 64 65 73 74 49 66 46 61 6c 73    int destIfFals
19a60 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  e = sqlite3VdbeM
19a70 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
19a80 20 20 20 69 6e 74 20 64 65 73 74 49 66 4e 75 6c     int destIfNul
19a90 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  l = sqlite3VdbeM
19aa0 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
19ab0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
19ac0 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c  dOp2(v, OP_Null,
19ad0 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20   0, target);.   
19ae0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
19af0 64 65 49 4e 28 70 50 61 72 73 65 2c 20 70 45 78  deIN(pParse, pEx
19b00 70 72 2c 20 64 65 73 74 49 66 46 61 6c 73 65 2c  pr, destIfFalse,
19b10 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20   destIfNull);.  
19b20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
19b30 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
19b40 67 65 72 2c 20 31 2c 20 74 61 72 67 65 74 29 3b  ger, 1, target);
19b50 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
19b60 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
19b70 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a  , destIfFalse);.
19b80 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
19b90 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64  eAddOp2(v, OP_Ad
19ba0 64 49 6d 6d 2c 20 74 61 72 67 65 74 2c 20 30 29  dImm, target, 0)
19bb0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
19bc0 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
19bd0 76 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a  v, destIfNull);.
19be0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
19bf0 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
19c00 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
19c10 59 20 2a 2f 0a 0a 0a 20 20 20 20 2f 2a 0a 20 20  Y */...    /*.  
19c20 20 20 2a 2a 20 20 20 20 78 20 42 45 54 57 45 45    **    x BETWEE
19c30 4e 20 79 20 41 4e 44 20 7a 0a 20 20 20 20 2a 2a  N y AND z.    **
19c40 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20  .    ** This is 
19c50 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 0a 20 20  equivalent to.  
19c60 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 78    **.    **    x
19c70 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 0a 20 20 20  >=y AND x<=z.   
19c80 20 2a 2a 0a 20 20 20 20 2a 2a 20 58 20 69 73 20   **.    ** X is 
19c90 73 74 6f 72 65 64 20 69 6e 20 70 45 78 70 72 2d  stored in pExpr-
19ca0 3e 70 4c 65 66 74 2e 0a 20 20 20 20 2a 2a 20 59  >pLeft..    ** Y
19cb0 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70 45   is stored in pE
19cc0 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d  xpr->pList->a[0]
19cd0 2e 70 45 78 70 72 2e 0a 20 20 20 20 2a 2a 20 5a  .pExpr..    ** Z
19ce0 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70 45   is stored in pE
19cf0 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 31 5d  xpr->pList->a[1]
19d00 2e 70 45 78 70 72 2e 0a 20 20 20 20 2a 2f 0a 20  .pExpr..    */. 
19d10 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45     case TK_BETWE
19d20 45 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72  EN: {.      Expr
19d30 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d   *pLeft = pExpr-
19d40 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 73 74  >pLeft;.      st
19d50 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
19d60 65 6d 20 2a 70 4c 49 74 65 6d 20 3d 20 70 45 78  em *pLItem = pEx
19d70 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 3b 0a  pr->x.pList->a;.
19d80 20 20 20 20 20 20 45 78 70 72 20 2a 70 52 69 67        Expr *pRig
19d90 68 74 20 3d 20 70 4c 49 74 65 6d 2d 3e 70 45 78  ht = pLItem->pEx
19da0 70 72 3b 0a 0a 20 20 20 20 20 20 72 31 20 3d 20  pr;..      r1 = 
19db0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
19dc0 65 6d 70 28 70 50 61 72 73 65 2c 20 70 4c 65 66  emp(pParse, pLef
19dd0 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20  t, &regFree1);. 
19de0 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65       r2 = sqlite
19df0 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
19e00 61 72 73 65 2c 20 70 52 69 67 68 74 2c 20 26 72  arse, pRight, &r
19e10 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20  egFree2);.      
19e20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
19e30 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74  e1==0 );.      t
19e40 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
19e50 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 33  2==0 );.      r3
19e60 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
19e70 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
19e80 20 20 20 20 72 34 20 3d 20 73 71 6c 69 74 65 33      r4 = sqlite3
19e90 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
19ea0 65 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f  e);.      codeCo
19eb0 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 4c  mpare(pParse, pL
19ec0 65 66 74 2c 20 70 52 69 67 68 74 2c 20 4f 50 5f  eft, pRight, OP_
19ed0 47 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  Ge,.            
19ee0 20 20 20 20 20 20 72 31 2c 20 72 32 2c 20 72 33        r1, r2, r3
19ef0 2c 20 53 51 4c 49 54 45 5f 53 54 4f 52 45 50 32  , SQLITE_STOREP2
19f00 29 3b 20 20 56 64 62 65 43 6f 76 65 72 61 67 65  );  VdbeCoverage
19f10 28 76 29 3b 0a 20 20 20 20 20 20 70 4c 49 74 65  (v);.      pLIte
19f20 6d 2b 2b 3b 0a 20 20 20 20 20 20 70 52 69 67 68  m++;.      pRigh
19f30 74 20 3d 20 70 4c 49 74 65 6d 2d 3e 70 45 78 70  t = pLItem->pExp
19f40 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  r;.      sqlite3
19f50 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
19f60 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 32 29  Parse, regFree2)
19f70 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c  ;.      r2 = sql
19f80 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
19f90 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 2c  (pParse, pRight,
19fa0 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20   &regFree2);.   
19fb0 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
19fc0 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20  Free2==0 );.    
19fd0 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50    codeCompare(pP
19fe0 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 52 69  arse, pLeft, pRi
19ff0 67 68 74 2c 20 4f 50 5f 4c 65 2c 20 72 31 2c 20  ght, OP_Le, r1, 
1a000 72 32 2c 20 72 34 2c 20 53 51 4c 49 54 45 5f 53  r2, r4, SQLITE_S
1a010 54 4f 52 45 50 32 29 3b 0a 20 20 20 20 20 20 56  TOREP2);.      V
1a020 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
1a030 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1a040 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 41 6e  eAddOp3(v, OP_An
1a050 64 2c 20 72 33 2c 20 72 34 2c 20 74 61 72 67 65  d, r3, r4, targe
1a060 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
1a070 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
1a080 70 50 61 72 73 65 2c 20 72 33 29 3b 0a 20 20 20  pParse, r3);.   
1a090 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
1a0a0 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
1a0b0 20 72 34 29 3b 0a 20 20 20 20 20 20 62 72 65 61   r4);.      brea
1a0c0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
1a0d0 65 20 54 4b 5f 43 4f 4c 4c 41 54 45 3a 20 0a 20  e TK_COLLATE: . 
1a0e0 20 20 20 63 61 73 65 20 54 4b 5f 55 50 4c 55 53     case TK_UPLUS
1a0f0 3a 20 7b 0a 20 20 20 20 20 20 69 6e 52 65 67 20  : {.      inReg 
1a100 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
1a110 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20  eTarget(pParse, 
1a120 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 74 61  pExpr->pLeft, ta
1a130 72 67 65 74 29 3b 0a 20 20 20 20 20 20 62 72 65  rget);.      bre
1a140 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63  ak;.    }..    c
1a150 61 73 65 20 54 4b 5f 54 52 49 47 47 45 52 3a 20  ase TK_TRIGGER: 
1a160 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  {.      /* If th
1a170 65 20 6f 70 63 6f 64 65 20 69 73 20 54 4b 5f 54  e opcode is TK_T
1a180 52 49 47 47 45 52 2c 20 74 68 65 6e 20 74 68 65  RIGGER, then the
1a190 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61   expression is a
1a1a0 20 72 65 66 65 72 65 6e 63 65 0a 20 20 20 20 20   reference.     
1a1b0 20 2a 2a 20 74 6f 20 61 20 63 6f 6c 75 6d 6e 20   ** to a column 
1a1c0 69 6e 20 74 68 65 20 6e 65 77 2e 2a 20 6f 72 20  in the new.* or 
1a1d0 6f 6c 64 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62  old.* pseudo-tab
1a1e0 6c 65 73 20 61 76 61 69 6c 61 62 6c 65 20 74 6f  les available to
1a1f0 0a 20 20 20 20 20 20 2a 2a 20 74 72 69 67 67 65  .      ** trigge
1a200 72 20 70 72 6f 67 72 61 6d 73 2e 20 49 6e 20 74  r programs. In t
1a210 68 69 73 20 63 61 73 65 20 45 78 70 72 2e 69 54  his case Expr.iT
1a220 61 62 6c 65 20 69 73 20 73 65 74 20 74 6f 20 31  able is set to 1
1a230 20 66 6f 72 20 74 68 65 0a 20 20 20 20 20 20 2a   for the.      *
1a240 2a 20 6e 65 77 2e 2a 20 70 73 65 75 64 6f 2d 74  * new.* pseudo-t
1a250 61 62 6c 65 2c 20 6f 72 20 30 20 66 6f 72 20 74  able, or 0 for t
1a260 68 65 20 6f 6c 64 2e 2a 20 70 73 65 75 64 6f 2d  he old.* pseudo-
1a270 74 61 62 6c 65 2e 20 45 78 70 72 2e 69 43 6f 6c  table. Expr.iCol
1a280 75 6d 6e 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  umn.      ** is 
1a290 73 65 74 20 74 6f 20 74 68 65 20 63 6f 6c 75 6d  set to the colum
1a2a0 6e 20 6f 66 20 74 68 65 20 70 73 65 75 64 6f 2d  n of the pseudo-
1a2b0 74 61 62 6c 65 20 74 6f 20 72 65 61 64 2c 20 6f  table to read, o
1a2c0 72 20 74 6f 20 2d 31 20 74 6f 0a 20 20 20 20 20  r to -1 to.     
1a2d0 20 2a 2a 20 72 65 61 64 20 74 68 65 20 72 6f 77   ** read the row
1a2e0 69 64 20 66 69 65 6c 64 2e 0a 20 20 20 20 20 20  id field..      
1a2f0 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 20  **.      ** The 
1a300 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 69 6d  expression is im
1a310 70 6c 65 6d 65 6e 74 65 64 20 75 73 69 6e 67 20  plemented using 
1a320 61 6e 20 4f 50 5f 50 61 72 61 6d 20 6f 70 63 6f  an OP_Param opco
1a330 64 65 2e 20 54 68 65 20 70 31 0a 20 20 20 20 20  de. The p1.     
1a340 20 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73   ** parameter is
1a350 20 73 65 74 20 74 6f 20 30 20 66 6f 72 20 61 6e   set to 0 for an
1a360 20 6f 6c 64 2e 72 6f 77 69 64 20 72 65 66 65 72   old.rowid refer
1a370 65 6e 63 65 2c 20 6f 72 20 74 6f 20 28 69 2b 31  ence, or to (i+1
1a380 29 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 72 65  ).      ** to re
1a390 66 65 72 65 6e 63 65 20 61 6e 6f 74 68 65 72 20  ference another 
1a3a0 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 6f 6c  column of the ol
1a3b0 64 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65  d.* pseudo-table
1a3c0 2c 20 77 68 65 72 65 20 0a 20 20 20 20 20 20 2a  , where .      *
1a3d0 2a 20 69 20 69 73 20 74 68 65 20 69 6e 64 65 78  * i is the index
1a3e0 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2e 20   of the column. 
1a3f0 46 6f 72 20 61 20 6e 65 77 2e 72 6f 77 69 64 20  For a new.rowid 
1a400 72 65 66 65 72 65 6e 63 65 2c 20 70 31 20 69 73  reference, p1 is
1a410 0a 20 20 20 20 20 20 2a 2a 20 73 65 74 20 74 6f  .      ** set to
1a420 20 28 6e 2b 31 29 2c 20 77 68 65 72 65 20 6e 20   (n+1), where n 
1a430 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
1a440 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 65 61 63 68   columns in each
1a450 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2e 0a 20   pseudo-table.. 
1a460 20 20 20 20 20 2a 2a 20 46 6f 72 20 61 20 72 65       ** For a re
1a470 66 65 72 65 6e 63 65 20 74 6f 20 61 6e 79 20 6f  ference to any o
1a480 74 68 65 72 20 63 6f 6c 75 6d 6e 20 69 6e 20 74  ther column in t
1a490 68 65 20 6e 65 77 2e 2a 20 70 73 65 75 64 6f 2d  he new.* pseudo-
1a4a0 74 61 62 6c 65 2c 20 70 31 0a 20 20 20 20 20 20  table, p1.      
1a4b0 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 28 6e 2b  ** is set to (n+
1a4c0 32 2b 69 29 2c 20 77 68 65 72 65 20 6e 20 61 6e  2+i), where n an
1a4d0 64 20 69 20 61 72 65 20 61 73 20 64 65 66 69 6e  d i are as defin
1a4e0 65 64 20 70 72 65 76 69 6f 75 73 6c 79 2e 20 46  ed previously. F
1a4f0 6f 72 0a 20 20 20 20 20 20 2a 2a 20 65 78 61 6d  or.      ** exam
1a500 70 6c 65 2c 20 69 66 20 74 68 65 20 74 61 62 6c  ple, if the tabl
1a510 65 20 6f 6e 20 77 68 69 63 68 20 74 72 69 67 67  e on which trigg
1a520 65 72 73 20 61 72 65 20 62 65 69 6e 67 20 66 69  ers are being fi
1a530 72 65 64 20 69 73 0a 20 20 20 20 20 20 2a 2a 20  red is.      ** 
1a540 64 65 63 6c 61 72 65 64 20 61 73 3a 0a 20 20 20  declared as:.   
1a550 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20     **.      **  
1a560 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
1a570 28 61 2c 20 62 29 3b 0a 20 20 20 20 20 20 2a 2a  (a, b);.      **
1a580 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 6e 20 70  .      ** Then p
1a590 31 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64  1 is interpreted
1a5a0 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20   as follows:.   
1a5b0 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20     **.      **  
1a5c0 20 70 31 3d 3d 30 20 20 20 2d 3e 20 20 20 20 6f   p1==0   ->    o
1a5d0 6c 64 2e 72 6f 77 69 64 20 20 20 20 20 70 31 3d  ld.rowid     p1=
1a5e0 3d 33 20 20 20 2d 3e 20 20 20 20 6e 65 77 2e 72  =3   ->    new.r
1a5f0 6f 77 69 64 0a 20 20 20 20 20 20 2a 2a 20 20 20  owid.      **   
1a600 70 31 3d 3d 31 20 20 20 2d 3e 20 20 20 20 6f 6c  p1==1   ->    ol
1a610 64 2e 61 20 20 20 20 20 20 20 20 20 70 31 3d 3d  d.a         p1==
1a620 34 20 20 20 2d 3e 20 20 20 20 6e 65 77 2e 61 0a  4   ->    new.a.
1a630 20 20 20 20 20 20 2a 2a 20 20 20 70 31 3d 3d 32        **   p1==2
1a640 20 20 20 2d 3e 20 20 20 20 6f 6c 64 2e 62 20 20     ->    old.b  
1a650 20 20 20 20 20 20 20 70 31 3d 3d 35 20 20 20 2d         p1==5   -
1a660 3e 20 20 20 20 6e 65 77 2e 62 20 20 20 20 20 20  >    new.b      
1a670 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20   .      */.     
1a680 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
1a690 45 78 70 72 2d 3e 70 54 61 62 3b 0a 20 20 20 20  Expr->pTab;.    
1a6a0 20 20 69 6e 74 20 70 31 20 3d 20 70 45 78 70 72    int p1 = pExpr
1a6b0 2d 3e 69 54 61 62 6c 65 20 2a 20 28 70 54 61 62  ->iTable * (pTab
1a6c0 2d 3e 6e 43 6f 6c 2b 31 29 20 2b 20 31 20 2b 20  ->nCol+1) + 1 + 
1a6d0 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a  pExpr->iColumn;.
1a6e0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1a6f0 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 30 20  Expr->iTable==0 
1a700 7c 7c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  || pExpr->iTable
1a710 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ==1 );.      ass
1a720 65 72 74 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c  ert( pExpr->iCol
1a730 75 6d 6e 3e 3d 2d 31 20 26 26 20 70 45 78 70 72  umn>=-1 && pExpr
1a740 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 54 61 62 2d 3e  ->iColumn<pTab->
1a750 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20 61 73  nCol );.      as
1a760 73 65 72 74 28 20 70 54 61 62 2d 3e 69 50 4b 65  sert( pTab->iPKe
1a770 79 3c 30 20 7c 7c 20 70 45 78 70 72 2d 3e 69 43  y<0 || pExpr->iC
1a780 6f 6c 75 6d 6e 21 3d 70 54 61 62 2d 3e 69 50 4b  olumn!=pTab->iPK
1a790 65 79 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ey );.      asse
1a7a0 72 74 28 20 70 31 3e 3d 30 20 26 26 20 70 31 3c  rt( p1>=0 && p1<
1a7b0 28 70 54 61 62 2d 3e 6e 43 6f 6c 2a 32 2b 32 29  (pTab->nCol*2+2)
1a7c0 20 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74   );..      sqlit
1a7d0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1a7e0 4f 50 5f 50 61 72 61 6d 2c 20 70 31 2c 20 74 61  OP_Param, p1, ta
1a7f0 72 67 65 74 29 3b 0a 20 20 20 20 20 20 56 64 62  rget);.      Vdb
1a800 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73  eComment((v, "%s
1a810 2e 25 73 20 2d 3e 20 24 25 64 22 2c 0a 20 20 20  .%s -> $%d",.   
1a820 20 20 20 20 20 28 70 45 78 70 72 2d 3e 69 54 61       (pExpr->iTa
1a830 62 6c 65 20 3f 20 22 6e 65 77 22 20 3a 20 22 6f  ble ? "new" : "o
1a840 6c 64 22 29 2c 0a 20 20 20 20 20 20 20 20 28 70  ld"),.        (p
1a850 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20  Expr->iColumn<0 
1a860 3f 20 22 72 6f 77 69 64 22 20 3a 20 70 45 78 70  ? "rowid" : pExp
1a870 72 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 45  r->pTab->aCol[pE
1a880 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 7a 4e  xpr->iColumn].zN
1a890 61 6d 65 29 2c 0a 20 20 20 20 20 20 20 20 74 61  ame),.        ta
1a8a0 72 67 65 74 0a 20 20 20 20 20 20 29 29 3b 0a 0a  rget.      ));..
1a8b0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1a8c0 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49  MIT_FLOATING_POI
1a8d0 4e 54 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  NT.      /* If t
1a8e0 68 65 20 63 6f 6c 75 6d 6e 20 68 61 73 20 52 45  he column has RE
1a8f0 41 4c 20 61 66 66 69 6e 69 74 79 2c 20 69 74 20  AL affinity, it 
1a900 6d 61 79 20 63 75 72 72 65 6e 74 6c 79 20 62 65  may currently be
1a910 20 73 74 6f 72 65 64 20 61 73 20 61 6e 0a 20 20   stored as an.  
1a920 20 20 20 20 2a 2a 20 69 6e 74 65 67 65 72 2e 20      ** integer. 
1a930 55 73 65 20 4f 50 5f 52 65 61 6c 41 66 66 69 6e  Use OP_RealAffin
1a940 69 74 79 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  ity to make sure
1a950 20 69 74 20 69 73 20 72 65 61 6c 6c 79 20 72 65   it is really re
1a960 61 6c 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  al..      **.   
1a970 20 20 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f     ** EVIDENCE-O
1a980 46 3a 20 52 2d 36 30 39 38 35 2d 35 37 36 36 32  F: R-60985-57662
1a990 20 53 51 4c 69 74 65 20 77 69 6c 6c 20 63 6f 6e   SQLite will con
1a9a0 76 65 72 74 20 74 68 65 20 76 61 6c 75 65 20 62  vert the value b
1a9b0 61 63 6b 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  ack to.      ** 
1a9c0 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 77  floating point w
1a9d0 68 65 6e 20 65 78 74 72 61 63 74 69 6e 67 20 69  hen extracting i
1a9e0 74 20 66 72 6f 6d 20 74 68 65 20 72 65 63 6f 72  t from the recor
1a9f0 64 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  d.  */.      if(
1aa00 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e   pExpr->iColumn>
1aa10 3d 30 20 0a 20 20 20 20 20 20 20 26 26 20 70 54  =0 .       && pT
1aa20 61 62 2d 3e 61 43 6f 6c 5b 70 45 78 70 72 2d 3e  ab->aCol[pExpr->
1aa30 69 43 6f 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69 74  iColumn].affinit
1aa40 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52 45  y==SQLITE_AFF_RE
1aa50 41 4c 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  AL.      ){.    
1aa60 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1aa70 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 61 6c  ddOp1(v, OP_Real
1aa80 41 66 66 69 6e 69 74 79 2c 20 74 61 72 67 65 74  Affinity, target
1aa90 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
1aaa0 66 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  f.      break;. 
1aab0 20 20 20 7d 0a 0a 0a 20 20 20 20 2f 2a 0a 20 20     }...    /*.  
1aac0 20 20 2a 2a 20 46 6f 72 6d 20 41 3a 0a 20 20 20    ** Form A:.   
1aad0 20 2a 2a 20 20 20 43 41 53 45 20 78 20 57 48 45   **   CASE x WHE
1aae0 4e 20 65 31 20 54 48 45 4e 20 72 31 20 57 48 45  N e1 THEN r1 WHE
1aaf0 4e 20 65 32 20 54 48 45 4e 20 72 32 20 2e 2e 2e  N e2 THEN r2 ...
1ab00 20 57 48 45 4e 20 65 4e 20 54 48 45 4e 20 72 4e   WHEN eN THEN rN
1ab10 20 45 4c 53 45 20 79 20 45 4e 44 0a 20 20 20 20   ELSE y END.    
1ab20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 6d 20 42  **.    ** Form B
1ab30 3a 0a 20 20 20 20 2a 2a 20 20 20 43 41 53 45 20  :.    **   CASE 
1ab40 57 48 45 4e 20 65 31 20 54 48 45 4e 20 72 31 20  WHEN e1 THEN r1 
1ab50 57 48 45 4e 20 65 32 20 54 48 45 4e 20 72 32 20  WHEN e2 THEN r2 
1ab60 2e 2e 2e 20 57 48 45 4e 20 65 4e 20 54 48 45 4e  ... WHEN eN THEN
1ab70 20 72 4e 20 45 4c 53 45 20 79 20 45 4e 44 0a 20   rN ELSE y END. 
1ab80 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 72     **.    ** For
1ab90 6d 20 41 20 69 73 20 63 61 6e 20 62 65 20 74 72  m A is can be tr
1aba0 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74 6f 20 74  ansformed into t
1abb0 68 65 20 65 71 75 69 76 61 6c 65 6e 74 20 66 6f  he equivalent fo
1abc0 72 6d 20 42 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  rm B as follows:
1abd0 0a 20 20 20 20 2a 2a 20 20 20 43 41 53 45 20 57  .    **   CASE W
1abe0 48 45 4e 20 78 3d 65 31 20 54 48 45 4e 20 72 31  HEN x=e1 THEN r1
1abf0 20 57 48 45 4e 20 78 3d 65 32 20 54 48 45 4e 20   WHEN x=e2 THEN 
1ac00 72 32 20 2e 2e 2e 0a 20 20 20 20 2a 2a 20 20 20  r2 ....    **   
1ac10 20 20 20 20 20 57 48 45 4e 20 78 3d 65 4e 20 54       WHEN x=eN T
1ac20 48 45 4e 20 72 4e 20 45 4c 53 45 20 79 20 45 4e  HEN rN ELSE y EN
1ac30 44 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  D.    **.    ** 
1ac40 58 20 28 69 66 20 69 74 20 65 78 69 73 74 73 29  X (if it exists)
1ac50 20 69 73 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c   is in pExpr->pL
1ac60 65 66 74 2e 0a 20 20 20 20 2a 2a 20 59 20 69 73  eft..    ** Y is
1ac70 20 69 6e 20 74 68 65 20 6c 61 73 74 20 65 6c 65   in the last ele
1ac80 6d 65 6e 74 20 6f 66 20 70 45 78 70 72 2d 3e 78  ment of pExpr->x
1ac90 2e 70 4c 69 73 74 20 69 66 20 70 45 78 70 72 2d  .pList if pExpr-
1aca0 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20  >x.pList->nExpr 
1acb0 69 73 0a 20 20 20 20 2a 2a 20 6f 64 64 2e 20 20  is.    ** odd.  
1acc0 54 68 65 20 59 20 69 73 20 61 6c 73 6f 20 6f 70  The Y is also op
1acd0 74 69 6f 6e 61 6c 2e 20 20 49 66 20 74 68 65 20  tional.  If the 
1ace0 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e  number of elemen
1acf0 74 73 20 69 6e 20 78 2e 70 4c 69 73 74 0a 20 20  ts in x.pList.  
1ad00 20 20 2a 2a 20 69 73 20 65 76 65 6e 2c 20 74 68    ** is even, th
1ad10 65 6e 20 59 20 69 73 20 6f 6d 69 74 74 65 64 20  en Y is omitted 
1ad20 61 6e 64 20 74 68 65 20 22 6f 74 68 65 72 77 69  and the "otherwi
1ad30 73 65 22 20 72 65 73 75 6c 74 20 69 73 20 4e 55  se" result is NU
1ad40 4c 4c 2e 0a 20 20 20 20 2a 2a 20 45 69 20 69 73  LL..    ** Ei is
1ad50 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 69 73 74   in pExpr->pList
1ad60 2d 3e 61 5b 69 2a 32 5d 20 61 6e 64 20 52 69 20  ->a[i*2] and Ri 
1ad70 69 73 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d  is pExpr->pList-
1ad80 3e 61 5b 69 2a 32 2b 31 5d 2e 0a 20 20 20 20 2a  >a[i*2+1]..    *
1ad90 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 65 73  *.    ** The res
1ada0 75 6c 74 20 6f 66 20 74 68 65 20 65 78 70 72 65  ult of the expre
1adb0 73 73 69 6f 6e 20 69 73 20 74 68 65 20 52 69 20  ssion is the Ri 
1adc0 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 6d 61  for the first ma
1add0 74 63 68 69 6e 67 20 45 69 2c 0a 20 20 20 20 2a  tching Ei,.    *
1ade0 2a 20 6f 72 20 69 66 20 74 68 65 72 65 20 69 73  * or if there is
1adf0 20 6e 6f 20 6d 61 74 63 68 69 6e 67 20 45 69 2c   no matching Ei,
1ae00 20 74 68 65 20 45 4c 53 45 20 74 65 72 6d 20 59   the ELSE term Y
1ae10 2c 20 6f 72 20 69 66 20 74 68 65 72 65 20 69 73  , or if there is
1ae20 0a 20 20 20 20 2a 2a 20 6e 6f 20 45 4c 53 45 20  .    ** no ELSE 
1ae30 74 65 72 6d 2c 20 4e 55 4c 4c 2e 0a 20 20 20 20  term, NULL..    
1ae40 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20  */.    default: 
1ae50 61 73 73 65 72 74 28 20 6f 70 3d 3d 54 4b 5f 43  assert( op==TK_C
1ae60 41 53 45 20 29 3b 20 7b 0a 20 20 20 20 20 20 69  ASE ); {.      i
1ae70 6e 74 20 65 6e 64 4c 61 62 65 6c 3b 20 20 20 20  nt endLabel;    
1ae80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ae90 20 2f 2a 20 47 4f 54 4f 20 6c 61 62 65 6c 20 66   /* GOTO label f
1aea0 6f 72 20 65 6e 64 20 6f 66 20 43 41 53 45 20 73  or end of CASE s
1aeb0 74 6d 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  tmt */.      int
1aec0 20 6e 65 78 74 43 61 73 65 3b 20 20 20 20 20 20   nextCase;      
1aed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1aee0 2a 20 47 4f 54 4f 20 6c 61 62 65 6c 20 66 6f 72  * GOTO label for
1aef0 20 6e 65 78 74 20 57 48 45 4e 20 63 6c 61 75 73   next WHEN claus
1af00 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e  e */.      int n
1af10 45 78 70 72 3b 20 20 20 20 20 20 20 20 20 20 20  Expr;           
1af20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1af30 32 78 20 6e 75 6d 62 65 72 20 6f 66 20 57 48 45  2x number of WHE
1af40 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20  N terms */.     
1af50 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
1af60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1af70 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
1af80 65 72 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72  er */.      Expr
1af90 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 20 20 20  List *pEList;   
1afa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1afb0 20 4c 69 73 74 20 6f 66 20 57 48 45 4e 20 74 65   List of WHEN te
1afc0 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20 73 74 72  rms */.      str
1afd0 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
1afe0 6d 20 2a 61 4c 69 73 74 65 6c 65 6d 3b 20 20 2f  m *aListelem;  /
1aff0 2a 20 41 72 72 61 79 20 6f 66 20 57 48 45 4e 20  * Array of WHEN 
1b000 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20 45  terms */.      E
1b010 78 70 72 20 6f 70 43 6f 6d 70 61 72 65 3b 20 20  xpr opCompare;  
1b020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b030 20 2f 2a 20 54 68 65 20 58 3d 3d 45 69 20 65 78   /* The X==Ei ex
1b040 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20  pression */.    
1b050 20 20 45 78 70 72 20 2a 70 58 3b 20 20 20 20 20    Expr *pX;     
1b060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b070 20 20 20 20 2f 2a 20 54 68 65 20 58 20 65 78 70      /* The X exp
1b080 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  ression */.     
1b090 20 45 78 70 72 20 2a 70 54 65 73 74 20 3d 20 30   Expr *pTest = 0
1b0a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1b0b0 20 20 20 2f 2a 20 58 3d 3d 45 69 20 28 66 6f 72     /* X==Ei (for
1b0c0 6d 20 41 29 20 6f 72 20 6a 75 73 74 20 45 69 20  m A) or just Ei 
1b0d0 28 66 6f 72 6d 20 42 29 20 2a 2f 0a 20 20 20 20  (form B) */.    
1b0e0 20 20 56 56 41 5f 4f 4e 4c 59 28 20 69 6e 74 20    VVA_ONLY( int 
1b0f0 69 43 61 63 68 65 4c 65 76 65 6c 20 3d 20 70 50  iCacheLevel = pP
1b100 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65  arse->iCacheLeve
1b110 6c 3b 20 29 0a 0a 20 20 20 20 20 20 61 73 73 65  l; )..      asse
1b120 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
1b130 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78  erty(pExpr, EP_x
1b140 49 73 53 65 6c 65 63 74 29 20 26 26 20 70 45 78  IsSelect) && pEx
1b150 70 72 2d 3e 78 2e 70 4c 69 73 74 20 29 3b 0a 20  pr->x.pList );. 
1b160 20 20 20 20 20 61 73 73 65 72 74 28 70 45 78 70       assert(pExp
1b170 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70  r->x.pList->nExp
1b180 72 20 3e 20 30 29 3b 0a 20 20 20 20 20 20 70 45  r > 0);.      pE
1b190 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e  List = pExpr->x.
1b1a0 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 61 4c 69  pList;.      aLi
1b1b0 73 74 65 6c 65 6d 20 3d 20 70 45 4c 69 73 74 2d  stelem = pEList-
1b1c0 3e 61 3b 0a 20 20 20 20 20 20 6e 45 78 70 72 20  >a;.      nExpr 
1b1d0 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  = pEList->nExpr;
1b1e0 0a 20 20 20 20 20 20 65 6e 64 4c 61 62 65 6c 20  .      endLabel 
1b1f0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
1b200 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
1b210 20 69 66 28 20 28 70 58 20 3d 20 70 45 78 70 72   if( (pX = pExpr
1b220 2d 3e 70 4c 65 66 74 29 21 3d 30 20 29 7b 0a 20  ->pLeft)!=0 ){. 
1b230 20 20 20 20 20 20 20 74 65 6d 70 58 20 3d 20 2a         tempX = *
1b240 70 58 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  pX;.        test
1b250 63 61 73 65 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b  case( pX->op==TK
1b260 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20  _COLUMN );.     
1b270 20 20 20 65 78 70 72 54 6f 52 65 67 69 73 74 65     exprToRegiste
1b280 72 28 26 74 65 6d 70 58 2c 20 73 71 6c 69 74 65  r(&tempX, sqlite
1b290 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
1b2a0 61 72 73 65 2c 20 70 58 2c 20 26 72 65 67 46 72  arse, pX, &regFr
1b2b0 65 65 31 29 29 3b 0a 20 20 20 20 20 20 20 20 74  ee1));.        t
1b2c0 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
1b2d0 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  1==0 );.        
1b2e0 6f 70 43 6f 6d 70 61 72 65 2e 6f 70 20 3d 20 54  opCompare.op = T
1b2f0 4b 5f 45 51 3b 0a 20 20 20 20 20 20 20 20 6f 70  K_EQ;.        op
1b300 43 6f 6d 70 61 72 65 2e 70 4c 65 66 74 20 3d 20  Compare.pLeft = 
1b310 26 74 65 6d 70 58 3b 0a 20 20 20 20 20 20 20 20  &tempX;.        
1b320 70 54 65 73 74 20 3d 20 26 6f 70 43 6f 6d 70 61  pTest = &opCompa
1b330 72 65 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54  re;.        /* T
1b340 69 63 6b 65 74 20 62 33 35 31 64 39 35 66 39 63  icket b351d95f9c
1b350 64 35 65 66 31 37 65 39 64 39 64 62 61 65 31 38  d5ef17e9d9dbae18
1b360 66 35 63 61 38 36 31 31 31 39 30 30 30 31 3a 0a  f5ca8611190001:.
1b370 20 20 20 20 20 20 20 20 2a 2a 20 54 68 65 20 76          ** The v
1b380 61 6c 75 65 20 69 6e 20 72 65 67 46 72 65 65 31  alue in regFree1
1b390 20 6d 69 67 68 74 20 67 65 74 20 53 43 6f 70 79   might get SCopy
1b3a0 2d 65 64 20 69 6e 74 6f 20 74 68 65 20 66 69 6c  -ed into the fil
1b3b0 65 20 72 65 73 75 6c 74 2e 0a 20 20 20 20 20 20  e result..      
1b3c0 20 20 2a 2a 20 53 6f 20 6d 61 6b 65 20 73 75 72    ** So make sur
1b3d0 65 20 74 68 61 74 20 74 68 65 20 72 65 67 46 72  e that the regFr
1b3e0 65 65 31 20 72 65 67 69 73 74 65 72 20 69 73 20  ee1 register is 
1b3f0 6e 6f 74 20 72 65 75 73 65 64 20 66 6f 72 20 6f  not reused for o
1b400 74 68 65 72 0a 20 20 20 20 20 20 20 20 2a 2a 20  ther.        ** 
1b410 70 75 72 70 6f 73 65 73 20 61 6e 64 20 70 6f 73  purposes and pos
1b420 73 69 62 6c 79 20 6f 76 65 72 77 72 69 74 74 65  sibly overwritte
1b430 6e 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72  n.  */.        r
1b440 65 67 46 72 65 65 31 20 3d 20 30 3b 0a 20 20 20  egFree1 = 0;.   
1b450 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69     }.      for(i
1b460 3d 30 3b 20 69 3c 6e 45 78 70 72 2d 31 3b 20 69  =0; i<nExpr-1; i
1b470 3d 69 2b 32 29 7b 0a 20 20 20 20 20 20 20 20 73  =i+2){.        s
1b480 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
1b490 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20  ush(pParse);.   
1b4a0 20 20 20 20 20 69 66 28 20 70 58 20 29 7b 0a 20       if( pX ){. 
1b4b0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
1b4c0 20 70 54 65 73 74 21 3d 30 20 29 3b 0a 20 20 20   pTest!=0 );.   
1b4d0 20 20 20 20 20 20 20 6f 70 43 6f 6d 70 61 72 65         opCompare
1b4e0 2e 70 52 69 67 68 74 20 3d 20 61 4c 69 73 74 65  .pRight = aListe
1b4f0 6c 65 6d 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  lem[i].pExpr;.  
1b500 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1b510 20 20 20 20 20 20 20 70 54 65 73 74 20 3d 20 61         pTest = a
1b520 4c 69 73 74 65 6c 65 6d 5b 69 5d 2e 70 45 78 70  Listelem[i].pExp
1b530 72 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  r;.        }.   
1b540 20 20 20 20 20 6e 65 78 74 43 61 73 65 20 3d 20       nextCase = 
1b550 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
1b560 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20  abel(v);.       
1b570 20 74 65 73 74 63 61 73 65 28 20 70 54 65 73 74   testcase( pTest
1b580 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
1b590 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
1b5a0 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
1b5b0 61 72 73 65 2c 20 70 54 65 73 74 2c 20 6e 65 78  arse, pTest, nex
1b5c0 74 43 61 73 65 2c 20 53 51 4c 49 54 45 5f 4a 55  tCase, SQLITE_JU
1b5d0 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  MPIFNULL);.     
1b5e0 20 20 20 74 65 73 74 63 61 73 65 28 20 61 4c 69     testcase( aLi
1b5f0 73 74 65 6c 65 6d 5b 69 2b 31 5d 2e 70 45 78 70  stelem[i+1].pExp
1b600 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op==TK_COLUMN
1b610 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
1b620 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
1b630 73 65 2c 20 61 4c 69 73 74 65 6c 65 6d 5b 69 2b  se, aListelem[i+
1b640 31 5d 2e 70 45 78 70 72 2c 20 74 61 72 67 65 74  1].pExpr, target
1b650 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
1b660 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 65 6e  e3VdbeGoto(v, en
1b670 64 4c 61 62 65 6c 29 3b 0a 20 20 20 20 20 20 20  dLabel);.       
1b680 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
1b690 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20  ePop(pParse);.  
1b6a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1b6b0 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
1b6c0 20 6e 65 78 74 43 61 73 65 29 3b 0a 20 20 20 20   nextCase);.    
1b6d0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28 6e    }.      if( (n
1b6e0 45 78 70 72 26 31 29 21 3d 30 20 29 7b 0a 20 20  Expr&1)!=0 ){.  
1b6f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1b700 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73  rCachePush(pPars
1b710 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  e);.        sqli
1b720 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
1b730 73 65 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 6e 45  se, pEList->a[nE
1b740 78 70 72 2d 31 5d 2e 70 45 78 70 72 2c 20 74 61  xpr-1].pExpr, ta
1b750 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 73  rget);.        s
1b760 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
1b770 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  op(pParse);.    
1b780 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1b790 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1b7a0 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  p2(v, OP_Null, 0
1b7b0 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
1b7c0 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
1b7d0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
1b7e0 64 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72  d || pParse->nEr
1b7f0 72 3e 30 20 0a 20 20 20 20 20 20 20 20 20 20 20  r>0 .           
1b800 7c 7c 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68  || pParse->iCach
1b810 65 4c 65 76 65 6c 3d 3d 69 43 61 63 68 65 4c 65  eLevel==iCacheLe
1b820 76 65 6c 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  vel );.      sql
1b830 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
1b840 61 62 65 6c 28 76 2c 20 65 6e 64 4c 61 62 65 6c  abel(v, endLabel
1b850 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1b860 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
1b870 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45  LITE_OMIT_TRIGGE
1b880 52 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 41  R.    case TK_RA
1b890 49 53 45 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  ISE: {.      ass
1b8a0 65 72 74 28 20 70 45 78 70 72 2d 3e 61 66 66 69  ert( pExpr->affi
1b8b0 6e 69 74 79 3d 3d 4f 45 5f 52 6f 6c 6c 62 61 63  nity==OE_Rollbac
1b8c0 6b 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  k .           ||
1b8d0 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79   pExpr->affinity
1b8e0 3d 3d 4f 45 5f 41 62 6f 72 74 0a 20 20 20 20 20  ==OE_Abort.     
1b8f0 20 20 20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e        || pExpr->
1b900 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 46 61 69  affinity==OE_Fai
1b910 6c 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  l.           || 
1b920 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d  pExpr->affinity=
1b930 3d 4f 45 5f 49 67 6e 6f 72 65 0a 20 20 20 20 20  =OE_Ignore.     
1b940 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70   );.      if( !p
1b950 50 61 72 73 65 2d 3e 70 54 72 69 67 67 65 72 54  Parse->pTriggerT
1b960 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ab ){.        sq
1b970 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
1b980 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20  arse,.          
1b990 20 20 20 20 20 20 20 20 20 20 20 20 20 22 52 41               "RA
1b9a0 49 53 45 28 29 20 6d 61 79 20 6f 6e 6c 79 20 62  ISE() may only b
1b9b0 65 20 75 73 65 64 20 77 69 74 68 69 6e 20 61 20  e used within a 
1b9c0 74 72 69 67 67 65 72 2d 70 72 6f 67 72 61 6d 22  trigger-program"
1b9d0 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
1b9e0 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 0;.      }.   
1b9f0 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 61 66     if( pExpr->af
1ba00 66 69 6e 69 74 79 3d 3d 4f 45 5f 41 62 6f 72 74  finity==OE_Abort
1ba10 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
1ba20 74 65 33 4d 61 79 41 62 6f 72 74 28 70 50 61 72  te3MayAbort(pPar
1ba30 73 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  se);.      }.   
1ba40 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
1ba50 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
1ba60 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20  r, EP_IntValue) 
1ba70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78  );.      if( pEx
1ba80 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45  pr->affinity==OE
1ba90 5f 49 67 6e 6f 72 65 20 29 7b 0a 20 20 20 20 20  _Ignore ){.     
1baa0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1bab0 64 4f 70 34 28 0a 20 20 20 20 20 20 20 20 20 20  dOp4(.          
1bac0 20 20 76 2c 20 4f 50 5f 48 61 6c 74 2c 20 53 51    v, OP_Halt, SQ
1bad0 4c 49 54 45 5f 4f 4b 2c 20 4f 45 5f 49 67 6e 6f  LITE_OK, OE_Igno
1bae0 72 65 2c 20 30 2c 20 70 45 78 70 72 2d 3e 75 2e  re, 0, pExpr->u.
1baf0 7a 54 6f 6b 65 6e 2c 30 29 3b 0a 20 20 20 20 20  zToken,0);.     
1bb00 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
1bb10 76 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  v);.      }else{
1bb20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1bb30 48 61 6c 74 43 6f 6e 73 74 72 61 69 6e 74 28 70  HaltConstraint(p
1bb40 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 43 4f  Parse, SQLITE_CO
1bb50 4e 53 54 52 41 49 4e 54 5f 54 52 49 47 47 45 52  NSTRAINT_TRIGGER
1bb60 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1bb70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bb80 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 2c  pExpr->affinity,
1bb90 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
1bba0 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  , 0, 0);.      }
1bbb0 0a 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ..      break;. 
1bbc0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
1bbd0 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
1bbe0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
1bbf0 72 65 67 46 72 65 65 31 29 3b 0a 20 20 73 71 6c  regFree1);.  sql
1bc00 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
1bc10 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72  eg(pParse, regFr
1bc20 65 65 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 69  ee2);.  return i
1bc30 6e 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  nReg;.}../*.** F
1bc40 61 63 74 6f 72 20 6f 75 74 20 74 68 65 20 63 6f  actor out the co
1bc50 64 65 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20  de of the given 
1bc60 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 69 6e  expression to in
1bc70 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 74 69 6d  itialization tim
1bc80 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
1bc90 65 33 45 78 70 72 43 6f 64 65 41 74 49 6e 69 74  e3ExprCodeAtInit
1bca0 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
1bcb0 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67  e,    /* Parsing
1bcc0 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
1bcd0 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20  pr *pExpr,      
1bce0 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  /* The expressio
1bcf0 6e 20 74 6f 20 63 6f 64 65 20 77 68 65 6e 20 74  n to code when t
1bd00 68 65 20 56 44 42 45 20 69 6e 69 74 69 61 6c 69  he VDBE initiali
1bd10 7a 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  zes */.  int reg
1bd20 44 65 73 74 2c 20 20 20 20 20 20 2f 2a 20 53 74  Dest,      /* St
1bd30 6f 72 65 20 74 68 65 20 76 61 6c 75 65 20 69 6e  ore the value in
1bd40 20 74 68 69 73 20 72 65 67 69 73 74 65 72 20 2a   this register *
1bd50 2f 0a 20 20 75 38 20 72 65 75 73 61 62 6c 65 20  /.  u8 reusable 
1bd60 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
1bd70 20 74 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e   this expression
1bd80 20 69 73 20 72 65 75 73 61 62 6c 65 20 2a 2f 0a   is reusable */.
1bd90 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  ){.  ExprList *p
1bda0 3b 0a 20 20 61 73 73 65 72 74 28 20 43 6f 6e 73  ;.  assert( Cons
1bdb0 74 46 61 63 74 6f 72 4f 6b 28 70 50 61 72 73 65  tFactorOk(pParse
1bdc0 29 20 29 3b 0a 20 20 70 20 3d 20 70 50 61 72 73  ) );.  p = pPars
1bdd0 65 2d 3e 70 43 6f 6e 73 74 45 78 70 72 3b 0a 20  e->pConstExpr;. 
1bde0 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33   pExpr = sqlite3
1bdf0 45 78 70 72 44 75 70 28 70 50 61 72 73 65 2d 3e  ExprDup(pParse->
1be00 64 62 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20  db, pExpr, 0);. 
1be10 20 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72   p = sqlite3Expr
1be20 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73  ListAppend(pPars
1be30 65 2c 20 70 2c 20 70 45 78 70 72 29 3b 0a 20 20  e, p, pExpr);.  
1be40 69 66 28 20 70 20 29 7b 0a 20 20 20 20 20 73 74  if( p ){.     st
1be50 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
1be60 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 2d 3e  em *pItem = &p->
1be70 61 5b 70 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20  a[p->nExpr-1];. 
1be80 20 20 20 20 70 49 74 65 6d 2d 3e 75 2e 69 43 6f      pItem->u.iCo
1be90 6e 73 74 45 78 70 72 52 65 67 20 3d 20 72 65 67  nstExprReg = reg
1bea0 44 65 73 74 3b 0a 20 20 20 20 20 70 49 74 65 6d  Dest;.     pItem
1beb0 2d 3e 72 65 75 73 61 62 6c 65 20 3d 20 72 65 75  ->reusable = reu
1bec0 73 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 70 50 61  sable;.  }.  pPa
1bed0 72 73 65 2d 3e 70 43 6f 6e 73 74 45 78 70 72 20  rse->pConstExpr 
1bee0 3d 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  = p;.}../*.** Ge
1bef0 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 65  nerate code to e
1bf00 76 61 6c 75 61 74 65 20 61 6e 20 65 78 70 72 65  valuate an expre
1bf10 73 73 69 6f 6e 20 61 6e 64 20 73 74 6f 72 65 20  ssion and store 
1bf20 74 68 65 20 72 65 73 75 6c 74 73 0a 2a 2a 20 69  the results.** i
1bf30 6e 74 6f 20 61 20 72 65 67 69 73 74 65 72 2e 20  nto a register. 
1bf40 20 52 65 74 75 72 6e 20 74 68 65 20 72 65 67 69   Return the regi
1bf50 73 74 65 72 20 6e 75 6d 62 65 72 20 77 68 65 72  ster number wher
1bf60 65 20 74 68 65 20 72 65 73 75 6c 74 73 0a 2a 2a  e the results.**
1bf70 20 61 72 65 20 73 74 6f 72 65 64 2e 0a 2a 2a 0a   are stored..**.
1bf80 2a 2a 20 49 66 20 74 68 65 20 72 65 67 69 73 74  ** If the regist
1bf90 65 72 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72  er is a temporar
1bfa0 79 20 72 65 67 69 73 74 65 72 20 74 68 61 74 20  y register that 
1bfb0 63 61 6e 20 62 65 20 64 65 61 6c 6c 6f 63 61 74  can be deallocat
1bfc0 65 64 2c 0a 2a 2a 20 74 68 65 6e 20 77 72 69 74  ed,.** then writ
1bfd0 65 20 69 74 73 20 6e 75 6d 62 65 72 20 69 6e 74  e its number int
1bfe0 6f 20 2a 70 52 65 67 2e 20 20 49 66 20 74 68 65  o *pReg.  If the
1bff0 20 72 65 73 75 6c 74 20 72 65 67 69 73 74 65 72   result register
1c000 20 69 73 20 6e 6f 74 0a 2a 2a 20 61 20 74 65 6d   is not.** a tem
1c010 70 6f 72 61 72 79 2c 20 74 68 65 6e 20 73 65 74  porary, then set
1c020 20 2a 70 52 65 67 20 74 6f 20 7a 65 72 6f 2e 0a   *pReg to zero..
1c030 2a 2a 0a 2a 2a 20 49 66 20 70 45 78 70 72 20 69  **.** If pExpr i
1c040 73 20 61 20 63 6f 6e 73 74 61 6e 74 2c 20 74 68  s a constant, th
1c050 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
1c060 6d 69 67 68 74 20 67 65 6e 65 72 61 74 65 20 74  might generate t
1c070 68 69 73 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 66  his.** code to f
1c080 69 6c 6c 20 74 68 65 20 72 65 67 69 73 74 65 72  ill the register
1c090 20 69 6e 20 74 68 65 20 69 6e 69 74 69 61 6c 69   in the initiali
1c0a0 7a 61 74 69 6f 6e 20 73 65 63 74 69 6f 6e 20 6f  zation section o
1c0b0 66 20 74 68 65 0a 2a 2a 20 56 44 42 45 20 70 72  f the.** VDBE pr
1c0c0 6f 67 72 61 6d 2c 20 69 6e 20 6f 72 64 65 72 20  ogram, in order 
1c0d0 74 6f 20 66 61 63 74 6f 72 20 69 74 20 6f 75 74  to factor it out
1c0e0 20 6f 66 20 74 68 65 20 65 76 61 6c 75 61 74 69   of the evaluati
1c0f0 6f 6e 20 6c 6f 6f 70 2e 0a 2a 2f 0a 69 6e 74 20  on loop..*/.int 
1c100 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
1c110 65 6d 70 28 50 61 72 73 65 20 2a 70 50 61 72 73  emp(Parse *pPars
1c120 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  e, Expr *pExpr, 
1c130 69 6e 74 20 2a 70 52 65 67 29 7b 0a 20 20 69 6e  int *pReg){.  in
1c140 74 20 72 32 3b 0a 20 20 70 45 78 70 72 20 3d 20  t r2;.  pExpr = 
1c150 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43  sqlite3ExprSkipC
1c160 6f 6c 6c 61 74 65 28 70 45 78 70 72 29 3b 0a 20  ollate(pExpr);. 
1c170 20 69 66 28 20 43 6f 6e 73 74 46 61 63 74 6f 72   if( ConstFactor
1c180 4f 6b 28 70 50 61 72 73 65 29 0a 20 20 20 26 26  Ok(pParse).   &&
1c190 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 52   pExpr->op!=TK_R
1c1a0 45 47 49 53 54 45 52 0a 20 20 20 26 26 20 73 71  EGISTER.   && sq
1c1b0 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
1c1c0 61 6e 74 4e 6f 74 4a 6f 69 6e 28 70 45 78 70 72  antNotJoin(pExpr
1c1d0 29 0a 20 20 29 7b 0a 20 20 20 20 45 78 70 72 4c  ).  ){.    ExprL
1c1e0 69 73 74 20 2a 70 20 3d 20 70 50 61 72 73 65 2d  ist *p = pParse-
1c1f0 3e 70 43 6f 6e 73 74 45 78 70 72 3b 0a 20 20 20  >pConstExpr;.   
1c200 20 69 6e 74 20 69 3b 0a 20 20 20 20 2a 70 52 65   int i;.    *pRe
1c210 67 20 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  g  = 0;.    if( 
1c220 70 20 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63  p ){.      struc
1c230 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
1c240 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 66 6f  *pItem;.      fo
1c250 72 28 70 49 74 65 6d 3d 70 2d 3e 61 2c 20 69 3d  r(pItem=p->a, i=
1c260 70 2d 3e 6e 45 78 70 72 3b 20 69 3e 30 3b 20 70  p->nExpr; i>0; p
1c270 49 74 65 6d 2b 2b 2c 20 69 2d 2d 29 7b 0a 20 20  Item++, i--){.  
1c280 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d        if( pItem-
1c290 3e 72 65 75 73 61 62 6c 65 20 26 26 20 73 71 6c  >reusable && sql
1c2a0 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28  ite3ExprCompare(
1c2b0 70 49 74 65 6d 2d 3e 70 45 78 70 72 2c 70 45 78  pItem->pExpr,pEx
1c2c0 70 72 2c 2d 31 29 3d 3d 30 20 29 7b 0a 20 20 20  pr,-1)==0 ){.   
1c2d0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 49         return pI
1c2e0 74 65 6d 2d 3e 75 2e 69 43 6f 6e 73 74 45 78 70  tem->u.iConstExp
1c2f0 72 52 65 67 3b 0a 20 20 20 20 20 20 20 20 7d 0a  rReg;.        }.
1c300 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1c310 20 20 72 32 20 3d 20 2b 2b 70 50 61 72 73 65 2d    r2 = ++pParse-
1c320 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74  >nMem;.    sqlit
1c330 65 33 45 78 70 72 43 6f 64 65 41 74 49 6e 69 74  e3ExprCodeAtInit
1c340 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
1c350 72 32 2c 20 31 29 3b 0a 20 20 7d 65 6c 73 65 7b  r2, 1);.  }else{
1c360 0a 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71  .    int r1 = sq
1c370 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
1c380 70 50 61 72 73 65 29 3b 0a 20 20 20 20 72 32 20  pParse);.    r2 
1c390 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
1c3a0 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20  eTarget(pParse, 
1c3b0 70 45 78 70 72 2c 20 72 31 29 3b 0a 20 20 20 20  pExpr, r1);.    
1c3c0 69 66 28 20 72 32 3d 3d 72 31 20 29 7b 0a 20 20  if( r2==r1 ){.  
1c3d0 20 20 20 20 2a 70 52 65 67 20 3d 20 72 31 3b 0a      *pReg = r1;.
1c3e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1c3f0 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
1c400 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
1c410 31 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 67 20  1);.      *pReg 
1c420 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  = 0;.    }.  }. 
1c430 20 72 65 74 75 72 6e 20 72 32 3b 0a 7d 0a 0a 2f   return r2;.}../
1c440 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
1c450 64 65 20 74 68 61 74 20 77 69 6c 6c 20 65 76 61  de that will eva
1c460 6c 75 61 74 65 20 65 78 70 72 65 73 73 69 6f 6e  luate expression
1c470 20 70 45 78 70 72 20 61 6e 64 20 73 74 6f 72 65   pExpr and store
1c480 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 73 20   the.** results 
1c490 69 6e 20 72 65 67 69 73 74 65 72 20 74 61 72 67  in register targ
1c4a0 65 74 2e 20 20 54 68 65 20 72 65 73 75 6c 74 73  et.  The results
1c4b0 20 61 72 65 20 67 75 61 72 61 6e 74 65 65 64 20   are guaranteed 
1c4c0 74 6f 20 61 70 70 65 61 72 0a 2a 2a 20 69 6e 20  to appear.** in 
1c4d0 72 65 67 69 73 74 65 72 20 74 61 72 67 65 74 2e  register target.
1c4e0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1c4f0 45 78 70 72 43 6f 64 65 28 50 61 72 73 65 20 2a  ExprCode(Parse *
1c500 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
1c510 78 70 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29  xpr, int target)
1c520 7b 0a 20 20 69 6e 74 20 69 6e 52 65 67 3b 0a 0a  {.  int inReg;..
1c530 20 20 61 73 73 65 72 74 28 20 74 61 72 67 65 74    assert( target
1c540 3e 30 20 26 26 20 74 61 72 67 65 74 3c 3d 70 50  >0 && target<=pP
1c550 61 72 73 65 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20  arse->nMem );.  
1c560 69 66 28 20 70 45 78 70 72 20 26 26 20 70 45 78  if( pExpr && pEx
1c570 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49 53  pr->op==TK_REGIS
1c580 54 45 52 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  TER ){.    sqlit
1c590 65 33 56 64 62 65 41 64 64 4f 70 32 28 70 50 61  e3VdbeAddOp2(pPa
1c5a0 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 43  rse->pVdbe, OP_C
1c5b0 6f 70 79 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  opy, pExpr->iTab
1c5c0 6c 65 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 7d  le, target);.  }
1c5d0 65 6c 73 65 7b 0a 20 20 20 20 69 6e 52 65 67 20  else{.    inReg 
1c5e0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
1c5f0 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20  eTarget(pParse, 
1c600 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a  pExpr, target);.
1c610 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
1c620 73 65 2d 3e 70 56 64 62 65 21 3d 30 20 7c 7c 20  se->pVdbe!=0 || 
1c630 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
1c640 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
1c650 69 66 28 20 69 6e 52 65 67 21 3d 74 61 72 67 65  if( inReg!=targe
1c660 74 20 26 26 20 70 50 61 72 73 65 2d 3e 70 56 64  t && pParse->pVd
1c670 62 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  be ){.      sqli
1c680 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 70 50  te3VdbeAddOp2(pP
1c690 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f  arse->pVdbe, OP_
1c6a0 53 43 6f 70 79 2c 20 69 6e 52 65 67 2c 20 74 61  SCopy, inReg, ta
1c6b0 72 67 65 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  rget);.    }.  }
1c6c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61  .}../*.** Make a
1c6d0 20 74 72 61 6e 73 69 65 6e 74 20 63 6f 70 79 20   transient copy 
1c6e0 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45  of expression pE
1c6f0 78 70 72 20 61 6e 64 20 74 68 65 6e 20 63 6f 64  xpr and then cod
1c700 65 20 69 74 20 75 73 69 6e 67 0a 2a 2a 20 73 71  e it using.** sq
1c710 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 29 2e  lite3ExprCode().
1c720 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77    This routine w
1c730 6f 72 6b 73 20 6a 75 73 74 20 6c 69 6b 65 20 73  orks just like s
1c740 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 29  qlite3ExprCode()
1c750 0a 2a 2a 20 65 78 63 65 70 74 20 74 68 61 74 20  .** except that 
1c760 74 68 65 20 69 6e 70 75 74 20 65 78 70 72 65 73  the input expres
1c770 73 69 6f 6e 20 69 73 20 67 75 61 72 61 6e 74 65  sion is guarante
1c780 65 64 20 74 6f 20 62 65 20 75 6e 63 68 61 6e 67  ed to be unchang
1c790 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
1c7a0 74 65 33 45 78 70 72 43 6f 64 65 43 6f 70 79 28  te3ExprCodeCopy(
1c7b0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
1c7c0 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20  xpr *pExpr, int 
1c7d0 74 61 72 67 65 74 29 7b 0a 20 20 73 71 6c 69 74  target){.  sqlit
1c7e0 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
1c7f0 3e 64 62 3b 0a 20 20 70 45 78 70 72 20 3d 20 73  >db;.  pExpr = s
1c800 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
1c810 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 69  , pExpr, 0);.  i
1c820 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  f( !db->mallocFa
1c830 69 6c 65 64 20 29 20 73 71 6c 69 74 65 33 45 78  iled ) sqlite3Ex
1c840 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
1c850 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20  Expr, target);. 
1c860 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
1c870 74 65 28 64 62 2c 20 70 45 78 70 72 29 3b 0a 7d  te(db, pExpr);.}
1c880 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
1c890 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
1c8a0 65 76 61 6c 75 61 74 65 20 65 78 70 72 65 73 73  evaluate express
1c8b0 69 6f 6e 20 70 45 78 70 72 20 61 6e 64 20 73 74  ion pExpr and st
1c8c0 6f 72 65 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c  ore the.** resul
1c8d0 74 73 20 69 6e 20 72 65 67 69 73 74 65 72 20 74  ts in register t
1c8e0 61 72 67 65 74 2e 20 20 54 68 65 20 72 65 73 75  arget.  The resu
1c8f0 6c 74 73 20 61 72 65 20 67 75 61 72 61 6e 74 65  lts are guarante
1c900 65 64 20 74 6f 20 61 70 70 65 61 72 0a 2a 2a 20  ed to appear.** 
1c910 69 6e 20 72 65 67 69 73 74 65 72 20 74 61 72 67  in register targ
1c920 65 74 2e 20 20 49 66 20 74 68 65 20 65 78 70 72  et.  If the expr
1c930 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61  ession is consta
1c940 6e 74 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f  nt, then this ro
1c950 75 74 69 6e 65 0a 2a 2a 20 6d 69 67 68 74 20 63  utine.** might c
1c960 68 6f 6f 73 65 20 74 6f 20 63 6f 64 65 20 74 68  hoose to code th
1c970 65 20 65 78 70 72 65 73 73 69 6f 6e 20 61 74 20  e expression at 
1c980 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 74  initialization t
1c990 69 6d 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ime..*/.void sql
1c9a0 69 74 65 33 45 78 70 72 43 6f 64 65 46 61 63 74  ite3ExprCodeFact
1c9b0 6f 72 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50  orable(Parse *pP
1c9c0 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
1c9d0 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a  r, int target){.
1c9e0 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6f 6b    if( pParse->ok
1c9f0 43 6f 6e 73 74 46 61 63 74 6f 72 20 26 26 20 73  ConstFactor && s
1ca00 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
1ca10 74 61 6e 74 28 70 45 78 70 72 29 20 29 7b 0a 20  tant(pExpr) ){. 
1ca20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
1ca30 64 65 41 74 49 6e 69 74 28 70 50 61 72 73 65 2c  deAtInit(pParse,
1ca40 20 70 45 78 70 72 2c 20 74 61 72 67 65 74 2c 20   pExpr, target, 
1ca50 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  0);.  }else{.   
1ca60 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1ca70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
1ca80 74 61 72 67 65 74 29 3b 0a 20 20 7d 0a 7d 0a 0a  target);.  }.}..
1ca90 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
1caa0 6f 64 65 20 74 68 61 74 20 65 76 61 6c 75 61 74  ode that evaluat
1cab0 65 73 20 74 68 65 20 67 69 76 65 6e 20 65 78 70  es the given exp
1cac0 72 65 73 73 69 6f 6e 20 61 6e 64 20 70 75 74 73  ression and puts
1cad0 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 69   the result.** i
1cae0 6e 20 72 65 67 69 73 74 65 72 20 74 61 72 67 65  n register targe
1caf0 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 6d 61  t..**.** Also ma
1cb00 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  ke a copy of the
1cb10 20 65 78 70 72 65 73 73 69 6f 6e 20 72 65 73 75   expression resu
1cb20 6c 74 73 20 69 6e 74 6f 20 61 6e 6f 74 68 65 72  lts into another
1cb30 20 22 63 61 63 68 65 22 20 72 65 67 69 73 74 65   "cache" registe
1cb40 72 0a 2a 2a 20 61 6e 64 20 6d 6f 64 69 66 79 20  r.** and modify 
1cb50 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 73  the expression s
1cb60 6f 20 74 68 61 74 20 74 68 65 20 6e 65 78 74 20  o that the next 
1cb70 74 69 6d 65 20 69 74 20 69 73 20 65 76 61 6c 75  time it is evalu
1cb80 61 74 65 64 2c 0a 2a 2a 20 74 68 65 20 72 65 73  ated,.** the res
1cb90 75 6c 74 20 69 73 20 61 20 63 6f 70 79 20 6f 66  ult is a copy of
1cba0 20 74 68 65 20 63 61 63 68 65 20 72 65 67 69 73   the cache regis
1cbb0 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ter..**.** This 
1cbc0 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
1cbd0 66 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 73 20  for expressions 
1cbe0 74 68 61 74 20 61 72 65 20 75 73 65 64 20 6d 75  that are used mu
1cbf0 6c 74 69 70 6c 65 20 0a 2a 2a 20 74 69 6d 65 73  ltiple .** times
1cc00 2e 20 20 54 68 65 79 20 61 72 65 20 65 76 61 6c  .  They are eval
1cc10 75 61 74 65 64 20 6f 6e 63 65 20 61 6e 64 20 74  uated once and t
1cc20 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68  he results of th
1cc30 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20  e expression.** 
1cc40 61 72 65 20 72 65 75 73 65 64 2e 0a 2a 2f 0a 76  are reused..*/.v
1cc50 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43  oid sqlite3ExprC
1cc60 6f 64 65 41 6e 64 43 61 63 68 65 28 50 61 72 73  odeAndCache(Pars
1cc70 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
1cc80 2a 70 45 78 70 72 2c 20 69 6e 74 20 74 61 72 67  *pExpr, int targ
1cc90 65 74 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  et){.  Vdbe *v =
1cca0 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
1ccb0 20 20 69 6e 74 20 69 4d 65 6d 3b 0a 0a 20 20 61    int iMem;..  a
1ccc0 73 73 65 72 74 28 20 74 61 72 67 65 74 3e 30 20  ssert( target>0 
1ccd0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
1cce0 70 72 2d 3e 6f 70 21 3d 54 4b 5f 52 45 47 49 53  pr->op!=TK_REGIS
1ccf0 54 45 52 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  TER );.  sqlite3
1cd00 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
1cd10 20 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b   pExpr, target);
1cd20 0a 20 20 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72  .  iMem = ++pPar
1cd30 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69  se->nMem;.  sqli
1cd40 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1cd50 20 4f 50 5f 43 6f 70 79 2c 20 74 61 72 67 65 74   OP_Copy, target
1cd60 2c 20 69 4d 65 6d 29 3b 0a 20 20 65 78 70 72 54  , iMem);.  exprT
1cd70 6f 52 65 67 69 73 74 65 72 28 70 45 78 70 72 2c  oRegister(pExpr,
1cd80 20 69 4d 65 6d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   iMem);.}../*.**
1cd90 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
1cda0 68 61 74 20 70 75 73 68 65 73 20 74 68 65 20 76  hat pushes the v
1cdb0 61 6c 75 65 20 6f 66 20 65 76 65 72 79 20 65 6c  alue of every el
1cdc0 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 67 69 76  ement of the giv
1cdd0 65 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  en.** expression
1cde0 20 6c 69 73 74 20 69 6e 74 6f 20 61 20 73 65 71   list into a seq
1cdf0 75 65 6e 63 65 20 6f 66 20 72 65 67 69 73 74 65  uence of registe
1ce00 72 73 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20  rs beginning at 
1ce10 74 61 72 67 65 74 2e 0a 2a 2a 0a 2a 2a 20 52 65  target..**.** Re
1ce20 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
1ce30 6f 66 20 65 6c 65 6d 65 6e 74 73 20 65 76 61 6c  of elements eval
1ce40 75 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  uated..**.** The
1ce50 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50   SQLITE_ECEL_DUP
1ce60 20 66 6c 61 67 20 70 72 65 76 65 6e 74 73 20 74   flag prevents t
1ce70 68 65 20 61 72 67 75 6d 65 6e 74 73 20 66 72 6f  he arguments fro
1ce80 6d 20 62 65 69 6e 67 0a 2a 2a 20 66 69 6c 6c 65  m being.** fille
1ce90 64 20 75 73 69 6e 67 20 4f 50 5f 53 43 6f 70 79  d using OP_SCopy
1cea0 2e 20 20 4f 50 5f 43 6f 70 79 20 6d 75 73 74 20  .  OP_Copy must 
1ceb0 62 65 20 75 73 65 64 20 69 6e 73 74 65 61 64 2e  be used instead.
1cec0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c 49 54  .**.** The SQLIT
1ced0 45 5f 45 43 45 4c 5f 46 41 43 54 4f 52 20 61 72  E_ECEL_FACTOR ar
1cee0 67 75 6d 65 6e 74 20 61 6c 6c 6f 77 73 20 63 6f  gument allows co
1cef0 6e 73 74 61 6e 74 20 61 72 67 75 6d 65 6e 74 73  nstant arguments
1cf00 20 74 6f 20 62 65 0a 2a 2a 20 66 61 63 74 6f 72   to be.** factor
1cf10 65 64 20 6f 75 74 20 69 6e 74 6f 20 69 6e 69 74  ed out into init
1cf20 69 61 6c 69 7a 61 74 69 6f 6e 20 63 6f 64 65 2e  ialization code.
1cf30 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c 49 54  .**.** The SQLIT
1cf40 45 5f 45 43 45 4c 5f 52 45 46 20 66 6c 61 67 20  E_ECEL_REF flag 
1cf50 6d 65 61 6e 73 20 74 68 61 74 20 65 78 70 72 65  means that expre
1cf60 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 6c 69  ssions in the li
1cf70 73 74 20 77 69 74 68 0a 2a 2a 20 45 78 70 72 4c  st with.** ExprL
1cf80 69 73 74 2e 61 5b 5d 2e 75 2e 78 2e 69 4f 72 64  ist.a[].u.x.iOrd
1cf90 65 72 42 79 43 6f 6c 3e 30 20 68 61 76 65 20 61  erByCol>0 have a
1cfa0 6c 72 65 61 64 79 20 62 65 65 6e 20 65 76 61 6c  lready been eval
1cfb0 75 61 74 65 64 20 61 6e 64 20 73 74 6f 72 65 64  uated and stored
1cfc0 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74 65 72 73  .** in registers
1cfd0 20 61 74 20 73 72 63 52 65 67 2c 20 61 6e 64 20   at srcReg, and 
1cfe0 73 6f 20 74 68 65 20 76 61 6c 75 65 20 63 61 6e  so the value can
1cff0 20 62 65 20 63 6f 70 69 65 64 20 66 72 6f 6d 20   be copied from 
1d000 74 68 65 72 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  there..*/.int sq
1d010 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70  lite3ExprCodeExp
1d020 72 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20 2a  rList(.  Parse *
1d030 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 50  pParse,     /* P
1d040 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
1d050 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  /.  ExprList *pL
1d060 69 73 74 2c 20 20 20 2f 2a 20 54 68 65 20 65 78  ist,   /* The ex
1d070 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 74 6f  pression list to
1d080 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69   be coded */.  i
1d090 6e 74 20 74 61 72 67 65 74 2c 20 20 20 20 20 20  nt target,      
1d0a0 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 77 72    /* Where to wr
1d0b0 69 74 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20  ite results */. 
1d0c0 20 69 6e 74 20 73 72 63 52 65 67 2c 20 20 20 20   int srcReg,    
1d0d0 20 20 20 20 2f 2a 20 53 6f 75 72 63 65 20 72 65      /* Source re
1d0e0 67 69 73 74 65 72 73 20 69 66 20 53 51 4c 49 54  gisters if SQLIT
1d0f0 45 5f 45 43 45 4c 5f 52 45 46 20 2a 2f 0a 20 20  E_ECEL_REF */.  
1d100 75 38 20 66 6c 61 67 73 20 20 20 20 20 20 20 20  u8 flags        
1d110 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 45 43 45     /* SQLITE_ECE
1d120 4c 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a  L_* flags */.){.
1d130 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
1d140 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
1d150 20 69 6e 74 20 69 2c 20 6a 2c 20 6e 3b 0a 20 20   int i, j, n;.  
1d160 75 38 20 63 6f 70 79 4f 70 20 3d 20 28 66 6c 61  u8 copyOp = (fla
1d170 67 73 20 26 20 53 51 4c 49 54 45 5f 45 43 45 4c  gs & SQLITE_ECEL
1d180 5f 44 55 50 29 20 3f 20 4f 50 5f 43 6f 70 79 20  _DUP) ? OP_Copy 
1d190 3a 20 4f 50 5f 53 43 6f 70 79 3b 0a 20 20 56 64  : OP_SCopy;.  Vd
1d1a0 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
1d1b0 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72 74 28  pVdbe;.  assert(
1d1c0 20 70 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 61   pList!=0 );.  a
1d1d0 73 73 65 72 74 28 20 74 61 72 67 65 74 3e 30 20  ssert( target>0 
1d1e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
1d1f0 72 73 65 2d 3e 70 56 64 62 65 21 3d 30 20 29 3b  rse->pVdbe!=0 );
1d200 20 20 2f 2a 20 4e 65 76 65 72 20 67 65 74 73 20    /* Never gets 
1d210 74 68 69 73 20 66 61 72 20 6f 74 68 65 72 77 69  this far otherwi
1d220 73 65 20 2a 2f 0a 20 20 6e 20 3d 20 70 4c 69 73  se */.  n = pLis
1d230 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 69 66 28 20  t->nExpr;.  if( 
1d240 21 43 6f 6e 73 74 46 61 63 74 6f 72 4f 6b 28 70  !ConstFactorOk(p
1d250 50 61 72 73 65 29 20 29 20 66 6c 61 67 73 20 26  Parse) ) flags &
1d260 3d 20 7e 53 51 4c 49 54 45 5f 45 43 45 4c 5f 46  = ~SQLITE_ECEL_F
1d270 41 43 54 4f 52 3b 0a 20 20 66 6f 72 28 70 49 74  ACTOR;.  for(pIt
1d280 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30  em=pList->a, i=0
1d290 3b 20 69 3c 6e 3b 20 69 2b 2b 2c 20 70 49 74 65  ; i<n; i++, pIte
1d2a0 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  m++){.    Expr *
1d2b0 70 45 78 70 72 20 3d 20 70 49 74 65 6d 2d 3e 70  pExpr = pItem->p
1d2c0 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 28 66  Expr;.    if( (f
1d2d0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 45 43  lags & SQLITE_EC
1d2e0 45 4c 5f 52 45 46 29 21 3d 30 20 26 26 20 28 6a  EL_REF)!=0 && (j
1d2f0 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 75   = pList->a[i].u
1d300 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 29 3e  .x.iOrderByCol)>
1d310 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
1d320 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1d330 63 6f 70 79 4f 70 2c 20 6a 2b 73 72 63 52 65 67  copyOp, j+srcReg
1d340 2d 31 2c 20 74 61 72 67 65 74 2b 69 29 3b 0a 20  -1, target+i);. 
1d350 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 66 6c     }else if( (fl
1d360 61 67 73 20 26 20 53 51 4c 49 54 45 5f 45 43 45  ags & SQLITE_ECE
1d370 4c 5f 46 41 43 54 4f 52 29 21 3d 30 20 26 26 20  L_FACTOR)!=0 && 
1d380 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
1d390 73 74 61 6e 74 28 70 45 78 70 72 29 20 29 7b 0a  stant(pExpr) ){.
1d3a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1d3b0 72 43 6f 64 65 41 74 49 6e 69 74 28 70 50 61 72  rCodeAtInit(pPar
1d3c0 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65  se, pExpr, targe
1d3d0 74 2b 69 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c  t+i, 0);.    }el
1d3e0 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 6e  se{.      int in
1d3f0 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Reg = sqlite3Exp
1d400 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72  rCodeTarget(pPar
1d410 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65  se, pExpr, targe
1d420 74 2b 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20  t+i);.      if( 
1d430 69 6e 52 65 67 21 3d 74 61 72 67 65 74 2b 69 20  inReg!=target+i 
1d440 29 7b 0a 20 20 20 20 20 20 20 20 56 64 62 65 4f  ){.        VdbeO
1d450 70 20 2a 70 4f 70 3b 0a 20 20 20 20 20 20 20 20  p *pOp;.        
1d460 69 66 28 20 63 6f 70 79 4f 70 3d 3d 4f 50 5f 43  if( copyOp==OP_C
1d470 6f 70 79 0a 20 20 20 20 20 20 20 20 20 26 26 20  opy.         && 
1d480 28 70 4f 70 3d 73 71 6c 69 74 65 33 56 64 62 65  (pOp=sqlite3Vdbe
1d490 47 65 74 4f 70 28 76 2c 20 2d 31 29 29 2d 3e 6f  GetOp(v, -1))->o
1d4a0 70 63 6f 64 65 3d 3d 4f 50 5f 43 6f 70 79 0a 20  pcode==OP_Copy. 
1d4b0 20 20 20 20 20 20 20 20 26 26 20 70 4f 70 2d 3e          && pOp->
1d4c0 70 31 2b 70 4f 70 2d 3e 70 33 2b 31 3d 3d 69 6e  p1+pOp->p3+1==in
1d4d0 52 65 67 0a 20 20 20 20 20 20 20 20 20 26 26 20  Reg.         && 
1d4e0 70 4f 70 2d 3e 70 32 2b 70 4f 70 2d 3e 70 33 2b  pOp->p2+pOp->p3+
1d4f0 31 3d 3d 74 61 72 67 65 74 2b 69 0a 20 20 20 20  1==target+i.    
1d500 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
1d510 20 70 4f 70 2d 3e 70 33 2b 2b 3b 0a 20 20 20 20   pOp->p3++;.    
1d520 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1d530 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1d540 41 64 64 4f 70 32 28 76 2c 20 63 6f 70 79 4f 70  AddOp2(v, copyOp
1d550 2c 20 69 6e 52 65 67 2c 20 74 61 72 67 65 74 2b  , inReg, target+
1d560 69 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  i);.        }.  
1d570 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1d580 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f    return n;.}../
1d590 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
1d5a0 64 65 20 66 6f 72 20 61 20 42 45 54 57 45 45 4e  de for a BETWEEN
1d5b0 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a   operator..**.**
1d5c0 20 20 20 20 78 20 42 45 54 57 45 45 4e 20 79 20      x BETWEEN y 
1d5d0 41 4e 44 20 7a 0a 2a 2a 0a 2a 2a 20 54 68 65 20  AND z.**.** The 
1d5e0 61 62 6f 76 65 20 69 73 20 65 71 75 69 76 61 6c  above is equival
1d5f0 65 6e 74 20 74 6f 20 0a 2a 2a 0a 2a 2a 20 20 20  ent to .**.**   
1d600 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 0a 2a   x>=y AND x<=z.*
1d610 2a 0a 2a 2a 20 43 6f 64 65 20 69 74 20 61 73 20  *.** Code it as 
1d620 73 75 63 68 2c 20 74 61 6b 69 6e 67 20 63 61 72  such, taking car
1d630 65 20 74 6f 20 64 6f 20 74 68 65 20 63 6f 6d 6d  e to do the comm
1d640 6f 6e 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  on subexpression
1d650 0a 2a 2a 20 65 6c 69 6d 69 6e 61 74 69 6f 6e 20  .** elimination 
1d660 6f 66 20 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  of x..*/.static 
1d670 76 6f 69 64 20 65 78 70 72 43 6f 64 65 42 65 74  void exprCodeBet
1d680 77 65 65 6e 28 0a 20 20 50 61 72 73 65 20 2a 70  ween(.  Parse *p
1d690 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72  Parse,    /* Par
1d6a0 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65  sing and code ge
1d6b0 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74  nerating context
1d6c0 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70   */.  Expr *pExp
1d6d0 72 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 42  r,      /* The B
1d6e0 45 54 57 45 45 4e 20 65 78 70 72 65 73 73 69 6f  ETWEEN expressio
1d6f0 6e 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 2c  n */.  int dest,
1d700 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70           /* Jump
1d710 20 68 65 72 65 20 69 66 20 74 68 65 20 6a 75 6d   here if the jum
1d720 70 20 69 73 20 74 61 6b 65 6e 20 2a 2f 0a 20 20  p is taken */.  
1d730 69 6e 74 20 6a 75 6d 70 49 66 54 72 75 65 2c 20  int jumpIfTrue, 
1d740 20 20 2f 2a 20 54 61 6b 65 20 74 68 65 20 6a 75    /* Take the ju
1d750 6d 70 20 69 66 20 74 68 65 20 42 45 54 57 45 45  mp if the BETWEE
1d760 4e 20 69 73 20 74 72 75 65 20 2a 2f 0a 20 20 69  N is true */.  i
1d770 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 20 20  nt jumpIfNull   
1d780 20 2f 2a 20 54 61 6b 65 20 74 68 65 20 6a 75 6d   /* Take the jum
1d790 70 20 69 66 20 74 68 65 20 42 45 54 57 45 45 4e  p if the BETWEEN
1d7a0 20 69 73 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20   is NULL */.){. 
1d7b0 20 45 78 70 72 20 65 78 70 72 41 6e 64 3b 20 20   Expr exprAnd;  
1d7c0 20 20 20 2f 2a 20 54 68 65 20 41 4e 44 20 6f 70     /* The AND op
1d7d0 65 72 61 74 6f 72 20 69 6e 20 20 78 3e 3d 79 20  erator in  x>=y 
1d7e0 41 4e 44 20 78 3c 3d 7a 20 20 2a 2f 0a 20 20 45  AND x<=z  */.  E
1d7f0 78 70 72 20 63 6f 6d 70 4c 65 66 74 3b 20 20 20  xpr compLeft;   
1d800 20 2f 2a 20 54 68 65 20 20 78 3e 3d 79 20 20 74   /* The  x>=y  t
1d810 65 72 6d 20 2a 2f 0a 20 20 45 78 70 72 20 63 6f  erm */.  Expr co
1d820 6d 70 52 69 67 68 74 3b 20 20 20 2f 2a 20 54 68  mpRight;   /* Th
1d830 65 20 20 78 3c 3d 7a 20 20 74 65 72 6d 20 2a 2f  e  x<=z  term */
1d840 0a 20 20 45 78 70 72 20 65 78 70 72 58 3b 20 20  .  Expr exprX;  
1d850 20 20 20 20 20 2f 2a 20 54 68 65 20 20 78 20 20       /* The  x  
1d860 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f  subexpression */
1d870 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65 31 20  .  int regFree1 
1d880 3d 20 30 3b 20 2f 2a 20 54 65 6d 70 6f 72 61 72  = 0; /* Temporar
1d890 79 20 75 73 65 20 72 65 67 69 73 74 65 72 20 2a  y use register *
1d8a0 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 21 45 78  /..  assert( !Ex
1d8b0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
1d8c0 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  xpr, EP_xIsSelec
1d8d0 74 29 20 29 3b 0a 20 20 65 78 70 72 58 20 3d 20  t) );.  exprX = 
1d8e0 2a 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20  *pExpr->pLeft;. 
1d8f0 20 65 78 70 72 41 6e 64 2e 6f 70 20 3d 20 54 4b   exprAnd.op = TK
1d900 5f 41 4e 44 3b 0a 20 20 65 78 70 72 41 6e 64 2e  _AND;.  exprAnd.
1d910 70 4c 65 66 74 20 3d 20 26 63 6f 6d 70 4c 65 66  pLeft = &compLef
1d920 74 3b 0a 20 20 65 78 70 72 41 6e 64 2e 70 52 69  t;.  exprAnd.pRi
1d930 67 68 74 20 3d 20 26 63 6f 6d 70 52 69 67 68 74  ght = &compRight
1d940 3b 0a 20 20 63 6f 6d 70 4c 65 66 74 2e 6f 70 20  ;.  compLeft.op 
1d950 3d 20 54 4b 5f 47 45 3b 0a 20 20 63 6f 6d 70 4c  = TK_GE;.  compL
1d960 65 66 74 2e 70 4c 65 66 74 20 3d 20 26 65 78 70  eft.pLeft = &exp
1d970 72 58 3b 0a 20 20 63 6f 6d 70 4c 65 66 74 2e 70  rX;.  compLeft.p
1d980 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 78  Right = pExpr->x
1d990 2e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  .pList->a[0].pEx
1d9a0 70 72 3b 0a 20 20 63 6f 6d 70 52 69 67 68 74 2e  pr;.  compRight.
1d9b0 6f 70 20 3d 20 54 4b 5f 4c 45 3b 0a 20 20 63 6f  op = TK_LE;.  co
1d9c0 6d 70 52 69 67 68 74 2e 70 4c 65 66 74 20 3d 20  mpRight.pLeft = 
1d9d0 26 65 78 70 72 58 3b 0a 20 20 63 6f 6d 70 52 69  &exprX;.  compRi
1d9e0 67 68 74 2e 70 52 69 67 68 74 20 3d 20 70 45 78  ght.pRight = pEx
1d9f0 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 31  pr->x.pList->a[1
1da00 5d 2e 70 45 78 70 72 3b 0a 20 20 65 78 70 72 54  ].pExpr;.  exprT
1da10 6f 52 65 67 69 73 74 65 72 28 26 65 78 70 72 58  oRegister(&exprX
1da20 2c 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  , sqlite3ExprCod
1da30 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 26 65  eTemp(pParse, &e
1da40 78 70 72 58 2c 20 26 72 65 67 46 72 65 65 31 29  xprX, &regFree1)
1da50 29 3b 0a 20 20 69 66 28 20 6a 75 6d 70 49 66 54  );.  if( jumpIfT
1da60 72 75 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  rue ){.    sqlit
1da70 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61  e3ExprIfTrue(pPa
1da80 72 73 65 2c 20 26 65 78 70 72 41 6e 64 2c 20 64  rse, &exprAnd, d
1da90 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
1daa0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
1dab0 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
1dac0 65 28 70 50 61 72 73 65 2c 20 26 65 78 70 72 41  e(pParse, &exprA
1dad0 6e 64 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  nd, dest, jumpIf
1dae0 4e 75 6c 6c 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  Null);.  }.  sql
1daf0 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
1db00 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72  eg(pParse, regFr
1db10 65 65 31 29 3b 0a 0a 20 20 2f 2a 20 45 6e 73 75  ee1);..  /* Ensu
1db20 72 65 20 61 64 65 71 75 61 74 65 20 74 65 73 74  re adequate test
1db30 20 63 6f 76 65 72 61 67 65 20 2a 2f 0a 20 20 74   coverage */.  t
1db40 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 54  estcase( jumpIfT
1db50 72 75 65 3d 3d 30 20 26 26 20 6a 75 6d 70 49 66  rue==0 && jumpIf
1db60 4e 75 6c 6c 3d 3d 30 20 26 26 20 72 65 67 46 72  Null==0 && regFr
1db70 65 65 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74  ee1==0 );.  test
1db80 63 61 73 65 28 20 6a 75 6d 70 49 66 54 72 75 65  case( jumpIfTrue
1db90 3d 3d 30 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c  ==0 && jumpIfNul
1dba0 6c 3d 3d 30 20 26 26 20 72 65 67 46 72 65 65 31  l==0 && regFree1
1dbb0 21 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73  !=0 );.  testcas
1dbc0 65 28 20 6a 75 6d 70 49 66 54 72 75 65 3d 3d 30  e( jumpIfTrue==0
1dbd0 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d   && jumpIfNull!=
1dbe0 30 20 26 26 20 72 65 67 46 72 65 65 31 3d 3d 30  0 && regFree1==0
1dbf0 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
1dc00 6a 75 6d 70 49 66 54 72 75 65 3d 3d 30 20 26 26  jumpIfTrue==0 &&
1dc10 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 20 26   jumpIfNull!=0 &
1dc20 26 20 72 65 67 46 72 65 65 31 21 3d 30 20 29 3b  & regFree1!=0 );
1dc30 0a 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d  .  testcase( jum
1dc40 70 49 66 54 72 75 65 21 3d 30 20 26 26 20 6a 75  pIfTrue!=0 && ju
1dc50 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26 20 72  mpIfNull==0 && r
1dc60 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
1dc70 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
1dc80 54 72 75 65 21 3d 30 20 26 26 20 6a 75 6d 70 49  True!=0 && jumpI
1dc90 66 4e 75 6c 6c 3d 3d 30 20 26 26 20 72 65 67 46  fNull==0 && regF
1dca0 72 65 65 31 21 3d 30 20 29 3b 0a 20 20 74 65 73  ree1!=0 );.  tes
1dcb0 74 63 61 73 65 28 20 6a 75 6d 70 49 66 54 72 75  tcase( jumpIfTru
1dcc0 65 21 3d 30 20 26 26 20 6a 75 6d 70 49 66 4e 75  e!=0 && jumpIfNu
1dcd0 6c 6c 21 3d 30 20 26 26 20 72 65 67 46 72 65 65  ll!=0 && regFree
1dce0 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61  1==0 );.  testca
1dcf0 73 65 28 20 6a 75 6d 70 49 66 54 72 75 65 21 3d  se( jumpIfTrue!=
1dd00 30 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21  0 && jumpIfNull!
1dd10 3d 30 20 26 26 20 72 65 67 46 72 65 65 31 21 3d  =0 && regFree1!=
1dd20 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  0 );.}../*.** Ge
1dd30 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
1dd40 61 20 62 6f 6f 6c 65 61 6e 20 65 78 70 72 65 73  a boolean expres
1dd50 73 69 6f 6e 20 73 75 63 68 20 74 68 61 74 20 61  sion such that a
1dd60 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 0a 2a 2a   jump is made.**
1dd70 20 74 6f 20 74 68 65 20 6c 61 62 65 6c 20 22 64   to the label "d
1dd80 65 73 74 22 20 69 66 20 74 68 65 20 65 78 70 72  est" if the expr
1dd90 65 73 73 69 6f 6e 20 69 73 20 74 72 75 65 20 62  ession is true b
1dda0 75 74 20 65 78 65 63 75 74 69 6f 6e 0a 2a 2a 20  ut execution.** 
1ddb0 63 6f 6e 74 69 6e 75 65 73 20 73 74 72 61 69 67  continues straig
1ddc0 68 74 20 74 68 72 75 20 69 66 20 74 68 65 20 65  ht thru if the e
1ddd0 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66 61 6c  xpression is fal
1dde0 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  se..**.** If the
1ddf0 20 65 78 70 72 65 73 73 69 6f 6e 20 65 76 61 6c   expression eval
1de00 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c 20 28 6e  uates to NULL (n
1de10 65 69 74 68 65 72 20 74 72 75 65 20 6e 6f 72 20  either true nor 
1de20 66 61 6c 73 65 29 2c 20 74 68 65 6e 0a 2a 2a 20  false), then.** 
1de30 74 61 6b 65 20 74 68 65 20 6a 75 6d 70 20 69 66  take the jump if
1de40 20 74 68 65 20 6a 75 6d 70 49 66 4e 75 6c 6c 20   the jumpIfNull 
1de50 66 6c 61 67 20 69 73 20 53 51 4c 49 54 45 5f 4a  flag is SQLITE_J
1de60 55 4d 50 49 46 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  UMPIFNULL..**.**
1de70 20 54 68 69 73 20 63 6f 64 65 20 64 65 70 65 6e   This code depen
1de80 64 73 20 6f 6e 20 74 68 65 20 66 61 63 74 20 74  ds on the fact t
1de90 68 61 74 20 63 65 72 74 61 69 6e 20 74 6f 6b 65  hat certain toke
1dea0 6e 20 76 61 6c 75 65 73 20 28 65 78 3a 20 54 4b  n values (ex: TK
1deb0 5f 45 51 29 0a 2a 2a 20 61 72 65 20 74 68 65 20  _EQ).** are the 
1dec0 73 61 6d 65 20 61 73 20 6f 70 63 6f 64 65 20 76  same as opcode v
1ded0 61 6c 75 65 73 20 28 65 78 3a 20 4f 50 5f 45 71  alues (ex: OP_Eq
1dee0 29 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74  ) that implement
1def0 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
1df00 6e 67 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 2e  ng.** operation.
1df10 20 20 53 70 65 63 69 61 6c 20 63 6f 6d 6d 65 6e    Special commen
1df20 74 73 20 69 6e 20 76 64 62 65 2e 63 20 61 6e 64  ts in vdbe.c and
1df30 20 74 68 65 20 6d 6b 6f 70 63 6f 64 65 68 2e 61   the mkopcodeh.a
1df40 77 6b 20 73 63 72 69 70 74 20 69 6e 0a 2a 2a 20  wk script in.** 
1df50 74 68 65 20 6d 61 6b 65 20 70 72 6f 63 65 73 73  the make process
1df60 20 63 61 75 73 65 20 74 68 65 73 65 20 76 61 6c   cause these val
1df70 75 65 73 20 74 6f 20 61 6c 69 67 6e 2e 20 20 41  ues to align.  A
1df80 73 73 65 72 74 28 29 73 20 69 6e 20 74 68 65 20  ssert()s in the 
1df90 63 6f 64 65 0a 2a 2a 20 62 65 6c 6f 77 20 76 65  code.** below ve
1dfa0 72 69 66 79 20 74 68 61 74 20 74 68 65 20 6e 75  rify that the nu
1dfb0 6d 62 65 72 73 20 61 72 65 20 61 6c 69 67 6e 65  mbers are aligne
1dfc0 64 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a  d correctly..*/.
1dfd0 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
1dfe0 49 66 54 72 75 65 28 50 61 72 73 65 20 2a 70 50  IfTrue(Parse *pP
1dff0 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
1e000 72 2c 20 69 6e 74 20 64 65 73 74 2c 20 69 6e 74  r, int dest, int
1e010 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20   jumpIfNull){.  
1e020 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
1e030 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 6f  ->pVdbe;.  int o
1e040 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 67  p = 0;.  int reg
1e050 46 72 65 65 31 20 3d 20 30 3b 0a 20 20 69 6e 74  Free1 = 0;.  int
1e060 20 72 65 67 46 72 65 65 32 20 3d 20 30 3b 0a 20   regFree2 = 0;. 
1e070 20 69 6e 74 20 72 31 2c 20 72 32 3b 0a 0a 20 20   int r1, r2;..  
1e080 61 73 73 65 72 74 28 20 6a 75 6d 70 49 66 4e 75  assert( jumpIfNu
1e090 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4a 55 4d 50 49  ll==SQLITE_JUMPI
1e0a0 46 4e 55 4c 4c 20 7c 7c 20 6a 75 6d 70 49 66 4e  FNULL || jumpIfN
1e0b0 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  ull==0 );.  if( 
1e0c0 4e 45 56 45 52 28 76 3d 3d 30 29 20 29 20 20 20  NEVER(v==0) )   
1e0d0 20 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 45 78    return;  /* Ex
1e0e0 69 73 74 65 6e 63 65 20 6f 66 20 56 44 42 45 20  istence of VDBE 
1e0f0 63 68 65 63 6b 65 64 20 62 79 20 63 61 6c 6c 65  checked by calle
1e100 72 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52  r */.  if( NEVER
1e110 28 70 45 78 70 72 3d 3d 30 29 20 29 20 72 65 74  (pExpr==0) ) ret
1e120 75 72 6e 3b 20 20 2f 2a 20 4e 6f 20 77 61 79 20  urn;  /* No way 
1e130 74 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e 20  this can happen 
1e140 2a 2f 0a 20 20 6f 70 20 3d 20 70 45 78 70 72 2d  */.  op = pExpr-
1e150 3e 6f 70 3b 0a 20 20 73 77 69 74 63 68 28 20 6f  >op;.  switch( o
1e160 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
1e170 5f 41 4e 44 3a 20 7b 0a 20 20 20 20 20 20 69 6e  _AND: {.      in
1e180 74 20 64 32 20 3d 20 73 71 6c 69 74 65 33 56 64  t d2 = sqlite3Vd
1e190 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
1e1a0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1e1b0 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
1e1c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1e1d0 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
1e1e0 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
1e1f0 64 32 2c 6a 75 6d 70 49 66 4e 75 6c 6c 5e 53 51  d2,jumpIfNull^SQ
1e200 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29  LITE_JUMPIFNULL)
1e210 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1e220 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61  xprCachePush(pPa
1e230 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  rse);.      sqli
1e240 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50  te3ExprIfTrue(pP
1e250 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69  arse, pExpr->pRi
1e260 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49  ght, dest, jumpI
1e270 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71  fNull);.      sq
1e280 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
1e290 4c 61 62 65 6c 28 76 2c 20 64 32 29 3b 0a 20 20  Label(v, d2);.  
1e2a0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
1e2b0 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b  achePop(pParse);
1e2c0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1e2d0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
1e2e0 4f 52 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74  OR: {.      test
1e2f0 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  case( jumpIfNull
1e300 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ==0 );.      sql
1e310 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70  ite3ExprIfTrue(p
1e320 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
1e330 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49  eft, dest, jumpI
1e340 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71  fNull);.      sq
1e350 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75  lite3ExprCachePu
1e360 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  sh(pParse);.    
1e370 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54    sqlite3ExprIfT
1e380 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  rue(pParse, pExp
1e390 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c  r->pRight, dest,
1e3a0 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
1e3b0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
1e3c0 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b  achePop(pParse);
1e3d0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1e3e0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
1e3f0 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 74 65 73  NOT: {.      tes
1e400 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c  tcase( jumpIfNul
1e410 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71  l==0 );.      sq
1e420 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
1e430 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
1e440 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d  pLeft, dest, jum
1e450 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
1e460 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1e470 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20   case TK_LT:.   
1e480 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20   case TK_LE:.   
1e490 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20   case TK_GT:.   
1e4a0 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20   case TK_GE:.   
1e4b0 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20   case TK_NE:.   
1e4c0 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20   case TK_EQ: {. 
1e4d0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
1e4e0 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
1e4f0 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
1e500 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
1e510 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
1e520 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b  eft, &regFree1);
1e530 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69  .      r2 = sqli
1e540 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
1e550 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
1e560 52 69 67 68 74 2c 20 26 72 65 67 46 72 65 65 32  Right, &regFree2
1e570 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d  );.      codeCom
1e580 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 45 78  pare(pParse, pEx
1e590 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72  pr->pLeft, pExpr
1e5a0 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20  ->pRight, op,.  
1e5b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e5c0 72 31 2c 20 72 32 2c 20 64 65 73 74 2c 20 6a 75  r1, r2, dest, ju
1e5d0 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
1e5e0 20 61 73 73 65 72 74 28 54 4b 5f 4c 54 3d 3d 4f   assert(TK_LT==O
1e5f0 50 5f 4c 74 29 3b 20 74 65 73 74 63 61 73 65 28  P_Lt); testcase(
1e600 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 20 56 64 62 65  op==OP_Lt); Vdbe
1e610 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d  CoverageIf(v,op=
1e620 3d 4f 50 5f 4c 74 29 3b 0a 20 20 20 20 20 20 61  =OP_Lt);.      a
1e630 73 73 65 72 74 28 54 4b 5f 4c 45 3d 3d 4f 50 5f  ssert(TK_LE==OP_
1e640 4c 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70  Le); testcase(op
1e650 3d 3d 4f 50 5f 4c 65 29 3b 20 56 64 62 65 43 6f  ==OP_Le); VdbeCo
1e660 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f  verageIf(v,op==O
1e670 50 5f 4c 65 29 3b 0a 20 20 20 20 20 20 61 73 73  P_Le);.      ass
1e680 65 72 74 28 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74  ert(TK_GT==OP_Gt
1e690 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d  ); testcase(op==
1e6a0 4f 50 5f 47 74 29 3b 20 56 64 62 65 43 6f 76 65  OP_Gt); VdbeCove
1e6b0 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f  rageIf(v,op==OP_
1e6c0 47 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Gt);.      asser
1e6d0 74 28 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65 29 3b  t(TK_GE==OP_Ge);
1e6e0 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50   testcase(op==OP
1e6f0 5f 47 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61  _Ge); VdbeCovera
1e700 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 65  geIf(v,op==OP_Ge
1e710 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1e720 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71 29 3b 20 74  TK_EQ==OP_Eq); t
1e730 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 45  estcase(op==OP_E
1e740 71 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  q); VdbeCoverage
1e750 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 45 71 29 3b  If(v,op==OP_Eq);
1e760 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b  .      assert(TK
1e770 5f 4e 45 3d 3d 4f 50 5f 4e 65 29 3b 20 74 65 73  _NE==OP_Ne); tes
1e780 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4e 65 29  tcase(op==OP_Ne)
1e790 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66  ; VdbeCoverageIf
1e7a0 28 76 2c 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 0a 20  (v,op==OP_Ne);. 
1e7b0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
1e7c0 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
1e7d0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
1e7e0 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20  gFree2==0 );.   
1e7f0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1e800 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 3a 0a      case TK_IS:.
1e810 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f      case TK_ISNO
1e820 54 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63  T: {.      testc
1e830 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 20 29  ase( op==TK_IS )
1e840 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1e850 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29  ( op==TK_ISNOT )
1e860 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  ;.      r1 = sql
1e870 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
1e880 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
1e890 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31  pLeft, &regFree1
1e8a0 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71  );.      r2 = sq
1e8b0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
1e8c0 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
1e8d0 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46 72 65  >pRight, &regFre
1e8e0 65 32 29 3b 0a 20 20 20 20 20 20 6f 70 20 3d 20  e2);.      op = 
1e8f0 28 6f 70 3d 3d 54 4b 5f 49 53 29 20 3f 20 54 4b  (op==TK_IS) ? TK
1e900 5f 45 51 20 3a 20 54 4b 5f 4e 45 3b 0a 20 20 20  _EQ : TK_NE;.   
1e910 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70     codeCompare(p
1e920 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
1e930 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  eft, pExpr->pRig
1e940 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20 20  ht, op,.        
1e950 20 20 20 20 20 20 20 20 20 20 72 31 2c 20 72 32            r1, r2
1e960 2c 20 64 65 73 74 2c 20 53 51 4c 49 54 45 5f 4e  , dest, SQLITE_N
1e970 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 56 64  ULLEQ);.      Vd
1e980 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
1e990 6f 70 3d 3d 54 4b 5f 45 51 29 3b 0a 20 20 20 20  op==TK_EQ);.    
1e9a0 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
1e9b0 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4e 45 29 3b 0a  (v, op==TK_NE);.
1e9c0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1e9d0 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
1e9e0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
1e9f0 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20  egFree2==0 );.  
1ea00 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1ea10 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e  .    case TK_ISN
1ea20 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  ULL:.    case TK
1ea30 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20  _NOTNULL: {.    
1ea40 20 20 61 73 73 65 72 74 28 20 54 4b 5f 49 53 4e    assert( TK_ISN
1ea50 55 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29  ULL==OP_IsNull )
1ea60 3b 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70  ;   testcase( op
1ea70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20  ==TK_ISNULL );. 
1ea80 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
1ea90 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e  NOTNULL==OP_NotN
1eaa0 75 6c 6c 20 29 3b 20 74 65 73 74 63 61 73 65 28  ull ); testcase(
1eab0 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20   op==TK_NOTNULL 
1eac0 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71  );.      r1 = sq
1ead0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
1eae0 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
1eaf0 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65  >pLeft, &regFree
1eb00 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
1eb10 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 6f  3VdbeAddOp2(v, o
1eb20 70 2c 20 72 31 2c 20 64 65 73 74 29 3b 0a 20 20  p, r1, dest);.  
1eb30 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
1eb40 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 49 53 4e  If(v, op==TK_ISN
1eb50 55 4c 4c 29 3b 0a 20 20 20 20 20 20 56 64 62 65  ULL);.      Vdbe
1eb60 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70  CoverageIf(v, op
1eb70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a 20  ==TK_NOTNULL);. 
1eb80 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
1eb90 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
1eba0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1ebb0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54  .    case TK_BET
1ebc0 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 74 65  WEEN: {.      te
1ebd0 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75  stcase( jumpIfNu
1ebe0 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 65  ll==0 );.      e
1ebf0 78 70 72 43 6f 64 65 42 65 74 77 65 65 6e 28 70  xprCodeBetween(p
1ec00 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64 65  Parse, pExpr, de
1ec10 73 74 2c 20 31 2c 20 6a 75 6d 70 49 66 4e 75 6c  st, 1, jumpIfNul
1ec20 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  l);.      break;
1ec30 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
1ec40 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
1ec50 45 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ERY.    case TK_
1ec60 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  IN: {.      int 
1ec70 64 65 73 74 49 66 46 61 6c 73 65 20 3d 20 73 71  destIfFalse = sq
1ec80 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
1ec90 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 6e 74  el(v);.      int
1eca0 20 64 65 73 74 49 66 4e 75 6c 6c 20 3d 20 6a 75   destIfNull = ju
1ecb0 6d 70 49 66 4e 75 6c 6c 20 3f 20 64 65 73 74 20  mpIfNull ? dest 
1ecc0 3a 20 64 65 73 74 49 66 46 61 6c 73 65 3b 0a 20  : destIfFalse;. 
1ecd0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1ece0 43 6f 64 65 49 4e 28 70 50 61 72 73 65 2c 20 70  CodeIN(pParse, p
1ecf0 45 78 70 72 2c 20 64 65 73 74 49 66 46 61 6c 73  Expr, destIfFals
1ed00 65 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a  e, destIfNull);.
1ed10 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1ed20 65 47 6f 74 6f 28 76 2c 20 64 65 73 74 29 3b 0a  eGoto(v, dest);.
1ed30 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1ed40 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
1ed50 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 20   destIfFalse);. 
1ed60 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1ed70 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 64 65 66  }.#endif.    def
1ed80 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 69 66  ault: {.      if
1ed90 28 20 65 78 70 72 41 6c 77 61 79 73 54 72 75 65  ( exprAlwaysTrue
1eda0 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20  (pExpr) ){.     
1edb0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f     sqlite3VdbeGo
1edc0 74 6f 28 76 2c 20 64 65 73 74 29 3b 0a 20 20 20  to(v, dest);.   
1edd0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 78 70     }else if( exp
1ede0 72 41 6c 77 61 79 73 46 61 6c 73 65 28 70 45 78  rAlwaysFalse(pEx
1edf0 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  pr) ){.        /
1ee00 2a 20 4e 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20 20  * No-op */.     
1ee10 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1ee20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
1ee30 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
1ee40 20 70 45 78 70 72 2c 20 26 72 65 67 46 72 65 65   pExpr, &regFree
1ee50 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  1);.        sqli
1ee60 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
1ee70 20 4f 50 5f 49 66 2c 20 72 31 2c 20 64 65 73 74   OP_If, r1, dest
1ee80 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 29  , jumpIfNull!=0)
1ee90 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
1eea0 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
1eeb0 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
1eec0 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
1eed0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75      testcase( ju
1eee0 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
1eef0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
1ef00 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
1ef10 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
1ef20 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
1ef30 67 46 72 65 65 31 29 3b 0a 20 20 73 71 6c 69 74  gFree1);.  sqlit
1ef40 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
1ef50 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65  (pParse, regFree
1ef60 32 29 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  2);  .}../*.** G
1ef70 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
1ef80 20 61 20 62 6f 6f 6c 65 61 6e 20 65 78 70 72 65   a boolean expre
1ef90 73 73 69 6f 6e 20 73 75 63 68 20 74 68 61 74 20  ssion such that 
1efa0 61 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 0a 2a  a jump is made.*
1efb0 2a 20 74 6f 20 74 68 65 20 6c 61 62 65 6c 20 22  * to the label "
1efc0 64 65 73 74 22 20 69 66 20 74 68 65 20 65 78 70  dest" if the exp
1efd0 72 65 73 73 69 6f 6e 20 69 73 20 66 61 6c 73 65  ression is false
1efe0 20 62 75 74 20 65 78 65 63 75 74 69 6f 6e 0a 2a   but execution.*
1eff0 2a 20 63 6f 6e 74 69 6e 75 65 73 20 73 74 72 61  * continues stra
1f000 69 67 68 74 20 74 68 72 75 20 69 66 20 74 68 65  ight thru if the
1f010 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74   expression is t
1f020 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  rue..**.** If th
1f030 65 20 65 78 70 72 65 73 73 69 6f 6e 20 65 76 61  e expression eva
1f040 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c 20 28  luates to NULL (
1f050 6e 65 69 74 68 65 72 20 74 72 75 65 20 6e 6f 72  neither true nor
1f060 20 66 61 6c 73 65 29 20 74 68 65 6e 0a 2a 2a 20   false) then.** 
1f070 6a 75 6d 70 20 69 66 20 6a 75 6d 70 49 66 4e 75  jump if jumpIfNu
1f080 6c 6c 20 69 73 20 53 51 4c 49 54 45 5f 4a 55 4d  ll is SQLITE_JUM
1f090 50 49 46 4e 55 4c 4c 20 6f 72 20 66 61 6c 6c 20  PIFNULL or fall 
1f0a0 74 68 72 6f 75 67 68 20 69 66 20 6a 75 6d 70 49  through if jumpI
1f0b0 66 4e 75 6c 6c 0a 2a 2a 20 69 73 20 30 2e 0a 2a  fNull.** is 0..*
1f0c0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
1f0d0 70 72 49 66 46 61 6c 73 65 28 50 61 72 73 65 20  prIfFalse(Parse 
1f0e0 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
1f0f0 45 78 70 72 2c 20 69 6e 74 20 64 65 73 74 2c 20  Expr, int dest, 
1f100 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b  int jumpIfNull){
1f110 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
1f120 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
1f130 74 20 6f 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20  t op = 0;.  int 
1f140 72 65 67 46 72 65 65 31 20 3d 20 30 3b 0a 20 20  regFree1 = 0;.  
1f150 69 6e 74 20 72 65 67 46 72 65 65 32 20 3d 20 30  int regFree2 = 0
1f160 3b 0a 20 20 69 6e 74 20 72 31 2c 20 72 32 3b 0a  ;.  int r1, r2;.
1f170 0a 20 20 61 73 73 65 72 74 28 20 6a 75 6d 70 49  .  assert( jumpI
1f180 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4a 55  fNull==SQLITE_JU
1f190 4d 50 49 46 4e 55 4c 4c 20 7c 7c 20 6a 75 6d 70  MPIFNULL || jump
1f1a0 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 69  IfNull==0 );.  i
1f1b0 66 28 20 4e 45 56 45 52 28 76 3d 3d 30 29 20 29  f( NEVER(v==0) )
1f1c0 20 72 65 74 75 72 6e 3b 20 2f 2a 20 45 78 69 73   return; /* Exis
1f1d0 74 65 6e 63 65 20 6f 66 20 56 44 42 45 20 63 68  tence of VDBE ch
1f1e0 65 63 6b 65 64 20 62 79 20 63 61 6c 6c 65 72 20  ecked by caller 
1f1f0 2a 2f 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d  */.  if( pExpr==
1f200 30 20 29 20 20 20 20 72 65 74 75 72 6e 3b 0a 0a  0 )    return;..
1f210 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 6f    /* The value o
1f220 66 20 70 45 78 70 72 2d 3e 6f 70 20 61 6e 64 20  f pExpr->op and 
1f230 6f 70 20 61 72 65 20 72 65 6c 61 74 65 64 20 61  op are related a
1f240 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a  s follows:.  **.
1f250 20 20 2a 2a 20 20 20 20 20 20 20 70 45 78 70 72    **       pExpr
1f260 2d 3e 6f 70 20 20 20 20 20 20 20 20 20 20 20 20  ->op            
1f270 6f 70 0a 20 20 2a 2a 20 20 20 20 20 20 20 2d 2d  op.  **       --
1f280 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 20 20 20 20  -------         
1f290 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 20 2a 2a   ----------.  **
1f2a0 20 20 20 20 20 20 20 54 4b 5f 49 53 4e 55 4c 4c         TK_ISNULL
1f2b0 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4e 6f 74            OP_Not
1f2c0 4e 75 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 20 20  Null.  **       
1f2d0 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 20 20 20 20 20  TK_NOTNULL      
1f2e0 20 20 20 4f 50 5f 49 73 4e 75 6c 6c 0a 20 20 2a     OP_IsNull.  *
1f2f0 2a 20 20 20 20 20 20 20 54 4b 5f 4e 45 20 20 20  *       TK_NE   
1f300 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 45 71             OP_Eq
1f310 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 45  .  **       TK_E
1f320 51 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f  Q              O
1f330 50 5f 4e 65 0a 20 20 2a 2a 20 20 20 20 20 20 20  P_Ne.  **       
1f340 54 4b 5f 47 54 20 20 20 20 20 20 20 20 20 20 20  TK_GT           
1f350 20 20 20 4f 50 5f 4c 65 0a 20 20 2a 2a 20 20 20     OP_Le.  **   
1f360 20 20 20 20 54 4b 5f 4c 45 20 20 20 20 20 20 20      TK_LE       
1f370 20 20 20 20 20 20 20 4f 50 5f 47 74 0a 20 20 2a         OP_Gt.  *
1f380 2a 20 20 20 20 20 20 20 54 4b 5f 47 45 20 20 20  *       TK_GE   
1f390 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4c 74             OP_Lt
1f3a0 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4c  .  **       TK_L
1f3b0 54 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f  T              O
1f3c0 50 5f 47 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46  P_Ge.  **.  ** F
1f3d0 6f 72 20 6f 74 68 65 72 20 76 61 6c 75 65 73 20  or other values 
1f3e0 6f 66 20 70 45 78 70 72 2d 3e 6f 70 2c 20 6f 70  of pExpr->op, op
1f3f0 20 69 73 20 75 6e 64 65 66 69 6e 65 64 20 61 6e   is undefined an
1f400 64 20 75 6e 75 73 65 64 2e 0a 20 20 2a 2a 20 54  d unused..  ** T
1f410 68 65 20 76 61 6c 75 65 20 6f 66 20 54 4b 5f 20  he value of TK_ 
1f420 61 6e 64 20 4f 50 5f 20 63 6f 6e 73 74 61 6e 74  and OP_ constant
1f430 73 20 61 72 65 20 61 72 72 61 6e 67 65 64 20 73  s are arranged s
1f440 75 63 68 20 74 68 61 74 20 77 65 0a 20 20 2a 2a  uch that we.  **
1f450 20 63 61 6e 20 63 6f 6d 70 75 74 65 20 74 68 65   can compute the
1f460 20 6d 61 70 70 69 6e 67 20 61 62 6f 76 65 20 75   mapping above u
1f470 73 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69  sing the followi
1f480 6e 67 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 20  ng expression.. 
1f490 20 2a 2a 20 41 73 73 65 72 74 28 29 73 20 76 65   ** Assert()s ve
1f4a0 72 69 66 79 20 74 68 61 74 20 74 68 65 20 63 6f  rify that the co
1f4b0 6d 70 75 74 61 74 69 6f 6e 20 69 73 20 63 6f 72  mputation is cor
1f4c0 72 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 6f 70 20  rect..  */.  op 
1f4d0 3d 20 28 28 70 45 78 70 72 2d 3e 6f 70 2b 28 54  = ((pExpr->op+(T
1f4e0 4b 5f 49 53 4e 55 4c 4c 26 31 29 29 5e 31 29 2d  K_ISNULL&1))^1)-
1f4f0 28 54 4b 5f 49 53 4e 55 4c 4c 26 31 29 3b 0a 0a  (TK_ISNULL&1);..
1f500 20 20 2f 2a 20 56 65 72 69 66 79 20 63 6f 72 72    /* Verify corr
1f510 65 63 74 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66  ect alignment of
1f520 20 54 4b 5f 20 61 6e 64 20 4f 50 5f 20 63 6f 6e   TK_ and OP_ con
1f530 73 74 61 6e 74 73 0a 20 20 2a 2f 0a 20 20 61 73  stants.  */.  as
1f540 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21  sert( pExpr->op!
1f550 3d 54 4b 5f 49 53 4e 55 4c 4c 20 7c 7c 20 6f 70  =TK_ISNULL || op
1f560 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 0a  ==OP_NotNull );.
1f570 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
1f580 3e 6f 70 21 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20  >op!=TK_NOTNULL 
1f590 7c 7c 20 6f 70 3d 3d 4f 50 5f 49 73 4e 75 6c 6c  || op==OP_IsNull
1f5a0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
1f5b0 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 45 20 7c  xpr->op!=TK_NE |
1f5c0 7c 20 6f 70 3d 3d 4f 50 5f 45 71 20 29 3b 0a 20  | op==OP_Eq );. 
1f5d0 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
1f5e0 6f 70 21 3d 54 4b 5f 45 51 20 7c 7c 20 6f 70 3d  op!=TK_EQ || op=
1f5f0 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20 61 73 73 65  =OP_Ne );.  asse
1f600 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  rt( pExpr->op!=T
1f610 4b 5f 4c 54 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47  K_LT || op==OP_G
1f620 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
1f630 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4c 45 20  Expr->op!=TK_LE 
1f640 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 74 20 29 3b 0a  || op==OP_Gt );.
1f650 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
1f660 3e 6f 70 21 3d 54 4b 5f 47 54 20 7c 7c 20 6f 70  >op!=TK_GT || op
1f670 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20 61 73 73  ==OP_Le );.  ass
1f680 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d  ert( pExpr->op!=
1f690 54 4b 5f 47 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f  TK_GE || op==OP_
1f6a0 4c 74 20 29 3b 0a 0a 20 20 73 77 69 74 63 68 28  Lt );..  switch(
1f6b0 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20   pExpr->op ){.  
1f6c0 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20 7b    case TK_AND: {
1f6d0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1f6e0 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
1f6f0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1f700 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
1f710 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
1f720 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
1f730 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  l);.      sqlite
1f740 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70  3ExprCachePush(p
1f750 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71  Parse);.      sq
1f760 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
1f770 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
1f780 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75  pRight, dest, ju
1f790 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
1f7a0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
1f7b0 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20  ePop(pParse);.  
1f7c0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1f7d0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a  .    case TK_OR:
1f7e0 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 32 20   {.      int d2 
1f7f0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
1f800 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
1f810 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
1f820 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  fNull==0 );.    
1f830 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54    sqlite3ExprIfT
1f840 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  rue(pParse, pExp
1f850 72 2d 3e 70 4c 65 66 74 2c 20 64 32 2c 20 6a 75  r->pLeft, d2, ju
1f860 6d 70 49 66 4e 75 6c 6c 5e 53 51 4c 49 54 45 5f  mpIfNull^SQLITE_
1f870 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20  JUMPIFNULL);.   
1f880 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
1f890 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b  chePush(pParse);
1f8a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1f8b0 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
1f8c0 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
1f8d0 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
1f8e0 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  l);.      sqlite
1f8f0 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
1f900 6c 28 76 2c 20 64 32 29 3b 0a 20 20 20 20 20 20  l(v, d2);.      
1f910 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
1f920 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Pop(pParse);.   
1f930 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1f940 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a      case TK_NOT:
1f950 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   {.      testcas
1f960 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  e( jumpIfNull==0
1f970 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
1f980 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72  3ExprIfTrue(pPar
1f990 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
1f9a0 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
1f9b0 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ll);.      break
1f9c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1f9d0 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65   TK_LT:.    case
1f9e0 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65   TK_LE:.    case
1f9f0 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65   TK_GT:.    case
1fa00 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65   TK_GE:.    case
1fa10 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65   TK_NE:.    case
1fa20 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20   TK_EQ: {.      
1fa30 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
1fa40 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Null==0 );.     
1fa50 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r1 = sqlite3Exp
1fa60 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
1fa70 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
1fa80 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20  &regFree1);.    
1fa90 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78    r2 = sqlite3Ex
1faa0 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
1fab0 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  e, pExpr->pRight
1fac0 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20  , &regFree2);.  
1fad0 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28      codeCompare(
1fae0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
1faf0 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69  Left, pExpr->pRi
1fb00 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20  ght, op,.       
1fb10 20 20 20 20 20 20 20 20 20 20 20 72 31 2c 20 72             r1, r
1fb20 32 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  2, dest, jumpIfN
1fb30 75 6c 6c 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ull);.      asse
1fb40 72 74 28 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 29  rt(TK_LT==OP_Lt)
1fb50 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f  ; testcase(op==O
1fb60 50 5f 4c 74 29 3b 20 56 64 62 65 43 6f 76 65 72  P_Lt); VdbeCover
1fb70 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c  ageIf(v,op==OP_L
1fb80 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  t);.      assert
1fb90 28 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 29 3b 20  (TK_LE==OP_Le); 
1fba0 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
1fbb0 4c 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Le); VdbeCoverag
1fbc0 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 65 29  eIf(v,op==OP_Le)
1fbd0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54  ;.      assert(T
1fbe0 4b 5f 47 54 3d 3d 4f 50 5f 47 74 29 3b 20 74 65  K_GT==OP_Gt); te
1fbf0 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 74  stcase(op==OP_Gt
1fc00 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49  ); VdbeCoverageI
1fc10 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 74 29 3b 0a  f(v,op==OP_Gt);.
1fc20 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f        assert(TK_
1fc30 47 45 3d 3d 4f 50 5f 47 65 29 3b 20 74 65 73 74  GE==OP_Ge); test
1fc40 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 65 29 3b  case(op==OP_Ge);
1fc50 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
1fc60 76 2c 6f 70 3d 3d 4f 50 5f 47 65 29 3b 0a 20 20  v,op==OP_Ge);.  
1fc70 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 45 51      assert(TK_EQ
1fc80 3d 3d 4f 50 5f 45 71 29 3b 20 74 65 73 74 63 61  ==OP_Eq); testca
1fc90 73 65 28 6f 70 3d 3d 4f 50 5f 45 71 29 3b 20 56  se(op==OP_Eq); V
1fca0 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
1fcb0 6f 70 3d 3d 4f 50 5f 45 71 29 3b 0a 20 20 20 20  op==OP_Eq);.    
1fcc0 20 20 61 73 73 65 72 74 28 54 4b 5f 4e 45 3d 3d    assert(TK_NE==
1fcd0 4f 50 5f 4e 65 29 3b 20 74 65 73 74 63 61 73 65  OP_Ne); testcase
1fce0 28 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 20 56 64 62  (op==OP_Ne); Vdb
1fcf0 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70  eCoverageIf(v,op
1fd00 3d 3d 4f 50 5f 4e 65 29 3b 0a 20 20 20 20 20 20  ==OP_Ne);.      
1fd10 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
1fd20 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74  e1==0 );.      t
1fd30 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
1fd40 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72  2==0 );.      br
1fd50 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
1fd60 61 73 65 20 54 4b 5f 49 53 3a 0a 20 20 20 20 63  ase TK_IS:.    c
1fd70 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 20 7b 0a  ase TK_ISNOT: {.
1fd80 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1fd90 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53  pExpr->op==TK_IS
1fda0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
1fdb0 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
1fdc0 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20 20 20 20 20  K_ISNOT );.     
1fdd0 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r1 = sqlite3Exp
1fde0 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
1fdf0 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
1fe00 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20  &regFree1);.    
1fe10 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78    r2 = sqlite3Ex
1fe20 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
1fe30 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  e, pExpr->pRight
1fe40 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20  , &regFree2);.  
1fe50 20 20 20 20 6f 70 20 3d 20 28 70 45 78 70 72 2d      op = (pExpr-
1fe60 3e 6f 70 3d 3d 54 4b 5f 49 53 29 20 3f 20 54 4b  >op==TK_IS) ? TK
1fe70 5f 4e 45 20 3a 20 54 4b 5f 45 51 3b 0a 20 20 20  _NE : TK_EQ;.   
1fe80 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70     codeCompare(p
1fe90 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
1fea0 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  eft, pExpr->pRig
1feb0 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20 20  ht, op,.        
1fec0 20 20 20 20 20 20 20 20 20 20 72 31 2c 20 72 32            r1, r2
1fed0 2c 20 64 65 73 74 2c 20 53 51 4c 49 54 45 5f 4e  , dest, SQLITE_N
1fee0 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 56 64  ULLEQ);.      Vd
1fef0 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
1ff00 6f 70 3d 3d 54 4b 5f 45 51 29 3b 0a 20 20 20 20  op==TK_EQ);.    
1ff10 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
1ff20 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4e 45 29 3b 0a  (v, op==TK_NE);.
1ff30 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1ff40 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
1ff50 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
1ff60 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20  egFree2==0 );.  
1ff70 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1ff80 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e  .    case TK_ISN
1ff90 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  ULL:.    case TK
1ffa0 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20  _NOTNULL: {.    
1ffb0 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78    r1 = sqlite3Ex
1ffc0 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
1ffd0 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
1ffe0 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20   &regFree1);.   
1fff0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
20000 64 4f 70 32 28 76 2c 20 6f 70 2c 20 72 31 2c 20  dOp2(v, op, r1, 
20010 64 65 73 74 29 3b 0a 20 20 20 20 20 20 74 65 73  dest);.      tes
20020 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53  tcase( op==TK_IS
20030 4e 55 4c 4c 20 29 3b 20 20 20 56 64 62 65 43 6f  NULL );   VdbeCo
20040 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
20050 54 4b 5f 49 53 4e 55 4c 4c 29 3b 0a 20 20 20 20  TK_ISNULL);.    
20060 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
20070 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 20 20 56  TK_NOTNULL );  V
20080 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
20090 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 29   op==TK_NOTNULL)
200a0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
200b0 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  ( regFree1==0 );
200c0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
200d0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
200e0 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20  BETWEEN: {.     
200f0 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
20100 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  fNull==0 );.    
20110 20 20 65 78 70 72 43 6f 64 65 42 65 74 77 65 65    exprCodeBetwee
20120 6e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  n(pParse, pExpr,
20130 20 64 65 73 74 2c 20 30 2c 20 6a 75 6d 70 49 66   dest, 0, jumpIf
20140 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65  Null);.      bre
20150 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  ak;.    }.#ifnde
20160 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
20170 42 51 55 45 52 59 0a 20 20 20 20 63 61 73 65 20  BQUERY.    case 
20180 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69  TK_IN: {.      i
20190 66 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 29 7b  f( jumpIfNull ){
201a0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
201b0 45 78 70 72 43 6f 64 65 49 4e 28 70 50 61 72 73  ExprCodeIN(pPars
201c0 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74 2c 20  e, pExpr, dest, 
201d0 64 65 73 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c  dest);.      }el
201e0 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  se{.        int 
201f0 64 65 73 74 49 66 4e 75 6c 6c 20 3d 20 73 71 6c  destIfNull = sql
20200 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
20210 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71  l(v);.        sq
20220 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e 28  lite3ExprCodeIN(
20230 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64  pParse, pExpr, d
20240 65 73 74 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29  est, destIfNull)
20250 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
20260 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
20270 6c 28 76 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29  l(v, destIfNull)
20280 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
20290 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
202a0 64 69 66 0a 20 20 20 20 64 65 66 61 75 6c 74 3a  dif.    default:
202b0 20 7b 0a 20 20 20 20 20 20 69 66 28 20 65 78 70   {.      if( exp
202c0 72 41 6c 77 61 79 73 46 61 6c 73 65 28 70 45 78  rAlwaysFalse(pEx
202d0 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73  pr) ){.        s
202e0 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76  qlite3VdbeGoto(v
202f0 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 7d  , dest);.      }
20300 65 6c 73 65 20 69 66 28 20 65 78 70 72 41 6c 77  else if( exprAlw
20310 61 79 73 54 72 75 65 28 70 45 78 70 72 29 20 29  aysTrue(pExpr) )
20320 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 6e 6f 2d  {.        /* no-
20330 6f 70 20 2a 2f 0a 20 20 20 20 20 20 7d 65 6c 73  op */.      }els
20340 65 7b 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20  e{.        r1 = 
20350 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
20360 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
20370 72 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20  r, &regFree1);. 
20380 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
20390 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
203a0 66 4e 6f 74 2c 20 72 31 2c 20 64 65 73 74 2c 20  fNot, r1, dest, 
203b0 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 29 3b 0a  jumpIfNull!=0);.
203c0 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
203d0 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
203e0 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
203f0 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee1==0 );.      
20400 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
20410 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  IfNull==0 );.   
20420 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
20430 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
20440 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
20450 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46  Reg(pParse, regF
20460 72 65 65 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  ree1);.  sqlite3
20470 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
20480 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 32 29  Parse, regFree2)
20490 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 69 6b 65 20  ;.}../*.** Like 
204a0 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
204b0 73 65 28 29 20 65 78 63 65 70 74 20 74 68 61 74  se() except that
204c0 20 61 20 63 6f 70 79 20 69 73 20 6d 61 64 65 20   a copy is made 
204d0 6f 66 20 70 45 78 70 72 20 62 65 66 6f 72 65 0a  of pExpr before.
204e0 2a 2a 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69  ** code generati
204f0 6f 6e 2c 20 61 6e 64 20 74 68 61 74 20 63 6f 70  on, and that cop
20500 79 20 69 73 20 64 65 6c 65 74 65 64 20 61 66 74  y is deleted aft
20510 65 72 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69  er code generati
20520 6f 6e 2e 20 54 68 69 73 0a 2a 2a 20 65 6e 73 75  on. This.** ensu
20530 72 65 73 20 74 68 61 74 20 74 68 65 20 6f 72 69  res that the ori
20540 67 69 6e 61 6c 20 70 45 78 70 72 20 69 73 20 75  ginal pExpr is u
20550 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 76 6f 69  nchanged..*/.voi
20560 64 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46  d sqlite3ExprIfF
20570 61 6c 73 65 44 75 70 28 50 61 72 73 65 20 2a 70  alseDup(Parse *p
20580 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
20590 70 72 2c 20 69 6e 74 20 64 65 73 74 2c 69 6e 74  pr, int dest,int
205a0 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20   jumpIfNull){.  
205b0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
205c0 61 72 73 65 2d 3e 64 62 3b 0a 20 20 45 78 70 72  arse->db;.  Expr
205d0 20 2a 70 43 6f 70 79 20 3d 20 73 71 6c 69 74 65   *pCopy = sqlite
205e0 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 45 78  3ExprDup(db, pEx
205f0 70 72 2c 20 30 29 3b 0a 20 20 69 66 28 20 64 62  pr, 0);.  if( db
20600 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d  ->mallocFailed==
20610 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
20620 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
20630 73 65 2c 20 70 43 6f 70 79 2c 20 64 65 73 74 2c  se, pCopy, dest,
20640 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
20650 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  }.  sqlite3ExprD
20660 65 6c 65 74 65 28 64 62 2c 20 70 43 6f 70 79 29  elete(db, pCopy)
20670 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 61  ;.}.../*.** Do a
20680 20 64 65 65 70 20 63 6f 6d 70 61 72 69 73 6f 6e   deep comparison
20690 20 6f 66 20 74 77 6f 20 65 78 70 72 65 73 73 69   of two expressi
206a0 6f 6e 20 74 72 65 65 73 2e 20 20 52 65 74 75 72  on trees.  Retur
206b0 6e 20 30 20 69 66 20 74 68 65 20 74 77 6f 0a 2a  n 0 if the two.*
206c0 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72  * expressions ar
206d0 65 20 63 6f 6d 70 6c 65 74 65 6c 79 20 69 64 65  e completely ide
206e0 6e 74 69 63 61 6c 2e 20 20 52 65 74 75 72 6e 20  ntical.  Return 
206f0 31 20 69 66 20 74 68 65 79 20 64 69 66 66 65 72  1 if they differ
20700 20 6f 6e 6c 79 0a 2a 2a 20 62 79 20 61 20 43 4f   only.** by a CO
20710 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 20 61  LLATE operator a
20720 74 20 74 68 65 20 74 6f 70 20 6c 65 76 65 6c 2e  t the top level.
20730 20 20 52 65 74 75 72 6e 20 32 20 69 66 20 74 68    Return 2 if th
20740 65 72 65 20 61 72 65 20 64 69 66 66 65 72 65 6e  ere are differen
20750 63 65 73 0a 2a 2a 20 6f 74 68 65 72 20 74 68 61  ces.** other tha
20760 6e 20 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c 20  n the top-level 
20770 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72  COLLATE operator
20780 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 20 73  ..**.** If any s
20790 75 62 65 6c 65 6d 65 6e 74 20 6f 66 20 70 42 20  ubelement of pB 
207a0 68 61 73 20 45 78 70 72 2e 69 54 61 62 6c 65 3d  has Expr.iTable=
207b0 3d 28 2d 31 29 20 74 68 65 6e 20 69 74 20 69 73  =(-1) then it is
207c0 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 63   allowed.** to c
207d0 6f 6d 70 61 72 65 20 65 71 75 61 6c 20 74 6f 20  ompare equal to 
207e0 61 6e 20 65 71 75 69 76 61 6c 65 6e 74 20 65 6c  an equivalent el
207f0 65 6d 65 6e 74 20 69 6e 20 70 41 20 77 69 74 68  ement in pA with
20800 20 45 78 70 72 2e 69 54 61 62 6c 65 3d 3d 69 54   Expr.iTable==iT
20810 61 62 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 41  ab..**.** The pA
20820 20 73 69 64 65 20 6d 69 67 68 74 20 62 65 20 75   side might be u
20830 73 69 6e 67 20 54 4b 5f 52 45 47 49 53 54 45 52  sing TK_REGISTER
20840 2e 20 20 49 66 20 74 68 61 74 20 69 73 20 74 68  .  If that is th
20850 65 20 63 61 73 65 20 61 6e 64 20 70 42 20 69 73  e case and pB is
20860 0a 2a 2a 20 6e 6f 74 20 75 73 69 6e 67 20 54 4b  .** not using TK
20870 5f 52 45 47 49 53 54 45 52 20 62 75 74 20 69 73  _REGISTER but is
20880 20 6f 74 68 65 72 77 69 73 65 20 65 71 75 69 76   otherwise equiv
20890 61 6c 65 6e 74 2c 20 74 68 65 6e 20 73 74 69 6c  alent, then stil
208a0 6c 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2a 0a 2a  l return 0..**.*
208b0 2a 20 53 6f 6d 65 74 69 6d 65 73 20 74 68 69 73  * Sometimes this
208c0 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65   routine will re
208d0 74 75 72 6e 20 32 20 65 76 65 6e 20 69 66 20 74  turn 2 even if t
208e0 68 65 20 74 77 6f 20 65 78 70 72 65 73 73 69 6f  he two expressio
208f0 6e 73 0a 2a 2a 20 72 65 61 6c 6c 79 20 61 72 65  ns.** really are
20900 20 65 71 75 69 76 61 6c 65 6e 74 2e 20 20 49 66   equivalent.  If
20910 20 77 65 20 63 61 6e 6e 6f 74 20 70 72 6f 76 65   we cannot prove
20920 20 74 68 61 74 20 74 68 65 20 65 78 70 72 65 73   that the expres
20930 73 69 6f 6e 73 20 61 72 65 0a 2a 2a 20 69 64 65  sions are.** ide
20940 6e 74 69 63 61 6c 2c 20 77 65 20 72 65 74 75 72  ntical, we retur
20950 6e 20 32 20 6a 75 73 74 20 74 6f 20 62 65 20 73  n 2 just to be s
20960 61 66 65 2e 20 20 53 6f 20 69 66 20 74 68 69 73  afe.  So if this
20970 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75   routine.** retu
20980 72 6e 73 20 32 2c 20 74 68 65 6e 20 79 6f 75 20  rns 2, then you 
20990 64 6f 20 6e 6f 74 20 72 65 61 6c 6c 79 20 6b 6e  do not really kn
209a0 6f 77 20 66 6f 72 20 63 65 72 74 61 69 6e 20 69  ow for certain i
209b0 66 20 74 68 65 20 74 77 6f 0a 2a 2a 20 65 78 70  f the two.** exp
209c0 72 65 73 73 69 6f 6e 73 20 61 72 65 20 74 68 65  ressions are the
209d0 20 73 61 6d 65 2e 20 20 42 75 74 20 69 66 20 79   same.  But if y
209e0 6f 75 20 67 65 74 20 61 20 30 20 6f 72 20 31 20  ou get a 0 or 1 
209f0 72 65 74 75 72 6e 2c 20 74 68 65 6e 20 79 6f 75  return, then you
20a00 0a 2a 2a 20 63 61 6e 20 62 65 20 73 75 72 65 20  .** can be sure 
20a10 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20  the expressions 
20a20 61 72 65 20 74 68 65 20 73 61 6d 65 2e 20 20 49  are the same.  I
20a30 6e 20 74 68 65 20 70 6c 61 63 65 73 20 77 68 65  n the places whe
20a40 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  re.** this routi
20a50 6e 65 20 69 73 20 75 73 65 64 2c 20 69 74 20 64  ne is used, it d
20a60 6f 65 73 20 6e 6f 74 20 68 75 72 74 20 74 6f 20  oes not hurt to 
20a70 67 65 74 20 61 6e 20 65 78 74 72 61 20 32 20 2d  get an extra 2 -
20a80 20 74 68 61 74 0a 2a 2a 20 6a 75 73 74 20 6d 69   that.** just mi
20a90 67 68 74 20 72 65 73 75 6c 74 20 69 6e 20 73 6f  ght result in so
20aa0 6d 65 20 73 6c 69 67 68 74 6c 79 20 73 6c 6f 77  me slightly slow
20ab0 65 72 20 63 6f 64 65 2e 20 20 42 75 74 20 72 65  er code.  But re
20ac0 74 75 72 6e 69 6e 67 0a 2a 2a 20 61 6e 20 69 6e  turning.** an in
20ad0 63 6f 72 72 65 63 74 20 30 20 6f 72 20 31 20 63  correct 0 or 1 c
20ae0 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20 61 20 6d  ould lead to a m
20af0 61 6c 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69  alfunction..*/.i
20b00 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  nt sqlite3ExprCo
20b10 6d 70 61 72 65 28 45 78 70 72 20 2a 70 41 2c 20  mpare(Expr *pA, 
20b20 45 78 70 72 20 2a 70 42 2c 20 69 6e 74 20 69 54  Expr *pB, int iT
20b30 61 62 29 7b 0a 20 20 75 33 32 20 63 6f 6d 62 69  ab){.  u32 combi
20b40 6e 65 64 46 6c 61 67 73 3b 0a 20 20 69 66 28 20  nedFlags;.  if( 
20b50 70 41 3d 3d 30 20 7c 7c 20 70 42 3d 3d 30 20 29  pA==0 || pB==0 )
20b60 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 42 3d  {.    return pB=
20b70 3d 70 41 20 3f 20 30 20 3a 20 32 3b 0a 20 20 7d  =pA ? 0 : 2;.  }
20b80 0a 20 20 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73  .  combinedFlags
20b90 20 3d 20 70 41 2d 3e 66 6c 61 67 73 20 7c 20 70   = pA->flags | p
20ba0 42 2d 3e 66 6c 61 67 73 3b 0a 20 20 69 66 28 20  B->flags;.  if( 
20bb0 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20 26 20  combinedFlags & 
20bc0 45 50 5f 49 6e 74 56 61 6c 75 65 20 29 7b 0a 20  EP_IntValue ){. 
20bd0 20 20 20 69 66 28 20 28 70 41 2d 3e 66 6c 61 67     if( (pA->flag
20be0 73 26 70 42 2d 3e 66 6c 61 67 73 26 45 50 5f 49  s&pB->flags&EP_I
20bf0 6e 74 56 61 6c 75 65 29 21 3d 30 20 26 26 20 70  ntValue)!=0 && p
20c00 41 2d 3e 75 2e 69 56 61 6c 75 65 3d 3d 70 42 2d  A->u.iValue==pB-
20c10 3e 75 2e 69 56 61 6c 75 65 20 29 7b 0a 20 20 20  >u.iValue ){.   
20c20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
20c30 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 32 3b   }.    return 2;
20c40 0a 20 20 7d 0a 20 20 69 66 28 20 70 41 2d 3e 6f  .  }.  if( pA->o
20c50 70 21 3d 70 42 2d 3e 6f 70 20 29 7b 0a 20 20 20  p!=pB->op ){.   
20c60 20 69 66 28 20 70 41 2d 3e 6f 70 3d 3d 54 4b 5f   if( pA->op==TK_
20c70 43 4f 4c 4c 41 54 45 20 26 26 20 73 71 6c 69 74  COLLATE && sqlit
20c80 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 41  e3ExprCompare(pA
20c90 2d 3e 70 4c 65 66 74 2c 20 70 42 2c 20 69 54 61  ->pLeft, pB, iTa
20ca0 62 29 3c 32 20 29 7b 0a 20 20 20 20 20 20 72 65  b)<2 ){.      re
20cb0 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
20cc0 20 20 69 66 28 20 70 42 2d 3e 6f 70 3d 3d 54 4b    if( pB->op==TK
20cd0 5f 43 4f 4c 4c 41 54 45 20 26 26 20 73 71 6c 69  _COLLATE && sqli
20ce0 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70  te3ExprCompare(p
20cf0 41 2c 20 70 42 2d 3e 70 4c 65 66 74 2c 20 69 54  A, pB->pLeft, iT
20d00 61 62 29 3c 32 20 29 7b 0a 20 20 20 20 20 20 72  ab)<2 ){.      r
20d10 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
20d20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 7d     return 2;.  }
20d30 0a 20 20 69 66 28 20 70 41 2d 3e 6f 70 21 3d 54  .  if( pA->op!=T
20d40 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 41 2d 3e  K_COLUMN && pA->
20d50 6f 70 21 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  op!=TK_AGG_COLUM
20d60 4e 20 26 26 20 70 41 2d 3e 75 2e 7a 54 6f 6b 65  N && pA->u.zToke
20d70 6e 20 29 7b 0a 20 20 20 20 69 66 28 20 70 41 2d  n ){.    if( pA-
20d80 3e 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e  >op==TK_FUNCTION
20d90 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71   ){.      if( sq
20da0 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 41 2d  lite3StrICmp(pA-
20db0 3e 75 2e 7a 54 6f 6b 65 6e 2c 70 42 2d 3e 75 2e  >u.zToken,pB->u.
20dc0 7a 54 6f 6b 65 6e 29 21 3d 30 20 29 20 72 65 74  zToken)!=0 ) ret
20dd0 75 72 6e 20 32 3b 0a 20 20 20 20 7d 65 6c 73 65  urn 2;.    }else
20de0 20 69 66 28 20 73 74 72 63 6d 70 28 70 41 2d 3e   if( strcmp(pA->
20df0 75 2e 7a 54 6f 6b 65 6e 2c 70 42 2d 3e 75 2e 7a  u.zToken,pB->u.z
20e00 54 6f 6b 65 6e 29 21 3d 30 20 29 7b 0a 20 20 20  Token)!=0 ){.   
20e10 20 20 20 72 65 74 75 72 6e 20 70 41 2d 3e 6f 70     return pA->op
20e20 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 3f 20 31  ==TK_COLLATE ? 1
20e30 20 3a 20 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   : 2;.    }.  }.
20e40 20 20 69 66 28 20 28 70 41 2d 3e 66 6c 61 67 73    if( (pA->flags
20e50 20 26 20 45 50 5f 44 69 73 74 69 6e 63 74 29 21   & EP_Distinct)!
20e60 3d 28 70 42 2d 3e 66 6c 61 67 73 20 26 20 45 50  =(pB->flags & EP
20e70 5f 44 69 73 74 69 6e 63 74 29 20 29 20 72 65 74  _Distinct) ) ret
20e80 75 72 6e 20 32 3b 0a 20 20 69 66 28 20 41 4c 57  urn 2;.  if( ALW
20e90 41 59 53 28 28 63 6f 6d 62 69 6e 65 64 46 6c 61  AYS((combinedFla
20ea0 67 73 20 26 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  gs & EP_TokenOnl
20eb0 79 29 3d 3d 30 29 20 29 7b 0a 20 20 20 20 69 66  y)==0) ){.    if
20ec0 28 20 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20  ( combinedFlags 
20ed0 26 20 45 50 5f 78 49 73 53 65 6c 65 63 74 20 29  & EP_xIsSelect )
20ee0 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 69   return 2;.    i
20ef0 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  f( sqlite3ExprCo
20f00 6d 70 61 72 65 28 70 41 2d 3e 70 4c 65 66 74 2c  mpare(pA->pLeft,
20f10 20 70 42 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62   pB->pLeft, iTab
20f20 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20  ) ) return 2;.  
20f30 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
20f40 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e 70 52 69  rCompare(pA->pRi
20f50 67 68 74 2c 20 70 42 2d 3e 70 52 69 67 68 74 2c  ght, pB->pRight,
20f60 20 69 54 61 62 29 20 29 20 72 65 74 75 72 6e 20   iTab) ) return 
20f70 32 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  2;.    if( sqlit
20f80 65 33 45 78 70 72 4c 69 73 74 43 6f 6d 70 61 72  e3ExprListCompar
20f90 65 28 70 41 2d 3e 78 2e 70 4c 69 73 74 2c 20 70  e(pA->x.pList, p
20fa0 42 2d 3e 78 2e 70 4c 69 73 74 2c 20 69 54 61 62  B->x.pList, iTab
20fb0 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20  ) ) return 2;.  
20fc0 20 20 69 66 28 20 41 4c 57 41 59 53 28 28 63 6f    if( ALWAYS((co
20fd0 6d 62 69 6e 65 64 46 6c 61 67 73 20 26 20 45 50  mbinedFlags & EP
20fe0 5f 52 65 64 75 63 65 64 29 3d 3d 30 29 20 26 26  _Reduced)==0) &&
20ff0 20 70 41 2d 3e 6f 70 21 3d 54 4b 5f 53 54 52 49   pA->op!=TK_STRI
21000 4e 47 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  NG ){.      if( 
21010 70 41 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70 42 2d  pA->iColumn!=pB-
21020 3e 69 43 6f 6c 75 6d 6e 20 29 20 72 65 74 75 72  >iColumn ) retur
21030 6e 20 32 3b 0a 20 20 20 20 20 20 69 66 28 20 70  n 2;.      if( p
21040 41 2d 3e 69 54 61 62 6c 65 21 3d 70 42 2d 3e 69  A->iTable!=pB->i
21050 54 61 62 6c 65 20 0a 20 20 20 20 20 20 20 26 26  Table .       &&
21060 20 28 70 41 2d 3e 69 54 61 62 6c 65 21 3d 69 54   (pA->iTable!=iT
21070 61 62 20 7c 7c 20 4e 45 56 45 52 28 70 42 2d 3e  ab || NEVER(pB->
21080 69 54 61 62 6c 65 3e 3d 30 29 29 20 29 20 72 65  iTable>=0)) ) re
21090 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d 0a 20 20  turn 2;.    }.  
210a0 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
210b0 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74  ./*.** Compare t
210c0 77 6f 20 45 78 70 72 4c 69 73 74 20 6f 62 6a 65  wo ExprList obje
210d0 63 74 73 2e 20 20 52 65 74 75 72 6e 20 30 20 69  cts.  Return 0 i
210e0 66 20 74 68 65 79 20 61 72 65 20 69 64 65 6e 74  f they are ident
210f0 69 63 61 6c 20 61 6e 64 20 0a 2a 2a 20 6e 6f 6e  ical and .** non
21100 2d 7a 65 72 6f 20 69 66 20 74 68 65 79 20 64 69  -zero if they di
21110 66 66 65 72 20 69 6e 20 61 6e 79 20 77 61 79 2e  ffer in any way.
21120 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 20 73 75  .**.** If any su
21130 62 65 6c 65 6d 65 6e 74 20 6f 66 20 70 42 20 68  belement of pB h
21140 61 73 20 45 78 70 72 2e 69 54 61 62 6c 65 3d 3d  as Expr.iTable==
21150 28 2d 31 29 20 74 68 65 6e 20 69 74 20 69 73 20  (-1) then it is 
21160 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 63 6f  allowed.** to co
21170 6d 70 61 72 65 20 65 71 75 61 6c 20 74 6f 20 61  mpare equal to a
21180 6e 20 65 71 75 69 76 61 6c 65 6e 74 20 65 6c 65  n equivalent ele
21190 6d 65 6e 74 20 69 6e 20 70 41 20 77 69 74 68 20  ment in pA with 
211a0 45 78 70 72 2e 69 54 61 62 6c 65 3d 3d 69 54 61  Expr.iTable==iTa
211b0 62 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  b..**.** This ro
211c0 75 74 69 6e 65 20 6d 69 67 68 74 20 72 65 74 75  utine might retu
211d0 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 66 6f 72 20  rn non-zero for 
211e0 65 71 75 69 76 61 6c 65 6e 74 20 45 78 70 72 4c  equivalent ExprL
211f0 69 73 74 73 2e 20 20 54 68 65 0a 2a 2a 20 6f 6e  ists.  The.** on
21200 6c 79 20 63 6f 6e 73 65 71 75 65 6e 63 65 20 77  ly consequence w
21210 69 6c 6c 20 62 65 20 64 69 73 61 62 6c 65 64 20  ill be disabled 
21220 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 2e 20 20  optimizations.  
21230 42 75 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65  But this routine
21240 0a 2a 2a 20 6d 75 73 74 20 6e 65 76 65 72 20 72  .** must never r
21250 65 74 75 72 6e 20 30 20 69 66 20 74 68 65 20 74  eturn 0 if the t
21260 77 6f 20 45 78 70 72 4c 69 73 74 20 6f 62 6a 65  wo ExprList obje
21270 63 74 73 20 61 72 65 20 64 69 66 66 65 72 65 6e  cts are differen
21280 74 2c 20 6f 72 0a 2a 2a 20 61 20 6d 61 6c 66 75  t, or.** a malfu
21290 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 72 65 73 75  nction will resu
212a0 6c 74 2e 0a 2a 2a 0a 2a 2a 20 54 77 6f 20 4e 55  lt..**.** Two NU
212b0 4c 4c 20 70 6f 69 6e 74 65 72 73 20 61 72 65 20  LL pointers are 
212c0 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65  considered to be
212d0 20 74 68 65 20 73 61 6d 65 2e 20 20 42 75 74 20   the same.  But 
212e0 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 0a 2a  a NULL pointer.*
212f0 2a 20 61 6c 77 61 79 73 20 64 69 66 66 65 72 73  * always differs
21300 20 66 72 6f 6d 20 61 20 6e 6f 6e 2d 4e 55 4c 4c   from a non-NULL
21310 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 69 6e 74   pointer..*/.int
21320 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
21330 43 6f 6d 70 61 72 65 28 45 78 70 72 4c 69 73 74  Compare(ExprList
21340 20 2a 70 41 2c 20 45 78 70 72 4c 69 73 74 20 2a   *pA, ExprList *
21350 70 42 2c 20 69 6e 74 20 69 54 61 62 29 7b 0a 20  pB, int iTab){. 
21360 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 41   int i;.  if( pA
21370 3d 3d 30 20 26 26 20 70 42 3d 3d 30 20 29 20 72  ==0 && pB==0 ) r
21380 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70  eturn 0;.  if( p
21390 41 3d 3d 30 20 7c 7c 20 70 42 3d 3d 30 20 29 20  A==0 || pB==0 ) 
213a0 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20  return 1;.  if( 
213b0 70 41 2d 3e 6e 45 78 70 72 21 3d 70 42 2d 3e 6e  pA->nExpr!=pB->n
213c0 45 78 70 72 20 29 20 72 65 74 75 72 6e 20 31 3b  Expr ) return 1;
213d0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41  .  for(i=0; i<pA
213e0 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
213f0 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 41 20     Expr *pExprA 
21400 3d 20 70 41 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  = pA->a[i].pExpr
21410 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70  ;.    Expr *pExp
21420 72 42 20 3d 20 70 42 2d 3e 61 5b 69 5d 2e 70 45  rB = pB->a[i].pE
21430 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70 41 2d  xpr;.    if( pA-
21440 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 21  >a[i].sortOrder!
21450 3d 70 42 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72  =pB->a[i].sortOr
21460 64 65 72 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  der ) return 1;.
21470 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
21480 78 70 72 43 6f 6d 70 61 72 65 28 70 45 78 70 72  xprCompare(pExpr
21490 41 2c 20 70 45 78 70 72 42 2c 20 69 54 61 62 29  A, pExprB, iTab)
214a0 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d   ) return 1;.  }
214b0 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
214c0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
214d0 65 20 69 66 20 77 65 20 63 61 6e 20 70 72 6f 76  e if we can prov
214e0 65 20 74 68 65 20 70 45 32 20 77 69 6c 6c 20 61  e the pE2 will a
214f0 6c 77 61 79 73 20 62 65 20 74 72 75 65 20 69 66  lways be true if
21500 20 70 45 31 20 69 73 0a 2a 2a 20 74 72 75 65 2e   pE1 is.** true.
21510 20 20 52 65 74 75 72 6e 20 66 61 6c 73 65 20 69    Return false i
21520 66 20 77 65 20 63 61 6e 6e 6f 74 20 63 6f 6d 70  f we cannot comp
21530 6c 65 74 65 20 74 68 65 20 70 72 6f 6f 66 20 6f  lete the proof o
21540 72 20 69 66 20 70 45 32 20 6d 69 67 68 74 0a 2a  r if pE2 might.*
21550 2a 20 62 65 20 66 61 6c 73 65 2e 20 20 45 78 61  * be false.  Exa
21560 6d 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  mples:.**.**    
21570 20 70 45 31 3a 20 78 3d 3d 35 20 20 20 20 20 20   pE1: x==5      
21580 20 70 45 32 3a 20 78 3d 3d 35 20 20 20 20 20 20   pE2: x==5      
21590 20 20 20 20 20 20 20 52 65 73 75 6c 74 3a 20 74         Result: t
215a0 72 75 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20  rue.**     pE1: 
215b0 78 3e 30 20 20 20 20 20 20 20 20 70 45 32 3a 20  x>0        pE2: 
215c0 78 3d 3d 35 20 20 20 20 20 20 20 20 20 20 20 20  x==5            
215d0 20 52 65 73 75 6c 74 3a 20 66 61 6c 73 65 0a 2a   Result: false.*
215e0 2a 20 20 20 20 20 70 45 31 3a 20 78 3d 32 31 20  *     pE1: x=21 
215f0 20 20 20 20 20 20 70 45 32 3a 20 78 3d 32 31 20        pE2: x=21 
21600 4f 52 20 79 3d 34 33 20 20 20 20 20 52 65 73 75  OR y=43     Resu
21610 6c 74 3a 20 74 72 75 65 0a 2a 2a 20 20 20 20 20  lt: true.**     
21620 70 45 31 3a 20 78 21 3d 31 32 33 20 20 20 20 20  pE1: x!=123     
21630 70 45 32 3a 20 78 20 49 53 20 4e 4f 54 20 4e 55  pE2: x IS NOT NU
21640 4c 4c 20 20 20 20 52 65 73 75 6c 74 3a 20 74 72  LL    Result: tr
21650 75 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78  ue.**     pE1: x
21660 21 3d 3f 31 20 20 20 20 20 20 70 45 32 3a 20 78  !=?1      pE2: x
21670 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20   IS NOT NULL    
21680 52 65 73 75 6c 74 3a 20 74 72 75 65 0a 2a 2a 20  Result: true.** 
21690 20 20 20 20 70 45 31 3a 20 78 20 49 53 20 4e 55      pE1: x IS NU
216a0 4c 4c 20 20 70 45 32 3a 20 78 20 49 53 20 4e 4f  LL  pE2: x IS NO
216b0 54 20 4e 55 4c 4c 20 20 20 20 52 65 73 75 6c 74  T NULL    Result
216c0 3a 20 66 61 6c 73 65 0a 2a 2a 20 20 20 20 20 70  : false.**     p
216d0 45 31 3a 20 78 20 49 53 20 3f 32 20 20 20 20 70  E1: x IS ?2    p
216e0 45 32 3a 20 78 20 49 53 20 4e 4f 54 20 4e 55 4c  E2: x IS NOT NUL
216f0 4c 20 20 20 20 52 65 75 73 6c 74 3a 20 66 61 6c  L    Reuslt: fal
21700 73 65 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 63 6f  se.**.** When co
21710 6d 70 61 72 69 6e 67 20 54 4b 5f 43 4f 4c 55 4d  mparing TK_COLUM
21720 4e 20 6e 6f 64 65 73 20 62 65 74 77 65 65 6e 20  N nodes between 
21730 70 45 31 20 61 6e 64 20 70 45 32 2c 20 69 66 20  pE1 and pE2, if 
21740 70 45 32 20 68 61 73 0a 2a 2a 20 45 78 70 72 2e  pE2 has.** Expr.
21750 69 54 61 62 6c 65 3c 30 20 74 68 65 6e 20 61 73  iTable<0 then as
21760 73 75 6d 65 20 61 20 74 61 62 6c 65 20 6e 75 6d  sume a table num
21770 62 65 72 20 67 69 76 65 6e 20 62 79 20 69 54 61  ber given by iTa
21780 62 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 69 6e  b..**.** When in
21790 20 64 6f 75 62 74 2c 20 72 65 74 75 72 6e 20 66   doubt, return f
217a0 61 6c 73 65 2e 20 20 52 65 74 75 72 6e 69 6e 67  alse.  Returning
217b0 20 74 72 75 65 20 6d 69 67 68 74 20 67 69 76 65   true might give
217c0 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a 2a   a performance.*
217d0 2a 20 69 6d 70 72 6f 76 65 6d 65 6e 74 2e 20 20  * improvement.  
217e0 52 65 74 75 72 6e 69 6e 67 20 66 61 6c 73 65 20  Returning false 
217f0 6d 69 67 68 74 20 63 61 75 73 65 20 61 20 70 65  might cause a pe
21800 72 66 6f 72 6d 61 6e 63 65 20 72 65 64 75 63 74  rformance reduct
21810 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20 69 74 20 77  ion, but.** it w
21820 69 6c 6c 20 61 6c 77 61 79 73 20 67 69 76 65 20  ill always give 
21830 74 68 65 20 63 6f 72 72 65 63 74 20 61 6e 73 77  the correct answ
21840 65 72 20 61 6e 64 20 69 73 20 68 65 6e 63 65 20  er and is hence 
21850 61 6c 77 61 79 73 20 73 61 66 65 2e 0a 2a 2f 0a  always safe..*/.
21860 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 49  int sqlite3ExprI
21870 6d 70 6c 69 65 73 45 78 70 72 28 45 78 70 72 20  mpliesExpr(Expr 
21880 2a 70 45 31 2c 20 45 78 70 72 20 2a 70 45 32 2c  *pE1, Expr *pE2,
21890 20 69 6e 74 20 69 54 61 62 29 7b 0a 20 20 69 66   int iTab){.  if
218a0 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  ( sqlite3ExprCom
218b0 70 61 72 65 28 70 45 31 2c 20 70 45 32 2c 20 69  pare(pE1, pE2, i
218c0 54 61 62 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72  Tab)==0 ){.    r
218d0 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69  eturn 1;.  }.  i
218e0 66 28 20 70 45 32 2d 3e 6f 70 3d 3d 54 4b 5f 4f  f( pE2->op==TK_O
218f0 52 0a 20 20 20 26 26 20 28 73 71 6c 69 74 65 33  R.   && (sqlite3
21900 45 78 70 72 49 6d 70 6c 69 65 73 45 78 70 72 28  ExprImpliesExpr(
21910 70 45 31 2c 20 70 45 32 2d 3e 70 4c 65 66 74 2c  pE1, pE2->pLeft,
21920 20 69 54 61 62 29 0a 20 20 20 20 20 20 20 20 20   iTab).         
21930 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 45 78      || sqlite3Ex
21940 70 72 49 6d 70 6c 69 65 73 45 78 70 72 28 70 45  prImpliesExpr(pE
21950 31 2c 20 70 45 32 2d 3e 70 52 69 67 68 74 2c 20  1, pE2->pRight, 
21960 69 54 61 62 29 20 29 0a 20 20 29 7b 0a 20 20 20  iTab) ).  ){.   
21970 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
21980 20 69 66 28 20 70 45 32 2d 3e 6f 70 3d 3d 54 4b   if( pE2->op==TK
21990 5f 4e 4f 54 4e 55 4c 4c 0a 20 20 20 26 26 20 73  _NOTNULL.   && s
219a0 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
219b0 65 28 70 45 31 2d 3e 70 4c 65 66 74 2c 20 70 45  e(pE1->pLeft, pE
219c0 32 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 29 3d  2->pLeft, iTab)=
219d0 3d 30 0a 20 20 20 26 26 20 28 70 45 31 2d 3e 6f  =0.   && (pE1->o
219e0 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20 26 26 20  p!=TK_ISNULL && 
219f0 70 45 31 2d 3e 6f 70 21 3d 54 4b 5f 49 53 29 0a  pE1->op!=TK_IS).
21a00 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20    ){.    return 
21a10 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
21a20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69  0;.}../*.** An i
21a30 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66  nstance of the f
21a40 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75  ollowing structu
21a50 72 65 20 69 73 20 75 73 65 64 20 62 79 20 74 68  re is used by th
21a60 65 20 74 72 65 65 20 77 61 6c 6b 65 72 0a 2a 2a  e tree walker.**
21a70 20 74 6f 20 63 6f 75 6e 74 20 72 65 66 65 72 65   to count refere
21a80 6e 63 65 73 20 74 6f 20 74 61 62 6c 65 20 63 6f  nces to table co
21a90 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 61 72 67  lumns in the arg
21aa0 75 6d 65 6e 74 73 20 6f 66 20 61 6e 20 0a 2a 2a  uments of an .**
21ab0 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
21ac0 69 6f 6e 2c 20 69 6e 20 6f 72 64 65 72 20 74 6f  ion, in order to
21ad0 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 0a 2a   implement the.*
21ae0 2a 20 73 71 6c 69 74 65 33 46 75 6e 63 74 69 6f  * sqlite3Functio
21af0 6e 54 68 69 73 53 72 63 28 29 20 72 6f 75 74 69  nThisSrc() routi
21b00 6e 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 53 72  ne..*/.struct Sr
21b10 63 43 6f 75 6e 74 20 7b 0a 20 20 53 72 63 4c 69  cCount {.  SrcLi
21b20 73 74 20 2a 70 53 72 63 3b 20 20 20 2f 2a 20 4f  st *pSrc;   /* O
21b30 6e 65 20 70 61 72 74 69 63 75 6c 61 72 20 46 52  ne particular FR
21b40 4f 4d 20 63 6c 61 75 73 65 20 69 6e 20 61 20 6e  OM clause in a n
21b50 65 73 74 65 64 20 71 75 65 72 79 20 2a 2f 0a 20  ested query */. 
21b60 20 69 6e 74 20 6e 54 68 69 73 3b 20 20 20 20 20   int nThis;     
21b70 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
21b80 65 66 65 72 65 6e 63 65 73 20 74 6f 20 63 6f 6c  eferences to col
21b90 75 6d 6e 73 20 69 6e 20 70 53 72 63 4c 69 73 74  umns in pSrcList
21ba0 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 74 68 65 72   */.  int nOther
21bb0 3b 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  ;      /* Number
21bc0 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74   of references t
21bd0 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 6f 74 68  o columns in oth
21be0 65 72 20 46 52 4f 4d 20 63 6c 61 75 73 65 73 20  er FROM clauses 
21bf0 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 75  */.};../*.** Cou
21c00 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  nt the number of
21c10 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 63   references to c
21c20 6f 6c 75 6d 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69  olumns..*/.stati
21c30 63 20 69 6e 74 20 65 78 70 72 53 72 63 43 6f 75  c int exprSrcCou
21c40 6e 74 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b  nt(Walker *pWalk
21c50 65 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  er, Expr *pExpr)
21c60 7b 0a 20 20 2f 2a 20 54 68 65 20 4e 45 56 45 52  {.  /* The NEVER
21c70 28 29 20 6f 6e 20 74 68 65 20 73 65 63 6f 6e 64  () on the second
21c80 20 74 65 72 6d 20 69 73 20 62 65 63 61 75 73 65   term is because
21c90 20 73 71 6c 69 74 65 33 46 75 6e 63 74 69 6f 6e   sqlite3Function
21ca0 55 73 65 73 54 68 69 73 53 72 63 28 29 0a 20 20  UsesThisSrc().  
21cb0 2a 2a 20 69 73 20 61 6c 77 61 79 73 20 63 61 6c  ** is always cal
21cc0 6c 65 64 20 62 65 66 6f 72 65 20 73 71 6c 69 74  led before sqlit
21cd0 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
21ce0 72 65 67 61 74 65 73 28 29 20 61 6e 64 20 73 6f  regates() and so
21cf0 20 74 68 65 0a 20 20 2a 2a 20 54 4b 5f 43 4f 4c   the.  ** TK_COL
21d00 55 4d 4e 73 20 68 61 76 65 20 6e 6f 74 20 79 65  UMNs have not ye
21d10 74 20 62 65 65 6e 20 63 6f 6e 76 65 72 74 65 64  t been converted
21d20 20 69 6e 74 6f 20 54 4b 5f 41 47 47 5f 43 4f 4c   into TK_AGG_COL
21d30 55 4d 4e 2e 20 20 49 66 0a 20 20 2a 2a 20 73 71  UMN.  If.  ** sq
21d40 6c 69 74 65 33 46 75 6e 63 74 69 6f 6e 55 73 65  lite3FunctionUse
21d50 73 54 68 69 73 53 72 63 28 29 20 69 73 20 75 73  sThisSrc() is us
21d60 65 64 20 64 69 66 66 65 72 65 6e 74 6c 79 20 69  ed differently i
21d70 6e 20 74 68 65 20 66 75 74 75 72 65 2c 20 74 68  n the future, th
21d80 65 0a 20 20 2a 2a 20 4e 45 56 45 52 28 29 20 77  e.  ** NEVER() w
21d90 69 6c 6c 20 6e 65 65 64 20 74 6f 20 62 65 20 72  ill need to be r
21da0 65 6d 6f 76 65 64 2e 20 2a 2f 0a 20 20 69 66 28  emoved. */.  if(
21db0 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43   pExpr->op==TK_C
21dc0 4f 4c 55 4d 4e 20 7c 7c 20 4e 45 56 45 52 28 70  OLUMN || NEVER(p
21dd0 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47  Expr->op==TK_AGG
21de0 5f 43 4f 4c 55 4d 4e 29 20 29 7b 0a 20 20 20 20  _COLUMN) ){.    
21df0 69 6e 74 20 69 3b 0a 20 20 20 20 73 74 72 75 63  int i;.    struc
21e00 74 20 53 72 63 43 6f 75 6e 74 20 2a 70 20 3d 20  t SrcCount *p = 
21e10 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 53 72 63 43  pWalker->u.pSrcC
21e20 6f 75 6e 74 3b 0a 20 20 20 20 53 72 63 4c 69 73  ount;.    SrcLis
21e30 74 20 2a 70 53 72 63 20 3d 20 70 2d 3e 70 53 72  t *pSrc = p->pSr
21e40 63 3b 0a 20 20 20 20 69 6e 74 20 6e 53 72 63 20  c;.    int nSrc 
21e50 3d 20 70 53 72 63 20 3f 20 70 53 72 63 2d 3e 6e  = pSrc ? pSrc->n
21e60 53 72 63 20 3a 20 30 3b 0a 20 20 20 20 66 6f 72  Src : 0;.    for
21e70 28 69 3d 30 3b 20 69 3c 6e 53 72 63 3b 20 69 2b  (i=0; i<nSrc; i+
21e80 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45  +){.      if( pE
21e90 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 53 72  xpr->iTable==pSr
21ea0 63 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 20  c->a[i].iCursor 
21eb0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20  ) break;.    }. 
21ec0 20 20 20 69 66 28 20 69 3c 6e 53 72 63 20 29 7b     if( i<nSrc ){
21ed0 0a 20 20 20 20 20 20 70 2d 3e 6e 54 68 69 73 2b  .      p->nThis+
21ee0 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  +;.    }else{.  
21ef0 20 20 20 20 70 2d 3e 6e 4f 74 68 65 72 2b 2b 3b      p->nOther++;
21f00 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
21f10 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
21f20 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72  ;.}../*.** Deter
21f30 6d 69 6e 65 20 69 66 20 61 6e 79 20 6f 66 20 74  mine if any of t
21f40 68 65 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20  he arguments to 
21f50 74 68 65 20 70 45 78 70 72 20 46 75 6e 63 74 69  the pExpr Functi
21f60 6f 6e 20 72 65 66 65 72 65 6e 63 65 0a 2a 2a 20  on reference.** 
21f70 70 53 72 63 4c 69 73 74 2e 20 20 52 65 74 75 72  pSrcList.  Retur
21f80 6e 20 74 72 75 65 20 69 66 20 74 68 65 79 20 64  n true if they d
21f90 6f 2e 20 20 41 6c 73 6f 20 72 65 74 75 72 6e 20  o.  Also return 
21fa0 74 72 75 65 20 69 66 20 74 68 65 20 66 75 6e 63  true if the func
21fb0 74 69 6f 6e 0a 2a 2a 20 68 61 73 20 6e 6f 20 61  tion.** has no a
21fc0 72 67 75 6d 65 6e 74 73 20 6f 72 20 68 61 73 20  rguments or has 
21fd0 6f 6e 6c 79 20 63 6f 6e 73 74 61 6e 74 20 61 72  only constant ar
21fe0 67 75 6d 65 6e 74 73 2e 20 20 52 65 74 75 72 6e  guments.  Return
21ff0 20 66 61 6c 73 65 20 69 66 20 70 45 78 70 72 0a   false if pExpr.
22000 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 20 63 6f  ** references co
22010 6c 75 6d 6e 73 20 62 75 74 20 6e 6f 74 20 63 6f  lumns but not co
22020 6c 75 6d 6e 73 20 6f 66 20 74 61 62 6c 65 73 20  lumns of tables 
22030 66 6f 75 6e 64 20 69 6e 20 70 53 72 63 4c 69 73  found in pSrcLis
22040 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
22050 33 46 75 6e 63 74 69 6f 6e 55 73 65 73 54 68 69  3FunctionUsesThi
22060 73 53 72 63 28 45 78 70 72 20 2a 70 45 78 70 72  sSrc(Expr *pExpr
22070 2c 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 4c  , SrcList *pSrcL
22080 69 73 74 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77  ist){.  Walker w
22090 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 43 6f  ;.  struct SrcCo
220a0 75 6e 74 20 63 6e 74 3b 0a 20 20 61 73 73 65 72  unt cnt;.  asser
220b0 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  t( pExpr->op==TK
220c0 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 3b  _AGG_FUNCTION );
220d0 0a 20 20 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c  .  memset(&w, 0,
220e0 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20 77   sizeof(w));.  w
220f0 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d  .xExprCallback =
22100 20 65 78 70 72 53 72 63 43 6f 75 6e 74 3b 0a 20   exprSrcCount;. 
22110 20 77 2e 75 2e 70 53 72 63 43 6f 75 6e 74 20 3d   w.u.pSrcCount =
22120 20 26 63 6e 74 3b 0a 20 20 63 6e 74 2e 70 53 72   &cnt;.  cnt.pSr
22130 63 20 3d 20 70 53 72 63 4c 69 73 74 3b 0a 20 20  c = pSrcList;.  
22140 63 6e 74 2e 6e 54 68 69 73 20 3d 20 30 3b 0a 20  cnt.nThis = 0;. 
22150 20 63 6e 74 2e 6e 4f 74 68 65 72 20 3d 20 30 3b   cnt.nOther = 0;
22160 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78  .  sqlite3WalkEx
22170 70 72 4c 69 73 74 28 26 77 2c 20 70 45 78 70 72  prList(&w, pExpr
22180 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 72 65  ->x.pList);.  re
22190 74 75 72 6e 20 63 6e 74 2e 6e 54 68 69 73 3e 30  turn cnt.nThis>0
221a0 20 7c 7c 20 63 6e 74 2e 6e 4f 74 68 65 72 3d 3d   || cnt.nOther==
221b0 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  0;.}../*.** Add 
221c0 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f  a new element to
221d0 20 74 68 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61   the pAggInfo->a
221e0 43 6f 6c 5b 5d 20 61 72 72 61 79 2e 20 20 52 65  Col[] array.  Re
221f0 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f  turn the index o
22200 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 65 6c 65  f.** the new ele
22210 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 20 61 20  ment.  Return a 
22220 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72 20  negative number 
22230 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 2e  if malloc fails.
22240 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
22250 64 64 41 67 67 49 6e 66 6f 43 6f 6c 75 6d 6e 28  ddAggInfoColumn(
22260 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 41 67 67  sqlite3 *db, Agg
22270 49 6e 66 6f 20 2a 70 49 6e 66 6f 29 7b 0a 20 20  Info *pInfo){.  
22280 69 6e 74 20 69 3b 0a 20 20 70 49 6e 66 6f 2d 3e  int i;.  pInfo->
22290 61 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 41 72  aCol = sqlite3Ar
222a0 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20 20  rayAllocate(.   
222b0 20 20 20 20 64 62 2c 0a 20 20 20 20 20 20 20 70      db,.       p
222c0 49 6e 66 6f 2d 3e 61 43 6f 6c 2c 0a 20 20 20 20  Info->aCol,.    
222d0 20 20 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d     sizeof(pInfo-
222e0 3e 61 43 6f 6c 5b 30 5d 29 2c 0a 20 20 20 20 20  >aCol[0]),.     
222f0 20 20 26 70 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d    &pInfo->nColum
22300 6e 2c 0a 20 20 20 20 20 20 20 26 69 0a 20 20 29  n,.       &i.  )
22310 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 20  ;.  return i;.} 
22320 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61     ../*.** Add a
22330 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20   new element to 
22340 74 68 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46  the pAggInfo->aF
22350 75 6e 63 5b 5d 20 61 72 72 61 79 2e 20 20 52 65  unc[] array.  Re
22360 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f  turn the index o
22370 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 65 6c 65  f.** the new ele
22380 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 20 61 20  ment.  Return a 
22390 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72 20  negative number 
223a0 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 2e  if malloc fails.
223b0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
223c0 64 64 41 67 67 49 6e 66 6f 46 75 6e 63 28 73 71  ddAggInfoFunc(sq
223d0 6c 69 74 65 33 20 2a 64 62 2c 20 41 67 67 49 6e  lite3 *db, AggIn
223e0 66 6f 20 2a 70 49 6e 66 6f 29 7b 0a 20 20 69 6e  fo *pInfo){.  in
223f0 74 20 69 3b 0a 20 20 70 49 6e 66 6f 2d 3e 61 46  t i;.  pInfo->aF
22400 75 6e 63 20 3d 20 73 71 6c 69 74 65 33 41 72 72  unc = sqlite3Arr
22410 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20 20 20  ayAllocate(.    
22420 20 20 20 64 62 2c 20 0a 20 20 20 20 20 20 20 70     db, .       p
22430 49 6e 66 6f 2d 3e 61 46 75 6e 63 2c 0a 20 20 20  Info->aFunc,.   
22440 20 20 20 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f      sizeof(pInfo
22450 2d 3e 61 46 75 6e 63 5b 30 5d 29 2c 0a 20 20 20  ->aFunc[0]),.   
22460 20 20 20 20 26 70 49 6e 66 6f 2d 3e 6e 46 75 6e      &pInfo->nFun
22470 63 2c 0a 20 20 20 20 20 20 20 26 69 0a 20 20 29  c,.       &i.  )
22480 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 20  ;.  return i;.} 
22490 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20     ../*.** This 
224a0 69 73 20 74 68 65 20 78 45 78 70 72 43 61 6c 6c  is the xExprCall
224b0 62 61 63 6b 20 66 6f 72 20 61 20 74 72 65 65 20  back for a tree 
224c0 77 61 6c 6b 65 72 2e 20 20 49 74 20 69 73 20 75  walker.  It is u
224d0 73 65 64 20 74 6f 0a 2a 2a 20 69 6d 70 6c 65 6d  sed to.** implem
224e0 65 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 41  ent sqlite3ExprA
224f0 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73  nalyzeAggregates
22500 28 29 2e 20 20 53 65 65 20 73 71 6c 69 74 65 33  ().  See sqlite3
22510 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65  ExprAnalyzeAggre
22520 67 61 74 65 73 0a 2a 2a 20 66 6f 72 20 61 64 64  gates.** for add
22530 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
22540 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
22550 6e 74 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67  nt analyzeAggreg
22560 61 74 65 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c  ate(Walker *pWal
22570 6b 65 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72  ker, Expr *pExpr
22580 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4e 61  ){.  int i;.  Na
22590 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 20 3d  meContext *pNC =
225a0 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 4e 43 3b   pWalker->u.pNC;
225b0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
225c0 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a   = pNC->pParse;.
225d0 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 4c    SrcList *pSrcL
225e0 69 73 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c  ist = pNC->pSrcL
225f0 69 73 74 3b 0a 20 20 41 67 67 49 6e 66 6f 20 2a  ist;.  AggInfo *
22600 70 41 67 67 49 6e 66 6f 20 3d 20 70 4e 43 2d 3e  pAggInfo = pNC->
22610 70 41 67 67 49 6e 66 6f 3b 0a 0a 20 20 73 77 69  pAggInfo;..  swi
22620 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29  tch( pExpr->op )
22630 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47  {.    case TK_AG
22640 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61  G_COLUMN:.    ca
22650 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a  se TK_COLUMN: {.
22660 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
22670 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47  pExpr->op==TK_AG
22680 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20  G_COLUMN );.    
22690 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
226a0 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op==TK_COLUMN
226b0 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20 43 68 65   );.      /* Che
226c0 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ck to see if the
226d0 20 63 6f 6c 75 6d 6e 20 69 73 20 69 6e 20 6f 6e   column is in on
226e0 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 73 20  e of the tables 
226f0 69 6e 20 74 68 65 20 46 52 4f 4d 0a 20 20 20 20  in the FROM.    
22700 20 20 2a 2a 20 63 6c 61 75 73 65 20 6f 66 20 74    ** clause of t
22710 68 65 20 61 67 67 72 65 67 61 74 65 20 71 75 65  he aggregate que
22720 72 79 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ry */.      if( 
22730 41 4c 57 41 59 53 28 70 53 72 63 4c 69 73 74 21  ALWAYS(pSrcList!
22740 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73  =0) ){.        s
22750 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
22760 65 6d 20 2a 70 49 74 65 6d 20 3d 20 70 53 72 63  em *pItem = pSrc
22770 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20 20  List->a;.       
22780 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72 63   for(i=0; i<pSrc
22790 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c  List->nSrc; i++,
227a0 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
227b0 20 20 20 20 20 73 74 72 75 63 74 20 41 67 67 49       struct AggI
227c0 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 3b 0a 20  nfo_col *pCol;. 
227d0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
227e0 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
227f0 79 28 70 45 78 70 72 2c 20 45 50 5f 54 6f 6b 65  y(pExpr, EP_Toke
22800 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64  nOnly|EP_Reduced
22810 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ) );.          i
22820 66 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  f( pExpr->iTable
22830 3d 3d 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  ==pItem->iCursor
22840 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
22850 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68 20 74  /* If we reach t
22860 68 69 73 20 70 6f 69 6e 74 2c 20 69 74 20 6d 65  his point, it me
22870 61 6e 73 20 74 68 61 74 20 70 45 78 70 72 20 72  ans that pExpr r
22880 65 66 65 72 73 20 74 6f 20 61 20 74 61 62 6c 65  efers to a table
22890 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
228a0 74 68 61 74 20 69 73 20 69 6e 20 74 68 65 20 46  that is in the F
228b0 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ROM clause of th
228c0 65 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72  e aggregate quer
228d0 79 2e 20 20 0a 20 20 20 20 20 20 20 20 20 20 20  y.  .           
228e0 20 2a 2a 0a 20 20 20 20 20 20 20 20 20 20 20 20   **.            
228f0 2a 2a 20 4d 61 6b 65 20 61 6e 20 65 6e 74 72 79  ** Make an entry
22900 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20   for the column 
22910 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f  in pAggInfo->aCo
22920 6c 5b 5d 20 69 66 20 74 68 65 72 65 0a 20 20 20  l[] if there.   
22930 20 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 6e           ** is n
22940 6f 74 20 61 6e 20 65 6e 74 72 79 20 74 68 65 72  ot an entry ther
22950 65 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 20  e already..     
22960 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
22970 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20        int k;.   
22980 20 20 20 20 20 20 20 20 20 70 43 6f 6c 20 3d 20           pCol = 
22990 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 3b 0a  pAggInfo->aCol;.
229a0 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28              for(
229b0 6b 3d 30 3b 20 6b 3c 70 41 67 67 49 6e 66 6f 2d  k=0; k<pAggInfo-
229c0 3e 6e 43 6f 6c 75 6d 6e 3b 20 6b 2b 2b 2c 20 70  >nColumn; k++, p
229d0 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  Col++){.        
229e0 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e        if( pCol->
229f0 69 54 61 62 6c 65 3d 3d 70 45 78 70 72 2d 3e 69  iTable==pExpr->i
22a00 54 61 62 6c 65 20 26 26 0a 20 20 20 20 20 20 20  Table &&.       
22a10 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
22a20 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d  >iColumn==pExpr-
22a30 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20  >iColumn ){.    
22a40 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
22a50 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  k;.             
22a60 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d   }.            }
22a70 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
22a80 20 28 6b 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6e   (k>=pAggInfo->n
22a90 43 6f 6c 75 6d 6e 29 0a 20 20 20 20 20 20 20 20  Column).        
22aa0 20 20 20 20 20 26 26 20 28 6b 20 3d 20 61 64 64       && (k = add
22ab0 41 67 67 49 6e 66 6f 43 6f 6c 75 6d 6e 28 70 50  AggInfoColumn(pP
22ac0 61 72 73 65 2d 3e 64 62 2c 20 70 41 67 67 49 6e  arse->db, pAggIn
22ad0 66 6f 29 29 3e 3d 30 20 0a 20 20 20 20 20 20 20  fo))>=0 .       
22ae0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
22af0 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 26 70 41        pCol = &pA
22b00 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 6b 5d 3b  ggInfo->aCol[k];
22b10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
22b20 43 6f 6c 2d 3e 70 54 61 62 20 3d 20 70 45 78 70  Col->pTab = pExp
22b30 72 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 20  r->pTab;.       
22b40 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 54 61         pCol->iTa
22b50 62 6c 65 20 3d 20 70 45 78 70 72 2d 3e 69 54 61  ble = pExpr->iTa
22b60 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ble;.           
22b70 20 20 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e     pCol->iColumn
22b80 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d   = pExpr->iColum
22b90 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n;.             
22ba0 20 70 43 6f 6c 2d 3e 69 4d 65 6d 20 3d 20 2b 2b   pCol->iMem = ++
22bb0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
22bc0 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
22bd0 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 20  ->iSorterColumn 
22be0 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20  = -1;.          
22bf0 20 20 20 20 70 43 6f 6c 2d 3e 70 45 78 70 72 20      pCol->pExpr 
22c00 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  = pExpr;.       
22c10 20 20 20 20 20 20 20 69 66 28 20 70 41 67 67 49         if( pAggI
22c20 6e 66 6f 2d 3e 70 47 72 6f 75 70 42 79 20 29 7b  nfo->pGroupBy ){
22c30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
22c40 20 69 6e 74 20 6a 2c 20 6e 3b 0a 20 20 20 20 20   int j, n;.     
22c50 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72 4c             ExprL
22c60 69 73 74 20 2a 70 47 42 20 3d 20 70 41 67 67 49  ist *pGB = pAggI
22c70 6e 66 6f 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20  nfo->pGroupBy;. 
22c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
22c90 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
22ca0 74 65 6d 20 2a 70 54 65 72 6d 20 3d 20 70 47 42  tem *pTerm = pGB
22cb0 2d 3e 61 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ->a;.           
22cc0 20 20 20 20 20 6e 20 3d 20 70 47 42 2d 3e 6e 45       n = pGB->nE
22cd0 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20  xpr;.           
22ce0 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
22cf0 6e 3b 20 6a 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29  n; j++, pTerm++)
22d00 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
22d10 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70      Expr *pE = p
22d20 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Term->pExpr;.   
22d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
22d40 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  f( pE->op==TK_CO
22d50 4c 55 4d 4e 20 26 26 20 70 45 2d 3e 69 54 61 62  LUMN && pE->iTab
22d60 6c 65 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c  le==pExpr->iTabl
22d70 65 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20  e &&.           
22d80 20 20 20 20 20 20 20 20 20 20 20 70 45 2d 3e 69             pE->i
22d90 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d 3e 69  Column==pExpr->i
22da0 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20  Column ){.      
22db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
22dc0 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d  ol->iSorterColum
22dd0 6e 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 20  n = j;.         
22de0 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
22df0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
22e00 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
22e10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
22e20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
22e30 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e        if( pCol->
22e40 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3c 30 20  iSorterColumn<0 
22e50 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
22e60 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72     pCol->iSorter
22e70 43 6f 6c 75 6d 6e 20 3d 20 70 41 67 67 49 6e 66  Column = pAggInf
22e80 6f 2d 3e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d  o->nSortingColum
22e90 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  n++;.           
22ea0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
22eb0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f   }.            /
22ec0 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 77 20 61  * There is now a
22ed0 6e 20 65 6e 74 72 79 20 66 6f 72 20 70 45 78 70  n entry for pExp
22ee0 72 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61  r in pAggInfo->a
22ef0 43 6f 6c 5b 5d 20 28 65 69 74 68 65 72 0a 20 20  Col[] (either.  
22f00 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 65 63            ** bec
22f10 61 75 73 65 20 69 74 20 77 61 73 20 74 68 65 72  ause it was ther
22f20 65 20 62 65 66 6f 72 65 20 6f 72 20 62 65 63 61  e before or beca
22f30 75 73 65 20 77 65 20 6a 75 73 74 20 63 72 65 61  use we just crea
22f40 74 65 64 20 69 74 29 2e 0a 20 20 20 20 20 20 20  ted it)..       
22f50 20 20 20 20 20 2a 2a 20 43 6f 6e 76 65 72 74 20       ** Convert 
22f60 74 68 65 20 70 45 78 70 72 20 74 6f 20 62 65 20  the pExpr to be 
22f70 61 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20  a TK_AGG_COLUMN 
22f80 72 65 66 65 72 72 69 6e 67 20 74 6f 20 74 68 61  referring to tha
22f90 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  t.            **
22fa0 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b   pAggInfo->aCol[
22fb0 5d 20 65 6e 74 72 79 2e 0a 20 20 20 20 20 20 20  ] entry..       
22fc0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
22fd0 20 20 20 20 45 78 70 72 53 65 74 56 56 41 50 72      ExprSetVVAPr
22fe0 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
22ff0 5f 4e 6f 52 65 64 75 63 65 29 3b 0a 20 20 20 20  _NoReduce);.    
23000 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70          pExpr->p
23010 41 67 67 49 6e 66 6f 20 3d 20 70 41 67 67 49 6e  AggInfo = pAggIn
23020 66 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  fo;.            
23030 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 41  pExpr->op = TK_A
23040 47 47 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20  GG_COLUMN;.     
23050 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 41         pExpr->iA
23060 67 67 20 3d 20 28 69 31 36 29 6b 3b 0a 20 20 20  gg = (i16)k;.   
23070 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
23080 20 20 20 20 20 20 20 20 20 20 7d 20 2f 2a 20 65            } /* e
23090 6e 64 69 66 20 70 45 78 70 72 2d 3e 69 54 61 62  ndif pExpr->iTab
230a0 6c 65 3d 3d 70 49 74 65 6d 2d 3e 69 43 75 72 73  le==pItem->iCurs
230b0 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 20  or */.        } 
230c0 2f 2a 20 65 6e 64 20 6c 6f 6f 70 20 6f 76 65 72  /* end loop over
230d0 20 70 53 72 63 4c 69 73 74 20 2a 2f 0a 20 20 20   pSrcList */.   
230e0 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72     }.      retur
230f0 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20  n WRC_Prune;.   
23100 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41   }.    case TK_A
23110 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20  GG_FUNCTION: {. 
23120 20 20 20 20 20 69 66 28 20 28 70 4e 43 2d 3e 6e       if( (pNC->n
23130 63 46 6c 61 67 73 20 26 20 4e 43 5f 49 6e 41 67  cFlags & NC_InAg
23140 67 46 75 6e 63 29 3d 3d 30 0a 20 20 20 20 20 20  gFunc)==0.      
23150 20 26 26 20 70 57 61 6c 6b 65 72 2d 3e 77 61 6c   && pWalker->wal
23160 6b 65 72 44 65 70 74 68 3d 3d 70 45 78 70 72 2d  kerDepth==pExpr-
23170 3e 6f 70 32 0a 20 20 20 20 20 20 29 7b 0a 20 20  >op2.      ){.  
23180 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74        /* Check t
23190 6f 20 73 65 65 20 69 66 20 70 45 78 70 72 20 69  o see if pExpr i
231a0 73 20 61 20 64 75 70 6c 69 63 61 74 65 20 6f 66  s a duplicate of
231b0 20 61 6e 6f 74 68 65 72 20 61 67 67 72 65 67 61   another aggrega
231c0 74 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 66  te .        ** f
231d0 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 69 73 20  unction that is 
231e0 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 70  already in the p
231f0 41 67 67 49 6e 66 6f 20 73 74 72 75 63 74 75 72  AggInfo structur
23200 65 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  e.        */.   
23210 20 20 20 20 20 73 74 72 75 63 74 20 41 67 67 49       struct AggI
23220 6e 66 6f 5f 66 75 6e 63 20 2a 70 49 74 65 6d 20  nfo_func *pItem 
23230 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e  = pAggInfo->aFun
23240 63 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  c;.        for(i
23250 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e  =0; i<pAggInfo->
23260 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 49 74 65  nFunc; i++, pIte
23270 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  m++){.          
23280 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43  if( sqlite3ExprC
23290 6f 6d 70 61 72 65 28 70 49 74 65 6d 2d 3e 70 45  ompare(pItem->pE
232a0 78 70 72 2c 20 70 45 78 70 72 2c 20 2d 31 29 3d  xpr, pExpr, -1)=
232b0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
232c0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
232d0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
232e0 20 20 20 20 20 20 20 69 66 28 20 69 3e 3d 70 41         if( i>=pA
232f0 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 20 29 7b  ggInfo->nFunc ){
23300 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 45  .          /* pE
23310 78 70 72 20 69 73 20 6f 72 69 67 69 6e 61 6c 2e  xpr is original.
23320 20 20 4d 61 6b 65 20 61 20 6e 65 77 20 65 6e 74    Make a new ent
23330 72 79 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e  ry in pAggInfo->
23340 61 46 75 6e 63 5b 5d 0a 20 20 20 20 20 20 20 20  aFunc[].        
23350 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 75    */.          u
23360 38 20 65 6e 63 20 3d 20 45 4e 43 28 70 50 61 72  8 enc = ENC(pPar
23370 73 65 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20 20  se->db);.       
23380 20 20 20 69 20 3d 20 61 64 64 41 67 67 49 6e 66     i = addAggInf
23390 6f 46 75 6e 63 28 70 50 61 72 73 65 2d 3e 64 62  oFunc(pParse->db
233a0 2c 20 70 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20  , pAggInfo);.   
233b0 20 20 20 20 20 20 20 69 66 28 20 69 3e 3d 30 20         if( i>=0 
233c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  ){.            a
233d0 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
233e0 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
233f0 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a  P_xIsSelect) );.
23400 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65              pIte
23410 6d 20 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e 61  m = &pAggInfo->a
23420 46 75 6e 63 5b 69 5d 3b 0a 20 20 20 20 20 20 20  Func[i];.       
23430 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 45 78 70       pItem->pExp
23440 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20  r = pExpr;.     
23450 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 4d         pItem->iM
23460 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  em = ++pParse->n
23470 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Mem;.           
23480 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
23490 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
234a0 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b   EP_IntValue) );
234b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74  .            pIt
234c0 65 6d 2d 3e 70 46 75 6e 63 20 3d 20 73 71 6c 69  em->pFunc = sqli
234d0 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28  te3FindFunction(
234e0 70 50 61 72 73 65 2d 3e 64 62 2c 0a 20 20 20 20  pParse->db,.    
234f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
23500 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20  Expr->u.zToken, 
23510 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
23520 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29  pExpr->u.zToken)
23530 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
23540 20 20 20 20 20 70 45 78 70 72 2d 3e 78 2e 70 4c       pExpr->x.pL
23550 69 73 74 20 3f 20 70 45 78 70 72 2d 3e 78 2e 70  ist ? pExpr->x.p
23560 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 2c  List->nExpr : 0,
23570 20 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20   enc, 0);.      
23580 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
23590 3e 66 6c 61 67 73 20 26 20 45 50 5f 44 69 73 74  >flags & EP_Dist
235a0 69 6e 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20  inct ){.        
235b0 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 44 69        pItem->iDi
235c0 73 74 69 6e 63 74 20 3d 20 70 50 61 72 73 65 2d  stinct = pParse-
235d0 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20  >nTab++;.       
235e0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
235f0 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d            pItem-
23600 3e 69 44 69 73 74 69 6e 63 74 20 3d 20 2d 31 3b  >iDistinct = -1;
23610 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
23620 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
23630 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20     }.        /* 
23640 4d 61 6b 65 20 70 45 78 70 72 20 70 6f 69 6e 74  Make pExpr point
23650 20 74 6f 20 74 68 65 20 61 70 70 72 6f 70 72 69   to the appropri
23660 61 74 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46  ate pAggInfo->aF
23670 75 6e 63 5b 5d 20 65 6e 74 72 79 0a 20 20 20 20  unc[] entry.    
23680 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61      */.        a
23690 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
236a0 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
236b0 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52  P_TokenOnly|EP_R
236c0 65 64 75 63 65 64 29 20 29 3b 0a 20 20 20 20 20  educed) );.     
236d0 20 20 20 45 78 70 72 53 65 74 56 56 41 50 72 6f     ExprSetVVAPro
236e0 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
236f0 4e 6f 52 65 64 75 63 65 29 3b 0a 20 20 20 20 20  NoReduce);.     
23700 20 20 20 70 45 78 70 72 2d 3e 69 41 67 67 20 3d     pExpr->iAgg =
23710 20 28 69 31 36 29 69 3b 0a 20 20 20 20 20 20 20   (i16)i;.       
23720 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f   pExpr->pAggInfo
23730 20 3d 20 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20   = pAggInfo;.   
23740 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f       return WRC_
23750 50 72 75 6e 65 3b 0a 20 20 20 20 20 20 7d 65 6c  Prune;.      }el
23760 73 65 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75  se{.        retu
23770 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
23780 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
23790 20 7d 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f   }.  return WRC_
237a0 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 73 74 61 74  Continue;.}.stat
237b0 69 63 20 69 6e 74 20 61 6e 61 6c 79 7a 65 41 67  ic int analyzeAg
237c0 67 72 65 67 61 74 65 73 49 6e 53 65 6c 65 63 74  gregatesInSelect
237d0 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72  (Walker *pWalker
237e0 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63  , Select *pSelec
237f0 74 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  t){.  UNUSED_PAR
23800 41 4d 45 54 45 52 28 70 57 61 6c 6b 65 72 29 3b  AMETER(pWalker);
23810 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
23820 54 45 52 28 70 53 65 6c 65 63 74 29 3b 0a 20 20  TER(pSelect);.  
23830 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
23840 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e  nue;.}../*.** An
23850 61 6c 79 7a 65 20 74 68 65 20 70 45 78 70 72 20  alyze the pExpr 
23860 65 78 70 72 65 73 73 69 6f 6e 20 6c 6f 6f 6b 69  expression looki
23870 6e 67 20 66 6f 72 20 61 67 67 72 65 67 61 74 65  ng for aggregate
23880 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 0a 2a   functions and.*
23890 2a 20 66 6f 72 20 76 61 72 69 61 62 6c 65 73 20  * for variables 
238a0 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20  that need to be 
238b0 61 64 64 65 64 20 74 6f 20 41 67 67 49 6e 66 6f  added to AggInfo
238c0 20 6f 62 6a 65 63 74 20 74 68 61 74 20 70 4e 43   object that pNC
238d0 2d 3e 70 41 67 67 49 6e 66 6f 0a 2a 2a 20 70 6f  ->pAggInfo.** po
238e0 69 6e 74 73 20 74 6f 2e 20 20 41 64 64 69 74 69  ints to.  Additi
238f0 6f 6e 61 6c 20 65 6e 74 72 69 65 73 20 61 72 65  onal entries are
23900 20 6d 61 64 65 20 6f 6e 20 74 68 65 20 41 67 67   made on the Agg
23910 49 6e 66 6f 20 6f 62 6a 65 63 74 20 61 73 0a 2a  Info object as.*
23920 2a 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 0a  * necessary..**.
23930 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
23940 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63  should only be c
23950 61 6c 6c 65 64 20 61 66 74 65 72 20 74 68 65 20  alled after the 
23960 65 78 70 72 65 73 73 69 6f 6e 20 68 61 73 20 62  expression has b
23970 65 65 6e 0a 2a 2a 20 61 6e 61 6c 79 7a 65 64 20  een.** analyzed 
23980 62 79 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76  by sqlite3Resolv
23990 65 45 78 70 72 4e 61 6d 65 73 28 29 2e 0a 2a 2f  eExprNames()..*/
239a0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
239b0 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74  rAnalyzeAggregat
239c0 65 73 28 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a  es(NameContext *
239d0 70 4e 43 2c 20 45 78 70 72 20 2a 70 45 78 70 72  pNC, Expr *pExpr
239e0 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20  ){.  Walker w;. 
239f0 20 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c 20 73   memset(&w, 0, s
23a00 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20 77 2e 78  izeof(w));.  w.x
23a10 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 61  ExprCallback = a
23a20 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 3b  nalyzeAggregate;
23a30 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c  .  w.xSelectCall
23a40 62 61 63 6b 20 3d 20 61 6e 61 6c 79 7a 65 41 67  back = analyzeAg
23a50 67 72 65 67 61 74 65 73 49 6e 53 65 6c 65 63 74  gregatesInSelect
23a60 3b 0a 20 20 77 2e 75 2e 70 4e 43 20 3d 20 70 4e  ;.  w.u.pNC = pN
23a70 43 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e 43  C;.  assert( pNC
23a80 2d 3e 70 53 72 63 4c 69 73 74 21 3d 30 20 29 3b  ->pSrcList!=0 );
23a90 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78  .  sqlite3WalkEx
23aa0 70 72 28 26 77 2c 20 70 45 78 70 72 29 3b 0a 7d  pr(&w, pExpr);.}
23ab0 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 73 71 6c  ../*.** Call sql
23ac0 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
23ad0 67 67 72 65 67 61 74 65 73 28 29 20 66 6f 72 20  ggregates() for 
23ae0 65 76 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e  every expression
23af0 20 69 6e 20 61 6e 0a 2a 2a 20 65 78 70 72 65 73   in an.** expres
23b00 73 69 6f 6e 20 6c 69 73 74 2e 20 20 52 65 74 75  sion list.  Retu
23b10 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
23b20 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 49   errors..**.** I
23b30 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20 66 6f  f an error is fo
23b40 75 6e 64 2c 20 74 68 65 20 61 6e 61 6c 79 73 69  und, the analysi
23b50 73 20 69 73 20 63 75 74 20 73 68 6f 72 74 2e 0a  s is cut short..
23b60 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
23b70 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73  xprAnalyzeAggLis
23b80 74 28 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70  t(NameContext *p
23b90 4e 43 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  NC, ExprList *pL
23ba0 69 73 74 29 7b 0a 20 20 73 74 72 75 63 74 20 45  ist){.  struct E
23bb0 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
23bc0 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  tem;.  int i;.  
23bd0 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20  if( pList ){.   
23be0 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74   for(pItem=pList
23bf0 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70 4c 69 73  ->a, i=0; i<pLis
23c00 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70  t->nExpr; i++, p
23c10 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 73  Item++){.      s
23c20 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
23c30 65 41 67 67 72 65 67 61 74 65 73 28 70 4e 43 2c  eAggregates(pNC,
23c40 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a   pItem->pExpr);.
23c50 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
23c60 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 73 69  ** Allocate a si
23c70 6e 67 6c 65 20 6e 65 77 20 72 65 67 69 73 74 65  ngle new registe
23c80 72 20 66 6f 72 20 75 73 65 20 74 6f 20 68 6f 6c  r for use to hol
23c90 64 20 73 6f 6d 65 20 69 6e 74 65 72 6d 65 64 69  d some intermedi
23ca0 61 74 65 20 72 65 73 75 6c 74 2e 0a 2a 2f 0a 69  ate result..*/.i
23cb0 6e 74 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d  nt sqlite3GetTem
23cc0 70 52 65 67 28 50 61 72 73 65 20 2a 70 50 61 72  pReg(Parse *pPar
23cd0 73 65 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73  se){.  if( pPars
23ce0 65 2d 3e 6e 54 65 6d 70 52 65 67 3d 3d 30 20 29  e->nTempReg==0 )
23cf0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 2b 2b 70  {.    return ++p
23d00 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 7d  Parse->nMem;.  }
23d10 0a 20 20 72 65 74 75 72 6e 20 70 50 61 72 73 65  .  return pParse
23d20 2d 3e 61 54 65 6d 70 52 65 67 5b 2d 2d 70 50 61  ->aTempReg[--pPa
23d30 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 5d 3b 0a  rse->nTempReg];.
23d40 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63  }../*.** Dealloc
23d50 61 74 65 20 61 20 72 65 67 69 73 74 65 72 2c 20  ate a register, 
23d60 6d 61 6b 69 6e 67 20 61 76 61 69 6c 61 62 6c 65  making available
23d70 20 66 6f 72 20 72 65 75 73 65 20 66 6f 72 20 73   for reuse for s
23d80 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 70 75 72  ome other.** pur
23d90 70 6f 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  pose..**.** If a
23da0 20 72 65 67 69 73 74 65 72 20 69 73 20 63 75 72   register is cur
23db0 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 75 73 65  rently being use
23dc0 64 20 62 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20  d by the column 
23dd0 63 61 63 68 65 2c 20 74 68 65 6e 0a 2a 2a 20 74  cache, then.** t
23de0 68 65 20 64 65 61 6c 6c 6f 63 61 74 69 6f 6e 20  he deallocation 
23df0 69 73 20 64 65 66 65 72 72 65 64 20 75 6e 74 69  is deferred unti
23e00 6c 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63  l the column cac
23e10 68 65 20 6c 69 6e 65 20 74 68 61 74 20 75 73 65  he line that use
23e20 73 0a 2a 2a 20 74 68 65 20 72 65 67 69 73 74 65  s.** the registe
23e30 72 20 62 65 63 6f 6d 65 73 20 73 74 61 6c 65 2e  r becomes stale.
23e40 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
23e50 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 50  ReleaseTempReg(P
23e60 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
23e70 74 20 69 52 65 67 29 7b 0a 20 20 69 66 28 20 69  t iReg){.  if( i
23e80 52 65 67 20 26 26 20 70 50 61 72 73 65 2d 3e 6e  Reg && pParse->n
23e90 54 65 6d 70 52 65 67 3c 41 72 72 61 79 53 69 7a  TempReg<ArraySiz
23ea0 65 28 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52  e(pParse->aTempR
23eb0 65 67 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  eg) ){.    int i
23ec0 3b 0a 20 20 20 20 73 74 72 75 63 74 20 79 43 6f  ;.    struct yCo
23ed0 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20 20 20 66  lCache *p;.    f
23ee0 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65  or(i=0, p=pParse
23ef0 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53  ->aColCache; i<S
23f00 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45  QLITE_N_COLCACHE
23f10 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20  ; i++, p++){.   
23f20 20 20 20 69 66 28 20 70 2d 3e 69 52 65 67 3d 3d     if( p->iReg==
23f30 69 52 65 67 20 29 7b 0a 20 20 20 20 20 20 20 20  iReg ){.        
23f40 70 2d 3e 74 65 6d 70 52 65 67 20 3d 20 31 3b 0a  p->tempReg = 1;.
23f50 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a          return;.
23f60 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
23f70 20 20 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52    pParse->aTempR
23f80 65 67 5b 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70  eg[pParse->nTemp
23f90 52 65 67 2b 2b 5d 20 3d 20 69 52 65 67 3b 0a 20  Reg++] = iReg;. 
23fa0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f   }.}../*.** Allo
23fb0 63 61 74 65 20 6f 72 20 64 65 61 6c 6c 6f 63 61  cate or dealloca
23fc0 74 65 20 61 20 62 6c 6f 63 6b 20 6f 66 20 6e 52  te a block of nR
23fd0 65 67 20 63 6f 6e 73 65 63 75 74 69 76 65 20 72  eg consecutive r
23fe0 65 67 69 73 74 65 72 73 0a 2a 2f 0a 69 6e 74 20  egisters.*/.int 
23ff0 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61  sqlite3GetTempRa
24000 6e 67 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  nge(Parse *pPars
24010 65 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20  e, int nReg){.  
24020 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 69 20 3d 20  int i, n;.  i = 
24030 70 50 61 72 73 65 2d 3e 69 52 61 6e 67 65 52 65  pParse->iRangeRe
24040 67 3b 0a 20 20 6e 20 3d 20 70 50 61 72 73 65 2d  g;.  n = pParse-
24050 3e 6e 52 61 6e 67 65 52 65 67 3b 0a 20 20 69 66  >nRangeReg;.  if
24060 28 20 6e 52 65 67 3c 3d 6e 20 29 7b 0a 20 20 20  ( nReg<=n ){.   
24070 20 61 73 73 65 72 74 28 20 21 75 73 65 64 41 73   assert( !usedAs
24080 43 6f 6c 75 6d 6e 43 61 63 68 65 28 70 50 61 72  ColumnCache(pPar
24090 73 65 2c 20 69 2c 20 69 2b 6e 2d 31 29 20 29 3b  se, i, i+n-1) );
240a0 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 69 52 61  .    pParse->iRa
240b0 6e 67 65 52 65 67 20 2b 3d 20 6e 52 65 67 3b 0a  ngeReg += nReg;.
240c0 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e      pParse->nRan
240d0 67 65 52 65 67 20 2d 3d 20 6e 52 65 67 3b 0a 20  geReg -= nReg;. 
240e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 20 3d 20   }else{.    i = 
240f0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a  pParse->nMem+1;.
24100 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
24110 20 2b 3d 20 6e 52 65 67 3b 0a 20 20 7d 0a 20 20   += nReg;.  }.  
24120 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 76 6f 69 64  return i;.}.void
24130 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
24140 65 6d 70 52 61 6e 67 65 28 50 61 72 73 65 20 2a  empRange(Parse *
24150 70 50 61 72 73 65 2c 20 69 6e 74 20 69 52 65 67  pParse, int iReg
24160 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20 73  , int nReg){.  s
24170 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 52  qlite3ExprCacheR
24180 65 6d 6f 76 65 28 70 50 61 72 73 65 2c 20 69 52  emove(pParse, iR
24190 65 67 2c 20 6e 52 65 67 29 3b 0a 20 20 69 66 28  eg, nReg);.  if(
241a0 20 6e 52 65 67 3e 70 50 61 72 73 65 2d 3e 6e 52   nReg>pParse->nR
241b0 61 6e 67 65 52 65 67 20 29 7b 0a 20 20 20 20 70  angeReg ){.    p
241c0 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67  Parse->nRangeReg
241d0 20 3d 20 6e 52 65 67 3b 0a 20 20 20 20 70 50 61   = nReg;.    pPa
241e0 72 73 65 2d 3e 69 52 61 6e 67 65 52 65 67 20 3d  rse->iRangeReg =
241f0 20 69 52 65 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a   iReg;.  }.}../*
24200 0a 2a 2a 20 4d 61 72 6b 20 61 6c 6c 20 74 65 6d  .** Mark all tem
24210 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 73  porary registers
24220 20 61 73 20 62 65 69 6e 67 20 75 6e 61 76 61 69   as being unavai
24230 6c 61 62 6c 65 20 66 6f 72 20 72 65 75 73 65 2e  lable for reuse.
24240 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
24250 43 6c 65 61 72 54 65 6d 70 52 65 67 43 61 63 68  ClearTempRegCach
24260 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  e(Parse *pParse)
24270 7b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d  {.  pParse->nTem
24280 70 52 65 67 20 3d 20 30 3b 0a 20 20 70 50 61 72  pReg = 0;.  pPar
24290 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20 3d 20  se->nRangeReg = 
242a0 30 3b 0a 7d 0a                                   0;.}.