/ Hex Artifact Content
Login

Artifact 8ff9d70cc2077020327d1fa551558bb03e267da4:


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 71 6c 69 74 65 33 54 6f 6b   );.  sqlite3Tok
0b60: 65 6e 49 6e 69 74 28 26 73 2c 20 28 63 68 61 72  enInit(&s, (char
0b70: 2a 29 7a 43 29 3b 0a 20 20 72 65 74 75 72 6e 20  *)zC);.  return 
0b80: 73 71 6c 69 74 65 33 45 78 70 72 41 64 64 43 6f  sqlite3ExprAddCo
0b90: 6c 6c 61 74 65 54 6f 6b 65 6e 28 70 50 61 72 73  llateToken(pPars
0ba0: 65 2c 20 70 45 78 70 72 2c 20 26 73 2c 20 30 29  e, pExpr, &s, 0)
0bb0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6b 69 70 20  ;.}../*.** Skip 
0bc0: 6f 76 65 72 20 61 6e 79 20 54 4b 5f 43 4f 4c 4c  over any TK_COLL
0bd0: 41 54 45 20 6f 70 65 72 61 74 6f 72 73 20 61 6e  ATE operators an
0be0: 64 20 61 6e 79 20 75 6e 6c 69 6b 65 6c 79 28 29  d any unlikely()
0bf0: 0a 2a 2a 20 6f 72 20 6c 69 6b 65 6c 69 68 6f 6f  .** or likelihoo
0c00: 64 28 29 20 66 75 6e 63 74 69 6f 6e 20 61 74 20  d() function at 
0c10: 74 68 65 20 72 6f 6f 74 20 6f 66 20 61 6e 20 65  the root of an e
0c20: 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2f 0a 45 78  xpression..*/.Ex
0c30: 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 53  pr *sqlite3ExprS
0c40: 6b 69 70 43 6f 6c 6c 61 74 65 28 45 78 70 72 20  kipCollate(Expr 
0c50: 2a 70 45 78 70 72 29 7b 0a 20 20 77 68 69 6c 65  *pExpr){.  while
0c60: 28 20 70 45 78 70 72 20 26 26 20 45 78 70 72 48  ( pExpr && ExprH
0c70: 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
0c80: 2c 20 45 50 5f 53 6b 69 70 29 20 29 7b 0a 20 20  , EP_Skip) ){.  
0c90: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
0ca0: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
0cb0: 55 6e 6c 69 6b 65 6c 79 29 20 29 7b 0a 20 20 20  Unlikely) ){.   
0cc0: 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
0cd0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
0ce0: 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
0cf0: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
0d00: 28 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  ( pExpr->x.pList
0d10: 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20 20  ->nExpr>0 );.   
0d20: 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
0d30: 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54 49 4f  ->op==TK_FUNCTIO
0d40: 4e 20 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72  N );.      pExpr
0d50: 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73   = pExpr->x.pLis
0d60: 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20  t->a[0].pExpr;. 
0d70: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
0d80: 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
0d90: 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 29 3b  p==TK_COLLATE );
0da0: 0a 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 70  .      pExpr = p
0db0: 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20  Expr->pLeft;.   
0dc0: 20 7d 0a 20 20 7d 20 20 20 0a 20 20 72 65 74 75   }.  }   .  retu
0dd0: 72 6e 20 70 45 78 70 72 3b 0a 7d 0a 0a 2f 2a 0a  rn pExpr;.}../*.
0de0: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 6f  ** Return the co
0df0: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
0e00: 20 66 6f 72 20 74 68 65 20 65 78 70 72 65 73 73   for the express
0e10: 69 6f 6e 20 70 45 78 70 72 2e 20 49 66 0a 2a 2a  ion pExpr. If.**
0e20: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 64 65 66   there is no def
0e30: 69 6e 65 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73  ined collating s
0e40: 65 71 75 65 6e 63 65 2c 20 72 65 74 75 72 6e 20  equence, return 
0e50: 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  NULL..**.** The 
0e60: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
0e70: 63 65 20 6d 69 67 68 74 20 62 65 20 64 65 74 65  ce might be dete
0e80: 72 6d 69 6e 65 64 20 62 79 20 61 20 43 4f 4c 4c  rmined by a COLL
0e90: 41 54 45 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20  ATE operator.** 
0ea0: 6f 72 20 62 79 20 74 68 65 20 70 72 65 73 65 6e  or by the presen
0eb0: 63 65 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20 77  ce of a column w
0ec0: 69 74 68 20 61 20 64 65 66 69 6e 65 64 20 63 6f  ith a defined co
0ed0: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
0ee0: 2e 0a 2a 2a 20 43 4f 4c 4c 41 54 45 20 6f 70 65  ..** COLLATE ope
0ef0: 72 61 74 6f 72 73 20 74 61 6b 65 20 66 69 72 73  rators take firs
0f00: 74 20 70 72 65 63 65 64 65 6e 63 65 2e 20 20 4c  t precedence.  L
0f10: 65 66 74 20 6f 70 65 72 61 6e 64 73 20 74 61 6b  eft operands tak
0f20: 65 0a 2a 2a 20 70 72 65 63 65 64 65 6e 63 65 20  e.** precedence 
0f30: 6f 76 65 72 20 72 69 67 68 74 20 6f 70 65 72 61  over right opera
0f40: 6e 64 73 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20  nds..*/.CollSeq 
0f50: 2a 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c  *sqlite3ExprColl
0f60: 53 65 71 28 50 61 72 73 65 20 2a 70 50 61 72 73  Seq(Parse *pPars
0f70: 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  e, Expr *pExpr){
0f80: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
0f90: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 43   pParse->db;.  C
0fa0: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20  ollSeq *pColl = 
0fb0: 30 3b 0a 20 20 45 78 70 72 20 2a 70 20 3d 20 70  0;.  Expr *p = p
0fc0: 45 78 70 72 3b 0a 20 20 77 68 69 6c 65 28 20 70  Expr;.  while( p
0fd0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 6f 70 20 3d   ){.    int op =
0fe0: 20 70 2d 3e 6f 70 3b 0a 20 20 20 20 69 66 28 20   p->op;.    if( 
0ff0: 70 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 47 65  p->flags & EP_Ge
1000: 6e 65 72 69 63 20 29 20 62 72 65 61 6b 3b 0a 20  neric ) break;. 
1010: 20 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 43 41     if( op==TK_CA
1020: 53 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 50 4c  ST || op==TK_UPL
1030: 55 53 20 29 7b 0a 20 20 20 20 20 20 70 20 3d 20  US ){.      p = 
1040: 70 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20  p->pLeft;.      
1050: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a  continue;.    }.
1060: 20 20 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 43      if( op==TK_C
1070: 4f 4c 4c 41 54 45 20 7c 7c 20 28 6f 70 3d 3d 54  OLLATE || (op==T
1080: 4b 5f 52 45 47 49 53 54 45 52 20 26 26 20 70 2d  K_REGISTER && p-
1090: 3e 6f 70 32 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45  >op2==TK_COLLATE
10a0: 29 20 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c 6c  ) ){.      pColl
10b0: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 43 6f 6c   = sqlite3GetCol
10c0: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 45 4e 43  lSeq(pParse, ENC
10d0: 28 64 62 29 2c 20 30 2c 20 70 2d 3e 75 2e 7a 54  (db), 0, p->u.zT
10e0: 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 62 72 65  oken);.      bre
10f0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ak;.    }.    if
1100: 28 20 28 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f  ( (op==TK_AGG_CO
1110: 4c 55 4d 4e 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 43  LUMN || op==TK_C
1120: 4f 4c 55 4d 4e 0a 20 20 20 20 20 20 20 20 20 20  OLUMN.          
1130: 7c 7c 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54  || op==TK_REGIST
1140: 45 52 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 54 52 49  ER || op==TK_TRI
1150: 47 47 45 52 29 0a 20 20 20 20 20 26 26 20 70 2d  GGER).     && p-
1160: 3e 70 54 61 62 21 3d 30 0a 20 20 20 20 29 7b 0a  >pTab!=0.    ){.
1170: 20 20 20 20 20 20 2f 2a 20 6f 70 3d 3d 54 4b 5f        /* op==TK_
1180: 52 45 47 49 53 54 45 52 20 26 26 20 70 2d 3e 70  REGISTER && p->p
1190: 54 61 62 21 3d 30 20 68 61 70 70 65 6e 73 20 77  Tab!=0 happens w
11a0: 68 65 6e 20 70 45 78 70 72 20 77 61 73 20 6f 72  hen pExpr was or
11b0: 69 67 69 6e 61 6c 6c 79 0a 20 20 20 20 20 20 2a  iginally.      *
11c0: 2a 20 61 20 54 4b 5f 43 4f 4c 55 4d 4e 20 62 75  * a TK_COLUMN bu
11d0: 74 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79  t was previously
11e0: 20 65 76 61 6c 75 61 74 65 64 20 61 6e 64 20 63   evaluated and c
11f0: 61 63 68 65 64 20 69 6e 20 61 20 72 65 67 69 73  ached in a regis
1200: 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  ter */.      int
1210: 20 6a 20 3d 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3b   j = p->iColumn;
1220: 0a 20 20 20 20 20 20 69 66 28 20 6a 3e 3d 30 20  .      if( j>=0 
1230: 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  ){.        const
1240: 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70   char *zColl = p
1250: 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e  ->pTab->aCol[j].
1260: 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70  zColl;.        p
1270: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69  Coll = sqlite3Fi
1280: 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 45 4e  ndCollSeq(db, EN
1290: 43 28 64 62 29 2c 20 7a 43 6f 6c 6c 2c 20 30 29  C(db), zColl, 0)
12a0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
12b0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
12c0: 20 69 66 28 20 70 2d 3e 66 6c 61 67 73 20 26 20   if( p->flags & 
12d0: 45 50 5f 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20  EP_Collate ){.  
12e0: 20 20 20 20 69 66 28 20 70 2d 3e 70 4c 65 66 74      if( p->pLeft
12f0: 20 26 26 20 28 70 2d 3e 70 4c 65 66 74 2d 3e 66   && (p->pLeft->f
1300: 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74  lags & EP_Collat
1310: 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  e)!=0 ){.       
1320: 20 70 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 0a 20   p = p->pLeft;. 
1330: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1340: 20 20 20 20 45 78 70 72 20 2a 70 4e 65 78 74 20      Expr *pNext 
1350: 20 3d 20 70 2d 3e 70 52 69 67 68 74 3b 0a 20 20   = p->pRight;.  
1360: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 45 78 70        /* The Exp
1370: 72 2e 78 20 75 6e 69 6f 6e 20 69 73 20 6e 65 76  r.x union is nev
1380: 65 72 20 75 73 65 64 20 61 74 20 74 68 65 20 73  er used at the s
1390: 61 6d 65 20 74 69 6d 65 20 61 73 20 45 78 70 72  ame time as Expr
13a0: 2e 70 52 69 67 68 74 20 2a 2f 0a 20 20 20 20 20  .pRight */.     
13b0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 78 2e     assert( p->x.
13c0: 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 2d 3e 70  pList==0 || p->p
13d0: 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20  Right==0 );.    
13e0: 20 20 20 20 2f 2a 20 70 2d 3e 66 6c 61 67 73 20      /* p->flags 
13f0: 68 6f 6c 64 73 20 45 50 5f 43 6f 6c 6c 61 74 65  holds EP_Collate
1400: 20 61 6e 64 20 70 2d 3e 70 4c 65 66 74 2d 3e 66   and p->pLeft->f
1410: 6c 61 67 73 20 64 6f 65 73 20 6e 6f 74 2e 20 20  lags does not.  
1420: 41 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  And.        ** p
1430: 2d 3e 78 2e 70 53 65 6c 65 63 74 20 63 61 6e 6e  ->x.pSelect cann
1440: 6f 74 2e 20 20 53 6f 20 69 66 20 70 2d 3e 78 2e  ot.  So if p->x.
1450: 70 4c 65 66 74 20 65 78 69 73 74 73 2c 20 69 74  pLeft exists, it
1460: 20 6d 75 73 74 20 68 6f 6c 64 20 61 74 0a 20 20   must hold at.  
1470: 20 20 20 20 20 20 2a 2a 20 6c 65 61 73 74 20 6f        ** least o
1480: 6e 65 20 45 50 5f 43 6f 6c 6c 61 74 65 2e 20 54  ne EP_Collate. T
1490: 68 75 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  hus the followin
14a0: 67 20 74 77 6f 20 41 4c 57 41 59 53 2e 20 2a 2f  g two ALWAYS. */
14b0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
14c0: 78 2e 70 4c 69 73 74 21 3d 30 20 26 26 20 41 4c  x.pList!=0 && AL
14d0: 57 41 59 53 28 21 45 78 70 72 48 61 73 50 72 6f  WAYS(!ExprHasPro
14e0: 70 65 72 74 79 28 70 2c 20 45 50 5f 78 49 73 53  perty(p, EP_xIsS
14f0: 65 6c 65 63 74 29 29 20 29 7b 0a 20 20 20 20 20  elect)) ){.     
1500: 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
1510: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 41        for(i=0; A
1520: 4c 57 41 59 53 28 69 3c 70 2d 3e 78 2e 70 4c 69  LWAYS(i<p->x.pLi
1530: 73 74 2d 3e 6e 45 78 70 72 29 3b 20 69 2b 2b 29  st->nExpr); i++)
1540: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  {.            if
1550: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
1560: 79 28 70 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b  y(p->x.pList->a[
1570: 69 5d 2e 70 45 78 70 72 2c 20 45 50 5f 43 6f 6c  i].pExpr, EP_Col
1580: 6c 61 74 65 29 20 29 7b 0a 20 20 20 20 20 20 20  late) ){.       
1590: 20 20 20 20 20 20 20 70 4e 65 78 74 20 3d 20 70         pNext = p
15a0: 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  ->x.pList->a[i].
15b0: 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20  pExpr;.         
15c0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
15d0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
15e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
15f0: 20 20 20 20 20 20 20 20 70 20 3d 20 70 4e 65 78          p = pNex
1600: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  t;.      }.    }
1610: 65 6c 73 65 7b 0a 20 20 20 20 20 20 62 72 65 61  else{.      brea
1620: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  k;.    }.  }.  i
1630: 66 28 20 73 71 6c 69 74 65 33 43 68 65 63 6b 43  f( sqlite3CheckC
1640: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
1650: 43 6f 6c 6c 29 20 29 7b 20 0a 20 20 20 20 70 43  Coll) ){ .    pC
1660: 6f 6c 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  oll = 0;.  }.  r
1670: 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a  eturn pColl;.}..
1680: 2f 2a 0a 2a 2a 20 70 45 78 70 72 20 69 73 20 61  /*.** pExpr is a
1690: 6e 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 63  n operand of a c
16a0: 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74  omparison operat
16b0: 6f 72 2e 20 20 61 66 66 32 20 69 73 20 74 68 65  or.  aff2 is the
16c0: 0a 2a 2a 20 74 79 70 65 20 61 66 66 69 6e 69 74  .** type affinit
16d0: 79 20 6f 66 20 74 68 65 20 6f 74 68 65 72 20 6f  y of the other o
16e0: 70 65 72 61 6e 64 2e 20 20 54 68 69 73 20 72 6f  perand.  This ro
16f0: 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68  utine returns th
1700: 65 0a 2a 2a 20 74 79 70 65 20 61 66 66 69 6e 69  e.** type affini
1710: 74 79 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62  ty that should b
1720: 65 20 75 73 65 64 20 66 6f 72 20 74 68 65 20 63  e used for the c
1730: 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74  omparison operat
1740: 6f 72 2e 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69  or..*/.char sqli
1750: 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69  te3CompareAffini
1760: 74 79 28 45 78 70 72 20 2a 70 45 78 70 72 2c 20  ty(Expr *pExpr, 
1770: 63 68 61 72 20 61 66 66 32 29 7b 0a 20 20 63 68  char aff2){.  ch
1780: 61 72 20 61 66 66 31 20 3d 20 73 71 6c 69 74 65  ar aff1 = sqlite
1790: 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 45  3ExprAffinity(pE
17a0: 78 70 72 29 3b 0a 20 20 69 66 28 20 61 66 66 31  xpr);.  if( aff1
17b0: 20 26 26 20 61 66 66 32 20 29 7b 0a 20 20 20 20   && aff2 ){.    
17c0: 2f 2a 20 42 6f 74 68 20 73 69 64 65 73 20 6f 66  /* Both sides of
17d0: 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20   the comparison 
17e0: 61 72 65 20 63 6f 6c 75 6d 6e 73 2e 20 49 66 20  are columns. If 
17f0: 6f 6e 65 20 68 61 73 20 6e 75 6d 65 72 69 63 0a  one has numeric.
1800: 20 20 20 20 2a 2a 20 61 66 66 69 6e 69 74 79 2c      ** affinity,
1810: 20 75 73 65 20 74 68 61 74 2e 20 4f 74 68 65 72   use that. Other
1820: 77 69 73 65 20 75 73 65 20 6e 6f 20 61 66 66 69  wise use no affi
1830: 6e 69 74 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  nity..    */.   
1840: 20 69 66 28 20 73 71 6c 69 74 65 33 49 73 4e 75   if( sqlite3IsNu
1850: 6d 65 72 69 63 41 66 66 69 6e 69 74 79 28 61 66  mericAffinity(af
1860: 66 31 29 20 7c 7c 20 73 71 6c 69 74 65 33 49 73  f1) || sqlite3Is
1870: 4e 75 6d 65 72 69 63 41 66 66 69 6e 69 74 79 28  NumericAffinity(
1880: 61 66 66 32 29 20 29 7b 0a 20 20 20 20 20 20 72  aff2) ){.      r
1890: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46 46  eturn SQLITE_AFF
18a0: 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 20 20 7d 65  _NUMERIC;.    }e
18b0: 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72  lse{.      retur
18c0: 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f  n SQLITE_AFF_BLO
18d0: 42 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  B;.    }.  }else
18e0: 20 69 66 28 20 21 61 66 66 31 20 26 26 20 21 61   if( !aff1 && !a
18f0: 66 66 32 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 65  ff2 ){.    /* Ne
1900: 69 74 68 65 72 20 73 69 64 65 20 6f 66 20 74 68  ither side of th
1910: 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20  e comparison is 
1920: 61 20 63 6f 6c 75 6d 6e 2e 20 20 43 6f 6d 70 61  a column.  Compa
1930: 72 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 65  re the.    ** re
1940: 73 75 6c 74 73 20 64 69 72 65 63 74 6c 79 2e 0a  sults directly..
1950: 20 20 20 20 2a 2f 0a 20 20 20 20 72 65 74 75 72      */.    retur
1960: 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f  n SQLITE_AFF_BLO
1970: 42 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  B;.  }else{.    
1980: 2f 2a 20 4f 6e 65 20 73 69 64 65 20 69 73 20 61  /* One side is a
1990: 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 20 6f 74 68   column, the oth
19a0: 65 72 20 69 73 20 6e 6f 74 2e 20 55 73 65 20 74  er is not. Use t
19b0: 68 65 20 63 6f 6c 75 6d 6e 73 20 61 66 66 69 6e  he columns affin
19c0: 69 74 79 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65  ity. */.    asse
19d0: 72 74 28 20 61 66 66 31 3d 3d 30 20 7c 7c 20 61  rt( aff1==0 || a
19e0: 66 66 32 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65  ff2==0 );.    re
19f0: 74 75 72 6e 20 28 61 66 66 31 20 2b 20 61 66 66  turn (aff1 + aff
1a00: 32 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  2);.  }.}../*.**
1a10: 20 70 45 78 70 72 20 69 73 20 61 20 63 6f 6d 70   pExpr is a comp
1a20: 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e  arison operator.
1a30: 20 20 52 65 74 75 72 6e 20 74 68 65 20 74 79 70    Return the typ
1a40: 65 20 61 66 66 69 6e 69 74 79 20 74 68 61 74 20  e affinity that 
1a50: 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 61 70 70  should.** be app
1a60: 6c 69 65 64 20 74 6f 20 62 6f 74 68 20 6f 70 65  lied to both ope
1a70: 72 61 6e 64 73 20 70 72 69 6f 72 20 74 6f 20 64  rands prior to d
1a80: 6f 69 6e 67 20 74 68 65 20 63 6f 6d 70 61 72 69  oing the compari
1a90: 73 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  son..*/.static c
1aa0: 68 61 72 20 63 6f 6d 70 61 72 69 73 6f 6e 41 66  har comparisonAf
1ab0: 66 69 6e 69 74 79 28 45 78 70 72 20 2a 70 45 78  finity(Expr *pEx
1ac0: 70 72 29 7b 0a 20 20 63 68 61 72 20 61 66 66 3b  pr){.  char aff;
1ad0: 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
1ae0: 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 20 7c 7c 20 70  ->op==TK_EQ || p
1af0: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20  Expr->op==TK_IN 
1b00: 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  || pExpr->op==TK
1b10: 5f 4c 54 20 7c 7c 0a 20 20 20 20 20 20 20 20 20  _LT ||.         
1b20: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 47   pExpr->op==TK_G
1b30: 54 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  T || pExpr->op==
1b40: 54 4b 5f 47 45 20 7c 7c 20 70 45 78 70 72 2d 3e  TK_GE || pExpr->
1b50: 6f 70 3d 3d 54 4b 5f 4c 45 20 7c 7c 0a 20 20 20  op==TK_LE ||.   
1b60: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70         pExpr->op
1b70: 3d 3d 54 4b 5f 4e 45 20 7c 7c 20 70 45 78 70 72  ==TK_NE || pExpr
1b80: 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 7c 7c 20 70  ->op==TK_IS || p
1b90: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e  Expr->op==TK_ISN
1ba0: 4f 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  OT );.  assert( 
1bb0: 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 29 3b 0a  pExpr->pLeft );.
1bc0: 20 20 61 66 66 20 3d 20 73 71 6c 69 74 65 33 45    aff = sqlite3E
1bd0: 78 70 72 41 66 66 69 6e 69 74 79 28 70 45 78 70  xprAffinity(pExp
1be0: 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66 28  r->pLeft);.  if(
1bf0: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20 29   pExpr->pRight )
1c00: 7b 0a 20 20 20 20 61 66 66 20 3d 20 73 71 6c 69  {.    aff = sqli
1c10: 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69  te3CompareAffini
1c20: 74 79 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74  ty(pExpr->pRight
1c30: 2c 20 61 66 66 29 3b 0a 20 20 7d 65 6c 73 65 20  , aff);.  }else 
1c40: 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
1c50: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49  rty(pExpr, EP_xI
1c60: 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20  sSelect) ){.    
1c70: 61 66 66 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d  aff = sqlite3Com
1c80: 70 61 72 65 41 66 66 69 6e 69 74 79 28 70 45 78  pareAffinity(pEx
1c90: 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70  pr->x.pSelect->p
1ca0: 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  EList->a[0].pExp
1cb0: 72 2c 20 61 66 66 29 3b 0a 20 20 7d 65 6c 73 65  r, aff);.  }else
1cc0: 20 69 66 28 20 21 61 66 66 20 29 7b 0a 20 20 20   if( !aff ){.   
1cd0: 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46   aff = SQLITE_AF
1ce0: 46 5f 42 4c 4f 42 3b 0a 20 20 7d 0a 20 20 72 65  F_BLOB;.  }.  re
1cf0: 74 75 72 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a  turn aff;.}../*.
1d00: 2a 2a 20 70 45 78 70 72 20 69 73 20 61 20 63 6f  ** pExpr is a co
1d10: 6d 70 61 72 69 73 6f 6e 20 65 78 70 72 65 73 73  mparison express
1d20: 69 6f 6e 2c 20 65 67 2e 20 27 3d 27 2c 20 27 3c  ion, eg. '=', '<
1d30: 27 2c 20 49 4e 28 2e 2e 2e 29 20 65 74 63 2e 0a  ', IN(...) etc..
1d40: 2a 2a 20 69 64 78 5f 61 66 66 69 6e 69 74 79 20  ** idx_affinity 
1d50: 69 73 20 74 68 65 20 61 66 66 69 6e 69 74 79 20  is the affinity 
1d60: 6f 66 20 61 6e 20 69 6e 64 65 78 65 64 20 63 6f  of an indexed co
1d70: 6c 75 6d 6e 2e 20 52 65 74 75 72 6e 20 74 72 75  lumn. Return tru
1d80: 65 0a 2a 2a 20 69 66 20 74 68 65 20 69 6e 64 65  e.** if the inde
1d90: 78 20 77 69 74 68 20 61 66 66 69 6e 69 74 79 20  x with affinity 
1da0: 69 64 78 5f 61 66 66 69 6e 69 74 79 20 6d 61 79  idx_affinity may
1db0: 20 62 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c   be used to impl
1dc0: 65 6d 65 6e 74 0a 2a 2a 20 74 68 65 20 63 6f 6d  ement.** the com
1dd0: 70 61 72 69 73 6f 6e 20 69 6e 20 70 45 78 70 72  parison in pExpr
1de0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1df0: 49 6e 64 65 78 41 66 66 69 6e 69 74 79 4f 6b 28  IndexAffinityOk(
1e00: 45 78 70 72 20 2a 70 45 78 70 72 2c 20 63 68 61  Expr *pExpr, cha
1e10: 72 20 69 64 78 5f 61 66 66 69 6e 69 74 79 29 7b  r idx_affinity){
1e20: 0a 20 20 63 68 61 72 20 61 66 66 20 3d 20 63 6f  .  char aff = co
1e30: 6d 70 61 72 69 73 6f 6e 41 66 66 69 6e 69 74 79  mparisonAffinity
1e40: 28 70 45 78 70 72 29 3b 0a 20 20 73 77 69 74 63  (pExpr);.  switc
1e50: 68 28 20 61 66 66 20 29 7b 0a 20 20 20 20 63 61  h( aff ){.    ca
1e60: 73 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c  se SQLITE_AFF_BL
1e70: 4f 42 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e  OB:.      return
1e80: 20 31 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c   1;.    case SQL
1e90: 49 54 45 5f 41 46 46 5f 54 45 58 54 3a 0a 20 20  ITE_AFF_TEXT:.  
1ea0: 20 20 20 20 72 65 74 75 72 6e 20 69 64 78 5f 61      return idx_a
1eb0: 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f  ffinity==SQLITE_
1ec0: 41 46 46 5f 54 45 58 54 3b 0a 20 20 20 20 64 65  AFF_TEXT;.    de
1ed0: 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 72 65 74  fault:.      ret
1ee0: 75 72 6e 20 73 71 6c 69 74 65 33 49 73 4e 75 6d  urn sqlite3IsNum
1ef0: 65 72 69 63 41 66 66 69 6e 69 74 79 28 69 64 78  ericAffinity(idx
1f00: 5f 61 66 66 69 6e 69 74 79 29 3b 0a 20 20 7d 0a  _affinity);.  }.
1f10: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
1f20: 74 68 65 20 50 35 20 76 61 6c 75 65 20 74 68 61  the P5 value tha
1f30: 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64  t should be used
1f40: 20 66 6f 72 20 61 20 62 69 6e 61 72 79 20 63 6f   for a binary co
1f50: 6d 70 61 72 69 73 6f 6e 0a 2a 2a 20 6f 70 63 6f  mparison.** opco
1f60: 64 65 20 28 4f 50 5f 45 71 2c 20 4f 50 5f 47 65  de (OP_Eq, OP_Ge
1f70: 20 65 74 63 2e 29 20 75 73 65 64 20 74 6f 20 63   etc.) used to c
1f80: 6f 6d 70 61 72 65 20 70 45 78 70 72 31 20 61 6e  ompare pExpr1 an
1f90: 64 20 70 45 78 70 72 32 2e 0a 2a 2f 0a 73 74 61  d pExpr2..*/.sta
1fa0: 74 69 63 20 75 38 20 62 69 6e 61 72 79 43 6f 6d  tic u8 binaryCom
1fb0: 70 61 72 65 50 35 28 45 78 70 72 20 2a 70 45 78  pareP5(Expr *pEx
1fc0: 70 72 31 2c 20 45 78 70 72 20 2a 70 45 78 70 72  pr1, Expr *pExpr
1fd0: 32 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c  2, int jumpIfNul
1fe0: 6c 29 7b 0a 20 20 75 38 20 61 66 66 20 3d 20 28  l){.  u8 aff = (
1ff0: 63 68 61 72 29 73 71 6c 69 74 65 33 45 78 70 72  char)sqlite3Expr
2000: 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 32 29  Affinity(pExpr2)
2010: 3b 0a 20 20 61 66 66 20 3d 20 28 75 38 29 73 71  ;.  aff = (u8)sq
2020: 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69  lite3CompareAffi
2030: 6e 69 74 79 28 70 45 78 70 72 31 2c 20 61 66 66  nity(pExpr1, aff
2040: 29 20 7c 20 28 75 38 29 6a 75 6d 70 49 66 4e 75  ) | (u8)jumpIfNu
2050: 6c 6c 3b 0a 20 20 72 65 74 75 72 6e 20 61 66 66  ll;.  return aff
2060: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
2070: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
2080: 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  he collation seq
2090: 75 65 6e 63 65 20 74 68 61 74 20 73 68 6f 75 6c  uence that shoul
20a0: 64 20 62 65 20 75 73 65 64 20 62 79 0a 2a 2a 20  d be used by.** 
20b0: 61 20 62 69 6e 61 72 79 20 63 6f 6d 70 61 72 69  a binary compari
20c0: 73 6f 6e 20 6f 70 65 72 61 74 6f 72 20 63 6f 6d  son operator com
20d0: 70 61 72 69 6e 67 20 70 4c 65 66 74 20 61 6e 64  paring pLeft and
20e0: 20 70 52 69 67 68 74 2e 0a 2a 2a 0a 2a 2a 20 49   pRight..**.** I
20f0: 66 20 74 68 65 20 6c 65 66 74 20 68 61 6e 64 20  f the left hand 
2100: 65 78 70 72 65 73 73 69 6f 6e 20 68 61 73 20 61  expression has a
2110: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
2120: 6e 63 65 20 74 79 70 65 2c 20 74 68 65 6e 20 69  nce type, then i
2130: 74 20 69 73 0a 2a 2a 20 75 73 65 64 2e 20 4f 74  t is.** used. Ot
2140: 68 65 72 77 69 73 65 20 74 68 65 20 63 6f 6c 6c  herwise the coll
2150: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66  ation sequence f
2160: 6f 72 20 74 68 65 20 72 69 67 68 74 20 68 61 6e  or the right han
2170: 64 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20  d expression.** 
2180: 69 73 20 75 73 65 64 2c 20 6f 72 20 74 68 65 20  is used, or the 
2190: 64 65 66 61 75 6c 74 20 28 42 49 4e 41 52 59 29  default (BINARY)
21a0: 20 69 66 20 6e 65 69 74 68 65 72 20 65 78 70 72   if neither expr
21b0: 65 73 73 69 6f 6e 20 68 61 73 20 61 20 63 6f 6c  ession has a col
21c0: 6c 61 74 69 6e 67 0a 2a 2a 20 74 79 70 65 2e 0a  lating.** type..
21d0: 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70  **.** Argument p
21e0: 52 69 67 68 74 20 28 62 75 74 20 6e 6f 74 20 70  Right (but not p
21f0: 4c 65 66 74 29 20 6d 61 79 20 62 65 20 61 20 6e  Left) may be a n
2200: 75 6c 6c 20 70 6f 69 6e 74 65 72 2e 20 49 6e 20  ull pointer. In 
2210: 74 68 69 73 20 63 61 73 65 2c 0a 2a 2a 20 69 74  this case,.** it
2220: 20 69 73 20 6e 6f 74 20 63 6f 6e 73 69 64 65 72   is not consider
2230: 65 64 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a  ed..*/.CollSeq *
2240: 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d  sqlite3BinaryCom
2250: 70 61 72 65 43 6f 6c 6c 53 65 71 28 0a 20 20 50  pareCollSeq(.  P
2260: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 0a 20  arse *pParse, . 
2270: 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 0a 20   Expr *pLeft, . 
2280: 20 45 78 70 72 20 2a 70 52 69 67 68 74 0a 29 7b   Expr *pRight.){
2290: 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c  .  CollSeq *pCol
22a0: 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 65  l;.  assert( pLe
22b0: 66 74 20 29 3b 0a 20 20 69 66 28 20 70 4c 65 66  ft );.  if( pLef
22c0: 74 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 43 6f  t->flags & EP_Co
22d0: 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 70 43 6f  llate ){.    pCo
22e0: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
22f0: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
2300: 70 4c 65 66 74 29 3b 0a 20 20 7d 65 6c 73 65 20  pLeft);.  }else 
2310: 69 66 28 20 70 52 69 67 68 74 20 26 26 20 28 70  if( pRight && (p
2320: 52 69 67 68 74 2d 3e 66 6c 61 67 73 20 26 20 45  Right->flags & E
2330: 50 5f 43 6f 6c 6c 61 74 65 29 21 3d 30 20 29 7b  P_Collate)!=0 ){
2340: 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c  .    pColl = sql
2350: 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
2360: 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 29 3b  pParse, pRight);
2370: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43  .  }else{.    pC
2380: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
2390: 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
23a0: 20 70 4c 65 66 74 29 3b 0a 20 20 20 20 69 66 28   pLeft);.    if(
23b0: 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20   !pColl ){.     
23c0: 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
23d0: 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
23e0: 73 65 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20  se, pRight);.   
23f0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
2400: 70 43 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  pColl;.}../*.** 
2410: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
2420: 72 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f  r a comparison o
2430: 70 65 72 61 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74  perator..*/.stat
2440: 69 63 20 69 6e 74 20 63 6f 64 65 43 6f 6d 70 61  ic int codeCompa
2450: 72 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  re(.  Parse *pPa
2460: 72 73 65 2c 20 20 20 20 2f 2a 20 54 68 65 20 70  rse,    /* The p
2470: 61 72 73 69 6e 67 20 28 61 6e 64 20 63 6f 64 65  arsing (and code
2480: 20 67 65 6e 65 72 61 74 69 6e 67 29 20 63 6f 6e   generating) con
2490: 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a  text */.  Expr *
24a0: 70 4c 65 66 74 2c 20 20 20 20 20 20 2f 2a 20 54  pLeft,      /* T
24b0: 68 65 20 6c 65 66 74 20 6f 70 65 72 61 6e 64 20  he left operand 
24c0: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68  */.  Expr *pRigh
24d0: 74 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69  t,     /* The ri
24e0: 67 68 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20  ght operand */. 
24f0: 20 69 6e 74 20 6f 70 63 6f 64 65 2c 20 20 20 20   int opcode,    
2500: 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 61 72     /* The compar
2510: 69 73 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20  ison opcode */. 
2520: 20 69 6e 74 20 69 6e 31 2c 20 69 6e 74 20 69 6e   int in1, int in
2530: 32 2c 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68  2, /* Register h
2540: 6f 6c 64 69 6e 67 20 6f 70 65 72 61 6e 64 73 20  olding operands 
2550: 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 2c 20 20  */.  int dest,  
2560: 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68         /* Jump h
2570: 65 72 65 20 69 66 20 74 72 75 65 2e 20 20 2a 2f  ere if true.  */
2580: 0a 20 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c  .  int jumpIfNul
2590: 6c 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c  l    /* If true,
25a0: 20 6a 75 6d 70 20 69 66 20 65 69 74 68 65 72 20   jump if either 
25b0: 6f 70 65 72 61 6e 64 20 69 73 20 4e 55 4c 4c 20  operand is NULL 
25c0: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 70 35 3b 0a  */.){.  int p5;.
25d0: 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 43 6f    int addr;.  Co
25e0: 6c 6c 53 65 71 20 2a 70 34 3b 0a 0a 20 20 70 34  llSeq *p4;..  p4
25f0: 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79   = sqlite3Binary
2600: 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70  CompareCollSeq(p
2610: 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 52  Parse, pLeft, pR
2620: 69 67 68 74 29 3b 0a 20 20 70 35 20 3d 20 62 69  ight);.  p5 = bi
2630: 6e 61 72 79 43 6f 6d 70 61 72 65 50 35 28 70 4c  naryCompareP5(pL
2640: 65 66 74 2c 20 70 52 69 67 68 74 2c 20 6a 75 6d  eft, pRight, jum
2650: 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 61 64 64 72  pIfNull);.  addr
2660: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
2670: 64 4f 70 34 28 70 50 61 72 73 65 2d 3e 70 56 64  dOp4(pParse->pVd
2680: 62 65 2c 20 6f 70 63 6f 64 65 2c 20 69 6e 32 2c  be, opcode, in2,
2690: 20 64 65 73 74 2c 20 69 6e 31 2c 0a 20 20 20 20   dest, in1,.    
26a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26b0: 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29 70 34         (void*)p4
26c0: 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20  , P4_COLLSEQ);. 
26d0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
26e0: 67 65 50 35 28 70 50 61 72 73 65 2d 3e 70 56 64  geP5(pParse->pVd
26f0: 62 65 2c 20 28 75 38 29 70 35 29 3b 0a 20 20 72  be, (u8)p5);.  r
2700: 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f  eturn addr;.}../
2710: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72  *.** If the expr
2720: 65 73 73 69 6f 6e 20 70 61 73 73 65 64 20 61 73  ession passed as
2730: 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65   the only argume
2740: 6e 74 20 69 73 20 6f 66 20 74 79 70 65 20 54 4b  nt is of type TK
2750: 5f 56 45 43 54 4f 52 20 0a 2a 2a 20 72 65 74 75  _VECTOR .** retu
2760: 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
2770: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20   expressions in 
2780: 74 68 65 20 76 65 63 74 6f 72 2e 20 4f 72 2c 20  the vector. Or, 
2790: 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
27a0: 6e 0a 2a 2a 20 69 73 20 61 20 73 75 62 2d 73 65  n.** is a sub-se
27b0: 6c 65 63 74 2c 20 72 65 74 75 72 6e 20 74 68 65  lect, return the
27c0: 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   number of colum
27d0: 6e 73 20 69 6e 20 74 68 65 20 73 75 62 2d 73 65  ns in the sub-se
27e0: 6c 65 63 74 2e 20 46 6f 72 0a 2a 2a 20 61 6e 79  lect. For.** any
27f0: 20 6f 74 68 65 72 20 74 79 70 65 20 6f 66 20 65   other type of e
2800: 78 70 72 65 73 73 69 6f 6e 2c 20 72 65 74 75 72  xpression, retur
2810: 6e 20 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  n 1..*/.int sqli
2820: 74 65 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a  te3ExprVectorSiz
2830: 65 28 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  e(Expr *pExpr){.
2840: 20 20 69 66 28 20 28 70 45 78 70 72 2d 3e 66 6c    if( (pExpr->fl
2850: 61 67 73 20 26 20 45 50 5f 56 65 63 74 6f 72 29  ags & EP_Vector)
2860: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ==0 ) return 1;.
2870: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61    if( pExpr->fla
2880: 67 73 20 26 20 45 50 5f 78 49 73 53 65 6c 65 63  gs & EP_xIsSelec
2890: 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  t ){.    return 
28a0: 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74  pExpr->x.pSelect
28b0: 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  ->pEList->nExpr;
28c0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 45  .  }.  return pE
28d0: 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45  xpr->x.pList->nE
28e0: 78 70 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  xpr;.}../*.** If
28f0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
2900: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69  passed as the fi
2910: 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20  rst argument is 
2920: 61 20 54 4b 5f 56 45 43 54 4f 52 2c 20 72 65 74  a TK_VECTOR, ret
2930: 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72  urn.** a pointer
2940: 20 74 6f 20 74 68 65 20 69 27 74 68 20 66 69 65   to the i'th fie
2950: 6c 64 20 6f 66 20 74 68 65 20 76 65 63 74 6f 72  ld of the vector
2960: 2e 20 4f 72 2c 20 69 66 20 74 68 65 20 66 69 72  . Or, if the fir
2970: 73 74 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 70  st argument.** p
2980: 6f 69 6e 74 73 20 74 6f 20 61 20 73 75 62 2d 73  oints to a sub-s
2990: 65 6c 65 63 74 2c 20 72 65 74 75 72 6e 20 61 20  elect, return a 
29a0: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 69  pointer to the i
29b0: 27 74 68 20 72 65 74 75 72 6e 65 64 20 63 6f 6c  'th returned col
29c0: 75 6d 6e 20 0a 2a 2a 20 76 61 6c 75 65 2e 20 4f  umn .** value. O
29d0: 74 68 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e  therwise, return
29e0: 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 66   a copy of the f
29f0: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  irst argument..*
2a00: 2f 0a 73 74 61 74 69 63 20 45 78 70 72 20 2a 65  /.static Expr *e
2a10: 78 70 72 56 65 63 74 6f 72 46 69 65 6c 64 28 45  xprVectorField(E
2a20: 78 70 72 20 2a 70 56 65 63 74 6f 72 2c 20 69 6e  xpr *pVector, in
2a30: 74 20 69 29 7b 0a 20 20 69 66 28 20 28 70 56 65  t i){.  if( (pVe
2a40: 63 74 6f 72 2d 3e 66 6c 61 67 73 20 26 20 45 50  ctor->flags & EP
2a50: 5f 56 65 63 74 6f 72 29 3d 3d 30 20 29 7b 0a 20  _Vector)==0 ){. 
2a60: 20 20 20 61 73 73 65 72 74 28 20 69 3d 3d 30 20     assert( i==0 
2a70: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 56  );.    return pV
2a80: 65 63 74 6f 72 3b 0a 20 20 7d 65 6c 73 65 20 69  ector;.  }else i
2a90: 66 28 20 70 56 65 63 74 6f 72 2d 3e 66 6c 61 67  f( pVector->flag
2aa0: 73 20 26 20 45 50 5f 78 49 73 53 65 6c 65 63 74  s & EP_xIsSelect
2ab0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
2ac0: 56 65 63 74 6f 72 2d 3e 78 2e 70 53 65 6c 65 63  Vector->x.pSelec
2ad0: 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e  t->pEList->a[i].
2ae0: 70 45 78 70 72 3b 0a 20 20 7d 0a 20 20 72 65 74  pExpr;.  }.  ret
2af0: 75 72 6e 20 70 56 65 63 74 6f 72 2d 3e 78 2e 70  urn pVector->x.p
2b00: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
2b10: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  ;.}..static void
2b20: 20 63 6f 64 65 56 65 63 74 6f 72 43 6f 6d 70 61   codeVectorCompa
2b30: 72 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  re(Parse *pParse
2b40: 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69  , Expr *pExpr, i
2b50: 6e 74 20 64 65 73 74 29 7b 0a 20 20 56 64 62 65  nt dest){.  Vdbe
2b60: 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
2b70: 64 62 65 3b 0a 20 20 45 78 70 72 20 2a 70 4c 65  dbe;.  Expr *pLe
2b80: 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66  ft = pExpr->pLef
2b90: 74 3b 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68  t;.  Expr *pRigh
2ba0: 74 20 3d 20 70 45 78 70 72 2d 3e 70 52 69 67 68  t = pExpr->pRigh
2bb0: 74 3b 0a 20 20 69 6e 74 20 6e 4c 65 66 74 20 3d  t;.  int nLeft =
2bc0: 20 73 71 6c 69 74 65 33 45 78 70 72 56 65 63 74   sqlite3ExprVect
2bd0: 6f 72 53 69 7a 65 28 70 4c 65 66 74 29 3b 0a 20  orSize(pLeft);. 
2be0: 20 69 6e 74 20 6e 52 69 67 68 74 20 3d 20 73 71   int nRight = sq
2bf0: 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f 72 53  lite3ExprVectorS
2c00: 69 7a 65 28 70 52 69 67 68 74 29 3b 0a 20 20 69  ize(pRight);.  i
2c10: 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65  nt addr = sqlite
2c20: 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
2c30: 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  );..  /* Check t
2c40: 68 61 74 20 62 6f 74 68 20 73 69 64 65 73 20 6f  hat both sides o
2c50: 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  f the comparison
2c60: 20 61 72 65 20 76 65 63 74 6f 72 73 2c 20 61 6e   are vectors, an
2c70: 64 20 74 68 61 74 0a 20 20 2a 2a 20 62 6f 74 68  d that.  ** both
2c80: 20 61 72 65 20 74 68 65 20 73 61 6d 65 20 6c 65   are the same le
2c90: 6e 67 74 68 2e 20 20 2a 2f 0a 20 20 69 66 28 20  ngth.  */.  if( 
2ca0: 6e 4c 65 66 74 21 3d 6e 52 69 67 68 74 20 29 7b  nLeft!=nRight ){
2cb0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
2cc0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 69 6e  rMsg(pParse, "in
2cd0: 76 61 6c 69 64 20 75 73 65 20 6f 66 20 72 6f 77  valid use of row
2ce0: 20 76 61 6c 75 65 22 29 3b 0a 20 20 7d 65 6c 73   value");.  }els
2cf0: 65 7b 0a 20 20 20 20 69 6e 74 20 70 35 20 3d 20  e{.    int p5 = 
2d00: 28 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49  (pExpr->op==TK_I
2d10: 53 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  S || pExpr->op==
2d20: 54 4b 5f 49 53 4e 4f 54 29 20 3f 20 53 51 4c 49  TK_ISNOT) ? SQLI
2d30: 54 45 5f 4e 55 4c 4c 45 51 20 3a 20 30 3b 0a 20  TE_NULLEQ : 0;. 
2d40: 20 20 20 69 6e 74 20 6f 70 43 6d 70 3b 0a 20 20     int opCmp;.  
2d50: 20 20 69 6e 74 20 6f 70 54 65 73 74 3b 0a 20 20    int opTest;.  
2d60: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74    int i;.    int
2d70: 20 70 33 20 3d 20 31 3b 0a 20 20 20 20 69 6e 74   p3 = 1;.    int
2d80: 20 72 65 67 4c 65 66 74 20 3d 20 30 3b 0a 20 20   regLeft = 0;.  
2d90: 20 20 69 6e 74 20 72 65 67 52 69 67 68 74 20 3d    int regRight =
2da0: 20 30 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28   0;..    assert(
2db0: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45   pExpr->op==TK_E
2dc0: 51 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  Q || pExpr->op==
2dd0: 54 4b 5f 4e 45 20 0a 20 20 20 20 20 20 20 20 20  TK_NE .         
2de0: 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  || pExpr->op==TK
2df0: 5f 49 53 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70  _IS || pExpr->op
2e00: 3d 3d 54 4b 5f 49 53 4e 4f 54 20 0a 20 20 20 20  ==TK_ISNOT .    
2e10: 20 20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 6f       || pExpr->o
2e20: 70 3d 3d 54 4b 5f 4c 54 20 7c 7c 20 70 45 78 70  p==TK_LT || pExp
2e30: 72 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 20 0a 20 20  r->op==TK_GT .  
2e40: 20 20 20 20 20 20 20 7c 7c 20 70 45 78 70 72 2d         || pExpr-
2e50: 3e 6f 70 3d 3d 54 4b 5f 4c 45 20 7c 7c 20 70 45  >op==TK_LE || pE
2e60: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 47 45 20 0a  xpr->op==TK_GE .
2e70: 20 20 20 20 29 3b 0a 0a 20 20 20 20 73 77 69 74      );..    swit
2e80: 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b  ch( pExpr->op ){
2e90: 0a 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f 45  .      case TK_E
2ea0: 51 3a 0a 20 20 20 20 20 20 63 61 73 65 20 54 4b  Q:.      case TK
2eb0: 5f 49 53 3a 0a 20 20 20 20 20 20 20 20 6f 70 54  _IS:.        opT
2ec0: 65 73 74 20 3d 20 4f 50 5f 49 66 4e 6f 74 3b 0a  est = OP_IfNot;.
2ed0: 20 20 20 20 20 20 20 20 6f 70 43 6d 70 20 3d 20          opCmp = 
2ee0: 4f 50 5f 45 71 3b 0a 20 20 20 20 20 20 20 20 62  OP_Eq;.        b
2ef0: 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 63 61 73  reak;..      cas
2f00: 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 20 20 63  e TK_NE:.      c
2f10: 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 0a 20 20  ase TK_ISNOT:.  
2f20: 20 20 20 20 20 20 6f 70 54 65 73 74 20 3d 20 4f        opTest = O
2f30: 50 5f 49 66 3b 0a 20 20 20 20 20 20 20 20 6f 70  P_If;.        op
2f40: 43 6d 70 20 3d 20 4f 50 5f 4e 65 3b 0a 20 20 20  Cmp = OP_Ne;.   
2f50: 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20       break;..   
2f60: 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20     case TK_LT:. 
2f70: 20 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a       case TK_LE:
2f80: 0a 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f 47  .      case TK_G
2f90: 54 3a 0a 20 20 20 20 20 20 63 61 73 65 20 54 4b  T:.      case TK
2fa0: 5f 47 45 3a 0a 20 20 20 20 20 20 20 20 6f 70 43  _GE:.        opC
2fb0: 6d 70 20 3d 20 4f 50 5f 43 6d 70 3b 0a 20 20 20  mp = OP_Cmp;.   
2fc0: 20 20 20 20 20 6f 70 54 65 73 74 20 3d 20 4f 50       opTest = OP
2fd0: 5f 43 6d 70 54 65 73 74 3b 0a 20 20 20 20 20 20  _CmpTest;.      
2fe0: 20 20 70 33 20 3d 20 70 45 78 70 72 2d 3e 6f 70    p3 = pExpr->op
2ff0: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
3000: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
3010: 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20 26 20 45  pLeft->flags & E
3020: 50 5f 78 49 73 53 65 6c 65 63 74 20 29 7b 0a 20  P_xIsSelect ){. 
3030: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 65       assert( pLe
3040: 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43  ft->op==TK_SELEC
3050: 54 20 7c 7c 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d  T || pLeft->op==
3060: 54 4b 5f 52 45 47 49 53 54 45 52 20 29 3b 0a 20  TK_REGISTER );. 
3070: 20 20 20 20 20 72 65 67 4c 65 66 74 20 3d 20 73       regLeft = s
3080: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61  qlite3ExprCodeTa
3090: 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 4c 65  rget(pParse, pLe
30a0: 66 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 61 73  ft, 1);.      as
30b0: 73 65 72 74 28 20 72 65 67 4c 65 66 74 21 3d 31  sert( regLeft!=1
30c0: 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   );.    }.    if
30d0: 28 20 70 52 69 67 68 74 2d 3e 66 6c 61 67 73 20  ( pRight->flags 
30e0: 26 20 45 50 5f 78 49 73 53 65 6c 65 63 74 20 29  & EP_xIsSelect )
30f0: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
3100: 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 53  pRight->op==TK_S
3110: 45 4c 45 43 54 20 7c 7c 20 70 52 69 67 68 74 2d  ELECT || pRight-
3120: 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52  >op==TK_REGISTER
3130: 20 29 3b 0a 20 20 20 20 20 20 72 65 67 52 69 67   );.      regRig
3140: 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ht = sqlite3Expr
3150: 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73  CodeTarget(pPars
3160: 65 2c 20 70 52 69 67 68 74 2c 20 31 29 3b 0a 20  e, pRight, 1);. 
3170: 20 20 20 20 20 61 73 73 65 72 74 28 20 72 65 67       assert( reg
3180: 52 69 67 68 74 21 3d 31 20 29 3b 0a 20 20 20 20  Right!=1 );.    
3190: 7d 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65  }.    if( pParse
31a0: 2d 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e 3b  ->nErr ) return;
31b0: 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ..    for(i=0; i
31c0: 3c 6e 4c 65 66 74 3b 20 69 2b 2b 29 7b 0a 20 20  <nLeft; i++){.  
31d0: 20 20 20 20 69 6e 74 20 72 65 67 46 72 65 65 31      int regFree1
31e0: 20 3d 20 30 2c 20 72 65 67 46 72 65 65 32 20 3d   = 0, regFree2 =
31f0: 20 30 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a   0;.      Expr *
3200: 70 4c 2c 20 2a 70 52 3b 20 0a 20 20 20 20 20 20  pL, *pR; .      
3210: 69 6e 74 20 72 31 2c 20 72 32 3b 0a 0a 20 20 20  int r1, r2;..   
3220: 20 20 20 69 66 28 20 72 65 67 4c 65 66 74 20 29     if( regLeft )
3230: 7b 0a 20 20 20 20 20 20 20 20 70 4c 20 3d 20 70  {.        pL = p
3240: 4c 65 66 74 2d 3e 78 2e 70 53 65 6c 65 63 74 2d  Left->x.pSelect-
3250: 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  >pEList->a[i].pE
3260: 78 70 72 3b 0a 20 20 20 20 20 20 20 20 72 31 20  xpr;.        r1 
3270: 3d 20 72 65 67 4c 65 66 74 2b 69 3b 0a 20 20 20  = regLeft+i;.   
3280: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
3290: 20 20 70 4c 20 3d 20 70 4c 65 66 74 2d 3e 78 2e    pL = pLeft->x.
32a0: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
32b0: 72 3b 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20  r;.        r1 = 
32c0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
32d0: 65 6d 70 28 70 50 61 72 73 65 2c 20 70 4c 2c 20  emp(pParse, pL, 
32e0: 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20  &regFree1);.    
32f0: 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 72    }..      if( r
3300: 65 67 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20  egRight ){.     
3310: 20 20 20 70 52 20 3d 20 70 52 69 67 68 74 2d 3e     pR = pRight->
3320: 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73  x.pSelect->pELis
3330: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  t->a[i].pExpr;. 
3340: 20 20 20 20 20 20 20 72 32 20 3d 20 72 65 67 52         r2 = regR
3350: 69 67 68 74 2b 69 3b 0a 20 20 20 20 20 20 7d 65  ight+i;.      }e
3360: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 52 20  lse{.        pR 
3370: 3d 20 70 52 69 67 68 74 2d 3e 78 2e 70 4c 69 73  = pRight->x.pLis
3380: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  t->a[i].pExpr;. 
3390: 20 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69         r2 = sqli
33a0: 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
33b0: 70 50 61 72 73 65 2c 20 70 52 2c 20 26 72 65 67  pParse, pR, &reg
33c0: 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 7d 0a  Free1);.      }.
33d0: 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61  .      codeCompa
33e0: 72 65 28 70 50 61 72 73 65 2c 20 70 4c 2c 20 70  re(pParse, pL, p
33f0: 52 2c 20 6f 70 43 6d 70 2c 20 72 31 2c 20 72 32  R, opCmp, r1, r2
3400: 2c 20 64 65 73 74 2c 20 53 51 4c 49 54 45 5f 53  , dest, SQLITE_S
3410: 54 4f 52 45 50 32 20 7c 20 70 35 29 3b 0a 20 20  TOREP2 | p5);.  
3420: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
3430: 64 64 4f 70 33 28 76 2c 20 6f 70 54 65 73 74 2c  ddOp3(v, opTest,
3440: 20 64 65 73 74 2c 20 61 64 64 72 2c 20 70 33 29   dest, addr, p3)
3450: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  ;.      sqlite3R
3460: 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
3470: 61 72 73 65 2c 20 72 65 67 46 72 65 65 31 29 3b  arse, regFree1);
3480: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
3490: 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
34a0: 72 73 65 2c 20 72 65 67 46 72 65 65 32 29 3b 0a  rse, regFree2);.
34b0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c      }.  }..  sql
34c0: 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
34d0: 61 62 65 6c 28 76 2c 20 61 64 64 72 29 3b 0a 7d  abel(v, addr);.}
34e0: 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  ..#if SQLITE_MAX
34f0: 5f 45 58 50 52 5f 44 45 50 54 48 3e 30 0a 2f 2a  _EXPR_DEPTH>0./*
3500: 0a 2a 2a 20 43 68 65 63 6b 20 74 68 61 74 20 61  .** Check that a
3510: 72 67 75 6d 65 6e 74 20 6e 48 65 69 67 68 74 20  rgument nHeight 
3520: 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20  is less than or 
3530: 65 71 75 61 6c 20 74 6f 20 74 68 65 20 6d 61 78  equal to the max
3540: 69 6d 75 6d 0a 2a 2a 20 65 78 70 72 65 73 73 69  imum.** expressi
3550: 6f 6e 20 64 65 70 74 68 20 61 6c 6c 6f 77 65 64  on depth allowed
3560: 2e 20 49 66 20 69 74 20 69 73 20 6e 6f 74 2c 20  . If it is not, 
3570: 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d  leave an error m
3580: 65 73 73 61 67 65 20 69 6e 0a 2a 2a 20 70 50 61  essage in.** pPa
3590: 72 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  rse..*/.int sqli
35a0: 74 65 33 45 78 70 72 43 68 65 63 6b 48 65 69 67  te3ExprCheckHeig
35b0: 68 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ht(Parse *pParse
35c0: 2c 20 69 6e 74 20 6e 48 65 69 67 68 74 29 7b 0a  , int nHeight){.
35d0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
35e0: 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6d 78 48 65  E_OK;.  int mxHe
35f0: 69 67 68 74 20 3d 20 70 50 61 72 73 65 2d 3e 64  ight = pParse->d
3600: 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45  b->aLimit[SQLITE
3610: 5f 4c 49 4d 49 54 5f 45 58 50 52 5f 44 45 50 54  _LIMIT_EXPR_DEPT
3620: 48 5d 3b 0a 20 20 69 66 28 20 6e 48 65 69 67 68  H];.  if( nHeigh
3630: 74 3e 6d 78 48 65 69 67 68 74 20 29 7b 0a 20 20  t>mxHeight ){.  
3640: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
3650: 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  g(pParse, .     
3660: 20 20 22 45 78 70 72 65 73 73 69 6f 6e 20 74 72    "Expression tr
3670: 65 65 20 69 73 20 74 6f 6f 20 6c 61 72 67 65 20  ee is too large 
3680: 28 6d 61 78 69 6d 75 6d 20 64 65 70 74 68 20 25  (maximum depth %
3690: 64 29 22 2c 20 6d 78 48 65 69 67 68 74 0a 20 20  d)", mxHeight.  
36a0: 20 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51    );.    rc = SQ
36b0: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
36c0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
36d0: 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  /* The following
36e0: 20 74 68 72 65 65 20 66 75 6e 63 74 69 6f 6e 73   three functions
36f0: 2c 20 68 65 69 67 68 74 4f 66 45 78 70 72 28 29  , heightOfExpr()
3700: 2c 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69  , heightOfExprLi
3710: 73 74 28 29 0a 2a 2a 20 61 6e 64 20 68 65 69 67  st().** and heig
3720: 68 74 4f 66 53 65 6c 65 63 74 28 29 2c 20 61 72  htOfSelect(), ar
3730: 65 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d  e used to determ
3740: 69 6e 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  ine the maximum 
3750: 68 65 69 67 68 74 0a 2a 2a 20 6f 66 20 61 6e 79  height.** of any
3760: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
3770: 20 72 65 66 65 72 65 6e 63 65 64 20 62 79 20 74   referenced by t
3780: 68 65 20 73 74 72 75 63 74 75 72 65 20 70 61 73  he structure pas
3790: 73 65 64 20 61 73 20 74 68 65 0a 2a 2a 20 66 69  sed as the.** fi
37a0: 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a  rst argument..**
37b0: 0a 2a 2a 20 49 66 20 74 68 69 73 20 6d 61 78 69  .** If this maxi
37c0: 6d 75 6d 20 68 65 69 67 68 74 20 69 73 20 67 72  mum height is gr
37d0: 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 63  eater than the c
37e0: 75 72 72 65 6e 74 20 76 61 6c 75 65 20 70 6f 69  urrent value poi
37f0: 6e 74 65 64 0a 2a 2a 20 74 6f 20 62 79 20 70 6e  nted.** to by pn
3800: 48 65 69 67 68 74 2c 20 74 68 65 20 73 65 63 6f  Height, the seco
3810: 6e 64 20 70 61 72 61 6d 65 74 65 72 2c 20 74 68  nd parameter, th
3820: 65 6e 20 73 65 74 20 2a 70 6e 48 65 69 67 68 74  en set *pnHeight
3830: 20 74 6f 20 74 68 61 74 0a 2a 2a 20 76 61 6c 75   to that.** valu
3840: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
3850: 64 20 68 65 69 67 68 74 4f 66 45 78 70 72 28 45  d heightOfExpr(E
3860: 78 70 72 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 48  xpr *p, int *pnH
3870: 65 69 67 68 74 29 7b 0a 20 20 69 66 28 20 70 20  eight){.  if( p 
3880: 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 48  ){.    if( p->nH
3890: 65 69 67 68 74 3e 2a 70 6e 48 65 69 67 68 74 20  eight>*pnHeight 
38a0: 29 7b 0a 20 20 20 20 20 20 2a 70 6e 48 65 69 67  ){.      *pnHeig
38b0: 68 74 20 3d 20 70 2d 3e 6e 48 65 69 67 68 74 3b  ht = p->nHeight;
38c0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61  .    }.  }.}.sta
38d0: 74 69 63 20 76 6f 69 64 20 68 65 69 67 68 74 4f  tic void heightO
38e0: 66 45 78 70 72 4c 69 73 74 28 45 78 70 72 4c 69  fExprList(ExprLi
38f0: 73 74 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 48 65  st *p, int *pnHe
3900: 69 67 68 74 29 7b 0a 20 20 69 66 28 20 70 20 29  ight){.  if( p )
3910: 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
3920: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
3930: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
3940: 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 28 70    heightOfExpr(p
3950: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 70 6e  ->a[i].pExpr, pn
3960: 48 65 69 67 68 74 29 3b 0a 20 20 20 20 7d 0a 20  Height);.    }. 
3970: 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64   }.}.static void
3980: 20 68 65 69 67 68 74 4f 66 53 65 6c 65 63 74 28   heightOfSelect(
3990: 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 2a  Select *p, int *
39a0: 70 6e 48 65 69 67 68 74 29 7b 0a 20 20 69 66 28  pnHeight){.  if(
39b0: 20 70 20 29 7b 0a 20 20 20 20 68 65 69 67 68 74   p ){.    height
39c0: 4f 66 45 78 70 72 28 70 2d 3e 70 57 68 65 72 65  OfExpr(p->pWhere
39d0: 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20  , pnHeight);.   
39e0: 20 68 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d   heightOfExpr(p-
39f0: 3e 70 48 61 76 69 6e 67 2c 20 70 6e 48 65 69 67  >pHaving, pnHeig
3a00: 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f  ht);.    heightO
3a10: 66 45 78 70 72 28 70 2d 3e 70 4c 69 6d 69 74 2c  fExpr(p->pLimit,
3a20: 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20   pnHeight);.    
3a30: 68 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e  heightOfExpr(p->
3a40: 70 4f 66 66 73 65 74 2c 20 70 6e 48 65 69 67 68  pOffset, pnHeigh
3a50: 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66  t);.    heightOf
3a60: 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 45 4c 69  ExprList(p->pELi
3a70: 73 74 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20  st, pnHeight);. 
3a80: 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c     heightOfExprL
3a90: 69 73 74 28 70 2d 3e 70 47 72 6f 75 70 42 79 2c  ist(p->pGroupBy,
3aa0: 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20   pnHeight);.    
3ab0: 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74  heightOfExprList
3ac0: 28 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 70 6e  (p->pOrderBy, pn
3ad0: 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69  Height);.    hei
3ae0: 67 68 74 4f 66 53 65 6c 65 63 74 28 70 2d 3e 70  ghtOfSelect(p->p
3af0: 50 72 69 6f 72 2c 20 70 6e 48 65 69 67 68 74 29  Prior, pnHeight)
3b00: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  ;.  }.}../*.** S
3b10: 65 74 20 74 68 65 20 45 78 70 72 2e 6e 48 65 69  et the Expr.nHei
3b20: 67 68 74 20 76 61 72 69 61 62 6c 65 20 69 6e 20  ght variable in 
3b30: 74 68 65 20 73 74 72 75 63 74 75 72 65 20 70 61  the structure pa
3b40: 73 73 65 64 20 61 73 20 61 6e 20 0a 2a 2a 20 61  ssed as an .** a
3b50: 72 67 75 6d 65 6e 74 2e 20 41 6e 20 65 78 70 72  rgument. An expr
3b60: 65 73 73 69 6f 6e 20 77 69 74 68 20 6e 6f 20 63  ession with no c
3b70: 68 69 6c 64 72 65 6e 2c 20 45 78 70 72 2e 70 4c  hildren, Expr.pL
3b80: 69 73 74 20 6f 72 20 0a 2a 2a 20 45 78 70 72 2e  ist or .** Expr.
3b90: 70 53 65 6c 65 63 74 20 6d 65 6d 62 65 72 20 68  pSelect member h
3ba0: 61 73 20 61 20 68 65 69 67 68 74 20 6f 66 20 31  as a height of 1
3bb0: 2e 20 41 6e 79 20 6f 74 68 65 72 20 65 78 70 72  . Any other expr
3bc0: 65 73 73 69 6f 6e 0a 2a 2a 20 68 61 73 20 61 20  ession.** has a 
3bd0: 68 65 69 67 68 74 20 65 71 75 61 6c 20 74 6f 20  height equal to 
3be0: 74 68 65 20 6d 61 78 69 6d 75 6d 20 68 65 69 67  the maximum heig
3bf0: 68 74 20 6f 66 20 61 6e 79 20 6f 74 68 65 72 20  ht of any other 
3c00: 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 64 20 45  .** referenced E
3c10: 78 70 72 20 70 6c 75 73 20 6f 6e 65 2e 0a 2a 2a  xpr plus one..**
3c20: 0a 2a 2a 20 41 6c 73 6f 20 70 72 6f 70 61 67 61  .** Also propaga
3c30: 74 65 20 45 50 5f 50 72 6f 70 61 67 61 74 65 20  te EP_Propagate 
3c40: 66 6c 61 67 73 20 75 70 20 66 72 6f 6d 20 45 78  flags up from Ex
3c50: 70 72 2e 78 2e 70 4c 69 73 74 20 74 6f 20 45 78  pr.x.pList to Ex
3c60: 70 72 2e 66 6c 61 67 73 2c 0a 2a 2a 20 69 66 20  pr.flags,.** if 
3c70: 61 70 70 72 6f 70 72 69 61 74 65 2e 0a 2a 2f 0a  appropriate..*/.
3c80: 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 72  static void expr
3c90: 53 65 74 48 65 69 67 68 74 28 45 78 70 72 20 2a  SetHeight(Expr *
3ca0: 70 29 7b 0a 20 20 69 6e 74 20 6e 48 65 69 67 68  p){.  int nHeigh
3cb0: 74 20 3d 20 30 3b 0a 20 20 68 65 69 67 68 74 4f  t = 0;.  heightO
3cc0: 66 45 78 70 72 28 70 2d 3e 70 4c 65 66 74 2c 20  fExpr(p->pLeft, 
3cd0: 26 6e 48 65 69 67 68 74 29 3b 0a 20 20 68 65 69  &nHeight);.  hei
3ce0: 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 52 69  ghtOfExpr(p->pRi
3cf0: 67 68 74 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a  ght, &nHeight);.
3d00: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
3d10: 70 65 72 74 79 28 70 2c 20 45 50 5f 78 49 73 53  perty(p, EP_xIsS
3d20: 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 68 65  elect) ){.    he
3d30: 69 67 68 74 4f 66 53 65 6c 65 63 74 28 70 2d 3e  ightOfSelect(p->
3d40: 78 2e 70 53 65 6c 65 63 74 2c 20 26 6e 48 65 69  x.pSelect, &nHei
3d50: 67 68 74 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  ght);.  }else if
3d60: 28 20 70 2d 3e 78 2e 70 4c 69 73 74 20 29 7b 0a  ( p->x.pList ){.
3d70: 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72      heightOfExpr
3d80: 4c 69 73 74 28 70 2d 3e 78 2e 70 4c 69 73 74 2c  List(p->x.pList,
3d90: 20 26 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20   &nHeight);.    
3da0: 70 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 50  p->flags |= EP_P
3db0: 72 6f 70 61 67 61 74 65 20 26 20 73 71 6c 69 74  ropagate & sqlit
3dc0: 65 33 45 78 70 72 4c 69 73 74 46 6c 61 67 73 28  e3ExprListFlags(
3dd0: 70 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 7d  p->x.pList);.  }
3de0: 0a 20 20 70 2d 3e 6e 48 65 69 67 68 74 20 3d 20  .  p->nHeight = 
3df0: 6e 48 65 69 67 68 74 20 2b 20 31 3b 0a 7d 0a 0a  nHeight + 1;.}..
3e00: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 45 78  /*.** Set the Ex
3e10: 70 72 2e 6e 48 65 69 67 68 74 20 76 61 72 69 61  pr.nHeight varia
3e20: 62 6c 65 20 75 73 69 6e 67 20 74 68 65 20 65 78  ble using the ex
3e30: 70 72 53 65 74 48 65 69 67 68 74 28 29 20 66 75  prSetHeight() fu
3e40: 6e 63 74 69 6f 6e 2e 20 49 66 0a 2a 2a 20 74 68  nction. If.** th
3e50: 65 20 68 65 69 67 68 74 20 69 73 20 67 72 65 61  e height is grea
3e60: 74 65 72 20 74 68 61 6e 20 74 68 65 20 6d 61 78  ter than the max
3e70: 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20 65 78 70  imum allowed exp
3e80: 72 65 73 73 69 6f 6e 20 64 65 70 74 68 2c 0a 2a  ression depth,.*
3e90: 2a 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72  * leave an error
3ea0: 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2a 0a 2a   in pParse..**.*
3eb0: 2a 20 41 6c 73 6f 20 70 72 6f 70 61 67 61 74 65  * Also propagate
3ec0: 20 61 6c 6c 20 45 50 5f 50 72 6f 70 61 67 61 74   all EP_Propagat
3ed0: 65 20 66 6c 61 67 73 20 66 72 6f 6d 20 74 68 65  e flags from the
3ee0: 20 45 78 70 72 2e 78 2e 70 4c 69 73 74 20 69 6e   Expr.x.pList in
3ef0: 74 6f 0a 2a 2a 20 45 78 70 72 2e 66 6c 61 67 73  to.** Expr.flags
3f00: 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  . .*/.void sqlit
3f10: 65 33 45 78 70 72 53 65 74 48 65 69 67 68 74 41  e3ExprSetHeightA
3f20: 6e 64 46 6c 61 67 73 28 50 61 72 73 65 20 2a 70  ndFlags(Parse *p
3f30: 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 29 7b  Parse, Expr *p){
3f40: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
3f50: 45 72 72 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  Err ) return;.  
3f60: 65 78 70 72 53 65 74 48 65 69 67 68 74 28 70 29  exprSetHeight(p)
3f70: 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43  ;.  sqlite3ExprC
3f80: 68 65 63 6b 48 65 69 67 68 74 28 70 50 61 72 73  heckHeight(pPars
3f90: 65 2c 20 70 2d 3e 6e 48 65 69 67 68 74 29 3b 0a  e, p->nHeight);.
3fa0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
3fb0: 74 68 65 20 6d 61 78 69 6d 75 6d 20 68 65 69 67  the maximum heig
3fc0: 68 74 20 6f 66 20 61 6e 79 20 65 78 70 72 65 73  ht of any expres
3fd0: 73 69 6f 6e 20 74 72 65 65 20 72 65 66 65 72 65  sion tree refere
3fe0: 6e 63 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 73  nced.** by the s
3ff0: 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20  elect statement 
4000: 70 61 73 73 65 64 20 61 73 20 61 6e 20 61 72 67  passed as an arg
4010: 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ument..*/.int sq
4020: 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 72 48  lite3SelectExprH
4030: 65 69 67 68 74 28 53 65 6c 65 63 74 20 2a 70 29  eight(Select *p)
4040: 7b 0a 20 20 69 6e 74 20 6e 48 65 69 67 68 74 20  {.  int nHeight 
4050: 3d 20 30 3b 0a 20 20 68 65 69 67 68 74 4f 66 53  = 0;.  heightOfS
4060: 65 6c 65 63 74 28 70 2c 20 26 6e 48 65 69 67 68  elect(p, &nHeigh
4070: 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 48 65  t);.  return nHe
4080: 69 67 68 74 3b 0a 7d 0a 23 65 6c 73 65 20 2f 2a  ight;.}.#else /*
4090: 20 41 42 4f 56 45 3a 20 20 48 65 69 67 68 74 20   ABOVE:  Height 
40a0: 65 6e 66 6f 72 63 65 6d 65 6e 74 20 65 6e 61 62  enforcement enab
40b0: 6c 65 64 2e 20 20 42 45 4c 4f 57 3a 20 48 65 69  led.  BELOW: Hei
40c0: 67 68 74 20 65 6e 66 6f 72 63 65 6d 65 6e 74 20  ght enforcement 
40d0: 6f 66 66 20 2a 2f 0a 2f 2a 0a 2a 2a 20 50 72 6f  off */./*.** Pro
40e0: 70 61 67 61 74 65 20 61 6c 6c 20 45 50 5f 50 72  pagate all EP_Pr
40f0: 6f 70 61 67 61 74 65 20 66 6c 61 67 73 20 66 72  opagate flags fr
4100: 6f 6d 20 74 68 65 20 45 78 70 72 2e 78 2e 70 4c  om the Expr.x.pL
4110: 69 73 74 20 69 6e 74 6f 0a 2a 2a 20 45 78 70 72  ist into.** Expr
4120: 2e 66 6c 61 67 73 2e 20 0a 2a 2f 0a 76 6f 69 64  .flags. .*/.void
4130: 20 73 71 6c 69 74 65 33 45 78 70 72 53 65 74 48   sqlite3ExprSetH
4140: 65 69 67 68 74 41 6e 64 46 6c 61 67 73 28 50 61  eightAndFlags(Pa
4150: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
4160: 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20 26  r *p){.  if( p &
4170: 26 20 70 2d 3e 78 2e 70 4c 69 73 74 20 26 26 20  & p->x.pList && 
4180: 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
4190: 28 70 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  (p, EP_xIsSelect
41a0: 29 20 29 7b 0a 20 20 20 20 70 2d 3e 66 6c 61 67  ) ){.    p->flag
41b0: 73 20 7c 3d 20 45 50 5f 50 72 6f 70 61 67 61 74  s |= EP_Propagat
41c0: 65 20 26 20 73 71 6c 69 74 65 33 45 78 70 72 4c  e & sqlite3ExprL
41d0: 69 73 74 46 6c 61 67 73 28 70 2d 3e 78 2e 70 4c  istFlags(p->x.pL
41e0: 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a 23 64 65 66  ist);.  }.}.#def
41f0: 69 6e 65 20 65 78 70 72 53 65 74 48 65 69 67 68  ine exprSetHeigh
4200: 74 28 79 29 0a 23 65 6e 64 69 66 20 2f 2a 20 53  t(y).#endif /* S
4210: 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44  QLITE_MAX_EXPR_D
4220: 45 50 54 48 3e 30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  EPTH>0 */../*.**
4230: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
4240: 20 74 68 65 20 63 6f 72 65 20 61 6c 6c 6f 63 61   the core alloca
4250: 74 6f 72 20 66 6f 72 20 45 78 70 72 20 6e 6f 64  tor for Expr nod
4260: 65 73 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e 73 74 72  es..**.** Constr
4270: 75 63 74 20 61 20 6e 65 77 20 65 78 70 72 65 73  uct a new expres
4280: 73 69 6f 6e 20 6e 6f 64 65 20 61 6e 64 20 72 65  sion node and re
4290: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
42a0: 6f 20 69 74 2e 20 20 4d 65 6d 6f 72 79 0a 2a 2a  o it.  Memory.**
42b0: 20 66 6f 72 20 74 68 69 73 20 6e 6f 64 65 20 61   for this node a
42c0: 6e 64 20 66 6f 72 20 74 68 65 20 70 54 6f 6b 65  nd for the pToke
42d0: 6e 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20  n argument is a 
42e0: 73 69 6e 67 6c 65 20 61 6c 6c 6f 63 61 74 69 6f  single allocatio
42f0: 6e 0a 2a 2a 20 6f 62 74 61 69 6e 65 64 20 66 72  n.** obtained fr
4300: 6f 6d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c  om sqlite3DbMall
4310: 6f 63 28 29 2e 20 20 54 68 65 20 63 61 6c 6c 69  oc().  The calli
4320: 6e 67 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69  ng function.** i
4330: 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
4340: 72 20 6d 61 6b 69 6e 67 20 73 75 72 65 20 74 68  r making sure th
4350: 65 20 6e 6f 64 65 20 65 76 65 6e 74 75 61 6c 6c  e node eventuall
4360: 79 20 67 65 74 73 20 66 72 65 65 64 2e 0a 2a 2a  y gets freed..**
4370: 0a 2a 2a 20 49 66 20 64 65 71 75 6f 74 65 20 69  .** If dequote i
4380: 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65  s true, then the
4390: 20 74 6f 6b 65 6e 20 28 69 66 20 69 74 20 65 78   token (if it ex
43a0: 69 73 74 73 29 20 69 73 20 64 65 71 75 6f 74 65  ists) is dequote
43b0: 64 2e 0a 2a 2a 20 49 66 20 64 65 71 75 6f 74 65  d..** If dequote
43c0: 20 69 73 20 66 61 6c 73 65 2c 20 6e 6f 20 64 65   is false, no de
43d0: 71 75 6f 74 69 6e 67 20 69 73 20 70 65 72 66 6f  quoting is perfo
43e0: 72 6d 65 64 2e 20 20 54 68 65 20 64 65 51 75 6f  rmed.  The deQuo
43f0: 74 65 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20  te.** parameter 
4400: 69 73 20 69 67 6e 6f 72 65 64 20 69 66 20 70 54  is ignored if pT
4410: 6f 6b 65 6e 20 69 73 20 4e 55 4c 4c 20 6f 72 20  oken is NULL or 
4420: 69 66 20 74 68 65 20 74 6f 6b 65 6e 20 64 6f 65  if the token doe
4430: 73 20 6e 6f 74 0a 2a 2a 20 61 70 70 65 61 72 20  s not.** appear 
4440: 74 6f 20 62 65 20 71 75 6f 74 65 64 2e 20 20 49  to be quoted.  I
4450: 66 20 74 68 65 20 71 75 6f 74 65 73 20 77 65 72  f the quotes wer
4460: 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 2e  e of the form ".
4470: 2e 2e 22 20 28 64 6f 75 62 6c 65 2d 71 75 6f 74  .." (double-quot
4480: 65 73 29 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20  es).** then the 
4490: 45 50 5f 44 62 6c 51 75 6f 74 65 64 20 66 6c 61  EP_DblQuoted fla
44a0: 67 20 69 73 20 73 65 74 20 6f 6e 20 74 68 65 20  g is set on the 
44b0: 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 2e  expression node.
44c0: 0a 2a 2a 0a 2a 2a 20 53 70 65 63 69 61 6c 20 63  .**.** Special c
44d0: 61 73 65 3a 20 20 49 66 20 6f 70 3d 3d 54 4b 5f  ase:  If op==TK_
44e0: 49 4e 54 45 47 45 52 20 61 6e 64 20 70 54 6f 6b  INTEGER and pTok
44f0: 65 6e 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 73  en points to a s
4500: 74 72 69 6e 67 20 74 68 61 74 0a 2a 2a 20 63 61  tring that.** ca
4510: 6e 20 62 65 20 74 72 61 6e 73 6c 61 74 65 64 20  n be translated 
4520: 69 6e 74 6f 20 61 20 33 32 2d 62 69 74 20 69 6e  into a 32-bit in
4530: 74 65 67 65 72 2c 20 74 68 65 6e 20 74 68 65 20  teger, then the 
4540: 74 6f 6b 65 6e 20 69 73 20 6e 6f 74 0a 2a 2a 20  token is not.** 
4550: 73 74 6f 72 65 64 20 69 6e 20 75 2e 7a 54 6f 6b  stored in u.zTok
4560: 65 6e 2e 20 20 49 6e 73 74 65 61 64 2c 20 74 68  en.  Instead, th
4570: 65 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 73  e integer values
4580: 20 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69   is written.** i
4590: 6e 74 6f 20 75 2e 69 56 61 6c 75 65 20 61 6e 64  nto u.iValue and
45a0: 20 74 68 65 20 45 50 5f 49 6e 74 56 61 6c 75 65   the EP_IntValue
45b0: 20 66 6c 61 67 20 69 73 20 73 65 74 2e 20 20 4e   flag is set.  N
45c0: 6f 20 65 78 74 72 61 20 73 74 6f 72 61 67 65 0a  o extra storage.
45d0: 2a 2a 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20  ** is allocated 
45e0: 74 6f 20 68 6f 6c 64 20 74 68 65 20 69 6e 74 65  to hold the inte
45f0: 67 65 72 20 74 65 78 74 20 61 6e 64 20 74 68 65  ger text and the
4600: 20 64 65 71 75 6f 74 65 20 66 6c 61 67 20 69 73   dequote flag is
4610: 20 69 67 6e 6f 72 65 64 2e 0a 2a 2f 0a 45 78 70   ignored..*/.Exp
4620: 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 41 6c  r *sqlite3ExprAl
4630: 6c 6f 63 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  loc(.  sqlite3 *
4640: 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  db,            /
4650: 2a 20 48 61 6e 64 6c 65 20 66 6f 72 20 73 71 6c  * Handle for sql
4660: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
4670: 28 29 20 28 6d 61 79 20 62 65 20 6e 75 6c 6c 29  () (may be null)
4680: 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20   */.  int op,   
4690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
46a0: 20 45 78 70 72 65 73 73 69 6f 6e 20 6f 70 63 6f   Expression opco
46b0: 64 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 54 6f  de */.  const To
46c0: 6b 65 6e 20 2a 70 54 6f 6b 65 6e 2c 20 20 20 20  ken *pToken,    
46d0: 2f 2a 20 54 6f 6b 65 6e 20 61 72 67 75 6d 65 6e  /* Token argumen
46e0: 74 2e 20 20 4d 69 67 68 74 20 62 65 20 4e 55 4c  t.  Might be NUL
46f0: 4c 20 2a 2f 0a 20 20 69 6e 74 20 64 65 71 75 6f  L */.  int dequo
4700: 74 65 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  te             /
4710: 2a 20 54 72 75 65 20 74 6f 20 64 65 71 75 6f 74  * True to dequot
4720: 65 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a  e */.){.  Expr *
4730: 70 4e 65 77 3b 0a 20 20 69 6e 74 20 6e 45 78 74  pNew;.  int nExt
4740: 72 61 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 56  ra = 0;.  int iV
4750: 61 6c 75 65 20 3d 20 30 3b 0a 0a 20 20 61 73 73  alue = 0;..  ass
4760: 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20  ert( db!=0 );.  
4770: 69 66 28 20 70 54 6f 6b 65 6e 20 29 7b 0a 20 20  if( pToken ){.  
4780: 20 20 69 66 28 20 6f 70 21 3d 54 4b 5f 49 4e 54    if( op!=TK_INT
4790: 45 47 45 52 20 7c 7c 20 70 54 6f 6b 65 6e 2d 3e  EGER || pToken->
47a0: 7a 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 7c  z==0.          |
47b0: 7c 20 73 71 6c 69 74 65 33 47 65 74 49 6e 74 33  | sqlite3GetInt3
47c0: 32 28 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 26 69 56  2(pToken->z, &iV
47d0: 61 6c 75 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  alue)==0 ){.    
47e0: 20 20 6e 45 78 74 72 61 20 3d 20 70 54 6f 6b 65    nExtra = pToke
47f0: 6e 2d 3e 6e 2b 31 3b 0a 20 20 20 20 20 20 61 73  n->n+1;.      as
4800: 73 65 72 74 28 20 69 56 61 6c 75 65 3e 3d 30 20  sert( iValue>=0 
4810: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  );.    }.  }.  p
4820: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  New = sqlite3DbM
4830: 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73  allocRawNN(db, s
4840: 69 7a 65 6f 66 28 45 78 70 72 29 2b 6e 45 78 74  izeof(Expr)+nExt
4850: 72 61 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 20  ra);.  if( pNew 
4860: 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 4e  ){.    memset(pN
4870: 65 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 45 78  ew, 0, sizeof(Ex
4880: 70 72 29 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  pr));.    pNew->
4890: 6f 70 20 3d 20 28 75 38 29 6f 70 3b 0a 20 20 20  op = (u8)op;.   
48a0: 20 70 4e 65 77 2d 3e 69 41 67 67 20 3d 20 2d 31   pNew->iAgg = -1
48b0: 3b 0a 20 20 20 20 69 66 28 20 70 54 6f 6b 65 6e  ;.    if( pToken
48c0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 45   ){.      if( nE
48d0: 78 74 72 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20  xtra==0 ){.     
48e0: 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c     pNew->flags |
48f0: 3d 20 45 50 5f 49 6e 74 56 61 6c 75 65 3b 0a 20  = EP_IntValue;. 
4900: 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 69         pNew->u.i
4910: 56 61 6c 75 65 20 3d 20 69 56 61 6c 75 65 3b 0a  Value = iValue;.
4920: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
4930: 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 7a 54 6f       pNew->u.zTo
4940: 6b 65 6e 20 3d 20 28 63 68 61 72 2a 29 26 70 4e  ken = (char*)&pN
4950: 65 77 5b 31 5d 3b 0a 20 20 20 20 20 20 20 20 61  ew[1];.        a
4960: 73 73 65 72 74 28 20 70 54 6f 6b 65 6e 2d 3e 7a  ssert( pToken->z
4970: 21 3d 30 20 7c 7c 20 70 54 6f 6b 65 6e 2d 3e 6e  !=0 || pToken->n
4980: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69  ==0 );.        i
4990: 66 28 20 70 54 6f 6b 65 6e 2d 3e 6e 20 29 20 6d  f( pToken->n ) m
49a0: 65 6d 63 70 79 28 70 4e 65 77 2d 3e 75 2e 7a 54  emcpy(pNew->u.zT
49b0: 6f 6b 65 6e 2c 20 70 54 6f 6b 65 6e 2d 3e 7a 2c  oken, pToken->z,
49c0: 20 70 54 6f 6b 65 6e 2d 3e 6e 29 3b 0a 20 20 20   pToken->n);.   
49d0: 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 7a 54 6f       pNew->u.zTo
49e0: 6b 65 6e 5b 70 54 6f 6b 65 6e 2d 3e 6e 5d 20 3d  ken[pToken->n] =
49f0: 20 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   0;.        if( 
4a00: 64 65 71 75 6f 74 65 20 26 26 20 73 71 6c 69 74  dequote && sqlit
4a10: 65 33 49 73 71 75 6f 74 65 28 70 4e 65 77 2d 3e  e3Isquote(pNew->
4a20: 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 29 20 29 7b 0a  u.zToken[0]) ){.
4a30: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4e            if( pN
4a40: 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d  ew->u.zToken[0]=
4a50: 3d 27 22 27 20 29 20 70 4e 65 77 2d 3e 66 6c 61  ='"' ) pNew->fla
4a60: 67 73 20 7c 3d 20 45 50 5f 44 62 6c 51 75 6f 74  gs |= EP_DblQuot
4a70: 65 64 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  ed;.          sq
4a80: 6c 69 74 65 33 44 65 71 75 6f 74 65 28 70 4e 65  lite3Dequote(pNe
4a90: 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20  w->u.zToken);.  
4aa0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
4ab0: 20 20 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45      }.#if SQLITE
4ac0: 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48 3e  _MAX_EXPR_DEPTH>
4ad0: 30 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 48 65 69  0.    pNew->nHei
4ae0: 67 68 74 20 3d 20 31 3b 0a 23 65 6e 64 69 66 20  ght = 1;.#endif 
4af0: 20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70   .  }.  return p
4b00: 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c  New;.}../*.** Al
4b10: 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 65 78 70  locate a new exp
4b20: 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 66 72 6f  ression node fro
4b30: 6d 20 61 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61  m a zero-termina
4b40: 74 65 64 20 74 6f 6b 65 6e 20 74 68 61 74 20 68  ted token that h
4b50: 61 73 0a 2a 2a 20 61 6c 72 65 61 64 79 20 62 65  as.** already be
4b60: 65 6e 20 64 65 71 75 6f 74 65 64 2e 0a 2a 2f 0a  en dequoted..*/.
4b70: 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70  Expr *sqlite3Exp
4b80: 72 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  r(.  sqlite3 *db
4b90: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
4ba0: 48 61 6e 64 6c 65 20 66 6f 72 20 73 71 6c 69 74  Handle for sqlit
4bb0: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 29  e3DbMallocZero()
4bc0: 20 28 6d 61 79 20 62 65 20 6e 75 6c 6c 29 20 2a   (may be null) *
4bd0: 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20  /.  int op,     
4be0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
4bf0: 78 70 72 65 73 73 69 6f 6e 20 6f 70 63 6f 64 65  xpression opcode
4c00: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
4c10: 20 2a 7a 54 6f 6b 65 6e 20 20 20 20 20 20 2f 2a   *zToken      /*
4c20: 20 54 6f 6b 65 6e 20 61 72 67 75 6d 65 6e 74 2e   Token argument.
4c30: 20 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20    Might be NULL 
4c40: 2a 2f 0a 29 7b 0a 20 20 54 6f 6b 65 6e 20 78 3b  */.){.  Token x;
4c50: 0a 20 20 78 2e 7a 20 3d 20 7a 54 6f 6b 65 6e 3b  .  x.z = zToken;
4c60: 0a 20 20 78 2e 6e 20 3d 20 7a 54 6f 6b 65 6e 20  .  x.n = zToken 
4c70: 3f 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  ? sqlite3Strlen3
4c80: 30 28 7a 54 6f 6b 65 6e 29 20 3a 20 30 3b 0a 20  0(zToken) : 0;. 
4c90: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45   return sqlite3E
4ca0: 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 6f 70 2c  xprAlloc(db, op,
4cb0: 20 26 78 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   &x, 0);.}../*.*
4cc0: 2a 20 41 74 74 61 63 68 20 73 75 62 74 72 65 65  * Attach subtree
4cd0: 73 20 70 4c 65 66 74 20 61 6e 64 20 70 52 69 67  s pLeft and pRig
4ce0: 68 74 20 74 6f 20 74 68 65 20 45 78 70 72 20 6e  ht to the Expr n
4cf0: 6f 64 65 20 70 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a  ode pRoot..**.**
4d00: 20 49 66 20 70 52 6f 6f 74 3d 3d 4e 55 4c 4c 20   If pRoot==NULL 
4d10: 74 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20  that means that 
4d20: 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  a memory allocat
4d30: 69 6f 6e 20 65 72 72 6f 72 20 68 61 73 20 6f 63  ion error has oc
4d40: 63 75 72 72 65 64 2e 0a 2a 2a 20 49 6e 20 74 68  curred..** In th
4d50: 61 74 20 63 61 73 65 2c 20 64 65 6c 65 74 65 20  at case, delete 
4d60: 74 68 65 20 73 75 62 74 72 65 65 73 20 70 4c 65  the subtrees pLe
4d70: 66 74 20 61 6e 64 20 70 52 69 67 68 74 2e 0a 2a  ft and pRight..*
4d80: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
4d90: 70 72 41 74 74 61 63 68 53 75 62 74 72 65 65 73  prAttachSubtrees
4da0: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
4db0: 0a 20 20 45 78 70 72 20 2a 70 52 6f 6f 74 2c 0a  .  Expr *pRoot,.
4dc0: 20 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 0a 20    Expr *pLeft,. 
4dd0: 20 45 78 70 72 20 2a 70 52 69 67 68 74 0a 29 7b   Expr *pRight.){
4de0: 0a 20 20 69 66 28 20 70 52 6f 6f 74 3d 3d 30 20  .  if( pRoot==0 
4df0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64  ){.    assert( d
4e00: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
4e10: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
4e20: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 65  prDelete(db, pLe
4e30: 66 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ft);.    sqlite3
4e40: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
4e50: 52 69 67 68 74 29 3b 0a 20 20 7d 65 6c 73 65 7b  Right);.  }else{
4e60: 0a 20 20 20 20 69 66 28 20 70 52 69 67 68 74 20  .    if( pRight 
4e70: 29 7b 0a 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e  ){.      pRoot->
4e80: 70 52 69 67 68 74 20 3d 20 70 52 69 67 68 74 3b  pRight = pRight;
4e90: 0a 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e 66 6c  .      pRoot->fl
4ea0: 61 67 73 20 7c 3d 20 45 50 5f 50 72 6f 70 61 67  ags |= EP_Propag
4eb0: 61 74 65 20 26 20 70 52 69 67 68 74 2d 3e 66 6c  ate & pRight->fl
4ec0: 61 67 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ags;.    }.    i
4ed0: 66 28 20 70 4c 65 66 74 20 29 7b 0a 20 20 20 20  f( pLeft ){.    
4ee0: 20 20 70 52 6f 6f 74 2d 3e 70 4c 65 66 74 20 3d    pRoot->pLeft =
4ef0: 20 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 70 52   pLeft;.      pR
4f00: 6f 6f 74 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50  oot->flags |= EP
4f10: 5f 50 72 6f 70 61 67 61 74 65 20 26 20 70 4c 65  _Propagate & pLe
4f20: 66 74 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 7d  ft->flags;.    }
4f30: 0a 20 20 20 20 65 78 70 72 53 65 74 48 65 69 67  .    exprSetHeig
4f40: 68 74 28 70 52 6f 6f 74 29 3b 0a 20 20 7d 0a 7d  ht(pRoot);.  }.}
4f50: 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
4f60: 20 61 6e 20 45 78 70 72 20 6e 6f 64 65 20 77 68   an Expr node wh
4f70: 69 63 68 20 6a 6f 69 6e 73 20 61 73 20 6d 61 6e  ich joins as man
4f80: 79 20 61 73 20 74 77 6f 20 73 75 62 74 72 65 65  y as two subtree
4f90: 73 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 65 20 6f 72 20  s..**.** One or 
4fa0: 62 6f 74 68 20 6f 66 20 74 68 65 20 73 75 62 74  both of the subt
4fb0: 72 65 65 73 20 63 61 6e 20 62 65 20 4e 55 4c 4c  rees can be NULL
4fc0: 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  .  Return a poin
4fd0: 74 65 72 20 74 6f 20 74 68 65 20 6e 65 77 0a 2a  ter to the new.*
4fe0: 2a 20 45 78 70 72 20 6e 6f 64 65 2e 20 20 4f 72  * Expr node.  Or
4ff0: 2c 20 69 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f  , if an OOM erro
5000: 72 20 6f 63 63 75 72 73 2c 20 73 65 74 20 70 50  r occurs, set pP
5010: 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
5020: 46 61 69 6c 65 64 2c 0a 2a 2a 20 66 72 65 65 20  Failed,.** free 
5030: 74 68 65 20 73 75 62 74 72 65 65 73 20 61 6e 64  the subtrees and
5040: 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f   return NULL..*/
5050: 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 50 45  .Expr *sqlite3PE
5060: 78 70 72 28 0a 20 20 50 61 72 73 65 20 2a 70 50  xpr(.  Parse *pP
5070: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f  arse,          /
5080: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
5090: 74 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20  t */.  int op,  
50a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
50b0: 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 6f 70 63  * Expression opc
50c0: 6f 64 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ode */.  Expr *p
50d0: 4c 65 66 74 2c 20 20 20 20 20 20 20 20 20 20 20  Left,           
50e0: 20 2f 2a 20 4c 65 66 74 20 6f 70 65 72 61 6e 64   /* Left operand
50f0: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 52 69 67   */.  Expr *pRig
5100: 68 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ht,           /*
5110: 20 52 69 67 68 74 20 6f 70 65 72 61 6e 64 20 2a   Right operand *
5120: 2f 0a 20 20 63 6f 6e 73 74 20 54 6f 6b 65 6e 20  /.  const Token 
5130: 2a 70 54 6f 6b 65 6e 20 20 20 20 20 2f 2a 20 41  *pToken     /* A
5140: 72 67 75 6d 65 6e 74 20 74 6f 6b 65 6e 20 2a 2f  rgument token */
5150: 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70 3b 0a 20  .){.  Expr *p;. 
5160: 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4e 44 20   if( op==TK_AND 
5170: 26 26 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d  && pParse->nErr=
5180: 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 61 6b  =0 ){.    /* Tak
5190: 65 20 61 64 76 61 6e 74 61 67 65 20 6f 66 20 73  e advantage of s
51a0: 68 6f 72 74 2d 63 69 72 63 75 69 74 20 66 61 6c  hort-circuit fal
51b0: 73 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  se optimization 
51c0: 66 6f 72 20 41 4e 44 20 2a 2f 0a 20 20 20 20 70  for AND */.    p
51d0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e   = sqlite3ExprAn
51e0: 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c  d(pParse->db, pL
51f0: 65 66 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20  eft, pRight);.  
5200: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 20 3d 20 73  }else{.    p = s
5210: 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28  qlite3ExprAlloc(
5220: 70 50 61 72 73 65 2d 3e 64 62 2c 20 6f 70 20 26  pParse->db, op &
5230: 20 54 4b 46 4c 47 5f 4d 41 53 4b 2c 20 70 54 6f   TKFLG_MASK, pTo
5240: 6b 65 6e 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c  ken, 1);.    sql
5250: 69 74 65 33 45 78 70 72 41 74 74 61 63 68 53 75  ite3ExprAttachSu
5260: 62 74 72 65 65 73 28 70 50 61 72 73 65 2d 3e 64  btrees(pParse->d
5270: 62 2c 20 70 2c 20 70 4c 65 66 74 2c 20 70 52 69  b, p, pLeft, pRi
5280: 67 68 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ght);.  }.  if( 
5290: 70 20 29 20 7b 0a 20 20 20 20 73 71 6c 69 74 65  p ) {.    sqlite
52a0: 33 45 78 70 72 43 68 65 63 6b 48 65 69 67 68 74  3ExprCheckHeight
52b0: 28 70 50 61 72 73 65 2c 20 70 2d 3e 6e 48 65 69  (pParse, p->nHei
52c0: 67 68 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ght);.  }.  retu
52d0: 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  rn p;.}../*.** A
52e0: 64 64 20 70 53 65 6c 65 63 74 20 74 6f 20 74 68  dd pSelect to th
52f0: 65 20 45 78 70 72 2e 78 2e 70 53 65 6c 65 63 74  e Expr.x.pSelect
5300: 20 66 69 65 6c 64 2e 20 20 4f 72 2c 20 69 66 20   field.  Or, if 
5310: 70 45 78 70 72 20 69 73 20 4e 55 4c 4c 20 28 64  pExpr is NULL (d
5320: 75 65 0a 2a 2a 20 64 6f 20 61 20 6d 65 6d 6f 72  ue.** do a memor
5330: 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69  y allocation fai
5340: 6c 75 72 65 29 20 74 68 65 6e 20 64 65 6c 65 74  lure) then delet
5350: 65 20 74 68 65 20 70 53 65 6c 65 63 74 20 6f 62  e the pSelect ob
5360: 6a 65 63 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ject..*/.void sq
5370: 6c 69 74 65 33 50 45 78 70 72 41 64 64 53 65 6c  lite3PExprAddSel
5380: 65 63 74 28 50 61 72 73 65 20 2a 70 50 61 72 73  ect(Parse *pPars
5390: 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  e, Expr *pExpr, 
53a0: 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29  Select *pSelect)
53b0: 7b 0a 20 20 69 66 28 20 70 45 78 70 72 20 29 7b  {.  if( pExpr ){
53c0: 0a 20 20 20 20 70 45 78 70 72 2d 3e 78 2e 70 53  .    pExpr->x.pS
53d0: 65 6c 65 63 74 20 3d 20 70 53 65 6c 65 63 74 3b  elect = pSelect;
53e0: 0a 20 20 20 20 45 78 70 72 53 65 74 50 72 6f 70  .    ExprSetProp
53f0: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78  erty(pExpr, EP_x
5400: 49 73 53 65 6c 65 63 74 7c 45 50 5f 53 75 62 71  IsSelect|EP_Subq
5410: 75 65 72 79 29 3b 0a 20 20 20 20 73 71 6c 69 74  uery);.    sqlit
5420: 65 33 45 78 70 72 53 65 74 48 65 69 67 68 74 41  e3ExprSetHeightA
5430: 6e 64 46 6c 61 67 73 28 70 50 61 72 73 65 2c 20  ndFlags(pParse, 
5440: 70 45 78 70 72 29 3b 0a 20 20 7d 65 6c 73 65 7b  pExpr);.  }else{
5450: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
5460: 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
5470: 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 73 71 6c  ailed );.    sql
5480: 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
5490: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 53 65  (pParse->db, pSe
54a0: 6c 65 63 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f  lect);.  }.}.../
54b0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72  *.** If the expr
54c0: 65 73 73 69 6f 6e 20 69 73 20 61 6c 77 61 79 73  ession is always
54d0: 20 65 69 74 68 65 72 20 54 52 55 45 20 6f 72 20   either TRUE or 
54e0: 46 41 4c 53 45 20 28 72 65 73 70 65 63 74 69 76  FALSE (respectiv
54f0: 65 6c 79 29 2c 0a 2a 2a 20 74 68 65 6e 20 72 65  ely),.** then re
5500: 74 75 72 6e 20 31 2e 20 20 49 66 20 6f 6e 65 20  turn 1.  If one 
5510: 63 61 6e 6e 6f 74 20 64 65 74 65 72 6d 69 6e 65  cannot determine
5520: 20 74 68 65 20 74 72 75 74 68 20 76 61 6c 75 65   the truth value
5530: 20 6f 66 20 74 68 65 0a 2a 2a 20 65 78 70 72 65   of the.** expre
5540: 73 73 69 6f 6e 20 61 74 20 63 6f 6d 70 69 6c 65  ssion at compile
5550: 2d 74 69 6d 65 20 72 65 74 75 72 6e 20 30 2e 0a  -time return 0..
5560: 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 6e  **.** This is an
5570: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20   optimization.  
5580: 49 66 20 69 73 20 4f 4b 20 74 6f 20 72 65 74 75  If is OK to retu
5590: 72 6e 20 30 20 68 65 72 65 20 65 76 65 6e 20 69  rn 0 here even i
55a0: 66 0a 2a 2a 20 74 68 65 20 65 78 70 72 65 73 73  f.** the express
55b0: 69 6f 6e 20 72 65 61 6c 6c 79 20 69 73 20 61 6c  ion really is al
55c0: 77 61 79 73 20 66 61 6c 73 65 20 6f 72 20 66 61  ways false or fa
55d0: 6c 73 65 20 28 61 20 66 61 6c 73 65 20 6e 65 67  lse (a false neg
55e0: 61 74 69 76 65 29 2e 0a 2a 2a 20 42 75 74 20 69  ative)..** But i
55f0: 74 20 69 73 20 61 20 62 75 67 20 74 6f 20 72 65  t is a bug to re
5600: 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 65 78  turn 1 if the ex
5610: 70 72 65 73 73 69 6f 6e 20 6d 69 67 68 74 20 68  pression might h
5620: 61 76 65 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a  ave different.**
5630: 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 73 20   boolean values 
5640: 69 6e 20 64 69 66 66 65 72 65 6e 74 20 63 69 72  in different cir
5650: 63 75 6d 73 74 61 6e 63 65 73 20 28 61 20 66 61  cumstances (a fa
5660: 6c 73 65 20 70 6f 73 69 74 69 76 65 2e 29 0a 2a  lse positive.).*
5670: 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 69  *.** Note that i
5680: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
5690: 20 69 73 20 70 61 72 74 20 6f 66 20 63 6f 6e 64   is part of cond
56a0: 69 74 69 6f 6e 61 6c 20 66 6f 72 20 61 0a 2a 2a  itional for a.**
56b0: 20 4c 45 46 54 20 4a 4f 49 4e 2c 20 74 68 65 6e   LEFT JOIN, then
56c0: 20 77 65 20 63 61 6e 6e 6f 74 20 64 65 74 65 72   we cannot deter
56d0: 6d 69 6e 65 20 61 74 20 63 6f 6d 70 69 6c 65 2d  mine at compile-
56e0: 74 69 6d 65 20 77 68 65 74 68 65 72 20 6f 72 20  time whether or 
56f0: 6e 6f 74 0a 2a 2a 20 69 73 20 69 74 20 74 72 75  not.** is it tru
5700: 65 20 6f 72 20 66 61 6c 73 65 2c 20 73 6f 20 61  e or false, so a
5710: 6c 77 61 79 73 20 72 65 74 75 72 6e 20 30 2e 0a  lways return 0..
5720: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78  */.static int ex
5730: 70 72 41 6c 77 61 79 73 54 72 75 65 28 45 78 70  prAlwaysTrue(Exp
5740: 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20 76 20 3d  r *p){.  int v =
5750: 20 30 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61   0;.  if( ExprHa
5760: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
5770: 46 72 6f 6d 4a 6f 69 6e 29 20 29 20 72 65 74 75  FromJoin) ) retu
5780: 72 6e 20 30 3b 0a 20 20 69 66 28 20 21 73 71 6c  rn 0;.  if( !sql
5790: 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65  ite3ExprIsIntege
57a0: 72 28 70 2c 20 26 76 29 20 29 20 72 65 74 75 72  r(p, &v) ) retur
57b0: 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 76 21  n 0;.  return v!
57c0: 3d 30 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74  =0;.}.static int
57d0: 20 65 78 70 72 41 6c 77 61 79 73 46 61 6c 73 65   exprAlwaysFalse
57e0: 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 6e 74  (Expr *p){.  int
57f0: 20 76 20 3d 20 30 3b 0a 20 20 69 66 28 20 45 78   v = 0;.  if( Ex
5800: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
5810: 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 20   EP_FromJoin) ) 
5820: 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
5830: 21 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e  !sqlite3ExprIsIn
5840: 74 65 67 65 72 28 70 2c 20 26 76 29 20 29 20 72  teger(p, &v) ) r
5850: 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75 72  eturn 0;.  retur
5860: 6e 20 76 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n v==0;.}../*.**
5870: 20 4a 6f 69 6e 20 74 77 6f 20 65 78 70 72 65 73   Join two expres
5880: 73 69 6f 6e 73 20 75 73 69 6e 67 20 61 6e 20 41  sions using an A
5890: 4e 44 20 6f 70 65 72 61 74 6f 72 2e 20 20 49 66  ND operator.  If
58a0: 20 65 69 74 68 65 72 20 65 78 70 72 65 73 73 69   either expressi
58b0: 6f 6e 20 69 73 0a 2a 2a 20 4e 55 4c 4c 2c 20 74  on is.** NULL, t
58c0: 68 65 6e 20 6a 75 73 74 20 72 65 74 75 72 6e 20  hen just return 
58d0: 74 68 65 20 6f 74 68 65 72 20 65 78 70 72 65 73  the other expres
58e0: 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6f  sion..**.** If o
58f0: 6e 65 20 73 69 64 65 20 6f 72 20 74 68 65 20 6f  ne side or the o
5900: 74 68 65 72 20 6f 66 20 74 68 65 20 41 4e 44 20  ther of the AND 
5910: 69 73 20 6b 6e 6f 77 6e 20 74 6f 20 62 65 20 66  is known to be f
5920: 61 6c 73 65 2c 20 74 68 65 6e 20 69 6e 73 74 65  alse, then inste
5930: 61 64 0a 2a 2a 20 6f 66 20 72 65 74 75 72 6e 69  ad.** of returni
5940: 6e 67 20 61 6e 20 41 4e 44 20 65 78 70 72 65 73  ng an AND expres
5950: 73 69 6f 6e 2c 20 6a 75 73 74 20 72 65 74 75 72  sion, just retur
5960: 6e 20 61 20 63 6f 6e 73 74 61 6e 74 20 65 78 70  n a constant exp
5970: 72 65 73 73 69 6f 6e 20 77 69 74 68 0a 2a 2a 20  ression with.** 
5980: 61 20 76 61 6c 75 65 20 6f 66 20 66 61 6c 73 65  a value of false
5990: 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74  ..*/.Expr *sqlit
59a0: 65 33 45 78 70 72 41 6e 64 28 73 71 6c 69 74 65  e3ExprAnd(sqlite
59b0: 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 4c 65  3 *db, Expr *pLe
59c0: 66 74 2c 20 45 78 70 72 20 2a 70 52 69 67 68 74  ft, Expr *pRight
59d0: 29 7b 0a 20 20 69 66 28 20 70 4c 65 66 74 3d 3d  ){.  if( pLeft==
59e0: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
59f0: 70 52 69 67 68 74 3b 0a 20 20 7d 65 6c 73 65 20  pRight;.  }else 
5a00: 69 66 28 20 70 52 69 67 68 74 3d 3d 30 20 29 7b  if( pRight==0 ){
5a10: 0a 20 20 20 20 72 65 74 75 72 6e 20 70 4c 65 66  .    return pLef
5a20: 74 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65  t;.  }else if( e
5a30: 78 70 72 41 6c 77 61 79 73 46 61 6c 73 65 28 70  xprAlwaysFalse(p
5a40: 4c 65 66 74 29 20 7c 7c 20 65 78 70 72 41 6c 77  Left) || exprAlw
5a50: 61 79 73 46 61 6c 73 65 28 70 52 69 67 68 74 29  aysFalse(pRight)
5a60: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
5a70: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 4c  xprDelete(db, pL
5a80: 65 66 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  eft);.    sqlite
5a90: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
5aa0: 70 52 69 67 68 74 29 3b 0a 20 20 20 20 72 65 74  pRight);.    ret
5ab0: 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72 41  urn sqlite3ExprA
5ac0: 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f 49 4e 54 45  lloc(db, TK_INTE
5ad0: 47 45 52 2c 20 26 73 71 6c 69 74 65 33 49 6e 74  GER, &sqlite3Int
5ae0: 54 6f 6b 65 6e 73 5b 30 5d 2c 20 30 29 3b 0a 20  Tokens[0], 0);. 
5af0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 45 78 70 72   }else{.    Expr
5b00: 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33   *pNew = sqlite3
5b10: 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b  ExprAlloc(db, TK
5b20: 5f 41 4e 44 2c 20 30 2c 20 30 29 3b 0a 20 20 20  _AND, 0, 0);.   
5b30: 20 73 71 6c 69 74 65 33 45 78 70 72 41 74 74 61   sqlite3ExprAtta
5b40: 63 68 53 75 62 74 72 65 65 73 28 64 62 2c 20 70  chSubtrees(db, p
5b50: 4e 65 77 2c 20 70 4c 65 66 74 2c 20 70 52 69 67  New, pLeft, pRig
5b60: 68 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ht);.    return 
5b70: 70 4e 65 77 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  pNew;.  }.}../*.
5b80: 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20 6e  ** Construct a n
5b90: 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f  ew expression no
5ba0: 64 65 20 66 6f 72 20 61 20 66 75 6e 63 74 69 6f  de for a functio
5bb0: 6e 20 77 69 74 68 20 6d 75 6c 74 69 70 6c 65 0a  n with multiple.
5bc0: 2a 2a 20 61 72 67 75 6d 65 6e 74 73 2e 0a 2a 2f  ** arguments..*/
5bd0: 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78  .Expr *sqlite3Ex
5be0: 70 72 46 75 6e 63 74 69 6f 6e 28 50 61 72 73 65  prFunction(Parse
5bf0: 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 4c 69   *pParse, ExprLi
5c00: 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e  st *pList, Token
5c10: 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 45 78 70   *pToken){.  Exp
5c20: 72 20 2a 70 4e 65 77 3b 0a 20 20 73 71 6c 69 74  r *pNew;.  sqlit
5c30: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
5c40: 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70  >db;.  assert( p
5c50: 54 6f 6b 65 6e 20 29 3b 0a 20 20 70 4e 65 77 20  Token );.  pNew 
5c60: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c  = sqlite3ExprAll
5c70: 6f 63 28 64 62 2c 20 54 4b 5f 46 55 4e 43 54 49  oc(db, TK_FUNCTI
5c80: 4f 4e 2c 20 70 54 6f 6b 65 6e 2c 20 31 29 3b 0a  ON, pToken, 1);.
5c90: 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b    if( pNew==0 ){
5ca0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
5cb0: 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
5cc0: 4c 69 73 74 29 3b 20 2f 2a 20 41 76 6f 69 64 20  List); /* Avoid 
5cd0: 6d 65 6d 6f 72 79 20 6c 65 61 6b 20 77 68 65 6e  memory leak when
5ce0: 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20 2a 2f   malloc fails */
5cf0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
5d00: 20 7d 0a 20 20 70 4e 65 77 2d 3e 78 2e 70 4c 69   }.  pNew->x.pLi
5d10: 73 74 20 3d 20 70 4c 69 73 74 3b 0a 20 20 61 73  st = pList;.  as
5d20: 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
5d30: 6f 70 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f  operty(pNew, EP_
5d40: 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20  xIsSelect) );.  
5d50: 73 71 6c 69 74 65 33 45 78 70 72 53 65 74 48 65  sqlite3ExprSetHe
5d60: 69 67 68 74 41 6e 64 46 6c 61 67 73 28 70 50 61  ightAndFlags(pPa
5d70: 72 73 65 2c 20 70 4e 65 77 29 3b 0a 20 20 72 65  rse, pNew);.  re
5d80: 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a  turn pNew;.}../*
5d90: 0a 2a 2a 20 41 73 73 69 67 6e 20 61 20 76 61 72  .** Assign a var
5da0: 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 74 6f 20  iable number to 
5db0: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68  an expression th
5dc0: 61 74 20 65 6e 63 6f 64 65 73 20 61 20 77 69 6c  at encodes a wil
5dd0: 64 63 61 72 64 0a 2a 2a 20 69 6e 20 74 68 65 20  dcard.** in the 
5de0: 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20 73 74 61  original SQL sta
5df0: 74 65 6d 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20  tement.  .**.** 
5e00: 57 69 6c 64 63 61 72 64 73 20 63 6f 6e 73 69 73  Wildcards consis
5e10: 74 69 6e 67 20 6f 66 20 61 20 73 69 6e 67 6c 65  ting of a single
5e20: 20 22 3f 22 20 61 72 65 20 61 73 73 69 67 6e 65   "?" are assigne
5e30: 64 20 74 68 65 20 6e 65 78 74 20 73 65 71 75 65  d the next seque
5e40: 6e 74 69 61 6c 0a 2a 2a 20 76 61 72 69 61 62 6c  ntial.** variabl
5e50: 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20  e number..**.** 
5e60: 57 69 6c 64 63 61 72 64 73 20 6f 66 20 74 68 65  Wildcards of the
5e70: 20 66 6f 72 6d 20 22 3f 6e 6e 6e 22 20 61 72 65   form "?nnn" are
5e80: 20 61 73 73 69 67 6e 65 64 20 74 68 65 20 6e 75   assigned the nu
5e90: 6d 62 65 72 20 22 6e 6e 6e 22 2e 20 20 57 65 20  mber "nnn".  We 
5ea0: 6d 61 6b 65 0a 2a 2a 20 73 75 72 65 20 22 6e 6e  make.** sure "nn
5eb0: 6e 22 20 69 73 20 6e 6f 74 20 74 6f 6f 20 62 65  n" is not too be
5ec0: 20 74 6f 20 61 76 6f 69 64 20 61 20 64 65 6e 69   to avoid a deni
5ed0: 61 6c 20 6f 66 20 73 65 72 76 69 63 65 20 61 74  al of service at
5ee0: 74 61 63 6b 20 77 68 65 6e 0a 2a 2a 20 74 68 65  tack when.** the
5ef0: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 63   SQL statement c
5f00: 6f 6d 65 73 20 66 72 6f 6d 20 61 6e 20 65 78 74  omes from an ext
5f10: 65 72 6e 61 6c 20 73 6f 75 72 63 65 2e 0a 2a 2a  ernal source..**
5f20: 0a 2a 2a 20 57 69 6c 64 63 61 72 64 73 20 6f 66  .** Wildcards of
5f30: 20 74 68 65 20 66 6f 72 6d 20 22 3a 61 61 61 22   the form ":aaa"
5f40: 2c 20 22 40 61 61 61 22 2c 20 6f 72 20 22 24 61  , "@aaa", or "$a
5f50: 61 61 22 20 61 72 65 20 61 73 73 69 67 6e 65 64  aa" are assigned
5f60: 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72   the same number
5f70: 0a 2a 2a 20 61 73 20 74 68 65 20 70 72 65 76 69  .** as the previ
5f80: 6f 75 73 20 69 6e 73 74 61 6e 63 65 20 6f 66 20  ous instance of 
5f90: 74 68 65 20 73 61 6d 65 20 77 69 6c 64 63 61 72  the same wildcar
5fa0: 64 2e 20 20 4f 72 20 69 66 20 74 68 69 73 20 69  d.  Or if this i
5fb0: 73 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 69  s the first.** i
5fc0: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 77  nstance of the w
5fd0: 69 6c 64 63 61 72 64 2c 20 74 68 65 20 6e 65 78  ildcard, the nex
5fe0: 74 20 73 65 71 75 65 6e 74 69 61 6c 20 76 61 72  t sequential var
5ff0: 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 69 73 0a  iable number is.
6000: 2a 2a 20 61 73 73 69 67 6e 65 64 2e 0a 2a 2f 0a  ** assigned..*/.
6010: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
6020: 41 73 73 69 67 6e 56 61 72 4e 75 6d 62 65 72 28  AssignVarNumber(
6030: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
6040: 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 73  xpr *pExpr){.  s
6050: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
6060: 72 73 65 2d 3e 64 62 3b 0a 20 20 63 6f 6e 73 74  rse->db;.  const
6070: 20 63 68 61 72 20 2a 7a 3b 0a 0a 20 20 69 66 28   char *z;..  if(
6080: 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75   pExpr==0 ) retu
6090: 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 21 45  rn;.  assert( !E
60a0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
60b0: 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75  Expr, EP_IntValu
60c0: 65 7c 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f  e|EP_Reduced|EP_
60d0: 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 3b 0a 20 20  TokenOnly) );.  
60e0: 7a 20 3d 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  z = pExpr->u.zTo
60f0: 6b 65 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 7a  ken;.  assert( z
6100: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
6110: 20 7a 5b 30 5d 21 3d 30 20 29 3b 0a 20 20 69 66   z[0]!=0 );.  if
6120: 28 20 7a 5b 31 5d 3d 3d 30 20 29 7b 0a 20 20 20  ( z[1]==0 ){.   
6130: 20 2f 2a 20 57 69 6c 64 63 61 72 64 20 6f 66 20   /* Wildcard of 
6140: 74 68 65 20 66 6f 72 6d 20 22 3f 22 2e 20 20 41  the form "?".  A
6150: 73 73 69 67 6e 20 74 68 65 20 6e 65 78 74 20 76  ssign the next v
6160: 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 2a  ariable number *
6170: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 7a 5b  /.    assert( z[
6180: 30 5d 3d 3d 27 3f 27 20 29 3b 0a 20 20 20 20 70  0]=='?' );.    p
6190: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20  Expr->iColumn = 
61a0: 28 79 6e 56 61 72 29 28 2b 2b 70 50 61 72 73 65  (ynVar)(++pParse
61b0: 2d 3e 6e 56 61 72 29 3b 0a 20 20 7d 65 6c 73 65  ->nVar);.  }else
61c0: 7b 0a 20 20 20 20 79 6e 56 61 72 20 78 20 3d 20  {.    ynVar x = 
61d0: 30 3b 0a 20 20 20 20 75 33 32 20 6e 20 3d 20 73  0;.    u32 n = s
61e0: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
61f0: 29 3b 0a 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d  );.    if( z[0]=
6200: 3d 27 3f 27 20 29 7b 0a 20 20 20 20 20 20 2f 2a  ='?' ){.      /*
6210: 20 57 69 6c 64 63 61 72 64 20 6f 66 20 74 68 65   Wildcard of the
6220: 20 66 6f 72 6d 20 22 3f 6e 6e 6e 22 2e 20 20 43   form "?nnn".  C
6230: 6f 6e 76 65 72 74 20 22 6e 6e 6e 22 20 74 6f 20  onvert "nnn" to 
6240: 61 6e 20 69 6e 74 65 67 65 72 20 61 6e 64 0a 20  an integer and. 
6250: 20 20 20 20 20 2a 2a 20 75 73 65 20 69 74 20 61       ** use it a
6260: 73 20 74 68 65 20 76 61 72 69 61 62 6c 65 20 6e  s the variable n
6270: 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20 20 20 69  umber */.      i
6280: 36 34 20 69 3b 0a 20 20 20 20 20 20 69 6e 74 20  64 i;.      int 
6290: 62 4f 6b 20 3d 20 30 3d 3d 73 71 6c 69 74 65 33  bOk = 0==sqlite3
62a0: 41 74 6f 69 36 34 28 26 7a 5b 31 5d 2c 20 26 69  Atoi64(&z[1], &i
62b0: 2c 20 6e 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54  , n-1, SQLITE_UT
62c0: 46 38 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72  F8);.      pExpr
62d0: 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 78 20 3d 20  ->iColumn = x = 
62e0: 28 79 6e 56 61 72 29 69 3b 0a 20 20 20 20 20 20  (ynVar)i;.      
62f0: 74 65 73 74 63 61 73 65 28 20 69 3d 3d 30 20 29  testcase( i==0 )
6300: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
6310: 28 20 69 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  ( i==1 );.      
6320: 74 65 73 74 63 61 73 65 28 20 69 3d 3d 64 62 2d  testcase( i==db-
6330: 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  >aLimit[SQLITE_L
6340: 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55  IMIT_VARIABLE_NU
6350: 4d 42 45 52 5d 2d 31 20 29 3b 0a 20 20 20 20 20  MBER]-1 );.     
6360: 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d 64 62   testcase( i==db
6370: 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ->aLimit[SQLITE_
6380: 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e  LIMIT_VARIABLE_N
6390: 55 4d 42 45 52 5d 20 29 3b 0a 20 20 20 20 20 20  UMBER] );.      
63a0: 69 66 28 20 62 4f 6b 3d 3d 30 20 7c 7c 20 69 3c  if( bOk==0 || i<
63b0: 31 20 7c 7c 20 69 3e 64 62 2d 3e 61 4c 69 6d 69  1 || i>db->aLimi
63c0: 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56  t[SQLITE_LIMIT_V
63d0: 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 20  ARIABLE_NUMBER] 
63e0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
63f0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
6400: 65 2c 20 22 76 61 72 69 61 62 6c 65 20 6e 75 6d  e, "variable num
6410: 62 65 72 20 6d 75 73 74 20 62 65 20 62 65 74 77  ber must be betw
6420: 65 65 6e 20 3f 31 20 61 6e 64 20 3f 25 64 22 2c  een ?1 and ?%d",
6430: 0a 20 20 20 20 20 20 20 20 20 20 20 20 64 62 2d  .            db-
6440: 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  >aLimit[SQLITE_L
6450: 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55  IMIT_VARIABLE_NU
6460: 4d 42 45 52 5d 29 3b 0a 20 20 20 20 20 20 20 20  MBER]);.        
6470: 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  x = 0;.      }. 
6480: 20 20 20 20 20 69 66 28 20 69 3e 70 50 61 72 73       if( i>pPars
6490: 65 2d 3e 6e 56 61 72 20 29 7b 0a 20 20 20 20 20  e->nVar ){.     
64a0: 20 20 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 20     pParse->nVar 
64b0: 3d 20 28 69 6e 74 29 69 3b 0a 20 20 20 20 20 20  = (int)i;.      
64c0: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
64d0: 20 20 20 2f 2a 20 57 69 6c 64 63 61 72 64 73 20     /* Wildcards 
64e0: 6c 69 6b 65 20 22 3a 61 61 61 22 2c 20 22 24 61  like ":aaa", "$a
64f0: 61 61 22 20 6f 72 20 22 40 61 61 61 22 2e 20 20  aa" or "@aaa".  
6500: 52 65 75 73 65 20 74 68 65 20 73 61 6d 65 20 76  Reuse the same v
6510: 61 72 69 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a  ariable.      **
6520: 20 6e 75 6d 62 65 72 20 61 73 20 74 68 65 20 70   number as the p
6530: 72 69 6f 72 20 61 70 70 65 61 72 61 6e 63 65 20  rior appearance 
6540: 6f 66 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65  of the same name
6550: 2c 20 6f 72 20 69 66 20 74 68 65 20 6e 61 6d 65  , or if the name
6560: 0a 20 20 20 20 20 20 2a 2a 20 68 61 73 20 6e 65  .      ** has ne
6570: 76 65 72 20 61 70 70 65 61 72 65 64 20 62 65 66  ver appeared bef
6580: 6f 72 65 2c 20 72 65 75 73 65 20 74 68 65 20 73  ore, reuse the s
6590: 61 6d 65 20 76 61 72 69 61 62 6c 65 20 6e 75 6d  ame variable num
65a0: 62 65 72 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ber.      */.   
65b0: 20 20 20 79 6e 56 61 72 20 69 3b 0a 20 20 20 20     ynVar i;.    
65c0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61    for(i=0; i<pPa
65d0: 72 73 65 2d 3e 6e 7a 56 61 72 3b 20 69 2b 2b 29  rse->nzVar; i++)
65e0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  {.        if( pP
65f0: 61 72 73 65 2d 3e 61 7a 56 61 72 5b 69 5d 20 26  arse->azVar[i] &
6600: 26 20 73 74 72 63 6d 70 28 70 50 61 72 73 65 2d  & strcmp(pParse-
6610: 3e 61 7a 56 61 72 5b 69 5d 2c 7a 29 3d 3d 30 20  >azVar[i],z)==0 
6620: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 45 78  ){.          pEx
6630: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 78 20  pr->iColumn = x 
6640: 3d 20 28 79 6e 56 61 72 29 69 2b 31 3b 0a 20 20  = (ynVar)i+1;.  
6650: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
6660: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
6670: 0a 20 20 20 20 20 20 69 66 28 20 78 3d 3d 30 20  .      if( x==0 
6680: 29 20 78 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f  ) x = pExpr->iCo
6690: 6c 75 6d 6e 20 3d 20 28 79 6e 56 61 72 29 28 2b  lumn = (ynVar)(+
66a0: 2b 70 50 61 72 73 65 2d 3e 6e 56 61 72 29 3b 0a  +pParse->nVar);.
66b0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 78 3e      }.    if( x>
66c0: 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 78  0 ){.      if( x
66d0: 3e 70 50 61 72 73 65 2d 3e 6e 7a 56 61 72 20 29  >pParse->nzVar )
66e0: 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  {.        char *
66f0: 2a 61 3b 0a 20 20 20 20 20 20 20 20 61 20 3d 20  *a;.        a = 
6700: 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63  sqlite3DbRealloc
6710: 28 64 62 2c 20 70 50 61 72 73 65 2d 3e 61 7a 56  (db, pParse->azV
6720: 61 72 2c 20 78 2a 73 69 7a 65 6f 66 28 61 5b 30  ar, x*sizeof(a[0
6730: 5d 29 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ]));.        if(
6740: 20 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20   a==0 ){.       
6750: 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d     assert( db->m
6760: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 20 2f  allocFailed ); /
6770: 2a 20 45 72 72 6f 72 20 72 65 70 6f 72 74 65 64  * Error reported
6780: 20 74 68 72 6f 75 67 68 20 6d 61 6c 6c 6f 63 46   through mallocF
6790: 61 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20 20  ailed */.       
67a0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20     return;.     
67b0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50 61     }.        pPa
67c0: 72 73 65 2d 3e 61 7a 56 61 72 20 3d 20 61 3b 0a  rse->azVar = a;.
67d0: 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26          memset(&
67e0: 61 5b 70 50 61 72 73 65 2d 3e 6e 7a 56 61 72 5d  a[pParse->nzVar]
67f0: 2c 20 30 2c 20 28 78 2d 70 50 61 72 73 65 2d 3e  , 0, (x-pParse->
6800: 6e 7a 56 61 72 29 2a 73 69 7a 65 6f 66 28 61 5b  nzVar)*sizeof(a[
6810: 30 5d 29 29 3b 0a 20 20 20 20 20 20 20 20 70 50  0]));.        pP
6820: 61 72 73 65 2d 3e 6e 7a 56 61 72 20 3d 20 78 3b  arse->nzVar = x;
6830: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
6840: 66 28 20 7a 5b 30 5d 21 3d 27 3f 27 20 7c 7c 20  f( z[0]!='?' || 
6850: 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 5b 78 2d  pParse->azVar[x-
6860: 31 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  1]==0 ){.       
6870: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
6880: 62 2c 20 70 50 61 72 73 65 2d 3e 61 7a 56 61 72  b, pParse->azVar
6890: 5b 78 2d 31 5d 29 3b 0a 20 20 20 20 20 20 20 20  [x-1]);.        
68a0: 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 5b 78 2d  pParse->azVar[x-
68b0: 31 5d 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  1] = sqlite3DbSt
68c0: 72 4e 44 75 70 28 64 62 2c 20 7a 2c 20 6e 29 3b  rNDup(db, z, n);
68d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
68e0: 20 7d 20 0a 20 20 69 66 28 20 21 70 50 61 72 73   } .  if( !pPars
68f0: 65 2d 3e 6e 45 72 72 20 26 26 20 70 50 61 72 73  e->nErr && pPars
6900: 65 2d 3e 6e 56 61 72 3e 64 62 2d 3e 61 4c 69 6d  e->nVar>db->aLim
6910: 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
6920: 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d  VARIABLE_NUMBER]
6930: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
6940: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
6950: 22 74 6f 6f 20 6d 61 6e 79 20 53 51 4c 20 76 61  "too many SQL va
6960: 72 69 61 62 6c 65 73 22 29 3b 0a 20 20 7d 0a 7d  riables");.  }.}
6970: 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 75 72 73 69 76  ../*.** Recursiv
6980: 65 6c 79 20 64 65 6c 65 74 65 20 61 6e 20 65 78  ely delete an ex
6990: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 0a 2a  pression tree..*
69a0: 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f  /.static SQLITE_
69b0: 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69 64 20 73 71  NOINLINE void sq
69c0: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 4e  lite3ExprDeleteN
69d0: 4e 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45  N(sqlite3 *db, E
69e0: 78 70 72 20 2a 70 29 7b 0a 20 20 61 73 73 65 72  xpr *p){.  asser
69f0: 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 2f 2a 20  t( p!=0 );.  /* 
6a00: 53 61 6e 69 74 79 20 63 68 65 63 6b 3a 20 41 73  Sanity check: As
6a10: 73 65 72 74 20 74 68 61 74 20 74 68 65 20 49 6e  sert that the In
6a20: 74 56 61 6c 75 65 20 69 73 20 6e 6f 6e 2d 6e 65  tValue is non-ne
6a30: 67 61 74 69 76 65 20 69 66 20 69 74 20 65 78 69  gative if it exi
6a40: 73 74 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  sts */.  assert(
6a50: 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
6a60: 79 28 70 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  y(p, EP_IntValue
6a70: 29 20 7c 7c 20 70 2d 3e 75 2e 69 56 61 6c 75 65  ) || p->u.iValue
6a80: 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 21 45 78  >=0 );.  if( !Ex
6a90: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
6aa0: 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29   EP_TokenOnly) )
6ab0: 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 45 78 70  {.    /* The Exp
6ac0: 72 2e 78 20 75 6e 69 6f 6e 20 69 73 20 6e 65 76  r.x union is nev
6ad0: 65 72 20 75 73 65 64 20 61 74 20 74 68 65 20 73  er used at the s
6ae0: 61 6d 65 20 74 69 6d 65 20 61 73 20 45 78 70 72  ame time as Expr
6af0: 2e 70 52 69 67 68 74 20 2a 2f 0a 20 20 20 20 61  .pRight */.    a
6b00: 73 73 65 72 74 28 20 70 2d 3e 78 2e 70 4c 69 73  ssert( p->x.pLis
6b10: 74 3d 3d 30 20 7c 7c 20 70 2d 3e 70 52 69 67 68  t==0 || p->pRigh
6b20: 74 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  t==0 );.    if( 
6b30: 70 2d 3e 6f 70 21 3d 54 4b 5f 53 45 4c 45 43 54  p->op!=TK_SELECT
6b40: 5f 43 4f 4c 55 4d 4e 20 29 20 73 71 6c 69 74 65  _COLUMN ) sqlite
6b50: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
6b60: 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 73  p->pLeft);.    s
6b70: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
6b80: 28 64 62 2c 20 70 2d 3e 70 52 69 67 68 74 29 3b  (db, p->pRight);
6b90: 0a 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73  .    if( ExprHas
6ba0: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 4d  Property(p, EP_M
6bb0: 65 6d 54 6f 6b 65 6e 29 20 29 20 73 71 6c 69 74  emToken) ) sqlit
6bc0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
6bd0: 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 69  u.zToken);.    i
6be0: 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
6bf0: 74 79 28 70 2c 20 45 50 5f 78 49 73 53 65 6c 65  ty(p, EP_xIsSele
6c00: 63 74 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ct) ){.      sql
6c10: 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
6c20: 28 64 62 2c 20 70 2d 3e 78 2e 70 53 65 6c 65 63  (db, p->x.pSelec
6c30: 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  t);.    }else{. 
6c40: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
6c50: 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
6c60: 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20  ->x.pList);.    
6c70: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 21 45 78 70  }.  }.  if( !Exp
6c80: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
6c90: 45 50 5f 53 74 61 74 69 63 29 20 29 7b 0a 20 20  EP_Static) ){.  
6ca0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
6cb0: 64 62 2c 20 70 29 3b 0a 20 20 7d 0a 7d 0a 76 6f  db, p);.  }.}.vo
6cc0: 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  id sqlite3ExprDe
6cd0: 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62  lete(sqlite3 *db
6ce0: 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66  , Expr *p){.  if
6cf0: 28 20 70 20 29 20 73 71 6c 69 74 65 33 45 78 70  ( p ) sqlite3Exp
6d00: 72 44 65 6c 65 74 65 4e 4e 28 64 62 2c 20 70 29  rDeleteNN(db, p)
6d10: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
6d20: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
6d30: 62 79 74 65 73 20 61 6c 6c 6f 63 61 74 65 64 20  bytes allocated 
6d40: 66 6f 72 20 74 68 65 20 65 78 70 72 65 73 73 69  for the expressi
6d50: 6f 6e 20 73 74 72 75 63 74 75 72 65 20 0a 2a 2a  on structure .**
6d60: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66   passed as the f
6d70: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 54  irst argument. T
6d80: 68 69 73 20 69 73 20 61 6c 77 61 79 73 20 6f 6e  his is always on
6d90: 65 20 6f 66 20 45 58 50 52 5f 46 55 4c 4c 53 49  e of EXPR_FULLSI
6da0: 5a 45 2c 0a 2a 2a 20 45 58 50 52 5f 52 45 44 55  ZE,.** EXPR_REDU
6db0: 43 45 44 53 49 5a 45 20 6f 72 20 45 58 50 52 5f  CEDSIZE or EXPR_
6dc0: 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 2e 0a 2a  TOKENONLYSIZE..*
6dd0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70  /.static int exp
6de0: 72 53 74 72 75 63 74 53 69 7a 65 28 45 78 70 72  rStructSize(Expr
6df0: 20 2a 70 29 7b 0a 20 20 69 66 28 20 45 78 70 72   *p){.  if( Expr
6e00: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
6e10: 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 20 72  P_TokenOnly) ) r
6e20: 65 74 75 72 6e 20 45 58 50 52 5f 54 4f 4b 45 4e  eturn EXPR_TOKEN
6e30: 4f 4e 4c 59 53 49 5a 45 3b 0a 20 20 69 66 28 20  ONLYSIZE;.  if( 
6e40: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
6e50: 70 2c 20 45 50 5f 52 65 64 75 63 65 64 29 20 29  p, EP_Reduced) )
6e60: 20 72 65 74 75 72 6e 20 45 58 50 52 5f 52 45 44   return EXPR_RED
6e70: 55 43 45 44 53 49 5a 45 3b 0a 20 20 72 65 74 75  UCEDSIZE;.  retu
6e80: 72 6e 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45  rn EXPR_FULLSIZE
6e90: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 64  ;.}../*.** The d
6ea0: 75 70 65 64 45 78 70 72 2a 53 69 7a 65 28 29 20  upedExpr*Size() 
6eb0: 72 6f 75 74 69 6e 65 73 20 65 61 63 68 20 72 65  routines each re
6ec0: 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
6ed0: 6f 66 20 62 79 74 65 73 20 72 65 71 75 69 72 65  of bytes require
6ee0: 64 0a 2a 2a 20 74 6f 20 73 74 6f 72 65 20 61 20  d.** to store a 
6ef0: 63 6f 70 79 20 6f 66 20 61 6e 20 65 78 70 72 65  copy of an expre
6f00: 73 73 69 6f 6e 20 6f 72 20 65 78 70 72 65 73 73  ssion or express
6f10: 69 6f 6e 20 74 72 65 65 2e 20 20 54 68 65 79 20  ion tree.  They 
6f20: 64 69 66 66 65 72 20 69 6e 0a 2a 2a 20 68 6f 77  differ in.** how
6f30: 20 6d 75 63 68 20 6f 66 20 74 68 65 20 74 72 65   much of the tre
6f40: 65 20 69 73 20 6d 65 61 73 75 72 65 64 2e 0a 2a  e is measured..*
6f50: 2a 0a 2a 2a 20 20 20 20 20 64 75 70 65 64 45 78  *.**     dupedEx
6f60: 70 72 53 74 72 75 63 74 53 69 7a 65 28 29 20 20  prStructSize()  
6f70: 20 20 20 53 69 7a 65 20 6f 66 20 6f 6e 6c 79 20     Size of only 
6f80: 74 68 65 20 45 78 70 72 20 73 74 72 75 63 74 75  the Expr structu
6f90: 72 65 20 0a 2a 2a 20 20 20 20 20 64 75 70 65 64  re .**     duped
6fa0: 45 78 70 72 4e 6f 64 65 53 69 7a 65 28 29 20 20  ExprNodeSize()  
6fb0: 20 20 20 20 20 53 69 7a 65 20 6f 66 20 45 78 70       Size of Exp
6fc0: 72 20 2b 20 73 70 61 63 65 20 66 6f 72 20 74 6f  r + space for to
6fd0: 6b 65 6e 0a 2a 2a 20 20 20 20 20 64 75 70 65 64  ken.**     duped
6fe0: 45 78 70 72 53 69 7a 65 28 29 20 20 20 20 20 20  ExprSize()      
6ff0: 20 20 20 20 20 45 78 70 72 20 2b 20 74 6f 6b 65       Expr + toke
7000: 6e 20 2b 20 73 75 62 74 72 65 65 20 63 6f 6d 70  n + subtree comp
7010: 6f 6e 65 6e 74 73 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a  onents.**.******
7020: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7030: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7040: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7050: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7060: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20  *****.**.** The 
7070: 64 75 70 65 64 45 78 70 72 53 74 72 75 63 74 53  dupedExprStructS
7080: 69 7a 65 28 29 20 66 75 6e 63 74 69 6f 6e 20 72  ize() function r
7090: 65 74 75 72 6e 73 20 74 77 6f 20 76 61 6c 75 65  eturns two value
70a0: 73 20 4f 52 2d 65 64 20 74 6f 67 65 74 68 65 72  s OR-ed together
70b0: 3a 20 20 0a 2a 2a 20 28 31 29 20 74 68 65 20 73  :  .** (1) the s
70c0: 70 61 63 65 20 72 65 71 75 69 72 65 64 20 66 6f  pace required fo
70d0: 72 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  r a copy of the 
70e0: 45 78 70 72 20 73 74 72 75 63 74 75 72 65 20 6f  Expr structure o
70f0: 6e 6c 79 20 61 6e 64 20 0a 2a 2a 20 28 32 29 20  nly and .** (2) 
7100: 74 68 65 20 45 50 5f 78 78 78 20 66 6c 61 67 73  the EP_xxx flags
7110: 20 74 68 61 74 20 69 6e 64 69 63 61 74 65 20 77   that indicate w
7120: 68 61 74 20 74 68 65 20 73 74 72 75 63 74 75 72  hat the structur
7130: 65 20 73 69 7a 65 20 73 68 6f 75 6c 64 20 62 65  e size should be
7140: 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20  ..** The return 
7150: 76 61 6c 75 65 73 20 69 73 20 61 6c 77 61 79 73  values is always
7160: 20 6f 6e 65 20 6f 66 3a 0a 2a 2a 0a 2a 2a 20 20   one of:.**.**  
7170: 20 20 20 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a      EXPR_FULLSIZ
7180: 45 0a 2a 2a 20 20 20 20 20 20 45 58 50 52 5f 52  E.**      EXPR_R
7190: 45 44 55 43 45 44 53 49 5a 45 20 20 20 7c 20 45  EDUCEDSIZE   | E
71a0: 50 5f 52 65 64 75 63 65 64 0a 2a 2a 20 20 20 20  P_Reduced.**    
71b0: 20 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59    EXPR_TOKENONLY
71c0: 53 49 5a 45 20 7c 20 45 50 5f 54 6f 6b 65 6e 4f  SIZE | EP_TokenO
71d0: 6e 6c 79 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 69  nly.**.** The si
71e0: 7a 65 20 6f 66 20 74 68 65 20 73 74 72 75 63 74  ze of the struct
71f0: 75 72 65 20 63 61 6e 20 62 65 20 66 6f 75 6e 64  ure can be found
7200: 20 62 79 20 6d 61 73 6b 69 6e 67 20 74 68 65 20   by masking the 
7210: 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20  return value.** 
7220: 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  of this routine 
7230: 77 69 74 68 20 30 78 66 66 66 2e 20 20 54 68 65  with 0xfff.  The
7240: 20 66 6c 61 67 73 20 63 61 6e 20 62 65 20 66 6f   flags can be fo
7250: 75 6e 64 20 62 79 20 6d 61 73 6b 69 6e 67 20 74  und by masking t
7260: 68 65 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c  he.** return val
7270: 75 65 20 77 69 74 68 20 45 50 5f 52 65 64 75 63  ue with EP_Reduc
7280: 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 2e  ed|EP_TokenOnly.
7290: 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74  .**.** Note that
72a0: 20 77 69 74 68 20 66 6c 61 67 73 3d 3d 45 58 50   with flags==EXP
72b0: 52 44 55 50 5f 52 45 44 55 43 45 2c 20 74 68 69  RDUP_REDUCE, thi
72c0: 73 20 72 6f 75 74 69 6e 65 73 20 77 6f 72 6b 73  s routines works
72d0: 20 6f 6e 20 66 75 6c 6c 2d 73 69 7a 65 0a 2a 2a   on full-size.**
72e0: 20 28 75 6e 72 65 64 75 63 65 64 29 20 45 78 70   (unreduced) Exp
72f0: 72 20 6f 62 6a 65 63 74 73 20 61 73 20 74 68 65  r objects as the
7300: 79 20 6f 72 20 6f 72 69 67 69 6e 61 6c 6c 79 20  y or originally 
7310: 63 6f 6e 73 74 72 75 63 74 65 64 20 62 79 20 74  constructed by t
7320: 68 65 20 70 61 72 73 65 72 2e 0a 2a 2a 20 44 75  he parser..** Du
7330: 72 69 6e 67 20 65 78 70 72 65 73 73 69 6f 6e 20  ring expression 
7340: 61 6e 61 6c 79 73 69 73 2c 20 65 78 74 72 61 20  analysis, extra 
7350: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 63  information is c
7360: 6f 6d 70 75 74 65 64 20 61 6e 64 20 6d 6f 76 65  omputed and move
7370: 64 20 69 6e 74 6f 0a 2a 2a 20 6c 61 74 65 72 20  d into.** later 
7380: 70 61 72 74 73 20 6f 66 20 74 65 68 20 45 78 70  parts of teh Exp
7390: 72 20 6f 62 6a 65 63 74 20 61 6e 64 20 74 68 61  r object and tha
73a0: 74 20 65 78 74 72 61 20 69 6e 66 6f 72 6d 61 74  t extra informat
73b0: 69 6f 6e 20 6d 69 67 68 74 20 67 65 74 20 63 68  ion might get ch
73c0: 6f 70 70 65 64 0a 2a 2a 20 6f 66 66 20 69 66 20  opped.** off if 
73d0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
73e0: 73 20 72 65 64 75 63 65 64 2e 20 20 4e 6f 74 65  s reduced.  Note
73f0: 20 61 6c 73 6f 20 74 68 61 74 20 69 74 20 64 6f   also that it do
7400: 65 73 20 6e 6f 74 20 77 6f 72 6b 20 74 6f 0a 2a  es not work to.*
7410: 2a 20 6d 61 6b 65 20 61 6e 20 45 58 50 52 44 55  * make an EXPRDU
7420: 50 5f 52 45 44 55 43 45 20 63 6f 70 79 20 6f 66  P_REDUCE copy of
7430: 20 61 20 72 65 64 75 63 65 64 20 65 78 70 72 65   a reduced expre
7440: 73 73 69 6f 6e 2e 20 20 49 74 20 69 73 20 6f 6e  ssion.  It is on
7450: 6c 79 20 6c 65 67 61 6c 0a 2a 2a 20 74 6f 20 72  ly legal.** to r
7460: 65 64 75 63 65 20 61 20 70 72 69 73 74 69 6e 65  educe a pristine
7470: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
7480: 20 66 72 6f 6d 20 74 68 65 20 70 61 72 73 65 72   from the parser
7490: 2e 20 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74  .  The implement
74a0: 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20 64 75 70 65  ation.** of dupe
74b0: 64 45 78 70 72 53 74 72 75 63 74 53 69 7a 65 28  dExprStructSize(
74c0: 29 20 63 6f 6e 74 61 69 6e 20 6d 75 6c 74 69 70  ) contain multip
74d0: 6c 65 20 61 73 73 65 72 74 28 29 20 73 74 61 74  le assert() stat
74e0: 65 6d 65 6e 74 73 20 74 68 61 74 20 61 74 74 65  ements that atte
74f0: 6d 70 74 0a 2a 2a 20 74 6f 20 65 6e 66 6f 72 63  mpt.** to enforc
7500: 65 20 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e  e this constrain
7510: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
7520: 20 64 75 70 65 64 45 78 70 72 53 74 72 75 63 74   dupedExprStruct
7530: 53 69 7a 65 28 45 78 70 72 20 2a 70 2c 20 69 6e  Size(Expr *p, in
7540: 74 20 66 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20  t flags){.  int 
7550: 6e 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28  nSize;.  assert(
7560: 20 66 6c 61 67 73 3d 3d 45 58 50 52 44 55 50 5f   flags==EXPRDUP_
7570: 52 45 44 55 43 45 20 7c 7c 20 66 6c 61 67 73 3d  REDUCE || flags=
7580: 3d 30 20 29 3b 20 2f 2a 20 4f 6e 6c 79 20 6f 6e  =0 ); /* Only on
7590: 65 20 66 6c 61 67 20 76 61 6c 75 65 20 61 6c 6c  e flag value all
75a0: 6f 77 65 64 20 2a 2f 0a 20 20 61 73 73 65 72 74  owed */.  assert
75b0: 28 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 3c  ( EXPR_FULLSIZE<
75c0: 3d 30 78 66 66 66 20 29 3b 0a 20 20 61 73 73 65  =0xfff );.  asse
75d0: 72 74 28 20 28 30 78 66 66 66 20 26 20 28 45 50  rt( (0xfff & (EP
75e0: 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65  _Reduced|EP_Toke
75f0: 6e 4f 6e 6c 79 29 29 3d 3d 30 20 29 3b 0a 20 20  nOnly))==0 );.  
7600: 69 66 28 20 30 3d 3d 66 6c 61 67 73 20 29 7b 0a  if( 0==flags ){.
7610: 20 20 20 20 6e 53 69 7a 65 20 3d 20 45 58 50 52      nSize = EXPR
7620: 5f 46 55 4c 4c 53 49 5a 45 3b 0a 20 20 7d 65 6c  _FULLSIZE;.  }el
7630: 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
7640: 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
7650: 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  (p, EP_TokenOnly
7660: 7c 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a  |EP_Reduced) );.
7670: 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
7680: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
7690: 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 3b 20  EP_FromJoin) ); 
76a0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78  .    assert( !Ex
76b0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
76c0: 20 45 50 5f 4d 65 6d 54 6f 6b 65 6e 29 20 29 3b   EP_MemToken) );
76d0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78  .    assert( !Ex
76e0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
76f0: 20 45 50 5f 4e 6f 52 65 64 75 63 65 29 20 29 3b   EP_NoReduce) );
7700: 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4c 65 66  .    if( p->pLef
7710: 74 20 7c 7c 20 70 2d 3e 78 2e 70 4c 69 73 74 20  t || p->x.pList 
7720: 29 7b 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d  ){.      nSize =
7730: 20 45 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a   EXPR_REDUCEDSIZ
7740: 45 20 7c 20 45 50 5f 52 65 64 75 63 65 64 3b 0a  E | EP_Reduced;.
7750: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
7760: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52 69 67   assert( p->pRig
7770: 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 6e  ht==0 );.      n
7780: 53 69 7a 65 20 3d 20 45 58 50 52 5f 54 4f 4b 45  Size = EXPR_TOKE
7790: 4e 4f 4e 4c 59 53 49 5a 45 20 7c 20 45 50 5f 54  NONLYSIZE | EP_T
77a0: 6f 6b 65 6e 4f 6e 6c 79 3b 0a 20 20 20 20 7d 0a  okenOnly;.    }.
77b0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 53 69    }.  return nSi
77c0: 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ze;.}../*.** Thi
77d0: 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
77e0: 6e 73 20 74 68 65 20 73 70 61 63 65 20 69 6e 20  ns the space in 
77f0: 62 79 74 65 73 20 72 65 71 75 69 72 65 64 20 74  bytes required t
7800: 6f 20 73 74 6f 72 65 20 74 68 65 20 63 6f 70 79  o store the copy
7810: 20 0a 2a 2a 20 6f 66 20 74 68 65 20 45 78 70 72   .** of the Expr
7820: 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 61   structure and a
7830: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 45 78 70   copy of the Exp
7840: 72 2e 75 2e 7a 54 6f 6b 65 6e 20 73 74 72 69 6e  r.u.zToken strin
7850: 67 20 28 69 66 20 74 68 61 74 0a 2a 2a 20 73 74  g (if that.** st
7860: 72 69 6e 67 20 69 73 20 64 65 66 69 6e 65 64 2e  ring is defined.
7870: 29 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ).*/.static int 
7880: 64 75 70 65 64 45 78 70 72 4e 6f 64 65 53 69 7a  dupedExprNodeSiz
7890: 65 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66  e(Expr *p, int f
78a0: 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20 6e 42 79  lags){.  int nBy
78b0: 74 65 20 3d 20 64 75 70 65 64 45 78 70 72 53 74  te = dupedExprSt
78c0: 72 75 63 74 53 69 7a 65 28 70 2c 20 66 6c 61 67  ructSize(p, flag
78d0: 73 29 20 26 20 30 78 66 66 66 3b 0a 20 20 69 66  s) & 0xfff;.  if
78e0: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
78f0: 74 79 28 70 2c 20 45 50 5f 49 6e 74 56 61 6c 75  ty(p, EP_IntValu
7900: 65 29 20 26 26 20 70 2d 3e 75 2e 7a 54 6f 6b 65  e) && p->u.zToke
7910: 6e 20 29 7b 0a 20 20 20 20 6e 42 79 74 65 20 2b  n ){.    nByte +
7920: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
7930: 30 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 2b 31  0(p->u.zToken)+1
7940: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 52  ;.  }.  return R
7950: 4f 55 4e 44 38 28 6e 42 79 74 65 29 3b 0a 7d 0a  OUND8(nByte);.}.
7960: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
7970: 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
7980: 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 63 72  s required to cr
7990: 65 61 74 65 20 61 20 64 75 70 6c 69 63 61 74 65  eate a duplicate
79a0: 20 6f 66 20 74 68 65 20 0a 2a 2a 20 65 78 70 72   of the .** expr
79b0: 65 73 73 69 6f 6e 20 70 61 73 73 65 64 20 61 73  ession passed as
79c0: 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
79d0: 65 6e 74 2e 20 54 68 65 20 73 65 63 6f 6e 64 20  ent. The second 
79e0: 61 72 67 75 6d 65 6e 74 20 69 73 20 61 0a 2a 2a  argument is a.**
79f0: 20 6d 61 73 6b 20 63 6f 6e 74 61 69 6e 69 6e 67   mask containing
7a00: 20 45 58 50 52 44 55 50 5f 58 58 58 20 66 6c 61   EXPRDUP_XXX fla
7a10: 67 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61  gs..**.** The va
7a20: 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69 6e 63  lue returned inc
7a30: 6c 75 64 65 73 20 73 70 61 63 65 20 74 6f 20 63  ludes space to c
7a40: 72 65 61 74 65 20 61 20 63 6f 70 79 20 6f 66 20  reate a copy of 
7a50: 74 68 65 20 45 78 70 72 20 73 74 72 75 63 74 0a  the Expr struct.
7a60: 2a 2a 20 69 74 73 65 6c 66 20 61 6e 64 20 74 68  ** itself and th
7a70: 65 20 62 75 66 66 65 72 20 72 65 66 65 72 72 65  e buffer referre
7a80: 64 20 74 6f 20 62 79 20 45 78 70 72 2e 75 2e 7a  d to by Expr.u.z
7a90: 54 6f 6b 65 6e 2c 20 69 66 20 61 6e 79 2e 0a 2a  Token, if any..*
7aa0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 45 58 50 52  *.** If the EXPR
7ab0: 44 55 50 5f 52 45 44 55 43 45 20 66 6c 61 67 20  DUP_REDUCE flag 
7ac0: 69 73 20 73 65 74 2c 20 74 68 65 6e 20 74 68 65  is set, then the
7ad0: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 6e   return value in
7ae0: 63 6c 75 64 65 73 20 0a 2a 2a 20 73 70 61 63 65  cludes .** space
7af0: 20 74 6f 20 64 75 70 6c 69 63 61 74 65 20 61 6c   to duplicate al
7b00: 6c 20 45 78 70 72 20 6e 6f 64 65 73 20 69 6e 20  l Expr nodes in 
7b10: 74 68 65 20 74 72 65 65 20 66 6f 72 6d 65 64 20  the tree formed 
7b20: 62 79 20 45 78 70 72 2e 70 4c 65 66 74 20 0a 2a  by Expr.pLeft .*
7b30: 2a 20 61 6e 64 20 45 78 70 72 2e 70 52 69 67 68  * and Expr.pRigh
7b40: 74 20 76 61 72 69 61 62 6c 65 73 20 28 62 75 74  t variables (but
7b50: 20 6e 6f 74 20 66 6f 72 20 61 6e 79 20 73 74 72   not for any str
7b60: 75 63 74 75 72 65 73 20 70 6f 69 6e 74 65 64 20  uctures pointed 
7b70: 74 6f 20 6f 72 20 0a 2a 2a 20 64 65 73 63 65 6e  to or .** descen
7b80: 64 65 64 20 66 72 6f 6d 20 74 68 65 20 45 78 70  ded from the Exp
7b90: 72 2e 78 2e 70 4c 69 73 74 20 6f 72 20 45 78 70  r.x.pList or Exp
7ba0: 72 2e 78 2e 70 53 65 6c 65 63 74 20 76 61 72 69  r.x.pSelect vari
7bb0: 61 62 6c 65 73 29 2e 0a 2a 2f 0a 73 74 61 74 69  ables)..*/.stati
7bc0: 63 20 69 6e 74 20 64 75 70 65 64 45 78 70 72 53  c int dupedExprS
7bd0: 69 7a 65 28 45 78 70 72 20 2a 70 2c 20 69 6e 74  ize(Expr *p, int
7be0: 20 66 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20 6e   flags){.  int n
7bf0: 42 79 74 65 20 3d 20 30 3b 0a 20 20 69 66 28 20  Byte = 0;.  if( 
7c00: 70 20 29 7b 0a 20 20 20 20 6e 42 79 74 65 20 3d  p ){.    nByte =
7c10: 20 64 75 70 65 64 45 78 70 72 4e 6f 64 65 53 69   dupedExprNodeSi
7c20: 7a 65 28 70 2c 20 66 6c 61 67 73 29 3b 0a 20 20  ze(p, flags);.  
7c30: 20 20 69 66 28 20 66 6c 61 67 73 26 45 58 50 52    if( flags&EXPR
7c40: 44 55 50 5f 52 45 44 55 43 45 20 29 7b 0a 20 20  DUP_REDUCE ){.  
7c50: 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 64 75 70      nByte += dup
7c60: 65 64 45 78 70 72 53 69 7a 65 28 70 2d 3e 70 4c  edExprSize(p->pL
7c70: 65 66 74 2c 20 66 6c 61 67 73 29 20 2b 20 64 75  eft, flags) + du
7c80: 70 65 64 45 78 70 72 53 69 7a 65 28 70 2d 3e 70  pedExprSize(p->p
7c90: 52 69 67 68 74 2c 20 66 6c 61 67 73 29 3b 0a 20  Right, flags);. 
7ca0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
7cb0: 6e 20 6e 42 79 74 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  n nByte;.}../*.*
7cc0: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
7cd0: 69 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 73 71  is similar to sq
7ce0: 6c 69 74 65 33 45 78 70 72 44 75 70 28 29 2c 20  lite3ExprDup(), 
7cf0: 65 78 63 65 70 74 20 74 68 61 74 20 69 66 20 70  except that if p
7d00: 7a 42 75 66 66 65 72 20 0a 2a 2a 20 69 73 20 6e  zBuffer .** is n
7d10: 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20 2a 70 7a  ot NULL then *pz
7d20: 42 75 66 66 65 72 20 69 73 20 61 73 73 75 6d 65  Buffer is assume
7d30: 64 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20  d to point to a 
7d40: 62 75 66 66 65 72 20 6c 61 72 67 65 20 65 6e 6f  buffer large eno
7d50: 75 67 68 20 0a 2a 2a 20 74 6f 20 73 74 6f 72 65  ugh .** to store
7d60: 20 74 68 65 20 63 6f 70 79 20 6f 66 20 65 78 70   the copy of exp
7d70: 72 65 73 73 69 6f 6e 20 70 2c 20 74 68 65 20 63  ression p, the c
7d80: 6f 70 69 65 73 20 6f 66 20 70 2d 3e 75 2e 7a 54  opies of p->u.zT
7d90: 6f 6b 65 6e 0a 2a 2a 20 28 69 66 20 61 70 70 6c  oken.** (if appl
7da0: 69 63 61 62 6c 65 29 2c 20 61 6e 64 20 74 68 65  icable), and the
7db0: 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65 20 70   copies of the p
7dc0: 2d 3e 70 4c 65 66 74 20 61 6e 64 20 70 2d 3e 70  ->pLeft and p->p
7dd0: 52 69 67 68 74 20 65 78 70 72 65 73 73 69 6f 6e  Right expression
7de0: 73 2c 0a 2a 2a 20 69 66 20 61 6e 79 2e 20 42 65  s,.** if any. Be
7df0: 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20  fore returning, 
7e00: 2a 70 7a 42 75 66 66 65 72 20 69 73 20 73 65 74  *pzBuffer is set
7e10: 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 62 79   to the first by
7e20: 74 65 20 70 61 73 74 20 74 68 65 0a 2a 2a 20 70  te past the.** p
7e30: 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 62 75  ortion of the bu
7e40: 66 66 65 72 20 63 6f 70 69 65 64 20 69 6e 74 6f  ffer copied into
7e50: 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
7e60: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 45 78 70  n..*/.static Exp
7e70: 72 20 2a 65 78 70 72 44 75 70 28 73 71 6c 69 74  r *exprDup(sqlit
7e80: 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 2c  e3 *db, Expr *p,
7e90: 20 69 6e 74 20 64 75 70 46 6c 61 67 73 2c 20 75   int dupFlags, u
7ea0: 38 20 2a 2a 70 7a 42 75 66 66 65 72 29 7b 0a 20  8 **pzBuffer){. 
7eb0: 20 45 78 70 72 20 2a 70 4e 65 77 3b 20 20 20 20   Expr *pNew;    
7ec0: 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
7ed0: 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 75  to return */.  u
7ee0: 38 20 2a 7a 41 6c 6c 6f 63 3b 20 20 20 20 20 20  8 *zAlloc;      
7ef0: 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 73       /* Memory s
7f00: 70 61 63 65 20 66 72 6f 6d 20 77 68 69 63 68 20  pace from which 
7f10: 74 6f 20 62 75 69 6c 64 20 45 78 70 72 20 6f 62  to build Expr ob
7f20: 6a 65 63 74 20 2a 2f 0a 20 20 75 33 32 20 73 74  ject */.  u32 st
7f30: 61 74 69 63 46 6c 61 67 3b 20 20 20 20 20 20 20  aticFlag;       
7f40: 2f 2a 20 45 50 5f 53 74 61 74 69 63 20 69 66 20  /* EP_Static if 
7f50: 73 70 61 63 65 20 6e 6f 74 20 6f 62 74 61 69 6e  space not obtain
7f60: 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 20 2a  ed from malloc *
7f70: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62 21  /..  assert( db!
7f80: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
7f90: 70 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64  p );.  assert( d
7fa0: 75 70 46 6c 61 67 73 3d 3d 30 20 7c 7c 20 64 75  upFlags==0 || du
7fb0: 70 46 6c 61 67 73 3d 3d 45 58 50 52 44 55 50 5f  pFlags==EXPRDUP_
7fc0: 52 45 44 55 43 45 20 29 3b 0a 20 20 61 73 73 65  REDUCE );.  asse
7fd0: 72 74 28 20 70 7a 42 75 66 66 65 72 3d 3d 30 20  rt( pzBuffer==0 
7fe0: 7c 7c 20 64 75 70 46 6c 61 67 73 3d 3d 45 58 50  || dupFlags==EXP
7ff0: 52 44 55 50 5f 52 45 44 55 43 45 20 29 3b 0a 0a  RDUP_REDUCE );..
8000: 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20    /* Figure out 
8010: 77 68 65 72 65 20 74 6f 20 77 72 69 74 65 20 74  where to write t
8020: 68 65 20 6e 65 77 20 45 78 70 72 20 73 74 72 75  he new Expr stru
8030: 63 74 75 72 65 2e 20 2a 2f 0a 20 20 69 66 28 20  cture. */.  if( 
8040: 70 7a 42 75 66 66 65 72 20 29 7b 0a 20 20 20 20  pzBuffer ){.    
8050: 7a 41 6c 6c 6f 63 20 3d 20 2a 70 7a 42 75 66 66  zAlloc = *pzBuff
8060: 65 72 3b 0a 20 20 20 20 73 74 61 74 69 63 46 6c  er;.    staticFl
8070: 61 67 20 3d 20 45 50 5f 53 74 61 74 69 63 3b 0a  ag = EP_Static;.
8080: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 41 6c    }else{.    zAl
8090: 6c 6f 63 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  loc = sqlite3DbM
80a0: 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 64  allocRawNN(db, d
80b0: 75 70 65 64 45 78 70 72 53 69 7a 65 28 70 2c 20  upedExprSize(p, 
80c0: 64 75 70 46 6c 61 67 73 29 29 3b 0a 20 20 20 20  dupFlags));.    
80d0: 73 74 61 74 69 63 46 6c 61 67 20 3d 20 30 3b 0a  staticFlag = 0;.
80e0: 20 20 7d 0a 20 20 70 4e 65 77 20 3d 20 28 45 78    }.  pNew = (Ex
80f0: 70 72 20 2a 29 7a 41 6c 6c 6f 63 3b 0a 0a 20 20  pr *)zAlloc;..  
8100: 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20  if( pNew ){.    
8110: 2f 2a 20 53 65 74 20 6e 4e 65 77 53 69 7a 65 20  /* Set nNewSize 
8120: 74 6f 20 74 68 65 20 73 69 7a 65 20 61 6c 6c 6f  to the size allo
8130: 63 61 74 65 64 20 66 6f 72 20 74 68 65 20 73 74  cated for the st
8140: 72 75 63 74 75 72 65 20 70 6f 69 6e 74 65 64 20  ructure pointed 
8150: 74 6f 0a 20 20 20 20 2a 2a 20 62 79 20 70 4e 65  to.    ** by pNe
8160: 77 2e 20 54 68 69 73 20 69 73 20 65 69 74 68 65  w. This is eithe
8170: 72 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 2c  r EXPR_FULLSIZE,
8180: 20 45 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a   EXPR_REDUCEDSIZ
8190: 45 20 6f 72 0a 20 20 20 20 2a 2a 20 45 58 50 52  E or.    ** EXPR
81a0: 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 2e 20  _TOKENONLYSIZE. 
81b0: 6e 54 6f 6b 65 6e 20 69 73 20 73 65 74 20 74 6f  nToken is set to
81c0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
81d0: 79 74 65 73 20 63 6f 6e 73 75 6d 65 64 0a 20 20  ytes consumed.  
81e0: 20 20 2a 2a 20 62 79 20 74 68 65 20 63 6f 70 79    ** by the copy
81f0: 20 6f 66 20 74 68 65 20 70 2d 3e 75 2e 7a 54 6f   of the p->u.zTo
8200: 6b 65 6e 20 73 74 72 69 6e 67 20 28 69 66 20 61  ken string (if a
8210: 6e 79 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ny)..    */.    
8220: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 6e  const unsigned n
8230: 53 74 72 75 63 74 53 69 7a 65 20 3d 20 64 75 70  StructSize = dup
8240: 65 64 45 78 70 72 53 74 72 75 63 74 53 69 7a 65  edExprStructSize
8250: 28 70 2c 20 64 75 70 46 6c 61 67 73 29 3b 0a 20  (p, dupFlags);. 
8260: 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e 4e 65     const int nNe
8270: 77 53 69 7a 65 20 3d 20 6e 53 74 72 75 63 74 53  wSize = nStructS
8280: 69 7a 65 20 26 20 30 78 66 66 66 3b 0a 20 20 20  ize & 0xfff;.   
8290: 20 69 6e 74 20 6e 54 6f 6b 65 6e 3b 0a 20 20 20   int nToken;.   
82a0: 20 69 66 28 20 21 45 78 70 72 48 61 73 50 72 6f   if( !ExprHasPro
82b0: 70 65 72 74 79 28 70 2c 20 45 50 5f 49 6e 74 56  perty(p, EP_IntV
82c0: 61 6c 75 65 29 20 26 26 20 70 2d 3e 75 2e 7a 54  alue) && p->u.zT
82d0: 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 20 20 6e 54  oken ){.      nT
82e0: 6f 6b 65 6e 20 3d 20 73 71 6c 69 74 65 33 53 74  oken = sqlite3St
82f0: 72 6c 65 6e 33 30 28 70 2d 3e 75 2e 7a 54 6f 6b  rlen30(p->u.zTok
8300: 65 6e 29 20 2b 20 31 3b 0a 20 20 20 20 7d 65 6c  en) + 1;.    }el
8310: 73 65 7b 0a 20 20 20 20 20 20 6e 54 6f 6b 65 6e  se{.      nToken
8320: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
8330: 69 66 28 20 64 75 70 46 6c 61 67 73 20 29 7b 0a  if( dupFlags ){.
8340: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 45 78        assert( Ex
8350: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
8360: 20 45 50 5f 52 65 64 75 63 65 64 29 3d 3d 30 20   EP_Reduced)==0 
8370: 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  );.      memcpy(
8380: 7a 41 6c 6c 6f 63 2c 20 70 2c 20 6e 4e 65 77 53  zAlloc, p, nNewS
8390: 69 7a 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ize);.    }else{
83a0: 0a 20 20 20 20 20 20 75 33 32 20 6e 53 69 7a 65  .      u32 nSize
83b0: 20 3d 20 28 75 33 32 29 65 78 70 72 53 74 72 75   = (u32)exprStru
83c0: 63 74 53 69 7a 65 28 70 29 3b 0a 20 20 20 20 20  ctSize(p);.     
83d0: 20 6d 65 6d 63 70 79 28 7a 41 6c 6c 6f 63 2c 20   memcpy(zAlloc, 
83e0: 70 2c 20 6e 53 69 7a 65 29 3b 0a 20 20 20 20 20  p, nSize);.     
83f0: 20 69 66 28 20 6e 53 69 7a 65 3c 45 58 50 52 5f   if( nSize<EXPR_
8400: 46 55 4c 4c 53 49 5a 45 20 29 7b 20 0a 20 20 20  FULLSIZE ){ .   
8410: 20 20 20 20 20 6d 65 6d 73 65 74 28 26 7a 41 6c       memset(&zAl
8420: 6c 6f 63 5b 6e 53 69 7a 65 5d 2c 20 30 2c 20 45  loc[nSize], 0, E
8430: 58 50 52 5f 46 55 4c 4c 53 49 5a 45 2d 6e 53 69  XPR_FULLSIZE-nSi
8440: 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ze);.      }.   
8450: 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 74   }..    /* Set t
8460: 68 65 20 45 50 5f 52 65 64 75 63 65 64 2c 20 45  he EP_Reduced, E
8470: 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 2c 20 61 6e 64  P_TokenOnly, and
8480: 20 45 50 5f 53 74 61 74 69 63 20 66 6c 61 67 73   EP_Static flags
8490: 20 61 70 70 72 6f 70 72 69 61 74 65 6c 79 2e 20   appropriately. 
84a0: 2a 2f 0a 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61  */.    pNew->fla
84b0: 67 73 20 26 3d 20 7e 28 45 50 5f 52 65 64 75 63  gs &= ~(EP_Reduc
84c0: 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c  ed|EP_TokenOnly|
84d0: 45 50 5f 53 74 61 74 69 63 7c 45 50 5f 4d 65 6d  EP_Static|EP_Mem
84e0: 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 70 4e 65 77  Token);.    pNew
84f0: 2d 3e 66 6c 61 67 73 20 7c 3d 20 6e 53 74 72 75  ->flags |= nStru
8500: 63 74 53 69 7a 65 20 26 20 28 45 50 5f 52 65 64  ctSize & (EP_Red
8510: 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  uced|EP_TokenOnl
8520: 79 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 66 6c  y);.    pNew->fl
8530: 61 67 73 20 7c 3d 20 73 74 61 74 69 63 46 6c 61  ags |= staticFla
8540: 67 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20  g;..    /* Copy 
8550: 74 68 65 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20  the p->u.zToken 
8560: 73 74 72 69 6e 67 2c 20 69 66 20 61 6e 79 2e 20  string, if any. 
8570: 2a 2f 0a 20 20 20 20 69 66 28 20 6e 54 6f 6b 65  */.    if( nToke
8580: 6e 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20  n ){.      char 
8590: 2a 7a 54 6f 6b 65 6e 20 3d 20 70 4e 65 77 2d 3e  *zToken = pNew->
85a0: 75 2e 7a 54 6f 6b 65 6e 20 3d 20 28 63 68 61 72  u.zToken = (char
85b0: 2a 29 26 7a 41 6c 6c 6f 63 5b 6e 4e 65 77 53 69  *)&zAlloc[nNewSi
85c0: 7a 65 5d 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  ze];.      memcp
85d0: 79 28 7a 54 6f 6b 65 6e 2c 20 70 2d 3e 75 2e 7a  y(zToken, p->u.z
85e0: 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 29 3b 0a  Token, nToken);.
85f0: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 30      }..    if( 0
8600: 3d 3d 28 28 70 2d 3e 66 6c 61 67 73 7c 70 4e 65  ==((p->flags|pNe
8610: 77 2d 3e 66 6c 61 67 73 29 20 26 20 45 50 5f 54  w->flags) & EP_T
8620: 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20 20  okenOnly) ){.   
8630: 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68     /* Fill in th
8640: 65 20 70 4e 65 77 2d 3e 78 2e 70 53 65 6c 65 63  e pNew->x.pSelec
8650: 74 20 6f 72 20 70 4e 65 77 2d 3e 78 2e 70 4c 69  t or pNew->x.pLi
8660: 73 74 20 6d 65 6d 62 65 72 2e 20 2a 2f 0a 20 20  st member. */.  
8670: 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50      if( ExprHasP
8680: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 78 49  roperty(p, EP_xI
8690: 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20  sSelect) ){.    
86a0: 20 20 20 20 70 4e 65 77 2d 3e 78 2e 70 53 65 6c      pNew->x.pSel
86b0: 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c  ect = sqlite3Sel
86c0: 65 63 74 44 75 70 28 64 62 2c 20 70 2d 3e 78 2e  ectDup(db, p->x.
86d0: 70 53 65 6c 65 63 74 2c 20 64 75 70 46 6c 61 67  pSelect, dupFlag
86e0: 73 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  s);.      }else{
86f0: 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 78  .        pNew->x
8700: 2e 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33  .pList = sqlite3
8710: 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20  ExprListDup(db, 
8720: 70 2d 3e 78 2e 70 4c 69 73 74 2c 20 64 75 70 46  p->x.pList, dupF
8730: 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 7d 0a 20  lags);.      }. 
8740: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 46 69 6c     }..    /* Fil
8750: 6c 20 69 6e 20 70 4e 65 77 2d 3e 70 4c 65 66 74  l in pNew->pLeft
8760: 20 61 6e 64 20 70 4e 65 77 2d 3e 70 52 69 67 68   and pNew->pRigh
8770: 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 45 78  t. */.    if( Ex
8780: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 4e  prHasProperty(pN
8790: 65 77 2c 20 45 50 5f 52 65 64 75 63 65 64 7c 45  ew, EP_Reduced|E
87a0: 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a  P_TokenOnly) ){.
87b0: 20 20 20 20 20 20 7a 41 6c 6c 6f 63 20 2b 3d 20        zAlloc += 
87c0: 64 75 70 65 64 45 78 70 72 4e 6f 64 65 53 69 7a  dupedExprNodeSiz
87d0: 65 28 70 2c 20 64 75 70 46 6c 61 67 73 29 3b 0a  e(p, dupFlags);.
87e0: 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61        if( ExprHa
87f0: 73 50 72 6f 70 65 72 74 79 28 70 4e 65 77 2c 20  sProperty(pNew, 
8800: 45 50 5f 52 65 64 75 63 65 64 29 20 29 7b 0a 20  EP_Reduced) ){. 
8810: 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 4c 65         pNew->pLe
8820: 66 74 20 3d 20 70 2d 3e 70 4c 65 66 74 20 3f 0a  ft = p->pLeft ?.
8830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8840: 20 20 20 20 20 20 65 78 70 72 44 75 70 28 64 62        exprDup(db
8850: 2c 20 70 2d 3e 70 4c 65 66 74 2c 20 45 58 50 52  , p->pLeft, EXPR
8860: 44 55 50 5f 52 45 44 55 43 45 2c 20 26 7a 41 6c  DUP_REDUCE, &zAl
8870: 6c 6f 63 29 20 3a 20 30 3b 0a 20 20 20 20 20 20  loc) : 0;.      
8880: 20 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 20 3d    pNew->pRight =
8890: 20 70 2d 3e 70 52 69 67 68 74 20 3f 0a 20 20 20   p->pRight ?.   
88a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
88b0: 20 20 20 20 65 78 70 72 44 75 70 28 64 62 2c 20      exprDup(db, 
88c0: 70 2d 3e 70 52 69 67 68 74 2c 20 45 58 50 52 44  p->pRight, EXPRD
88d0: 55 50 5f 52 45 44 55 43 45 2c 20 26 7a 41 6c 6c  UP_REDUCE, &zAll
88e0: 6f 63 29 20 3a 20 30 3b 0a 20 20 20 20 20 20 7d  oc) : 0;.      }
88f0: 0a 20 20 20 20 20 20 69 66 28 20 70 7a 42 75 66  .      if( pzBuf
8900: 66 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  fer ){.        *
8910: 70 7a 42 75 66 66 65 72 20 3d 20 7a 41 6c 6c 6f  pzBuffer = zAllo
8920: 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  c;.      }.    }
8930: 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20  else{.      if( 
8940: 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
8950: 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  (p, EP_TokenOnly
8960: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65  ) ){.        pNe
8970: 77 2d 3e 70 4c 65 66 74 20 3d 20 73 71 6c 69 74  w->pLeft = sqlit
8980: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d  e3ExprDup(db, p-
8990: 3e 70 4c 65 66 74 2c 20 30 29 3b 0a 20 20 20 20  >pLeft, 0);.    
89a0: 20 20 20 20 70 4e 65 77 2d 3e 70 52 69 67 68 74      pNew->pRight
89b0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
89c0: 70 28 64 62 2c 20 70 2d 3e 70 52 69 67 68 74 2c  p(db, p->pRight,
89d0: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
89e0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
89f0: 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  pNew;.}../*.** C
8a00: 72 65 61 74 65 20 61 6e 64 20 72 65 74 75 72 6e  reate and return
8a10: 20 61 20 64 65 65 70 20 63 6f 70 79 20 6f 66 20   a deep copy of 
8a20: 74 68 65 20 6f 62 6a 65 63 74 20 70 61 73 73 65  the object passe
8a30: 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
8a40: 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 20 49 66  .** argument. If
8a50: 20 61 6e 20 4f 4f 4d 20 63 6f 6e 64 69 74 69 6f   an OOM conditio
8a60: 6e 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  n is encountered
8a70: 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e  , NULL is return
8a80: 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 62  ed.** and the db
8a90: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66  ->mallocFailed f
8aa0: 6c 61 67 20 73 65 74 2e 0a 2a 2f 0a 23 69 66 6e  lag set..*/.#ifn
8ab0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
8ac0: 43 54 45 0a 73 74 61 74 69 63 20 57 69 74 68 20  CTE.static With 
8ad0: 2a 77 69 74 68 44 75 70 28 73 71 6c 69 74 65 33  *withDup(sqlite3
8ae0: 20 2a 64 62 2c 20 57 69 74 68 20 2a 70 29 7b 0a   *db, With *p){.
8af0: 20 20 57 69 74 68 20 2a 70 52 65 74 20 3d 20 30    With *pRet = 0
8b00: 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  ;.  if( p ){.   
8b10: 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 73 69 7a   int nByte = siz
8b20: 65 6f 66 28 2a 70 29 20 2b 20 73 69 7a 65 6f 66  eof(*p) + sizeof
8b30: 28 70 2d 3e 61 5b 30 5d 29 20 2a 20 28 70 2d 3e  (p->a[0]) * (p->
8b40: 6e 43 74 65 2d 31 29 3b 0a 20 20 20 20 70 52 65  nCte-1);.    pRe
8b50: 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  t = sqlite3DbMal
8b60: 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74  locZero(db, nByt
8b70: 65 29 3b 0a 20 20 20 20 69 66 28 20 70 52 65 74  e);.    if( pRet
8b80: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b   ){.      int i;
8b90: 0a 20 20 20 20 20 20 70 52 65 74 2d 3e 6e 43 74  .      pRet->nCt
8ba0: 65 20 3d 20 70 2d 3e 6e 43 74 65 3b 0a 20 20 20  e = p->nCte;.   
8bb0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
8bc0: 3e 6e 43 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nCte; i++){.   
8bd0: 20 20 20 20 20 70 52 65 74 2d 3e 61 5b 69 5d 2e       pRet->a[i].
8be0: 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65  pSelect = sqlite
8bf0: 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70  3SelectDup(db, p
8c00: 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74 2c 20  ->a[i].pSelect, 
8c10: 30 29 3b 0a 20 20 20 20 20 20 20 20 70 52 65 74  0);.        pRet
8c20: 2d 3e 61 5b 69 5d 2e 70 43 6f 6c 73 20 3d 20 73  ->a[i].pCols = s
8c30: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
8c40: 70 28 64 62 2c 20 70 2d 3e 61 5b 69 5d 2e 70 43  p(db, p->a[i].pC
8c50: 6f 6c 73 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ols, 0);.       
8c60: 20 70 52 65 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d   pRet->a[i].zNam
8c70: 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  e = sqlite3DbStr
8c80: 44 75 70 28 64 62 2c 20 70 2d 3e 61 5b 69 5d 2e  Dup(db, p->a[i].
8c90: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a  zName);.      }.
8ca0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
8cb0: 72 6e 20 70 52 65 74 3b 0a 7d 0a 23 65 6c 73 65  rn pRet;.}.#else
8cc0: 0a 23 20 64 65 66 69 6e 65 20 77 69 74 68 44 75  .# define withDu
8cd0: 70 28 78 2c 79 29 20 30 0a 23 65 6e 64 69 66 0a  p(x,y) 0.#endif.
8ce0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
8cf0: 77 69 6e 67 20 67 72 6f 75 70 20 6f 66 20 72 6f  wing group of ro
8d00: 75 74 69 6e 65 73 20 6d 61 6b 65 20 64 65 65 70  utines make deep
8d10: 20 63 6f 70 69 65 73 20 6f 66 20 65 78 70 72 65   copies of expre
8d20: 73 73 69 6f 6e 73 2c 0a 2a 2a 20 65 78 70 72 65  ssions,.** expre
8d30: 73 73 69 6f 6e 20 6c 69 73 74 73 2c 20 49 44 20  ssion lists, ID 
8d40: 6c 69 73 74 73 2c 20 61 6e 64 20 73 65 6c 65 63  lists, and selec
8d50: 74 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 20 54  t statements.  T
8d60: 68 65 20 63 6f 70 69 65 73 20 63 61 6e 0a 2a 2a  he copies can.**
8d70: 20 62 65 20 64 65 6c 65 74 65 64 20 28 62 79 20   be deleted (by 
8d80: 62 65 69 6e 67 20 70 61 73 73 65 64 20 74 6f 20  being passed to 
8d90: 74 68 65 69 72 20 72 65 73 70 65 63 74 69 76 65  their respective
8da0: 20 2e 2e 2e 44 65 6c 65 74 65 28 29 20 72 6f 75   ...Delete() rou
8db0: 74 69 6e 65 73 29 0a 2a 2a 20 77 69 74 68 6f 75  tines).** withou
8dc0: 74 20 65 66 66 65 63 74 69 6e 67 20 74 68 65 20  t effecting the 
8dd0: 6f 72 69 67 69 6e 61 6c 73 2e 0a 2a 2a 0a 2a 2a  originals..**.**
8de0: 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
8df0: 6c 69 73 74 2c 20 49 44 2c 20 61 6e 64 20 73 6f  list, ID, and so
8e00: 75 72 63 65 20 6c 69 73 74 73 20 72 65 74 75 72  urce lists retur
8e10: 6e 20 62 79 20 73 71 6c 69 74 65 33 45 78 70 72  n by sqlite3Expr
8e20: 4c 69 73 74 44 75 70 28 29 2c 0a 2a 2a 20 73 71  ListDup(),.** sq
8e30: 6c 69 74 65 33 49 64 4c 69 73 74 44 75 70 28 29  lite3IdListDup()
8e40: 2c 20 61 6e 64 20 73 71 6c 69 74 65 33 53 72 63  , and sqlite3Src
8e50: 4c 69 73 74 44 75 70 28 29 20 63 61 6e 20 6e 6f  ListDup() can no
8e60: 74 20 62 65 20 66 75 72 74 68 65 72 20 65 78 70  t be further exp
8e70: 61 6e 64 65 64 20 0a 2a 2a 20 62 79 20 73 75 62  anded .** by sub
8e80: 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f  sequent calls to
8e90: 20 73 71 6c 69 74 65 2a 4c 69 73 74 41 70 70 65   sqlite*ListAppe
8ea0: 6e 64 28 29 20 72 6f 75 74 69 6e 65 73 2e 0a 2a  nd() routines..*
8eb0: 2a 0a 2a 2a 20 41 6e 79 20 74 61 62 6c 65 73 20  *.** Any tables 
8ec0: 74 68 61 74 20 74 68 65 20 53 72 63 4c 69 73 74  that the SrcList
8ed0: 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20   might point to 
8ee0: 61 72 65 20 6e 6f 74 20 64 75 70 6c 69 63 61 74  are not duplicat
8ef0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c  ed..**.** The fl
8f00: 61 67 73 20 70 61 72 61 6d 65 74 65 72 20 63 6f  ags parameter co
8f10: 6e 74 61 69 6e 73 20 61 20 63 6f 6d 62 69 6e 61  ntains a combina
8f20: 74 69 6f 6e 20 6f 66 20 74 68 65 20 45 58 50 52  tion of the EXPR
8f30: 44 55 50 5f 58 58 58 20 66 6c 61 67 73 2e 0a 2a  DUP_XXX flags..*
8f40: 2a 20 49 66 20 74 68 65 20 45 58 50 52 44 55 50  * If the EXPRDUP
8f50: 5f 52 45 44 55 43 45 20 66 6c 61 67 20 69 73 20  _REDUCE flag is 
8f60: 73 65 74 2c 20 74 68 65 6e 20 74 68 65 20 73 74  set, then the st
8f70: 72 75 63 74 75 72 65 20 72 65 74 75 72 6e 65 64  ructure returned
8f80: 20 69 73 20 61 0a 2a 2a 20 74 72 75 6e 63 61 74   is a.** truncat
8f90: 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68  ed version of th
8fa0: 65 20 75 73 75 61 6c 20 45 78 70 72 20 73 74 72  e usual Expr str
8fb0: 75 63 74 75 72 65 20 74 68 61 74 20 77 69 6c 6c  ucture that will
8fc0: 20 62 65 20 73 74 6f 72 65 64 20 61 73 0a 2a 2a   be stored as.**
8fd0: 20 70 61 72 74 20 6f 66 20 74 68 65 20 69 6e 2d   part of the in-
8fe0: 6d 65 6d 6f 72 79 20 72 65 70 72 65 73 65 6e 74  memory represent
8ff0: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 61 74  ation of the dat
9000: 61 62 61 73 65 20 73 63 68 65 6d 61 2e 0a 2a 2f  abase schema..*/
9010: 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78  .Expr *sqlite3Ex
9020: 70 72 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64  prDup(sqlite3 *d
9030: 62 2c 20 45 78 70 72 20 2a 70 2c 20 69 6e 74 20  b, Expr *p, int 
9040: 66 6c 61 67 73 29 7b 0a 20 20 61 73 73 65 72 74  flags){.  assert
9050: 28 20 66 6c 61 67 73 3d 3d 30 20 7c 7c 20 66 6c  ( flags==0 || fl
9060: 61 67 73 3d 3d 45 58 50 52 44 55 50 5f 52 45 44  ags==EXPRDUP_RED
9070: 55 43 45 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  UCE );.  return 
9080: 70 20 3f 20 65 78 70 72 44 75 70 28 64 62 2c 20  p ? exprDup(db, 
9090: 70 2c 20 66 6c 61 67 73 2c 20 30 29 20 3a 20 30  p, flags, 0) : 0
90a0: 3b 0a 7d 0a 45 78 70 72 4c 69 73 74 20 2a 73 71  ;.}.ExprList *sq
90b0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
90c0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78  (sqlite3 *db, Ex
90d0: 70 72 4c 69 73 74 20 2a 70 2c 20 69 6e 74 20 66  prList *p, int f
90e0: 6c 61 67 73 29 7b 0a 20 20 45 78 70 72 4c 69 73  lags){.  ExprLis
90f0: 74 20 2a 70 4e 65 77 3b 0a 20 20 73 74 72 75 63  t *pNew;.  struc
9100: 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
9110: 2a 70 49 74 65 6d 2c 20 2a 70 4f 6c 64 49 74 65  *pItem, *pOldIte
9120: 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73  m;.  int i;.  as
9130: 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20  sert( db!=0 );. 
9140: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
9150: 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73  rn 0;.  pNew = s
9160: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
9170: 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a  wNN(db, sizeof(*
9180: 70 4e 65 77 29 20 29 3b 0a 20 20 69 66 28 20 70  pNew) );.  if( p
9190: 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  New==0 ) return 
91a0: 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e 45 78 70 72  0;.  pNew->nExpr
91b0: 20 3d 20 69 20 3d 20 70 2d 3e 6e 45 78 70 72 3b   = i = p->nExpr;
91c0: 0a 20 20 69 66 28 20 28 66 6c 61 67 73 20 26 20  .  if( (flags & 
91d0: 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 29 3d  EXPRDUP_REDUCE)=
91e0: 3d 30 20 29 20 66 6f 72 28 69 3d 31 3b 20 69 3c  =0 ) for(i=1; i<
91f0: 70 2d 3e 6e 45 78 70 72 3b 20 69 2b 3d 69 29 7b  p->nExpr; i+=i){
9200: 7d 0a 20 20 70 4e 65 77 2d 3e 61 20 3d 20 70 49  }.  pNew->a = pI
9210: 74 65 6d 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  tem = sqlite3DbM
9220: 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 20  allocRawNN(db,  
9230: 69 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d  i*sizeof(p->a[0]
9240: 29 20 29 3b 0a 20 20 69 66 28 20 70 49 74 65 6d  ) );.  if( pItem
9250: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
9260: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4e 65  e3DbFree(db, pNe
9270: 77 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  w);.    return 0
9280: 3b 0a 20 20 7d 20 0a 20 20 70 4f 6c 64 49 74 65  ;.  } .  pOldIte
9290: 6d 20 3d 20 70 2d 3e 61 3b 0a 20 20 66 6f 72 28  m = p->a;.  for(
92a0: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 45 78 70 72 3b  i=0; i<p->nExpr;
92b0: 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 2c 20 70   i++, pItem++, p
92c0: 4f 6c 64 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  OldItem++){.    
92d0: 45 78 70 72 20 2a 70 4f 6c 64 45 78 70 72 20 3d  Expr *pOldExpr =
92e0: 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 45 78 70 72   pOldItem->pExpr
92f0: 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 70 45 78  ;.    pItem->pEx
9300: 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pr = sqlite3Expr
9310: 44 75 70 28 64 62 2c 20 70 4f 6c 64 45 78 70 72  Dup(db, pOldExpr
9320: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 49  , flags);.    pI
9330: 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c  tem->zName = sql
9340: 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
9350: 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65   pOldItem->zName
9360: 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 53  );.    pItem->zS
9370: 70 61 6e 20 3d 20 73 71 6c 69 74 65 33 44 62 53  pan = sqlite3DbS
9380: 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74  trDup(db, pOldIt
9390: 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a 20 20 20 20  em->zSpan);.    
93a0: 70 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72  pItem->sortOrder
93b0: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 73 6f 72   = pOldItem->sor
93c0: 74 4f 72 64 65 72 3b 0a 20 20 20 20 70 49 74 65  tOrder;.    pIte
93d0: 6d 2d 3e 64 6f 6e 65 20 3d 20 30 3b 0a 20 20 20  m->done = 0;.   
93e0: 20 70 49 74 65 6d 2d 3e 62 53 70 61 6e 49 73 54   pItem->bSpanIsT
93f0: 61 62 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 62  ab = pOldItem->b
9400: 53 70 61 6e 49 73 54 61 62 3b 0a 20 20 20 20 70  SpanIsTab;.    p
9410: 49 74 65 6d 2d 3e 75 20 3d 20 70 4f 6c 64 49 74  Item->u = pOldIt
9420: 65 6d 2d 3e 75 3b 0a 20 20 7d 0a 20 20 72 65 74  em->u;.  }.  ret
9430: 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a  urn pNew;.}../*.
9440: 2a 2a 20 49 66 20 63 75 72 73 6f 72 73 2c 20 74  ** If cursors, t
9450: 72 69 67 67 65 72 73 2c 20 76 69 65 77 73 20 61  riggers, views a
9460: 6e 64 20 73 75 62 71 75 65 72 69 65 73 20 61 72  nd subqueries ar
9470: 65 20 61 6c 6c 20 6f 6d 69 74 74 65 64 20 66 72  e all omitted fr
9480: 6f 6d 0a 2a 2a 20 74 68 65 20 62 75 69 6c 64 2c  om.** the build,
9490: 20 74 68 65 6e 20 6e 6f 6e 65 20 6f 66 20 74 68   then none of th
94a0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74  e following rout
94b0: 69 6e 65 73 2c 20 65 78 63 65 70 74 20 66 6f 72  ines, except for
94c0: 20 0a 2a 2a 20 73 71 6c 69 74 65 33 53 65 6c 65   .** sqlite3Sele
94d0: 63 74 44 75 70 28 29 2c 20 63 61 6e 20 62 65 20  ctDup(), can be 
94e0: 63 61 6c 6c 65 64 2e 20 73 71 6c 69 74 65 33 53  called. sqlite3S
94f0: 65 6c 65 63 74 44 75 70 28 29 20 69 73 20 73 6f  electDup() is so
9500: 6d 65 74 69 6d 65 73 0a 2a 2a 20 63 61 6c 6c 65  metimes.** calle
9510: 64 20 77 69 74 68 20 61 20 4e 55 4c 4c 20 61 72  d with a NULL ar
9520: 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 23 69 66 20 21  gument..*/.#if !
9530: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
9540: 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65  MIT_VIEW) || !de
9550: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
9560: 54 5f 54 52 49 47 47 45 52 29 20 5c 0a 20 7c 7c  T_TRIGGER) \. ||
9570: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
9580: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 0a  _OMIT_SUBQUERY).
9590: 53 72 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 33  SrcList *sqlite3
95a0: 53 72 63 4c 69 73 74 44 75 70 28 73 71 6c 69 74  SrcListDup(sqlit
95b0: 65 33 20 2a 64 62 2c 20 53 72 63 4c 69 73 74 20  e3 *db, SrcList 
95c0: 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a  *p, int flags){.
95d0: 20 20 53 72 63 4c 69 73 74 20 2a 70 4e 65 77 3b    SrcList *pNew;
95e0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
95f0: 6e 42 79 74 65 3b 0a 20 20 61 73 73 65 72 74 28  nByte;.  assert(
9600: 20 64 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20   db!=0 );.  if( 
9610: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  p==0 ) return 0;
9620: 0a 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f  .  nByte = sizeo
9630: 66 28 2a 70 29 20 2b 20 28 70 2d 3e 6e 53 72 63  f(*p) + (p->nSrc
9640: 3e 30 20 3f 20 73 69 7a 65 6f 66 28 70 2d 3e 61  >0 ? sizeof(p->a
9650: 5b 30 5d 29 20 2a 20 28 70 2d 3e 6e 53 72 63 2d  [0]) * (p->nSrc-
9660: 31 29 20 3a 20 30 29 3b 0a 20 20 70 4e 65 77 20  1) : 0);.  pNew 
9670: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
9680: 63 52 61 77 4e 4e 28 64 62 2c 20 6e 42 79 74 65  cRawNN(db, nByte
9690: 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d   );.  if( pNew==
96a0: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
96b0: 70 4e 65 77 2d 3e 6e 53 72 63 20 3d 20 70 4e 65  pNew->nSrc = pNe
96c0: 77 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e  w->nAlloc = p->n
96d0: 53 72 63 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  Src;.  for(i=0; 
96e0: 69 3c 70 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b  i<p->nSrc; i++){
96f0: 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c  .    struct SrcL
9700: 69 73 74 5f 69 74 65 6d 20 2a 70 4e 65 77 49 74  ist_item *pNewIt
9710: 65 6d 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 69 5d  em = &pNew->a[i]
9720: 3b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63  ;.    struct Src
9730: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4f 6c 64 49  List_item *pOldI
9740: 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a  tem = &p->a[i];.
9750: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b      Table *pTab;
9760: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70  .    pNewItem->p
9770: 53 63 68 65 6d 61 20 3d 20 70 4f 6c 64 49 74 65  Schema = pOldIte
9780: 6d 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20  m->pSchema;.    
9790: 70 4e 65 77 49 74 65 6d 2d 3e 7a 44 61 74 61 62  pNewItem->zDatab
97a0: 61 73 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ase = sqlite3DbS
97b0: 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74  trDup(db, pOldIt
97c0: 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a  em->zDatabase);.
97d0: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e      pNewItem->zN
97e0: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ame = sqlite3DbS
97f0: 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74  trDup(db, pOldIt
9800: 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  em->zName);.    
9810: 70 4e 65 77 49 74 65 6d 2d 3e 7a 41 6c 69 61 73  pNewItem->zAlias
9820: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
9830: 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d  up(db, pOldItem-
9840: 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 70 4e  >zAlias);.    pN
9850: 65 77 49 74 65 6d 2d 3e 66 67 20 3d 20 70 4f 6c  ewItem->fg = pOl
9860: 64 49 74 65 6d 2d 3e 66 67 3b 0a 20 20 20 20 70  dItem->fg;.    p
9870: 4e 65 77 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  NewItem->iCursor
9880: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 43 75   = pOldItem->iCu
9890: 72 73 6f 72 3b 0a 20 20 20 20 70 4e 65 77 49 74  rsor;.    pNewIt
98a0: 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20  em->addrFillSub 
98b0: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 61 64 64 72  = pOldItem->addr
98c0: 46 69 6c 6c 53 75 62 3b 0a 20 20 20 20 70 4e 65  FillSub;.    pNe
98d0: 77 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e  wItem->regReturn
98e0: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 72 65 67   = pOldItem->reg
98f0: 52 65 74 75 72 6e 3b 0a 20 20 20 20 69 66 28 20  Return;.    if( 
9900: 70 4e 65 77 49 74 65 6d 2d 3e 66 67 2e 69 73 49  pNewItem->fg.isI
9910: 6e 64 65 78 65 64 42 79 20 29 7b 0a 20 20 20 20  ndexedBy ){.    
9920: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 75 31 2e 7a    pNewItem->u1.z
9930: 49 6e 64 65 78 65 64 42 79 20 3d 20 73 71 6c 69  IndexedBy = sqli
9940: 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
9950: 70 4f 6c 64 49 74 65 6d 2d 3e 75 31 2e 7a 49 6e  pOldItem->u1.zIn
9960: 64 65 78 65 64 42 79 29 3b 0a 20 20 20 20 7d 0a  dexedBy);.    }.
9970: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 49      pNewItem->pI
9980: 42 49 6e 64 65 78 20 3d 20 70 4f 6c 64 49 74 65  BIndex = pOldIte
9990: 6d 2d 3e 70 49 42 49 6e 64 65 78 3b 0a 20 20 20  m->pIBIndex;.   
99a0: 20 69 66 28 20 70 4e 65 77 49 74 65 6d 2d 3e 66   if( pNewItem->f
99b0: 67 2e 69 73 54 61 62 46 75 6e 63 20 29 7b 0a 20  g.isTabFunc ){. 
99c0: 20 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 75       pNewItem->u
99d0: 31 2e 70 46 75 6e 63 41 72 67 20 3d 20 0a 20 20  1.pFuncArg = .  
99e0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
99f0: 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70  xprListDup(db, p
9a00: 4f 6c 64 49 74 65 6d 2d 3e 75 31 2e 70 46 75 6e  OldItem->u1.pFun
9a10: 63 41 72 67 2c 20 66 6c 61 67 73 29 3b 0a 20 20  cArg, flags);.  
9a20: 20 20 7d 0a 20 20 20 20 70 54 61 62 20 3d 20 70    }.    pTab = p
9a30: 4e 65 77 49 74 65 6d 2d 3e 70 54 61 62 20 3d 20  NewItem->pTab = 
9a40: 70 4f 6c 64 49 74 65 6d 2d 3e 70 54 61 62 3b 0a  pOldItem->pTab;.
9a50: 20 20 20 20 69 66 28 20 70 54 61 62 20 29 7b 0a      if( pTab ){.
9a60: 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 52 65 66        pTab->nRef
9a70: 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e  ++;.    }.    pN
9a80: 65 77 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20  ewItem->pSelect 
9a90: 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  = sqlite3SelectD
9aa0: 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d  up(db, pOldItem-
9ab0: 3e 70 53 65 6c 65 63 74 2c 20 66 6c 61 67 73 29  >pSelect, flags)
9ac0: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
9ad0: 70 4f 6e 20 3d 20 73 71 6c 69 74 65 33 45 78 70  pOn = sqlite3Exp
9ae0: 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65  rDup(db, pOldIte
9af0: 6d 2d 3e 70 4f 6e 2c 20 66 6c 61 67 73 29 3b 0a  m->pOn, flags);.
9b00: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 55      pNewItem->pU
9b10: 73 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 49 64  sing = sqlite3Id
9b20: 4c 69 73 74 44 75 70 28 64 62 2c 20 70 4f 6c 64  ListDup(db, pOld
9b30: 49 74 65 6d 2d 3e 70 55 73 69 6e 67 29 3b 0a 20  Item->pUsing);. 
9b40: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 63 6f 6c     pNewItem->col
9b50: 55 73 65 64 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  Used = pOldItem-
9b60: 3e 63 6f 6c 55 73 65 64 3b 0a 20 20 7d 0a 20 20  >colUsed;.  }.  
9b70: 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 49  return pNew;.}.I
9b80: 64 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 49 64  dList *sqlite3Id
9b90: 4c 69 73 74 44 75 70 28 73 71 6c 69 74 65 33 20  ListDup(sqlite3 
9ba0: 2a 64 62 2c 20 49 64 4c 69 73 74 20 2a 70 29 7b  *db, IdList *p){
9bb0: 0a 20 20 49 64 4c 69 73 74 20 2a 70 4e 65 77 3b  .  IdList *pNew;
9bc0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65  .  int i;.  asse
9bd0: 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 69  rt( db!=0 );.  i
9be0: 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
9bf0: 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c   0;.  pNew = sql
9c00: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e  ite3DbMallocRawN
9c10: 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4e  N(db, sizeof(*pN
9c20: 65 77 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65  ew) );.  if( pNe
9c30: 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  w==0 ) return 0;
9c40: 0a 20 20 70 4e 65 77 2d 3e 6e 49 64 20 3d 20 70  .  pNew->nId = p
9c50: 2d 3e 6e 49 64 3b 0a 20 20 70 4e 65 77 2d 3e 61  ->nId;.  pNew->a
9c60: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
9c70: 6f 63 52 61 77 4e 4e 28 64 62 2c 20 70 2d 3e 6e  ocRawNN(db, p->n
9c80: 49 64 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30  Id*sizeof(p->a[0
9c90: 5d 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  ]) );.  if( pNew
9ca0: 2d 3e 61 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  ->a==0 ){.    sq
9cb0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
9cc0: 70 4e 65 77 29 3b 0a 20 20 20 20 72 65 74 75 72  pNew);.    retur
9cd0: 6e 20 30 3b 0a 20 20 7d 0a 20 20 2f 2a 20 4e 6f  n 0;.  }.  /* No
9ce0: 74 65 20 74 68 61 74 20 62 65 63 61 75 73 65 20  te that because 
9cf0: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
9d00: 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 6f 72 20 70  allocation for p
9d10: 2d 3e 61 5b 5d 20 69 73 20 6e 6f 74 0a 20 20 2a  ->a[] is not.  *
9d20: 2a 20 6e 65 63 65 73 73 61 72 69 6c 79 20 61 20  * necessarily a 
9d30: 70 6f 77 65 72 20 6f 66 20 74 77 6f 2c 20 73 71  power of two, sq
9d40: 6c 69 74 65 33 49 64 4c 69 73 74 41 70 70 65 6e  lite3IdListAppen
9d50: 64 28 29 20 6d 61 79 20 6e 6f 74 20 62 65 20 63  d() may not be c
9d60: 61 6c 6c 65 64 0a 20 20 2a 2a 20 6f 6e 20 74 68  alled.  ** on th
9d70: 65 20 64 75 70 6c 69 63 61 74 65 20 63 72 65 61  e duplicate crea
9d80: 74 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  ted by this func
9d90: 74 69 6f 6e 2e 20 2a 2f 0a 20 20 66 6f 72 28 69  tion. */.  for(i
9da0: 3d 30 3b 20 69 3c 70 2d 3e 6e 49 64 3b 20 69 2b  =0; i<p->nId; i+
9db0: 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 49  +){.    struct I
9dc0: 64 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4e 65 77  dList_item *pNew
9dd0: 49 74 65 6d 20 3d 20 26 70 4e 65 77 2d 3e 61 5b  Item = &pNew->a[
9de0: 69 5d 3b 0a 20 20 20 20 73 74 72 75 63 74 20 49  i];.    struct I
9df0: 64 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4f 6c 64  dList_item *pOld
9e00: 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b  Item = &p->a[i];
9e10: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a  .    pNewItem->z
9e20: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62  Name = sqlite3Db
9e30: 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49  StrDup(db, pOldI
9e40: 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  tem->zName);.   
9e50: 20 70 4e 65 77 49 74 65 6d 2d 3e 69 64 78 20 3d   pNewItem->idx =
9e60: 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 64 78 3b 0a   pOldItem->idx;.
9e70: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65    }.  return pNe
9e80: 77 3b 0a 7d 0a 53 65 6c 65 63 74 20 2a 73 71 6c  w;.}.Select *sql
9e90: 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 73 71  ite3SelectDup(sq
9ea0: 6c 69 74 65 33 20 2a 64 62 2c 20 53 65 6c 65 63  lite3 *db, Selec
9eb0: 74 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29  t *p, int flags)
9ec0: 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 77  {.  Select *pNew
9ed0: 2c 20 2a 70 50 72 69 6f 72 3b 0a 20 20 61 73 73  , *pPrior;.  ass
9ee0: 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20  ert( db!=0 );.  
9ef0: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
9f00: 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71  n 0;.  pNew = sq
9f10: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
9f20: 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70  NN(db, sizeof(*p
9f30: 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d  ) );.  if( pNew=
9f40: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
9f50: 20 70 4e 65 77 2d 3e 70 45 4c 69 73 74 20 3d 20   pNew->pEList = 
9f60: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
9f70: 75 70 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74  up(db, p->pEList
9f80: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77  , flags);.  pNew
9f90: 2d 3e 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33  ->pSrc = sqlite3
9fa0: 53 72 63 4c 69 73 74 44 75 70 28 64 62 2c 20 70  SrcListDup(db, p
9fb0: 2d 3e 70 53 72 63 2c 20 66 6c 61 67 73 29 3b 0a  ->pSrc, flags);.
9fc0: 20 20 70 4e 65 77 2d 3e 70 57 68 65 72 65 20 3d    pNew->pWhere =
9fd0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
9fe0: 64 62 2c 20 70 2d 3e 70 57 68 65 72 65 2c 20 66  db, p->pWhere, f
9ff0: 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 70  lags);.  pNew->p
a000: 47 72 6f 75 70 42 79 20 3d 20 73 71 6c 69 74 65  GroupBy = sqlite
a010: 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c  3ExprListDup(db,
a020: 20 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 66 6c   p->pGroupBy, fl
a030: 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 48  ags);.  pNew->pH
a040: 61 76 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 45  aving = sqlite3E
a050: 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 48  xprDup(db, p->pH
a060: 61 76 69 6e 67 2c 20 66 6c 61 67 73 29 3b 0a 20  aving, flags);. 
a070: 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79 20   pNew->pOrderBy 
a080: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
a090: 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 4f 72 64  tDup(db, p->pOrd
a0a0: 65 72 42 79 2c 20 66 6c 61 67 73 29 3b 0a 20 20  erBy, flags);.  
a0b0: 70 4e 65 77 2d 3e 6f 70 20 3d 20 70 2d 3e 6f 70  pNew->op = p->op
a0c0: 3b 0a 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72  ;.  pNew->pPrior
a0d0: 20 3d 20 70 50 72 69 6f 72 20 3d 20 73 71 6c 69   = pPrior = sqli
a0e0: 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c  te3SelectDup(db,
a0f0: 20 70 2d 3e 70 50 72 69 6f 72 2c 20 66 6c 61 67   p->pPrior, flag
a100: 73 29 3b 0a 20 20 69 66 28 20 70 50 72 69 6f 72  s);.  if( pPrior
a110: 20 29 20 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74   ) pPrior->pNext
a120: 20 3d 20 70 4e 65 77 3b 0a 20 20 70 4e 65 77 2d   = pNew;.  pNew-
a130: 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 70 4e  >pNext = 0;.  pN
a140: 65 77 2d 3e 70 4c 69 6d 69 74 20 3d 20 73 71 6c  ew->pLimit = sql
a150: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
a160: 70 2d 3e 70 4c 69 6d 69 74 2c 20 66 6c 61 67 73  p->pLimit, flags
a170: 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 66 66 73  );.  pNew->pOffs
a180: 65 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  et = sqlite3Expr
a190: 44 75 70 28 64 62 2c 20 70 2d 3e 70 4f 66 66 73  Dup(db, p->pOffs
a1a0: 65 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e  et, flags);.  pN
a1b0: 65 77 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a  ew->iLimit = 0;.
a1c0: 20 20 70 4e 65 77 2d 3e 69 4f 66 66 73 65 74 20    pNew->iOffset 
a1d0: 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 73 65 6c  = 0;.  pNew->sel
a1e0: 46 6c 61 67 73 20 3d 20 70 2d 3e 73 65 6c 46 6c  Flags = p->selFl
a1f0: 61 67 73 20 26 20 7e 53 46 5f 55 73 65 73 45 70  ags & ~SF_UsesEp
a200: 68 65 6d 65 72 61 6c 3b 0a 20 20 70 4e 65 77 2d  hemeral;.  pNew-
a210: 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d  >addrOpenEphm[0]
a220: 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 61   = -1;.  pNew->a
a230: 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d  ddrOpenEphm[1] =
a240: 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 6e 53 65   -1;.  pNew->nSe
a250: 6c 65 63 74 52 6f 77 20 3d 20 70 2d 3e 6e 53 65  lectRow = p->nSe
a260: 6c 65 63 74 52 6f 77 3b 0a 20 20 70 4e 65 77 2d  lectRow;.  pNew-
a270: 3e 70 57 69 74 68 20 3d 20 77 69 74 68 44 75 70  >pWith = withDup
a280: 28 64 62 2c 20 70 2d 3e 70 57 69 74 68 29 3b 0a  (db, p->pWith);.
a290: 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 53    sqlite3SelectS
a2a0: 65 74 4e 61 6d 65 28 70 4e 65 77 2c 20 70 2d 3e  etName(pNew, p->
a2b0: 7a 53 65 6c 4e 61 6d 65 29 3b 0a 20 20 72 65 74  zSelName);.  ret
a2c0: 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 23 65 6c 73  urn pNew;.}.#els
a2d0: 65 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69 74 65  e.Select *sqlite
a2e0: 33 53 65 6c 65 63 74 44 75 70 28 73 71 6c 69 74  3SelectDup(sqlit
a2f0: 65 33 20 2a 64 62 2c 20 53 65 6c 65 63 74 20 2a  e3 *db, Select *
a300: 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  p, int flags){. 
a310: 20 61 73 73 65 72 74 28 20 70 3d 3d 30 20 29 3b   assert( p==0 );
a320: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23  .  return 0;.}.#
a330: 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64  endif.../*.** Ad
a340: 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20  d a new element 
a350: 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 61 6e  to the end of an
a360: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
a370: 2e 20 20 49 66 20 70 4c 69 73 74 20 69 73 0a 2a  .  If pList is.*
a380: 2a 20 69 6e 69 74 69 61 6c 6c 79 20 4e 55 4c 4c  * initially NULL
a390: 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20  , then create a 
a3a0: 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  new expression l
a3b0: 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  ist..**.** If a 
a3c0: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
a3d0: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
a3e0: 74 68 65 20 65 6e 74 69 72 65 20 6c 69 73 74 20  the entire list 
a3f0: 69 73 20 66 72 65 65 64 20 61 6e 64 0a 2a 2a 20  is freed and.** 
a400: 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64  NULL is returned
a410: 2e 20 20 49 66 20 6e 6f 6e 2d 4e 55 4c 4c 20 69  .  If non-NULL i
a420: 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65 6e  s returned, then
a430: 20 69 74 20 69 73 20 67 75 61 72 61 6e 74 65 65   it is guarantee
a440: 64 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 6e 65  d.** that the ne
a450: 77 20 65 6e 74 72 79 20 77 61 73 20 73 75 63 63  w entry was succ
a460: 65 73 73 66 75 6c 6c 79 20 61 70 70 65 6e 64 65  essfully appende
a470: 64 2e 0a 2a 2f 0a 45 78 70 72 4c 69 73 74 20 2a  d..*/.ExprList *
a480: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
a490: 70 70 65 6e 64 28 0a 20 20 50 61 72 73 65 20 2a  ppend(.  Parse *
a4a0: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
a4b0: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
a4c0: 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ext */.  ExprLis
a4d0: 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20  t *pList,       
a4e0: 20 2f 2a 20 4c 69 73 74 20 74 6f 20 77 68 69 63   /* List to whic
a4f0: 68 20 74 6f 20 61 70 70 65 6e 64 2e 20 4d 69 67  h to append. Mig
a500: 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ht be NULL */.  
a510: 45 78 70 72 20 2a 70 45 78 70 72 20 20 20 20 20  Expr *pExpr     
a520: 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65          /* Expre
a530: 73 73 69 6f 6e 20 74 6f 20 62 65 20 61 70 70 65  ssion to be appe
a540: 6e 64 65 64 2e 20 4d 69 67 68 74 20 62 65 20 4e  nded. Might be N
a550: 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  ULL */.){.  sqli
a560: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
a570: 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20  ->db;.  assert( 
a580: 64 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  db!=0 );.  if( p
a590: 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70  List==0 ){.    p
a5a0: 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 44 62  List = sqlite3Db
a5b0: 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20  MallocRawNN(db, 
a5c0: 73 69 7a 65 6f 66 28 45 78 70 72 4c 69 73 74 29  sizeof(ExprList)
a5d0: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73   );.    if( pLis
a5e0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f  t==0 ){.      go
a5f0: 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 7d  to no_mem;.    }
a600: 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e 45 78 70  .    pList->nExp
a610: 72 20 3d 20 30 3b 0a 20 20 20 20 70 4c 69 73 74  r = 0;.    pList
a620: 2d 3e 61 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  ->a = sqlite3DbM
a630: 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73  allocRawNN(db, s
a640: 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30  izeof(pList->a[0
a650: 5d 29 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69  ]));.    if( pLi
a660: 73 74 2d 3e 61 3d 3d 30 20 29 20 67 6f 74 6f 20  st->a==0 ) goto 
a670: 6e 6f 5f 6d 65 6d 3b 0a 20 20 7d 65 6c 73 65 20  no_mem;.  }else 
a680: 69 66 28 20 28 70 4c 69 73 74 2d 3e 6e 45 78 70  if( (pList->nExp
a690: 72 20 26 20 28 70 4c 69 73 74 2d 3e 6e 45 78 70  r & (pList->nExp
a6a0: 72 2d 31 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20  r-1))==0 ){.    
a6b0: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
a6c0: 69 74 65 6d 20 2a 61 3b 0a 20 20 20 20 61 73 73  item *a;.    ass
a6d0: 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70  ert( pList->nExp
a6e0: 72 3e 30 20 29 3b 0a 20 20 20 20 61 20 3d 20 73  r>0 );.    a = s
a6f0: 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28  qlite3DbRealloc(
a700: 64 62 2c 20 70 4c 69 73 74 2d 3e 61 2c 20 70 4c  db, pList->a, pL
a710: 69 73 74 2d 3e 6e 45 78 70 72 2a 32 2a 73 69 7a  ist->nExpr*2*siz
a720: 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29  eof(pList->a[0])
a730: 29 3b 0a 20 20 20 20 69 66 28 20 61 3d 3d 30 20  );.    if( a==0 
a740: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6e 6f  ){.      goto no
a750: 5f 6d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _mem;.    }.    
a760: 70 4c 69 73 74 2d 3e 61 20 3d 20 61 3b 0a 20 20  pList->a = a;.  
a770: 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73  }.  assert( pLis
a780: 74 2d 3e 61 21 3d 30 20 29 3b 0a 20 20 69 66 28  t->a!=0 );.  if(
a790: 20 31 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74   1 ){.    struct
a7a0: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
a7b0: 70 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e  pItem = &pList->
a7c0: 61 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2b 2b  a[pList->nExpr++
a7d0: 5d 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 49  ];.    memset(pI
a7e0: 74 65 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  tem, 0, sizeof(*
a7f0: 70 49 74 65 6d 29 29 3b 0a 20 20 20 20 70 49 74  pItem));.    pIt
a800: 65 6d 2d 3e 70 45 78 70 72 20 3d 20 70 45 78 70  em->pExpr = pExp
a810: 72 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  r;.  }.  return 
a820: 70 4c 69 73 74 3b 0a 0a 6e 6f 5f 6d 65 6d 3a 20  pList;..no_mem: 
a830: 20 20 20 20 0a 20 20 2f 2a 20 41 76 6f 69 64 20      .  /* Avoid 
a840: 6c 65 61 6b 69 6e 67 20 6d 65 6d 6f 72 79 20 69  leaking memory i
a850: 66 20 6d 61 6c 6c 6f 63 20 68 61 73 20 66 61 69  f malloc has fai
a860: 6c 65 64 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  led. */.  sqlite
a870: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
a880: 70 45 78 70 72 29 3b 0a 20 20 73 71 6c 69 74 65  pExpr);.  sqlite
a890: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
a8a0: 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 72 65  db, pList);.  re
a8b0: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
a8c0: 20 53 65 74 20 74 68 65 20 73 6f 72 74 20 6f 72   Set the sort or
a8d0: 64 65 72 20 66 6f 72 20 74 68 65 20 6c 61 73 74  der for the last
a8e0: 20 65 6c 65 6d 65 6e 74 20 6f 6e 20 74 68 65 20   element on the 
a8f0: 67 69 76 65 6e 20 45 78 70 72 4c 69 73 74 2e 0a  given ExprList..
a900: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
a910: 78 70 72 4c 69 73 74 53 65 74 53 6f 72 74 4f 72  xprListSetSortOr
a920: 64 65 72 28 45 78 70 72 4c 69 73 74 20 2a 70 2c  der(ExprList *p,
a930: 20 69 6e 74 20 69 53 6f 72 74 4f 72 64 65 72 29   int iSortOrder)
a940: 7b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  {.  if( p==0 ) r
a950: 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28  eturn;.  assert(
a960: 20 53 51 4c 49 54 45 5f 53 4f 5f 55 4e 44 45 46   SQLITE_SO_UNDEF
a970: 49 4e 45 44 3c 30 20 26 26 20 53 51 4c 49 54 45  INED<0 && SQLITE
a980: 5f 53 4f 5f 41 53 43 3e 3d 30 20 26 26 20 53 51  _SO_ASC>=0 && SQ
a990: 4c 49 54 45 5f 53 4f 5f 44 45 53 43 3e 30 20 29  LITE_SO_DESC>0 )
a9a0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e  ;.  assert( p->n
a9b0: 45 78 70 72 3e 30 20 29 3b 0a 20 20 69 66 28 20  Expr>0 );.  if( 
a9c0: 69 53 6f 72 74 4f 72 64 65 72 3c 30 20 29 7b 0a  iSortOrder<0 ){.
a9d0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61      assert( p->a
a9e0: 5b 70 2d 3e 6e 45 78 70 72 2d 31 5d 2e 73 6f 72  [p->nExpr-1].sor
a9f0: 74 4f 72 64 65 72 3d 3d 53 51 4c 49 54 45 5f 53  tOrder==SQLITE_S
aa00: 4f 5f 41 53 43 20 29 3b 0a 20 20 20 20 72 65 74  O_ASC );.    ret
aa10: 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 2d 3e 61 5b  urn;.  }.  p->a[
aa20: 70 2d 3e 6e 45 78 70 72 2d 31 5d 2e 73 6f 72 74  p->nExpr-1].sort
aa30: 4f 72 64 65 72 20 3d 20 28 75 38 29 69 53 6f 72  Order = (u8)iSor
aa40: 74 4f 72 64 65 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  tOrder;.}../*.**
aa50: 20 53 65 74 20 74 68 65 20 45 78 70 72 4c 69 73   Set the ExprLis
aa60: 74 2e 61 5b 5d 2e 7a 4e 61 6d 65 20 65 6c 65 6d  t.a[].zName elem
aa70: 65 6e 74 20 6f 66 20 74 68 65 20 6d 6f 73 74 20  ent of the most 
aa80: 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20 69  recently added i
aa90: 74 65 6d 0a 2a 2a 20 6f 6e 20 74 68 65 20 65 78  tem.** on the ex
aaa0: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a  pression list..*
aab0: 2a 0a 2a 2a 20 70 4c 69 73 74 20 6d 69 67 68 74  *.** pList might
aac0: 20 62 65 20 4e 55 4c 4c 20 66 6f 6c 6c 6f 77 69   be NULL followi
aad0: 6e 67 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e  ng an OOM error.
aae0: 20 20 42 75 74 20 70 4e 61 6d 65 20 73 68 6f 75    But pName shou
aaf0: 6c 64 20 6e 65 76 65 72 20 62 65 0a 2a 2a 20 4e  ld never be.** N
ab00: 55 4c 4c 2e 20 20 49 66 20 61 20 6d 65 6d 6f 72  ULL.  If a memor
ab10: 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69  y allocation fai
ab20: 6c 73 2c 20 74 68 65 20 70 50 61 72 73 65 2d 3e  ls, the pParse->
ab30: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
ab40: 20 66 6c 61 67 0a 2a 2a 20 69 73 20 73 65 74 2e   flag.** is set.
ab50: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
ab60: 45 78 70 72 4c 69 73 74 53 65 74 4e 61 6d 65 28  ExprListSetName(
ab70: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
ab80: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
ab90: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
aba0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
abb0: 73 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 4c 69  st,        /* Li
abc0: 73 74 20 74 6f 20 77 68 69 63 68 20 74 6f 20 61  st to which to a
abd0: 64 64 20 74 68 65 20 73 70 61 6e 2e 20 2a 2f 0a  dd the span. */.
abe0: 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20    Token *pName, 
abf0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
ac00: 65 20 74 6f 20 62 65 20 61 64 64 65 64 20 2a 2f  e to be added */
ac10: 0a 20 20 69 6e 74 20 64 65 71 75 6f 74 65 20 20  .  int dequote  
ac20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
ac30: 75 65 20 74 6f 20 63 61 75 73 65 20 74 68 65 20  ue to cause the 
ac40: 6e 61 6d 65 20 74 6f 20 62 65 20 64 65 71 75 6f  name to be dequo
ac50: 74 65 64 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65  ted */.){.  asse
ac60: 72 74 28 20 70 4c 69 73 74 21 3d 30 20 7c 7c 20  rt( pList!=0 || 
ac70: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
ac80: 6f 63 46 61 69 6c 65 64 21 3d 30 20 29 3b 0a 20  ocFailed!=0 );. 
ac90: 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20   if( pList ){.  
aca0: 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
acb0: 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
acc0: 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74     assert( pList
acd0: 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20 20  ->nExpr>0 );.   
ace0: 20 70 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d   pItem = &pList-
acf0: 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d  >a[pList->nExpr-
ad00: 31 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  1];.    assert( 
ad10: 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20  pItem->zName==0 
ad20: 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 4e  );.    pItem->zN
ad30: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ame = sqlite3DbS
ad40: 74 72 4e 44 75 70 28 70 50 61 72 73 65 2d 3e 64  trNDup(pParse->d
ad50: 62 2c 20 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61  b, pName->z, pNa
ad60: 6d 65 2d 3e 6e 29 3b 0a 20 20 20 20 69 66 28 20  me->n);.    if( 
ad70: 64 65 71 75 6f 74 65 20 29 20 73 71 6c 69 74 65  dequote ) sqlite
ad80: 33 44 65 71 75 6f 74 65 28 70 49 74 65 6d 2d 3e  3Dequote(pItem->
ad90: 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  zName);.  }.}../
ada0: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 45 78 70  *.** Set the Exp
adb0: 72 4c 69 73 74 2e 61 5b 5d 2e 7a 53 70 61 6e 20  rList.a[].zSpan 
adc0: 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 6d  element of the m
add0: 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64  ost recently add
ade0: 65 64 20 69 74 65 6d 0a 2a 2a 20 6f 6e 20 74 68  ed item.** on th
adf0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  e expression lis
ae00: 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20 6d  t..**.** pList m
ae10: 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 66 6f 6c  ight be NULL fol
ae20: 6c 6f 77 69 6e 67 20 61 6e 20 4f 4f 4d 20 65 72  lowing an OOM er
ae30: 72 6f 72 2e 20 20 42 75 74 20 70 53 70 61 6e 20  ror.  But pSpan 
ae40: 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 62 65 0a  should never be.
ae50: 2a 2a 20 4e 55 4c 4c 2e 20 20 49 66 20 61 20 6d  ** NULL.  If a m
ae60: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
ae70: 20 66 61 69 6c 73 2c 20 74 68 65 20 70 50 61 72   fails, the pPar
ae80: 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
ae90: 69 6c 65 64 20 66 6c 61 67 0a 2a 2a 20 69 73 20  iled flag.** is 
aea0: 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  set..*/.void sql
aeb0: 69 74 65 33 45 78 70 72 4c 69 73 74 53 65 74 53  ite3ExprListSetS
aec0: 70 61 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50  pan(.  Parse *pP
aed0: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f  arse,          /
aee0: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
aef0: 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  t */.  ExprList 
af00: 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20 2f  *pList,        /
af10: 2a 20 4c 69 73 74 20 74 6f 20 77 68 69 63 68 20  * List to which 
af20: 74 6f 20 61 64 64 20 74 68 65 20 73 70 61 6e 2e  to add the span.
af30: 20 2a 2f 0a 20 20 45 78 70 72 53 70 61 6e 20 2a   */.  ExprSpan *
af40: 70 53 70 61 6e 20 20 20 20 20 20 20 20 20 2f 2a  pSpan         /*
af50: 20 54 68 65 20 73 70 61 6e 20 74 6f 20 62 65 20   The span to be 
af60: 61 64 64 65 64 20 2a 2f 0a 29 7b 0a 20 20 73 71  added */.){.  sq
af70: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
af80: 73 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74  se->db;.  assert
af90: 28 20 70 4c 69 73 74 21 3d 30 20 7c 7c 20 64 62  ( pList!=0 || db
afa0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 21 3d  ->mallocFailed!=
afb0: 30 20 29 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  0 );.  if( pList
afc0: 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45   ){.    struct E
afd0: 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
afe0: 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b  tem = &pList->a[
aff0: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 5d 3b  pList->nExpr-1];
b000: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69  .    assert( pLi
b010: 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20  st->nExpr>0 );. 
b020: 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d     assert( db->m
b030: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70  allocFailed || p
b040: 49 74 65 6d 2d 3e 70 45 78 70 72 3d 3d 70 53 70  Item->pExpr==pSp
b050: 61 6e 2d 3e 70 45 78 70 72 20 29 3b 0a 20 20 20  an->pExpr );.   
b060: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
b070: 62 2c 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 29  b, pItem->zSpan)
b080: 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 53 70  ;.    pItem->zSp
b090: 61 6e 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  an = sqlite3DbSt
b0a0: 72 4e 44 75 70 28 64 62 2c 20 28 63 68 61 72 2a  rNDup(db, (char*
b0b0: 29 70 53 70 61 6e 2d 3e 7a 53 74 61 72 74 2c 0a  )pSpan->zStart,.
b0c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b0d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b0e0: 20 20 20 20 28 69 6e 74 29 28 70 53 70 61 6e 2d      (int)(pSpan-
b0f0: 3e 7a 45 6e 64 20 2d 20 70 53 70 61 6e 2d 3e 7a  >zEnd - pSpan->z
b100: 53 74 61 72 74 29 29 3b 0a 20 20 7d 0a 7d 0a 0a  Start));.  }.}..
b110: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70  /*.** If the exp
b120: 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 70 45 4c  ression list pEL
b130: 69 73 74 20 63 6f 6e 74 61 69 6e 73 20 6d 6f 72  ist contains mor
b140: 65 20 74 68 61 6e 20 69 4c 69 6d 69 74 20 65 6c  e than iLimit el
b150: 65 6d 65 6e 74 73 2c 0a 2a 2a 20 6c 65 61 76 65  ements,.** leave
b160: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
b170: 65 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a  e in pParse..*/.
b180: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
b190: 4c 69 73 74 43 68 65 63 6b 4c 65 6e 67 74 68 28  ListCheckLength(
b1a0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
b1b0: 2c 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  ,.  ExprList *pE
b1c0: 4c 69 73 74 2c 0a 20 20 63 6f 6e 73 74 20 63 68  List,.  const ch
b1d0: 61 72 20 2a 7a 4f 62 6a 65 63 74 0a 29 7b 0a 20  ar *zObject.){. 
b1e0: 20 69 6e 74 20 6d 78 20 3d 20 70 50 61 72 73 65   int mx = pParse
b1f0: 2d 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c  ->db->aLimit[SQL
b200: 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e  ITE_LIMIT_COLUMN
b210: 5d 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  ];.  testcase( p
b220: 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d  EList && pEList-
b230: 3e 6e 45 78 70 72 3d 3d 6d 78 20 29 3b 0a 20 20  >nExpr==mx );.  
b240: 74 65 73 74 63 61 73 65 28 20 70 45 4c 69 73 74  testcase( pEList
b250: 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70   && pEList->nExp
b260: 72 3d 3d 6d 78 2b 31 20 29 3b 0a 20 20 69 66 28  r==mx+1 );.  if(
b270: 20 70 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73   pEList && pELis
b280: 74 2d 3e 6e 45 78 70 72 3e 6d 78 20 29 7b 0a 20  t->nExpr>mx ){. 
b290: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
b2a0: 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20  sg(pParse, "too 
b2b0: 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  many columns in 
b2c0: 25 73 22 2c 20 7a 4f 62 6a 65 63 74 29 3b 0a 20  %s", zObject);. 
b2d0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65   }.}../*.** Dele
b2e0: 74 65 20 61 6e 20 65 6e 74 69 72 65 20 65 78 70  te an entire exp
b2f0: 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2f  ression list..*/
b300: 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e  .static SQLITE_N
b310: 4f 49 4e 4c 49 4e 45 20 76 6f 69 64 20 65 78 70  OINLINE void exp
b320: 72 4c 69 73 74 44 65 6c 65 74 65 4e 4e 28 73 71  rListDeleteNN(sq
b330: 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72 4c  lite3 *db, ExprL
b340: 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69  ist *pList){.  i
b350: 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 45  nt i;.  struct E
b360: 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
b370: 74 65 6d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  tem;.  assert( p
b380: 4c 69 73 74 2d 3e 61 21 3d 30 20 7c 7c 20 70 4c  List->a!=0 || pL
b390: 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 30 20 29 3b  ist->nExpr==0 );
b3a0: 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69  .  for(pItem=pLi
b3b0: 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70 4c  st->a, i=0; i<pL
b3c0: 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c  ist->nExpr; i++,
b3d0: 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 73   pItem++){.    s
b3e0: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
b3f0: 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70  (db, pItem->pExp
b400: 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  r);.    sqlite3D
b410: 62 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d  bFree(db, pItem-
b420: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c  >zName);.    sql
b430: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
b440: 49 74 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a 20 20  Item->zSpan);.  
b450: 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  }.  sqlite3DbFre
b460: 65 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61 29 3b  e(db, pList->a);
b470: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
b480: 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a 76  (db, pList);.}.v
b490: 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 4c  oid sqlite3ExprL
b4a0: 69 73 74 44 65 6c 65 74 65 28 73 71 6c 69 74 65  istDelete(sqlite
b4b0: 33 20 2a 64 62 2c 20 45 78 70 72 4c 69 73 74 20  3 *db, ExprList 
b4c0: 2a 70 4c 69 73 74 29 7b 0a 20 20 69 66 28 20 70  *pList){.  if( p
b4d0: 4c 69 73 74 20 29 20 65 78 70 72 4c 69 73 74 44  List ) exprListD
b4e0: 65 6c 65 74 65 4e 4e 28 64 62 2c 20 70 4c 69 73  eleteNN(db, pLis
b4f0: 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  t);.}../*.** Ret
b500: 75 72 6e 20 74 68 65 20 62 69 74 77 69 73 65 2d  urn the bitwise-
b510: 4f 52 20 6f 66 20 61 6c 6c 20 45 78 70 72 2e 66  OR of all Expr.f
b520: 6c 61 67 73 20 66 69 65 6c 64 73 20 69 6e 20 74  lags fields in t
b530: 68 65 20 67 69 76 65 6e 0a 2a 2a 20 45 78 70 72  he given.** Expr
b540: 4c 69 73 74 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c  List..*/.u32 sql
b550: 69 74 65 33 45 78 70 72 4c 69 73 74 46 6c 61 67  ite3ExprListFlag
b560: 73 28 63 6f 6e 73 74 20 45 78 70 72 4c 69 73 74  s(const ExprList
b570: 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20   *pList){.  int 
b580: 69 3b 0a 20 20 75 33 32 20 6d 20 3d 20 30 3b 0a  i;.  u32 m = 0;.
b590: 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20    if( pList ){. 
b5a0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c     for(i=0; i<pL
b5b0: 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
b5c0: 7b 0a 20 20 20 20 20 20 20 45 78 70 72 20 2a 70  {.       Expr *p
b5d0: 45 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e 61 5b  Expr = pList->a[
b5e0: 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  i].pExpr;.      
b5f0: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 21 3d   assert( pExpr!=
b600: 30 20 29 3b 0a 20 20 20 20 20 20 20 6d 20 7c 3d  0 );.       m |=
b610: 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 3b 0a 20   pExpr->flags;. 
b620: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
b630: 6e 20 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  n m;.}../*.** Th
b640: 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65  ese routines are
b650: 20 57 61 6c 6b 65 72 20 63 61 6c 6c 62 61 63 6b   Walker callback
b660: 73 20 75 73 65 64 20 74 6f 20 63 68 65 63 6b 20  s used to check 
b670: 65 78 70 72 65 73 73 69 6f 6e 73 20 74 6f 0a 2a  expressions to.*
b680: 2a 20 73 65 65 20 69 66 20 74 68 65 79 20 61 72  * see if they ar
b690: 65 20 22 63 6f 6e 73 74 61 6e 74 22 20 66 6f 72  e "constant" for
b6a0: 20 73 6f 6d 65 20 64 65 66 69 6e 69 74 69 6f 6e   some definition
b6b0: 20 6f 66 20 63 6f 6e 73 74 61 6e 74 2e 20 20 54   of constant.  T
b6c0: 68 65 0a 2a 2a 20 57 61 6c 6b 65 72 2e 65 43 6f  he.** Walker.eCo
b6d0: 64 65 20 76 61 6c 75 65 20 64 65 74 65 72 6d 69  de value determi
b6e0: 6e 65 73 20 74 68 65 20 74 79 70 65 20 6f 66 20  nes the type of 
b6f0: 22 63 6f 6e 73 74 61 6e 74 22 20 77 65 20 61 72  "constant" we ar
b700: 65 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20 66 6f 72  e looking.** for
b710: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 63 61  ..**.** These ca
b720: 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 73 20  llback routines 
b730: 61 72 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c  are used to impl
b740: 65 6d 65 6e 74 20 74 68 65 20 66 6f 6c 6c 6f 77  ement the follow
b750: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 73  ing:.**.**     s
b760: 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
b770: 74 61 6e 74 28 29 20 20 20 20 20 20 20 20 20 20  tant()          
b780: 20 20 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d          pWalker-
b790: 3e 65 43 6f 64 65 3d 3d 31 0a 2a 2a 20 20 20 20  >eCode==1.**    
b7a0: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
b7b0: 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 29 20  nstantNotJoin() 
b7c0: 20 20 20 20 20 20 20 20 20 20 70 57 61 6c 6b 65            pWalke
b7d0: 72 2d 3e 65 43 6f 64 65 3d 3d 32 0a 2a 2a 20 20  r->eCode==2.**  
b7e0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 73     sqlite3ExprIs
b7f0: 54 61 62 6c 65 43 6f 6e 73 74 61 6e 74 28 29 20  TableConstant() 
b800: 20 20 20 20 20 20 20 20 20 20 20 20 70 57 61 6c              pWal
b810: 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 33 0a 2a 2a  ker->eCode==3.**
b820: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
b830: 49 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63  IsConstantOrFunc
b840: 74 69 6f 6e 28 29 20 20 20 20 20 20 20 20 70 57  tion()        pW
b850: 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 34 20  alker->eCode==4 
b860: 6f 72 20 35 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6c  or 5.**.** In al
b870: 6c 20 63 61 73 65 73 2c 20 74 68 65 20 63 61 6c  l cases, the cal
b880: 6c 62 61 63 6b 73 20 73 65 74 20 57 61 6c 6b 65  lbacks set Walke
b890: 72 2e 65 43 6f 64 65 3d 30 20 61 6e 64 20 61 62  r.eCode=0 and ab
b8a0: 6f 72 74 20 69 66 20 74 68 65 20 65 78 70 72 65  ort if the expre
b8b0: 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 66 6f 75 6e  ssion.** is foun
b8c0: 64 20 74 6f 20 6e 6f 74 20 62 65 20 61 20 63 6f  d to not be a co
b8d0: 6e 73 74 61 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  nstant..**.** Th
b8e0: 65 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43  e sqlite3ExprIsC
b8f0: 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f  onstantOrFunctio
b900: 6e 28 29 20 69 73 20 75 73 65 64 20 66 6f 72 20  n() is used for 
b910: 65 76 61 6c 75 61 74 69 6e 67 20 65 78 70 72 65  evaluating expre
b920: 73 73 69 6f 6e 73 0a 2a 2a 20 69 6e 20 61 20 43  ssions.** in a C
b930: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
b940: 65 6d 65 6e 74 2e 20 20 54 68 65 20 57 61 6c 6b  ement.  The Walk
b950: 65 72 2e 65 43 6f 64 65 20 76 61 6c 75 65 20 69  er.eCode value i
b960: 73 20 35 20 77 68 65 6e 20 70 61 72 73 69 6e 67  s 5 when parsing
b970: 0a 2a 2a 20 61 6e 20 65 78 69 73 74 69 6e 67 20  .** an existing 
b980: 73 63 68 65 6d 61 20 61 6e 64 20 34 20 77 68 65  schema and 4 whe
b990: 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 61 20 6e  n processing a n
b9a0: 65 77 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 41  ew statement.  A
b9b0: 20 62 6f 75 6e 64 0a 2a 2a 20 70 61 72 61 6d 65   bound.** parame
b9c0: 74 65 72 20 72 61 69 73 65 73 20 61 6e 20 65 72  ter raises an er
b9d0: 72 6f 72 20 66 6f 72 20 6e 65 77 20 73 74 61 74  ror for new stat
b9e0: 65 6d 65 6e 74 73 2c 20 62 75 74 20 69 73 20 73  ements, but is s
b9f0: 69 6c 65 6e 74 6c 79 20 63 6f 6e 76 65 72 74 65  ilently converte
ba00: 64 0a 2a 2a 20 74 6f 20 4e 55 4c 4c 20 66 6f 72  d.** to NULL for
ba10: 20 65 78 69 73 74 69 6e 67 20 73 63 68 65 6d 61   existing schema
ba20: 73 2e 20 20 54 68 69 73 20 61 6c 6c 6f 77 73 20  s.  This allows 
ba30: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
ba40: 62 6c 65 73 20 74 68 61 74 20 0a 2a 2a 20 63 6f  bles that .** co
ba50: 6e 74 61 69 6e 20 61 20 62 6f 75 6e 64 20 70 61  ntain a bound pa
ba60: 72 61 6d 65 74 65 72 20 62 65 63 61 75 73 65 20  rameter because 
ba70: 74 68 65 79 20 77 65 72 65 20 67 65 6e 65 72 61  they were genera
ba80: 74 65 64 20 62 79 20 6f 6c 64 65 72 20 76 65 72  ted by older ver
ba90: 73 69 6f 6e 73 0a 2a 2a 20 6f 66 20 53 51 4c 69  sions.** of SQLi
baa0: 74 65 20 74 6f 20 62 65 20 70 61 72 73 65 64 20  te to be parsed 
bab0: 62 79 20 6e 65 77 65 72 20 76 65 72 73 69 6f 6e  by newer version
bac0: 73 20 6f 66 20 53 51 4c 69 74 65 20 77 69 74 68  s of SQLite with
bad0: 6f 75 74 20 72 61 69 73 69 6e 67 20 61 0a 2a 2a  out raising a.**
bae0: 20 6d 61 6c 66 6f 72 6d 65 64 20 73 63 68 65 6d   malformed schem
baf0: 61 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74  a error..*/.stat
bb00: 69 63 20 69 6e 74 20 65 78 70 72 4e 6f 64 65 49  ic int exprNodeI
bb10: 73 43 6f 6e 73 74 61 6e 74 28 57 61 6c 6b 65 72  sConstant(Walker
bb20: 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20   *pWalker, Expr 
bb30: 2a 70 45 78 70 72 29 7b 0a 0a 20 20 2f 2a 20 49  *pExpr){..  /* I
bb40: 66 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65  f pWalker->eCode
bb50: 20 69 73 20 32 20 74 68 65 6e 20 61 6e 79 20 74   is 2 then any t
bb60: 65 72 6d 20 6f 66 20 74 68 65 20 65 78 70 72 65  erm of the expre
bb70: 73 73 69 6f 6e 20 74 68 61 74 20 63 6f 6d 65 73  ssion that comes
bb80: 20 66 72 6f 6d 0a 20 20 2a 2a 20 74 68 65 20 4f   from.  ** the O
bb90: 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73  N or USING claus
bba0: 65 73 20 6f 66 20 61 20 6c 65 66 74 20 6a 6f 69  es of a left joi
bbb0: 6e 20 64 69 73 71 75 61 6c 69 66 69 65 73 20 74  n disqualifies t
bbc0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20  he expression.  
bbd0: 2a 2a 20 66 72 6f 6d 20 62 65 69 6e 67 20 63 6f  ** from being co
bbe0: 6e 73 69 64 65 72 65 64 20 63 6f 6e 73 74 61 6e  nsidered constan
bbf0: 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 57 61 6c  t. */.  if( pWal
bc00: 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 32 20 26 26  ker->eCode==2 &&
bc10: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
bc20: 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a  (pExpr, EP_FromJ
bc30: 6f 69 6e 29 20 29 7b 0a 20 20 20 20 70 57 61 6c  oin) ){.    pWal
bc40: 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20 30 3b 0a  ker->eCode = 0;.
bc50: 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41      return WRC_A
bc60: 62 6f 72 74 3b 0a 20 20 7d 0a 0a 20 20 73 77 69  bort;.  }..  swi
bc70: 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29  tch( pExpr->op )
bc80: 7b 0a 20 20 20 20 2f 2a 20 43 6f 6e 73 69 64 65  {.    /* Conside
bc90: 72 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20 62  r functions to b
bca0: 65 20 63 6f 6e 73 74 61 6e 74 20 69 66 20 61 6c  e constant if al
bcb0: 6c 20 74 68 65 69 72 20 61 72 67 75 6d 65 6e 74  l their argument
bcc0: 73 20 61 72 65 20 63 6f 6e 73 74 61 6e 74 0a 20  s are constant. 
bcd0: 20 20 20 2a 2a 20 61 6e 64 20 65 69 74 68 65 72     ** and either
bce0: 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d   pWalker->eCode=
bcf0: 3d 34 20 6f 72 20 35 20 6f 72 20 74 68 65 20 66  =4 or 5 or the f
bd00: 75 6e 63 74 69 6f 6e 20 68 61 73 20 74 68 65 0a  unction has the.
bd10: 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 46 55      ** SQLITE_FU
bd20: 4e 43 5f 43 4f 4e 53 54 20 66 6c 61 67 2e 20 2a  NC_CONST flag. *
bd30: 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55  /.    case TK_FU
bd40: 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 20 20 69 66  NCTION:.      if
bd50: 28 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65  ( pWalker->eCode
bd60: 3e 3d 34 20 7c 7c 20 45 78 70 72 48 61 73 50 72  >=4 || ExprHasPr
bd70: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 45 50 5f  operty(pExpr,EP_
bd80: 43 6f 6e 73 74 46 75 6e 63 29 20 29 7b 0a 20 20  ConstFunc) ){.  
bd90: 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
bda0: 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20  _Continue;.     
bdb0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
bdc0: 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d  pWalker->eCode =
bdd0: 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75   0;.        retu
bde0: 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
bdf0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
be00: 4b 5f 49 44 3a 0a 20 20 20 20 63 61 73 65 20 54  K_ID:.    case T
be10: 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61  K_COLUMN:.    ca
be20: 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49  se TK_AGG_FUNCTI
be30: 4f 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ON:.    case TK_
be40: 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20  AGG_COLUMN:.    
be50: 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
be60: 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 3b 0a  r->op==TK_ID );.
be70: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
be80: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  pExpr->op==TK_CO
be90: 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 74 65  LUMN );.      te
bea0: 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
beb0: 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49  p==TK_AGG_FUNCTI
bec0: 4f 4e 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ON );.      test
bed0: 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
bee0: 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29  =TK_AGG_COLUMN )
bef0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57 61 6c  ;.      if( pWal
bf00: 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 33 20 26 26  ker->eCode==3 &&
bf10: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d   pExpr->iTable==
bf20: 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 43 75 72 20  pWalker->u.iCur 
bf30: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
bf40: 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
bf50: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
bf60: 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43       pWalker->eC
bf70: 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ode = 0;.       
bf80: 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
bf90: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 63  t;.      }.    c
bfa0: 61 73 65 20 54 4b 5f 56 41 52 49 41 42 4c 45 3a  ase TK_VARIABLE:
bfb0: 0a 20 20 20 20 20 20 69 66 28 20 70 57 61 6c 6b  .      if( pWalk
bfc0: 65 72 2d 3e 65 43 6f 64 65 3d 3d 35 20 29 7b 0a  er->eCode==5 ){.
bfd0: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 6c 65 6e          /* Silen
bfe0: 74 6c 79 20 63 6f 6e 76 65 72 74 20 62 6f 75 6e  tly convert boun
bff0: 64 20 70 61 72 61 6d 65 74 65 72 73 20 74 68 61  d parameters tha
c000: 74 20 61 70 70 65 61 72 20 69 6e 73 69 64 65 20  t appear inside 
c010: 6f 66 20 43 52 45 41 54 45 0a 20 20 20 20 20 20  of CREATE.      
c020: 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 20    ** statements 
c030: 69 6e 74 6f 20 61 20 4e 55 4c 4c 20 77 68 65 6e  into a NULL when
c040: 20 70 61 72 73 69 6e 67 20 74 68 65 20 43 52 45   parsing the CRE
c050: 41 54 45 20 73 74 61 74 65 6d 65 6e 74 20 74 65  ATE statement te
c060: 78 74 20 6f 75 74 0a 20 20 20 20 20 20 20 20 2a  xt out.        *
c070: 2a 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 5f  * of the sqlite_
c080: 6d 61 73 74 65 72 20 74 61 62 6c 65 20 2a 2f 0a  master table */.
c090: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f          pExpr->o
c0a0: 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20  p = TK_NULL;.   
c0b0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 57 61     }else if( pWa
c0c0: 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 34 20 29  lker->eCode==4 )
c0d0: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 20 62  {.        /* A b
c0e0: 6f 75 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69  ound parameter i
c0f0: 6e 20 61 20 43 52 45 41 54 45 20 73 74 61 74 65  n a CREATE state
c100: 6d 65 6e 74 20 74 68 61 74 20 6f 72 69 67 69 6e  ment that origin
c110: 61 74 65 73 20 66 72 6f 6d 0a 20 20 20 20 20 20  ates from.      
c120: 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 70 72 65    ** sqlite3_pre
c130: 70 61 72 65 28 29 20 63 61 75 73 65 73 20 61 6e  pare() causes an
c140: 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20   error */.      
c150: 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65    pWalker->eCode
c160: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65   = 0;.        re
c170: 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
c180: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a        }.      /*
c190: 20 46 61 6c 6c 20 74 68 72 6f 75 67 68 20 2a 2f   Fall through */
c1a0: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20  .    default:.  
c1b0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
c1c0: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45  xpr->op==TK_SELE
c1d0: 43 54 20 29 3b 20 2f 2a 20 73 65 6c 65 63 74 4e  CT ); /* selectN
c1e0: 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 20 77 69  odeIsConstant wi
c1f0: 6c 6c 20 64 69 73 61 6c 6c 6f 77 20 2a 2f 0a 20  ll disallow */. 
c200: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
c210: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 49  Expr->op==TK_EXI
c220: 53 54 53 20 29 3b 20 2f 2a 20 73 65 6c 65 63 74  STS ); /* select
c230: 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 20 77  NodeIsConstant w
c240: 69 6c 6c 20 64 69 73 61 6c 6c 6f 77 20 2a 2f 0a  ill disallow */.
c250: 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
c260: 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 7d 0a 7d  _Continue;.  }.}
c270: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 6c 65  .static int sele
c280: 63 74 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74  ctNodeIsConstant
c290: 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72  (Walker *pWalker
c2a0: 2c 20 53 65 6c 65 63 74 20 2a 4e 6f 74 55 73 65  , Select *NotUse
c2b0: 64 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  d){.  UNUSED_PAR
c2c0: 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b  AMETER(NotUsed);
c2d0: 0a 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64  .  pWalker->eCod
c2e0: 65 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  e = 0;.  return 
c2f0: 57 52 43 5f 41 62 6f 72 74 3b 0a 7d 0a 73 74 61  WRC_Abort;.}.sta
c300: 74 69 63 20 69 6e 74 20 65 78 70 72 49 73 43 6f  tic int exprIsCo
c310: 6e 73 74 28 45 78 70 72 20 2a 70 2c 20 69 6e 74  nst(Expr *p, int
c320: 20 69 6e 69 74 46 6c 61 67 2c 20 69 6e 74 20 69   initFlag, int i
c330: 43 75 72 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77  Cur){.  Walker w
c340: 3b 0a 20 20 6d 65 6d 73 65 74 28 26 77 2c 20 30  ;.  memset(&w, 0
c350: 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20  , sizeof(w));.  
c360: 77 2e 65 43 6f 64 65 20 3d 20 69 6e 69 74 46 6c  w.eCode = initFl
c370: 61 67 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c  ag;.  w.xExprCal
c380: 6c 62 61 63 6b 20 3d 20 65 78 70 72 4e 6f 64 65  lback = exprNode
c390: 49 73 43 6f 6e 73 74 61 6e 74 3b 0a 20 20 77 2e  IsConstant;.  w.
c3a0: 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20  xSelectCallback 
c3b0: 3d 20 73 65 6c 65 63 74 4e 6f 64 65 49 73 43 6f  = selectNodeIsCo
c3c0: 6e 73 74 61 6e 74 3b 0a 20 20 77 2e 75 2e 69 43  nstant;.  w.u.iC
c3d0: 75 72 20 3d 20 69 43 75 72 3b 0a 20 20 73 71 6c  ur = iCur;.  sql
c3e0: 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77 2c  ite3WalkExpr(&w,
c3f0: 20 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 77 2e   p);.  return w.
c400: 65 43 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  eCode;.}../*.** 
c410: 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69  Walk an expressi
c420: 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e  on tree.  Return
c430: 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65   non-zero if the
c440: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63   expression is c
c450: 6f 6e 73 74 61 6e 74 0a 2a 2a 20 61 6e 64 20 30  onstant.** and 0
c460: 20 69 66 20 69 74 20 69 6e 76 6f 6c 76 65 73 20   if it involves 
c470: 76 61 72 69 61 62 6c 65 73 20 6f 72 20 66 75 6e  variables or fun
c480: 63 74 69 6f 6e 20 63 61 6c 6c 73 2e 0a 2a 2a 0a  ction calls..**.
c490: 2a 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f  ** For the purpo
c4a0: 73 65 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63  ses of this func
c4b0: 74 69 6f 6e 2c 20 61 20 64 6f 75 62 6c 65 2d 71  tion, a double-q
c4c0: 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65 78  uoted string (ex
c4d0: 3a 20 22 61 62 63 22 29 0a 2a 2a 20 69 73 20 63  : "abc").** is c
c4e0: 6f 6e 73 69 64 65 72 65 64 20 61 20 76 61 72 69  onsidered a vari
c4f0: 61 62 6c 65 20 62 75 74 20 61 20 73 69 6e 67 6c  able but a singl
c500: 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20  e-quoted string 
c510: 28 65 78 3a 20 27 61 62 63 27 29 20 69 73 0a 2a  (ex: 'abc') is.*
c520: 2a 20 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f  * a constant..*/
c530: 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
c540: 49 73 43 6f 6e 73 74 61 6e 74 28 45 78 70 72 20  IsConstant(Expr 
c550: 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 65 78  *p){.  return ex
c560: 70 72 49 73 43 6f 6e 73 74 28 70 2c 20 31 2c 20  prIsConst(p, 1, 
c570: 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c  0);.}../*.** Wal
c580: 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  k an expression 
c590: 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20 6e 6f  tree.  Return no
c5a0: 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 65 78  n-zero if the ex
c5b0: 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73  pression is cons
c5c0: 74 61 6e 74 0a 2a 2a 20 74 68 61 74 20 64 6f 65  tant.** that doe
c5d0: 73 20 6e 6f 20 6f 72 69 67 69 6e 61 74 65 20 66  s no originate f
c5e0: 72 6f 6d 20 74 68 65 20 4f 4e 20 6f 72 20 55 53  rom the ON or US
c5f0: 49 4e 47 20 63 6c 61 75 73 65 73 20 6f 66 20 61  ING clauses of a
c600: 20 6a 6f 69 6e 2e 0a 2a 2a 20 52 65 74 75 72 6e   join..** Return
c610: 20 30 20 69 66 20 69 74 20 69 6e 76 6f 6c 76 65   0 if it involve
c620: 73 20 76 61 72 69 61 62 6c 65 73 20 6f 72 20 66  s variables or f
c630: 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 73 20 6f 72  unction calls or
c640: 20 74 65 72 6d 73 20 66 72 6f 6d 0a 2a 2a 20 61   terms from.** a
c650: 6e 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c  n ON or USING cl
c660: 61 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ause..*/.int sql
c670: 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
c680: 6e 74 4e 6f 74 4a 6f 69 6e 28 45 78 70 72 20 2a  ntNotJoin(Expr *
c690: 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 65 78 70  p){.  return exp
c6a0: 72 49 73 43 6f 6e 73 74 28 70 2c 20 32 2c 20 30  rIsConst(p, 2, 0
c6b0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b  );.}../*.** Walk
c6c0: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74   an expression t
c6d0: 72 65 65 2e 20 20 52 65 74 75 72 6e 20 6e 6f 6e  ree.  Return non
c6e0: 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 65 78 70  -zero if the exp
c6f0: 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74  ression is const
c700: 61 6e 74 0a 2a 2a 20 66 6f 72 20 61 6e 79 20 73  ant.** for any s
c710: 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 74 68 65  ingle row of the
c720: 20 74 61 62 6c 65 20 77 69 74 68 20 63 75 72 73   table with curs
c730: 6f 72 20 69 43 75 72 2e 20 20 49 6e 20 6f 74 68  or iCur.  In oth
c740: 65 72 20 77 6f 72 64 73 2c 20 74 68 65 0a 2a 2a  er words, the.**
c750: 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 75 73 74   expression must
c760: 20 6e 6f 74 20 72 65 66 65 72 20 74 6f 20 61 6e   not refer to an
c770: 79 20 6e 6f 6e 2d 64 65 74 65 72 6d 69 6e 69 73  y non-determinis
c780: 74 69 63 20 66 75 6e 63 74 69 6f 6e 20 6e 6f 72  tic function nor
c790: 20 61 6e 79 0a 2a 2a 20 74 61 62 6c 65 20 6f 74   any.** table ot
c7a0: 68 65 72 20 74 68 61 6e 20 69 43 75 72 2e 0a 2a  her than iCur..*
c7b0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
c7c0: 72 49 73 54 61 62 6c 65 43 6f 6e 73 74 61 6e 74  rIsTableConstant
c7d0: 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 69 43  (Expr *p, int iC
c7e0: 75 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 65 78  ur){.  return ex
c7f0: 70 72 49 73 43 6f 6e 73 74 28 70 2c 20 33 2c 20  prIsConst(p, 3, 
c800: 69 43 75 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  iCur);.}../*.** 
c810: 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69  Walk an expressi
c820: 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e  on tree.  Return
c830: 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65   non-zero if the
c840: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63   expression is c
c850: 6f 6e 73 74 61 6e 74 0a 2a 2a 20 6f 72 20 61 20  onstant.** or a 
c860: 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 77 69  function call wi
c870: 74 68 20 63 6f 6e 73 74 61 6e 74 20 61 72 67 75  th constant argu
c880: 6d 65 6e 74 73 2e 20 20 52 65 74 75 72 6e 20 61  ments.  Return a
c890: 6e 64 20 30 20 69 66 20 74 68 65 72 65 0a 2a 2a  nd 0 if there.**
c8a0: 20 61 72 65 20 61 6e 79 20 76 61 72 69 61 62 6c   are any variabl
c8b0: 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68  es..**.** For th
c8c0: 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68  e purposes of th
c8d0: 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20 64  is function, a d
c8e0: 6f 75 62 6c 65 2d 71 75 6f 74 65 64 20 73 74 72  ouble-quoted str
c8f0: 69 6e 67 20 28 65 78 3a 20 22 61 62 63 22 29 0a  ing (ex: "abc").
c900: 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64  ** is considered
c910: 20 61 20 76 61 72 69 61 62 6c 65 20 62 75 74 20   a variable but 
c920: 61 20 73 69 6e 67 6c 65 2d 71 75 6f 74 65 64 20  a single-quoted 
c930: 73 74 72 69 6e 67 20 28 65 78 3a 20 27 61 62 63  string (ex: 'abc
c940: 27 29 20 69 73 0a 2a 2a 20 61 20 63 6f 6e 73 74  ') is.** a const
c950: 61 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ant..*/.int sqli
c960: 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
c970: 74 4f 72 46 75 6e 63 74 69 6f 6e 28 45 78 70 72  tOrFunction(Expr
c980: 20 2a 70 2c 20 75 38 20 69 73 49 6e 69 74 29 7b   *p, u8 isInit){
c990: 0a 20 20 61 73 73 65 72 74 28 20 69 73 49 6e 69  .  assert( isIni
c9a0: 74 3d 3d 30 20 7c 7c 20 69 73 49 6e 69 74 3d 3d  t==0 || isInit==
c9b0: 31 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 65 78  1 );.  return ex
c9c0: 70 72 49 73 43 6f 6e 73 74 28 70 2c 20 34 2b 69  prIsConst(p, 4+i
c9d0: 73 49 6e 69 74 2c 20 30 29 3b 0a 7d 0a 0a 23 69  sInit, 0);.}..#i
c9e0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
c9f0: 4c 45 5f 43 55 52 53 4f 52 5f 48 49 4e 54 53 0a  LE_CURSOR_HINTS.
ca00: 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78  /*.** Walk an ex
ca10: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20  pression tree.  
ca20: 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20  Return 1 if the 
ca30: 65 78 70 72 65 73 73 69 6f 6e 20 63 6f 6e 74 61  expression conta
ca40: 69 6e 73 20 61 0a 2a 2a 20 73 75 62 71 75 65 72  ins a.** subquer
ca50: 79 20 6f 66 20 73 6f 6d 65 20 6b 69 6e 64 2e 20  y of some kind. 
ca60: 20 52 65 74 75 72 6e 20 30 20 69 66 20 74 68 65   Return 0 if the
ca70: 72 65 20 61 72 65 20 6e 6f 20 73 75 62 71 75 65  re are no subque
ca80: 72 69 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ries..*/.int sql
ca90: 69 74 65 33 45 78 70 72 43 6f 6e 74 61 69 6e 73  ite3ExprContains
caa0: 53 75 62 71 75 65 72 79 28 45 78 70 72 20 2a 70  Subquery(Expr *p
cab0: 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20  ){.  Walker w;. 
cac0: 20 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c 20 73   memset(&w, 0, s
cad0: 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20 77 2e 65  izeof(w));.  w.e
cae0: 43 6f 64 65 20 3d 20 31 3b 0a 20 20 77 2e 78 45  Code = 1;.  w.xE
caf0: 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 73 71  xprCallback = sq
cb00: 6c 69 74 65 33 45 78 70 72 57 61 6c 6b 4e 6f 6f  lite3ExprWalkNoo
cb10: 70 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61  p;.  w.xSelectCa
cb20: 6c 6c 62 61 63 6b 20 3d 20 73 65 6c 65 63 74 4e  llback = selectN
cb30: 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 3b 0a 20  odeIsConstant;. 
cb40: 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72   sqlite3WalkExpr
cb50: 28 26 77 2c 20 70 29 3b 0a 20 20 72 65 74 75 72  (&w, p);.  retur
cb60: 6e 20 77 2e 65 43 6f 64 65 3d 3d 30 3b 0a 7d 0a  n w.eCode==0;.}.
cb70: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66  #endif../*.** If
cb80: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
cb90: 70 20 63 6f 64 65 73 20 61 20 63 6f 6e 73 74 61  p codes a consta
cba0: 6e 74 20 69 6e 74 65 67 65 72 20 74 68 61 74 20  nt integer that 
cbb0: 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 0a  is small enough.
cbc0: 2a 2a 20 74 6f 20 66 69 74 20 69 6e 20 61 20 33  ** to fit in a 3
cbd0: 32 2d 62 69 74 20 69 6e 74 65 67 65 72 2c 20 72  2-bit integer, r
cbe0: 65 74 75 72 6e 20 31 20 61 6e 64 20 70 75 74 20  eturn 1 and put 
cbf0: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
cc00: 20 69 6e 74 65 67 65 72 0a 2a 2a 20 69 6e 20 2a   integer.** in *
cc10: 70 56 61 6c 75 65 2e 20 20 49 66 20 74 68 65 20  pValue.  If the 
cc20: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6e 6f  expression is no
cc30: 74 20 61 6e 20 69 6e 74 65 67 65 72 20 6f 72 20  t an integer or 
cc40: 69 66 20 69 74 20 69 73 20 74 6f 6f 20 62 69 67  if it is too big
cc50: 0a 2a 2a 20 74 6f 20 66 69 74 20 69 6e 20 61 20  .** to fit in a 
cc60: 73 69 67 6e 65 64 20 33 32 2d 62 69 74 20 69 6e  signed 32-bit in
cc70: 74 65 67 65 72 2c 20 72 65 74 75 72 6e 20 30 20  teger, return 0 
cc80: 61 6e 64 20 6c 65 61 76 65 20 2a 70 56 61 6c 75  and leave *pValu
cc90: 65 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a  e unchanged..*/.
cca0: 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 49  int sqlite3ExprI
ccb0: 73 49 6e 74 65 67 65 72 28 45 78 70 72 20 2a 70  sInteger(Expr *p
ccc0: 2c 20 69 6e 74 20 2a 70 56 61 6c 75 65 29 7b 0a  , int *pValue){.
ccd0: 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 0a 20    int rc = 0;.. 
cce0: 20 2f 2a 20 49 66 20 61 6e 20 65 78 70 72 65 73   /* If an expres
ccf0: 73 69 6f 6e 20 69 73 20 61 6e 20 69 6e 74 65 67  sion is an integ
cd00: 65 72 20 6c 69 74 65 72 61 6c 20 74 68 61 74 20  er literal that 
cd10: 66 69 74 73 20 69 6e 20 61 20 73 69 67 6e 65 64  fits in a signed
cd20: 20 33 32 2d 62 69 74 0a 20 20 2a 2a 20 69 6e 74   32-bit.  ** int
cd30: 65 67 65 72 2c 20 74 68 65 6e 20 74 68 65 20 45  eger, then the E
cd40: 50 5f 49 6e 74 56 61 6c 75 65 20 66 6c 61 67 20  P_IntValue flag 
cd50: 77 69 6c 6c 20 68 61 76 65 20 61 6c 72 65 61 64  will have alread
cd60: 79 20 62 65 65 6e 20 73 65 74 20 2a 2f 0a 20 20  y been set */.  
cd70: 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 21 3d 54  assert( p->op!=T
cd80: 4b 5f 49 4e 54 45 47 45 52 20 7c 7c 20 28 70 2d  K_INTEGER || (p-
cd90: 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e 74 56  >flags & EP_IntV
cda0: 61 6c 75 65 29 21 3d 30 0a 20 20 20 20 20 20 20  alue)!=0.       
cdb0: 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 47 65      || sqlite3Ge
cdc0: 74 49 6e 74 33 32 28 70 2d 3e 75 2e 7a 54 6f 6b  tInt32(p->u.zTok
cdd0: 65 6e 2c 20 26 72 63 29 3d 3d 30 20 29 3b 0a 0a  en, &rc)==0 );..
cde0: 20 20 69 66 28 20 70 2d 3e 66 6c 61 67 73 20 26    if( p->flags &
cdf0: 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 29 7b 0a   EP_IntValue ){.
ce00: 20 20 20 20 2a 70 56 61 6c 75 65 20 3d 20 70 2d      *pValue = p-
ce10: 3e 75 2e 69 56 61 6c 75 65 3b 0a 20 20 20 20 72  >u.iValue;.    r
ce20: 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 73  eturn 1;.  }.  s
ce30: 77 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a  witch( p->op ){.
ce40: 20 20 20 20 63 61 73 65 20 54 4b 5f 55 50 4c 55      case TK_UPLU
ce50: 53 3a 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  S: {.      rc = 
ce60: 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74  sqlite3ExprIsInt
ce70: 65 67 65 72 28 70 2d 3e 70 4c 65 66 74 2c 20 70  eger(p->pLeft, p
ce80: 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 62 72  Value);.      br
ce90: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
cea0: 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b  ase TK_UMINUS: {
ceb0: 0a 20 20 20 20 20 20 69 6e 74 20 76 3b 0a 20 20  .      int v;.  
cec0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
ced0: 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 2d 3e  xprIsInteger(p->
cee0: 70 4c 65 66 74 2c 20 26 76 29 20 29 7b 0a 20 20  pLeft, &v) ){.  
cef0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 76 21        assert( v!
cf00: 3d 28 2d 32 31 34 37 34 38 33 36 34 37 2d 31 29  =(-2147483647-1)
cf10: 20 29 3b 0a 20 20 20 20 20 20 20 20 2a 70 56 61   );.        *pVa
cf20: 6c 75 65 20 3d 20 2d 76 3b 0a 20 20 20 20 20 20  lue = -v;.      
cf30: 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20    rc = 1;.      
cf40: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
cf50: 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74     }.    default
cf60: 3a 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72  : break;.  }.  r
cf70: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
cf80: 2a 2a 20 52 65 74 75 72 6e 20 46 41 4c 53 45 20  ** Return FALSE 
cf90: 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 63  if there is no c
cfa0: 68 61 6e 63 65 20 74 68 61 74 20 74 68 65 20 65  hance that the e
cfb0: 78 70 72 65 73 73 69 6f 6e 20 63 61 6e 20 62 65  xpression can be
cfc0: 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   NULL..**.** If 
cfd0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6d  the expression m
cfe0: 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 6f 72 20  ight be NULL or 
cff0: 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
d000: 6e 20 69 73 20 74 6f 6f 20 63 6f 6d 70 6c 65 78  n is too complex
d010: 0a 2a 2a 20 74 6f 20 74 65 6c 6c 20 72 65 74 75  .** to tell retu
d020: 72 6e 20 54 52 55 45 2e 20 20 0a 2a 2a 0a 2a 2a  rn TRUE.  .**.**
d030: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
d040: 20 75 73 65 64 20 61 73 20 61 6e 20 6f 70 74 69   used as an opti
d050: 6d 69 7a 61 74 69 6f 6e 2c 20 74 6f 20 73 6b 69  mization, to ski
d060: 70 20 4f 50 5f 49 73 4e 75 6c 6c 20 6f 70 63 6f  p OP_IsNull opco
d070: 64 65 73 0a 2a 2a 20 77 68 65 6e 20 77 65 20 6b  des.** when we k
d080: 6e 6f 77 20 74 68 61 74 20 61 20 76 61 6c 75 65  now that a value
d090: 20 63 61 6e 6e 6f 74 20 62 65 20 4e 55 4c 4c 2e   cannot be NULL.
d0a0: 20 20 48 65 6e 63 65 2c 20 61 20 66 61 6c 73 65    Hence, a false
d0b0: 20 70 6f 73 69 74 69 76 65 0a 2a 2a 20 28 72 65   positive.** (re
d0c0: 74 75 72 6e 69 6e 67 20 54 52 55 45 20 77 68 65  turning TRUE whe
d0d0: 6e 20 69 6e 20 66 61 63 74 20 74 68 65 20 65 78  n in fact the ex
d0e0: 70 72 65 73 73 69 6f 6e 20 63 61 6e 20 6e 65 76  pression can nev
d0f0: 65 72 20 62 65 20 4e 55 4c 4c 29 20 6d 69 67 68  er be NULL) migh
d100: 74 0a 2a 2a 20 62 65 20 61 20 73 6d 61 6c 6c 20  t.** be a small 
d110: 70 65 72 66 6f 72 6d 61 6e 63 65 20 68 69 74 20  performance hit 
d120: 62 75 74 20 69 73 20 6f 74 68 65 72 77 69 73 65  but is otherwise
d130: 20 68 61 72 6d 6c 65 73 73 2e 20 20 4f 6e 20 74   harmless.  On t
d140: 68 65 20 6f 74 68 65 72 0a 2a 2a 20 68 61 6e 64  he other.** hand
d150: 2c 20 61 20 66 61 6c 73 65 20 6e 65 67 61 74 69  , a false negati
d160: 76 65 20 28 72 65 74 75 72 6e 69 6e 67 20 46 41  ve (returning FA
d170: 4c 53 45 20 77 68 65 6e 20 74 68 65 20 72 65 73  LSE when the res
d180: 75 6c 74 20 63 6f 75 6c 64 20 62 65 20 4e 55 4c  ult could be NUL
d190: 4c 29 0a 2a 2a 20 77 69 6c 6c 20 6c 69 6b 65 6c  L).** will likel
d1a0: 79 20 72 65 73 75 6c 74 20 69 6e 20 61 6e 20 69  y result in an i
d1b0: 6e 63 6f 72 72 65 63 74 20 61 6e 73 77 65 72 2e  ncorrect answer.
d1c0: 20 20 53 6f 20 77 68 65 6e 20 69 6e 20 64 6f 75    So when in dou
d1d0: 62 74 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 54 52  bt, return.** TR
d1e0: 55 45 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  UE..*/.int sqlit
d1f0: 65 33 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28  e3ExprCanBeNull(
d200: 63 6f 6e 73 74 20 45 78 70 72 20 2a 70 29 7b 0a  const Expr *p){.
d210: 20 20 75 38 20 6f 70 3b 0a 20 20 77 68 69 6c 65    u8 op;.  while
d220: 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 50 4c 55  ( p->op==TK_UPLU
d230: 53 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55  S || p->op==TK_U
d240: 4d 49 4e 55 53 20 29 7b 20 70 20 3d 20 70 2d 3e  MINUS ){ p = p->
d250: 70 4c 65 66 74 3b 20 7d 0a 20 20 6f 70 20 3d 20  pLeft; }.  op = 
d260: 70 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d  p->op;.  if( op=
d270: 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29 20 6f  =TK_REGISTER ) o
d280: 70 20 3d 20 70 2d 3e 6f 70 32 3b 0a 20 20 73 77  p = p->op2;.  sw
d290: 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20  itch( op ){.    
d2a0: 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a  case TK_INTEGER:
d2b0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52  .    case TK_STR
d2c0: 49 4e 47 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  ING:.    case TK
d2d0: 5f 46 4c 4f 41 54 3a 0a 20 20 20 20 63 61 73 65  _FLOAT:.    case
d2e0: 20 54 4b 5f 42 4c 4f 42 3a 0a 20 20 20 20 20 20   TK_BLOB:.      
d2f0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 63 61  return 0;.    ca
d300: 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20 20  se TK_COLUMN:.  
d310: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
d320: 54 61 62 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  Tab!=0 );.      
d330: 72 65 74 75 72 6e 20 45 78 70 72 48 61 73 50 72  return ExprHasPr
d340: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 43 61 6e  operty(p, EP_Can
d350: 42 65 4e 75 6c 6c 29 20 7c 7c 0a 20 20 20 20 20  BeNull) ||.     
d360: 20 20 20 20 20 20 20 20 28 70 2d 3e 69 43 6f 6c          (p->iCol
d370: 75 6d 6e 3e 3d 30 20 26 26 20 70 2d 3e 70 54 61  umn>=0 && p->pTa
d380: 62 2d 3e 61 43 6f 6c 5b 70 2d 3e 69 43 6f 6c 75  b->aCol[p->iColu
d390: 6d 6e 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 29 3b  mn].notNull==0);
d3a0: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20  .    default:.  
d3b0: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
d3c0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  }.}../*.** Retur
d3d0: 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 67 69  n TRUE if the gi
d3e0: 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69  ven expression i
d3f0: 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 77 68 69  s a constant whi
d400: 63 68 20 77 6f 75 6c 64 20 62 65 0a 2a 2a 20 75  ch would be.** u
d410: 6e 63 68 61 6e 67 65 64 20 62 79 20 4f 50 5f 41  nchanged by OP_A
d420: 66 66 69 6e 69 74 79 20 77 69 74 68 20 74 68 65  ffinity with the
d430: 20 61 66 66 69 6e 69 74 79 20 67 69 76 65 6e 20   affinity given 
d440: 69 6e 20 74 68 65 20 73 65 63 6f 6e 64 0a 2a 2a  in the second.**
d450: 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a   argument..**.**
d460: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
d470: 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69   used to determi
d480: 6e 65 20 69 66 20 74 68 65 20 4f 50 5f 41 66 66  ne if the OP_Aff
d490: 69 6e 69 74 79 20 6f 70 65 72 61 74 69 6f 6e 0a  inity operation.
d4a0: 2a 2a 20 63 61 6e 20 62 65 20 6f 6d 69 74 74 65  ** can be omitte
d4b0: 64 2e 20 20 57 68 65 6e 20 69 6e 20 64 6f 75 62  d.  When in doub
d4c0: 74 20 72 65 74 75 72 6e 20 46 41 4c 53 45 2e 20  t return FALSE. 
d4d0: 20 41 20 66 61 6c 73 65 20 6e 65 67 61 74 69 76   A false negativ
d4e0: 65 0a 2a 2a 20 69 73 20 68 61 72 6d 6c 65 73 73  e.** is harmless
d4f0: 2e 20 20 41 20 66 61 6c 73 65 20 70 6f 73 69 74  .  A false posit
d500: 69 76 65 2c 20 68 6f 77 65 76 65 72 2c 20 63 61  ive, however, ca
d510: 6e 20 72 65 73 75 6c 74 20 69 6e 20 74 68 65 20  n result in the 
d520: 77 72 6f 6e 67 0a 2a 2a 20 61 6e 73 77 65 72 2e  wrong.** answer.
d530: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
d540: 78 70 72 4e 65 65 64 73 4e 6f 41 66 66 69 6e 69  xprNeedsNoAffini
d550: 74 79 43 68 61 6e 67 65 28 63 6f 6e 73 74 20 45  tyChange(const E
d560: 78 70 72 20 2a 70 2c 20 63 68 61 72 20 61 66 66  xpr *p, char aff
d570: 29 7b 0a 20 20 75 38 20 6f 70 3b 0a 20 20 69 66  ){.  u8 op;.  if
d580: 28 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46  ( aff==SQLITE_AF
d590: 46 5f 42 4c 4f 42 20 29 20 72 65 74 75 72 6e 20  F_BLOB ) return 
d5a0: 31 3b 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 6f  1;.  while( p->o
d5b0: 70 3d 3d 54 4b 5f 55 50 4c 55 53 20 7c 7c 20 70  p==TK_UPLUS || p
d5c0: 2d 3e 6f 70 3d 3d 54 4b 5f 55 4d 49 4e 55 53 20  ->op==TK_UMINUS 
d5d0: 29 7b 20 70 20 3d 20 70 2d 3e 70 4c 65 66 74 3b  ){ p = p->pLeft;
d5e0: 20 7d 0a 20 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b   }.  op = p->op;
d5f0: 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 52 45  .  if( op==TK_RE
d600: 47 49 53 54 45 52 20 29 20 6f 70 20 3d 20 70 2d  GISTER ) op = p-
d610: 3e 6f 70 32 3b 0a 20 20 73 77 69 74 63 68 28 20  >op2;.  switch( 
d620: 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
d630: 4b 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20  K_INTEGER: {.   
d640: 20 20 20 72 65 74 75 72 6e 20 61 66 66 3d 3d 53     return aff==S
d650: 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45  QLITE_AFF_INTEGE
d660: 52 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45  R || aff==SQLITE
d670: 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20  _AFF_NUMERIC;.  
d680: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
d690: 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20 72  FLOAT: {.      r
d6a0: 65 74 75 72 6e 20 61 66 66 3d 3d 53 51 4c 49 54  eturn aff==SQLIT
d6b0: 45 5f 41 46 46 5f 52 45 41 4c 20 7c 7c 20 61 66  E_AFF_REAL || af
d6c0: 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55  f==SQLITE_AFF_NU
d6d0: 4d 45 52 49 43 3b 0a 20 20 20 20 7d 0a 20 20 20  MERIC;.    }.   
d6e0: 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a   case TK_STRING:
d6f0: 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   {.      return 
d700: 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
d710: 54 45 58 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  TEXT;.    }.    
d720: 63 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 20 7b 0a  case TK_BLOB: {.
d730: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
d740: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
d750: 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20  K_COLUMN: {.    
d760: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 54 61    assert( p->iTa
d770: 62 6c 65 3e 3d 30 20 29 3b 20 20 2f 2a 20 70 20  ble>=0 );  /* p 
d780: 63 61 6e 6e 6f 74 20 62 65 20 70 61 72 74 20 6f  cannot be part o
d790: 66 20 61 20 43 48 45 43 4b 20 63 6f 6e 73 74 72  f a CHECK constr
d7a0: 61 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20 72 65  aint */.      re
d7b0: 74 75 72 6e 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3c  turn p->iColumn<
d7c0: 30 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 28  0.          && (
d7d0: 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
d7e0: 49 4e 54 45 47 45 52 20 7c 7c 20 61 66 66 3d 3d  INTEGER || aff==
d7f0: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
d800: 49 43 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64  IC);.    }.    d
d810: 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
d820: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
d830: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74    }.}../*.** Ret
d840: 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
d850: 67 69 76 65 6e 20 73 74 72 69 6e 67 20 69 73 20  given string is 
d860: 61 20 72 6f 77 2d 69 64 20 63 6f 6c 75 6d 6e 20  a row-id column 
d870: 6e 61 6d 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  name..*/.int sql
d880: 69 74 65 33 49 73 52 6f 77 69 64 28 63 6f 6e 73  ite3IsRowid(cons
d890: 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 66  t char *z){.  if
d8a0: 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
d8b0: 28 7a 2c 20 22 5f 52 4f 57 49 44 5f 22 29 3d 3d  (z, "_ROWID_")==
d8c0: 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
d8d0: 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
d8e0: 6d 70 28 7a 2c 20 22 52 4f 57 49 44 22 29 3d 3d  mp(z, "ROWID")==
d8f0: 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
d900: 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
d910: 6d 70 28 7a 2c 20 22 4f 49 44 22 29 3d 3d 30 20  mp(z, "OID")==0 
d920: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 72 65  ) return 1;.  re
d930: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
d940: 20 70 58 20 69 73 20 74 68 65 20 52 48 53 20 6f   pX is the RHS o
d950: 66 20 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72  f an IN operator
d960: 2e 20 20 49 66 20 70 58 20 69 73 20 61 20 53 45  .  If pX is a SE
d970: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 0a  LECT statement .
d980: 2a 2a 20 74 68 61 74 20 63 61 6e 20 62 65 20 73  ** that can be s
d990: 69 6d 70 6c 69 66 69 65 64 20 74 6f 20 61 20 64  implified to a d
d9a0: 69 72 65 63 74 20 74 61 62 6c 65 20 61 63 63 65  irect table acce
d9b0: 73 73 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 0a  ss, then return.
d9c0: 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ** a pointer to 
d9d0: 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
d9e0: 6d 65 6e 74 2e 20 20 49 66 20 70 58 20 69 73 20  ment.  If pX is 
d9f0: 6e 6f 74 20 61 20 53 45 4c 45 43 54 20 73 74 61  not a SELECT sta
da00: 74 65 6d 65 6e 74 2c 0a 2a 2a 20 6f 72 20 69 66  tement,.** or if
da10: 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
da20: 65 6d 65 6e 74 20 6e 65 65 64 73 20 74 6f 20 62  ement needs to b
da30: 65 20 6d 61 6e 69 66 65 73 74 65 64 20 69 6e 74  e manifested int
da40: 6f 20 61 20 74 72 61 6e 73 69 65 6e 74 0a 2a 2a  o a transient.**
da50: 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 72 65 74   table, then ret
da60: 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 20 0a 2a 2a  urn NULL..** .**
da70: 20 49 66 20 70 61 72 61 6d 65 74 65 72 20 62 4e   If parameter bN
da80: 75 6c 6c 53 65 6e 73 69 74 69 76 65 20 69 73 20  ullSensitive is 
da90: 30 2c 20 74 68 65 6e 20 74 68 69 73 20 6f 70 65  0, then this ope
daa0: 72 61 74 69 6f 6e 20 77 69 6c 6c 20 62 65 0a 2a  ration will be.*
dab0: 2a 20 75 73 65 64 20 69 6e 20 61 20 63 6f 6e 74  * used in a cont
dac0: 65 78 74 20 69 6e 20 77 68 69 63 68 20 74 68 65  ext in which the
dad0: 72 65 20 69 73 20 6e 6f 20 64 69 66 66 65 72 65  re is no differe
dae0: 6e 63 65 20 62 65 74 77 65 65 6e 20 61 20 72 65  nce between a re
daf0: 73 75 6c 74 0a 2a 2a 20 6f 66 20 30 20 61 6e 64  sult.** of 0 and
db00: 20 6f 6e 65 20 6f 66 20 4e 55 4c 4c 2e 20 46 6f   one of NULL. Fo
db10: 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a  r example:.**.**
db20: 20 20 20 20 20 2e 2e 2e 20 57 48 45 52 45 20 28       ... WHERE (
db30: 3f 2c 3f 29 20 49 4e 20 28 53 45 4c 45 43 54 20  ?,?) IN (SELECT 
db40: 2e 2e 2e 29 0a 2a 2a 0a 2a 2f 0a 23 69 66 6e 64  ...).**.*/.#ifnd
db50: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
db60: 55 42 51 55 45 52 59 0a 73 74 61 74 69 63 20 53  UBQUERY.static S
db70: 65 6c 65 63 74 20 2a 69 73 43 61 6e 64 69 64 61  elect *isCandida
db80: 74 65 46 6f 72 49 6e 4f 70 74 28 45 78 70 72 20  teForInOpt(Expr 
db90: 2a 70 58 2c 20 69 6e 74 20 62 4e 75 6c 6c 53 65  *pX, int bNullSe
dba0: 6e 73 69 74 69 76 65 29 7b 0a 20 20 53 65 6c 65  nsitive){.  Sele
dbb0: 63 74 20 2a 70 3b 0a 20 20 53 72 63 4c 69 73 74  ct *p;.  SrcList
dbc0: 20 2a 70 53 72 63 3b 0a 20 20 45 78 70 72 4c 69   *pSrc;.  ExprLi
dbd0: 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 54 61  st *pEList;.  Ta
dbe0: 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 69 6e 74  ble *pTab;.  int
dbf0: 20 69 3b 0a 20 20 69 66 28 20 21 45 78 70 72 48   i;.  if( !ExprH
dc00: 61 73 50 72 6f 70 65 72 74 79 28 70 58 2c 20 45  asProperty(pX, E
dc10: 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 20 72  P_xIsSelect) ) r
dc20: 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 4e 6f 74  eturn 0;  /* Not
dc30: 20 61 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20   a subquery */. 
dc40: 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
dc50: 65 72 74 79 28 70 58 2c 20 45 50 5f 56 61 72 53  erty(pX, EP_VarS
dc60: 65 6c 65 63 74 29 20 20 29 20 72 65 74 75 72 6e  elect)  ) return
dc70: 20 30 3b 20 20 2f 2a 20 43 6f 72 72 65 6c 61 74   0;  /* Correlat
dc80: 65 64 20 73 75 62 71 20 2a 2f 0a 20 20 70 20 3d  ed subq */.  p =
dc90: 20 70 58 2d 3e 78 2e 70 53 65 6c 65 63 74 3b 0a   pX->x.pSelect;.
dca0: 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20    if( p->pPrior 
dcb0: 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
dcc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20           /* Not 
dcd0: 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43  a compound SELEC
dce0: 54 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65  T */.  if( p->se
dcf0: 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73  lFlags & (SF_Dis
dd00: 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61  tinct|SF_Aggrega
dd10: 74 65 29 20 29 7b 0a 20 20 20 20 74 65 73 74 63  te) ){.    testc
dd20: 61 73 65 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67  ase( (p->selFlag
dd30: 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74  s & (SF_Distinct
dd40: 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29 29 3d  |SF_Aggregate))=
dd50: 3d 53 46 5f 44 69 73 74 69 6e 63 74 20 29 3b 0a  =SF_Distinct );.
dd60: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28 70      testcase( (p
dd70: 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46  ->selFlags & (SF
dd80: 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67  _Distinct|SF_Agg
dd90: 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 41 67 67  regate))==SF_Agg
dda0: 72 65 67 61 74 65 20 29 3b 0a 20 20 20 20 72 65  regate );.    re
ddb0: 74 75 72 6e 20 30 3b 20 2f 2a 20 4e 6f 20 44 49  turn 0; /* No DI
ddc0: 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 61  STINCT keyword a
ddd0: 6e 64 20 6e 6f 20 61 67 67 72 65 67 61 74 65 20  nd no aggregate 
dde0: 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 7d  functions */.  }
ddf0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 47  .  assert( p->pG
de00: 72 6f 75 70 42 79 3d 3d 30 20 29 3b 20 20 20 20  roupBy==0 );    
de10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 73            /* Has
de20: 20 6e 6f 20 47 52 4f 55 50 20 42 59 20 63 6c 61   no GROUP BY cla
de30: 75 73 65 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  use */.  if( p->
de40: 70 4c 69 6d 69 74 20 29 20 72 65 74 75 72 6e 20  pLimit ) return 
de50: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
de60: 2f 2a 20 48 61 73 20 6e 6f 20 4c 49 4d 49 54 20  /* Has no LIMIT 
de70: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 61 73 73 65  clause */.  asse
de80: 72 74 28 20 70 2d 3e 70 4f 66 66 73 65 74 3d 3d  rt( p->pOffset==
de90: 30 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  0 );            
dea0: 20 20 20 2f 2a 20 4e 6f 20 4c 49 4d 49 54 20 6d     /* No LIMIT m
deb0: 65 61 6e 73 20 6e 6f 20 4f 46 46 53 45 54 20 2a  eans no OFFSET *
dec0: 2f 0a 20 20 69 66 28 20 70 2d 3e 70 57 68 65 72  /.  if( p->pWher
ded0: 65 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  e ) return 0;   
dee0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61             /* Ha
def0: 73 20 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73  s no WHERE claus
df00: 65 20 2a 2f 0a 20 20 70 53 72 63 20 3d 20 70 2d  e */.  pSrc = p-
df10: 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74 28  >pSrc;.  assert(
df20: 20 70 53 72 63 21 3d 30 20 29 3b 0a 20 20 69 66   pSrc!=0 );.  if
df30: 28 20 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20  ( pSrc->nSrc!=1 
df40: 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
df50: 20 20 20 20 20 2f 2a 20 53 69 6e 67 6c 65 20 74       /* Single t
df60: 65 72 6d 20 69 6e 20 46 52 4f 4d 20 63 6c 61 75  erm in FROM clau
df70: 73 65 20 2a 2f 0a 20 20 69 66 28 20 70 53 72 63  se */.  if( pSrc
df80: 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 20 29  ->a[0].pSelect )
df90: 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 2f   return 0;     /
dfa0: 2a 20 46 52 4f 4d 20 69 73 20 6e 6f 74 20 61 20  * FROM is not a 
dfb0: 73 75 62 71 75 65 72 79 20 6f 72 20 76 69 65 77  subquery or view
dfc0: 20 2a 2f 0a 20 20 70 54 61 62 20 3d 20 70 53 72   */.  pTab = pSr
dfd0: 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 20 20  c->a[0].pTab;.  
dfe0: 61 73 73 65 72 74 28 20 70 54 61 62 21 3d 30 20  assert( pTab!=0 
dff0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 61  );.  assert( pTa
e000: 62 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 3b  b->pSelect==0 );
e010: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
e020: 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 6e 6f  ROM clause is no
e030: 74 20 61 20 76 69 65 77 20 2a 2f 0a 20 20 69 66  t a view */.  if
e040: 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  ( IsVirtual(pTab
e050: 29 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  ) ) return 0;   
e060: 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61       /* FROM cla
e070: 75 73 65 20 6e 6f 74 20 61 20 76 69 72 74 75 61  use not a virtua
e080: 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20 70 45 4c  l table */.  pEL
e090: 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b  ist = p->pEList;
e0a0: 0a 0a 20 20 2f 2a 20 41 6c 6c 20 53 45 4c 45 43  ..  /* All SELEC
e0b0: 54 20 72 65 73 75 6c 74 73 20 6d 75 73 74 20 62  T results must b
e0c0: 65 20 63 6f 6c 75 6d 6e 73 2e 20 49 66 20 74 68  e columns. If th
e0d0: 65 20 53 45 4c 45 43 54 20 72 65 74 75 72 6e 73  e SELECT returns
e0e0: 20 6d 6f 72 65 20 74 68 61 6e 0a 20 20 2a 2a 20   more than.  ** 
e0f0: 6f 6e 65 20 63 6f 6c 75 6d 6e 20 61 6e 64 20 74  one column and t
e100: 68 65 20 62 4e 75 6c 6c 53 65 6e 73 69 74 69 76  he bNullSensitiv
e110: 65 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 61  e flag is set, a
e120: 6c 6c 20 72 65 74 75 72 6e 65 64 20 63 6f 6c 75  ll returned colu
e130: 6d 6e 73 0a 20 20 2a 2a 20 6d 75 73 74 20 62 65  mns.  ** must be
e140: 20 64 65 63 6c 61 72 65 64 20 4e 4f 54 20 4e 55   declared NOT NU
e150: 4c 4c 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  LL. */.  for(i=0
e160: 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ; i<pEList->nExp
e170: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70  r; i++){.    Exp
e180: 72 20 2a 70 52 65 73 20 3d 20 70 45 4c 69 73 74  r *pRes = pEList
e190: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
e1a0: 20 20 69 66 28 20 70 52 65 73 2d 3e 6f 70 21 3d    if( pRes->op!=
e1b0: 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 72 65 74 75  TK_COLUMN ) retu
e1c0: 72 6e 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74  rn 0;.    assert
e1d0: 28 20 70 52 65 73 2d 3e 69 54 61 62 6c 65 3d 3d  ( pRes->iTable==
e1e0: 70 53 72 63 2d 3e 61 5b 30 5d 2e 69 43 75 72 73  pSrc->a[0].iCurs
e1f0: 6f 72 20 29 3b 20 20 2f 2a 20 4e 6f 74 20 61 20  or );  /* Not a 
e200: 63 6f 72 72 65 6c 61 74 65 64 20 73 75 62 71 75  correlated subqu
e210: 65 72 79 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  ery */.    if( p
e220: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 31 20 26  EList->nExpr>1 &
e230: 26 20 62 4e 75 6c 6c 53 65 6e 73 69 74 69 76 65  & bNullSensitive
e240: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 54   ){.      if( pT
e250: 61 62 2d 3e 61 43 6f 6c 5b 70 52 65 73 2d 3e 69  ab->aCol[pRes->i
e260: 43 6f 6c 75 6d 6e 5d 2e 6e 6f 74 4e 75 6c 6c 3d  Column].notNull=
e270: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
e280: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
e290: 6e 20 70 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  n p;.}.#endif /*
e2a0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
e2b0: 51 55 45 52 59 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  QUERY */../*.** 
e2c0: 43 6f 64 65 20 61 6e 20 4f 50 5f 4f 6e 63 65 20  Code an OP_Once 
e2d0: 69 6e 73 74 72 75 63 74 69 6f 6e 20 61 6e 64 20  instruction and 
e2e0: 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66  allocate space f
e2f0: 6f 72 20 69 74 73 20 66 6c 61 67 2e 20 52 65 74  or its flag. Ret
e300: 75 72 6e 20 74 68 65 20 0a 2a 2a 20 61 64 64 72  urn the .** addr
e310: 65 73 73 20 6f 66 20 74 68 65 20 6e 65 77 20 69  ess of the new i
e320: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 69  nstruction..*/.i
e330: 6e 74 20 73 71 6c 69 74 65 33 43 6f 64 65 4f 6e  nt sqlite3CodeOn
e340: 63 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ce(Parse *pParse
e350: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73  ){.  Vdbe *v = s
e360: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
e370: 61 72 73 65 29 3b 20 20 20 20 20 20 2f 2a 20 56  arse);      /* V
e380: 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 62  irtual machine b
e390: 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20  eing coded */.  
e3a0: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64  return sqlite3Vd
e3b0: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4f  beAddOp1(v, OP_O
e3c0: 6e 63 65 2c 20 70 50 61 72 73 65 2d 3e 6e 4f 6e  nce, pParse->nOn
e3d0: 63 65 2b 2b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ce++);.}../*.** 
e3e0: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
e3f0: 61 74 20 63 68 65 63 6b 73 20 74 68 65 20 6c 65  at checks the le
e400: 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 6f  ft-most column o
e410: 66 20 69 6e 64 65 78 20 74 61 62 6c 65 20 69 43  f index table iC
e420: 75 72 20 74 6f 20 73 65 65 20 69 66 0a 2a 2a 20  ur to see if.** 
e430: 69 74 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79 20  it contains any 
e440: 4e 55 4c 4c 20 65 6e 74 72 69 65 73 2e 20 20 43  NULL entries.  C
e450: 61 75 73 65 20 74 68 65 20 72 65 67 69 73 74 65  ause the registe
e460: 72 20 61 74 20 72 65 67 48 61 73 4e 75 6c 6c 20  r at regHasNull 
e470: 74 6f 20 62 65 20 73 65 74 0a 2a 2a 20 74 6f 20  to be set.** to 
e480: 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65  a non-NULL value
e490: 20 69 66 20 69 43 75 72 20 63 6f 6e 74 61 69 6e   if iCur contain
e4a0: 73 20 6e 6f 20 4e 55 4c 4c 73 2e 20 20 43 61 75  s no NULLs.  Cau
e4b0: 73 65 20 72 65 67 69 73 74 65 72 20 72 65 67 48  se register regH
e4c0: 61 73 4e 75 6c 6c 0a 2a 2a 20 74 6f 20 62 65 20  asNull.** to be 
e4d0: 73 65 74 20 74 6f 20 4e 55 4c 4c 20 69 66 20 69  set to NULL if i
e4e0: 43 75 72 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65  Cur contains one
e4f0: 20 6f 72 20 6d 6f 72 65 20 4e 55 4c 4c 20 76 61   or more NULL va
e500: 6c 75 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lues..*/.static 
e510: 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65 74 48  void sqlite3SetH
e520: 61 73 4e 75 6c 6c 46 6c 61 67 28 56 64 62 65 20  asNullFlag(Vdbe 
e530: 2a 76 2c 20 69 6e 74 20 69 43 75 72 2c 20 69 6e  *v, int iCur, in
e540: 74 20 72 65 67 48 61 73 4e 75 6c 6c 29 7b 0a 20  t regHasNull){. 
e550: 20 69 6e 74 20 61 64 64 72 31 3b 0a 20 20 73 71   int addr1;.  sq
e560: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
e570: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
e580: 2c 20 72 65 67 48 61 73 4e 75 6c 6c 29 3b 0a 20  , regHasNull);. 
e590: 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33   addr1 = sqlite3
e5a0: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
e5b0: 5f 52 65 77 69 6e 64 2c 20 69 43 75 72 29 3b 20  _Rewind, iCur); 
e5c0: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
e5d0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
e5e0: 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
e5f0: 6e 2c 20 69 43 75 72 2c 20 30 2c 20 72 65 67 48  n, iCur, 0, regH
e600: 61 73 4e 75 6c 6c 29 3b 0a 20 20 73 71 6c 69 74  asNull);.  sqlit
e610: 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
e620: 2c 20 4f 50 46 4c 41 47 5f 54 59 50 45 4f 46 41  , OPFLAG_TYPEOFA
e630: 52 47 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65  RG);.  VdbeComme
e640: 6e 74 28 28 76 2c 20 22 66 69 72 73 74 5f 65 6e  nt((v, "first_en
e650: 74 72 79 5f 69 6e 28 25 64 29 22 2c 20 69 43 75  try_in(%d)", iCu
e660: 72 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  r));.  sqlite3Vd
e670: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
e680: 64 72 31 29 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65  dr1);.}...#ifnde
e690: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
e6a0: 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 54 68 65  BQUERY./*.** The
e6b0: 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 6e 20   argument is an 
e6c0: 49 4e 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68  IN operator with
e6d0: 20 61 20 6c 69 73 74 20 28 6e 6f 74 20 61 20 73   a list (not a s
e6e0: 75 62 71 75 65 72 79 29 20 6f 6e 20 74 68 65 20  ubquery) on the 
e6f0: 0a 2a 2a 20 72 69 67 68 74 2d 68 61 6e 64 20 73  .** right-hand s
e700: 69 64 65 2e 20 20 52 65 74 75 72 6e 20 54 52 55  ide.  Return TRU
e710: 45 20 69 66 20 74 68 61 74 20 6c 69 73 74 20 69  E if that list i
e720: 73 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a 73  s constant..*/.s
e730: 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65  tatic int sqlite
e740: 33 49 6e 52 68 73 49 73 43 6f 6e 73 74 61 6e 74  3InRhsIsConstant
e750: 28 45 78 70 72 20 2a 70 49 6e 29 7b 0a 20 20 45  (Expr *pIn){.  E
e760: 78 70 72 20 2a 70 4c 48 53 3b 0a 20 20 69 6e 74  xpr *pLHS;.  int
e770: 20 72 65 73 3b 0a 20 20 61 73 73 65 72 74 28 20   res;.  assert( 
e780: 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
e790: 28 70 49 6e 2c 20 45 50 5f 78 49 73 53 65 6c 65  (pIn, EP_xIsSele
e7a0: 63 74 29 20 29 3b 0a 20 20 70 4c 48 53 20 3d 20  ct) );.  pLHS = 
e7b0: 70 49 6e 2d 3e 70 4c 65 66 74 3b 0a 20 20 70 49  pIn->pLeft;.  pI
e7c0: 6e 2d 3e 70 4c 65 66 74 20 3d 20 30 3b 0a 20 20  n->pLeft = 0;.  
e7d0: 72 65 73 20 3d 20 73 71 6c 69 74 65 33 45 78 70  res = sqlite3Exp
e7e0: 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 49 6e 29  rIsConstant(pIn)
e7f0: 3b 0a 20 20 70 49 6e 2d 3e 70 4c 65 66 74 20 3d  ;.  pIn->pLeft =
e800: 20 70 4c 48 53 3b 0a 20 20 72 65 74 75 72 6e 20   pLHS;.  return 
e810: 72 65 73 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  res;.}.#endif../
e820: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
e830: 6f 6e 20 69 73 20 75 73 65 64 20 62 79 20 74 68  on is used by th
e840: 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
e850: 20 6f 66 20 74 68 65 20 49 4e 20 28 2e 2e 2e 29   of the IN (...)
e860: 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 20 54 68   operator..** Th
e870: 65 20 70 58 20 70 61 72 61 6d 65 74 65 72 20 69  e pX parameter i
e880: 73 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  s the expression
e890: 20 6f 6e 20 74 68 65 20 52 48 53 20 6f 66 20 74   on the RHS of t
e8a0: 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 2c 20  he IN operator, 
e8b0: 77 68 69 63 68 0a 2a 2a 20 6d 69 67 68 74 20 62  which.** might b
e8c0: 65 20 65 69 74 68 65 72 20 61 20 6c 69 73 74 20  e either a list 
e8d0: 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6f  of expressions o
e8e0: 72 20 61 20 73 75 62 71 75 65 72 79 2e 0a 2a 2a  r a subquery..**
e8f0: 0a 2a 2a 20 54 68 65 20 6a 6f 62 20 6f 66 20 74  .** The job of t
e900: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74  his routine is t
e910: 6f 20 66 69 6e 64 20 6f 72 20 63 72 65 61 74 65  o find or create
e920: 20 61 20 62 2d 74 72 65 65 20 6f 62 6a 65 63 74   a b-tree object
e930: 20 74 68 61 74 20 63 61 6e 0a 2a 2a 20 62 65 20   that can.** be 
e940: 75 73 65 64 20 65 69 74 68 65 72 20 74 6f 20 74  used either to t
e950: 65 73 74 20 66 6f 72 20 6d 65 6d 62 65 72 73 68  est for membersh
e960: 69 70 20 69 6e 20 74 68 65 20 52 48 53 20 73 65  ip in the RHS se
e970: 74 20 6f 72 20 74 6f 20 69 74 65 72 61 74 65 20  t or to iterate 
e980: 74 68 72 6f 75 67 68 0a 2a 2a 20 61 6c 6c 20 6d  through.** all m
e990: 65 6d 62 65 72 73 20 6f 66 20 74 68 65 20 52 48  embers of the RH
e9a0: 53 20 73 65 74 2c 20 73 6b 69 70 70 69 6e 67 20  S set, skipping 
e9b0: 64 75 70 6c 69 63 61 74 65 73 2e 0a 2a 2a 0a 2a  duplicates..**.*
e9c0: 2a 20 41 20 63 75 72 73 6f 72 20 69 73 20 6f 70  * A cursor is op
e9d0: 65 6e 65 64 20 6f 6e 20 74 68 65 20 62 2d 74 72  ened on the b-tr
e9e0: 65 65 20 6f 62 6a 65 63 74 20 74 68 61 74 20 69  ee object that i
e9f0: 73 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 65  s the RHS of the
ea00: 20 49 4e 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20   IN operator.** 
ea10: 61 6e 64 20 70 58 2d 3e 69 54 61 62 6c 65 20 69  and pX->iTable i
ea20: 73 20 73 65 74 20 74 6f 20 74 68 65 20 69 6e 64  s set to the ind
ea30: 65 78 20 6f 66 20 74 68 61 74 20 63 75 72 73 6f  ex of that curso
ea40: 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74  r..**.** The ret
ea50: 75 72 6e 65 64 20 76 61 6c 75 65 20 6f 66 20 74  urned value of t
ea60: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 6e 64  his function ind
ea70: 69 63 61 74 65 73 20 74 68 65 20 62 2d 74 72 65  icates the b-tre
ea80: 65 20 74 79 70 65 2c 20 61 73 20 66 6f 6c 6c 6f  e type, as follo
ea90: 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 49 4e 5f 49  ws:.**.**   IN_I
eaa0: 4e 44 45 58 5f 52 4f 57 49 44 20 20 20 20 20 20  NDEX_ROWID      
eab0: 2d 20 54 68 65 20 63 75 72 73 6f 72 20 77 61 73  - The cursor was
eac0: 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 64 61 74   opened on a dat
ead0: 61 62 61 73 65 20 74 61 62 6c 65 2e 0a 2a 2a 20  abase table..** 
eae0: 20 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58    IN_INDEX_INDEX
eaf0: 5f 41 53 43 20 20 2d 20 54 68 65 20 63 75 72 73  _ASC  - The curs
eb00: 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e  or was opened on
eb10: 20 61 6e 20 61 73 63 65 6e 64 69 6e 67 20 69 6e   an ascending in
eb20: 64 65 78 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44  dex..**   IN_IND
eb30: 45 58 5f 49 4e 44 45 58 5f 44 45 53 43 20 2d 20  EX_INDEX_DESC - 
eb40: 54 68 65 20 63 75 72 73 6f 72 20 77 61 73 20 6f  The cursor was o
eb50: 70 65 6e 65 64 20 6f 6e 20 61 20 64 65 73 63 65  pened on a desce
eb60: 6e 64 69 6e 67 20 69 6e 64 65 78 2e 0a 2a 2a 20  nding index..** 
eb70: 20 20 49 4e 5f 49 4e 44 45 58 5f 45 50 48 20 20    IN_INDEX_EPH  
eb80: 20 20 20 20 20 20 2d 20 54 68 65 20 63 75 72 73        - The curs
eb90: 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e  or was opened on
eba0: 20 61 20 73 70 65 63 69 61 6c 6c 79 20 63 72 65   a specially cre
ebb0: 61 74 65 64 20 61 6e 64 0a 2a 2a 20 20 20 20 20  ated and.**     
ebc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ebd0: 20 20 20 20 70 6f 70 75 6c 61 74 65 64 20 65 70      populated ep
ebe0: 68 65 72 65 6d 61 6c 20 74 61 62 6c 65 2e 0a 2a  heremal table..*
ebf0: 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f  *   IN_INDEX_NOO
ec00: 50 20 20 20 20 20 20 20 2d 20 4e 6f 20 63 75 72  P       - No cur
ec10: 73 6f 72 20 77 61 73 20 61 6c 6c 6f 63 61 74 65  sor was allocate
ec20: 64 2e 20 20 54 68 65 20 49 4e 20 6f 70 65 72 61  d.  The IN opera
ec30: 74 6f 72 20 6d 75 73 74 20 62 65 0a 2a 2a 20 20  tor must be.**  
ec40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ec50: 20 20 20 20 20 20 20 69 6d 70 6c 65 6d 65 6e 74         implement
ec60: 65 64 20 61 73 20 61 20 73 65 71 75 65 6e 63 65  ed as a sequence
ec70: 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e 73 2e   of comparisons.
ec80: 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78 69 73 74 69  .**.** An existi
ec90: 6e 67 20 62 2d 74 72 65 65 20 6d 69 67 68 74 20  ng b-tree might 
eca0: 62 65 20 75 73 65 64 20 69 66 20 74 68 65 20 52  be used if the R
ecb0: 48 53 20 65 78 70 72 65 73 73 69 6f 6e 20 70 58  HS expression pX
ecc0: 20 69 73 20 61 20 73 69 6d 70 6c 65 0a 2a 2a 20   is a simple.** 
ecd0: 73 75 62 71 75 65 72 79 20 73 75 63 68 20 61 73  subquery such as
ece0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45  :.**.**     SELE
ecf0: 43 54 20 3c 63 6f 6c 75 6d 6e 3e 20 46 52 4f 4d  CT <column> FROM
ed00: 20 3c 74 61 62 6c 65 3e 0a 2a 2a 0a 2a 2a 20 49   <table>.**.** I
ed10: 66 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 65  f the RHS of the
ed20: 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 69 73 20   IN operator is 
ed30: 61 20 6c 69 73 74 20 6f 72 20 61 20 6d 6f 72 65  a list or a more
ed40: 20 63 6f 6d 70 6c 65 78 20 73 75 62 71 75 65 72   complex subquer
ed50: 79 2c 20 74 68 65 6e 0a 2a 2a 20 61 6e 20 65 70  y, then.** an ep
ed60: 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 6d 69  hemeral table mi
ed70: 67 68 74 20 6e 65 65 64 20 74 6f 20 62 65 20 67  ght need to be g
ed80: 65 6e 65 72 61 74 65 64 20 66 72 6f 6d 20 74 68  enerated from th
ed90: 65 20 52 48 53 20 61 6e 64 20 74 68 65 6e 0a 2a  e RHS and then.*
eda0: 2a 20 70 58 2d 3e 69 54 61 62 6c 65 20 6d 61 64  * pX->iTable mad
edb0: 65 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  e to point to th
edc0: 65 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c  e ephemeral tabl
edd0: 65 20 69 6e 73 74 65 61 64 20 6f 66 20 61 6e 0a  e instead of an.
ede0: 2a 2a 20 65 78 69 73 74 69 6e 67 20 74 61 62 6c  ** existing tabl
edf0: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 46  e..**.** The inF
ee00: 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 20 6d  lags parameter m
ee10: 75 73 74 20 63 6f 6e 74 61 69 6e 20 65 78 61 63  ust contain exac
ee20: 74 6c 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 62  tly one of the b
ee30: 69 74 73 0a 2a 2a 20 49 4e 5f 49 4e 44 45 58 5f  its.** IN_INDEX_
ee40: 4d 45 4d 42 45 52 53 48 49 50 20 6f 72 20 49 4e  MEMBERSHIP or IN
ee50: 5f 49 4e 44 45 58 5f 4c 4f 4f 50 2e 20 20 49 66  _INDEX_LOOP.  If
ee60: 20 69 6e 46 6c 61 67 73 20 63 6f 6e 74 61 69 6e   inFlags contain
ee70: 73 0a 2a 2a 20 49 4e 5f 49 4e 44 45 58 5f 4d 45  s.** IN_INDEX_ME
ee80: 4d 42 45 52 53 48 49 50 2c 20 74 68 65 6e 20 74  MBERSHIP, then t
ee90: 68 65 20 67 65 6e 65 72 61 74 65 64 20 74 61 62  he generated tab
eea0: 6c 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20  le will be used 
eeb0: 66 6f 72 20 61 0a 2a 2a 20 66 61 73 74 20 6d 65  for a.** fast me
eec0: 6d 62 65 72 73 68 69 70 20 74 65 73 74 2e 20 20  mbership test.  
eed0: 57 68 65 6e 20 74 68 65 20 49 4e 5f 49 4e 44 45  When the IN_INDE
eee0: 58 5f 4c 4f 4f 50 20 62 69 74 20 69 73 20 73 65  X_LOOP bit is se
eef0: 74 2c 20 74 68 65 0a 2a 2a 20 49 4e 20 69 6e 64  t, the.** IN ind
ef00: 65 78 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20  ex will be used 
ef10: 74 6f 20 6c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c  to loop over all
ef20: 20 76 61 6c 75 65 73 20 6f 66 20 74 68 65 20 52   values of the R
ef30: 48 53 20 6f 66 20 74 68 65 0a 2a 2a 20 49 4e 20  HS of the.** IN 
ef40: 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20  operator..**.** 
ef50: 57 68 65 6e 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f  When IN_INDEX_LO
ef60: 4f 50 20 69 73 20 75 73 65 64 20 28 61 6e 64 20  OP is used (and 
ef70: 74 68 65 20 62 2d 74 72 65 65 20 77 69 6c 6c 20  the b-tree will 
ef80: 62 65 20 75 73 65 64 20 74 6f 20 69 74 65 72 61  be used to itera
ef90: 74 65 0a 2a 2a 20 74 68 72 6f 75 67 68 20 74 68  te.** through th
efa0: 65 20 73 65 74 20 6d 65 6d 62 65 72 73 29 20 74  e set members) t
efb0: 68 65 6e 20 74 68 65 20 62 2d 74 72 65 65 20 6d  hen the b-tree m
efc0: 75 73 74 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20  ust not contain 
efd0: 64 75 70 6c 69 63 61 74 65 73 2e 0a 2a 2a 20 41  duplicates..** A
efe0: 6e 20 65 70 68 65 72 65 6d 61 6c 20 74 61 62 6c  n epheremal tabl
eff0: 65 20 6d 75 73 74 20 62 65 20 75 73 65 64 20 75  e must be used u
f000: 6e 6c 65 73 73 20 74 68 65 20 73 65 6c 65 63 74  nless the select
f010: 65 64 20 3c 63 6f 6c 75 6d 6e 3e 20 69 73 20 67  ed <column> is g
f020: 75 61 72 61 6e 74 65 65 64 0a 2a 2a 20 74 6f 20  uaranteed.** to 
f030: 62 65 20 75 6e 69 71 75 65 20 2d 20 65 69 74 68  be unique - eith
f040: 65 72 20 62 65 63 61 75 73 65 20 69 74 20 69 73  er because it is
f050: 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d   an INTEGER PRIM
f060: 41 52 59 20 4b 45 59 20 6f 72 20 69 74 0a 2a 2a  ARY KEY or it.**
f070: 20 68 61 73 20 61 20 55 4e 49 51 55 45 20 63 6f   has a UNIQUE co
f080: 6e 73 74 72 61 69 6e 74 20 6f 72 20 55 4e 49 51  nstraint or UNIQ
f090: 55 45 20 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20  UE index..**.** 
f0a0: 57 68 65 6e 20 49 4e 5f 49 4e 44 45 58 5f 4d 45  When IN_INDEX_ME
f0b0: 4d 42 45 52 53 48 49 50 20 69 73 20 75 73 65 64  MBERSHIP is used
f0c0: 20 28 61 6e 64 20 74 68 65 20 62 2d 74 72 65 65   (and the b-tree
f0d0: 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 0a 2a   will be used .*
f0e0: 2a 20 66 6f 72 20 66 61 73 74 20 73 65 74 20 6d  * for fast set m
f0f0: 65 6d 62 65 72 73 68 69 70 20 74 65 73 74 73 29  embership tests)
f100: 20 74 68 65 6e 20 61 6e 20 65 70 68 65 72 65 6d   then an epherem
f110: 61 6c 20 74 61 62 6c 65 20 6d 75 73 74 20 0a 2a  al table must .*
f120: 2a 20 62 65 20 75 73 65 64 20 75 6e 6c 65 73 73  * be used unless
f130: 20 3c 63 6f 6c 75 6d 6e 3e 20 69 73 20 61 6e 20   <column> is an 
f140: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
f150: 4b 45 59 20 6f 72 20 61 6e 20 69 6e 64 65 78 20  KEY or an index 
f160: 63 61 6e 20 0a 2a 2a 20 62 65 20 66 6f 75 6e 64  can .** be found
f170: 20 77 69 74 68 20 3c 63 6f 6c 75 6d 6e 3e 20 61   with <column> a
f180: 73 20 69 74 73 20 6c 65 66 74 2d 6d 6f 73 74 20  s its left-most 
f190: 63 6f 6c 75 6d 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66  column..**.** If
f1a0: 20 74 68 65 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f   the IN_INDEX_NO
f1b0: 4f 50 5f 4f 4b 20 61 6e 64 20 49 4e 5f 49 4e 44  OP_OK and IN_IND
f1c0: 45 58 5f 4d 45 4d 42 45 52 53 48 49 50 20 61 72  EX_MEMBERSHIP ar
f1d0: 65 20 62 6f 74 68 20 73 65 74 20 61 6e 64 0a 2a  e both set and.*
f1e0: 2a 20 69 66 20 74 68 65 20 52 48 53 20 6f 66 20  * if the RHS of 
f1f0: 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20  the IN operator 
f200: 69 73 20 61 20 6c 69 73 74 20 28 6e 6f 74 20 61  is a list (not a
f210: 20 73 75 62 71 75 65 72 79 29 20 74 68 65 6e 20   subquery) then 
f220: 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  this.** routine 
f230: 6d 69 67 68 74 20 64 65 63 69 64 65 20 74 68 61  might decide tha
f240: 74 20 63 72 65 61 74 69 6e 67 20 61 6e 20 65 70  t creating an ep
f250: 68 65 6d 65 72 61 6c 20 62 2d 74 72 65 65 20 66  hemeral b-tree f
f260: 6f 72 20 6d 65 6d 62 65 72 73 68 69 70 0a 2a 2a  or membership.**
f270: 20 74 65 73 74 69 6e 67 20 69 73 20 74 6f 6f 20   testing is too 
f280: 65 78 70 65 6e 73 69 76 65 20 61 6e 64 20 72 65  expensive and re
f290: 74 75 72 6e 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f  turn IN_INDEX_NO
f2a0: 4f 50 2e 20 20 49 6e 20 74 68 61 74 20 63 61 73  OP.  In that cas
f2b0: 65 2c 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e  e, the.** callin
f2c0: 67 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64  g routine should
f2d0: 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 49   implement the I
f2e0: 4e 20 6f 70 65 72 61 74 6f 72 20 75 73 69 6e 67  N operator using
f2f0: 20 61 20 73 65 71 75 65 6e 63 65 0a 2a 2a 20 6f   a sequence.** o
f300: 66 20 45 71 20 6f 72 20 4e 65 20 63 6f 6d 70 61  f Eq or Ne compa
f310: 72 69 73 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 73  rison operations
f320: 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 65  ..**.** When the
f330: 20 62 2d 74 72 65 65 20 69 73 20 62 65 69 6e 67   b-tree is being
f340: 20 75 73 65 64 20 66 6f 72 20 6d 65 6d 62 65 72   used for member
f350: 73 68 69 70 20 74 65 73 74 73 2c 20 74 68 65 20  ship tests, the 
f360: 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
f370: 0a 2a 2a 20 6d 69 67 68 74 20 6e 65 65 64 20 74  .** might need t
f380: 6f 20 6b 6e 6f 77 20 77 68 65 74 68 65 72 20 6f  o know whether o
f390: 72 20 6e 6f 74 20 74 68 65 20 52 48 53 20 73 69  r not the RHS si
f3a0: 64 65 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65  de of the IN ope
f3b0: 72 61 74 6f 72 0a 2a 2a 20 63 6f 6e 74 61 69 6e  rator.** contain
f3c0: 73 20 61 20 4e 55 4c 4c 2e 20 20 49 66 20 70 72  s a NULL.  If pr
f3d0: 52 68 73 48 61 73 4e 75 6c 6c 20 69 73 20 6e 6f  RhsHasNull is no
f3e0: 74 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72  t a NULL pointer
f3f0: 20 61 6e 64 20 0a 2a 2a 20 69 66 20 74 68 65 72   and .** if ther
f400: 65 20 69 73 20 61 6e 79 20 63 68 61 6e 63 65 20  e is any chance 
f410: 74 68 61 74 20 74 68 65 20 28 2e 2e 2e 29 20 6d  that the (...) m
f420: 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 61 20 4e  ight contain a N
f430: 55 4c 4c 20 76 61 6c 75 65 20 61 74 0a 2a 2a 20  ULL value at.** 
f440: 72 75 6e 74 69 6d 65 2c 20 74 68 65 6e 20 61 20  runtime, then a 
f450: 72 65 67 69 73 74 65 72 20 69 73 20 61 6c 6c 6f  register is allo
f460: 63 61 74 65 64 20 61 6e 64 20 74 68 65 20 72 65  cated and the re
f470: 67 69 73 74 65 72 20 6e 75 6d 62 65 72 20 77 72  gister number wr
f480: 69 74 74 65 6e 0a 2a 2a 20 74 6f 20 2a 70 72 52  itten.** to *prR
f490: 68 73 48 61 73 4e 75 6c 6c 2e 20 49 66 20 74 68  hsHasNull. If th
f4a0: 65 72 65 20 69 73 20 6e 6f 20 63 68 61 6e 63 65  ere is no chance
f4b0: 20 74 68 61 74 20 74 68 65 20 28 2e 2e 2e 29 20   that the (...) 
f4c0: 63 6f 6e 74 61 69 6e 73 20 61 0a 2a 2a 20 4e 55  contains a.** NU
f4d0: 4c 4c 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 2a  LL value, then *
f4e0: 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 69 73 20  prRhsHasNull is 
f4f0: 6c 65 66 74 20 75 6e 63 68 61 6e 67 65 64 2e 0a  left unchanged..
f500: 2a 2a 0a 2a 2a 20 49 66 20 61 20 72 65 67 69 73  **.** If a regis
f510: 74 65 72 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  ter is allocated
f520: 20 61 6e 64 20 69 74 73 20 6c 6f 63 61 74 69 6f   and its locatio
f530: 6e 20 73 74 6f 72 65 64 20 69 6e 20 2a 70 72 52  n stored in *prR
f540: 68 73 48 61 73 4e 75 6c 6c 2c 20 74 68 65 6e 0a  hsHasNull, then.
f550: 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20  ** the value in 
f560: 74 68 61 74 20 72 65 67 69 73 74 65 72 20 77 69  that register wi
f570: 6c 6c 20 62 65 20 4e 55 4c 4c 20 69 66 20 74 68  ll be NULL if th
f580: 65 20 62 2d 74 72 65 65 20 63 6f 6e 74 61 69 6e  e b-tree contain
f590: 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 0a 2a 2a  s one or more.**
f5a0: 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2c 20 61 6e   NULL values, an
f5b0: 64 20 69 74 20 77 69 6c 6c 20 62 65 20 73 6f 6d  d it will be som
f5c0: 65 20 6e 6f 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65  e non-NULL value
f5d0: 20 69 66 20 74 68 65 20 62 2d 74 72 65 65 20 63   if the b-tree c
f5e0: 6f 6e 74 61 69 6e 73 20 6e 6f 0a 2a 2a 20 4e 55  ontains no.** NU
f5f0: 4c 4c 20 76 61 6c 75 65 73 2e 0a 2a 2f 0a 23 69  LL values..*/.#i
f600: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
f610: 54 5f 53 55 42 51 55 45 52 59 0a 69 6e 74 20 73  T_SUBQUERY.int s
f620: 71 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e 64 65  qlite3FindInInde
f630: 78 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  x(.  Parse *pPar
f640: 73 65 2c 20 0a 20 20 45 78 70 72 20 2a 70 58 2c  se, .  Expr *pX,
f650: 20 0a 20 20 75 33 32 20 69 6e 46 6c 61 67 73 2c   .  u32 inFlags,
f660: 20 0a 20 20 69 6e 74 20 2a 70 72 52 68 73 48 61   .  int *prRhsHa
f670: 73 4e 75 6c 6c 2c 0a 20 20 69 6e 74 20 2a 61 69  sNull,.  int *ai
f680: 4d 61 70 0a 29 7b 0a 20 20 53 65 6c 65 63 74 20  Map.){.  Select 
f690: 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *p;             
f6a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f6b0: 2a 20 53 45 4c 45 43 54 20 74 6f 20 74 68 65 20  * SELECT to the 
f6c0: 72 69 67 68 74 20 6f 66 20 49 4e 20 6f 70 65 72  right of IN oper
f6d0: 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 65 54  ator */.  int eT
f6e0: 79 70 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ype = 0;        
f6f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f700: 2f 2a 20 54 79 70 65 20 6f 66 20 52 48 53 20 74  /* Type of RHS t
f710: 61 62 6c 65 2e 20 49 4e 5f 49 4e 44 45 58 5f 2a  able. IN_INDEX_*
f720: 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 20 3d   */.  int iTab =
f730: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
f740: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
f750: 75 72 73 6f 72 20 6f 66 20 74 68 65 20 52 48 53  ursor of the RHS
f760: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
f770: 6d 75 73 74 42 65 55 6e 69 71 75 65 3b 20 20 20  mustBeUnique;   
f780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f790: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 52 48 53    /* True if RHS
f7a0: 20 6d 75 73 74 20 62 65 20 75 6e 69 71 75 65 20   must be unique 
f7b0: 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73  */.  Vdbe *v = s
f7c0: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
f7d0: 61 72 73 65 29 3b 20 20 20 20 20 2f 2a 20 56 69  arse);     /* Vi
f7e0: 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 62 65  rtual machine be
f7f0: 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 0a 20 20  ing coded */..  
f800: 61 73 73 65 72 74 28 20 70 58 2d 3e 6f 70 3d 3d  assert( pX->op==
f810: 54 4b 5f 49 4e 20 29 3b 0a 20 20 6d 75 73 74 42  TK_IN );.  mustB
f820: 65 55 6e 69 71 75 65 20 3d 20 28 69 6e 46 6c 61  eUnique = (inFla
f830: 67 73 20 26 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f  gs & IN_INDEX_LO
f840: 4f 50 29 21 3d 30 3b 0a 0a 20 20 2f 2a 20 43 68  OP)!=0;..  /* Ch
f850: 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 61 6e  eck to see if an
f860: 20 65 78 69 73 74 69 6e 67 20 74 61 62 6c 65 20   existing table 
f870: 6f 72 20 69 6e 64 65 78 20 63 61 6e 20 62 65 20  or index can be 
f880: 75 73 65 64 20 74 6f 0a 20 20 2a 2a 20 73 61 74  used to.  ** sat
f890: 69 73 66 79 20 74 68 65 20 71 75 65 72 79 2e 20  isfy the query. 
f8a0: 20 54 68 69 73 20 69 73 20 70 72 65 66 65 72 61   This is prefera
f8b0: 62 6c 65 20 74 6f 20 67 65 6e 65 72 61 74 69 6e  ble to generatin
f8c0: 67 20 61 20 6e 65 77 20 0a 20 20 2a 2a 20 65 70  g a new .  ** ep
f8d0: 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 2e 0a 20  hemeral table.. 
f8e0: 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65   */.  if( pParse
f8f0: 2d 3e 6e 45 72 72 3d 3d 30 20 26 26 20 28 70 20  ->nErr==0 && (p 
f900: 3d 20 69 73 43 61 6e 64 69 64 61 74 65 46 6f 72  = isCandidateFor
f910: 49 6e 4f 70 74 28 70 58 2c 20 70 72 52 68 73 48  InOpt(pX, prRhsH
f920: 61 73 4e 75 6c 6c 21 3d 30 29 29 21 3d 30 20 29  asNull!=0))!=0 )
f930: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64  {.    sqlite3 *d
f940: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20  b = pParse->db; 
f950: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f960: 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
f970: 69 6f 6e 20 2a 2f 0a 20 20 20 20 54 61 62 6c 65  ion */.    Table
f980: 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20 20   *pTab;         
f990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f9a0: 20 20 2f 2a 20 54 61 62 6c 65 20 3c 74 61 62 6c    /* Table <tabl
f9b0: 65 3e 2e 20 2a 2f 0a 20 20 20 20 69 31 36 20 69  e>. */.    i16 i
f9c0: 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Db;             
f9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f9e0: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 69 64    /* Database id
f9f0: 78 20 66 6f 72 20 70 54 61 62 20 2a 2f 0a 20 20  x for pTab */.  
fa00: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
fa10: 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a  st = p->pEList;.
fa20: 20 20 20 20 69 6e 74 20 6e 45 78 70 72 20 3d 20      int nExpr = 
fa30: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 0a  pEList->nExpr;..
fa40: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
fa50: 45 4c 69 73 74 21 3d 30 20 29 3b 20 20 20 20 20  EList!=0 );     
fa60: 20 20 20 20 20 20 20 20 2f 2a 20 42 65 63 61 75          /* Becau
fa70: 73 65 20 6f 66 20 69 73 43 61 6e 64 69 64 61 74  se of isCandidat
fa80: 65 46 6f 72 49 6e 4f 70 74 28 70 29 20 2a 2f 0a  eForInOpt(p) */.
fa90: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
faa0: 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  EList->a[0].pExp
fab0: 72 21 3d 30 20 29 3b 20 2f 2a 20 42 65 63 61 75  r!=0 ); /* Becau
fac0: 73 65 20 6f 66 20 69 73 43 61 6e 64 69 64 61 74  se of isCandidat
fad0: 65 46 6f 72 49 6e 4f 70 74 28 70 29 20 2a 2f 0a  eForInOpt(p) */.
fae0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
faf0: 53 72 63 21 3d 30 20 29 3b 20 20 20 20 20 20 20  Src!=0 );       
fb00: 20 20 20 20 20 20 20 20 2f 2a 20 42 65 63 61 75          /* Becau
fb10: 73 65 20 6f 66 20 69 73 43 61 6e 64 69 64 61 74  se of isCandidat
fb20: 65 46 6f 72 49 6e 4f 70 74 28 70 29 20 2a 2f 0a  eForInOpt(p) */.
fb30: 20 20 20 20 70 54 61 62 20 3d 20 70 2d 3e 70 53      pTab = p->pS
fb40: 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 0a  rc->a[0].pTab;..
fb50: 20 20 20 20 2f 2a 20 43 6f 64 65 20 61 6e 20 4f      /* Code an O
fb60: 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e  P_Transaction an
fb70: 64 20 4f 50 5f 54 61 62 6c 65 4c 6f 63 6b 20 66  d OP_TableLock f
fb80: 6f 72 20 3c 74 61 62 6c 65 3e 2e 20 2a 2f 0a 20  or <table>. */. 
fb90: 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33     iDb = sqlite3
fba0: 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62  SchemaToIndex(db
fbb0: 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29  , pTab->pSchema)
fbc0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64  ;.    sqlite3Cod
fbd0: 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50  eVerifySchema(pP
fbe0: 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20  arse, iDb);.    
fbf0: 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b  sqlite3TableLock
fc00: 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20 70 54  (pParse, iDb, pT
fc10: 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61  ab->tnum, 0, pTa
fc20: 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20 20 20  b->zName);..    
fc30: 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  /* This function
fc40: 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20   is only called 
fc50: 66 72 6f 6d 20 74 77 6f 20 70 6c 61 63 65 73 2e  from two places.
fc60: 20 49 6e 20 62 6f 74 68 20 63 61 73 65 73 20 74   In both cases t
fc70: 68 65 20 76 64 62 65 0a 20 20 20 20 2a 2a 20 68  he vdbe.    ** h
fc80: 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
fc90: 61 6c 6c 6f 63 61 74 65 64 2e 20 53 6f 20 61 73  allocated. So as
fca0: 73 75 6d 65 20 73 71 6c 69 74 65 33 47 65 74 56  sume sqlite3GetV
fcb0: 64 62 65 28 29 20 69 73 20 61 6c 77 61 79 73 0a  dbe() is always.
fcc0: 20 20 20 20 2a 2a 20 73 75 63 63 65 73 73 66 75      ** successfu
fcd0: 6c 20 68 65 72 65 2e 0a 20 20 20 20 2a 2f 0a 20  l here..    */. 
fce0: 20 20 20 61 73 73 65 72 74 28 76 29 3b 0a 20 20     assert(v);.  
fcf0: 20 20 69 66 28 20 6e 45 78 70 72 3d 3d 31 20 26    if( nExpr==1 &
fd00: 26 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  & pEList->a[0].p
fd10: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20  Expr->iColumn<0 
fd20: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 41 64  ){.      int iAd
fd30: 64 72 20 3d 20 73 71 6c 69 74 65 33 43 6f 64 65  dr = sqlite3Code
fd40: 4f 6e 63 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Once(pParse);.  
fd50: 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
fd60: 28 76 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69  (v);..      sqli
fd70: 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61  te3OpenTable(pPa
fd80: 72 73 65 2c 20 69 54 61 62 2c 20 69 44 62 2c 20  rse, iTab, iDb, 
fd90: 70 54 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65 61  pTab, OP_OpenRea
fda0: 64 29 3b 0a 20 20 20 20 20 20 65 54 79 70 65 20  d);.      eType 
fdb0: 3d 20 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44  = IN_INDEX_ROWID
fdc0: 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ;..      sqlite3
fdd0: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
fde0: 69 41 64 64 72 29 3b 0a 20 20 20 20 7d 65 6c 73  iAddr);.    }els
fdf0: 65 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a  e{.      Index *
fe00: 70 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20  pIdx;           
fe10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
fe20: 20 49 74 65 72 61 74 6f 72 20 76 61 72 69 61 62   Iterator variab
fe30: 6c 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  le */.      int 
fe40: 61 66 66 69 6e 69 74 79 5f 6f 6b 20 3d 20 31 3b  affinity_ok = 1;
fe50: 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 0a 20  .      int i;.. 
fe60: 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68       /* Check th
fe70: 61 74 20 74 68 65 20 61 66 66 69 6e 69 74 79 20  at the affinity 
fe80: 74 68 61 74 20 77 69 6c 6c 20 62 65 20 75 73 65  that will be use
fe90: 64 20 74 6f 20 70 65 72 66 6f 72 6d 20 65 61 63  d to perform eac
fea0: 68 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6d 70  h .      ** comp
feb0: 61 72 69 73 6f 6e 20 69 73 20 74 68 65 20 73 61  arison is the sa
fec0: 6d 65 20 61 73 20 74 68 65 20 61 66 66 69 6e 69  me as the affini
fed0: 74 79 20 6f 66 20 65 61 63 68 20 63 6f 6c 75 6d  ty of each colum
fee0: 6e 2e 20 49 66 0a 20 20 20 20 20 20 2a 2a 20 69  n. If.      ** i
fef0: 74 20 6e 6f 74 2c 20 69 74 20 69 73 20 6e 6f 74  t not, it is not
ff00: 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 75 73 65   possible to use
ff10: 20 61 6e 79 20 69 6e 64 65 78 2e 20 20 2a 2f 0a   any index.  */.
ff20: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
ff30: 3c 6e 45 78 70 72 20 26 26 20 61 66 66 69 6e 69  <nExpr && affini
ff40: 74 79 5f 6f 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20  ty_ok; i++){.   
ff50: 20 20 20 20 20 45 78 70 72 20 2a 70 4c 68 73 20       Expr *pLhs 
ff60: 3d 20 65 78 70 72 56 65 63 74 6f 72 46 69 65 6c  = exprVectorFiel
ff70: 64 28 70 58 2d 3e 70 4c 65 66 74 2c 20 69 29 3b  d(pX->pLeft, i);
ff80: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f  .        int iCo
ff90: 6c 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  l = pEList->a[i]
ffa0: 2e 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b  .pExpr->iColumn;
ffb0: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 69 64  .        char id
ffc0: 78 61 66 66 20 3d 20 70 54 61 62 2d 3e 61 43 6f  xaff = pTab->aCo
ffd0: 6c 5b 69 43 6f 6c 5d 2e 61 66 66 69 6e 69 74 79  l[iCol].affinity
ffe0: 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 63  ;.        char c
fff0: 6d 70 61 66 66 20 3d 20 73 71 6c 69 74 65 33 43  mpaff = sqlite3C
10000 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 70  ompareAffinity(p
10010 4c 68 73 2c 20 69 64 78 61 66 66 29 3b 0a 20 20  Lhs, idxaff);.  
10020 20 20 20 20 20 20 73 77 69 74 63 68 28 20 63 6d        switch( cm
10030 70 61 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20  paff ){.        
10040 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 46    case SQLITE_AF
10050 46 5f 42 4c 4f 42 3a 0a 20 20 20 20 20 20 20 20  F_BLOB:.        
10060 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
10070 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
10080 5f 41 46 46 5f 54 45 58 54 3a 0a 20 20 20 20 20  _AFF_TEXT:.     
10090 20 20 20 20 20 20 20 61 66 66 69 6e 69 74 79 5f         affinity_
100a0 6f 6b 20 3d 20 28 69 64 78 61 66 66 3d 3d 53 51  ok = (idxaff==SQ
100b0 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 29 3b 0a  LITE_AFF_TEXT);.
100c0 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
100d0 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 64 65 66  k;.          def
100e0 61 75 6c 74 3a 0a 20 20 20 20 20 20 20 20 20 20  ault:.          
100f0 20 20 61 66 66 69 6e 69 74 79 5f 6f 6b 20 3d 20    affinity_ok = 
10100 73 71 6c 69 74 65 33 49 73 4e 75 6d 65 72 69 63  sqlite3IsNumeric
10110 41 66 66 69 6e 69 74 79 28 69 64 78 61 66 66 29  Affinity(idxaff)
10120 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
10130 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68    }..      /* Th
10140 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  e collation sequ
10150 65 6e 63 65 20 75 73 65 64 20 62 79 20 74 68 65  ence used by the
10160 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 49 66 20   comparison. If 
10170 61 6e 20 69 6e 64 65 78 20 69 73 20 74 6f 0a 20  an index is to. 
10180 20 20 20 20 20 2a 2a 20 62 65 20 75 73 65 64 20       ** be used 
10190 69 6e 20 70 6c 61 63 65 20 6f 66 20 61 20 74 65  in place of a te
101a0 6d 70 2d 74 61 62 6c 65 2c 20 69 74 20 6d 75 73  mp-table, it mus
101b0 74 20 62 65 20 6f 72 64 65 72 65 64 20 61 63 63  t be ordered acc
101c0 6f 72 64 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20  ording.      ** 
101d0 74 6f 20 74 68 69 73 20 63 6f 6c 6c 61 74 69 6f  to this collatio
101e0 6e 20 73 65 71 75 65 6e 63 65 2e 20 20 2a 2f 0a  n sequence.  */.
101f0 0a 20 20 20 20 20 20 66 6f 72 28 70 49 64 78 3d  .      for(pIdx=
10200 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49  pTab->pIndex; pI
10210 64 78 20 26 26 20 65 54 79 70 65 3d 3d 30 20 26  dx && eType==0 &
10220 26 20 61 66 66 69 6e 69 74 79 5f 6f 6b 3b 20 70  & affinity_ok; p
10230 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29  Idx=pIdx->pNext)
10240 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49  {.        if( pI
10250 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3c 6e 45 78 70  dx->nKeyCol<nExp
10260 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  r ) continue;.  
10270 20 20 20 20 20 20 69 66 28 20 6d 75 73 74 42 65        if( mustBe
10280 55 6e 69 71 75 65 20 26 26 20 28 70 49 64 78 2d  Unique && (pIdx-
10290 3e 6e 4b 65 79 43 6f 6c 21 3d 6e 45 78 70 72 20  >nKeyCol!=nExpr 
102a0 7c 7c 20 21 49 73 55 6e 69 71 75 65 49 6e 64 65  || !IsUniqueInde
102b0 78 28 70 49 64 78 29 29 20 29 7b 0a 20 20 20 20  x(pIdx)) ){.    
102c0 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
102d0 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
102e0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45     for(i=0; i<nE
102f0 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
10300 20 20 20 20 20 45 78 70 72 20 2a 70 4c 68 73 20       Expr *pLhs 
10310 3d 20 65 78 70 72 56 65 63 74 6f 72 46 69 65 6c  = exprVectorFiel
10320 64 28 70 58 2d 3e 70 4c 65 66 74 2c 20 69 29 3b  d(pX->pLeft, i);
10330 0a 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20  .          Expr 
10340 2a 70 52 68 73 20 3d 20 70 45 4c 69 73 74 2d 3e  *pRhs = pEList->
10350 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
10360 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
10370 52 65 71 20 3d 20 73 71 6c 69 74 65 33 42 69 6e  Req = sqlite3Bin
10380 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65  aryCompareCollSe
10390 71 28 70 50 61 72 73 65 2c 20 70 4c 68 73 2c 20  q(pParse, pLhs, 
103a0 70 52 68 73 29 3b 0a 20 20 20 20 20 20 20 20 20  pRhs);.         
103b0 20 69 6e 74 20 6a 3b 0a 0a 20 20 20 20 20 20 20   int j;..       
103c0 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 45     for(j=0; j<nE
103d0 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  xpr; j++){.     
103e0 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d         if( pIdx-
103f0 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 21 3d 70 52  >aiColumn[j]!=pR
10400 68 73 2d 3e 69 43 6f 6c 75 6d 6e 20 29 20 63 6f  hs->iColumn ) co
10410 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
10420 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78      assert( pIdx
10430 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 20 29 3b 0a 20  ->azColl[j] );. 
10440 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73             if( s
10450 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 52  qlite3StrICmp(pR
10460 65 71 2d 3e 7a 4e 61 6d 65 2c 20 70 49 64 78 2d  eq->zName, pIdx-
10470 3e 61 7a 43 6f 6c 6c 5b 6a 5d 29 21 3d 30 20 29  >azColl[j])!=0 )
10480 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
10490 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
104a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
104b0 20 20 20 20 69 66 28 20 6a 3d 3d 6e 45 78 70 72      if( j==nExpr
104c0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
104d0 20 20 20 20 69 66 28 20 61 69 4d 61 70 20 29 20      if( aiMap ) 
104e0 61 69 4d 61 70 5b 69 5d 20 3d 20 6a 3b 0a 20 20  aiMap[i] = j;.  
104f0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
10500 20 69 66 28 20 69 3d 3d 6e 45 78 70 72 20 29 7b   if( i==nExpr ){
10510 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69  .          int i
10520 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33 43 6f  Addr = sqlite3Co
10530 64 65 4f 6e 63 65 28 70 50 61 72 73 65 29 3b 20  deOnce(pParse); 
10540 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
10550 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
10560 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
10570 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69 54 61  OP_OpenRead, iTa
10580 62 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c 20 69  b, pIdx->tnum, i
10590 44 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  Db);.          s
105a0 71 6c 69 74 65 33 56 64 62 65 53 65 74 50 34 4b  qlite3VdbeSetP4K
105b0 65 79 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70  eyInfo(pParse, p
105c0 49 64 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Idx);.          
105d0 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
105e0 22 25 73 22 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d  "%s", pIdx->zNam
105f0 65 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61  e));.          a
10600 73 73 65 72 74 28 20 49 4e 5f 49 4e 44 45 58 5f  ssert( IN_INDEX_
10610 49 4e 44 45 58 5f 44 45 53 43 20 3d 3d 20 49 4e  INDEX_DESC == IN
10620 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 41 53 43  _INDEX_INDEX_ASC
10630 2b 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  +1 );.          
10640 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58  eType = IN_INDEX
10650 5f 49 4e 44 45 58 5f 41 53 43 20 2b 20 70 49 64  _INDEX_ASC + pId
10660 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 30 5d  x->aSortOrder[0]
10670 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ;..          if(
10680 20 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 26 26   prRhsHasNull &&
10690 20 6e 45 78 70 72 3d 3d 31 20 0a 20 20 20 20 20   nExpr==1 .     
106a0 20 20 20 20 20 20 26 26 20 21 70 54 61 62 2d 3e        && !pTab->
106b0 61 43 6f 6c 5b 70 45 4c 69 73 74 2d 3e 61 5b 30  aCol[pEList->a[0
106c0 5d 2e 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ].pExpr->iColumn
106d0 5d 2e 6e 6f 74 4e 75 6c 6c 20 0a 20 20 20 20 20  ].notNull .     
106e0 20 20 20 20 20 29 7b 0a 23 69 66 64 65 66 20 53       ){.#ifdef S
106f0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c  QLITE_ENABLE_COL
10700 55 4d 4e 5f 55 53 45 44 5f 4d 41 53 4b 0a 20 20  UMN_USED_MASK.  
10710 20 20 20 20 20 20 20 20 20 20 69 36 34 20 6d 61            i64 ma
10720 73 6b 20 3d 20 28 31 3c 3c 6e 45 78 70 72 29 2d  sk = (1<<nExpr)-
10730 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  1;.            s
10740 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
10750 44 75 70 38 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  Dup8(v, OP_Colum
10760 6e 73 55 73 65 64 2c 20 0a 20 20 20 20 20 20 20  nsUsed, .       
10770 20 20 20 20 20 20 20 20 20 69 54 61 62 2c 20 30           iTab, 0
10780 2c 20 30 2c 20 28 75 38 2a 29 26 6d 61 73 6b 2c  , 0, (u8*)&mask,
10790 20 50 34 5f 49 4e 54 36 34 29 3b 0a 23 65 6e 64   P4_INT64);.#end
107a0 69 66 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  if.            *
107b0 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 3d 20 2b  prRhsHasNull = +
107c0 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
107d0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
107e0 65 33 53 65 74 48 61 73 4e 75 6c 6c 46 6c 61 67  e3SetHasNullFlag
107f0 28 76 2c 20 69 54 61 62 2c 20 2a 70 72 52 68 73  (v, iTab, *prRhs
10800 48 61 73 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  HasNull);.      
10810 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
10820 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
10830 65 72 65 28 76 2c 20 69 41 64 64 72 29 3b 0a 20  ere(v, iAddr);. 
10840 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
10850 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
10860 20 49 66 20 6e 6f 20 70 72 65 65 78 69 73 74 69   If no preexisti
10870 6e 67 20 69 6e 64 65 78 20 69 73 20 61 76 61 69  ng index is avai
10880 6c 61 62 6c 65 20 66 6f 72 20 74 68 65 20 49 4e  lable for the IN
10890 20 63 6c 61 75 73 65 0a 20 20 2a 2a 20 61 6e 64   clause.  ** and
108a0 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 20 69   IN_INDEX_NOOP i
108b0 73 20 61 6e 20 61 6c 6c 6f 77 65 64 20 72 65 70  s an allowed rep
108c0 6c 79 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20  ly.  ** and the 
108d0 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70  RHS of the IN op
108e0 65 72 61 74 6f 72 20 69 73 20 61 20 6c 69 73 74  erator is a list
108f0 2c 20 6e 6f 74 20 61 20 73 75 62 71 75 65 72 79  , not a subquery
10900 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 52 48  .  ** and the RH
10910 53 20 69 73 20 6e 6f 74 20 63 6f 6e 73 74 61 6e  S is not constan
10920 74 20 6f 72 20 68 61 73 20 74 77 6f 20 6f 72 20  t or has two or 
10930 66 65 77 65 72 20 74 65 72 6d 73 2c 0a 20 20 2a  fewer terms,.  *
10940 2a 20 74 68 65 6e 20 69 74 20 69 73 20 6e 6f 74  * then it is not
10950 20 77 6f 72 74 68 20 63 72 65 61 74 69 6e 67 20   worth creating 
10960 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62  an ephemeral tab
10970 6c 65 20 74 6f 20 65 76 61 6c 75 61 74 65 0a 20  le to evaluate. 
10980 20 2a 2a 20 74 68 65 20 49 4e 20 6f 70 65 72 61   ** the IN opera
10990 74 6f 72 20 73 6f 20 72 65 74 75 72 6e 20 49 4e  tor so return IN
109a0 5f 49 4e 44 45 58 5f 4e 4f 4f 50 2e 0a 20 20 2a  _INDEX_NOOP..  *
109b0 2f 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 30  /.  if( eType==0
109c0 0a 20 20 20 26 26 20 28 69 6e 46 6c 61 67 73 20  .   && (inFlags 
109d0 26 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 5f  & IN_INDEX_NOOP_
109e0 4f 4b 29 0a 20 20 20 26 26 20 21 45 78 70 72 48  OK).   && !ExprH
109f0 61 73 50 72 6f 70 65 72 74 79 28 70 58 2c 20 45  asProperty(pX, E
10a00 50 5f 78 49 73 53 65 6c 65 63 74 29 0a 20 20 20  P_xIsSelect).   
10a10 26 26 20 28 21 73 71 6c 69 74 65 33 49 6e 52 68  && (!sqlite3InRh
10a20 73 49 73 43 6f 6e 73 74 61 6e 74 28 70 58 29 20  sIsConstant(pX) 
10a30 7c 7c 20 70 58 2d 3e 78 2e 70 4c 69 73 74 2d 3e  || pX->x.pList->
10a40 6e 45 78 70 72 3c 3d 32 29 0a 20 20 29 7b 0a 20  nExpr<=2).  ){. 
10a50 20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e     eType = IN_IN
10a60 44 45 58 5f 4e 4f 4f 50 3b 0a 20 20 7d 0a 0a 20  DEX_NOOP;.  }.. 
10a70 20 69 66 28 20 65 54 79 70 65 3d 3d 30 20 29 7b   if( eType==0 ){
10a80 0a 20 20 20 20 2f 2a 20 43 6f 75 6c 64 20 6e 6f  .    /* Could no
10a90 74 20 66 69 6e 64 20 61 6e 20 65 78 69 73 74 69  t find an existi
10aa0 6e 67 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65  ng table or inde
10ab0 78 20 74 6f 20 75 73 65 20 61 73 20 74 68 65 20  x to use as the 
10ac0 52 48 53 20 62 2d 74 72 65 65 2e 0a 20 20 20 20  RHS b-tree..    
10ad0 2a 2a 20 57 65 20 77 69 6c 6c 20 68 61 76 65 20  ** We will have 
10ae0 74 6f 20 67 65 6e 65 72 61 74 65 20 61 6e 20 65  to generate an e
10af0 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 74  phemeral table t
10b00 6f 20 64 6f 20 74 68 65 20 6a 6f 62 2e 0a 20 20  o do the job..  
10b10 20 20 2a 2f 0a 20 20 20 20 75 33 32 20 73 61 76    */.    u32 sav
10b20 65 64 4e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70  edNQueryLoop = p
10b30 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f  Parse->nQueryLoo
10b40 70 3b 0a 20 20 20 20 69 6e 74 20 72 4d 61 79 48  p;.    int rMayH
10b50 61 76 65 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20  aveNull = 0;.   
10b60 20 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45   eType = IN_INDE
10b70 58 5f 45 50 48 3b 0a 20 20 20 20 69 66 28 20 69  X_EPH;.    if( i
10b80 6e 46 6c 61 67 73 20 26 20 49 4e 5f 49 4e 44 45  nFlags & IN_INDE
10b90 58 5f 4c 4f 4f 50 20 29 7b 0a 20 20 20 20 20 20  X_LOOP ){.      
10ba0 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f  pParse->nQueryLo
10bb0 6f 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66  op = 0;.      if
10bc0 28 20 70 58 2d 3e 70 4c 65 66 74 2d 3e 69 43 6f  ( pX->pLeft->iCo
10bd0 6c 75 6d 6e 3c 30 20 26 26 20 21 45 78 70 72 48  lumn<0 && !ExprH
10be0 61 73 50 72 6f 70 65 72 74 79 28 70 58 2c 20 45  asProperty(pX, E
10bf0 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a  P_xIsSelect) ){.
10c00 20 20 20 20 20 20 20 20 65 54 79 70 65 20 3d 20          eType = 
10c10 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 3b 0a  IN_INDEX_ROWID;.
10c20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
10c30 65 20 69 66 28 20 70 72 52 68 73 48 61 73 4e 75  e if( prRhsHasNu
10c40 6c 6c 20 29 7b 0a 20 20 20 20 20 20 2a 70 72 52  ll ){.      *prR
10c50 68 73 48 61 73 4e 75 6c 6c 20 3d 20 72 4d 61 79  hsHasNull = rMay
10c60 48 61 76 65 4e 75 6c 6c 20 3d 20 2b 2b 70 50 61  HaveNull = ++pPa
10c70 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 7d  rse->nMem;.    }
10c80 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65  .    sqlite3Code
10c90 53 75 62 73 65 6c 65 63 74 28 70 50 61 72 73 65  Subselect(pParse
10ca0 2c 20 70 58 2c 20 72 4d 61 79 48 61 76 65 4e 75  , pX, rMayHaveNu
10cb0 6c 6c 2c 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e  ll, eType==IN_IN
10cc0 44 45 58 5f 52 4f 57 49 44 29 3b 0a 20 20 20 20  DEX_ROWID);.    
10cd0 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f  pParse->nQueryLo
10ce0 6f 70 20 3d 20 73 61 76 65 64 4e 51 75 65 72 79  op = savedNQuery
10cf0 4c 6f 6f 70 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Loop;.  }else{. 
10d00 20 20 20 70 58 2d 3e 69 54 61 62 6c 65 20 3d 20     pX->iTable = 
10d10 69 54 61 62 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  iTab;.  }..  if(
10d20 20 61 69 4d 61 70 20 26 26 20 65 54 79 70 65 21   aiMap && eType!
10d30 3d 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f  =IN_INDEX_INDEX_
10d40 41 53 43 20 26 26 20 65 54 79 70 65 21 3d 49 4e  ASC && eType!=IN
10d50 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 44 45 53  _INDEX_INDEX_DES
10d60 43 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 2c 20  C ){.    int i, 
10d70 6e 3b 0a 20 20 20 20 6e 20 3d 20 73 71 6c 69 74  n;.    n = sqlit
10d80 65 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65  e3ExprVectorSize
10d90 28 70 58 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  (pX->pLeft);.   
10da0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69   for(i=0; i<n; i
10db0 2b 2b 29 20 61 69 4d 61 70 5b 69 5d 20 3d 20 69  ++) aiMap[i] = i
10dc0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 65  ;.  }.  return e
10dd0 54 79 70 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  Type;.}.#endif..
10de0 73 74 61 74 69 63 20 63 68 61 72 20 2a 65 78 70  static char *exp
10df0 72 49 4e 41 66 66 69 6e 69 74 79 28 50 61 72 73  rINAffinity(Pars
10e00 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
10e10 2a 70 45 78 70 72 29 7b 0a 20 20 45 78 70 72 20  *pExpr){.  Expr 
10e20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e  *pLeft = pExpr->
10e30 70 4c 65 66 74 3b 0a 20 20 69 6e 74 20 6e 56 61  pLeft;.  int nVa
10e40 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 56  l = sqlite3ExprV
10e50 65 63 74 6f 72 53 69 7a 65 28 70 4c 65 66 74 29  ectorSize(pLeft)
10e60 3b 0a 20 20 63 68 61 72 20 2a 7a 52 65 74 3b 0a  ;.  char *zRet;.
10e70 0a 20 20 7a 52 65 74 20 3d 20 73 71 6c 69 74 65  .  zRet = sqlite
10e80 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 50  3DbMallocZero(pP
10e90 61 72 73 65 2d 3e 64 62 2c 20 6e 56 61 6c 2b 31  arse->db, nVal+1
10ea0 29 3b 0a 20 20 69 66 28 20 7a 52 65 74 20 29 7b  );.  if( zRet ){
10eb0 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
10ec0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 61 6c 3b  for(i=0; i<nVal;
10ed0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70   i++){.      Exp
10ee0 72 20 2a 70 41 3b 0a 20 20 20 20 20 20 63 68 61  r *pA;.      cha
10ef0 72 20 61 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  r a;.      if( n
10f00 56 61 6c 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  Val==1 ){.      
10f10 20 20 70 41 20 3d 20 70 4c 65 66 74 3b 0a 20 20    pA = pLeft;.  
10f20 20 20 20 20 7d 65 6c 73 65 7b 20 20 20 20 0a 20      }else{    . 
10f30 20 20 20 20 20 20 20 70 41 20 3d 20 65 78 70 72         pA = expr
10f40 56 65 63 74 6f 72 46 69 65 6c 64 28 70 4c 65 66  VectorField(pLef
10f50 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20  t, i);.      }. 
10f60 20 20 20 20 20 61 20 3d 20 73 71 6c 69 74 65 33       a = sqlite3
10f70 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 41 29  ExprAffinity(pA)
10f80 3b 0a 20 20 20 20 20 20 7a 52 65 74 5b 69 5d 20  ;.      zRet[i] 
10f90 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65  = sqlite3Compare
10fa0 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 2d 3e  Affinity(pExpr->
10fb0 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73  x.pSelect->pELis
10fc0 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 61  t->a[i].pExpr, a
10fd0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 52 65  );.    }.    zRe
10fe0 74 5b 6e 56 61 6c 5d 20 3d 20 27 5c 30 27 3b 0a  t[nVal] = '\0';.
10ff0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 52 65    }.  return zRe
11000 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  t;.}../*.** Gene
11010 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 73 63  rate code for sc
11020 61 6c 61 72 20 73 75 62 71 75 65 72 69 65 73 20  alar subqueries 
11030 75 73 65 64 20 61 73 20 61 20 73 75 62 71 75 65  used as a subque
11040 72 79 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 45  ry expression, E
11050 58 49 53 54 53 2c 0a 2a 2a 20 6f 72 20 49 4e 20  XISTS,.** or IN 
11060 6f 70 65 72 61 74 6f 72 73 2e 20 20 45 78 61 6d  operators.  Exam
11070 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ples:.**.**     
11080 28 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 62  (SELECT a FROM b
11090 29 20 20 20 20 20 20 20 20 20 20 2d 2d 20 73 75  )          -- su
110a0 62 71 75 65 72 79 0a 2a 2a 20 20 20 20 20 45 58  bquery.**     EX
110b0 49 53 54 53 20 28 53 45 4c 45 43 54 20 61 20 46  ISTS (SELECT a F
110c0 52 4f 4d 20 62 29 20 20 20 2d 2d 20 45 58 49 53  ROM b)   -- EXIS
110d0 54 53 20 73 75 62 71 75 65 72 79 0a 2a 2a 20 20  TS subquery.**  
110e0 20 20 20 78 20 49 4e 20 28 34 2c 35 2c 31 31 29     x IN (4,5,11)
110f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d                --
11100 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 77 69 74   IN operator wit
11110 68 20 6c 69 73 74 20 6f 6e 20 72 69 67 68 74 2d  h list on right-
11120 68 61 6e 64 20 73 69 64 65 0a 2a 2a 20 20 20 20  hand side.**    
11130 20 78 20 49 4e 20 28 53 45 4c 45 43 54 20 61 20   x IN (SELECT a 
11140 46 52 4f 4d 20 62 29 20 20 20 20 20 2d 2d 20 49  FROM b)     -- I
11150 4e 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68 20  N operator with 
11160 73 75 62 71 75 65 72 79 20 6f 6e 20 74 68 65 20  subquery on the 
11170 72 69 67 68 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20  right.**.** The 
11180 70 45 78 70 72 20 70 61 72 61 6d 65 74 65 72 20  pExpr parameter 
11190 64 65 73 63 72 69 62 65 73 20 74 68 65 20 65 78  describes the ex
111a0 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 63 6f  pression that co
111b0 6e 74 61 69 6e 73 20 74 68 65 20 49 4e 0a 2a 2a  ntains the IN.**
111c0 20 6f 70 65 72 61 74 6f 72 20 6f 72 20 73 75 62   operator or sub
111d0 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  query..**.** If 
111e0 70 61 72 61 6d 65 74 65 72 20 69 73 52 6f 77 69  parameter isRowi
111f0 64 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  d is non-zero, t
11200 68 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 70  hen expression p
11210 45 78 70 72 20 69 73 20 67 75 61 72 61 6e 74 65  Expr is guarante
11220 65 64 0a 2a 2a 20 74 6f 20 62 65 20 6f 66 20 74  ed.** to be of t
11230 68 65 20 66 6f 72 6d 20 22 3c 72 6f 77 69 64 3e  he form "<rowid>
11240 20 49 4e 20 28 3f 2c 20 3f 2c 20 3f 29 22 2c 20   IN (?, ?, ?)", 
11250 77 68 65 72 65 20 3c 72 6f 77 69 64 3e 20 69 73  where <rowid> is
11260 20 61 20 72 65 66 65 72 65 6e 63 65 0a 2a 2a 20   a reference.** 
11270 74 6f 20 73 6f 6d 65 20 69 6e 74 65 67 65 72 20  to some integer 
11280 6b 65 79 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 20  key column of a 
11290 74 61 62 6c 65 20 42 2d 54 72 65 65 2e 20 49 6e  table B-Tree. In
112a0 20 74 68 69 73 20 63 61 73 65 2c 20 75 73 65 20   this case, use 
112b0 61 6e 0a 2a 2a 20 69 6e 74 6b 65 79 20 42 2d 54  an.** intkey B-T
112c0 72 65 65 20 74 6f 20 73 74 6f 72 65 20 74 68 65  ree to store the
112d0 20 73 65 74 20 6f 66 20 49 4e 28 2e 2e 2e 29 20   set of IN(...) 
112e0 76 61 6c 75 65 73 20 69 6e 73 74 65 61 64 20 6f  values instead o
112f0 66 20 74 68 65 20 75 73 75 61 6c 0a 2a 2a 20 28  f the usual.** (
11300 73 6c 6f 77 65 72 29 20 76 61 72 69 61 62 6c 65  slower) variable
11310 20 6c 65 6e 67 74 68 20 6b 65 79 73 20 42 2d 54   length keys B-T
11320 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72 4d  ree..**.** If rM
11330 61 79 48 61 76 65 4e 75 6c 6c 20 69 73 20 6e 6f  ayHaveNull is no
11340 6e 2d 7a 65 72 6f 2c 20 74 68 61 74 20 6d 65 61  n-zero, that mea
11350 6e 73 20 74 68 61 74 20 74 68 65 20 6f 70 65 72  ns that the oper
11360 61 74 69 6f 6e 20 69 73 20 61 6e 20 49 4e 0a 2a  ation is an IN.*
11370 2a 20 28 6e 6f 74 20 61 20 53 45 4c 45 43 54 20  * (not a SELECT 
11380 6f 72 20 45 58 49 53 54 53 29 20 61 6e 64 20 74  or EXISTS) and t
11390 68 61 74 20 74 68 65 20 52 48 53 20 6d 69 67 68  hat the RHS migh
113a0 74 20 63 6f 6e 74 61 69 6e 73 20 4e 55 4c 4c 73  t contains NULLs
113b0 2e 0a 2a 2a 20 41 6c 6c 20 74 68 69 73 20 72 6f  ..** All this ro
113c0 75 74 69 6e 65 20 64 6f 65 73 20 69 73 20 69 6e  utine does is in
113d0 69 74 69 61 6c 69 7a 65 20 74 68 65 20 72 65 67  itialize the reg
113e0 69 73 74 65 72 20 67 69 76 65 6e 20 62 79 20 72  ister given by r
113f0 4d 61 79 48 61 76 65 4e 75 6c 6c 0a 2a 2a 20 74  MayHaveNull.** t
11400 6f 20 4e 55 4c 4c 2e 20 20 43 61 6c 6c 69 6e 67  o NULL.  Calling
11410 20 72 6f 75 74 69 6e 65 73 20 77 69 6c 6c 20 74   routines will t
11420 61 6b 65 20 63 61 72 65 20 6f 66 20 63 68 61 6e  ake care of chan
11430 67 69 6e 67 20 74 68 69 73 20 72 65 67 69 73 74  ging this regist
11440 65 72 0a 2a 2a 20 76 61 6c 75 65 20 74 6f 20 6e  er.** value to n
11450 6f 6e 2d 4e 55 4c 4c 20 69 66 20 74 68 65 20 52  on-NULL if the R
11460 48 53 20 69 73 20 4e 55 4c 4c 2d 66 72 65 65 2e  HS is NULL-free.
11470 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 53 45 4c  .**.** For a SEL
11480 45 43 54 20 6f 72 20 45 58 49 53 54 53 20 6f 70  ECT or EXISTS op
11490 65 72 61 74 6f 72 2c 20 72 65 74 75 72 6e 20 74  erator, return t
114a0 68 65 20 72 65 67 69 73 74 65 72 20 74 68 61 74  he register that
114b0 20 68 6f 6c 64 73 20 74 68 65 0a 2a 2a 20 72 65   holds the.** re
114c0 73 75 6c 74 2e 20 20 46 6f 72 20 49 4e 20 6f 70  sult.  For IN op
114d0 65 72 61 74 6f 72 73 20 6f 72 20 69 66 20 61 6e  erators or if an
114e0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74   error occurs, t
114f0 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
11500 69 73 20 30 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  is 0..*/.#ifndef
11510 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
11520 51 55 45 52 59 0a 69 6e 74 20 73 71 6c 69 74 65  QUERY.int sqlite
11530 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 0a  3CodeSubselect(.
11540 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
11550 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
11560 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
11570 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20    Expr *pExpr,  
11580 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
11590 20 49 4e 2c 20 53 45 4c 45 43 54 2c 20 6f 72 20   IN, SELECT, or 
115a0 45 58 49 53 54 53 20 6f 70 65 72 61 74 6f 72 20  EXISTS operator 
115b0 2a 2f 0a 20 20 69 6e 74 20 72 48 61 73 4e 75 6c  */.  int rHasNul
115c0 6c 46 6c 61 67 2c 20 20 20 20 20 20 20 2f 2a 20  lFlag,       /* 
115d0 52 65 67 69 73 74 65 72 20 74 68 61 74 20 72 65  Register that re
115e0 63 6f 72 64 73 20 77 68 65 74 68 65 72 20 4e 55  cords whether NU
115f0 4c 4c 73 20 65 78 69 73 74 20 69 6e 20 52 48 53  LLs exist in RHS
11600 20 2a 2f 0a 20 20 69 6e 74 20 69 73 52 6f 77 69   */.  int isRowi
11610 64 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  d             /*
11620 20 49 66 20 74 72 75 65 2c 20 4c 48 53 20 6f 66   If true, LHS of
11630 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 69 73 20   IN operator is 
11640 61 20 72 6f 77 69 64 20 2a 2f 0a 29 7b 0a 20 20  a rowid */.){.  
11650 69 6e 74 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63  int jmpIfDynamic
11660 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20 20   = -1;          
11670 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
11680 6e 65 2d 74 69 6d 65 20 74 65 73 74 20 61 64 64  ne-time test add
11690 72 65 73 73 20 2a 2f 0a 20 20 69 6e 74 20 72 52  ress */.  int rR
116a0 65 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  eg = 0;         
116b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
116c0 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 73 74    /* Register st
116d0 6f 72 69 6e 67 20 72 65 73 75 6c 74 69 6e 67 20  oring resulting 
116e0 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73  */.  Vdbe *v = s
116f0 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
11700 61 72 73 65 29 3b 0a 20 20 69 66 28 20 4e 45 56  arse);.  if( NEV
11710 45 52 28 76 3d 3d 30 29 20 29 20 72 65 74 75 72  ER(v==0) ) retur
11720 6e 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  n 0;.  sqlite3Ex
11730 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72  prCachePush(pPar
11740 73 65 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20  se);..  /* This 
11750 63 6f 64 65 20 6d 75 73 74 20 62 65 20 72 75 6e  code must be run
11760 20 69 6e 20 69 74 73 20 65 6e 74 69 72 65 74 79   in its entirety
11770 20 65 76 65 72 79 20 74 69 6d 65 20 69 74 20 69   every time it i
11780 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 0a 20 20  s encountered.  
11790 2a 2a 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65  ** if any of the
117a0 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 74 72   following is tr
117b0 75 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ue:.  **.  **   
117c0 20 2a 20 20 54 68 65 20 72 69 67 68 74 2d 68 61   *  The right-ha
117d0 6e 64 20 73 69 64 65 20 69 73 20 61 20 63 6f 72  nd side is a cor
117e0 72 65 6c 61 74 65 64 20 73 75 62 71 75 65 72 79  related subquery
117f0 0a 20 20 2a 2a 20 20 20 20 2a 20 20 54 68 65 20  .  **    *  The 
11800 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20  right-hand side 
11810 69 73 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  is an expression
11820 20 6c 69 73 74 20 63 6f 6e 74 61 69 6e 69 6e 67   list containing
11830 20 76 61 72 69 61 62 6c 65 73 0a 20 20 2a 2a 20   variables.  ** 
11840 20 20 20 2a 20 20 57 65 20 61 72 65 20 69 6e 73     *  We are ins
11850 69 64 65 20 61 20 74 72 69 67 67 65 72 0a 20 20  ide a trigger.  
11860 2a 2a 0a 20 20 2a 2a 20 49 66 20 61 6c 6c 20 6f  **.  ** If all o
11870 66 20 74 68 65 20 61 62 6f 76 65 20 61 72 65 20  f the above are 
11880 66 61 6c 73 65 2c 20 74 68 65 6e 20 77 65 20 63  false, then we c
11890 61 6e 20 72 75 6e 20 74 68 69 73 20 63 6f 64 65  an run this code
118a0 20 6a 75 73 74 20 6f 6e 63 65 0a 20 20 2a 2a 20   just once.  ** 
118b0 73 61 76 65 20 74 68 65 20 72 65 73 75 6c 74 73  save the results
118c0 2c 20 61 6e 64 20 72 65 75 73 65 20 74 68 65 20  , and reuse the 
118d0 73 61 6d 65 20 72 65 73 75 6c 74 20 6f 6e 20 73  same result on s
118e0 75 62 73 65 71 75 65 6e 74 20 69 6e 76 6f 63 61  ubsequent invoca
118f0 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  tions..  */.  if
11900 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
11910 74 79 28 70 45 78 70 72 2c 20 45 50 5f 56 61 72  ty(pExpr, EP_Var
11920 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 6a  Select) ){.    j
11930 6d 70 49 66 44 79 6e 61 6d 69 63 20 3d 20 73 71  mpIfDynamic = sq
11940 6c 69 74 65 33 43 6f 64 65 4f 6e 63 65 28 70 50  lite3CodeOnce(pP
11950 61 72 73 65 29 3b 20 56 64 62 65 43 6f 76 65 72  arse); VdbeCover
11960 61 67 65 28 76 29 3b 0a 20 20 7d 0a 0a 23 69 66  age(v);.  }..#if
11970 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
11980 5f 45 58 50 4c 41 49 4e 0a 20 20 69 66 28 20 70  _EXPLAIN.  if( p
11990 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d  Parse->explain==
119a0 32 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  2 ){.    char *z
119b0 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  Msg = sqlite3MPr
119c0 69 6e 74 66 28 70 50 61 72 73 65 2d 3e 64 62 2c  intf(pParse->db,
119d0 20 22 45 58 45 43 55 54 45 20 25 73 25 73 20 53   "EXECUTE %s%s S
119e0 55 42 51 55 45 52 59 20 25 64 22 2c 0a 20 20 20  UBQUERY %d",.   
119f0 20 20 20 20 20 6a 6d 70 49 66 44 79 6e 61 6d 69       jmpIfDynami
11a00 63 3e 3d 30 3f 22 22 3a 22 43 4f 52 52 45 4c 41  c>=0?"":"CORRELA
11a10 54 45 44 20 22 2c 0a 20 20 20 20 20 20 20 20 70  TED ",.        p
11a20 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 3f  Expr->op==TK_IN?
11a30 22 4c 49 53 54 22 3a 22 53 43 41 4c 41 52 22 2c  "LIST":"SCALAR",
11a40 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d  .        pParse-
11a50 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 0a 20  >iNextSelectId. 
11a60 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65     );.    sqlite
11a70 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
11a80 50 5f 45 78 70 6c 61 69 6e 2c 20 70 50 61 72 73  P_Explain, pPars
11a90 65 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 30 2c  e->iSelectId, 0,
11aa0 20 30 2c 20 7a 4d 73 67 2c 20 50 34 5f 44 59 4e   0, zMsg, P4_DYN
11ab0 41 4d 49 43 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  AMIC);.  }.#endi
11ac0 66 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45 78  f..  switch( pEx
11ad0 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61  pr->op ){.    ca
11ae0 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20  se TK_IN: {.    
11af0 20 20 69 6e 74 20 61 64 64 72 3b 20 20 20 20 20    int addr;     
11b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11b10 20 41 64 64 72 65 73 73 20 6f 66 20 4f 50 5f 4f   Address of OP_O
11b20 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e 73  penEphemeral ins
11b30 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  truction */.    
11b40 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20    Expr *pLeft = 
11b50 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 20 2f 2a  pExpr->pLeft; /*
11b60 20 74 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20   the LHS of the 
11b70 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  IN operator */. 
11b80 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b       KeyInfo *pK
11b90 65 79 49 6e 66 6f 20 3d 20 30 3b 20 20 20 20 20  eyInfo = 0;     
11ba0 20 2f 2a 20 4b 65 79 20 69 6e 66 6f 72 6d 61 74   /* Key informat
11bb0 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  ion */.      int
11bc0 20 6e 56 61 6c 3b 20 20 20 20 20 20 20 20 20 20   nVal;          
11bd0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
11be0 20 6f 66 20 76 65 63 74 6f 72 20 70 4c 65 66 74   of vector pLeft
11bf0 20 2a 2f 0a 20 20 20 20 20 20 0a 20 20 20 20 20   */.      .     
11c00 20 6e 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 45   nVal = sqlite3E
11c10 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70 4c  xprVectorSize(pL
11c20 65 66 74 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  eft);..      /* 
11c30 57 68 65 74 68 65 72 20 74 68 69 73 20 69 73 20  Whether this is 
11c40 61 6e 20 27 78 20 49 4e 28 53 45 4c 45 43 54 2e  an 'x IN(SELECT.
11c50 2e 2e 29 27 20 6f 72 20 61 6e 20 27 78 20 49 4e  ..)' or an 'x IN
11c60 28 3c 65 78 70 72 6c 69 73 74 3e 29 27 0a 20 20  (<exprlist>)'.  
11c70 20 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f      ** expressio
11c80 6e 20 69 74 20 69 73 20 68 61 6e 64 6c 65 64 20  n it is handled 
11c90 74 68 65 20 73 61 6d 65 20 77 61 79 2e 20 20 41  the same way.  A
11ca0 6e 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c  n ephemeral tabl
11cb0 65 20 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 66  e is .      ** f
11cc0 69 6c 6c 65 64 20 77 69 74 68 20 73 69 6e 67 6c  illed with singl
11cd0 65 2d 66 69 65 6c 64 20 69 6e 64 65 78 20 6b 65  e-field index ke
11ce0 79 73 20 72 65 70 72 65 73 65 6e 74 69 6e 67 20  ys representing 
11cf0 74 68 65 20 72 65 73 75 6c 74 73 0a 20 20 20 20  the results.    
11d00 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 53 45    ** from the SE
11d10 4c 45 43 54 20 6f 72 20 74 68 65 20 3c 65 78 70  LECT or the <exp
11d20 72 6c 69 73 74 3e 2e 0a 20 20 20 20 20 20 2a 2a  rlist>..      **
11d30 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65  .      ** If the
11d40 20 27 78 27 20 65 78 70 72 65 73 73 69 6f 6e 20   'x' expression 
11d50 69 73 20 61 20 63 6f 6c 75 6d 6e 20 76 61 6c 75  is a column valu
11d60 65 2c 20 6f 72 20 74 68 65 20 53 45 4c 45 43 54  e, or the SELECT
11d70 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 73 74 61  ....      ** sta
11d80 74 65 6d 65 6e 74 20 72 65 74 75 72 6e 73 20 61  tement returns a
11d90 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 2c 20 74   column value, t
11da0 68 65 6e 20 74 68 65 20 61 66 66 69 6e 69 74 79  hen the affinity
11db0 20 6f 66 20 74 68 61 74 0a 20 20 20 20 20 20 2a   of that.      *
11dc0 2a 20 63 6f 6c 75 6d 6e 20 69 73 20 75 73 65 64  * column is used
11dd0 20 74 6f 20 62 75 69 6c 64 20 74 68 65 20 69 6e   to build the in
11de0 64 65 78 20 6b 65 79 73 2e 20 49 66 20 62 6f 74  dex keys. If bot
11df0 68 20 27 78 27 20 61 6e 64 20 74 68 65 0a 20 20  h 'x' and the.  
11e00 20 20 20 20 2a 2a 20 53 45 4c 45 43 54 2e 2e 2e      ** SELECT...
11e10 20 73 74 61 74 65 6d 65 6e 74 20 61 72 65 20 63   statement are c
11e20 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 6e 75 6d  olumns, then num
11e30 65 72 69 63 20 61 66 66 69 6e 69 74 79 20 69 73  eric affinity is
11e40 20 75 73 65 64 0a 20 20 20 20 20 20 2a 2a 20 69   used.      ** i
11e50 66 20 65 69 74 68 65 72 20 63 6f 6c 75 6d 6e 20  f either column 
11e60 68 61 73 20 4e 55 4d 45 52 49 43 20 6f 72 20 49  has NUMERIC or I
11e70 4e 54 45 47 45 52 20 61 66 66 69 6e 69 74 79 2e  NTEGER affinity.
11e80 20 49 66 20 6e 65 69 74 68 65 72 0a 20 20 20 20   If neither.    
11e90 20 20 2a 2a 20 27 78 27 20 6e 6f 72 20 74 68 65    ** 'x' nor the
11ea0 20 53 45 4c 45 43 54 2e 2e 2e 20 73 74 61 74 65   SELECT... state
11eb0 6d 65 6e 74 20 61 72 65 20 63 6f 6c 75 6d 6e 73  ment are columns
11ec0 2c 20 74 68 65 6e 20 6e 75 6d 65 72 69 63 20 61  , then numeric a
11ed0 66 66 69 6e 69 74 79 0a 20 20 20 20 20 20 2a 2a  ffinity.      **
11ee0 20 69 73 20 75 73 65 64 2e 0a 20 20 20 20 20 20   is used..      
11ef0 2a 2f 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  */.      pExpr->
11f00 69 54 61 62 6c 65 20 3d 20 70 50 61 72 73 65 2d  iTable = pParse-
11f10 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 61  >nTab++;.      a
11f20 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
11f30 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70  eAddOp2(v, OP_Op
11f40 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 0a 20 20  enEphemeral, .  
11f50 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69          pExpr->i
11f60 54 61 62 6c 65 2c 20 28 69 73 52 6f 77 69 64 3f  Table, (isRowid?
11f70 30 3a 6e 56 61 6c 29 29 3b 0a 20 20 20 20 20 20  0:nVal));.      
11f80 70 4b 65 79 49 6e 66 6f 20 3d 20 69 73 52 6f 77  pKeyInfo = isRow
11f90 69 64 20 3f 20 30 20 3a 20 73 71 6c 69 74 65 33  id ? 0 : sqlite3
11fa0 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 70 50 61  KeyInfoAlloc(pPa
11fb0 72 73 65 2d 3e 64 62 2c 20 6e 56 61 6c 2c 20 31  rse->db, nVal, 1
11fc0 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 45 78  );..      if( Ex
11fd0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
11fe0 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  xpr, EP_xIsSelec
11ff0 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  t) ){.        /*
12000 20 43 61 73 65 20 31 3a 20 20 20 20 20 65 78 70   Case 1:     exp
12010 72 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e  r IN (SELECT ...
12020 29 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ).        **.   
12030 20 20 20 20 20 2a 2a 20 47 65 6e 65 72 61 74 65       ** Generate
12040 20 63 6f 64 65 20 74 6f 20 77 72 69 74 65 20 74   code to write t
12050 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68  he results of th
12060 65 20 73 65 6c 65 63 74 20 69 6e 74 6f 20 74 68  e select into th
12070 65 20 74 65 6d 70 6f 72 61 72 79 0a 20 20 20 20  e temporary.    
12080 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 61 6c 6c      ** table all
12090 6f 63 61 74 65 64 20 61 6e 64 20 6f 70 65 6e 65  ocated and opene
120a0 64 20 61 62 6f 76 65 2e 0a 20 20 20 20 20 20 20  d above..       
120b0 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 65 6c 65   */.        Sele
120c0 63 74 20 2a 70 53 65 6c 65 63 74 20 3d 20 70 45  ct *pSelect = pE
120d0 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 3b 0a  xpr->x.pSelect;.
120e0 20 20 20 20 20 20 20 20 45 78 70 72 4c 69 73 74          ExprList
120f0 20 2a 70 45 4c 69 73 74 20 3d 20 70 53 65 6c 65   *pEList = pSele
12100 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 0a 20 20 20  ct->pEList;..   
12110 20 20 20 20 20 61 73 73 65 72 74 28 20 21 69 73       assert( !is
12120 52 6f 77 69 64 20 29 3b 0a 20 20 20 20 20 20 20  Rowid );.       
12130 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 6e 45 78   if( pEList->nEx
12140 70 72 21 3d 6e 56 61 6c 20 29 7b 0a 20 20 20 20  pr!=nVal ){.    
12150 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
12160 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 53  orMsg(pParse, "S
12170 45 4c 45 43 54 20 68 61 73 20 25 64 20 63 6f 6c  ELECT has %d col
12180 75 6d 6e 73 20 2d 20 65 78 70 65 63 74 65 64 20  umns - expected 
12190 25 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %d",.           
121a0 20 20 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72     pEList->nExpr
121b0 2c 20 6e 56 61 6c 29 3b 0a 20 20 20 20 20 20 20  , nVal);.       
121c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
121d0 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73    SelectDest des
121e0 74 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  t;.          int
121f0 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71   i;.          sq
12200 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49  lite3SelectDestI
12210 6e 69 74 28 26 64 65 73 74 2c 20 53 52 54 5f 53  nit(&dest, SRT_S
12220 65 74 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  et, pExpr->iTabl
12230 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 64 65  e);.          de
12240 73 74 2e 7a 41 66 66 53 64 73 74 20 3d 20 65 78  st.zAffSdst = ex
12250 70 72 49 4e 41 66 66 69 6e 69 74 79 28 70 50 61  prINAffinity(pPa
12260 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20 20  rse, pExpr);.   
12270 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28         assert( (
12280 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 26 30 78  pExpr->iTable&0x
12290 30 30 30 30 46 46 46 46 29 3d 3d 70 45 78 70 72  0000FFFF)==pExpr
122a0 2d 3e 69 54 61 62 6c 65 20 29 3b 0a 20 20 20 20  ->iTable );.    
122b0 20 20 20 20 20 20 70 53 65 6c 65 63 74 2d 3e 69        pSelect->i
122c0 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20  Limit = 0;.     
122d0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
122e0 53 65 6c 65 63 74 2d 3e 73 65 6c 46 6c 61 67 73  Select->selFlags
122f0 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 20 29   & SF_Distinct )
12300 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  ;.          test
12310 63 61 73 65 28 20 70 4b 65 79 49 6e 66 6f 3d 3d  case( pKeyInfo==
12320 30 20 29 3b 20 2f 2a 20 43 61 75 73 65 64 20 62  0 ); /* Caused b
12330 79 20 4f 4f 4d 20 69 6e 20 73 71 6c 69 74 65 33  y OOM in sqlite3
12340 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 29 20 2a  KeyInfoAlloc() *
12350 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  /.          if( 
12360 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
12370 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2c 20 26  arse, pSelect, &
12380 64 65 73 74 29 20 29 7b 0a 20 20 20 20 20 20 20  dest) ){.       
12390 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
123a0 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 64  ee(pParse->db, d
123b0 65 73 74 2e 7a 41 66 66 53 64 73 74 29 3b 0a 20  est.zAffSdst);. 
123c0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
123d0 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28 70  e3KeyInfoUnref(p
123e0 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  KeyInfo);.      
123f0 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
12400 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
12410 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
12420 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ree(pParse->db, 
12430 64 65 73 74 2e 7a 41 66 66 53 64 73 74 29 3b 0a  dest.zAffSdst);.
12440 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
12450 28 20 70 4b 65 79 49 6e 66 6f 21 3d 30 20 29 3b  ( pKeyInfo!=0 );
12460 20 2f 2a 20 4f 4f 4d 20 77 69 6c 6c 20 63 61 75   /* OOM will cau
12470 73 65 20 65 78 69 74 20 61 66 74 65 72 20 73 71  se exit after sq
12480 6c 69 74 65 33 53 65 6c 65 63 74 28 29 20 2a 2f  lite3Select() */
12490 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
124a0 74 28 20 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a  t( pEList!=0 );.
124b0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
124c0 28 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e  ( pEList->nExpr>
124d0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61  0 );.          a
124e0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 4b 65  ssert( sqlite3Ke
124f0 79 49 6e 66 6f 49 73 57 72 69 74 65 61 62 6c 65  yInfoIsWriteable
12500 28 70 4b 65 79 49 6e 66 6f 29 20 29 3b 0a 20 20  (pKeyInfo) );.  
12510 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
12520 20 69 3c 6e 56 61 6c 3b 20 69 2b 2b 29 7b 0a 20   i<nVal; i++){. 
12530 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20             Expr 
12540 2a 70 20 3d 20 28 6e 56 61 6c 3e 31 29 20 3f 20  *p = (nVal>1) ? 
12550 65 78 70 72 56 65 63 74 6f 72 46 69 65 6c 64 28  exprVectorField(
12560 70 4c 65 66 74 2c 20 69 29 20 3a 20 70 4c 65 66  pLeft, i) : pLef
12570 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  t;.            p
12580 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69  KeyInfo->aColl[i
12590 5d 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72  ] = sqlite3Binar
125a0 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28  yCompareCollSeq(
125b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
125c0 20 70 50 61 72 73 65 2c 20 70 2c 20 70 45 4c 69   pParse, p, pELi
125d0 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 0a 20  st->a[i].pExpr. 
125e0 20 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20             );.  
125f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
12600 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20    }.      }else 
12610 69 66 28 20 41 4c 57 41 59 53 28 70 45 78 70 72  if( ALWAYS(pExpr
12620 2d 3e 78 2e 70 4c 69 73 74 21 3d 30 29 20 29 7b  ->x.pList!=0) ){
12630 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 61 73 65  .        /* Case
12640 20 32 3a 20 20 20 20 20 65 78 70 72 20 49 4e 20   2:     expr IN 
12650 28 65 78 70 72 6c 69 73 74 29 0a 20 20 20 20 20  (exprlist).     
12660 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
12670 20 46 6f 72 20 65 61 63 68 20 65 78 70 72 65 73   For each expres
12680 73 69 6f 6e 2c 20 62 75 69 6c 64 20 61 6e 20 69  sion, build an i
12690 6e 64 65 78 20 6b 65 79 20 66 72 6f 6d 20 74 68  ndex key from th
126a0 65 20 65 76 61 6c 75 61 74 69 6f 6e 20 61 6e 64  e evaluation and
126b0 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 74 6f 72  .        ** stor
126c0 65 20 69 74 20 69 6e 20 74 68 65 20 74 65 6d 70  e it in the temp
126d0 6f 72 61 72 79 20 74 61 62 6c 65 2e 20 49 66 20  orary table. If 
126e0 3c 65 78 70 72 3e 20 69 73 20 61 20 63 6f 6c 75  <expr> is a colu
126f0 6d 6e 2c 20 74 68 65 6e 20 75 73 65 0a 20 20 20  mn, then use.   
12700 20 20 20 20 20 2a 2a 20 74 68 61 74 20 63 6f 6c       ** that col
12710 75 6d 6e 73 20 61 66 66 69 6e 69 74 79 20 77 68  umns affinity wh
12720 65 6e 20 62 75 69 6c 64 69 6e 67 20 69 6e 64 65  en building inde
12730 78 20 6b 65 79 73 2e 20 49 66 20 3c 65 78 70 72  x keys. If <expr
12740 3e 20 69 73 20 6e 6f 74 0a 20 20 20 20 20 20 20  > is not.       
12750 20 2a 2a 20 61 20 63 6f 6c 75 6d 6e 2c 20 75 73   ** a column, us
12760 65 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e 69  e numeric affini
12770 74 79 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ty..        */. 
12780 20 20 20 20 20 20 20 63 68 61 72 20 61 66 66 69         char affi
12790 6e 69 74 79 3b 20 20 20 20 20 20 20 20 20 20 20  nity;           
127a0 20 2f 2a 20 41 66 66 69 6e 69 74 79 20 6f 66 20   /* Affinity of 
127b0 74 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20 49  the LHS of the I
127c0 4e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74  N */.        int
127d0 20 69 3b 0a 20 20 20 20 20 20 20 20 45 78 70 72   i;.        Expr
127e0 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 45  List *pList = pE
127f0 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20  xpr->x.pList;.  
12800 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70        struct Exp
12810 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
12820 6d 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  m;.        int r
12830 31 2c 20 72 32 2c 20 72 33 3b 0a 0a 20 20 20 20  1, r2, r3;..    
12840 20 20 20 20 61 66 66 69 6e 69 74 79 20 3d 20 73      affinity = s
12850 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69  qlite3ExprAffini
12860 74 79 28 70 4c 65 66 74 29 3b 0a 20 20 20 20 20  ty(pLeft);.     
12870 20 20 20 69 66 28 20 21 61 66 66 69 6e 69 74 79     if( !affinity
12880 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 66   ){.          af
12890 66 69 6e 69 74 79 20 3d 20 53 51 4c 49 54 45 5f  finity = SQLITE_
128a0 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 20 20 20 20  AFF_BLOB;.      
128b0 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
128c0 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20  pKeyInfo ){.    
128d0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71        assert( sq
128e0 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49 73 57 72  lite3KeyInfoIsWr
128f0 69 74 65 61 62 6c 65 28 70 4b 65 79 49 6e 66 6f  iteable(pKeyInfo
12900 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  ) );.          p
12910 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 30  KeyInfo->aColl[0
12920 5d 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  ] = sqlite3ExprC
12930 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
12940 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
12950 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
12960 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68   /* Loop through
12970 20 65 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e   each expression
12980 20 69 6e 20 3c 65 78 70 72 6c 69 73 74 3e 2e 20   in <exprlist>. 
12990 2a 2f 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20  */.        r1 = 
129a0 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
129b0 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
129c0 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 47     r2 = sqlite3G
129d0 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
129e0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  );.        if( i
129f0 73 52 6f 77 69 64 20 29 20 73 71 6c 69 74 65 33  sRowid ) sqlite3
12a00 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
12a10 5f 4e 75 6c 6c 2c 20 30 2c 20 72 32 29 3b 0a 20  _Null, 0, r2);. 
12a20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 70 4c 69         for(i=pLi
12a30 73 74 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d  st->nExpr, pItem
12a40 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3e 30 3b 20  =pList->a; i>0; 
12a50 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  i--, pItem++){. 
12a60 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70           Expr *p
12a70 45 32 20 3d 20 70 49 74 65 6d 2d 3e 70 45 78 70  E2 = pItem->pExp
12a80 72 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  r;.          int
12a90 20 69 56 61 6c 54 6f 49 6e 73 3b 0a 0a 20 20 20   iValToIns;..   
12aa0 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65         /* If the
12ab0 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6e   expression is n
12ac0 6f 74 20 63 6f 6e 73 74 61 6e 74 20 74 68 65 6e  ot constant then
12ad0 20 77 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f   we will need to
12ae0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 64 69  .          ** di
12af0 73 61 62 6c 65 20 74 68 65 20 74 65 73 74 20 74  sable the test t
12b00 68 61 74 20 77 61 73 20 67 65 6e 65 72 61 74 65  hat was generate
12b10 64 20 61 62 6f 76 65 20 74 68 61 74 20 6d 61 6b  d above that mak
12b20 65 73 20 73 75 72 65 0a 20 20 20 20 20 20 20 20  es sure.        
12b30 20 20 2a 2a 20 74 68 69 73 20 63 6f 64 65 20 6f    ** this code o
12b40 6e 6c 79 20 65 78 65 63 75 74 65 73 20 6f 6e 63  nly executes onc
12b50 65 2e 20 20 42 65 63 61 75 73 65 20 66 6f 72 20  e.  Because for 
12b60 61 20 6e 6f 6e 2d 63 6f 6e 73 74 61 6e 74 0a 20  a non-constant. 
12b70 20 20 20 20 20 20 20 20 20 2a 2a 20 65 78 70 72           ** expr
12b80 65 73 73 69 6f 6e 20 77 65 20 6e 65 65 64 20 74  ession we need t
12b90 6f 20 72 65 72 75 6e 20 74 68 69 73 20 63 6f 64  o rerun this cod
12ba0 65 20 65 61 63 68 20 74 69 6d 65 2e 0a 20 20 20  e each time..   
12bb0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
12bc0 20 20 20 20 69 66 28 20 6a 6d 70 49 66 44 79 6e      if( jmpIfDyn
12bd0 61 6d 69 63 3e 3d 30 20 26 26 20 21 73 71 6c 69  amic>=0 && !sqli
12be0 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
12bf0 74 28 70 45 32 29 20 29 7b 0a 20 20 20 20 20 20  t(pE2) ){.      
12c00 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
12c10 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c  eChangeToNoop(v,
12c20 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63 29 3b 0a   jmpIfDynamic);.
12c30 20 20 20 20 20 20 20 20 20 20 20 20 6a 6d 70 49              jmpI
12c40 66 44 79 6e 61 6d 69 63 20 3d 20 2d 31 3b 0a 20  fDynamic = -1;. 
12c50 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20           }..    
12c60 20 20 20 20 20 20 2f 2a 20 45 76 61 6c 75 61 74        /* Evaluat
12c70 65 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  e the expression
12c80 20 61 6e 64 20 69 6e 73 65 72 74 20 69 74 20 69   and insert it i
12c90 6e 74 6f 20 74 68 65 20 74 65 6d 70 20 74 61 62  nto the temp tab
12ca0 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  le */.          
12cb0 69 66 28 20 69 73 52 6f 77 69 64 20 26 26 20 73  if( isRowid && s
12cc0 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65  qlite3ExprIsInte
12cd0 67 65 72 28 70 45 32 2c 20 26 69 56 61 6c 54 6f  ger(pE2, &iValTo
12ce0 49 6e 73 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Ins) ){.        
12cf0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
12d00 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65  ddOp3(v, OP_Inse
12d10 72 74 49 6e 74 2c 20 70 45 78 70 72 2d 3e 69 54  rtInt, pExpr->iT
12d20 61 62 6c 65 2c 20 72 32 2c 20 69 56 61 6c 54 6f  able, r2, iValTo
12d30 49 6e 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Ins);.          
12d40 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
12d50 20 20 20 72 33 20 3d 20 73 71 6c 69 74 65 33 45     r3 = sqlite3E
12d60 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50  xprCodeTarget(pP
12d70 61 72 73 65 2c 20 70 45 32 2c 20 72 31 29 3b 0a  arse, pE2, r1);.
12d80 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
12d90 69 73 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20  isRowid ){.     
12da0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
12db0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
12dc0 5f 4d 75 73 74 42 65 49 6e 74 2c 20 72 33 2c 0a  _MustBeInt, r3,.
12dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12df0 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
12e00 6e 74 41 64 64 72 28 76 29 2b 32 29 3b 0a 20 20  ntAddr(v)+2);.  
12e10 20 20 20 20 20 20 20 20 20 20 20 20 56 64 62 65              Vdbe
12e20 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
12e30 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
12e40 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
12e50 4f 50 5f 49 6e 73 65 72 74 2c 20 70 45 78 70 72  OP_Insert, pExpr
12e60 2d 3e 69 54 61 62 6c 65 2c 20 72 32 2c 20 72 33  ->iTable, r2, r3
12e70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
12e80 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
12e90 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
12ea0 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp4(v, OP_Make
12eb0 52 65 63 6f 72 64 2c 20 72 33 2c 20 31 2c 20 72  Record, r3, 1, r
12ec0 32 2c 20 26 61 66 66 69 6e 69 74 79 2c 20 31 29  2, &affinity, 1)
12ed0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
12ee0 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
12ef0 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70  AffinityChange(p
12f00 50 61 72 73 65 2c 20 72 33 2c 20 31 29 3b 0a 20  Parse, r3, 1);. 
12f10 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
12f20 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
12f30 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20  , OP_IdxInsert, 
12f40 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 72  pExpr->iTable, r
12f50 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  2);.            
12f60 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
12f70 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
12f80 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
12f90 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31  mpReg(pParse, r1
12fa0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
12fb0 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
12fc0 28 70 50 61 72 73 65 2c 20 72 32 29 3b 0a 20 20  (pParse, r2);.  
12fd0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
12fe0 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20  pKeyInfo ){.    
12ff0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
13000 68 61 6e 67 65 50 34 28 76 2c 20 61 64 64 72 2c  hangeP4(v, addr,
13010 20 28 76 6f 69 64 20 2a 29 70 4b 65 79 49 6e 66   (void *)pKeyInf
13020 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a  o, P4_KEYINFO);.
13030 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
13040 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
13050 63 61 73 65 20 54 4b 5f 45 58 49 53 54 53 3a 0a  case TK_EXISTS:.
13060 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45      case TK_SELE
13070 43 54 3a 0a 20 20 20 20 64 65 66 61 75 6c 74 3a  CT:.    default:
13080 20 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74   {.      /* If t
13090 68 69 73 20 68 61 73 20 74 6f 20 62 65 20 61 20  his has to be a 
130a0 73 63 61 6c 61 72 20 53 45 4c 45 43 54 2e 20 20  scalar SELECT.  
130b0 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
130c0 20 70 75 74 20 74 68 65 0a 20 20 20 20 20 20 2a   put the.      *
130d0 2a 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20  * value of this 
130e0 73 65 6c 65 63 74 20 69 6e 20 61 20 6d 65 6d 6f  select in a memo
130f0 72 79 20 63 65 6c 6c 20 61 6e 64 20 72 65 63 6f  ry cell and reco
13100 72 64 20 74 68 65 20 6e 75 6d 62 65 72 0a 20 20  rd the number.  
13110 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 6d 65      ** of the me
13120 6d 6f 72 79 20 63 65 6c 6c 20 69 6e 20 69 43 6f  mory cell in iCo
13130 6c 75 6d 6e 2e 20 20 49 66 20 74 68 69 73 20 69  lumn.  If this i
13140 73 20 61 6e 20 45 58 49 53 54 53 2c 20 77 72 69  s an EXISTS, wri
13150 74 65 0a 20 20 20 20 20 20 2a 2a 20 61 6e 20 69  te.      ** an i
13160 6e 74 65 67 65 72 20 30 20 28 6e 6f 74 20 65 78  nteger 0 (not ex
13170 69 73 74 73 29 20 6f 72 20 31 20 28 65 78 69 73  ists) or 1 (exis
13180 74 73 29 20 69 6e 74 6f 20 61 20 6d 65 6d 6f 72  ts) into a memor
13190 79 20 63 65 6c 6c 0a 20 20 20 20 20 20 2a 2a 20  y cell.      ** 
131a0 61 6e 64 20 72 65 63 6f 72 64 20 74 68 61 74 20  and record that 
131b0 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 69 6e 20 69  memory cell in i
131c0 43 6f 6c 75 6d 6e 2e 0a 20 20 20 20 20 20 2a 2f  Column..      */
131d0 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70  .      Select *p
131e0 53 65 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Sel;            
131f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13200 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
13210 20 74 6f 20 65 6e 63 6f 64 65 20 2a 2f 0a 20 20   to encode */.  
13220 20 20 20 20 53 65 6c 65 63 74 44 65 73 74 20 64      SelectDest d
13230 65 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  est;            
13240 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f 77            /* How
13250 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 53 45   to deal with SE
13260 4c 45 43 74 20 72 65 73 75 6c 74 20 2a 2f 0a 20  LECt result */. 
13270 20 20 20 20 20 69 6e 74 20 6e 52 65 67 3b 20 20       int nReg;  
13280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13290 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
132a0 67 69 73 74 65 72 73 20 74 6f 20 61 6c 6c 6f 63  gisters to alloc
132b0 61 74 65 20 2a 2f 0a 0a 20 20 20 20 20 20 74 65  ate */..      te
132c0 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
132d0 70 3d 3d 54 4b 5f 45 58 49 53 54 53 20 29 3b 0a  p==TK_EXISTS );.
132e0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
132f0 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45  pExpr->op==TK_SE
13300 4c 45 43 54 20 29 3b 0a 20 20 20 20 20 20 61 73  LECT );.      as
13310 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d  sert( pExpr->op=
13320 3d 54 4b 5f 45 58 49 53 54 53 20 7c 7c 20 70 45  =TK_EXISTS || pE
13330 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45  xpr->op==TK_SELE
13340 43 54 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  CT );.      asse
13350 72 74 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  rt( ExprHasPrope
13360 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49  rty(pExpr, EP_xI
13370 73 53 65 6c 65 63 74 29 20 29 3b 0a 0a 20 20 20  sSelect) );..   
13380 20 20 20 70 53 65 6c 20 3d 20 70 45 78 70 72 2d     pSel = pExpr-
13390 3e 78 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20  >x.pSelect;.    
133a0 20 20 6e 52 65 67 20 3d 20 70 45 78 70 72 2d 3e    nReg = pExpr->
133b0 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 3f 20  op==TK_SELECT ? 
133c0 70 53 65 6c 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  pSel->pEList->nE
133d0 78 70 72 20 3a 20 31 3b 0a 20 20 20 20 20 20 73  xpr : 1;.      s
133e0 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74  qlite3SelectDest
133f0 49 6e 69 74 28 26 64 65 73 74 2c 20 30 2c 20 70  Init(&dest, 0, p
13400 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 29 3b 0a  Parse->nMem+1);.
13410 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d        pParse->nM
13420 65 6d 20 2b 3d 20 6e 52 65 67 3b 0a 20 20 20 20  em += nReg;.    
13430 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d    if( pExpr->op=
13440 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a 20 20  =TK_SELECT ){.  
13450 20 20 20 20 20 20 64 65 73 74 2e 65 44 65 73 74        dest.eDest
13460 20 3d 20 53 52 54 5f 4d 65 6d 3b 0a 20 20 20 20   = SRT_Mem;.    
13470 20 20 20 20 64 65 73 74 2e 69 53 64 73 74 20 3d      dest.iSdst =
13480 20 64 65 73 74 2e 69 53 44 50 61 72 6d 3b 0a 20   dest.iSDParm;. 
13490 20 20 20 20 20 20 20 64 65 73 74 2e 6e 53 64 73         dest.nSds
134a0 74 20 3d 20 6e 52 65 67 3b 0a 20 20 20 20 20 20  t = nReg;.      
134b0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
134c0 4f 70 33 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  Op3(v, OP_Null, 
134d0 30 2c 20 64 65 73 74 2e 69 53 44 50 61 72 6d 2c  0, dest.iSDParm,
134e0 20 64 65 73 74 2e 69 53 44 50 61 72 6d 2b 6e 52   dest.iSDParm+nR
134f0 65 67 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 56  eg-1);.        V
13500 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
13510 49 6e 69 74 20 73 75 62 71 75 65 72 79 20 72 65  Init subquery re
13520 73 75 6c 74 22 29 29 3b 0a 20 20 20 20 20 20 7d  sult"));.      }
13530 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 64 65  else{.        de
13540 73 74 2e 65 44 65 73 74 20 3d 20 53 52 54 5f 45  st.eDest = SRT_E
13550 78 69 73 74 73 3b 0a 20 20 20 20 20 20 20 20 73  xists;.        s
13560 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
13570 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
13580 30 2c 20 64 65 73 74 2e 69 53 44 50 61 72 6d 29  0, dest.iSDParm)
13590 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
135a0 6d 6d 65 6e 74 28 28 76 2c 20 22 49 6e 69 74 20  mment((v, "Init 
135b0 45 58 49 53 54 53 20 72 65 73 75 6c 74 22 29 29  EXISTS result"))
135c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
135d0 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
135e0 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 53  e(pParse->db, pS
135f0 65 6c 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20  el->pLimit);.   
13600 20 20 20 70 53 65 6c 2d 3e 70 4c 69 6d 69 74 20     pSel->pLimit 
13610 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
13620 50 61 72 73 65 2c 20 54 4b 5f 49 4e 54 45 47 45  Parse, TK_INTEGE
13630 52 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20  R, 0, 0,.       
13640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13650 20 20 20 20 20 20 20 20 20 20 20 26 73 71 6c 69             &sqli
13660 74 65 33 49 6e 74 54 6f 6b 65 6e 73 5b 31 5d 29  te3IntTokens[1])
13670 3b 0a 20 20 20 20 20 20 70 53 65 6c 2d 3e 69 4c  ;.      pSel->iL
13680 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  imit = 0;.      
13690 70 53 65 6c 2d 3e 73 65 6c 46 6c 61 67 73 20 26  pSel->selFlags &
136a0 3d 20 7e 53 46 5f 4d 75 6c 74 69 56 61 6c 75 65  = ~SF_MultiValue
136b0 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  ;.      if( sqli
136c0 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
136d0 2c 20 70 53 65 6c 2c 20 26 64 65 73 74 29 20 29  , pSel, &dest) )
136e0 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
136f0 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
13700 20 20 72 52 65 67 20 3d 20 64 65 73 74 2e 69 53    rReg = dest.iS
13710 44 50 61 72 6d 3b 0a 20 20 20 20 20 20 45 78 70  DParm;.      Exp
13720 72 53 65 74 56 56 41 50 72 6f 70 65 72 74 79 28  rSetVVAProperty(
13730 70 45 78 70 72 2c 20 45 50 5f 4e 6f 52 65 64 75  pExpr, EP_NoRedu
13740 63 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ce);.      break
13750 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  ;.    }.  }..  i
13760 66 28 20 72 48 61 73 4e 75 6c 6c 46 6c 61 67 20  f( rHasNullFlag 
13770 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65  ){.    sqlite3Se
13780 74 48 61 73 4e 75 6c 6c 46 6c 61 67 28 76 2c 20  tHasNullFlag(v, 
13790 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 72  pExpr->iTable, r
137a0 48 61 73 4e 75 6c 6c 46 6c 61 67 29 3b 0a 20 20  HasNullFlag);.  
137b0 7d 0a 0a 20 20 69 66 28 20 6a 6d 70 49 66 44 79  }..  if( jmpIfDy
137c0 6e 61 6d 69 63 3e 3d 30 20 29 7b 0a 20 20 20 20  namic>=0 ){.    
137d0 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
137e0 65 72 65 28 76 2c 20 6a 6d 70 49 66 44 79 6e 61  ere(v, jmpIfDyna
137f0 6d 69 63 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  mic);.  }.  sqli
13800 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28  te3ExprCachePop(
13810 70 50 61 72 73 65 29 3b 0a 0a 20 20 72 65 74 75  pParse);..  retu
13820 72 6e 20 72 52 65 67 3b 0a 7d 0a 23 65 6e 64 69  rn rReg;.}.#endi
13830 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
13840 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 23 69  _SUBQUERY */..#i
13850 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
13860 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a  T_SUBQUERY./*.**
13870 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
13880 6f 72 20 61 6e 20 49 4e 20 65 78 70 72 65 73 73  or an IN express
13890 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  ion..**.**      
138a0 78 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e  x IN (SELECT ...
138b0 29 0a 2a 2a 20 20 20 20 20 20 78 20 49 4e 20 28  ).**      x IN (
138c0 76 61 6c 75 65 2c 20 76 61 6c 75 65 2c 20 2e 2e  value, value, ..
138d0 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 65 66  .).**.** The lef
138e0 74 2d 68 61 6e 64 20 73 69 64 65 20 28 4c 48 53  t-hand side (LHS
138f0 29 20 69 73 20 61 20 73 63 61 6c 61 72 20 65 78  ) is a scalar ex
13900 70 72 65 73 73 69 6f 6e 2e 20 20 54 68 65 20 72  pression.  The r
13910 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 28  ight-hand side (
13920 52 48 53 29 0a 2a 2a 20 69 73 20 61 6e 20 61 72  RHS).** is an ar
13930 72 61 79 20 6f 66 20 7a 65 72 6f 20 6f 72 20 6d  ray of zero or m
13940 6f 72 65 20 76 61 6c 75 65 73 2e 20 20 54 68 65  ore values.  The
13950 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74   expression is t
13960 72 75 65 20 69 66 20 74 68 65 20 4c 48 53 20 69  rue if the LHS i
13970 73 0a 2a 2a 20 63 6f 6e 74 61 69 6e 65 64 20 77  s.** contained w
13980 69 74 68 69 6e 20 74 68 65 20 52 48 53 2e 20 20  ithin the RHS.  
13990 54 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  The value of the
139a0 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 75   expression is u
139b0 6e 6b 6e 6f 77 6e 20 28 4e 55 4c 4c 29 0a 2a 2a  nknown (NULL).**
139c0 20 69 66 20 74 68 65 20 4c 48 53 20 69 73 20 4e   if the LHS is N
139d0 55 4c 4c 20 6f 72 20 69 66 20 74 68 65 20 4c 48  ULL or if the LH
139e0 53 20 69 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e  S is not contain
139f0 65 64 20 77 69 74 68 69 6e 20 74 68 65 20 52 48  ed within the RH
13a00 53 20 61 6e 64 20 74 68 65 0a 2a 2a 20 52 48 53  S and the.** RHS
13a10 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72   contains one or
13a20 20 6d 6f 72 65 20 4e 55 4c 4c 20 76 61 6c 75 65   more NULL value
13a30 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
13a40 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20  utine generates 
13a50 63 6f 64 65 20 74 68 61 74 20 6a 75 6d 70 73 20  code that jumps 
13a60 74 6f 20 64 65 73 74 49 66 46 61 6c 73 65 20 69  to destIfFalse i
13a70 66 20 74 68 65 20 4c 48 53 20 69 73 20 6e 6f 74  f the LHS is not
13a80 20 0a 2a 2a 20 63 6f 6e 74 61 69 6e 65 64 20 77   .** contained w
13a90 69 74 68 69 6e 20 74 68 65 20 52 48 53 2e 20 20  ithin the RHS.  
13aa0 49 66 20 64 75 65 20 74 6f 20 4e 55 4c 4c 73 20  If due to NULLs 
13ab0 77 65 20 63 61 6e 6e 6f 74 20 64 65 74 65 72 6d  we cannot determ
13ac0 69 6e 65 20 69 66 20 74 68 65 20 4c 48 53 0a 2a  ine if the LHS.*
13ad0 2a 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20 69  * is contained i
13ae0 6e 20 74 68 65 20 52 48 53 20 74 68 65 6e 20 6a  n the RHS then j
13af0 75 6d 70 20 74 6f 20 64 65 73 74 49 66 4e 75 6c  ump to destIfNul
13b00 6c 2e 20 20 49 66 20 74 68 65 20 4c 48 53 20 69  l.  If the LHS i
13b10 73 20 63 6f 6e 74 61 69 6e 65 64 0a 2a 2a 20 77  s contained.** w
13b20 69 74 68 69 6e 20 74 68 65 20 52 48 53 20 74 68  ithin the RHS th
13b30 65 6e 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 2e  en fall through.
13b40 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
13b50 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49  sqlite3ExprCodeI
13b60 4e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  N(.  Parse *pPar
13b70 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61  se,        /* Pa
13b80 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67  rsing and code g
13b90 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78  enerating contex
13ba0 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78  t */.  Expr *pEx
13bb0 70 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  pr,          /* 
13bc0 54 68 65 20 49 4e 20 65 78 70 72 65 73 73 69 6f  The IN expressio
13bd0 6e 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 49  n */.  int destI
13be0 66 46 61 6c 73 65 2c 20 20 20 20 20 20 2f 2a 20  fFalse,      /* 
13bf0 4a 75 6d 70 20 68 65 72 65 20 69 66 20 4c 48 53  Jump here if LHS
13c00 20 69 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65   is not containe
13c10 64 20 69 6e 20 74 68 65 20 52 48 53 20 2a 2f 0a  d in the RHS */.
13c20 20 20 69 6e 74 20 64 65 73 74 49 66 4e 75 6c 6c    int destIfNull
13c30 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
13c40 68 65 72 65 20 69 66 20 74 68 65 20 72 65 73 75  here if the resu
13c50 6c 74 73 20 61 72 65 20 75 6e 6b 6e 6f 77 6e 20  lts are unknown 
13c60 64 75 65 20 74 6f 20 4e 55 4c 4c 73 20 2a 2f 0a  due to NULLs */.
13c70 29 7b 0a 20 20 69 6e 74 20 72 52 68 73 48 61 73  ){.  int rRhsHas
13c80 4e 75 6c 6c 20 3d 20 30 3b 20 20 2f 2a 20 52 65  Null = 0;  /* Re
13c90 67 69 73 74 65 72 20 74 68 61 74 20 69 73 20 74  gister that is t
13ca0 72 75 65 20 69 66 20 52 48 53 20 63 6f 6e 74 61  rue if RHS conta
13cb0 69 6e 73 20 4e 55 4c 4c 20 76 61 6c 75 65 73 20  ins NULL values 
13cc0 2a 2f 0a 20 20 69 6e 74 20 65 54 79 70 65 3b 20  */.  int eType; 
13cd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 79             /* Ty
13ce0 70 65 20 6f 66 20 74 68 65 20 52 48 53 20 2a 2f  pe of the RHS */
13cf0 0a 20 20 69 6e 74 20 72 31 3b 20 20 20 20 20 20  .  int r1;      
13d00 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70           /* Temp
13d10 6f 72 61 72 79 20 75 73 65 20 72 65 67 69 73 74  orary use regist
13d20 65 72 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b  er */.  Vdbe *v;
13d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13d40 20 53 74 61 74 65 6d 65 6e 74 20 75 6e 64 65 72   Statement under
13d50 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f   construction */
13d60 0a 20 20 69 6e 74 20 2a 61 69 4d 61 70 20 3d 20  .  int *aiMap = 
13d70 30 3b 20 20 20 20 20 20 20 2f 2a 20 4d 61 70 20  0;       /* Map 
13d80 66 72 6f 6d 20 76 65 63 74 6f 72 20 66 69 65 6c  from vector fiel
13d90 64 20 74 6f 20 69 6e 64 65 78 20 63 6f 6c 75 6d  d to index colum
13da0 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 41 66  n */.  char *zAf
13db0 66 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  f = 0;       /* 
13dc0 41 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20  Affinity string 
13dd0 66 6f 72 20 63 6f 6d 70 61 72 69 73 6f 6e 73 20  for comparisons 
13de0 2a 2f 0a 20 20 69 6e 74 20 6e 56 65 63 74 6f 72  */.  int nVector
13df0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69  ;          /* Si
13e00 7a 65 20 6f 66 20 76 65 63 74 6f 72 73 20 66 6f  ze of vectors fo
13e10 72 20 74 68 69 73 20 49 4e 28 2e 2e 2e 29 20 6f  r this IN(...) o
13e20 70 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 53 65  p */.  int regSe
13e30 6c 65 63 74 20 3d 20 30 3b 0a 20 20 45 78 70 72  lect = 0;.  Expr
13e40 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d   *pLeft = pExpr-
13e50 3e 70 4c 65 66 74 3b 0a 20 20 69 6e 74 20 69 3b  >pLeft;.  int i;
13e60 0a 0a 20 20 6e 56 65 63 74 6f 72 20 3d 20 73 71  ..  nVector = sq
13e70 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f 72 53  lite3ExprVectorS
13e80 69 7a 65 28 70 45 78 70 72 2d 3e 70 4c 65 66 74  ize(pExpr->pLeft
13e90 29 3b 0a 20 20 61 69 4d 61 70 20 3d 20 28 69 6e  );.  aiMap = (in
13ea0 74 2a 29 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c  t*)sqlite3DbMall
13eb0 6f 63 5a 65 72 6f 28 0a 20 20 20 20 20 20 70 50  ocZero(.      pP
13ec0 61 72 73 65 2d 3e 64 62 2c 20 6e 56 65 63 74 6f  arse->db, nVecto
13ed0 72 2a 28 73 69 7a 65 6f 66 28 69 6e 74 29 20 2b  r*(sizeof(int) +
13ee0 20 73 69 7a 65 6f 66 28 63 68 61 72 29 29 20 2b   sizeof(char)) +
13ef0 20 31 0a 20 20 29 3b 0a 20 20 69 66 28 20 21 61   1.  );.  if( !a
13f00 69 4d 61 70 20 29 20 72 65 74 75 72 6e 3b 0a 20  iMap ) return;. 
13f10 20 7a 41 66 66 20 3d 20 28 63 68 61 72 2a 29 26   zAff = (char*)&
13f20 61 69 4d 61 70 5b 6e 56 65 63 74 6f 72 5d 3b 0a  aiMap[nVector];.
13f30 0a 20 20 2f 2a 20 41 74 74 65 6d 70 74 20 74 6f  .  /* Attempt to
13f40 20 63 6f 6d 70 75 74 65 20 74 68 65 20 52 48 53   compute the RHS
13f50 2e 20 41 66 74 65 72 20 74 68 69 73 20 73 74 65  . After this ste
13f60 70 2c 20 69 66 20 61 6e 79 74 68 69 6e 67 20 6f  p, if anything o
13f70 74 68 65 72 20 74 68 61 6e 0a 20 20 2a 2a 20 49  ther than.  ** I
13f80 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 20 69 73 20  N_INDEX_NOOP is 
13f90 72 65 74 75 72 6e 65 64 2c 20 74 68 65 20 74 61  returned, the ta
13fa0 62 6c 65 20 6f 70 65 6e 65 64 20 69 74 68 20 63  ble opened ith c
13fb0 75 72 73 6f 72 20 70 45 78 70 72 2d 3e 69 54 61  ursor pExpr->iTa
13fc0 62 6c 65 20 0a 20 20 2a 2a 20 63 6f 6e 74 61 69  ble .  ** contai
13fd0 6e 73 20 74 68 65 20 76 61 6c 75 65 73 20 74 68  ns the values th
13fe0 61 74 20 6d 61 6b 65 20 75 70 20 74 68 65 20 52  at make up the R
13ff0 48 53 2e 20 49 66 20 49 4e 5f 49 4e 44 45 58 5f  HS. If IN_INDEX_
14000 4e 4f 4f 50 20 69 73 20 72 65 74 75 72 6e 65 64  NOOP is returned
14010 2c 0a 20 20 2a 2a 20 74 68 65 20 52 48 53 20 68  ,.  ** the RHS h
14020 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20  as not yet been 
14030 63 6f 64 65 64 2e 20 20 2a 2f 0a 20 20 76 20 3d  coded.  */.  v =
14040 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
14050 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29    assert( v!=0 )
14060 3b 20 20 20 20 20 20 20 2f 2a 20 4f 4f 4d 20 64  ;       /* OOM d
14070 65 74 65 63 74 65 64 20 70 72 69 6f 72 20 74 6f  etected prior to
14080 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 2a 2f   this routine */
14090 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65  .  VdbeNoopComme
140a0 6e 74 28 28 76 2c 20 22 62 65 67 69 6e 20 49 4e  nt((v, "begin IN
140b0 20 65 78 70 72 22 29 29 3b 0a 20 20 65 54 79 70   expr"));.  eTyp
140c0 65 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49  e = sqlite3FindI
140d0 6e 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70  nIndex(pParse, p
140e0 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20  Expr,.          
140f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14100 20 20 20 49 4e 5f 49 4e 44 45 58 5f 4d 45 4d 42     IN_INDEX_MEMB
14110 45 52 53 48 49 50 20 7c 20 49 4e 5f 49 4e 44 45  ERSHIP | IN_INDE
14120 58 5f 4e 4f 4f 50 5f 4f 4b 2c 0a 20 20 20 20 20  X_NOOP_OK,.     
14130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14140 20 20 20 20 20 20 20 20 64 65 73 74 49 66 46 61          destIfFa
14150 6c 73 65 3d 3d 64 65 73 74 49 66 4e 75 6c 6c 20  lse==destIfNull 
14160 3f 20 30 20 3a 20 26 72 52 68 73 48 61 73 4e 75  ? 0 : &rRhsHasNu
14170 6c 6c 2c 20 61 69 4d 61 70 29 3b 0a 0a 20 20 61  ll, aiMap);..  a
14180 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e  ssert( pParse->n
14190 45 72 72 20 7c 7c 20 6e 56 65 63 74 6f 72 3d 3d  Err || nVector==
141a0 31 20 7c 7c 20 65 54 79 70 65 3d 3d 49 4e 5f 49  1 || eType==IN_I
141b0 4e 44 45 58 5f 45 50 48 0a 20 20 20 20 20 20 20  NDEX_EPH.       
141c0 7c 7c 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44  || eType==IN_IND
141d0 45 58 5f 49 4e 44 45 58 5f 41 53 43 20 7c 7c 20  EX_INDEX_ASC || 
141e0 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f  eType==IN_INDEX_
141f0 49 4e 44 45 58 5f 44 45 53 43 20 0a 20 20 29 3b  INDEX_DESC .  );
14200 0a 0a 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20  ..  /* Code the 
14210 4c 48 53 2c 20 74 68 65 20 3c 65 78 70 72 3e 20  LHS, the <expr> 
14220 66 72 6f 6d 20 22 3c 65 78 70 72 3e 20 49 4e 20  from "<expr> IN 
14230 28 2e 2e 2e 29 22 2e 20 49 66 20 74 68 65 20 4c  (...)". If the L
14240 48 53 20 69 73 20 61 20 0a 20 20 2a 2a 20 76 65  HS is a .  ** ve
14250 63 74 6f 72 2c 20 74 68 65 6e 20 69 74 20 69 73  ctor, then it is
14260 20 73 74 6f 72 65 64 20 69 6e 20 61 6e 20 61 72   stored in an ar
14270 72 61 79 20 6f 66 20 6e 56 65 63 74 6f 72 20 72  ray of nVector r
14280 65 67 69 73 74 65 72 73 20 73 74 61 72 74 69 6e  egisters startin
14290 67 20 0a 20 20 2a 2a 20 61 74 20 72 31 2e 0a 20  g .  ** at r1.. 
142a0 20 2a 2f 0a 20 20 72 31 20 3d 20 73 71 6c 69 74   */.  r1 = sqlit
142b0 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70  e3GetTempRange(p
142c0 50 61 72 73 65 2c 20 6e 56 65 63 74 6f 72 29 3b  Parse, nVector);
142d0 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  .  sqlite3ExprCa
142e0 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b  chePush(pParse);
142f0 0a 20 20 69 66 28 20 6e 56 65 63 74 6f 72 3e 31  .  if( nVector>1
14300 20 26 26 20 28 70 4c 65 66 74 2d 3e 66 6c 61 67   && (pLeft->flag
14310 73 20 26 20 45 50 5f 78 49 73 53 65 6c 65 63 74  s & EP_xIsSelect
14320 29 20 29 7b 0a 20 20 20 20 72 65 67 53 65 6c 65  ) ){.    regSele
14330 63 74 20 3d 20 73 71 6c 69 74 65 33 43 6f 64 65  ct = sqlite3Code
14340 53 75 62 73 65 6c 65 63 74 28 70 50 61 72 73 65  Subselect(pParse
14350 2c 20 70 4c 65 66 74 2c 20 30 2c 20 30 29 3b 0a  , pLeft, 0, 0);.
14360 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69    }.  for(i=0; i
14370 3c 6e 56 65 63 74 6f 72 3b 20 69 2b 2b 29 7b 0a  <nVector; i++){.
14380 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 61      int iCol = a
14390 69 4d 61 70 5b 69 5d 3b 0a 20 20 20 20 45 78 70  iMap[i];.    Exp
143a0 72 20 2a 70 4c 68 73 20 3d 20 65 78 70 72 56 65  r *pLhs = exprVe
143b0 63 74 6f 72 46 69 65 6c 64 28 70 4c 65 66 74 2c  ctorField(pLeft,
143c0 20 69 29 3b 0a 0a 20 20 20 20 69 66 28 20 72 65   i);..    if( re
143d0 67 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20  gSelect ){.     
143e0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
143f0 70 33 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72  p3(v, OP_Copy, r
14400 65 67 53 65 6c 65 63 74 2b 69 2c 20 72 31 2b 69  egSelect+i, r1+i
14410 43 6f 6c 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c  Col, 0);.    }el
14420 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
14430 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
14440 2c 20 70 4c 68 73 2c 20 72 31 2b 69 43 6f 6c 29  , pLhs, r1+iCol)
14450 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 7a 41 66  ;.    }..    zAf
14460 66 5b 69 43 6f 6c 5d 20 3d 20 73 71 6c 69 74 65  f[iCol] = sqlite
14470 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 4c  3ExprAffinity(pL
14480 68 73 29 3b 0a 20 20 20 20 69 66 28 20 70 45 78  hs);.    if( pEx
14490 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 78  pr->flags & EP_x
144a0 49 73 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  IsSelect ){.    
144b0 20 20 7a 41 66 66 5b 69 43 6f 6c 5d 20 3d 20 73    zAff[iCol] = s
144c0 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66  qlite3CompareAff
144d0 69 6e 69 74 79 28 0a 20 20 20 20 20 20 20 20 20  inity(.         
144e0 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63   pExpr->x.pSelec
144f0 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f  t->pEList->a[iCo
14500 6c 5d 2e 70 45 78 70 72 2c 20 7a 41 66 66 5b 69  l].pExpr, zAff[i
14510 43 6f 6c 5d 0a 20 20 20 20 20 20 29 3b 0a 20 20  Col].      );.  
14520 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
14530 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e   sqlite3FindInIn
14540 64 65 78 28 29 20 64 69 64 20 6e 6f 74 20 66 69  dex() did not fi
14550 6e 64 20 6f 72 20 63 72 65 61 74 65 20 61 6e 20  nd or create an 
14560 69 6e 64 65 78 20 74 68 61 74 20 69 73 0a 20 20  index that is.  
14570 2a 2a 20 73 75 69 74 61 62 6c 65 20 66 6f 72 20  ** suitable for 
14580 65 76 61 6c 75 61 74 69 6e 67 20 74 68 65 20 49  evaluating the I
14590 4e 20 6f 70 65 72 61 74 6f 72 2c 20 74 68 65 6e  N operator, then
145a0 20 65 76 61 6c 75 61 74 65 20 75 73 69 6e 67 20   evaluate using 
145b0 61 0a 20 20 2a 2a 20 73 65 71 75 65 6e 63 65 20  a.  ** sequence 
145c0 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e 73 2e 0a  of comparisons..
145d0 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65    */.  if( eType
145e0 3d 3d 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 20  ==IN_INDEX_NOOP 
145f0 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20  ){.    ExprList 
14600 2a 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e  *pList = pExpr->
14610 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 43 6f 6c  x.pList;.    Col
14620 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 73 71  lSeq *pColl = sq
14630 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
14640 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
14650 70 4c 65 66 74 29 3b 0a 20 20 20 20 69 6e 74 20  pLeft);.    int 
14660 6c 61 62 65 6c 4f 6b 20 3d 20 73 71 6c 69 74 65  labelOk = sqlite
14670 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
14680 29 3b 0a 20 20 20 20 69 6e 74 20 72 32 2c 20 72  );.    int r2, r
14690 65 67 54 6f 46 72 65 65 3b 0a 20 20 20 20 69 6e  egToFree;.    in
146a0 74 20 72 65 67 43 6b 4e 75 6c 6c 20 3d 20 30 3b  t regCkNull = 0;
146b0 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20  .    int ii;.   
146c0 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
146d0 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
146e0 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
146f0 3b 0a 20 20 20 20 69 66 28 20 64 65 73 74 49 66  ;.    if( destIf
14700 4e 75 6c 6c 21 3d 64 65 73 74 49 66 46 61 6c 73  Null!=destIfFals
14710 65 20 29 7b 0a 20 20 20 20 20 20 72 65 67 43 6b  e ){.      regCk
14720 4e 75 6c 6c 20 3d 20 73 71 6c 69 74 65 33 47 65  Null = sqlite3Ge
14730 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
14740 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
14750 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
14760 42 69 74 41 6e 64 2c 20 72 31 2c 20 72 31 2c 20  BitAnd, r1, r1, 
14770 72 65 67 43 6b 4e 75 6c 6c 29 3b 0a 20 20 20 20  regCkNull);.    
14780 7d 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20  }.    for(ii=0; 
14790 69 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  ii<pList->nExpr;
147a0 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 32   ii++){.      r2
147b0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
147c0 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
147d0 4c 69 73 74 2d 3e 61 5b 69 69 5d 2e 70 45 78 70  List->a[ii].pExp
147e0 72 2c 20 26 72 65 67 54 6f 46 72 65 65 29 3b 0a  r, &regToFree);.
147f0 20 20 20 20 20 20 69 66 28 20 72 65 67 43 6b 4e        if( regCkN
14800 75 6c 6c 20 26 26 20 73 71 6c 69 74 65 33 45 78  ull && sqlite3Ex
14810 70 72 43 61 6e 42 65 4e 75 6c 6c 28 70 4c 69 73  prCanBeNull(pLis
14820 74 2d 3e 61 5b 69 69 5d 2e 70 45 78 70 72 29 20  t->a[ii].pExpr) 
14830 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
14840 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
14850 4f 50 5f 42 69 74 41 6e 64 2c 20 72 65 67 43 6b  OP_BitAnd, regCk
14860 4e 75 6c 6c 2c 20 72 32 2c 20 72 65 67 43 6b 4e  Null, r2, regCkN
14870 75 6c 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ull);.      }.  
14880 20 20 20 20 69 66 28 20 69 69 3c 70 4c 69 73 74      if( ii<pList
14890 2d 3e 6e 45 78 70 72 2d 31 20 7c 7c 20 64 65 73  ->nExpr-1 || des
148a0 74 49 66 4e 75 6c 6c 21 3d 64 65 73 74 49 66 46  tIfNull!=destIfF
148b0 61 6c 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20  alse ){.        
148c0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
148d0 34 28 76 2c 20 4f 50 5f 45 71 2c 20 72 31 2c 20  4(v, OP_Eq, r1, 
148e0 6c 61 62 65 6c 4f 6b 2c 20 72 32 2c 0a 20 20 20  labelOk, r2,.   
148f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14900 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29 70 43         (void*)pC
14910 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29  oll, P4_COLLSEQ)
14920 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
14930 76 65 72 61 67 65 49 66 28 76 2c 20 69 69 3c 70  verageIf(v, ii<p
14940 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a  List->nExpr-1);.
14950 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
14960 72 61 67 65 49 66 28 76 2c 20 69 69 3d 3d 70 4c  rageIf(v, ii==pL
14970 69 73 74 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a 20  ist->nExpr-1);. 
14980 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
14990 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 7a 41  beChangeP5(v, zA
149a0 66 66 5b 30 5d 29 3b 0a 20 20 20 20 20 20 7d 65  ff[0]);.      }e
149b0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73  lse{.        ass
149c0 65 72 74 28 20 64 65 73 74 49 66 4e 75 6c 6c 3d  ert( destIfNull=
149d0 3d 64 65 73 74 49 66 46 61 6c 73 65 20 29 3b 0a  =destIfFalse );.
149e0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
149f0 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
14a00 4e 65 2c 20 72 31 2c 20 64 65 73 74 49 66 46 61  Ne, r1, destIfFa
14a10 6c 73 65 2c 20 72 32 2c 0a 20 20 20 20 20 20 20  lse, r2,.       
14a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a30 20 20 20 28 76 6f 69 64 2a 29 70 43 6f 6c 6c 2c     (void*)pColl,
14a40 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 20 56 64   P4_COLLSEQ); Vd
14a50 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
14a60 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
14a70 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 7a 41  beChangeP5(v, zA
14a80 66 66 5b 30 5d 20 7c 20 53 51 4c 49 54 45 5f 4a  ff[0] | SQLITE_J
14a90 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20  UMPIFNULL);.    
14aa0 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
14ab0 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
14ac0 70 50 61 72 73 65 2c 20 72 65 67 54 6f 46 72 65  pParse, regToFre
14ad0 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  e);.    }.    if
14ae0 28 20 72 65 67 43 6b 4e 75 6c 6c 20 29 7b 0a 20  ( regCkNull ){. 
14af0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
14b00 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e  AddOp2(v, OP_IsN
14b10 75 6c 6c 2c 20 72 65 67 43 6b 4e 75 6c 6c 2c 20  ull, regCkNull, 
14b20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 20 56 64 62  destIfNull); Vdb
14b30 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
14b40 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47      sqlite3VdbeG
14b50 6f 74 6f 28 76 2c 20 64 65 73 74 49 66 46 61 6c  oto(v, destIfFal
14b60 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  se);.    }.    s
14b70 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
14b80 65 4c 61 62 65 6c 28 76 2c 20 6c 61 62 65 6c 4f  eLabel(v, labelO
14b90 6b 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52  k);.    sqlite3R
14ba0 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
14bb0 61 72 73 65 2c 20 72 65 67 43 6b 4e 75 6c 6c 29  arse, regCkNull)
14bc0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 0a 20 20  ;.  }else{.  .  
14bd0 20 20 2f 2a 20 49 66 20 74 68 65 20 4c 48 53 20    /* If the LHS 
14be0 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68  is NULL, then th
14bf0 65 20 72 65 73 75 6c 74 20 69 73 20 65 69 74 68  e result is eith
14c00 65 72 20 66 61 6c 73 65 20 6f 72 20 4e 55 4c 4c  er false or NULL
14c10 20 64 65 70 65 6e 64 69 6e 67 0a 20 20 20 20 2a   depending.    *
14c20 2a 20 6f 6e 20 77 68 65 74 68 65 72 20 74 68 65  * on whether the
14c30 20 52 48 53 20 69 73 20 65 6d 70 74 79 20 6f 72   RHS is empty or
14c40 20 6e 6f 74 2c 20 72 65 73 70 65 63 74 69 76 65   not, respective
14c50 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ly..    */.    i
14c60 66 28 20 6e 56 65 63 74 6f 72 3d 3d 31 20 26 26  f( nVector==1 &&
14c70 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 6e 42   sqlite3ExprCanB
14c80 65 4e 75 6c 6c 28 70 45 78 70 72 2d 3e 70 4c 65  eNull(pExpr->pLe
14c90 66 74 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ft) ){.      if(
14ca0 20 64 65 73 74 49 66 4e 75 6c 6c 3d 3d 64 65 73   destIfNull==des
14cb0 74 49 66 46 61 6c 73 65 20 29 7b 0a 20 20 20 20  tIfFalse ){.    
14cc0 20 20 20 20 2f 2a 20 53 68 6f 72 74 63 75 74 20      /* Shortcut 
14cd0 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63  for the common c
14ce0 61 73 65 20 77 68 65 72 65 20 74 68 65 20 66 61  ase where the fa
14cf0 6c 73 65 20 61 6e 64 20 4e 55 4c 4c 20 6f 75 74  lse and NULL out
14d00 63 6f 6d 65 73 20 61 72 65 0a 20 20 20 20 20 20  comes are.      
14d10 20 20 2a 2a 20 74 68 65 20 73 61 6d 65 2e 20 2a    ** the same. *
14d20 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  /.        sqlite
14d30 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
14d40 50 5f 49 73 4e 75 6c 6c 2c 20 72 31 2c 20 64 65  P_IsNull, r1, de
14d50 73 74 49 66 4e 75 6c 6c 29 3b 20 56 64 62 65 43  stIfNull); VdbeC
14d60 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
14d70 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
14d80 20 69 6e 74 20 61 64 64 72 31 20 3d 20 73 71 6c   int addr1 = sql
14d90 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
14da0 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 72 31  , OP_NotNull, r1
14db0 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
14dc0 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  v);.        sqli
14dd0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
14de0 20 4f 50 5f 52 65 77 69 6e 64 2c 20 70 45 78 70   OP_Rewind, pExp
14df0 72 2d 3e 69 54 61 62 6c 65 2c 20 64 65 73 74 49  r->iTable, destI
14e00 66 46 61 6c 73 65 29 3b 0a 20 20 20 20 20 20 20  fFalse);.       
14e10 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
14e20 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
14e30 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 64 65 73  3VdbeGoto(v, des
14e40 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  tIfNull);.      
14e50 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
14e60 70 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b  pHere(v, addr1);
14e70 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
14e80 20 0a 20 20 20 20 69 66 28 20 65 54 79 70 65 3d   .    if( eType=
14e90 3d 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 20  =IN_INDEX_ROWID 
14ea0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20 74  ){.      /* In t
14eb0 68 69 73 20 63 61 73 65 2c 20 74 68 65 20 52 48  his case, the RH
14ec0 53 20 69 73 20 74 68 65 20 52 4f 57 49 44 20 6f  S is the ROWID o
14ed0 66 20 74 61 62 6c 65 20 62 2d 74 72 65 65 0a 20  f table b-tree. 
14ee0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
14ef0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
14f00 76 2c 20 4f 50 5f 53 65 65 6b 52 6f 77 69 64 2c  v, OP_SeekRowid,
14f10 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
14f20 64 65 73 74 49 66 46 61 6c 73 65 2c 20 72 31 29  destIfFalse, r1)
14f30 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
14f40 72 61 67 65 28 76 29 3b 0a 20 20 20 20 7d 65 6c  rage(v);.    }el
14f50 73 65 20 69 66 28 20 6e 56 65 63 74 6f 72 3e 31  se if( nVector>1
14f60 20 26 26 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e   && eType==IN_IN
14f70 44 45 58 5f 45 50 48 20 29 7b 0a 20 20 20 20 20  DEX_EPH ){.     
14f80 20 69 6e 74 20 72 65 67 4e 75 6c 6c 20 3d 20 73   int regNull = s
14f90 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
14fa0 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
14fb0 69 6e 74 20 72 32 20 3d 20 73 71 6c 69 74 65 33  int r2 = sqlite3
14fc0 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
14fd0 65 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 33  e);.      int r3
14fe0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
14ff0 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
15000 20 20 20 20 69 6e 74 20 72 34 20 3d 20 73 71 6c      int r4 = sql
15010 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
15020 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 69 6e  Parse);.      in
15030 74 20 61 64 64 72 4e 65 78 74 3b 0a 20 20 20 20  t addrNext;.    
15040 20 20 69 6e 74 20 61 64 64 72 49 66 3b 0a 0a 20    int addrIf;.. 
15050 20 20 20 20 20 69 66 28 20 64 65 73 74 49 66 46       if( destIfF
15060 61 6c 73 65 21 3d 64 65 73 74 49 66 4e 75 6c 6c  alse!=destIfNull
15070 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
15080 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
15090 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
150a0 72 65 67 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  regNull);.      
150b0 7d 0a 20 20 20 20 20 20 61 64 64 72 4e 65 78 74  }.      addrNext
150c0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
150d0 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e  dOp2(v, OP_Rewin
150e0 64 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  d, pExpr->iTable
150f0 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a  , destIfFalse);.
15100 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
15110 3c 6e 56 65 63 74 6f 72 3b 20 69 2b 2b 29 7b 0a  <nVector; i++){.
15120 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 3b          Expr *p;
15130 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71  .        CollSeq
15140 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20   *pColl;.       
15150 20 70 20 3d 20 65 78 70 72 56 65 63 74 6f 72 46   p = exprVectorF
15160 69 65 6c 64 28 70 4c 65 66 74 2c 20 69 29 3b 0a  ield(pLeft, i);.
15170 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20          pColl = 
15180 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
15190 65 71 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 0a  eq(pParse, p);..
151a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
151b0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
151c0 43 6f 6c 75 6d 6e 2c 20 70 45 78 70 72 2d 3e 69  Column, pExpr->i
151d0 54 61 62 6c 65 2c 20 69 2c 20 72 32 29 3b 0a 20  Table, i, r2);. 
151e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
151f0 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 45  beAddOp4(v, OP_E
15200 71 2c 20 72 31 2b 69 2c 20 69 3f 72 33 3a 72 34  q, r1+i, i?r3:r4
15210 2c 20 72 32 2c 20 28 76 6f 69 64 2a 29 70 43 6f  , r2, (void*)pCo
15220 6c 6c 2c 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a  ll,P4_COLLSEQ);.
15230 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
15240 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 53  dbeChangeP5(v, S
15250 51 4c 49 54 45 5f 53 54 4f 52 45 50 32 29 3b 0a  QLITE_STOREP2);.
15260 20 20 20 20 20 20 20 20 69 66 28 20 69 21 3d 30          if( i!=0
15270 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
15280 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
15290 76 2c 20 4f 50 5f 41 6e 64 2c 20 72 33 2c 20 72  v, OP_And, r3, r
152a0 34 2c 20 72 34 29 3b 0a 20 20 20 20 20 20 20 20  4, r4);.        
152b0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
152c0 61 64 64 72 49 66 20 3d 20 73 71 6c 69 74 65 33  addrIf = sqlite3
152d0 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
152e0 5f 49 66 2c 20 72 34 29 3b 0a 20 20 20 20 20 20  _If, r4);.      
152f0 69 66 28 20 64 65 73 74 49 66 4e 75 6c 6c 21 3d  if( destIfNull!=
15300 64 65 73 74 49 66 46 61 6c 73 65 20 29 7b 0a 20  destIfFalse ){. 
15310 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
15320 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
15330 66 4e 6f 74 2c 20 72 34 2c 20 73 71 6c 69 74 65  fNot, r4, sqlite
15340 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
15350 28 76 29 2b 32 29 3b 0a 20 20 20 20 20 20 20 20  (v)+2);.        
15360 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15370 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
15380 20 31 2c 20 72 65 67 4e 75 6c 6c 29 3b 0a 20 20   1, regNull);.  
15390 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
153a0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
153b0 20 4f 50 5f 4e 65 78 74 2c 20 70 45 78 70 72 2d   OP_Next, pExpr-
153c0 3e 69 54 61 62 6c 65 2c 20 61 64 64 72 4e 65 78  >iTable, addrNex
153d0 74 2b 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20  t+1);.      if( 
153e0 64 65 73 74 49 66 4e 75 6c 6c 21 3d 64 65 73 74  destIfNull!=dest
153f0 49 66 46 61 6c 73 65 20 29 7b 0a 20 20 20 20 20  IfFalse ){.     
15400 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
15410 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20 72  dOp2(v, OP_If, r
15420 65 67 4e 75 6c 6c 2c 20 64 65 73 74 49 66 4e 75  egNull, destIfNu
15430 6c 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ll);.      }.   
15440 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
15450 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
15460 20 30 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29   0, destIfFalse)
15470 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
15480 64 62 65 43 68 61 6e 67 65 50 32 28 76 2c 20 61  dbeChangeP2(v, a
15490 64 64 72 49 66 2c 20 73 71 6c 69 74 65 33 56 64  ddrIf, sqlite3Vd
154a0 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
154b0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
154c0 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
154d0 50 61 72 73 65 2c 20 72 65 67 4e 75 6c 6c 29 3b  Parse, regNull);
154e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
154f0 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
15500 72 73 65 2c 20 72 32 29 3b 0a 20 20 20 20 20 20  rse, r2);.      
15510 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
15520 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 33  mpReg(pParse, r3
15530 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
15540 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
15550 50 61 72 73 65 2c 20 72 34 29 3b 0a 20 20 20 20  Parse, r4);.    
15560 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
15570 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 74 68  In this case, th
15580 65 20 52 48 53 20 69 73 20 61 6e 20 69 6e 64 65  e RHS is an inde
15590 78 20 62 2d 74 72 65 65 2e 0a 20 20 20 20 20 20  x b-tree..      
155a0 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
155b0 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
155c0 5f 41 66 66 69 6e 69 74 79 2c 20 72 31 2c 20 6e  _Affinity, r1, n
155d0 56 65 63 74 6f 72 2c 20 30 2c 20 7a 41 66 66 2c  Vector, 0, zAff,
155e0 20 6e 56 65 63 74 6f 72 29 3b 0a 20 20 0a 20 20   nVector);.  .  
155f0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 65      /* If the se
15600 74 20 6d 65 6d 62 65 72 73 68 69 70 20 74 65 73  t membership tes
15610 74 20 66 61 69 6c 73 2c 20 74 68 65 6e 20 74 68  t fails, then th
15620 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20  e result of the 
15630 0a 20 20 20 20 20 20 2a 2a 20 22 78 20 49 4e 20  .      ** "x IN 
15640 28 2e 2e 2e 29 22 20 65 78 70 72 65 73 73 69 6f  (...)" expressio
15650 6e 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  n must be either
15660 20 30 20 6f 72 20 4e 55 4c 4c 2e 20 49 66 20 74   0 or NULL. If t
15670 68 65 20 73 65 74 0a 20 20 20 20 20 20 2a 2a 20  he set.      ** 
15680 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 4e 55 4c 4c  contains no NULL
15690 20 76 61 6c 75 65 73 2c 20 74 68 65 6e 20 74 68   values, then th
156a0 65 20 72 65 73 75 6c 74 20 69 73 20 30 2e 20 49  e result is 0. I
156b0 66 20 74 68 65 20 73 65 74 20 0a 20 20 20 20 20  f the set .     
156c0 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65   ** contains one
156d0 20 6f 72 20 6d 6f 72 65 20 4e 55 4c 4c 20 76 61   or more NULL va
156e0 6c 75 65 73 2c 20 74 68 65 6e 20 74 68 65 20 72  lues, then the r
156f0 65 73 75 6c 74 20 6f 66 20 74 68 65 0a 20 20 20  esult of the.   
15700 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e     ** expression
15710 20 69 73 20 61 6c 73 6f 20 4e 55 4c 4c 2e 0a 20   is also NULL.. 
15720 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73       */.      as
15730 73 65 72 74 28 20 64 65 73 74 49 66 46 61 6c 73  sert( destIfFals
15740 65 21 3d 64 65 73 74 49 66 4e 75 6c 6c 20 7c 7c  e!=destIfNull ||
15750 20 72 52 68 73 48 61 73 4e 75 6c 6c 3d 3d 30 20   rRhsHasNull==0 
15760 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 52 68  );.      if( rRh
15770 73 48 61 73 4e 75 6c 6c 3d 3d 30 20 29 7b 0a 20  sHasNull==0 ){. 
15780 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62         /* This b
15790 72 61 6e 63 68 20 72 75 6e 73 20 69 66 20 69 74  ranch runs if it
157a0 20 69 73 20 6b 6e 6f 77 6e 20 61 74 20 63 6f 6d   is known at com
157b0 70 69 6c 65 20 74 69 6d 65 20 74 68 61 74 20 74  pile time that t
157c0 68 65 20 52 48 53 0a 20 20 20 20 20 20 20 20 2a  he RHS.        *
157d0 2a 20 63 61 6e 6e 6f 74 20 63 6f 6e 74 61 69 6e  * cannot contain
157e0 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2e 20 54 68   NULL values. Th
157f0 69 73 20 68 61 70 70 65 6e 73 20 61 73 20 74 68  is happens as th
15800 65 20 72 65 73 75 6c 74 0a 20 20 20 20 20 20 20  e result.       
15810 20 2a 2a 20 6f 66 20 61 20 22 4e 4f 54 20 4e 55   ** of a "NOT NU
15820 4c 4c 22 20 63 6f 6e 73 74 72 61 69 6e 74 20 69  LL" constraint i
15830 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  n the database s
15840 63 68 65 6d 61 2e 0a 20 20 20 20 20 20 20 20 2a  chema..        *
15850 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 41 6c 73  *.        ** Als
15860 6f 20 72 75 6e 20 74 68 69 73 20 62 72 61 6e 63  o run this branc
15870 68 20 69 66 20 4e 55 4c 4c 20 69 73 20 65 71 75  h if NULL is equ
15880 69 76 61 6c 65 6e 74 20 74 6f 20 46 41 4c 53 45  ivalent to FALSE
15890 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 6f 72 20  .        ** for 
158a0 74 68 69 73 20 70 61 72 74 69 63 75 6c 61 72 20  this particular 
158b0 49 4e 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 20  IN operator..   
158c0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
158d0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
158e0 34 49 6e 74 28 0a 20 20 20 20 20 20 20 20 20 20  4Int(.          
158f0 20 20 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64    v, OP_NotFound
15900 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
15910 20 64 65 73 74 49 66 46 61 6c 73 65 2c 20 72 31   destIfFalse, r1
15920 2c 20 6e 56 65 63 74 6f 72 0a 20 20 20 20 20 20  , nVector.      
15930 20 20 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62    );.        Vdb
15940 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
15950 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
15960 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 62 72     /* In this br
15970 61 6e 63 68 2c 20 74 68 65 20 52 48 53 20 6f 66  anch, the RHS of
15980 20 74 68 65 20 49 4e 20 6d 69 67 68 74 20 63 6f   the IN might co
15990 6e 74 61 69 6e 20 61 20 4e 55 4c 4c 20 61 6e 64  ntain a NULL and
159a0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
159b0 70 72 65 73 65 6e 63 65 20 6f 66 20 61 20 4e 55  presence of a NU
159c0 4c 4c 20 6f 6e 20 74 68 65 20 52 48 53 20 6d 61  LL on the RHS ma
159d0 6b 65 73 20 61 20 64 69 66 66 65 72 65 6e 63 65  kes a difference
159e0 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20   in the.        
159f0 2a 2a 20 6f 75 74 63 6f 6d 65 2e 0a 20 20 20 20  ** outcome..    
15a00 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
15a10 6e 74 20 61 64 64 72 31 3b 0a 20 20 0a 20 20 20  nt addr1;.  .   
15a20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 63 68       /* First ch
15a30 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68  eck to see if th
15a40 65 20 4c 48 53 20 69 73 20 63 6f 6e 74 61 69 6e  e LHS is contain
15a50 65 64 20 69 6e 20 74 68 65 20 52 48 53 2e 20 20  ed in the RHS.  
15a60 49 66 20 73 6f 2c 0a 20 20 20 20 20 20 20 20 2a  If so,.        *
15a70 2a 20 74 68 65 6e 20 74 68 65 20 61 6e 73 77 65  * then the answe
15a80 72 20 69 73 20 54 52 55 45 20 74 68 65 20 70 72  r is TRUE the pr
15a90 65 73 65 6e 63 65 20 6f 66 20 4e 55 4c 4c 73 20  esence of NULLs 
15aa0 69 6e 20 74 68 65 20 52 48 53 20 64 6f 65 73 0a  in the RHS does.
15ab0 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20 6d          ** not m
15ac0 61 74 74 65 72 2e 20 20 49 66 20 74 68 65 20 4c  atter.  If the L
15ad0 48 53 20 69 73 20 6e 6f 74 20 63 6f 6e 74 61 69  HS is not contai
15ae0 6e 65 64 20 69 6e 20 74 68 65 20 52 48 53 2c 20  ned in the RHS, 
15af0 74 68 65 6e 20 74 68 65 0a 20 20 20 20 20 20 20  then the.       
15b00 20 2a 2a 20 61 6e 73 77 65 72 20 69 73 20 4e 55   ** answer is NU
15b10 4c 4c 20 69 66 20 74 68 65 20 52 48 53 20 63 6f  LL if the RHS co
15b20 6e 74 61 69 6e 73 20 4e 55 4c 4c 73 20 61 6e 64  ntains NULLs and
15b30 20 74 68 65 20 61 6e 73 77 65 72 20 69 73 0a 20   the answer is. 
15b40 20 20 20 20 20 20 20 2a 2a 20 46 41 4c 53 45 20         ** FALSE 
15b50 69 66 20 74 68 65 20 52 48 53 20 69 73 20 4e 55  if the RHS is NU
15b60 4c 4c 2d 66 72 65 65 2e 0a 20 20 20 20 20 20 20  LL-free..       
15b70 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 64 64 72   */.        addr
15b80 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  1 = sqlite3VdbeA
15b90 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46  ddOp4Int(v, OP_F
15ba0 6f 75 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54 61  ound, pExpr->iTa
15bb0 62 6c 65 2c 20 30 2c 20 72 31 2c 20 31 29 3b 0a  ble, 0, r1, 1);.
15bc0 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
15bd0 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
15be0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15bf0 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c  p2(v, OP_IsNull,
15c00 20 72 52 68 73 48 61 73 4e 75 6c 6c 2c 20 64 65   rRhsHasNull, de
15c10 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  stIfNull);.     
15c20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
15c30 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  v);.        sqli
15c40 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 64  te3VdbeGoto(v, d
15c50 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 20 20 20  estIfFalse);.   
15c60 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
15c70 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
15c80 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  1);.      }.    
15c90 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52  }.  }.  sqlite3R
15ca0 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
15cb0 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 73 71 6c  arse, r1);.  sql
15cc0 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70  ite3ExprCachePop
15cd0 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69  (pParse);.  sqli
15ce0 74 65 33 44 62 46 72 65 65 28 70 50 61 72 73 65  te3DbFree(pParse
15cf0 2d 3e 64 62 2c 20 61 69 4d 61 70 29 3b 0a 20 20  ->db, aiMap);.  
15d00 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
15d10 22 65 6e 64 20 49 4e 20 65 78 70 72 22 29 29 3b  "end IN expr"));
15d20 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
15d30 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
15d40 59 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  Y */..#ifndef SQ
15d50 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49  LITE_OMIT_FLOATI
15d60 4e 47 5f 50 4f 49 4e 54 0a 2f 2a 0a 2a 2a 20 47  NG_POINT./*.** G
15d70 65 6e 65 72 61 74 65 20 61 6e 20 69 6e 73 74 72  enerate an instr
15d80 75 63 74 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c  uction that will
15d90 20 70 75 74 20 74 68 65 20 66 6c 6f 61 74 69 6e   put the floatin
15da0 67 20 70 6f 69 6e 74 0a 2a 2a 20 76 61 6c 75 65  g point.** value
15db0 20 64 65 73 63 72 69 62 65 64 20 62 79 20 7a 5b   described by z[
15dc0 30 2e 2e 6e 2d 31 5d 20 69 6e 74 6f 20 72 65 67  0..n-1] into reg
15dd0 69 73 74 65 72 20 69 4d 65 6d 2e 0a 2a 2a 0a 2a  ister iMem..**.*
15de0 2a 20 54 68 65 20 7a 5b 5d 20 73 74 72 69 6e 67  * The z[] string
15df0 20 77 69 6c 6c 20 70 72 6f 62 61 62 6c 79 20 6e   will probably n
15e00 6f 74 20 62 65 20 7a 65 72 6f 2d 74 65 72 6d 69  ot be zero-termi
15e10 6e 61 74 65 64 2e 20 20 42 75 74 20 74 68 65 20  nated.  But the 
15e20 0a 2a 2a 20 7a 5b 6e 5d 20 63 68 61 72 61 63 74  .** z[n] charact
15e30 65 72 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  er is guaranteed
15e40 20 74 6f 20 62 65 20 73 6f 6d 65 74 68 69 6e 67   to be something
15e50 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6c   that does not l
15e60 6f 6f 6b 0a 2a 2a 20 6c 69 6b 65 20 74 68 65 20  ook.** like the 
15e70 63 6f 6e 74 69 6e 75 61 74 69 6f 6e 20 6f 66 20  continuation of 
15e80 74 68 65 20 6e 75 6d 62 65 72 2e 0a 2a 2f 0a 73  the number..*/.s
15e90 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65 52  tatic void codeR
15ea0 65 61 6c 28 56 64 62 65 20 2a 76 2c 20 63 6f 6e  eal(Vdbe *v, con
15eb0 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20  st char *z, int 
15ec0 6e 65 67 61 74 65 46 6c 61 67 2c 20 69 6e 74 20  negateFlag, int 
15ed0 69 4d 65 6d 29 7b 0a 20 20 69 66 28 20 41 4c 57  iMem){.  if( ALW
15ee0 41 59 53 28 7a 21 3d 30 29 20 29 7b 0a 20 20 20  AYS(z!=0) ){.   
15ef0 20 64 6f 75 62 6c 65 20 76 61 6c 75 65 3b 0a 20   double value;. 
15f00 20 20 20 73 71 6c 69 74 65 33 41 74 6f 46 28 7a     sqlite3AtoF(z
15f10 2c 20 26 76 61 6c 75 65 2c 20 73 71 6c 69 74 65  , &value, sqlite
15f20 33 53 74 72 6c 65 6e 33 30 28 7a 29 2c 20 53 51  3Strlen30(z), SQ
15f30 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 20 20  LITE_UTF8);.    
15f40 61 73 73 65 72 74 28 20 21 73 71 6c 69 74 65 33  assert( !sqlite3
15f50 49 73 4e 61 4e 28 76 61 6c 75 65 29 20 29 3b 20  IsNaN(value) ); 
15f60 2f 2a 20 54 68 65 20 6e 65 77 20 41 74 6f 46 20  /* The new AtoF 
15f70 6e 65 76 65 72 20 72 65 74 75 72 6e 73 20 4e 61  never returns Na
15f80 4e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 65 67  N */.    if( neg
15f90 61 74 65 46 6c 61 67 20 29 20 76 61 6c 75 65 20  ateFlag ) value 
15fa0 3d 20 2d 76 61 6c 75 65 3b 0a 20 20 20 20 73 71  = -value;.    sq
15fb0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 44  lite3VdbeAddOp4D
15fc0 75 70 38 28 76 2c 20 4f 50 5f 52 65 61 6c 2c 20  up8(v, OP_Real, 
15fd0 30 2c 20 69 4d 65 6d 2c 20 30 2c 20 28 75 38 2a  0, iMem, 0, (u8*
15fe0 29 26 76 61 6c 75 65 2c 20 50 34 5f 52 45 41 4c  )&value, P4_REAL
15ff0 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a  );.  }.}.#endif.
16000 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
16010 20 61 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20   an instruction 
16020 74 68 61 74 20 77 69 6c 6c 20 70 75 74 20 74 68  that will put th
16030 65 20 69 6e 74 65 67 65 72 20 64 65 73 63 72 69  e integer descri
16040 62 65 20 62 79 0a 2a 2a 20 74 65 78 74 20 7a 5b  be by.** text z[
16050 30 2e 2e 6e 2d 31 5d 20 69 6e 74 6f 20 72 65 67  0..n-1] into reg
16060 69 73 74 65 72 20 69 4d 65 6d 2e 0a 2a 2a 0a 2a  ister iMem..**.*
16070 2a 20 45 78 70 72 2e 75 2e 7a 54 6f 6b 65 6e 20  * Expr.u.zToken 
16080 69 73 20 61 6c 77 61 79 73 20 55 54 46 38 20 61  is always UTF8 a
16090 6e 64 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74  nd zero-terminat
160a0 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
160b0 69 64 20 63 6f 64 65 49 6e 74 65 67 65 72 28 50  id codeInteger(P
160c0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
160d0 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 6e  pr *pExpr, int n
160e0 65 67 46 6c 61 67 2c 20 69 6e 74 20 69 4d 65 6d  egFlag, int iMem
160f0 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
16100 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
16110 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73  if( pExpr->flags
16120 20 26 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 29   & EP_IntValue )
16130 7b 0a 20 20 20 20 69 6e 74 20 69 20 3d 20 70 45  {.    int i = pE
16140 78 70 72 2d 3e 75 2e 69 56 61 6c 75 65 3b 0a 20  xpr->u.iValue;. 
16150 20 20 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20     assert( i>=0 
16160 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 67 46 6c  );.    if( negFl
16170 61 67 20 29 20 69 20 3d 20 2d 69 3b 0a 20 20 20  ag ) i = -i;.   
16180 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
16190 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
161a0 2c 20 69 2c 20 69 4d 65 6d 29 3b 0a 20 20 7d 65  , i, iMem);.  }e
161b0 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 63 3b 0a  lse{.    int c;.
161c0 20 20 20 20 69 36 34 20 76 61 6c 75 65 3b 0a 20      i64 value;. 
161d0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
161e0 20 3d 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b   = pExpr->u.zTok
161f0 65 6e 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  en;.    assert( 
16200 7a 21 3d 30 20 29 3b 0a 20 20 20 20 63 20 3d 20  z!=0 );.    c = 
16210 73 71 6c 69 74 65 33 44 65 63 4f 72 48 65 78 54  sqlite3DecOrHexT
16220 6f 49 36 34 28 7a 2c 20 26 76 61 6c 75 65 29 3b  oI64(z, &value);
16230 0a 20 20 20 20 69 66 28 20 63 3d 3d 30 20 7c 7c  .    if( c==0 ||
16240 20 28 63 3d 3d 32 20 26 26 20 6e 65 67 46 6c 61   (c==2 && negFla
16250 67 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  g) ){.      if( 
16260 6e 65 67 46 6c 61 67 20 29 7b 20 76 61 6c 75 65  negFlag ){ value
16270 20 3d 20 63 3d 3d 32 20 3f 20 53 4d 41 4c 4c 45   = c==2 ? SMALLE
16280 53 54 5f 49 4e 54 36 34 20 3a 20 2d 76 61 6c 75  ST_INT64 : -valu
16290 65 3b 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74  e; }.      sqlit
162a0 65 33 56 64 62 65 41 64 64 4f 70 34 44 75 70 38  e3VdbeAddOp4Dup8
162b0 28 76 2c 20 4f 50 5f 49 6e 74 36 34 2c 20 30 2c  (v, OP_Int64, 0,
162c0 20 69 4d 65 6d 2c 20 30 2c 20 28 75 38 2a 29 26   iMem, 0, (u8*)&
162d0 76 61 6c 75 65 2c 20 50 34 5f 49 4e 54 36 34 29  value, P4_INT64)
162e0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 23 69 66  ;.    }else{.#if
162f0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
16300 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20  FLOATING_POINT. 
16310 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
16320 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6f 76  rMsg(pParse, "ov
16330 65 72 73 69 7a 65 64 20 69 6e 74 65 67 65 72 3a  ersized integer:
16340 20 25 73 25 73 22 2c 20 6e 65 67 46 6c 61 67 20   %s%s", negFlag 
16350 3f 20 22 2d 22 20 3a 20 22 22 2c 20 7a 29 3b 0a  ? "-" : "", z);.
16360 23 65 6c 73 65 0a 23 69 66 6e 64 65 66 20 53 51  #else.#ifndef SQ
16370 4c 49 54 45 5f 4f 4d 49 54 5f 48 45 58 5f 49 4e  LITE_OMIT_HEX_IN
16380 54 45 47 45 52 0a 20 20 20 20 20 20 69 66 28 20  TEGER.      if( 
16390 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d 70  sqlite3_strnicmp
163a0 28 7a 2c 22 30 78 22 2c 32 29 3d 3d 30 20 29 7b  (z,"0x",2)==0 ){
163b0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
163c0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
163d0 20 22 68 65 78 20 6c 69 74 65 72 61 6c 20 74 6f   "hex literal to
163e0 6f 20 62 69 67 3a 20 25 73 22 2c 20 7a 29 3b 0a  o big: %s", z);.
163f0 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64        }else.#end
16400 69 66 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20  if.      {.     
16410 20 20 20 63 6f 64 65 52 65 61 6c 28 76 2c 20 7a     codeReal(v, z
16420 2c 20 6e 65 67 46 6c 61 67 2c 20 69 4d 65 6d 29  , negFlag, iMem)
16430 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
16440 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 69  .    }.  }.}..#i
16450 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
16460 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20 56 65  _DEBUG)./*.** Ve
16470 72 69 66 79 20 74 68 65 20 63 6f 6e 73 69 73 74  rify the consist
16480 65 6e 63 79 20 6f 66 20 74 68 65 20 63 6f 6c 75  ency of the colu
16490 6d 6e 20 63 61 63 68 65 0a 2a 2f 0a 73 74 61 74  mn cache.*/.stat
164a0 69 63 20 69 6e 74 20 63 61 63 68 65 49 73 56 61  ic int cacheIsVa
164b0 6c 69 64 28 50 61 72 73 65 20 2a 70 50 61 72 73  lid(Parse *pPars
164c0 65 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a  e){.  int i, n;.
164d0 20 20 66 6f 72 28 69 3d 6e 3d 30 3b 20 69 3c 53    for(i=n=0; i<S
164e0 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45  QLITE_N_COLCACHE
164f0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
16500 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68  pParse->aColCach
16510 65 5b 69 5d 2e 69 52 65 67 3e 30 20 29 20 6e 2b  e[i].iReg>0 ) n+
16520 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  +;.  }.  return 
16530 6e 3d 3d 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43  n==pParse->nColC
16540 61 63 68 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ache;.}.#endif..
16550 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 61 20 63 61  /*.** Clear a ca
16560 63 68 65 20 65 6e 74 72 79 2e 0a 2a 2f 0a 73 74  che entry..*/.st
16570 61 74 69 63 20 76 6f 69 64 20 63 61 63 68 65 45  atic void cacheE
16580 6e 74 72 79 43 6c 65 61 72 28 50 61 72 73 65 20  ntryClear(Parse 
16590 2a 70 50 61 72 73 65 2c 20 73 74 72 75 63 74 20  *pParse, struct 
165a0 79 43 6f 6c 43 61 63 68 65 20 2a 70 29 7b 0a 20  yColCache *p){. 
165b0 20 69 66 28 20 70 2d 3e 74 65 6d 70 52 65 67 20   if( p->tempReg 
165c0 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 72 73  ){.    if( pPars
165d0 65 2d 3e 6e 54 65 6d 70 52 65 67 3c 41 72 72 61  e->nTempReg<Arra
165e0 79 53 69 7a 65 28 70 50 61 72 73 65 2d 3e 61 54  ySize(pParse->aT
165f0 65 6d 70 52 65 67 29 20 29 7b 0a 20 20 20 20 20  empReg) ){.     
16600 20 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65   pParse->aTempRe
16610 67 5b 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52  g[pParse->nTempR
16620 65 67 2b 2b 5d 20 3d 20 70 2d 3e 69 52 65 67 3b  eg++] = p->iReg;
16630 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 74 65  .    }.    p->te
16640 6d 70 52 65 67 20 3d 20 30 3b 0a 20 20 7d 0a 20  mpReg = 0;.  }. 
16650 20 70 2d 3e 69 52 65 67 20 3d 20 30 3b 0a 20 20   p->iReg = 0;.  
16660 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68  pParse->nColCach
16670 65 2d 2d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e--;.  assert( p
16680 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
16690 63 46 61 69 6c 65 64 20 7c 7c 20 63 61 63 68 65  cFailed || cache
166a0 49 73 56 61 6c 69 64 28 70 50 61 72 73 65 29 20  IsValid(pParse) 
166b0 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 63  );.}.../*.** Rec
166c0 6f 72 64 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d  ord in the colum
166d0 6e 20 63 61 63 68 65 20 74 68 61 74 20 61 20 70  n cache that a p
166e0 61 72 74 69 63 75 6c 61 72 20 63 6f 6c 75 6d 6e  articular column
166f0 20 66 72 6f 6d 20 61 0a 2a 2a 20 70 61 72 74 69   from a.** parti
16700 63 75 6c 61 72 20 74 61 62 6c 65 20 69 73 20 73  cular table is s
16710 74 6f 72 65 64 20 69 6e 20 61 20 70 61 72 74 69  tored in a parti
16720 63 75 6c 61 72 20 72 65 67 69 73 74 65 72 2e 0a  cular register..
16730 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
16740 78 70 72 43 61 63 68 65 53 74 6f 72 65 28 50 61  xprCacheStore(Pa
16750 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
16760 20 69 54 61 62 2c 20 69 6e 74 20 69 43 6f 6c 2c   iTab, int iCol,
16770 20 69 6e 74 20 69 52 65 67 29 7b 0a 20 20 69 6e   int iReg){.  in
16780 74 20 69 3b 0a 20 20 69 6e 74 20 6d 69 6e 4c 72  t i;.  int minLr
16790 75 3b 0a 20 20 69 6e 74 20 69 64 78 4c 72 75 3b  u;.  int idxLru;
167a0 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61  .  struct yColCa
167b0 63 68 65 20 2a 70 3b 0a 0a 20 20 2f 2a 20 55 6e  che *p;..  /* Un
167c0 6c 65 73 73 20 61 6e 20 65 72 72 6f 72 20 68 61  less an error ha
167d0 73 20 6f 63 63 75 72 72 65 64 2c 20 72 65 67 69  s occurred, regi
167e0 73 74 65 72 20 6e 75 6d 62 65 72 73 20 61 72 65  ster numbers are
167f0 20 61 6c 77 61 79 73 20 70 6f 73 69 74 69 76 65   always positive
16800 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69  . */.  assert( i
16810 52 65 67 3e 30 20 7c 7c 20 70 50 61 72 73 65 2d  Reg>0 || pParse-
16820 3e 6e 45 72 72 20 7c 7c 20 70 50 61 72 73 65 2d  >nErr || pParse-
16830 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
16840 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  d );.  assert( i
16850 43 6f 6c 3e 3d 2d 31 20 26 26 20 69 43 6f 6c 3c  Col>=-1 && iCol<
16860 33 32 37 36 38 20 29 3b 20 20 2f 2a 20 46 69 6e  32768 );  /* Fin
16870 69 74 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65  ite column numbe
16880 72 73 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20  rs */..  /* The 
16890 53 51 4c 49 54 45 5f 43 6f 6c 75 6d 6e 43 61 63  SQLITE_ColumnCac
168a0 68 65 20 66 6c 61 67 20 64 69 73 61 62 6c 65 73  he flag disables
168b0 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68   the column cach
168c0 65 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64  e.  This is used
168d0 0a 20 20 2a 2a 20 66 6f 72 20 74 65 73 74 69 6e  .  ** for testin
168e0 67 20 6f 6e 6c 79 20 2d 20 74 6f 20 76 65 72 69  g only - to veri
168f0 66 79 20 74 68 61 74 20 53 51 4c 69 74 65 20 61  fy that SQLite a
16900 6c 77 61 79 73 20 67 65 74 73 20 74 68 65 20 73  lways gets the s
16910 61 6d 65 20 61 6e 73 77 65 72 0a 20 20 2a 2a 20  ame answer.  ** 
16920 77 69 74 68 20 61 6e 64 20 77 69 74 68 6f 75 74  with and without
16930 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68   the column cach
16940 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4f 70  e..  */.  if( Op
16950 74 69 6d 69 7a 61 74 69 6f 6e 44 69 73 61 62 6c  timizationDisabl
16960 65 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 53  ed(pParse->db, S
16970 51 4c 49 54 45 5f 43 6f 6c 75 6d 6e 43 61 63 68  QLITE_ColumnCach
16980 65 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20  e) ) return;..  
16990 2f 2a 20 46 69 72 73 74 20 72 65 70 6c 61 63 65  /* First replace
169a0 20 61 6e 79 20 65 78 69 73 74 69 6e 67 20 65 6e   any existing en
169b0 74 72 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41  try..  **.  ** A
169c0 63 74 75 61 6c 6c 79 2c 20 74 68 65 20 77 61 79  ctually, the way
169d0 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68   the column cach
169e0 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 75  e is currently u
169f0 73 65 64 2c 20 77 65 20 61 72 65 20 67 75 61 72  sed, we are guar
16a00 61 6e 74 65 65 64 0a 20 20 2a 2a 20 74 68 61 74  anteed.  ** that
16a10 20 74 68 65 20 6f 62 6a 65 63 74 20 77 69 6c 6c   the object will
16a20 20 6e 65 76 65 72 20 61 6c 72 65 61 64 79 20 62   never already b
16a30 65 20 69 6e 20 63 61 63 68 65 2e 20 20 56 65 72  e in cache.  Ver
16a40 69 66 79 20 74 68 69 73 20 67 75 61 72 61 6e 74  ify this guarant
16a50 65 65 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66  ee..  */.#ifndef
16a60 20 4e 44 45 42 55 47 0a 20 20 66 6f 72 28 69 3d   NDEBUG.  for(i=
16a70 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f  0, p=pParse->aCo
16a80 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45  lCache; i<SQLITE
16a90 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b  _N_COLCACHE; i++
16aa0 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65  , p++){.    asse
16ab0 72 74 28 20 70 2d 3e 69 52 65 67 3d 3d 30 20 7c  rt( p->iReg==0 |
16ac0 7c 20 70 2d 3e 69 54 61 62 6c 65 21 3d 69 54 61  | p->iTable!=iTa
16ad0 62 20 7c 7c 20 70 2d 3e 69 43 6f 6c 75 6d 6e 21  b || p->iColumn!
16ae0 3d 69 43 6f 6c 20 29 3b 0a 20 20 7d 0a 23 65 6e  =iCol );.  }.#en
16af0 64 69 66 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 61  dif..  /* Find a
16b00 6e 20 65 6d 70 74 79 20 73 6c 6f 74 20 61 6e 64  n empty slot and
16b10 20 72 65 70 6c 61 63 65 20 69 74 20 2a 2f 0a 20   replace it */. 
16b20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72   for(i=0, p=pPar
16b30 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69  se->aColCache; i
16b40 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43  <SQLITE_N_COLCAC
16b50 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20  HE; i++, p++){. 
16b60 20 20 20 69 66 28 20 70 2d 3e 69 52 65 67 3d 3d     if( p->iReg==
16b70 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69 4c  0 ){.      p->iL
16b80 65 76 65 6c 20 3d 20 70 50 61 72 73 65 2d 3e 69  evel = pParse->i
16b90 43 61 63 68 65 4c 65 76 65 6c 3b 0a 20 20 20 20  CacheLevel;.    
16ba0 20 20 70 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54    p->iTable = iT
16bb0 61 62 3b 0a 20 20 20 20 20 20 70 2d 3e 69 43 6f  ab;.      p->iCo
16bc0 6c 75 6d 6e 20 3d 20 69 43 6f 6c 3b 0a 20 20 20  lumn = iCol;.   
16bd0 20 20 20 70 2d 3e 69 52 65 67 20 3d 20 69 52 65     p->iReg = iRe
16be0 67 3b 0a 20 20 20 20 20 20 70 2d 3e 74 65 6d 70  g;.      p->temp
16bf0 52 65 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  Reg = 0;.      p
16c00 2d 3e 6c 72 75 20 3d 20 70 50 61 72 73 65 2d 3e  ->lru = pParse->
16c10 69 43 61 63 68 65 43 6e 74 2b 2b 3b 0a 20 20 20  iCacheCnt++;.   
16c20 20 20 20 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43     pParse->nColC
16c30 61 63 68 65 2b 2b 3b 0a 20 20 20 20 20 20 61 73  ache++;.      as
16c40 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64 62  sert( pParse->db
16c50 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c  ->mallocFailed |
16c60 7c 20 63 61 63 68 65 49 73 56 61 6c 69 64 28 70  | cacheIsValid(p
16c70 50 61 72 73 65 29 20 29 3b 0a 20 20 20 20 20 20  Parse) );.      
16c80 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
16c90 7d 0a 0a 20 20 2f 2a 20 52 65 70 6c 61 63 65 20  }..  /* Replace 
16ca0 74 68 65 20 6c 61 73 74 20 72 65 63 65 6e 74 6c  the last recentl
16cb0 79 20 75 73 65 64 20 2a 2f 0a 20 20 6d 69 6e 4c  y used */.  minL
16cc0 72 75 20 3d 20 30 78 37 66 66 66 66 66 66 66 3b  ru = 0x7fffffff;
16cd0 0a 20 20 69 64 78 4c 72 75 20 3d 20 2d 31 3b 0a  .  idxLru = -1;.
16ce0 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61    for(i=0, p=pPa
16cf0 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20  rse->aColCache; 
16d00 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41  i<SQLITE_N_COLCA
16d10 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a  CHE; i++, p++){.
16d20 20 20 20 20 69 66 28 20 70 2d 3e 6c 72 75 3c 6d      if( p->lru<m
16d30 69 6e 4c 72 75 20 29 7b 0a 20 20 20 20 20 20 69  inLru ){.      i
16d40 64 78 4c 72 75 20 3d 20 69 3b 0a 20 20 20 20 20  dxLru = i;.     
16d50 20 6d 69 6e 4c 72 75 20 3d 20 70 2d 3e 6c 72 75   minLru = p->lru
16d60 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
16d70 28 20 41 4c 57 41 59 53 28 69 64 78 4c 72 75 3e  ( ALWAYS(idxLru>
16d80 3d 30 29 20 29 7b 0a 20 20 20 20 70 20 3d 20 26  =0) ){.    p = &
16d90 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68  pParse->aColCach
16da0 65 5b 69 64 78 4c 72 75 5d 3b 0a 20 20 20 20 70  e[idxLru];.    p
16db0 2d 3e 69 4c 65 76 65 6c 20 3d 20 70 50 61 72 73  ->iLevel = pPars
16dc0 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 3b 0a  e->iCacheLevel;.
16dd0 20 20 20 20 70 2d 3e 69 54 61 62 6c 65 20 3d 20      p->iTable = 
16de0 69 54 61 62 3b 0a 20 20 20 20 70 2d 3e 69 43 6f  iTab;.    p->iCo
16df0 6c 75 6d 6e 20 3d 20 69 43 6f 6c 3b 0a 20 20 20  lumn = iCol;.   
16e00 20 70 2d 3e 69 52 65 67 20 3d 20 69 52 65 67 3b   p->iReg = iReg;
16e10 0a 20 20 20 20 70 2d 3e 74 65 6d 70 52 65 67 20  .    p->tempReg 
16e20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 6c 72 75 20  = 0;.    p->lru 
16e30 3d 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65  = pParse->iCache
16e40 43 6e 74 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72  Cnt++;.    asser
16e50 74 28 20 63 61 63 68 65 49 73 56 61 6c 69 64 28  t( cacheIsValid(
16e60 70 50 61 72 73 65 29 20 29 3b 0a 20 20 20 20 72  pParse) );.    r
16e70 65 74 75 72 6e 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  eturn;.  }.}../*
16e80 0a 2a 2a 20 49 6e 64 69 63 61 74 65 20 74 68 61  .** Indicate tha
16e90 74 20 72 65 67 69 73 74 65 72 73 20 62 65 74 77  t registers betw
16ea0 65 65 6e 20 69 52 65 67 2e 2e 69 52 65 67 2b 6e  een iReg..iReg+n
16eb0 52 65 67 2d 31 20 61 72 65 20 62 65 69 6e 67 20  Reg-1 are being 
16ec0 6f 76 65 72 77 72 69 74 74 65 6e 2e 0a 2a 2a 20  overwritten..** 
16ed0 50 75 72 67 65 20 74 68 65 20 72 61 6e 67 65 20  Purge the range 
16ee0 6f 66 20 72 65 67 69 73 74 65 72 73 20 66 72 6f  of registers fro
16ef0 6d 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63  m the column cac
16f00 68 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  he..*/.void sqli
16f10 74 65 33 45 78 70 72 43 61 63 68 65 52 65 6d 6f  te3ExprCacheRemo
16f20 76 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ve(Parse *pParse
16f30 2c 20 69 6e 74 20 69 52 65 67 2c 20 69 6e 74 20  , int iReg, int 
16f40 6e 52 65 67 29 7b 0a 20 20 73 74 72 75 63 74 20  nReg){.  struct 
16f50 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20  yColCache *p;.  
16f60 69 66 28 20 69 52 65 67 3c 3d 30 20 7c 7c 20 70  if( iReg<=0 || p
16f70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65  Parse->nColCache
16f80 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
16f90 70 20 3d 20 26 70 50 61 72 73 65 2d 3e 61 43 6f  p = &pParse->aCo
16fa0 6c 43 61 63 68 65 5b 53 51 4c 49 54 45 5f 4e 5f  lCache[SQLITE_N_
16fb0 43 4f 4c 43 41 43 48 45 2d 31 5d 3b 0a 20 20 77  COLCACHE-1];.  w
16fc0 68 69 6c 65 28 31 29 7b 0a 20 20 20 20 69 66 28  hile(1){.    if(
16fd0 20 70 2d 3e 69 52 65 67 20 3e 3d 20 69 52 65 67   p->iReg >= iReg
16fe0 20 26 26 20 70 2d 3e 69 52 65 67 20 3c 20 69 52   && p->iReg < iR
16ff0 65 67 2b 6e 52 65 67 20 29 20 63 61 63 68 65 45  eg+nReg ) cacheE
17000 6e 74 72 79 43 6c 65 61 72 28 70 50 61 72 73 65  ntryClear(pParse
17010 2c 20 70 29 3b 0a 20 20 20 20 69 66 28 20 70 3d  , p);.    if( p=
17020 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63  =pParse->aColCac
17030 68 65 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  he ) break;.    
17040 70 2d 2d 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  p--;.  }.}../*.*
17050 2a 20 52 65 6d 65 6d 62 65 72 20 74 68 65 20 63  * Remember the c
17060 75 72 72 65 6e 74 20 63 6f 6c 75 6d 6e 20 63 61  urrent column ca
17070 63 68 65 20 63 6f 6e 74 65 78 74 2e 20 20 41 6e  che context.  An
17080 79 20 6e 65 77 20 65 6e 74 72 69 65 73 20 61 64  y new entries ad
17090 64 65 64 0a 2a 2a 20 61 64 64 65 64 20 74 6f 20  ded.** added to 
170a0 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65  the column cache
170b0 20 61 66 74 65 72 20 74 68 69 73 20 63 61 6c 6c   after this call
170c0 20 61 72 65 20 72 65 6d 6f 76 65 64 20 77 68 65   are removed whe
170d0 6e 20 74 68 65 0a 2a 2a 20 63 6f 72 72 65 73 70  n the.** corresp
170e0 6f 6e 64 69 6e 67 20 70 6f 70 20 6f 63 63 75 72  onding pop occur
170f0 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
17100 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28  e3ExprCachePush(
17110 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
17120 20 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65    pParse->iCache
17130 4c 65 76 65 6c 2b 2b 3b 0a 23 69 66 64 65 66 20  Level++;.#ifdef 
17140 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69  SQLITE_DEBUG.  i
17150 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66  f( pParse->db->f
17160 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 56 64  lags & SQLITE_Vd
17170 62 65 41 64 64 6f 70 54 72 61 63 65 20 29 7b 0a  beAddopTrace ){.
17180 20 20 20 20 70 72 69 6e 74 66 28 22 50 55 53 48      printf("PUSH
17190 20 74 6f 20 25 64 5c 6e 22 2c 20 70 50 61 72 73   to %d\n", pPars
171a0 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 29 3b  e->iCacheLevel);
171b0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  .  }.#endif.}../
171c0 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 66 72 6f 6d  *.** Remove from
171d0 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68   the column cach
171e0 65 20 61 6e 79 20 65 6e 74 72 69 65 73 20 74 68  e any entries th
171f0 61 74 20 77 65 72 65 20 61 64 64 65 64 20 73 69  at were added si
17200 6e 63 65 20 74 68 65 0a 2a 2a 20 74 68 65 20 70  nce the.** the p
17210 72 65 76 69 6f 75 73 20 73 71 6c 69 74 65 33 45  revious sqlite3E
17220 78 70 72 43 61 63 68 65 50 75 73 68 20 6f 70 65  xprCachePush ope
17230 72 61 74 69 6f 6e 2e 20 20 49 6e 20 6f 74 68 65  ration.  In othe
17240 72 20 77 6f 72 64 73 2c 20 72 65 73 74 6f 72 65  r words, restore
17250 0a 2a 2a 20 74 68 65 20 63 61 63 68 65 20 74 6f  .** the cache to
17260 20 74 68 65 20 73 74 61 74 65 20 69 74 20 77 61   the state it wa
17270 73 20 69 6e 20 70 72 69 6f 72 20 74 68 65 20 6d  s in prior the m
17280 6f 73 74 20 72 65 63 65 6e 74 20 50 75 73 68 2e  ost recent Push.
17290 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
172a0 45 78 70 72 43 61 63 68 65 50 6f 70 28 50 61 72  ExprCachePop(Par
172b0 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 69  se *pParse){.  i
172c0 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 79  nt i;.  struct y
172d0 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20 61  ColCache *p;.  a
172e0 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 69  ssert( pParse->i
172f0 43 61 63 68 65 4c 65 76 65 6c 3e 3d 31 20 29 3b  CacheLevel>=1 );
17300 0a 20 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68  .  pParse->iCach
17310 65 4c 65 76 65 6c 2d 2d 3b 0a 23 69 66 64 65 66  eLevel--;.#ifdef
17320 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
17330 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  if( pParse->db->
17340 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 56  flags & SQLITE_V
17350 64 62 65 41 64 64 6f 70 54 72 61 63 65 20 29 7b  dbeAddopTrace ){
17360 0a 20 20 20 20 70 72 69 6e 74 66 28 22 50 4f 50  .    printf("POP
17370 20 20 74 6f 20 25 64 5c 6e 22 2c 20 70 50 61 72    to %d\n", pPar
17380 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 29  se->iCacheLevel)
17390 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 66  ;.  }.#endif.  f
173a0 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65  or(i=0, p=pParse
173b0 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53  ->aColCache; i<S
173c0 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45  QLITE_N_COLCACHE
173d0 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20  ; i++, p++){.   
173e0 20 69 66 28 20 70 2d 3e 69 52 65 67 20 26 26 20   if( p->iReg && 
173f0 70 2d 3e 69 4c 65 76 65 6c 3e 70 50 61 72 73 65  p->iLevel>pParse
17400 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 20 29 7b  ->iCacheLevel ){
17410 0a 20 20 20 20 20 20 63 61 63 68 65 45 6e 74 72  .      cacheEntr
17420 79 43 6c 65 61 72 28 70 50 61 72 73 65 2c 20 70  yClear(pParse, p
17430 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
17440 2f 2a 0a 2a 2a 20 57 68 65 6e 20 61 20 63 61 63  /*.** When a cac
17450 68 65 64 20 63 6f 6c 75 6d 6e 20 69 73 20 72 65  hed column is re
17460 75 73 65 64 2c 20 6d 61 6b 65 20 73 75 72 65 20  used, make sure 
17470 74 68 61 74 20 69 74 73 20 72 65 67 69 73 74 65  that its registe
17480 72 20 69 73 0a 2a 2a 20 6e 6f 20 6c 6f 6e 67 65  r is.** no longe
17490 72 20 61 76 61 69 6c 61 62 6c 65 20 61 73 20 61  r available as a
174a0 20 74 65 6d 70 20 72 65 67 69 73 74 65 72 2e 20   temp register. 
174b0 20 74 69 63 6b 65 74 20 23 33 38 37 39 3a 20 20   ticket #3879:  
174c0 74 68 61 74 20 73 61 6d 65 0a 2a 2a 20 72 65 67  that same.** reg
174d0 69 73 74 65 72 20 6d 69 67 68 74 20 62 65 20 69  ister might be i
174e0 6e 20 74 68 65 20 63 61 63 68 65 20 69 6e 20 6d  n the cache in m
174f0 75 6c 74 69 70 6c 65 20 70 6c 61 63 65 73 2c 20  ultiple places, 
17500 73 6f 20 62 65 20 73 75 72 65 20 74 6f 0a 2a 2a  so be sure to.**
17510 20 67 65 74 20 74 68 65 6d 20 61 6c 6c 2e 0a 2a   get them all..*
17520 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71  /.static void sq
17530 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 69  lite3ExprCachePi
17540 6e 52 65 67 69 73 74 65 72 28 50 61 72 73 65 20  nRegister(Parse 
17550 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 52 65  *pParse, int iRe
17560 67 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  g){.  int i;.  s
17570 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20  truct yColCache 
17580 2a 70 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70  *p;.  for(i=0, p
17590 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63  =pParse->aColCac
175a0 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43  he; i<SQLITE_N_C
175b0 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b  OLCACHE; i++, p+
175c0 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69  +){.    if( p->i
175d0 52 65 67 3d 3d 69 52 65 67 20 29 7b 0a 20 20 20  Reg==iReg ){.   
175e0 20 20 20 70 2d 3e 74 65 6d 70 52 65 67 20 3d 20     p->tempReg = 
175f0 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  0;.    }.  }.}..
17600 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
17610 20 74 68 61 74 20 77 69 6c 6c 20 6c 6f 61 64 20   that will load 
17620 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20 72 65  into register re
17630 67 4f 75 74 20 61 20 76 61 6c 75 65 20 74 68 61  gOut a value tha
17640 74 20 69 73 0a 2a 2a 20 61 70 70 72 6f 70 72 69  t is.** appropri
17650 61 74 65 20 66 6f 72 20 74 68 65 20 69 49 64 78  ate for the iIdx
17660 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66  Col-th column of
17670 20 69 6e 64 65 78 20 70 49 64 78 2e 0a 2a 2f 0a   index pIdx..*/.
17680 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
17690 43 6f 64 65 4c 6f 61 64 49 6e 64 65 78 43 6f 6c  CodeLoadIndexCol
176a0 75 6d 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50  umn(.  Parse *pP
176b0 61 72 73 65 2c 20 20 2f 2a 20 54 68 65 20 70 61  arse,  /* The pa
176c0 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
176d0 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 2c 20  .  Index *pIdx, 
176e0 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20     /* The index 
176f0 77 68 6f 73 65 20 63 6f 6c 75 6d 6e 20 69 73 20  whose column is 
17700 74 6f 20 62 65 20 6c 6f 61 64 65 64 20 2a 2f 0a  to be loaded */.
17710 20 20 69 6e 74 20 69 54 61 62 43 75 72 2c 20 20    int iTabCur,  
17720 20 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e    /* Cursor poin
17730 74 69 6e 67 20 74 6f 20 61 20 74 61 62 6c 65 20  ting to a table 
17740 72 6f 77 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64  row */.  int iId
17750 78 43 6f 6c 2c 20 20 20 20 2f 2a 20 54 68 65 20  xCol,    /* The 
17760 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e  column of the in
17770 64 65 78 20 74 6f 20 62 65 20 6c 6f 61 64 65 64  dex to be loaded
17780 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75 74   */.  int regOut
17790 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74        /* Store t
177a0 68 65 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 20  he index column 
177b0 76 61 6c 75 65 20 69 6e 20 74 68 69 73 20 72 65  value in this re
177c0 67 69 73 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 69  gister */.){.  i
177d0 31 36 20 69 54 61 62 43 6f 6c 20 3d 20 70 49 64  16 iTabCol = pId
177e0 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 49 64 78  x->aiColumn[iIdx
177f0 43 6f 6c 5d 3b 0a 20 20 69 66 28 20 69 54 61 62  Col];.  if( iTab
17800 43 6f 6c 3d 3d 58 4e 5f 45 58 50 52 20 29 7b 0a  Col==XN_EXPR ){.
17810 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78      assert( pIdx
17820 2d 3e 61 43 6f 6c 45 78 70 72 20 29 3b 0a 20 20  ->aColExpr );.  
17830 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e    assert( pIdx->
17840 61 43 6f 6c 45 78 70 72 2d 3e 6e 45 78 70 72 3e  aColExpr->nExpr>
17850 69 49 64 78 43 6f 6c 20 29 3b 0a 20 20 20 20 70  iIdxCol );.    p
17860 50 61 72 73 65 2d 3e 69 53 65 6c 66 54 61 62 20  Parse->iSelfTab 
17870 3d 20 69 54 61 62 43 75 72 3b 0a 20 20 20 20 73  = iTabCur;.    s
17880 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 43 6f  qlite3ExprCodeCo
17890 70 79 28 70 50 61 72 73 65 2c 20 70 49 64 78 2d  py(pParse, pIdx-
178a0 3e 61 43 6f 6c 45 78 70 72 2d 3e 61 5b 69 49 64  >aColExpr->a[iId
178b0 78 43 6f 6c 5d 2e 70 45 78 70 72 2c 20 72 65 67  xCol].pExpr, reg
178c0 4f 75 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Out);.  }else{. 
178d0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
178e0 64 65 47 65 74 43 6f 6c 75 6d 6e 4f 66 54 61 62  deGetColumnOfTab
178f0 6c 65 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65  le(pParse->pVdbe
17900 2c 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2c 20  , pIdx->pTable, 
17910 69 54 61 62 43 75 72 2c 0a 20 20 20 20 20 20 20  iTabCur,.       
17920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17930 20 20 20 20 20 20 20 20 20 20 20 20 20 69 54 61               iTa
17940 62 43 6f 6c 2c 20 72 65 67 4f 75 74 29 3b 0a 20  bCol, regOut);. 
17950 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65   }.}../*.** Gene
17960 72 61 74 65 20 63 6f 64 65 20 74 6f 20 65 78 74  rate code to ext
17970 72 61 63 74 20 74 68 65 20 76 61 6c 75 65 20 6f  ract the value o
17980 66 20 74 68 65 20 69 43 6f 6c 2d 74 68 20 63 6f  f the iCol-th co
17990 6c 75 6d 6e 20 6f 66 20 61 20 74 61 62 6c 65 2e  lumn of a table.
179a0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
179b0 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d  ExprCodeGetColum
179c0 6e 4f 66 54 61 62 6c 65 28 0a 20 20 56 64 62 65  nOfTable(.  Vdbe
179d0 20 2a 76 2c 20 20 20 20 20 20 20 20 2f 2a 20 54   *v,        /* T
179e0 68 65 20 56 44 42 45 20 75 6e 64 65 72 20 63 6f  he VDBE under co
179f0 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20  nstruction */.  
17a00 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20  Table *pTab,    
17a10 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 63 6f 6e  /* The table con
17a20 74 61 69 6e 69 6e 67 20 74 68 65 20 76 61 6c 75  taining the valu
17a30 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 43  e */.  int iTabC
17a40 75 72 2c 20 20 20 20 2f 2a 20 54 68 65 20 74 61  ur,    /* The ta
17a50 62 6c 65 20 63 75 72 73 6f 72 2e 20 20 4f 72 20  ble cursor.  Or 
17a60 74 68 65 20 50 4b 20 63 75 72 73 6f 72 20 66 6f  the PK cursor fo
17a70 72 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20  r WITHOUT ROWID 
17a80 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 20 20  */.  int iCol,  
17a90 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
17aa0 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74 6f 20 65   the column to e
17ab0 78 74 72 61 63 74 20 2a 2f 0a 20 20 69 6e 74 20  xtract */.  int 
17ac0 72 65 67 4f 75 74 20 20 20 20 20 20 2f 2a 20 45  regOut      /* E
17ad0 78 74 72 61 63 74 20 74 68 65 20 76 61 6c 75 65  xtract the value
17ae0 20 69 6e 74 6f 20 74 68 69 73 20 72 65 67 69 73   into this regis
17af0 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  ter */.){.  if( 
17b00 69 43 6f 6c 3c 30 20 7c 7c 20 69 43 6f 6c 3d 3d  iCol<0 || iCol==
17b10 70 54 61 62 2d 3e 69 50 4b 65 79 20 29 7b 0a 20  pTab->iPKey ){. 
17b20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
17b30 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 69 64  dOp2(v, OP_Rowid
17b40 2c 20 69 54 61 62 43 75 72 2c 20 72 65 67 4f 75  , iTabCur, regOu
17b50 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  t);.  }else{.   
17b60 20 69 6e 74 20 6f 70 20 3d 20 49 73 56 69 72 74   int op = IsVirt
17b70 75 61 6c 28 70 54 61 62 29 20 3f 20 4f 50 5f 56  ual(pTab) ? OP_V
17b80 43 6f 6c 75 6d 6e 20 3a 20 4f 50 5f 43 6f 6c 75  Column : OP_Colu
17b90 6d 6e 3b 0a 20 20 20 20 69 6e 74 20 78 20 3d 20  mn;.    int x = 
17ba0 69 43 6f 6c 3b 0a 20 20 20 20 69 66 28 20 21 48  iCol;.    if( !H
17bb0 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 26 26  asRowid(pTab) &&
17bc0 20 21 49 73 56 69 72 74 75 61 6c 28 70 54 61 62   !IsVirtual(pTab
17bd0 29 20 29 7b 0a 20 20 20 20 20 20 78 20 3d 20 73  ) ){.      x = s
17be0 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e  qlite3ColumnOfIn
17bf0 64 65 78 28 73 71 6c 69 74 65 33 50 72 69 6d 61  dex(sqlite3Prima
17c00 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29  ryKeyIndex(pTab)
17c10 2c 20 69 43 6f 6c 29 3b 0a 20 20 20 20 7d 0a 20  , iCol);.    }. 
17c20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
17c30 64 4f 70 33 28 76 2c 20 6f 70 2c 20 69 54 61 62  dOp3(v, op, iTab
17c40 43 75 72 2c 20 78 2c 20 72 65 67 4f 75 74 29 3b  Cur, x, regOut);
17c50 0a 20 20 7d 0a 20 20 69 66 28 20 69 43 6f 6c 3e  .  }.  if( iCol>
17c60 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
17c70 33 43 6f 6c 75 6d 6e 44 65 66 61 75 6c 74 28 76  3ColumnDefault(v
17c80 2c 20 70 54 61 62 2c 20 69 43 6f 6c 2c 20 72 65  , pTab, iCol, re
17c90 67 4f 75 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  gOut);.  }.}../*
17ca0 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
17cb0 65 20 74 68 61 74 20 77 69 6c 6c 20 65 78 74 72  e that will extr
17cc0 61 63 74 20 74 68 65 20 69 43 6f 6c 75 6d 6e 2d  act the iColumn-
17cd0 74 68 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d 0a 2a  th column from.*
17ce0 2a 20 74 61 62 6c 65 20 70 54 61 62 20 61 6e 64  * table pTab and
17cf0 20 73 74 6f 72 65 20 74 68 65 20 63 6f 6c 75 6d   store the colum
17d00 6e 20 76 61 6c 75 65 20 69 6e 20 61 20 72 65 67  n value in a reg
17d10 69 73 74 65 72 2e 20 0a 2a 2a 0a 2a 2a 20 41 6e  ister. .**.** An
17d20 20 65 66 66 6f 72 74 20 69 73 20 6d 61 64 65 20   effort is made 
17d30 74 6f 20 73 74 6f 72 65 20 74 68 65 20 63 6f 6c  to store the col
17d40 75 6d 6e 20 76 61 6c 75 65 20 69 6e 20 72 65 67  umn value in reg
17d50 69 73 74 65 72 20 69 52 65 67 2e 20 20 54 68 69  ister iReg.  Thi
17d60 73 0a 2a 2a 20 69 73 20 6e 6f 74 20 67 61 72 61  s.** is not gara
17d70 6e 74 65 65 65 64 20 66 6f 72 20 47 65 74 43 6f  nteeed for GetCo
17d80 6c 75 6d 6e 28 29 20 2d 20 74 68 65 20 72 65 73  lumn() - the res
17d90 75 6c 74 20 63 61 6e 20 62 65 20 73 74 6f 72 65  ult can be store
17da0 64 20 69 6e 0a 2a 2a 20 61 6e 79 20 72 65 67 69  d in.** any regi
17db0 73 74 65 72 2e 20 20 42 75 74 20 74 68 65 20 72  ster.  But the r
17dc0 65 73 75 6c 74 20 69 73 20 67 75 61 72 61 6e 74  esult is guarant
17dd0 65 65 64 20 74 6f 20 6c 61 6e 64 20 69 6e 20 72  eed to land in r
17de0 65 67 69 73 74 65 72 20 69 52 65 67 0a 2a 2a 20  egister iReg.** 
17df0 66 6f 72 20 47 65 74 43 6f 6c 75 6d 6e 54 6f 52  for GetColumnToR
17e00 65 67 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72  eg()..**.** Ther
17e10 65 20 6d 75 73 74 20 62 65 20 61 6e 20 6f 70 65  e must be an ope
17e20 6e 20 63 75 72 73 6f 72 20 74 6f 20 70 54 61 62  n cursor to pTab
17e30 20 69 6e 20 69 54 61 62 6c 65 20 77 68 65 6e 20   in iTable when 
17e40 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
17e50 69 73 20 63 61 6c 6c 65 64 2e 20 20 49 66 20 69  is called.  If i
17e60 43 6f 6c 75 6d 6e 3c 30 20 74 68 65 6e 20 63 6f  Column<0 then co
17e70 64 65 20 69 73 20 67 65 6e 65 72 61 74 65 64 20  de is generated 
17e80 74 68 61 74 20 65 78 74 72 61 63 74 73 20 74 68  that extracts th
17e90 65 20 72 6f 77 69 64 2e 0a 2a 2f 0a 69 6e 74 20  e rowid..*/.int 
17ea0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47  sqlite3ExprCodeG
17eb0 65 74 43 6f 6c 75 6d 6e 28 0a 20 20 50 61 72 73  etColumn(.  Pars
17ec0 65 20 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a 20  e *pParse,   /* 
17ed0 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65  Parsing and code
17ee0 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74   generating cont
17ef0 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a  ext */.  Table *
17f00 70 54 61 62 2c 20 20 20 20 20 2f 2a 20 44 65 73  pTab,     /* Des
17f10 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20  cription of the 
17f20 74 61 62 6c 65 20 77 65 20 61 72 65 20 72 65 61  table we are rea
17f30 64 69 6e 67 20 66 72 6f 6d 20 2a 2f 0a 20 20 69  ding from */.  i
17f40 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20 20 20  nt iColumn,     
17f50 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20  /* Index of the 
17f60 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 2a 2f 0a  table column */.
17f70 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20    int iTable,   
17f80 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72     /* The cursor
17f90 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65   pointing to the
17fa0 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
17fb0 69 52 65 67 2c 20 20 20 20 20 20 20 20 2f 2a 20  iReg,        /* 
17fc0 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20 68 65  Store results he
17fd0 72 65 20 2a 2f 0a 20 20 75 38 20 70 35 20 20 20  re */.  u8 p5   
17fe0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 35 20 76           /* P5 v
17ff0 61 6c 75 65 20 66 6f 72 20 4f 50 5f 43 6f 6c 75  alue for OP_Colu
18000 6d 6e 20 2b 20 46 4c 41 47 53 20 2a 2f 0a 29 7b  mn + FLAGS */.){
18010 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
18020 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
18030 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 79 43  t i;.  struct yC
18040 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 0a 20 20 66  olCache *p;..  f
18050 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65  or(i=0, p=pParse
18060 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53  ->aColCache; i<S
18070 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45  QLITE_N_COLCACHE
18080 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20  ; i++, p++){.   
18090 20 69 66 28 20 70 2d 3e 69 52 65 67 3e 30 20 26   if( p->iReg>0 &
180a0 26 20 70 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61  & p->iTable==iTa
180b0 62 6c 65 20 26 26 20 70 2d 3e 69 43 6f 6c 75 6d  ble && p->iColum
180c0 6e 3d 3d 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20  n==iColumn ){.  
180d0 20 20 20 20 70 2d 3e 6c 72 75 20 3d 20 70 50 61      p->lru = pPa
180e0 72 73 65 2d 3e 69 43 61 63 68 65 43 6e 74 2b 2b  rse->iCacheCnt++
180f0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
18100 78 70 72 43 61 63 68 65 50 69 6e 52 65 67 69 73  xprCachePinRegis
18110 74 65 72 28 70 50 61 72 73 65 2c 20 70 2d 3e 69  ter(pParse, p->i
18120 52 65 67 29 3b 0a 20 20 20 20 20 20 72 65 74 75  Reg);.      retu
18130 72 6e 20 70 2d 3e 69 52 65 67 3b 0a 20 20 20 20  rn p->iReg;.    
18140 7d 0a 20 20 7d 20 20 0a 20 20 61 73 73 65 72 74  }.  }  .  assert
18150 28 20 76 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69  ( v!=0 );.  sqli
18160 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f  te3ExprCodeGetCo
18170 6c 75 6d 6e 4f 66 54 61 62 6c 65 28 76 2c 20 70  lumnOfTable(v, p
18180 54 61 62 2c 20 69 54 61 62 6c 65 2c 20 69 43 6f  Tab, iTable, iCo
18190 6c 75 6d 6e 2c 20 69 52 65 67 29 3b 0a 20 20 69  lumn, iReg);.  i
181a0 66 28 20 70 35 20 29 7b 0a 20 20 20 20 73 71 6c  f( p5 ){.    sql
181b0 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
181c0 28 76 2c 20 70 35 29 3b 0a 20 20 7d 65 6c 73 65  (v, p5);.  }else
181d0 7b 20 20 20 0a 20 20 20 20 73 71 6c 69 74 65 33  {   .    sqlite3
181e0 45 78 70 72 43 61 63 68 65 53 74 6f 72 65 28 70  ExprCacheStore(p
181f0 50 61 72 73 65 2c 20 69 54 61 62 6c 65 2c 20 69  Parse, iTable, i
18200 43 6f 6c 75 6d 6e 2c 20 69 52 65 67 29 3b 0a 20  Column, iReg);. 
18210 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 52 65 67   }.  return iReg
18220 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  ;.}.void sqlite3
18230 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d  ExprCodeGetColum
18240 6e 54 6f 52 65 67 28 0a 20 20 50 61 72 73 65 20  nToReg(.  Parse 
18250 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a 20 50 61  *pParse,   /* Pa
18260 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67  rsing and code g
18270 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78  enerating contex
18280 74 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54  t */.  Table *pT
18290 61 62 2c 20 20 20 20 20 2f 2a 20 44 65 73 63 72  ab,     /* Descr
182a0 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 74 61  iption of the ta
182b0 62 6c 65 20 77 65 20 61 72 65 20 72 65 61 64 69  ble we are readi
182c0 6e 67 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74  ng from */.  int
182d0 20 69 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 2f 2a   iColumn,     /*
182e0 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20 74 61   Index of the ta
182f0 62 6c 65 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20  ble column */.  
18300 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20  int iTable,     
18310 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 70   /* The cursor p
18320 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 74  ointing to the t
18330 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52  able */.  int iR
18340 65 67 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74  eg         /* St
18350 6f 72 65 20 72 65 73 75 6c 74 73 20 68 65 72 65  ore results here
18360 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 31 20   */.){.  int r1 
18370 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
18380 65 47 65 74 43 6f 6c 75 6d 6e 28 70 50 61 72 73  eGetColumn(pPars
18390 65 2c 20 70 54 61 62 2c 20 69 43 6f 6c 75 6d 6e  e, pTab, iColumn
183a0 2c 20 69 54 61 62 6c 65 2c 20 69 52 65 67 2c 20  , iTable, iReg, 
183b0 30 29 3b 0a 20 20 69 66 28 20 72 31 21 3d 69 52  0);.  if( r1!=iR
183c0 65 67 20 29 20 73 71 6c 69 74 65 33 56 64 62 65  eg ) sqlite3Vdbe
183d0 41 64 64 4f 70 32 28 70 50 61 72 73 65 2d 3e 70  AddOp2(pParse->p
183e0 56 64 62 65 2c 20 4f 50 5f 53 43 6f 70 79 2c 20  Vdbe, OP_SCopy, 
183f0 72 31 2c 20 69 52 65 67 29 3b 0a 7d 0a 0a 0a 2f  r1, iReg);.}.../
18400 2a 0a 2a 2a 20 43 6c 65 61 72 20 61 6c 6c 20 63  *.** Clear all c
18410 6f 6c 75 6d 6e 20 63 61 63 68 65 20 65 6e 74 72  olumn cache entr
18420 69 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ies..*/.void sql
18430 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65  ite3ExprCacheCle
18440 61 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ar(Parse *pParse
18450 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74  ){.  int i;.  st
18460 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a  ruct yColCache *
18470 70 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 44  p;..#if SQLITE_D
18480 45 42 55 47 0a 20 20 69 66 28 20 70 50 61 72 73  EBUG.  if( pPars
18490 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  e->db->flags & S
184a0 51 4c 49 54 45 5f 56 64 62 65 41 64 64 6f 70 54  QLITE_VdbeAddopT
184b0 72 61 63 65 20 29 7b 0a 20 20 20 20 70 72 69 6e  race ){.    prin
184c0 74 66 28 22 43 4c 45 41 52 5c 6e 22 29 3b 0a 20  tf("CLEAR\n");. 
184d0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 66 6f 72 28   }.#endif.  for(
184e0 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61  i=0, p=pParse->a
184f0 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49  ColCache; i<SQLI
18500 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69  TE_N_COLCACHE; i
18510 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66  ++, p++){.    if
18520 28 20 70 2d 3e 69 52 65 67 20 29 7b 0a 20 20 20  ( p->iReg ){.   
18530 20 20 20 63 61 63 68 65 45 6e 74 72 79 43 6c 65     cacheEntryCle
18540 61 72 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20  ar(pParse, p);. 
18550 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
18560 2a 20 52 65 63 6f 72 64 20 74 68 65 20 66 61 63  * Record the fac
18570 74 20 74 68 61 74 20 61 6e 20 61 66 66 69 6e 69  t that an affini
18580 74 79 20 63 68 61 6e 67 65 20 68 61 73 20 6f 63  ty change has oc
18590 63 75 72 72 65 64 20 6f 6e 20 69 43 6f 75 6e 74  curred on iCount
185a0 0a 2a 2a 20 72 65 67 69 73 74 65 72 73 20 73 74  .** registers st
185b0 61 72 74 69 6e 67 20 77 69 74 68 20 69 53 74 61  arting with iSta
185c0 72 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  rt..*/.void sqli
185d0 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69  te3ExprCacheAffi
185e0 6e 69 74 79 43 68 61 6e 67 65 28 50 61 72 73 65  nityChange(Parse
185f0 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 53   *pParse, int iS
18600 74 61 72 74 2c 20 69 6e 74 20 69 43 6f 75 6e 74  tart, int iCount
18610 29 7b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  ){.  sqlite3Expr
18620 43 61 63 68 65 52 65 6d 6f 76 65 28 70 50 61 72  CacheRemove(pPar
18630 73 65 2c 20 69 53 74 61 72 74 2c 20 69 43 6f 75  se, iStart, iCou
18640 6e 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  nt);.}../*.** Ge
18650 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 6d  nerate code to m
18660 6f 76 65 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d  ove content from
18670 20 72 65 67 69 73 74 65 72 73 20 69 46 72 6f 6d   registers iFrom
18680 2e 2e 2e 69 46 72 6f 6d 2b 6e 52 65 67 2d 31 0a  ...iFrom+nReg-1.
18690 2a 2a 20 6f 76 65 72 20 74 6f 20 69 54 6f 2e 2e  ** over to iTo..
186a0 69 54 6f 2b 6e 52 65 67 2d 31 2e 20 4b 65 65 70  iTo+nReg-1. Keep
186b0 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68   the column cach
186c0 65 20 75 70 2d 74 6f 2d 64 61 74 65 2e 0a 2a 2f  e up-to-date..*/
186d0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
186e0 72 43 6f 64 65 4d 6f 76 65 28 50 61 72 73 65 20  rCodeMove(Parse 
186f0 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 46 72  *pParse, int iFr
18700 6f 6d 2c 20 69 6e 74 20 69 54 6f 2c 20 69 6e 74  om, int iTo, int
18710 20 6e 52 65 67 29 7b 0a 20 20 61 73 73 65 72 74   nReg){.  assert
18720 28 20 69 46 72 6f 6d 3e 3d 69 54 6f 2b 6e 52 65  ( iFrom>=iTo+nRe
18730 67 20 7c 7c 20 69 46 72 6f 6d 2b 6e 52 65 67 3c  g || iFrom+nReg<
18740 3d 69 54 6f 20 29 3b 0a 20 20 73 71 6c 69 74 65  =iTo );.  sqlite
18750 33 56 64 62 65 41 64 64 4f 70 33 28 70 50 61 72  3VdbeAddOp3(pPar
18760 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 4d 6f  se->pVdbe, OP_Mo
18770 76 65 2c 20 69 46 72 6f 6d 2c 20 69 54 6f 2c 20  ve, iFrom, iTo, 
18780 6e 52 65 67 29 3b 0a 20 20 73 71 6c 69 74 65 33  nReg);.  sqlite3
18790 45 78 70 72 43 61 63 68 65 52 65 6d 6f 76 65 28  ExprCacheRemove(
187a0 70 50 61 72 73 65 2c 20 69 46 72 6f 6d 2c 20 6e  pParse, iFrom, n
187b0 52 65 67 29 3b 0a 7d 0a 0a 23 69 66 20 64 65 66  Reg);.}..#if def
187c0 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
187d0 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  G) || defined(SQ
187e0 4c 49 54 45 5f 43 4f 56 45 52 41 47 45 5f 54 45  LITE_COVERAGE_TE
187f0 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  ST)./*.** Return
18800 20 74 72 75 65 20 69 66 20 61 6e 79 20 72 65 67   true if any reg
18810 69 73 74 65 72 20 69 6e 20 74 68 65 20 72 61 6e  ister in the ran
18820 67 65 20 69 46 72 6f 6d 2e 2e 69 54 6f 20 28 69  ge iFrom..iTo (i
18830 6e 63 6c 75 73 69 76 65 29 0a 2a 2a 20 69 73 20  nclusive).** is 
18840 75 73 65 64 20 61 73 20 70 61 72 74 20 6f 66 20  used as part of 
18850 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65  the column cache
18860 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
18870 74 69 6e 65 20 69 73 20 75 73 65 64 20 77 69 74  tine is used wit
18880 68 69 6e 20 61 73 73 65 72 74 28 29 20 61 6e 64  hin assert() and
18890 20 74 65 73 74 63 61 73 65 28 29 20 6d 61 63 72   testcase() macr
188a0 6f 73 20 6f 6e 6c 79 0a 2a 2a 20 61 6e 64 20 64  os only.** and d
188b0 6f 65 73 20 6e 6f 74 20 61 70 70 65 61 72 20 69  oes not appear i
188c0 6e 20 61 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64  n a normal build
188d0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
188e0 75 73 65 64 41 73 43 6f 6c 75 6d 6e 43 61 63 68  usedAsColumnCach
188f0 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
18900 20 69 6e 74 20 69 46 72 6f 6d 2c 20 69 6e 74 20   int iFrom, int 
18910 69 54 6f 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  iTo){.  int i;. 
18920 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68   struct yColCach
18930 65 20 2a 70 3b 0a 20 20 66 6f 72 28 69 3d 30 2c  e *p;.  for(i=0,
18940 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43   p=pParse->aColC
18950 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e  ache; i<SQLITE_N
18960 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20  _COLCACHE; i++, 
18970 70 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 72 20  p++){.    int r 
18980 3d 20 70 2d 3e 69 52 65 67 3b 0a 20 20 20 20 69  = p->iReg;.    i
18990 66 28 20 72 3e 3d 69 46 72 6f 6d 20 26 26 20 72  f( r>=iFrom && r
189a0 3c 3d 69 54 6f 20 29 20 72 65 74 75 72 6e 20 31  <=iTo ) return 1
189b0 3b 20 20 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a 2f  ;    /*NO_TEST*/
189c0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
189d0 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
189e0 49 54 45 5f 44 45 42 55 47 20 7c 7c 20 53 51 4c  ITE_DEBUG || SQL
189f0 49 54 45 5f 43 4f 56 45 52 41 47 45 5f 54 45 53  ITE_COVERAGE_TES
18a00 54 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  T */.../*.** Con
18a10 76 65 72 74 20 61 6e 20 65 78 70 72 65 73 73 69  vert an expressi
18a20 6f 6e 20 6e 6f 64 65 20 74 6f 20 61 20 54 4b 5f  on node to a TK_
18a30 52 45 47 49 53 54 45 52 0a 2a 2f 0a 73 74 61 74  REGISTER.*/.stat
18a40 69 63 20 76 6f 69 64 20 65 78 70 72 54 6f 52 65  ic void exprToRe
18a50 67 69 73 74 65 72 28 45 78 70 72 20 2a 70 2c 20  gister(Expr *p, 
18a60 69 6e 74 20 69 52 65 67 29 7b 0a 20 20 70 2d 3e  int iReg){.  p->
18a70 6f 70 32 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 70  op2 = p->op;.  p
18a80 2d 3e 6f 70 20 3d 20 54 4b 5f 52 45 47 49 53 54  ->op = TK_REGIST
18a90 45 52 3b 0a 20 20 70 2d 3e 69 54 61 62 6c 65 20  ER;.  p->iTable 
18aa0 3d 20 69 52 65 67 3b 0a 20 20 45 78 70 72 43 6c  = iReg;.  ExprCl
18ab0 65 61 72 50 72 6f 70 65 72 74 79 28 70 2c 20 45  earProperty(p, E
18ac0 50 5f 53 6b 69 70 29 3b 0a 7d 0a 0a 73 74 61 74  P_Skip);.}..stat
18ad0 69 63 20 76 6f 69 64 20 65 78 70 72 43 6f 64 65  ic void exprCode
18ae0 42 65 74 77 65 65 6e 28 50 61 72 73 65 2a 2c 45  Between(Parse*,E
18af0 78 70 72 2a 2c 69 6e 74 2c 76 6f 69 64 28 2a 29  xpr*,int,void(*)
18b00 28 50 61 72 73 65 2a 2c 45 78 70 72 2a 2c 69 6e  (Parse*,Expr*,in
18b10 74 2c 69 6e 74 29 2c 69 6e 74 29 3b 0a 0a 2f 2a  t,int),int);../*
18b20 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
18b30 65 20 69 6e 74 6f 20 74 68 65 20 63 75 72 72 65  e into the curre
18b40 6e 74 20 56 64 62 65 20 74 6f 20 65 76 61 6c 75  nt Vdbe to evalu
18b50 61 74 65 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a  ate the given.**
18b60 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 41 74   expression.  At
18b70 74 65 6d 70 74 20 74 6f 20 73 74 6f 72 65 20 74  tempt to store t
18b80 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20 72 65  he results in re
18b90 67 69 73 74 65 72 20 22 74 61 72 67 65 74 22 2e  gister "target".
18ba0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 72  .** Return the r
18bb0 65 67 69 73 74 65 72 20 77 68 65 72 65 20 72 65  egister where re
18bc0 73 75 6c 74 73 20 61 72 65 20 73 74 6f 72 65 64  sults are stored
18bd0 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 20 74 68 69  ..**.** With thi
18be0 73 20 72 6f 75 74 69 6e 65 2c 20 74 68 65 72 65  s routine, there
18bf0 20 69 73 20 6e 6f 20 67 75 61 72 61 6e 74 65 65   is no guarantee
18c00 20 74 68 61 74 20 72 65 73 75 6c 74 73 20 77 69   that results wi
18c10 6c 6c 0a 2a 2a 20 62 65 20 73 74 6f 72 65 64 20  ll.** be stored 
18c20 69 6e 20 74 61 72 67 65 74 2e 20 20 54 68 65 20  in target.  The 
18c30 72 65 73 75 6c 74 20 6d 69 67 68 74 20 62 65 20  result might be 
18c40 73 74 6f 72 65 64 20 69 6e 20 73 6f 6d 65 20 6f  stored in some o
18c50 74 68 65 72 0a 2a 2a 20 72 65 67 69 73 74 65 72  ther.** register
18c60 20 69 66 20 69 74 20 69 73 20 63 6f 6e 76 65 6e   if it is conven
18c70 69 65 6e 74 20 74 6f 20 64 6f 20 73 6f 2e 20 20  ient to do so.  
18c80 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63  The calling func
18c90 74 69 6f 6e 0a 2a 2a 20 6d 75 73 74 20 63 68 65  tion.** must che
18ca0 63 6b 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f  ck the return co
18cb0 64 65 20 61 6e 64 20 6d 6f 76 65 20 74 68 65 20  de and move the 
18cc0 72 65 73 75 6c 74 73 20 74 6f 20 74 68 65 20 64  results to the d
18cd0 65 73 69 72 65 64 0a 2a 2a 20 72 65 67 69 73 74  esired.** regist
18ce0 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  er..*/.int sqlit
18cf0 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74  e3ExprCodeTarget
18d00 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
18d10 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74  Expr *pExpr, int
18d20 20 74 61 72 67 65 74 29 7b 0a 20 20 56 64 62 65   target){.  Vdbe
18d30 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
18d40 64 62 65 3b 20 20 2f 2a 20 54 68 65 20 56 4d 20  dbe;  /* The VM 
18d50 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
18d60 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b 20  on */.  int op; 
18d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18d80 20 20 2f 2a 20 54 68 65 20 6f 70 63 6f 64 65 20    /* The opcode 
18d90 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20  being coded */. 
18da0 20 69 6e 74 20 69 6e 52 65 67 20 3d 20 74 61 72   int inReg = tar
18db0 67 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 52 65  get;       /* Re
18dc0 73 75 6c 74 73 20 73 74 6f 72 65 64 20 69 6e 20  sults stored in 
18dd0 72 65 67 69 73 74 65 72 20 69 6e 52 65 67 20 2a  register inReg *
18de0 2f 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65 31  /.  int regFree1
18df0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a   = 0;         /*
18e00 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20 66 72 65   If non-zero fre
18e10 65 20 74 68 69 73 20 74 65 6d 70 6f 72 61 72 79  e this temporary
18e20 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 69   register */.  i
18e30 6e 74 20 72 65 67 46 72 65 65 32 20 3d 20 30 3b  nt regFree2 = 0;
18e40 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 6e           /* If n
18e50 6f 6e 2d 7a 65 72 6f 20 66 72 65 65 20 74 68 69  on-zero free thi
18e60 73 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69  s temporary regi
18e70 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 31  ster */.  int r1
18e80 2c 20 72 32 2c 20 72 33 2c 20 72 34 3b 20 20 20  , r2, r3, r4;   
18e90 20 20 20 20 2f 2a 20 56 61 72 69 6f 75 73 20 72      /* Various r
18ea0 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72 73 20  egister numbers 
18eb0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
18ec0 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 2f   = pParse->db; /
18ed0 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63  * The database c
18ee0 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 45  onnection */.  E
18ef0 78 70 72 20 74 65 6d 70 58 3b 20 20 20 20 20 20  xpr tempX;      
18f00 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70           /* Temp
18f10 6f 72 61 72 79 20 65 78 70 72 65 73 73 69 6f 6e  orary expression
18f20 20 6e 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 70   node */.  int p
18f30 35 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74  5 = 0;..  assert
18f40 28 20 74 61 72 67 65 74 3e 30 20 26 26 20 74 61  ( target>0 && ta
18f50 72 67 65 74 3c 3d 70 50 61 72 73 65 2d 3e 6e 4d  rget<=pParse->nM
18f60 65 6d 20 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30  em );.  if( v==0
18f70 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
18f80 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
18f90 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
18fa0 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20  return 0;.  }.. 
18fb0 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 7b   if( pExpr==0 ){
18fc0 0a 20 20 20 20 6f 70 20 3d 20 54 4b 5f 4e 55 4c  .    op = TK_NUL
18fd0 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  L;.  }else{.    
18fe0 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a  op = pExpr->op;.
18ff0 20 20 7d 0a 20 20 73 77 69 74 63 68 28 20 6f 70    }.  switch( op
19000 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
19010 41 47 47 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20  AGG_COLUMN: {.  
19020 20 20 20 20 41 67 67 49 6e 66 6f 20 2a 70 41 67      AggInfo *pAg
19030 67 49 6e 66 6f 20 3d 20 70 45 78 70 72 2d 3e 70  gInfo = pExpr->p
19040 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 73  AggInfo;.      s
19050 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f  truct AggInfo_co
19060 6c 20 2a 70 43 6f 6c 20 3d 20 26 70 41 67 67 49  l *pCol = &pAggI
19070 6e 66 6f 2d 3e 61 43 6f 6c 5b 70 45 78 70 72 2d  nfo->aCol[pExpr-
19080 3e 69 41 67 67 5d 3b 0a 20 20 20 20 20 20 69 66  >iAgg];.      if
19090 28 20 21 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72  ( !pAggInfo->dir
190a0 65 63 74 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20  ectMode ){.     
190b0 20 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c 2d     assert( pCol-
190c0 3e 69 4d 65 6d 3e 30 20 29 3b 0a 20 20 20 20 20  >iMem>0 );.     
190d0 20 20 20 69 6e 52 65 67 20 3d 20 70 43 6f 6c 2d     inReg = pCol-
190e0 3e 69 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 62  >iMem;.        b
190f0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73  reak;.      }els
19100 65 20 69 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e  e if( pAggInfo->
19110 75 73 65 53 6f 72 74 69 6e 67 49 64 78 20 29 7b  useSortingIdx ){
19120 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
19130 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
19140 5f 43 6f 6c 75 6d 6e 2c 20 70 41 67 67 49 6e 66  _Column, pAggInf
19150 6f 2d 3e 73 6f 72 74 69 6e 67 49 64 78 50 54 61  o->sortingIdxPTa
19160 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  b,.             
19170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19180 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f   pCol->iSorterCo
19190 6c 75 6d 6e 2c 20 74 61 72 67 65 74 29 3b 0a 20  lumn, target);. 
191a0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
191b0 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 4f      }.      /* O
191c0 74 68 65 72 77 69 73 65 2c 20 66 61 6c 6c 20 74  therwise, fall t
191d0 68 72 75 20 69 6e 74 6f 20 74 68 65 20 54 4b 5f  hru into the TK_
191e0 43 4f 4c 55 4d 4e 20 63 61 73 65 20 2a 2f 0a 20  COLUMN case */. 
191f0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
19200 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20  _COLUMN: {.     
19210 20 69 6e 74 20 69 54 61 62 20 3d 20 70 45 78 70   int iTab = pExp
19220 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20  r->iTable;.     
19230 20 69 66 28 20 69 54 61 62 3c 30 20 29 7b 0a 20   if( iTab<0 ){. 
19240 20 20 20 20 20 20 20 69 66 28 20 70 50 61 72 73         if( pPars
19250 65 2d 3e 63 6b 42 61 73 65 3e 30 20 29 7b 0a 20  e->ckBase>0 ){. 
19260 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65           /* Gene
19270 72 61 74 69 6e 67 20 43 48 45 43 4b 20 63 6f 6e  rating CHECK con
19280 73 74 72 61 69 6e 74 73 20 6f 72 20 69 6e 73 65  straints or inse
19290 72 74 69 6e 67 20 69 6e 74 6f 20 70 61 72 74 69  rting into parti
192a0 61 6c 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20  al index */.    
192b0 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 70 45        inReg = pE
192c0 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 2b 20 70  xpr->iColumn + p
192d0 50 61 72 73 65 2d 3e 63 6b 42 61 73 65 3b 0a 20  Parse->ckBase;. 
192e0 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
192f0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
19300 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 64 69           /* Codi
19310 6e 67 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  ng an expression
19320 20 74 68 61 74 20 69 73 20 70 61 72 74 20 6f 66   that is part of
19330 20 61 6e 20 69 6e 64 65 78 20 77 68 65 72 65 20   an index where 
19340 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 0a 20 20 20  column names.   
19350 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65         ** in the
19360 20 69 6e 64 65 78 20 72 65 66 65 72 20 74 6f 20   index refer to 
19370 74 68 65 20 74 61 62 6c 65 20 74 6f 20 77 68 69  the table to whi
19380 63 68 20 74 68 65 20 69 6e 64 65 78 20 62 65 6c  ch the index bel
19390 6f 6e 67 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  ongs */.        
193a0 20 20 69 54 61 62 20 3d 20 70 50 61 72 73 65 2d    iTab = pParse-
193b0 3e 69 53 65 6c 66 54 61 62 3b 0a 20 20 20 20 20  >iSelfTab;.     
193c0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
193d0 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74     inReg = sqlit
193e0 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c  e3ExprCodeGetCol
193f0 75 6d 6e 28 70 50 61 72 73 65 2c 20 70 45 78 70  umn(pParse, pExp
19400 72 2d 3e 70 54 61 62 2c 0a 20 20 20 20 20 20 20  r->pTab,.       
19410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19420 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69          pExpr->i
19430 43 6f 6c 75 6d 6e 2c 20 69 54 61 62 2c 20 74 61  Column, iTab, ta
19440 72 67 65 74 2c 0a 20 20 20 20 20 20 20 20 20 20  rget,.          
19450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19460 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 32 29       pExpr->op2)
19470 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
19480 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
19490 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20  _INTEGER: {.    
194a0 20 20 63 6f 64 65 49 6e 74 65 67 65 72 28 70 50    codeInteger(pP
194b0 61 72 73 65 2c 20 70 45 78 70 72 2c 20 30 2c 20  arse, pExpr, 0, 
194c0 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 62  target);.      b
194d0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  reak;.    }.#ifn
194e0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
194f0 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20  FLOATING_POINT. 
19500 20 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54     case TK_FLOAT
19510 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
19520 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
19530 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74  ty(pExpr, EP_Int
19540 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20  Value) );.      
19550 63 6f 64 65 52 65 61 6c 28 76 2c 20 70 45 78 70  codeReal(v, pExp
19560 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30 2c 20  r->u.zToken, 0, 
19570 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 62  target);.      b
19580 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
19590 69 66 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53  if.    case TK_S
195a0 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20 61  TRING: {.      a
195b0 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
195c0 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
195d0 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20  P_IntValue) );. 
195e0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
195f0 4c 6f 61 64 53 74 72 69 6e 67 28 76 2c 20 74 61  LoadString(v, ta
19600 72 67 65 74 2c 20 70 45 78 70 72 2d 3e 75 2e 7a  rget, pExpr->u.z
19610 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 62 72  Token);.      br
19620 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
19630 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a 20 7b 0a 20  ase TK_NULL: {. 
19640 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
19650 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp2(v, OP_Nul
19660 6c 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20  l, 0, target);. 
19670 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
19680 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
19690 5f 4f 4d 49 54 5f 42 4c 4f 42 5f 4c 49 54 45 52  _OMIT_BLOB_LITER
196a0 41 4c 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42  AL.    case TK_B
196b0 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  LOB: {.      int
196c0 20 6e 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   n;.      const 
196d0 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 20 20 63  char *z;.      c
196e0 68 61 72 20 2a 7a 42 6c 6f 62 3b 0a 20 20 20 20  har *zBlob;.    
196f0 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
19700 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
19710 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29  , EP_IntValue) )
19720 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
19730 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b  pExpr->u.zToken[
19740 30 5d 3d 3d 27 78 27 20 7c 7c 20 70 45 78 70 72  0]=='x' || pExpr
19750 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27  ->u.zToken[0]=='
19760 58 27 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  X' );.      asse
19770 72 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  rt( pExpr->u.zTo
19780 6b 65 6e 5b 31 5d 3d 3d 27 5c 27 27 20 29 3b 0a  ken[1]=='\'' );.
19790 20 20 20 20 20 20 7a 20 3d 20 26 70 45 78 70 72        z = &pExpr
197a0 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 32 5d 3b 0a 20  ->u.zToken[2];. 
197b0 20 20 20 20 20 6e 20 3d 20 73 71 6c 69 74 65 33       n = sqlite3
197c0 53 74 72 6c 65 6e 33 30 28 7a 29 20 2d 20 31 3b  Strlen30(z) - 1;
197d0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 7a  .      assert( z
197e0 5b 6e 5d 3d 3d 27 5c 27 27 20 29 3b 0a 20 20 20  [n]=='\'' );.   
197f0 20 20 20 7a 42 6c 6f 62 20 3d 20 73 71 6c 69 74     zBlob = sqlit
19800 65 33 48 65 78 54 6f 42 6c 6f 62 28 73 71 6c 69  e3HexToBlob(sqli
19810 74 65 33 56 64 62 65 44 62 28 76 29 2c 20 7a 2c  te3VdbeDb(v), z,
19820 20 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   n);.      sqlit
19830 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
19840 4f 50 5f 42 6c 6f 62 2c 20 6e 2f 32 2c 20 74 61  OP_Blob, n/2, ta
19850 72 67 65 74 2c 20 30 2c 20 7a 42 6c 6f 62 2c 20  rget, 0, zBlob, 
19860 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20  P4_DYNAMIC);.   
19870 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
19880 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20  #endif.    case 
19890 54 4b 5f 56 41 52 49 41 42 4c 45 3a 20 7b 0a 20  TK_VARIABLE: {. 
198a0 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
198b0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
198c0 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  xpr, EP_IntValue
198d0 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ) );.      asser
198e0 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  t( pExpr->u.zTok
198f0 65 6e 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61  en!=0 );.      a
19900 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75 2e  ssert( pExpr->u.
19910 7a 54 6f 6b 65 6e 5b 30 5d 21 3d 30 20 29 3b 0a  zToken[0]!=0 );.
19920 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
19930 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 56 61  eAddOp2(v, OP_Va
19940 72 69 61 62 6c 65 2c 20 70 45 78 70 72 2d 3e 69  riable, pExpr->i
19950 43 6f 6c 75 6d 6e 2c 20 74 61 72 67 65 74 29 3b  Column, target);
19960 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
19970 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 31 5d 21 3d 30  ->u.zToken[1]!=0
19980 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
19990 72 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  rt( pExpr->u.zTo
199a0 6b 65 6e 5b 30 5d 3d 3d 27 3f 27 20 0a 20 20 20  ken[0]=='?' .   
199b0 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 74 72            || str
199c0 63 6d 70 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  cmp(pExpr->u.zTo
199d0 6b 65 6e 2c 20 70 50 61 72 73 65 2d 3e 61 7a 56  ken, pParse->azV
199e0 61 72 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  ar[pExpr->iColum
199f0 6e 2d 31 5d 29 3d 3d 30 20 29 3b 0a 20 20 20 20  n-1])==0 );.    
19a00 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
19a10 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 70  hangeP4(v, -1, p
19a20 50 61 72 73 65 2d 3e 61 7a 56 61 72 5b 70 45 78  Parse->azVar[pEx
19a30 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2d 31 5d 2c 20  pr->iColumn-1], 
19a40 50 34 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  P4_STATIC);.    
19a50 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
19a60 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
19a70 54 4b 5f 52 45 47 49 53 54 45 52 3a 20 7b 0a 20  TK_REGISTER: {. 
19a80 20 20 20 20 20 69 6e 52 65 67 20 3d 20 70 45 78       inReg = pEx
19a90 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20  pr->iTable;.    
19aa0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
19ab0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
19ac0 49 54 5f 43 41 53 54 0a 20 20 20 20 63 61 73 65  IT_CAST.    case
19ad0 20 54 4b 5f 43 41 53 54 3a 20 7b 0a 20 20 20 20   TK_CAST: {.    
19ae0 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 73    /* Expressions
19af0 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 20 20 20   of the form:   
19b00 43 41 53 54 28 70 4c 65 66 74 20 41 53 20 74 6f  CAST(pLeft AS to
19b10 6b 65 6e 29 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ken) */.      in
19b20 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Reg = sqlite3Exp
19b30 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72  rCodeTarget(pPar
19b40 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
19b50 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
19b60 20 69 66 28 20 69 6e 52 65 67 21 3d 74 61 72 67   if( inReg!=targ
19b70 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  et ){.        sq
19b80 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
19b90 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 69 6e 52  v, OP_SCopy, inR
19ba0 65 67 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  eg, target);.   
19bb0 20 20 20 20 20 69 6e 52 65 67 20 3d 20 74 61 72       inReg = tar
19bc0 67 65 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  get;.      }.   
19bd0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
19be0 64 4f 70 32 28 76 2c 20 4f 50 5f 43 61 73 74 2c  dOp2(v, OP_Cast,
19bf0 20 74 61 72 67 65 74 2c 0a 20 20 20 20 20 20 20   target,.       
19c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19c10 20 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79   sqlite3Affinity
19c20 54 79 70 65 28 70 45 78 70 72 2d 3e 75 2e 7a 54  Type(pExpr->u.zT
19c30 6f 6b 65 6e 2c 20 30 29 29 3b 0a 20 20 20 20 20  oken, 0));.     
19c40 20 74 65 73 74 63 61 73 65 28 20 75 73 65 64 41   testcase( usedA
19c50 73 43 6f 6c 75 6d 6e 43 61 63 68 65 28 70 50 61  sColumnCache(pPa
19c60 72 73 65 2c 20 69 6e 52 65 67 2c 20 69 6e 52 65  rse, inReg, inRe
19c70 67 29 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  g) );.      sqli
19c80 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69  te3ExprCacheAffi
19c90 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73  nityChange(pPars
19ca0 65 2c 20 69 6e 52 65 67 2c 20 31 29 3b 0a 20 20  e, inReg, 1);.  
19cb0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
19cc0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
19cd0 45 5f 4f 4d 49 54 5f 43 41 53 54 20 2a 2f 0a 20  E_OMIT_CAST */. 
19ce0 20 20 20 63 61 73 65 20 54 4b 5f 49 53 3a 0a 20     case TK_IS:. 
19cf0 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f 54     case TK_ISNOT
19d00 3a 0a 20 20 20 20 20 20 6f 70 20 3d 20 28 6f 70  :.      op = (op
19d10 3d 3d 54 4b 5f 49 53 29 20 3f 20 54 4b 5f 45 51  ==TK_IS) ? TK_EQ
19d20 20 3a 20 54 4b 5f 4e 45 3b 0a 20 20 20 20 20 20   : TK_NE;.      
19d30 70 35 20 3d 20 53 51 4c 49 54 45 5f 4e 55 4c 4c  p5 = SQLITE_NULL
19d40 45 51 3b 0a 20 20 20 20 20 20 2f 2a 20 66 61 6c  EQ;.      /* fal
19d50 6c 2d 74 68 72 6f 75 67 68 20 2a 2f 0a 20 20 20  l-through */.   
19d60 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20   case TK_LT:.   
19d70 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20   case TK_LE:.   
19d80 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20   case TK_GT:.   
19d90 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20   case TK_GE:.   
19da0 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20   case TK_NE:.   
19db0 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20   case TK_EQ: {. 
19dc0 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74       Expr *pLeft
19dd0 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b   = pExpr->pLeft;
19de0 0a 20 20 20 20 20 20 69 66 28 20 28 70 4c 65 66  .      if( (pLef
19df0 74 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 56 65  t->flags & EP_Ve
19e00 63 74 6f 72 29 20 29 7b 0a 20 20 20 20 20 20 20  ctor) ){.       
19e10 20 63 6f 64 65 56 65 63 74 6f 72 43 6f 6d 70 61   codeVectorCompa
19e20 72 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  re(pParse, pExpr
19e30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
19e40 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
19e50 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
19e60 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
19e70 20 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65   pLeft, &regFree
19e80 31 29 3b 0a 20 20 20 20 20 20 20 20 72 32 20 3d  1);.        r2 =
19e90 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
19ea0 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
19eb0 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67  pr->pRight, &reg
19ec0 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 20 20  Free2);.        
19ed0 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72  codeCompare(pPar
19ee0 73 65 2c 20 70 4c 65 66 74 2c 20 70 45 78 70 72  se, pLeft, pExpr
19ef0 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20  ->pRight, op,.  
19f00 20 20 20 20 20 20 20 20 20 20 72 31 2c 20 72 32            r1, r2
19f10 2c 20 69 6e 52 65 67 2c 20 53 51 4c 49 54 45 5f  , inReg, SQLITE_
19f20 53 54 4f 52 45 50 32 20 7c 20 70 35 29 3b 0a 20  STOREP2 | p5);. 
19f30 20 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b         assert(TK
19f40 5f 4c 54 3d 3d 4f 50 5f 4c 74 29 3b 20 74 65 73  _LT==OP_Lt); tes
19f50 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 74 29  tcase(op==OP_Lt)
19f60 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66  ; VdbeCoverageIf
19f70 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a 20  (v,op==OP_Lt);. 
19f80 20 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b         assert(TK
19f90 5f 4c 45 3d 3d 4f 50 5f 4c 65 29 3b 20 74 65 73  _LE==OP_Le); tes
19fa0 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 65 29  tcase(op==OP_Le)
19fb0 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66  ; VdbeCoverageIf
19fc0 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 0a 20  (v,op==OP_Le);. 
19fd0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b         assert(TK
19fe0 5f 47 54 3d 3d 4f 50 5f 47 74 29 3b 20 74 65 73  _GT==OP_Gt); tes
19ff0 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 74 29  tcase(op==OP_Gt)
1a000 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66  ; VdbeCoverageIf
1a010 28 76 2c 6f 70 3d 3d 4f 50 5f 47 74 29 3b 0a 20  (v,op==OP_Gt);. 
1a020 20 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b         assert(TK
1a030 5f 47 45 3d 3d 4f 50 5f 47 65 29 3b 20 74 65 73  _GE==OP_Ge); tes
1a040 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 65 29  tcase(op==OP_Ge)
1a050 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66  ; VdbeCoverageIf
1a060 28 76 2c 6f 70 3d 3d 4f 50 5f 47 65 29 3b 0a 20  (v,op==OP_Ge);. 
1a070 20 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b         assert(TK
1a080 5f 45 51 3d 3d 4f 50 5f 45 71 29 3b 20 74 65 73  _EQ==OP_Eq); tes
1a090 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 45 71 29  tcase(op==OP_Eq)
1a0a0 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66  ; VdbeCoverageIf
1a0b0 28 76 2c 6f 70 3d 3d 4f 50 5f 45 71 29 3b 0a 20  (v,op==OP_Eq);. 
1a0c0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b         assert(TK
1a0d0 5f 4e 45 3d 3d 4f 50 5f 4e 65 29 3b 20 74 65 73  _NE==OP_Ne); tes
1a0e0 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4e 65 29  tcase(op==OP_Ne)
1a0f0 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66  ; VdbeCoverageIf
1a100 28 76 2c 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 0a 20  (v,op==OP_Ne);. 
1a110 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
1a120 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
1a130 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
1a140 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b  ( regFree2==0 );
1a150 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
1a160 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
1a170 63 61 73 65 20 54 4b 5f 41 4e 44 3a 0a 20 20 20  case TK_AND:.   
1a180 20 63 61 73 65 20 54 4b 5f 4f 52 3a 0a 20 20 20   case TK_OR:.   
1a190 20 63 61 73 65 20 54 4b 5f 50 4c 55 53 3a 0a 20   case TK_PLUS:. 
1a1a0 20 20 20 63 61 73 65 20 54 4b 5f 53 54 41 52 3a     case TK_STAR:
1a1b0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4d 49 4e  .    case TK_MIN
1a1c0 55 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  US:.    case TK_
1a1d0 52 45 4d 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  REM:.    case TK
1a1e0 5f 42 49 54 41 4e 44 3a 0a 20 20 20 20 63 61 73  _BITAND:.    cas
1a1f0 65 20 54 4b 5f 42 49 54 4f 52 3a 0a 20 20 20 20  e TK_BITOR:.    
1a200 63 61 73 65 20 54 4b 5f 53 4c 41 53 48 3a 0a 20  case TK_SLASH:. 
1a210 20 20 20 63 61 73 65 20 54 4b 5f 4c 53 48 49 46     case TK_LSHIF
1a220 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52  T:.    case TK_R
1a230 53 48 49 46 54 3a 20 0a 20 20 20 20 63 61 73 65  SHIFT: .    case
1a240 20 54 4b 5f 43 4f 4e 43 41 54 3a 20 7b 0a 20 20   TK_CONCAT: {.  
1a250 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 41      assert( TK_A
1a260 4e 44 3d 3d 4f 50 5f 41 6e 64 20 29 3b 20 20 20  ND==OP_And );   
1a270 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
1a280 65 28 20 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 3b  e( op==TK_AND );
1a290 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
1a2a0 4b 5f 4f 52 3d 3d 4f 50 5f 4f 72 20 29 3b 20 20  K_OR==OP_Or );  
1a2b0 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
1a2c0 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4f 52 20  case( op==TK_OR 
1a2d0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1a2e0 20 54 4b 5f 50 4c 55 53 3d 3d 4f 50 5f 41 64 64   TK_PLUS==OP_Add
1a2f0 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 74 65   );           te
1a300 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 50  stcase( op==TK_P
1a310 4c 55 53 20 29 3b 0a 20 20 20 20 20 20 61 73 73  LUS );.      ass
1a320 65 72 74 28 20 54 4b 5f 4d 49 4e 55 53 3d 3d 4f  ert( TK_MINUS==O
1a330 50 5f 53 75 62 74 72 61 63 74 20 29 3b 20 20 20  P_Subtract );   
1a340 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1a350 54 4b 5f 4d 49 4e 55 53 20 29 3b 0a 20 20 20 20  TK_MINUS );.    
1a360 20 20 61 73 73 65 72 74 28 20 54 4b 5f 52 45 4d    assert( TK_REM
1a370 3d 3d 4f 50 5f 52 65 6d 61 69 6e 64 65 72 20 29  ==OP_Remainder )
1a380 3b 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  ;      testcase(
1a390 20 6f 70 3d 3d 54 4b 5f 52 45 4d 20 29 3b 0a 20   op==TK_REM );. 
1a3a0 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
1a3b0 42 49 54 41 4e 44 3d 3d 4f 50 5f 42 69 74 41 6e  BITAND==OP_BitAn
1a3c0 64 20 29 3b 20 20 20 20 20 20 74 65 73 74 63 61  d );      testca
1a3d0 73 65 28 20 6f 70 3d 3d 54 4b 5f 42 49 54 41 4e  se( op==TK_BITAN
1a3e0 44 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  D );.      asser
1a3f0 74 28 20 54 4b 5f 42 49 54 4f 52 3d 3d 4f 50 5f  t( TK_BITOR==OP_
1a400 42 69 74 4f 72 20 29 3b 20 20 20 20 20 20 20 20  BitOr );        
1a410 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
1a420 5f 42 49 54 4f 52 20 29 3b 0a 20 20 20 20 20 20  _BITOR );.      
1a430 61 73 73 65 72 74 28 20 54 4b 5f 53 4c 41 53 48  assert( TK_SLASH
1a440 3d 3d 4f 50 5f 44 69 76 69 64 65 20 29 3b 20 20  ==OP_Divide );  
1a450 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
1a460 70 3d 3d 54 4b 5f 53 4c 41 53 48 20 29 3b 0a 20  p==TK_SLASH );. 
1a470 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
1a480 4c 53 48 49 46 54 3d 3d 4f 50 5f 53 68 69 66 74  LSHIFT==OP_Shift
1a490 4c 65 66 74 20 29 3b 20 20 20 74 65 73 74 63 61  Left );   testca
1a4a0 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c 53 48 49 46  se( op==TK_LSHIF
1a4b0 54 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  T );.      asser
1a4c0 74 28 20 54 4b 5f 52 53 48 49 46 54 3d 3d 4f 50  t( TK_RSHIFT==OP
1a4d0 5f 53 68 69 66 74 52 69 67 68 74 20 29 3b 20 20  _ShiftRight );  
1a4e0 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
1a4f0 5f 52 53 48 49 46 54 20 29 3b 0a 20 20 20 20 20  _RSHIFT );.     
1a500 20 61 73 73 65 72 74 28 20 54 4b 5f 43 4f 4e 43   assert( TK_CONC
1a510 41 54 3d 3d 4f 50 5f 43 6f 6e 63 61 74 20 29 3b  AT==OP_Concat );
1a520 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1a530 6f 70 3d 3d 54 4b 5f 43 4f 4e 43 41 54 20 29 3b  op==TK_CONCAT );
1a540 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69  .      r1 = sqli
1a550 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
1a560 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
1a570 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29  Left, &regFree1)
1a580 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c  ;.      r2 = sql
1a590 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
1a5a0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
1a5b0 70 52 69 67 68 74 2c 20 26 72 65 67 46 72 65 65  pRight, &regFree
1a5c0 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  2);.      sqlite
1a5d0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 6f  3VdbeAddOp3(v, o
1a5e0 70 2c 20 72 32 2c 20 72 31 2c 20 74 61 72 67 65  p, r2, r1, targe
1a5f0 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  t);.      testca
1a600 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20  se( regFree1==0 
1a610 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1a620 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29  e( regFree2==0 )
1a630 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1a640 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
1a650 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20 20 20  _UMINUS: {.     
1a660 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70   Expr *pLeft = p
1a670 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20  Expr->pLeft;.   
1a680 20 20 20 61 73 73 65 72 74 28 20 70 4c 65 66 74     assert( pLeft
1a690 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c   );.      if( pL
1a6a0 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45  eft->op==TK_INTE
1a6b0 47 45 52 20 29 7b 0a 20 20 20 20 20 20 20 20 63  GER ){.        c
1a6c0 6f 64 65 49 6e 74 65 67 65 72 28 70 50 61 72 73  odeInteger(pPars
1a6d0 65 2c 20 70 4c 65 66 74 2c 20 31 2c 20 74 61 72  e, pLeft, 1, tar
1a6e0 67 65 74 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  get);.#ifndef SQ
1a6f0 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49  LITE_OMIT_FLOATI
1a700 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20 20 20 7d  NG_POINT.      }
1a710 65 6c 73 65 20 69 66 28 20 70 4c 65 66 74 2d 3e  else if( pLeft->
1a720 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20 29 7b 0a  op==TK_FLOAT ){.
1a730 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1a740 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
1a750 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61  (pExpr, EP_IntVa
1a760 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20  lue) );.        
1a770 63 6f 64 65 52 65 61 6c 28 76 2c 20 70 4c 65 66  codeReal(v, pLef
1a780 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 31 2c 20  t->u.zToken, 1, 
1a790 74 61 72 67 65 74 29 3b 0a 23 65 6e 64 69 66 0a  target);.#endif.
1a7a0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1a7b0 20 20 20 20 20 74 65 6d 70 58 2e 6f 70 20 3d 20       tempX.op = 
1a7c0 54 4b 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20  TK_INTEGER;.    
1a7d0 20 20 20 20 74 65 6d 70 58 2e 66 6c 61 67 73 20      tempX.flags 
1a7e0 3d 20 45 50 5f 49 6e 74 56 61 6c 75 65 7c 45 50  = EP_IntValue|EP
1a7f0 5f 54 6f 6b 65 6e 4f 6e 6c 79 3b 0a 20 20 20 20  _TokenOnly;.    
1a800 20 20 20 20 74 65 6d 70 58 2e 75 2e 69 56 61 6c      tempX.u.iVal
1a810 75 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ue = 0;.        
1a820 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
1a830 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
1a840 20 26 74 65 6d 70 58 2c 20 26 72 65 67 46 72 65   &tempX, &regFre
1a850 65 31 29 3b 0a 20 20 20 20 20 20 20 20 72 32 20  e1);.        r2 
1a860 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
1a870 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
1a880 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67  xpr->pLeft, &reg
1a890 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 20 20  Free2);.        
1a8a0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1a8b0 33 28 76 2c 20 4f 50 5f 53 75 62 74 72 61 63 74  3(v, OP_Subtract
1a8c0 2c 20 72 32 2c 20 72 31 2c 20 74 61 72 67 65 74  , r2, r1, target
1a8d0 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
1a8e0 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30  ase( regFree2==0
1a8f0 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
1a900 20 20 69 6e 52 65 67 20 3d 20 74 61 72 67 65 74    inReg = target
1a910 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1a920 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
1a930 5f 42 49 54 4e 4f 54 3a 0a 20 20 20 20 63 61 73  _BITNOT:.    cas
1a940 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20  e TK_NOT: {.    
1a950 20 20 61 73 73 65 72 74 28 20 54 4b 5f 42 49 54    assert( TK_BIT
1a960 4e 4f 54 3d 3d 4f 50 5f 42 69 74 4e 6f 74 20 29  NOT==OP_BitNot )
1a970 3b 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70  ;   testcase( op
1a980 3d 3d 54 4b 5f 42 49 54 4e 4f 54 20 29 3b 0a 20  ==TK_BITNOT );. 
1a990 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
1a9a0 4e 4f 54 3d 3d 4f 50 5f 4e 6f 74 20 29 3b 20 20  NOT==OP_Not );  
1a9b0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
1a9c0 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 20 29 3b 0a 20   op==TK_NOT );. 
1a9d0 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
1a9e0 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
1a9f0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
1aa00 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  ft, &regFree1);.
1aa10 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1aa20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
1aa30 20 20 20 20 20 69 6e 52 65 67 20 3d 20 74 61 72       inReg = tar
1aa40 67 65 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  get;.      sqlit
1aa50 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1aa60 6f 70 2c 20 72 31 2c 20 69 6e 52 65 67 29 3b 0a  op, r1, inReg);.
1aa70 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1aa80 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49   }.    case TK_I
1aa90 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20  SNULL:.    case 
1aaa0 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20  TK_NOTNULL: {.  
1aab0 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20      int addr;.  
1aac0 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 49      assert( TK_I
1aad0 53 4e 55 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c 6c  SNULL==OP_IsNull
1aae0 20 29 3b 20 20 20 74 65 73 74 63 61 73 65 28 20   );   testcase( 
1aaf0 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b  op==TK_ISNULL );
1ab00 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
1ab10 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f  K_NOTNULL==OP_No
1ab20 74 4e 75 6c 6c 20 29 3b 20 74 65 73 74 63 61 73  tNull ); testcas
1ab30 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c  e( op==TK_NOTNUL
1ab40 4c 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  L );.      sqlit
1ab50 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1ab60 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 74  OP_Integer, 1, t
1ab70 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 72 31  arget);.      r1
1ab80 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1ab90 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
1aba0 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65  Expr->pLeft, &re
1abb0 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 74  gFree1);.      t
1abc0 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
1abd0 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 64  1==0 );.      ad
1abe0 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
1abf0 41 64 64 4f 70 31 28 76 2c 20 6f 70 2c 20 72 31  AddOp1(v, op, r1
1ac00 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
1ac10 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54  erageIf(v, op==T
1ac20 4b 5f 49 53 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  K_ISNULL);.     
1ac30 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
1ac40 76 2c 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c  v, op==TK_NOTNUL
1ac50 4c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  L);.      sqlite
1ac60 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1ac70 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 74 61  P_Integer, 0, ta
1ac80 72 67 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  rget);.      sql
1ac90 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
1aca0 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 20  (v, addr);.     
1acb0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1acc0 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55    case TK_AGG_FU
1acd0 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20  NCTION: {.      
1ace0 41 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 3d  AggInfo *pInfo =
1acf0 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f   pExpr->pAggInfo
1ad00 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e 66  ;.      if( pInf
1ad10 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  o==0 ){.        
1ad20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
1ad30 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
1ad40 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a  EP_IntValue) );.
1ad50 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1ad60 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
1ad70 22 6d 69 73 75 73 65 20 6f 66 20 61 67 67 72 65  "misuse of aggre
1ad80 67 61 74 65 3a 20 25 73 28 29 22 2c 20 70 45 78  gate: %s()", pEx
1ad90 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20  pr->u.zToken);. 
1ada0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1adb0 20 20 20 20 69 6e 52 65 67 20 3d 20 70 49 6e 66      inReg = pInf
1adc0 6f 2d 3e 61 46 75 6e 63 5b 70 45 78 70 72 2d 3e  o->aFunc[pExpr->
1add0 69 41 67 67 5d 2e 69 4d 65 6d 3b 0a 20 20 20 20  iAgg].iMem;.    
1ade0 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
1adf0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1ae00 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20  TK_FUNCTION: {. 
1ae10 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70       ExprList *p
1ae20 46 61 72 67 3b 20 20 20 20 20 20 20 2f 2a 20 4c  Farg;       /* L
1ae30 69 73 74 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20  ist of function 
1ae40 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20  arguments */.   
1ae50 20 20 20 69 6e 74 20 6e 46 61 72 67 3b 20 20 20     int nFarg;   
1ae60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1ae70 62 65 72 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20  ber of function 
1ae80 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20  arguments */.   
1ae90 20 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66     FuncDef *pDef
1aea0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ;         /* The
1aeb0 20 66 75 6e 63 74 69 6f 6e 20 64 65 66 69 6e 69   function defini
1aec0 74 69 6f 6e 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  tion object */. 
1aed0 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
1aee0 2a 7a 49 64 3b 20 20 20 20 20 20 20 2f 2a 20 54  *zId;       /* T
1aef0 68 65 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  he function name
1af00 20 2a 2f 0a 20 20 20 20 20 20 75 33 32 20 63 6f   */.      u32 co
1af10 6e 73 74 4d 61 73 6b 20 3d 20 30 3b 20 20 20 20  nstMask = 0;    
1af20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 66 75 6e 63   /* Mask of func
1af30 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 74  tion arguments t
1af40 68 61 74 20 61 72 65 20 63 6f 6e 73 74 61 6e 74  hat are constant
1af50 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 3b   */.      int i;
1af60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1af70 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
1af80 20 2a 2f 0a 20 20 20 20 20 20 75 38 20 65 6e 63   */.      u8 enc
1af90 20 3d 20 45 4e 43 28 64 62 29 3b 20 20 20 20 20   = ENC(db);     
1afa0 20 2f 2a 20 54 68 65 20 74 65 78 74 20 65 6e 63   /* The text enc
1afb0 6f 64 69 6e 67 20 75 73 65 64 20 62 79 20 74 68  oding used by th
1afc0 69 73 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  is database */. 
1afd0 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43       CollSeq *pC
1afe0 6f 6c 6c 20 3d 20 30 3b 20 20 20 20 2f 2a 20 41  oll = 0;    /* A
1aff0 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
1b000 6e 63 65 20 2a 2f 0a 0a 20 20 20 20 20 20 61 73  nce */..      as
1b010 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
1b020 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
1b030 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20  _xIsSelect) );. 
1b040 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73       if( ExprHas
1b050 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
1b060 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b  EP_TokenOnly) ){
1b070 0a 20 20 20 20 20 20 20 20 70 46 61 72 67 20 3d  .        pFarg =
1b080 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   0;.      }else{
1b090 0a 20 20 20 20 20 20 20 20 70 46 61 72 67 20 3d  .        pFarg =
1b0a0 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b   pExpr->x.pList;
1b0b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e  .      }.      n
1b0c0 46 61 72 67 20 3d 20 70 46 61 72 67 20 3f 20 70  Farg = pFarg ? p
1b0d0 46 61 72 67 2d 3e 6e 45 78 70 72 20 3a 20 30 3b  Farg->nExpr : 0;
1b0e0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
1b0f0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
1b100 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c  pExpr, EP_IntVal
1b110 75 65 29 20 29 3b 0a 20 20 20 20 20 20 7a 49 64  ue) );.      zId
1b120 20 3d 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b   = pExpr->u.zTok
1b130 65 6e 3b 0a 20 20 20 20 20 20 70 44 65 66 20 3d  en;.      pDef =
1b140 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63   sqlite3FindFunc
1b150 74 69 6f 6e 28 64 62 2c 20 7a 49 64 2c 20 6e 46  tion(db, zId, nF
1b160 61 72 67 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20  arg, enc, 0);.  
1b170 20 20 20 20 69 66 28 20 70 44 65 66 3d 3d 30 20      if( pDef==0 
1b180 7c 7c 20 70 44 65 66 2d 3e 78 46 69 6e 61 6c 69  || pDef->xFinali
1b190 7a 65 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ze!=0 ){.       
1b1a0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
1b1b0 28 70 50 61 72 73 65 2c 20 22 75 6e 6b 6e 6f 77  (pParse, "unknow
1b1c0 6e 20 66 75 6e 63 74 69 6f 6e 3a 20 25 73 28 29  n function: %s()
1b1d0 22 2c 20 7a 49 64 29 3b 0a 20 20 20 20 20 20 20  ", zId);.       
1b1e0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
1b1f0 0a 20 20 20 20 20 20 2f 2a 20 41 74 74 65 6d 70  .      /* Attemp
1b200 74 20 61 20 64 69 72 65 63 74 20 69 6d 70 6c 65  t a direct imple
1b210 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
1b220 20 62 75 69 6c 74 2d 69 6e 20 43 4f 41 4c 45 53   built-in COALES
1b230 43 45 28 29 20 61 6e 64 0a 20 20 20 20 20 20 2a  CE() and.      *
1b240 2a 20 49 46 4e 55 4c 4c 28 29 20 66 75 6e 63 74  * IFNULL() funct
1b250 69 6f 6e 73 2e 20 20 54 68 69 73 20 61 76 6f 69  ions.  This avoi
1b260 64 73 20 75 6e 6e 65 63 65 73 73 61 72 79 20 65  ds unnecessary e
1b270 76 61 6c 75 61 74 69 6f 6e 20 6f 66 0a 20 20 20  valuation of.   
1b280 20 20 20 2a 2a 20 61 72 67 75 6d 65 6e 74 73 20     ** arguments 
1b290 70 61 73 74 20 74 68 65 20 66 69 72 73 74 20 6e  past the first n
1b2a0 6f 6e 2d 4e 55 4c 4c 20 61 72 67 75 6d 65 6e 74  on-NULL argument
1b2b0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
1b2c0 20 69 66 28 20 70 44 65 66 2d 3e 66 75 6e 63 46   if( pDef->funcF
1b2d0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55  lags & SQLITE_FU
1b2e0 4e 43 5f 43 4f 41 4c 45 53 43 45 20 29 7b 0a 20  NC_COALESCE ){. 
1b2f0 20 20 20 20 20 20 20 69 6e 74 20 65 6e 64 43 6f         int endCo
1b300 61 6c 65 73 63 65 20 3d 20 73 71 6c 69 74 65 33  alesce = sqlite3
1b310 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
1b320 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
1b330 28 20 6e 46 61 72 67 3e 3d 32 20 29 3b 0a 20 20  ( nFarg>=2 );.  
1b340 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1b350 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 46  rCode(pParse, pF
1b360 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c  arg->a[0].pExpr,
1b370 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
1b380 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 46 61    for(i=1; i<nFa
1b390 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rg; i++){.      
1b3a0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1b3b0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 6f 74 4e  ddOp2(v, OP_NotN
1b3c0 75 6c 6c 2c 20 74 61 72 67 65 74 2c 20 65 6e 64  ull, target, end
1b3d0 43 6f 61 6c 65 73 63 65 29 3b 0a 20 20 20 20 20  Coalesce);.     
1b3e0 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
1b3f0 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(v);.          
1b400 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
1b410 52 65 6d 6f 76 65 28 70 50 61 72 73 65 2c 20 74  Remove(pParse, t
1b420 61 72 67 65 74 2c 20 31 29 3b 0a 20 20 20 20 20  arget, 1);.     
1b430 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1b440 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65  CachePush(pParse
1b450 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
1b460 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
1b470 72 73 65 2c 20 70 46 61 72 67 2d 3e 61 5b 69 5d  rse, pFarg->a[i]
1b480 2e 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b  .pExpr, target);
1b490 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
1b4a0 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70  e3ExprCachePop(p
1b4b0 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
1b4c0 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
1b4d0 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
1b4e0 6c 28 76 2c 20 65 6e 64 43 6f 61 6c 65 73 63 65  l(v, endCoalesce
1b4f0 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
1b500 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
1b510 20 2f 2a 20 54 68 65 20 55 4e 4c 49 4b 45 4c 59   /* The UNLIKELY
1b520 28 29 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  () function is a
1b530 20 6e 6f 2d 6f 70 2e 20 20 54 68 65 20 72 65 73   no-op.  The res
1b540 75 6c 74 20 69 73 20 74 68 65 20 76 61 6c 75 65  ult is the value
1b550 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  .      ** of the
1b560 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e   first argument.
1b570 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
1b580 69 66 28 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c  if( pDef->funcFl
1b590 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e  ags & SQLITE_FUN
1b5a0 43 5f 55 4e 4c 49 4b 45 4c 59 20 29 7b 0a 20 20  C_UNLIKELY ){.  
1b5b0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 46        assert( nF
1b5c0 61 72 67 3e 3d 31 20 29 3b 0a 20 20 20 20 20 20  arg>=1 );.      
1b5d0 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65    inReg = sqlite
1b5e0 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28  3ExprCodeTarget(
1b5f0 70 50 61 72 73 65 2c 20 70 46 61 72 67 2d 3e 61  pParse, pFarg->a
1b600 5b 30 5d 2e 70 45 78 70 72 2c 20 74 61 72 67 65  [0].pExpr, targe
1b610 74 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  t);.        brea
1b620 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  k;.      }..    
1b630 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 46 61    for(i=0; i<nFa
1b640 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rg; i++){.      
1b650 20 20 69 66 28 20 69 3c 33 32 20 26 26 20 73 71    if( i<32 && sq
1b660 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
1b670 61 6e 74 28 70 46 61 72 67 2d 3e 61 5b 69 5d 2e  ant(pFarg->a[i].
1b680 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20  pExpr) ){.      
1b690 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 3d      testcase( i=
1b6a0 3d 33 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20  =31 );.         
1b6b0 20 63 6f 6e 73 74 4d 61 73 6b 20 7c 3d 20 4d 41   constMask |= MA
1b6c0 53 4b 42 49 54 33 32 28 69 29 3b 0a 20 20 20 20  SKBIT32(i);.    
1b6d0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
1b6e0 28 20 28 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61  ( (pDef->funcFla
1b6f0 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43  gs & SQLITE_FUNC
1b700 5f 4e 45 45 44 43 4f 4c 4c 29 21 3d 30 20 26 26  _NEEDCOLL)!=0 &&
1b710 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20   !pColl ){.     
1b720 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c       pColl = sql
1b730 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
1b740 70 50 61 72 73 65 2c 20 70 46 61 72 67 2d 3e 61  pParse, pFarg->a
1b750 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [i].pExpr);.    
1b760 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1b770 20 20 20 20 69 66 28 20 70 46 61 72 67 20 29 7b      if( pFarg ){
1b780 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 6f 6e  .        if( con
1b790 73 74 4d 61 73 6b 20 29 7b 0a 20 20 20 20 20 20  stMask ){.      
1b7a0 20 20 20 20 72 31 20 3d 20 70 50 61 72 73 65 2d      r1 = pParse-
1b7b0 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 20 20 20  >nMem+1;.       
1b7c0 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
1b7d0 2b 3d 20 6e 46 61 72 67 3b 0a 20 20 20 20 20 20  += nFarg;.      
1b7e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1b7f0 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47     r1 = sqlite3G
1b800 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  etTempRange(pPar
1b810 73 65 2c 20 6e 46 61 72 67 29 3b 0a 20 20 20 20  se, nFarg);.    
1b820 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f      }..        /
1b830 2a 20 46 6f 72 20 6c 65 6e 67 74 68 28 29 20 61  * For length() a
1b840 6e 64 20 74 79 70 65 6f 66 28 29 20 66 75 6e 63  nd typeof() func
1b850 74 69 6f 6e 73 20 77 69 74 68 20 61 20 63 6f 6c  tions with a col
1b860 75 6d 6e 20 61 72 67 75 6d 65 6e 74 2c 0a 20 20  umn argument,.  
1b870 20 20 20 20 20 20 2a 2a 20 73 65 74 20 74 68 65        ** set the
1b880 20 50 35 20 70 61 72 61 6d 65 74 65 72 20 74 6f   P5 parameter to
1b890 20 74 68 65 20 4f 50 5f 43 6f 6c 75 6d 6e 20 6f   the OP_Column o
1b8a0 70 63 6f 64 65 20 74 6f 20 4f 50 46 4c 41 47 5f  pcode to OPFLAG_
1b8b0 4c 45 4e 47 54 48 41 52 47 0a 20 20 20 20 20 20  LENGTHARG.      
1b8c0 20 20 2a 2a 20 6f 72 20 4f 50 46 4c 41 47 5f 54    ** or OPFLAG_T
1b8d0 59 50 45 4f 46 41 52 47 20 72 65 73 70 65 63 74  YPEOFARG respect
1b8e0 69 76 65 6c 79 2c 20 74 6f 20 61 76 6f 69 64 20  ively, to avoid 
1b8f0 75 6e 6e 65 63 65 73 73 61 72 79 20 64 61 74 61  unnecessary data
1b900 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c 6f 61 64  .        ** load
1b910 69 6e 67 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ing..        */.
1b920 20 20 20 20 20 20 20 20 69 66 28 20 28 70 44 65          if( (pDe
1b930 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 28  f->funcFlags & (
1b940 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4c 45 4e 47  SQLITE_FUNC_LENG
1b950 54 48 7c 53 51 4c 49 54 45 5f 46 55 4e 43 5f 54  TH|SQLITE_FUNC_T
1b960 59 50 45 4f 46 29 29 21 3d 30 20 29 7b 0a 20 20  YPEOF))!=0 ){.  
1b970 20 20 20 20 20 20 20 20 75 38 20 65 78 70 72 4f          u8 exprO
1b980 70 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  p;.          ass
1b990 65 72 74 28 20 6e 46 61 72 67 3d 3d 31 20 29 3b  ert( nFarg==1 );
1b9a0 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
1b9b0 74 28 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70  t( pFarg->a[0].p
1b9c0 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20 20  Expr!=0 );.     
1b9d0 20 20 20 20 20 65 78 70 72 4f 70 20 3d 20 70 46       exprOp = pF
1b9e0 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d  arg->a[0].pExpr-
1b9f0 3e 6f 70 3b 0a 20 20 20 20 20 20 20 20 20 20 69  >op;.          i
1ba00 66 28 20 65 78 70 72 4f 70 3d 3d 54 4b 5f 43 4f  f( exprOp==TK_CO
1ba10 4c 55 4d 4e 20 7c 7c 20 65 78 70 72 4f 70 3d 3d  LUMN || exprOp==
1ba20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 7b  TK_AGG_COLUMN ){
1ba30 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73  .            ass
1ba40 65 72 74 28 20 53 51 4c 49 54 45 5f 46 55 4e 43  ert( SQLITE_FUNC
1ba50 5f 4c 45 4e 47 54 48 3d 3d 4f 50 46 4c 41 47 5f  _LENGTH==OPFLAG_
1ba60 4c 45 4e 47 54 48 41 52 47 20 29 3b 0a 20 20 20  LENGTHARG );.   
1ba70 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
1ba80 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 54 59 50   SQLITE_FUNC_TYP
1ba90 45 4f 46 3d 3d 4f 50 46 4c 41 47 5f 54 59 50 45  EOF==OPFLAG_TYPE
1baa0 4f 46 41 52 47 20 29 3b 0a 20 20 20 20 20 20 20  OFARG );.       
1bab0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
1bac0 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26  Def->funcFlags &
1bad0 20 4f 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41 52   OPFLAG_LENGTHAR
1bae0 47 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  G );.           
1baf0 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78   pFarg->a[0].pEx
1bb00 70 72 2d 3e 6f 70 32 20 3d 20 0a 20 20 20 20 20  pr->op2 = .     
1bb10 20 20 20 20 20 20 20 20 20 20 20 20 20 70 44 65               pDe
1bb20 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 28  f->funcFlags & (
1bb30 4f 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41 52 47  OPFLAG_LENGTHARG
1bb40 7c 4f 50 46 4c 41 47 5f 54 59 50 45 4f 46 41 52  |OPFLAG_TYPEOFAR
1bb50 47 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  G);.          }.
1bb60 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
1bb70 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
1bb80 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b  chePush(pParse);
1bb90 20 20 20 20 20 2f 2a 20 54 69 63 6b 65 74 20 32       /* Ticket 2
1bba0 65 61 32 34 32 35 64 33 34 62 65 20 2a 2f 0a 20  ea2425d34be */. 
1bbb0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
1bbc0 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70  prCodeExprList(p
1bbd0 50 61 72 73 65 2c 20 70 46 61 72 67 2c 20 72 31  Parse, pFarg, r1
1bbe0 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
1bbf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bc00 20 20 20 20 20 53 51 4c 49 54 45 5f 45 43 45 4c       SQLITE_ECEL
1bc10 5f 44 55 50 7c 53 51 4c 49 54 45 5f 45 43 45 4c  _DUP|SQLITE_ECEL
1bc20 5f 46 41 43 54 4f 52 29 3b 0a 20 20 20 20 20 20  _FACTOR);.      
1bc30 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
1bc40 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b 20 20  hePop(pParse);  
1bc50 20 20 20 20 2f 2a 20 54 69 63 6b 65 74 20 32 65      /* Ticket 2e
1bc60 61 32 34 32 35 64 33 34 62 65 20 2a 2f 0a 20 20  a2425d34be */.  
1bc70 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1bc80 20 20 20 72 31 20 3d 20 30 3b 0a 20 20 20 20 20     r1 = 0;.     
1bc90 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
1bca0 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
1bcb0 42 4c 45 0a 20 20 20 20 20 20 2f 2a 20 50 6f 73  BLE.      /* Pos
1bcc0 73 69 62 6c 79 20 6f 76 65 72 6c 6f 61 64 20 74  sibly overload t
1bcd0 68 65 20 66 75 6e 63 74 69 6f 6e 20 69 66 20 74  he function if t
1bce0 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
1bcf0 74 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 20  t is.      ** a 
1bd00 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 63 6f  virtual table co
1bd10 6c 75 6d 6e 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  lumn..      **. 
1bd20 20 20 20 20 20 2a 2a 20 46 6f 72 20 69 6e 66 69       ** For infi
1bd30 78 20 66 75 6e 63 74 69 6f 6e 73 20 28 4c 49 4b  x functions (LIK
1bd40 45 2c 20 47 4c 4f 42 2c 20 52 45 47 45 58 50 2c  E, GLOB, REGEXP,
1bd50 20 61 6e 64 20 4d 41 54 43 48 29 20 75 73 65 20   and MATCH) use 
1bd60 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 73 65 63  the.      ** sec
1bd70 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 20 6e 6f  ond argument, no
1bd80 74 20 74 68 65 20 66 69 72 73 74 2c 20 61 73 20  t the first, as 
1bd90 74 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  the argument to 
1bda0 74 65 73 74 20 74 6f 0a 20 20 20 20 20 20 2a 2a  test to.      **
1bdb0 20 73 65 65 20 69 66 20 69 74 20 69 73 20 61 20   see if it is a 
1bdc0 63 6f 6c 75 6d 6e 20 69 6e 20 61 20 76 69 72 74  column in a virt
1bdd0 75 61 6c 20 74 61 62 6c 65 2e 20 20 54 68 69 73  ual table.  This
1bde0 20 69 73 20 64 6f 6e 65 20 62 65 63 61 75 73 65   is done because
1bdf0 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6c 65  .      ** the le
1be00 66 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 69 6e  ft operand of in
1be10 66 69 78 20 66 75 6e 63 74 69 6f 6e 73 20 28 74  fix functions (t
1be20 68 65 20 6f 70 65 72 61 6e 64 20 77 65 20 77 61  he operand we wa
1be30 6e 74 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 63  nt to.      ** c
1be40 6f 6e 74 72 6f 6c 20 6f 76 65 72 6c 6f 61 64 69  ontrol overloadi
1be50 6e 67 29 20 65 6e 64 73 20 75 70 20 61 73 20 74  ng) ends up as t
1be60 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
1be70 6e 74 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20  nt to the.      
1be80 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68  ** function.  Th
1be90 65 20 65 78 70 72 65 73 73 69 6f 6e 20 22 41 20  e expression "A 
1bea0 67 6c 6f 62 20 42 22 20 69 73 20 65 71 75 69 76  glob B" is equiv
1beb0 61 6c 65 6e 74 20 74 6f 20 0a 20 20 20 20 20 20  alent to .      
1bec0 2a 2a 20 22 67 6c 6f 62 28 42 2c 41 29 2e 20 20  ** "glob(B,A).  
1bed0 57 65 20 77 61 6e 74 20 74 6f 20 75 73 65 20 74  We want to use t
1bee0 68 65 20 41 20 69 6e 20 22 41 20 67 6c 6f 62 20  he A in "A glob 
1bef0 42 22 20 74 6f 20 74 65 73 74 0a 20 20 20 20 20  B" to test.     
1bf00 20 2a 2a 20 66 6f 72 20 66 75 6e 63 74 69 6f 6e   ** for function
1bf10 20 6f 76 65 72 6c 6f 61 64 69 6e 67 2e 20 20 42   overloading.  B
1bf20 75 74 20 77 65 20 75 73 65 20 74 68 65 20 42 20  ut we use the B 
1bf30 74 65 72 6d 20 69 6e 20 22 67 6c 6f 62 28 42 2c  term in "glob(B,
1bf40 41 29 22 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  A)"..      */.  
1bf50 20 20 20 20 69 66 28 20 6e 46 61 72 67 3e 3d 32      if( nFarg>=2
1bf60 20 26 26 20 28 70 45 78 70 72 2d 3e 66 6c 61 67   && (pExpr->flag
1bf70 73 20 26 20 45 50 5f 49 6e 66 69 78 46 75 6e 63  s & EP_InfixFunc
1bf80 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65  ) ){.        pDe
1bf90 66 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62 4f  f = sqlite3VtabO
1bfa0 76 65 72 6c 6f 61 64 46 75 6e 63 74 69 6f 6e 28  verloadFunction(
1bfb0 64 62 2c 20 70 44 65 66 2c 20 6e 46 61 72 67 2c  db, pDef, nFarg,
1bfc0 20 70 46 61 72 67 2d 3e 61 5b 31 5d 2e 70 45 78   pFarg->a[1].pEx
1bfd0 70 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  pr);.      }else
1bfe0 20 69 66 28 20 6e 46 61 72 67 3e 30 20 29 7b 0a   if( nFarg>0 ){.
1bff0 20 20 20 20 20 20 20 20 70 44 65 66 20 3d 20 73          pDef = s
1c000 71 6c 69 74 65 33 56 74 61 62 4f 76 65 72 6c 6f  qlite3VtabOverlo
1c010 61 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 70  adFunction(db, p
1c020 44 65 66 2c 20 6e 46 61 72 67 2c 20 70 46 61 72  Def, nFarg, pFar
1c030 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a  g->a[0].pExpr);.
1c040 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
1c050 20 20 20 20 20 69 66 28 20 70 44 65 66 2d 3e 66       if( pDef->f
1c060 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54  uncFlags & SQLIT
1c070 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 20  E_FUNC_NEEDCOLL 
1c080 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  ){.        if( !
1c090 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20  pColl ) pColl = 
1c0a0 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 20 0a  db->pDfltColl; .
1c0b0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
1c0c0 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
1c0d0 43 6f 6c 6c 53 65 71 2c 20 30 2c 20 30 2c 20 30  CollSeq, 0, 0, 0
1c0e0 2c 20 28 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c  , (char *)pColl,
1c0f0 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20   P4_COLLSEQ);.  
1c100 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
1c110 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
1c120 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 30 2c 20 63   OP_Function0, c
1c130 6f 6e 73 74 4d 61 73 6b 2c 20 72 31 2c 20 74 61  onstMask, r1, ta
1c140 72 67 65 74 2c 0a 20 20 20 20 20 20 20 20 20 20  rget,.          
1c150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
1c160 68 61 72 2a 29 70 44 65 66 2c 20 50 34 5f 46 55  har*)pDef, P4_FU
1c170 4e 43 44 45 46 29 3b 0a 20 20 20 20 20 20 73 71  NCDEF);.      sq
1c180 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
1c190 35 28 76 2c 20 28 75 38 29 6e 46 61 72 67 29 3b  5(v, (u8)nFarg);
1c1a0 0a 20 20 20 20 20 20 69 66 28 20 6e 46 61 72 67  .      if( nFarg
1c1b0 20 26 26 20 63 6f 6e 73 74 4d 61 73 6b 3d 3d 30   && constMask==0
1c1c0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
1c1d0 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61  te3ReleaseTempRa
1c1e0 6e 67 65 28 70 50 61 72 73 65 2c 20 72 31 2c 20  nge(pParse, r1, 
1c1f0 6e 46 61 72 67 29 3b 0a 20 20 20 20 20 20 7d 0a  nFarg);.      }.
1c200 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1c210 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
1c220 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
1c230 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 49 53      case TK_EXIS
1c240 54 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  TS:.    case TK_
1c250 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20 20 20  SELECT: {.      
1c260 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
1c270 5f 45 58 49 53 54 53 20 29 3b 0a 20 20 20 20 20  _EXISTS );.     
1c280 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
1c290 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 20 20 20 20  K_SELECT );.    
1c2a0 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65    inReg = sqlite
1c2b0 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70  3CodeSubselect(p
1c2c0 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 30 2c  Parse, pExpr, 0,
1c2d0 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b   0);.      break
1c2e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1c2f0 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20   TK_IN: {.      
1c300 69 6e 74 20 64 65 73 74 49 66 46 61 6c 73 65 20  int destIfFalse 
1c310 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
1c320 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
1c330 20 69 6e 74 20 64 65 73 74 49 66 4e 75 6c 6c 20   int destIfNull 
1c340 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
1c350 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
1c360 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1c370 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  p2(v, OP_Null, 0
1c380 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
1c390 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1c3a0 49 4e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  IN(pParse, pExpr
1c3b0 2c 20 64 65 73 74 49 66 46 61 6c 73 65 2c 20 64  , destIfFalse, d
1c3c0 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  estIfNull);.    
1c3d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1c3e0 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
1c3f0 72 2c 20 31 2c 20 74 61 72 67 65 74 29 3b 0a 20  r, 1, target);. 
1c400 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1c410 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
1c420 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 20 20  destIfFalse);.  
1c430 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1c440 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49  ddOp2(v, OP_AddI
1c450 6d 6d 2c 20 74 61 72 67 65 74 2c 20 30 29 3b 0a  mm, target, 0);.
1c460 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1c470 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
1c480 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20   destIfNull);.  
1c490 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1c4a0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
1c4b0 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20  E_OMIT_SUBQUERY 
1c4c0 2a 2f 0a 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20  */...    /*.    
1c4d0 2a 2a 20 20 20 20 78 20 42 45 54 57 45 45 4e 20  **    x BETWEEN 
1c4e0 79 20 41 4e 44 20 7a 0a 20 20 20 20 2a 2a 0a 20  y AND z.    **. 
1c4f0 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 65 71     ** This is eq
1c500 75 69 76 61 6c 65 6e 74 20 74 6f 0a 20 20 20 20  uivalent to.    
1c510 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 78 3e 3d  **.    **    x>=
1c520 79 20 41 4e 44 20 78 3c 3d 7a 0a 20 20 20 20 2a  y AND x<=z.    *
1c530 2a 0a 20 20 20 20 2a 2a 20 58 20 69 73 20 73 74  *.    ** X is st
1c540 6f 72 65 64 20 69 6e 20 70 45 78 70 72 2d 3e 70  ored in pExpr->p
1c550 4c 65 66 74 2e 0a 20 20 20 20 2a 2a 20 59 20 69  Left..    ** Y i
1c560 73 20 73 74 6f 72 65 64 20 69 6e 20 70 45 78 70  s stored in pExp
1c570 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  r->pList->a[0].p
1c580 45 78 70 72 2e 0a 20 20 20 20 2a 2a 20 5a 20 69  Expr..    ** Z i
1c590 73 20 73 74 6f 72 65 64 20 69 6e 20 70 45 78 70  s stored in pExp
1c5a0 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70  r->pList->a[1].p
1c5b0 45 78 70 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  Expr..    */.   
1c5c0 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e   case TK_BETWEEN
1c5d0 3a 20 7b 0a 20 20 20 20 20 20 65 78 70 72 43 6f  : {.      exprCo
1c5e0 64 65 42 65 74 77 65 65 6e 28 70 50 61 72 73 65  deBetween(pParse
1c5f0 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65 74 2c  , pExpr, target,
1c600 20 30 2c 20 30 29 3b 0a 23 69 66 20 30 0a 20 20   0, 0);.#if 0.  
1c610 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20      Expr *pLeft 
1c620 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a  = pExpr->pLeft;.
1c630 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70        struct Exp
1c640 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4c 49 74  rList_item *pLIt
1c650 65 6d 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c  em = pExpr->x.pL
1c660 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20 45 78  ist->a;.      Ex
1c670 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70 4c 49  pr *pRight = pLI
1c680 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 0a 20 20 20  tem->pExpr;..   
1c690 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
1c6a0 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
1c6b0 73 65 2c 20 70 4c 65 66 74 2c 20 26 72 65 67 46  se, pLeft, &regF
1c6c0 72 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32 20  ree1);.      r2 
1c6d0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
1c6e0 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 52  eTemp(pParse, pR
1c6f0 69 67 68 74 2c 20 26 72 65 67 46 72 65 65 32 29  ight, &regFree2)
1c700 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1c710 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  ( regFree1==0 );
1c720 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1c730 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a   regFree2==0 );.
1c740 20 20 20 20 20 20 72 33 20 3d 20 73 71 6c 69 74        r3 = sqlit
1c750 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
1c760 72 73 65 29 3b 0a 20 20 20 20 20 20 72 34 20 3d  rse);.      r4 =
1c770 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
1c780 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
1c790 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50    codeCompare(pP
1c7a0 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 52 69  arse, pLeft, pRi
1c7b0 67 68 74 2c 20 4f 50 5f 47 65 2c 0a 20 20 20 20  ght, OP_Ge,.    
1c7c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 31                r1
1c7d0 2c 20 72 32 2c 20 72 33 2c 20 53 51 4c 49 54 45  , r2, r3, SQLITE
1c7e0 5f 53 54 4f 52 45 50 32 29 3b 20 20 56 64 62 65  _STOREP2);  Vdbe
1c7f0 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
1c800 20 20 20 70 4c 49 74 65 6d 2b 2b 3b 0a 20 20 20     pLItem++;.   
1c810 20 20 20 70 52 69 67 68 74 20 3d 20 70 4c 49 74     pRight = pLIt
1c820 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20  em->pExpr;.     
1c830 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
1c840 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
1c850 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20  egFree2);.      
1c860 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r2 = sqlite3Expr
1c870 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
1c880 20 70 52 69 67 68 74 2c 20 26 72 65 67 46 72 65   pRight, &regFre
1c890 65 32 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  e2);.      testc
1c8a0 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30  ase( regFree2==0
1c8b0 20 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f   );.      codeCo
1c8c0 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 4c  mpare(pParse, pL
1c8d0 65 66 74 2c 20 70 52 69 67 68 74 2c 20 4f 50 5f  eft, pRight, OP_
1c8e0 4c 65 2c 20 72 31 2c 20 72 32 2c 20 72 34 2c 20  Le, r1, r2, r4, 
1c8f0 53 51 4c 49 54 45 5f 53 54 4f 52 45 50 32 29 3b  SQLITE_STOREP2);
1c900 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
1c910 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 73 71  age(v);.      sq
1c920 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
1c930 76 2c 20 4f 50 5f 41 6e 64 2c 20 72 33 2c 20 72  v, OP_And, r3, r
1c940 34 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  4, target);.    
1c950 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
1c960 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
1c970 72 33 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  r3);.      sqlit
1c980 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
1c990 28 70 50 61 72 73 65 2c 20 72 34 29 3b 0a 23 65  (pParse, r4);.#e
1c9a0 6e 64 69 66 0a 20 20 20 20 20 20 62 72 65 61 6b  ndif.      break
1c9b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1c9c0 20 54 4b 5f 53 50 41 4e 3a 0a 20 20 20 20 63 61   TK_SPAN:.    ca
1c9d0 73 65 20 54 4b 5f 43 4f 4c 4c 41 54 45 3a 20 0a  se TK_COLLATE: .
1c9e0 20 20 20 20 63 61 73 65 20 54 4b 5f 55 50 4c 55      case TK_UPLU
1c9f0 53 3a 20 7b 0a 20 20 20 20 20 20 69 6e 52 65 67  S: {.      inReg
1ca00 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1ca10 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c  deTarget(pParse,
1ca20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 74   pExpr->pLeft, t
1ca30 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 62 72  arget);.      br
1ca40 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
1ca50 63 61 73 65 20 54 4b 5f 54 52 49 47 47 45 52 3a  case TK_TRIGGER:
1ca60 20 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74   {.      /* If t
1ca70 68 65 20 6f 70 63 6f 64 65 20 69 73 20 54 4b 5f  he opcode is TK_
1ca80 54 52 49 47 47 45 52 2c 20 74 68 65 6e 20 74 68  TRIGGER, then th
1ca90 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
1caa0 61 20 72 65 66 65 72 65 6e 63 65 0a 20 20 20 20  a reference.    
1cab0 20 20 2a 2a 20 74 6f 20 61 20 63 6f 6c 75 6d 6e    ** to a column
1cac0 20 69 6e 20 74 68 65 20 6e 65 77 2e 2a 20 6f 72   in the new.* or
1cad0 20 6f 6c 64 2e 2a 20 70 73 65 75 64 6f 2d 74 61   old.* pseudo-ta
1cae0 62 6c 65 73 20 61 76 61 69 6c 61 62 6c 65 20 74  bles available t
1caf0 6f 0a 20 20 20 20 20 20 2a 2a 20 74 72 69 67 67  o.      ** trigg
1cb00 65 72 20 70 72 6f 67 72 61 6d 73 2e 20 49 6e 20  er programs. In 
1cb10 74 68 69 73 20 63 61 73 65 20 45 78 70 72 2e 69  this case Expr.i
1cb20 54 61 62 6c 65 20 69 73 20 73 65 74 20 74 6f 20  Table is set to 
1cb30 31 20 66 6f 72 20 74 68 65 0a 20 20 20 20 20 20  1 for the.      
1cb40 2a 2a 20 6e 65 77 2e 2a 20 70 73 65 75 64 6f 2d  ** new.* pseudo-
1cb50 74 61 62 6c 65 2c 20 6f 72 20 30 20 66 6f 72 20  table, or 0 for 
1cb60 74 68 65 20 6f 6c 64 2e 2a 20 70 73 65 75 64 6f  the old.* pseudo
1cb70 2d 74 61 62 6c 65 2e 20 45 78 70 72 2e 69 43 6f  -table. Expr.iCo
1cb80 6c 75 6d 6e 0a 20 20 20 20 20 20 2a 2a 20 69 73  lumn.      ** is
1cb90 20 73 65 74 20 74 6f 20 74 68 65 20 63 6f 6c 75   set to the colu
1cba0 6d 6e 20 6f 66 20 74 68 65 20 70 73 65 75 64 6f  mn of the pseudo
1cbb0 2d 74 61 62 6c 65 20 74 6f 20 72 65 61 64 2c 20  -table to read, 
1cbc0 6f 72 20 74 6f 20 2d 31 20 74 6f 0a 20 20 20 20  or to -1 to.    
1cbd0 20 20 2a 2a 20 72 65 61 64 20 74 68 65 20 72 6f    ** read the ro
1cbe0 77 69 64 20 66 69 65 6c 64 2e 0a 20 20 20 20 20  wid field..     
1cbf0 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 65   **.      ** The
1cc00 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 69   expression is i
1cc10 6d 70 6c 65 6d 65 6e 74 65 64 20 75 73 69 6e 67  mplemented using
1cc20 20 61 6e 20 4f 50 5f 50 61 72 61 6d 20 6f 70 63   an OP_Param opc
1cc30 6f 64 65 2e 20 54 68 65 20 70 31 0a 20 20 20 20  ode. The p1.    
1cc40 20 20 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69    ** parameter i
1cc50 73 20 73 65 74 20 74 6f 20 30 20 66 6f 72 20 61  s set to 0 for a
1cc60 6e 20 6f 6c 64 2e 72 6f 77 69 64 20 72 65 66 65  n old.rowid refe
1cc70 72 65 6e 63 65 2c 20 6f 72 20 74 6f 20 28 69 2b  rence, or to (i+
1cc80 31 29 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 72  1).      ** to r
1cc90 65 66 65 72 65 6e 63 65 20 61 6e 6f 74 68 65 72  eference another
1cca0 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 6f   column of the o
1ccb0 6c 64 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c  ld.* pseudo-tabl
1ccc0 65 2c 20 77 68 65 72 65 20 0a 20 20 20 20 20 20  e, where .      
1ccd0 2a 2a 20 69 20 69 73 20 74 68 65 20 69 6e 64 65  ** i is the inde
1cce0 78 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2e  x of the column.
1ccf0 20 46 6f 72 20 61 20 6e 65 77 2e 72 6f 77 69 64   For a new.rowid
1cd00 20 72 65 66 65 72 65 6e 63 65 2c 20 70 31 20 69   reference, p1 i
1cd10 73 0a 20 20 20 20 20 20 2a 2a 20 73 65 74 20 74  s.      ** set t
1cd20 6f 20 28 6e 2b 31 29 2c 20 77 68 65 72 65 20 6e  o (n+1), where n
1cd30 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
1cd40 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 65 61 63  f columns in eac
1cd50 68 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2e 0a  h pseudo-table..
1cd60 20 20 20 20 20 20 2a 2a 20 46 6f 72 20 61 20 72        ** For a r
1cd70 65 66 65 72 65 6e 63 65 20 74 6f 20 61 6e 79 20  eference to any 
1cd80 6f 74 68 65 72 20 63 6f 6c 75 6d 6e 20 69 6e 20  other column in 
1cd90 74 68 65 20 6e 65 77 2e 2a 20 70 73 65 75 64 6f  the new.* pseudo
1cda0 2d 74 61 62 6c 65 2c 20 70 31 0a 20 20 20 20 20  -table, p1.     
1cdb0 20 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 28 6e   ** is set to (n
1cdc0 2b 32 2b 69 29 2c 20 77 68 65 72 65 20 6e 20 61  +2+i), where n a
1cdd0 6e 64 20 69 20 61 72 65 20 61 73 20 64 65 66 69  nd i are as defi
1cde0 6e 65 64 20 70 72 65 76 69 6f 75 73 6c 79 2e 20  ned previously. 
1cdf0 46 6f 72 0a 20 20 20 20 20 20 2a 2a 20 65 78 61  For.      ** exa
1ce00 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 74 61 62  mple, if the tab
1ce10 6c 65 20 6f 6e 20 77 68 69 63 68 20 74 72 69 67  le on which trig
1ce20 67 65 72 73 20 61 72 65 20 62 65 69 6e 67 20 66  gers are being f
1ce30 69 72 65 64 20 69 73 0a 20 20 20 20 20 20 2a 2a  ired is.      **
1ce40 20 64 65 63 6c 61 72 65 64 20 61 73 3a 0a 20 20   declared as:.  
1ce50 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
1ce60 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
1ce70 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 20 20 2a  1(a, b);.      *
1ce80 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 6e 20  *.      ** Then 
1ce90 70 31 20 69 73 20 69 6e 74 65 72 70 72 65 74 65  p1 is interprete
1cea0 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20  d as follows:.  
1ceb0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
1cec0 20 20 70 31 3d 3d 30 20 20 20 2d 3e 20 20 20 20    p1==0   ->    
1ced0 6f 6c 64 2e 72 6f 77 69 64 20 20 20 20 20 70 31  old.rowid     p1
1cee0 3d 3d 33 20 20 20 2d 3e 20 20 20 20 6e 65 77 2e  ==3   ->    new.
1cef0 72 6f 77 69 64 0a 20 20 20 20 20 20 2a 2a 20 20  rowid.      **  
1cf00 20 70 31 3d 3d 31 20 20 20 2d 3e 20 20 20 20 6f   p1==1   ->    o
1cf10 6c 64 2e 61 20 20 20 20 20 20 20 20 20 70 31 3d  ld.a         p1=
1cf20 3d 34 20 20 20 2d 3e 20 20 20 20 6e 65 77 2e 61  =4   ->    new.a
1cf30 0a 20 20 20 20 20 20 2a 2a 20 20 20 70 31 3d 3d  .      **   p1==
1cf40 32 20 20 20 2d 3e 20 20 20 20 6f 6c 64 2e 62 20  2   ->    old.b 
1cf50 20 20 20 20 20 20 20 20 70 31 3d 3d 35 20 20 20          p1==5   
1cf60 2d 3e 20 20 20 20 6e 65 77 2e 62 20 20 20 20 20  ->    new.b     
1cf70 20 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20    .      */.    
1cf80 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
1cf90 70 45 78 70 72 2d 3e 70 54 61 62 3b 0a 20 20 20  pExpr->pTab;.   
1cfa0 20 20 20 69 6e 74 20 70 31 20 3d 20 70 45 78 70     int p1 = pExp
1cfb0 72 2d 3e 69 54 61 62 6c 65 20 2a 20 28 70 54 61  r->iTable * (pTa
1cfc0 62 2d 3e 6e 43 6f 6c 2b 31 29 20 2b 20 31 20 2b  b->nCol+1) + 1 +
1cfd0 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b   pExpr->iColumn;
1cfe0 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ..      assert( 
1cff0 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 30  pExpr->iTable==0
1d000 20 7c 7c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c   || pExpr->iTabl
1d010 65 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 61 73  e==1 );.      as
1d020 73 65 72 74 28 20 70 45 78 70 72 2d 3e 69 43 6f  sert( pExpr->iCo
1d030 6c 75 6d 6e 3e 3d 2d 31 20 26 26 20 70 45 78 70  lumn>=-1 && pExp
1d040 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 54 61 62 2d  r->iColumn<pTab-
1d050 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20 61  >nCol );.      a
1d060 73 73 65 72 74 28 20 70 54 61 62 2d 3e 69 50 4b  ssert( pTab->iPK
1d070 65 79 3c 30 20 7c 7c 20 70 45 78 70 72 2d 3e 69  ey<0 || pExpr->i
1d080 43 6f 6c 75 6d 6e 21 3d 70 54 61 62 2d 3e 69 50  Column!=pTab->iP
1d090 4b 65 79 20 29 3b 0a 20 20 20 20 20 20 61 73 73  Key );.      ass
1d0a0 65 72 74 28 20 70 31 3e 3d 30 20 26 26 20 70 31  ert( p1>=0 && p1
1d0b0 3c 28 70 54 61 62 2d 3e 6e 43 6f 6c 2a 32 2b 32  <(pTab->nCol*2+2
1d0c0 29 20 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69  ) );..      sqli
1d0d0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1d0e0 20 4f 50 5f 50 61 72 61 6d 2c 20 70 31 2c 20 74   OP_Param, p1, t
1d0f0 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 56 64  arget);.      Vd
1d100 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25  beComment((v, "%
1d110 73 2e 25 73 20 2d 3e 20 24 25 64 22 2c 0a 20 20  s.%s -> $%d",.  
1d120 20 20 20 20 20 20 28 70 45 78 70 72 2d 3e 69 54        (pExpr->iT
1d130 61 62 6c 65 20 3f 20 22 6e 65 77 22 20 3a 20 22  able ? "new" : "
1d140 6f 6c 64 22 29 2c 0a 20 20 20 20 20 20 20 20 28  old"),.        (
1d150 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30  pExpr->iColumn<0
1d160 20 3f 20 22 72 6f 77 69 64 22 20 3a 20 70 45 78   ? "rowid" : pEx
1d170 70 72 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 70  pr->pTab->aCol[p
1d180 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 7a  Expr->iColumn].z
1d190 4e 61 6d 65 29 2c 0a 20 20 20 20 20 20 20 20 74  Name),.        t
1d1a0 61 72 67 65 74 0a 20 20 20 20 20 20 29 29 3b 0a  arget.      ));.
1d1b0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1d1c0 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f  OMIT_FLOATING_PO
1d1d0 49 4e 54 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  INT.      /* If 
1d1e0 74 68 65 20 63 6f 6c 75 6d 6e 20 68 61 73 20 52  the column has R
1d1f0 45 41 4c 20 61 66 66 69 6e 69 74 79 2c 20 69 74  EAL affinity, it
1d200 20 6d 61 79 20 63 75 72 72 65 6e 74 6c 79 20 62   may currently b
1d210 65 20 73 74 6f 72 65 64 20 61 73 20 61 6e 0a 20  e stored as an. 
1d220 20 20 20 20 20 2a 2a 20 69 6e 74 65 67 65 72 2e       ** integer.
1d230 20 55 73 65 20 4f 50 5f 52 65 61 6c 41 66 66 69   Use OP_RealAffi
1d240 6e 69 74 79 20 74 6f 20 6d 61 6b 65 20 73 75 72  nity to make sur
1d250 65 20 69 74 20 69 73 20 72 65 61 6c 6c 79 20 72  e it is really r
1d260 65 61 6c 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  eal..      **.  
1d270 20 20 20 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d      ** EVIDENCE-
1d280 4f 46 3a 20 52 2d 36 30 39 38 35 2d 35 37 36 36  OF: R-60985-5766
1d290 32 20 53 51 4c 69 74 65 20 77 69 6c 6c 20 63 6f  2 SQLite will co
1d2a0 6e 76 65 72 74 20 74 68 65 20 76 61 6c 75 65 20  nvert the value 
1d2b0 62 61 63 6b 20 74 6f 0a 20 20 20 20 20 20 2a 2a  back to.      **
1d2c0 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20   floating point 
1d2d0 77 68 65 6e 20 65 78 74 72 61 63 74 69 6e 67 20  when extracting 
1d2e0 69 74 20 66 72 6f 6d 20 74 68 65 20 72 65 63 6f  it from the reco
1d2f0 72 64 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69 66  rd.  */.      if
1d300 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ( pExpr->iColumn
1d310 3e 3d 30 20 0a 20 20 20 20 20 20 20 26 26 20 70  >=0 .       && p
1d320 54 61 62 2d 3e 61 43 6f 6c 5b 70 45 78 70 72 2d  Tab->aCol[pExpr-
1d330 3e 69 43 6f 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69  >iColumn].affini
1d340 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52  ty==SQLITE_AFF_R
1d350 45 41 4c 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  EAL.      ){.   
1d360 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1d370 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 61  AddOp1(v, OP_Rea
1d380 6c 41 66 66 69 6e 69 74 79 2c 20 74 61 72 67 65  lAffinity, targe
1d390 74 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  t);.      }.#end
1d3a0 69 66 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  if.      break;.
1d3b0 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20      }..    case 
1d3c0 54 4b 5f 56 45 43 54 4f 52 3a 20 7b 0a 20 20 20  TK_VECTOR: {.   
1d3d0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
1d3e0 73 67 28 70 50 61 72 73 65 2c 20 22 69 6e 76 61  sg(pParse, "inva
1d3f0 6c 69 64 20 75 73 65 20 6f 66 20 72 6f 77 20 76  lid use of row v
1d400 61 6c 75 65 20 28 31 29 22 29 3b 0a 20 20 20 20  alue (1)");.    
1d410 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
1d420 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45      case TK_SELE
1d430 43 54 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20  CT_COLUMN: {.   
1d440 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d     Expr *pLeft =
1d450 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20   pExpr->pLeft;. 
1d460 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 65       assert( pLe
1d470 66 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ft );.      asse
1d480 72 74 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54  rt( pLeft->op==T
1d490 4b 5f 53 45 4c 45 43 54 20 7c 7c 20 70 4c 65 66  K_SELECT || pLef
1d4a0 74 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54  t->op==TK_REGIST
1d4b0 45 52 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ER );.      if( 
1d4c0 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 53 45  pLeft->op==TK_SE
1d4d0 4c 45 43 54 20 29 7b 0a 20 20 20 20 20 20 20 20  LECT ){.        
1d4e0 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 20 3d 20  pLeft->iTable = 
1d4f0 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65  sqlite3CodeSubse
1d500 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 4c 65  lect(pParse, pLe
1d510 66 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  ft, 0, 0);.     
1d520 20 20 20 70 4c 65 66 74 2d 3e 6f 70 20 3d 20 54     pLeft->op = T
1d530 4b 5f 52 45 47 49 53 54 45 52 3b 0a 20 20 20 20  K_REGISTER;.    
1d540 20 20 7d 0a 20 20 20 20 20 20 69 6e 52 65 67 20    }.      inReg 
1d550 3d 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 20  = pLeft->iTable 
1d560 2b 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  + pExpr->iColumn
1d570 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1d580 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20     }..    /*.   
1d590 20 2a 2a 20 46 6f 72 6d 20 41 3a 0a 20 20 20 20   ** Form A:.    
1d5a0 2a 2a 20 20 20 43 41 53 45 20 78 20 57 48 45 4e  **   CASE x WHEN
1d5b0 20 65 31 20 54 48 45 4e 20 72 31 20 57 48 45 4e   e1 THEN r1 WHEN
1d5c0 20 65 32 20 54 48 45 4e 20 72 32 20 2e 2e 2e 20   e2 THEN r2 ... 
1d5d0 57 48 45 4e 20 65 4e 20 54 48 45 4e 20 72 4e 20  WHEN eN THEN rN 
1d5e0 45 4c 53 45 20 79 20 45 4e 44 0a 20 20 20 20 2a  ELSE y END.    *
1d5f0 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 6d 20 42 3a  *.    ** Form B:
1d600 0a 20 20 20 20 2a 2a 20 20 20 43 41 53 45 20 57  .    **   CASE W
1d610 48 45 4e 20 65 31 20 54 48 45 4e 20 72 31 20 57  HEN e1 THEN r1 W
1d620 48 45 4e 20 65 32 20 54 48 45 4e 20 72 32 20 2e  HEN e2 THEN r2 .
1d630 2e 2e 20 57 48 45 4e 20 65 4e 20 54 48 45 4e 20  .. WHEN eN THEN 
1d640 72 4e 20 45 4c 53 45 20 79 20 45 4e 44 0a 20 20  rN ELSE y END.  
1d650 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 6d    **.    ** Form
1d660 20 41 20 69 73 20 63 61 6e 20 62 65 20 74 72 61   A is can be tra
1d670 6e 73 66 6f 72 6d 65 64 20 69 6e 74 6f 20 74 68  nsformed into th
1d680 65 20 65 71 75 69 76 61 6c 65 6e 74 20 66 6f 72  e equivalent for
1d690 6d 20 42 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  m B as follows:.
1d6a0 20 20 20 20 2a 2a 20 20 20 43 41 53 45 20 57 48      **   CASE WH
1d6b0 45 4e 20 78 3d 65 31 20 54 48 45 4e 20 72 31 20  EN x=e1 THEN r1 
1d6c0 57 48 45 4e 20 78 3d 65 32 20 54 48 45 4e 20 72  WHEN x=e2 THEN r
1d6d0 32 20 2e 2e 2e 0a 20 20 20 20 2a 2a 20 20 20 20  2 ....    **    
1d6e0 20 20 20 20 57 48 45 4e 20 78 3d 65 4e 20 54 48      WHEN x=eN TH
1d6f0 45 4e 20 72 4e 20 45 4c 53 45 20 79 20 45 4e 44  EN rN ELSE y END
1d700 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 58  .    **.    ** X
1d710 20 28 69 66 20 69 74 20 65 78 69 73 74 73 29 20   (if it exists) 
1d720 69 73 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 65  is in pExpr->pLe
1d730 66 74 2e 0a 20 20 20 20 2a 2a 20 59 20 69 73 20  ft..    ** Y is 
1d740 69 6e 20 74 68 65 20 6c 61 73 74 20 65 6c 65 6d  in the last elem
1d750 65 6e 74 20 6f 66 20 70 45 78 70 72 2d 3e 78 2e  ent of pExpr->x.
1d760 70 4c 69 73 74 20 69 66 20 70 45 78 70 72 2d 3e  pList if pExpr->
1d770 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 69  x.pList->nExpr i
1d780 73 0a 20 20 20 20 2a 2a 20 6f 64 64 2e 20 20 54  s.    ** odd.  T
1d790 68 65 20 59 20 69 73 20 61 6c 73 6f 20 6f 70 74  he Y is also opt
1d7a0 69 6f 6e 61 6c 2e 20 20 49 66 20 74 68 65 20 6e  ional.  If the n
1d7b0 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74  umber of element
1d7c0 73 20 69 6e 20 78 2e 70 4c 69 73 74 0a 20 20 20  s in x.pList.   
1d7d0 20 2a 2a 20 69 73 20 65 76 65 6e 2c 20 74 68 65   ** is even, the
1d7e0 6e 20 59 20 69 73 20 6f 6d 69 74 74 65 64 20 61  n Y is omitted a
1d7f0 6e 64 20 74 68 65 20 22 6f 74 68 65 72 77 69 73  nd the "otherwis
1d800 65 22 20 72 65 73 75 6c 74 20 69 73 20 4e 55 4c  e" result is NUL
1d810 4c 2e 0a 20 20 20 20 2a 2a 20 45 69 20 69 73 20  L..    ** Ei is 
1d820 69 6e 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d  in pExpr->pList-
1d830 3e 61 5b 69 2a 32 5d 20 61 6e 64 20 52 69 20 69  >a[i*2] and Ri i
1d840 73 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e  s pExpr->pList->
1d850 61 5b 69 2a 32 2b 31 5d 2e 0a 20 20 20 20 2a 2a  a[i*2+1]..    **
1d860 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 65 73 75  .    ** The resu
1d870 6c 74 20 6f 66 20 74 68 65 20 65 78 70 72 65 73  lt of the expres
1d880 73 69 6f 6e 20 69 73 20 74 68 65 20 52 69 20 66  sion is the Ri f
1d890 6f 72 20 74 68 65 20 66 69 72 73 74 20 6d 61 74  or the first mat
1d8a0 63 68 69 6e 67 20 45 69 2c 0a 20 20 20 20 2a 2a  ching Ei,.    **
1d8b0 20 6f 72 20 69 66 20 74 68 65 72 65 20 69 73 20   or if there is 
1d8c0 6e 6f 20 6d 61 74 63 68 69 6e 67 20 45 69 2c 20  no matching Ei, 
1d8d0 74 68 65 20 45 4c 53 45 20 74 65 72 6d 20 59 2c  the ELSE term Y,
1d8e0 20 6f 72 20 69 66 20 74 68 65 72 65 20 69 73 0a   or if there is.
1d8f0 20 20 20 20 2a 2a 20 6e 6f 20 45 4c 53 45 20 74      ** no ELSE t
1d900 65 72 6d 2c 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a  erm, NULL..    *
1d910 2f 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 61  /.    default: a
1d920 73 73 65 72 74 28 20 6f 70 3d 3d 54 4b 5f 43 41  ssert( op==TK_CA
1d930 53 45 20 29 3b 20 7b 0a 20 20 20 20 20 20 69 6e  SE ); {.      in
1d940 74 20 65 6e 64 4c 61 62 65 6c 3b 20 20 20 20 20  t endLabel;     
1d950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d960 2f 2a 20 47 4f 54 4f 20 6c 61 62 65 6c 20 66 6f  /* GOTO label fo
1d970 72 20 65 6e 64 20 6f 66 20 43 41 53 45 20 73 74  r end of CASE st
1d980 6d 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  mt */.      int 
1d990 6e 65 78 74 43 61 73 65 3b 20 20 20 20 20 20 20  nextCase;       
1d9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d9b0 20 47 4f 54 4f 20 6c 61 62 65 6c 20 66 6f 72 20   GOTO label for 
1d9c0 6e 65 78 74 20 57 48 45 4e 20 63 6c 61 75 73 65  next WHEN clause
1d9d0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 45   */.      int nE
1d9e0 78 70 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  xpr;            
1d9f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 32              /* 2
1da00 78 20 6e 75 6d 62 65 72 20 6f 66 20 57 48 45 4e  x number of WHEN
1da10 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20   terms */.      
1da20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
1da30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1da40 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
1da50 72 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 4c  r */.      ExprL
1da60 69 73 74 20 2a 70 45 4c 69 73 74 3b 20 20 20 20  ist *pEList;    
1da70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1da80 4c 69 73 74 20 6f 66 20 57 48 45 4e 20 74 65 72  List of WHEN ter
1da90 6d 73 20 2a 2f 0a 20 20 20 20 20 20 73 74 72 75  ms */.      stru
1daa0 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
1dab0 20 2a 61 4c 69 73 74 65 6c 65 6d 3b 20 20 2f 2a   *aListelem;  /*
1dac0 20 41 72 72 61 79 20 6f 66 20 57 48 45 4e 20 74   Array of WHEN t
1dad0 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20 45 78  erms */.      Ex
1dae0 70 72 20 6f 70 43 6f 6d 70 61 72 65 3b 20 20 20  pr opCompare;   
1daf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1db00 2f 2a 20 54 68 65 20 58 3d 3d 45 69 20 65 78 70  /* The X==Ei exp
1db10 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  ression */.     
1db20 20 45 78 70 72 20 2a 70 58 3b 20 20 20 20 20 20   Expr *pX;      
1db30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1db40 20 20 20 2f 2a 20 54 68 65 20 58 20 65 78 70 72     /* The X expr
1db50 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  ession */.      
1db60 45 78 70 72 20 2a 70 54 65 73 74 20 3d 20 30 3b  Expr *pTest = 0;
1db70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1db80 20 20 2f 2a 20 58 3d 3d 45 69 20 28 66 6f 72 6d    /* X==Ei (form
1db90 20 41 29 20 6f 72 20 6a 75 73 74 20 45 69 20 28   A) or just Ei (
1dba0 66 6f 72 6d 20 42 29 20 2a 2f 0a 20 20 20 20 20  form B) */.     
1dbb0 20 56 56 41 5f 4f 4e 4c 59 28 20 69 6e 74 20 69   VVA_ONLY( int i
1dbc0 43 61 63 68 65 4c 65 76 65 6c 20 3d 20 70 50 61  CacheLevel = pPa
1dbd0 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c  rse->iCacheLevel
1dbe0 3b 20 29 0a 0a 20 20 20 20 20 20 61 73 73 65 72  ; )..      asser
1dbf0 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
1dc00 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49  rty(pExpr, EP_xI
1dc10 73 53 65 6c 65 63 74 29 20 26 26 20 70 45 78 70  sSelect) && pExp
1dc20 72 2d 3e 78 2e 70 4c 69 73 74 20 29 3b 0a 20 20  r->x.pList );.  
1dc30 20 20 20 20 61 73 73 65 72 74 28 70 45 78 70 72      assert(pExpr
1dc40 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ->x.pList->nExpr
1dc50 20 3e 20 30 29 3b 0a 20 20 20 20 20 20 70 45 4c   > 0);.      pEL
1dc60 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  ist = pExpr->x.p
1dc70 4c 69 73 74 3b 0a 20 20 20 20 20 20 61 4c 69 73  List;.      aLis
1dc80 74 65 6c 65 6d 20 3d 20 70 45 4c 69 73 74 2d 3e  telem = pEList->
1dc90 61 3b 0a 20 20 20 20 20 20 6e 45 78 70 72 20 3d  a;.      nExpr =
1dca0 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a   pEList->nExpr;.
1dcb0 20 20 20 20 20 20 65 6e 64 4c 61 62 65 6c 20 3d        endLabel =
1dcc0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
1dcd0 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
1dce0 69 66 28 20 28 70 58 20 3d 20 70 45 78 70 72 2d  if( (pX = pExpr-
1dcf0 3e 70 4c 65 66 74 29 21 3d 30 20 29 7b 0a 20 20  >pLeft)!=0 ){.  
1dd00 20 20 20 20 20 20 74 65 6d 70 58 20 3d 20 2a 70        tempX = *p
1dd10 58 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  X;.        testc
1dd20 61 73 65 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f  ase( pX->op==TK_
1dd30 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20  COLUMN );.      
1dd40 20 20 65 78 70 72 54 6f 52 65 67 69 73 74 65 72    exprToRegister
1dd50 28 26 74 65 6d 70 58 2c 20 73 71 6c 69 74 65 33  (&tempX, sqlite3
1dd60 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
1dd70 72 73 65 2c 20 70 58 2c 20 26 72 65 67 46 72 65  rse, pX, &regFre
1dd80 65 31 29 29 3b 0a 20 20 20 20 20 20 20 20 74 65  e1));.        te
1dd90 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31  stcase( regFree1
1dda0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 6f  ==0 );.        o
1ddb0 70 43 6f 6d 70 61 72 65 2e 6f 70 20 3d 20 54 4b  pCompare.op = TK
1ddc0 5f 45 51 3b 0a 20 20 20 20 20 20 20 20 6f 70 43  _EQ;.        opC
1ddd0 6f 6d 70 61 72 65 2e 70 4c 65 66 74 20 3d 20 26  ompare.pLeft = &
1dde0 74 65 6d 70 58 3b 0a 20 20 20 20 20 20 20 20 70  tempX;.        p
1ddf0 54 65 73 74 20 3d 20 26 6f 70 43 6f 6d 70 61 72  Test = &opCompar
1de00 65 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 69  e;.        /* Ti
1de10 63 6b 65 74 20 62 33 35 31 64 39 35 66 39 63 64  cket b351d95f9cd
1de20 35 65 66 31 37 65 39 64 39 64 62 61 65 31 38 66  5ef17e9d9dbae18f
1de30 35 63 61 38 36 31 31 31 39 30 30 30 31 3a 0a 20  5ca8611190001:. 
1de40 20 20 20 20 20 20 20 2a 2a 20 54 68 65 20 76 61         ** The va
1de50 6c 75 65 20 69 6e 20 72 65 67 46 72 65 65 31 20  lue in regFree1 
1de60 6d 69 67 68 74 20 67 65 74 20 53 43 6f 70 79 2d  might get SCopy-
1de70 65 64 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65  ed into the file
1de80 20 72 65 73 75 6c 74 2e 0a 20 20 20 20 20 20 20   result..       
1de90 20 2a 2a 20 53 6f 20 6d 61 6b 65 20 73 75 72 65   ** So make sure
1dea0 20 74 68 61 74 20 74 68 65 20 72 65 67 46 72 65   that the regFre
1deb0 65 31 20 72 65 67 69 73 74 65 72 20 69 73 20 6e  e1 register is n
1dec0 6f 74 20 72 65 75 73 65 64 20 66 6f 72 20 6f 74  ot reused for ot
1ded0 68 65 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  her.        ** p
1dee0 75 72 70 6f 73 65 73 20 61 6e 64 20 70 6f 73 73  urposes and poss
1def0 69 62 6c 79 20 6f 76 65 72 77 72 69 74 74 65 6e  ibly overwritten
1df00 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65  .  */.        re
1df10 67 46 72 65 65 31 20 3d 20 30 3b 0a 20 20 20 20  gFree1 = 0;.    
1df20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d    }.      for(i=
1df30 30 3b 20 69 3c 6e 45 78 70 72 2d 31 3b 20 69 3d  0; i<nExpr-1; i=
1df40 69 2b 32 29 7b 0a 20 20 20 20 20 20 20 20 73 71  i+2){.        sq
1df50 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75  lite3ExprCachePu
1df60 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  sh(pParse);.    
1df70 20 20 20 20 69 66 28 20 70 58 20 29 7b 0a 20 20      if( pX ){.  
1df80 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1df90 70 54 65 73 74 21 3d 30 20 29 3b 0a 20 20 20 20  pTest!=0 );.    
1dfa0 20 20 20 20 20 20 6f 70 43 6f 6d 70 61 72 65 2e        opCompare.
1dfb0 70 52 69 67 68 74 20 3d 20 61 4c 69 73 74 65 6c  pRight = aListel
1dfc0 65 6d 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  em[i].pExpr;.   
1dfd0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1dfe0 20 20 20 20 20 20 70 54 65 73 74 20 3d 20 61 4c        pTest = aL
1dff0 69 73 74 65 6c 65 6d 5b 69 5d 2e 70 45 78 70 72  istelem[i].pExpr
1e000 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1e010 20 20 20 20 6e 65 78 74 43 61 73 65 20 3d 20 73      nextCase = s
1e020 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
1e030 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20  bel(v);.        
1e040 74 65 73 74 63 61 73 65 28 20 70 54 65 73 74 2d  testcase( pTest-
1e050 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29  >op==TK_COLUMN )
1e060 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
1e070 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
1e080 72 73 65 2c 20 70 54 65 73 74 2c 20 6e 65 78 74  rse, pTest, next
1e090 43 61 73 65 2c 20 53 51 4c 49 54 45 5f 4a 55 4d  Case, SQLITE_JUM
1e0a0 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20  PIFNULL);.      
1e0b0 20 20 74 65 73 74 63 61 73 65 28 20 61 4c 69 73    testcase( aLis
1e0c0 74 65 6c 65 6d 5b 69 2b 31 5d 2e 70 45 78 70 72  telem[i+1].pExpr
1e0d0 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
1e0e0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
1e0f0 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
1e100 65 2c 20 61 4c 69 73 74 65 6c 65 6d 5b 69 2b 31  e, aListelem[i+1
1e110 5d 2e 70 45 78 70 72 2c 20 74 61 72 67 65 74 29  ].pExpr, target)
1e120 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
1e130 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 65 6e 64  3VdbeGoto(v, end
1e140 4c 61 62 65 6c 29 3b 0a 20 20 20 20 20 20 20 20  Label);.        
1e150 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
1e160 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Pop(pParse);.   
1e170 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1e180 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
1e190 6e 65 78 74 43 61 73 65 29 3b 0a 20 20 20 20 20  nextCase);.     
1e1a0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28 6e 45   }.      if( (nE
1e1b0 78 70 72 26 31 29 21 3d 30 20 29 7b 0a 20 20 20  xpr&1)!=0 ){.   
1e1c0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1e1d0 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65  CachePush(pParse
1e1e0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
1e1f0 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
1e200 65 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 6e 45 78  e, pEList->a[nEx
1e210 70 72 2d 31 5d 2e 70 45 78 70 72 2c 20 74 61 72  pr-1].pExpr, tar
1e220 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71  get);.        sq
1e230 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f  lite3ExprCachePo
1e240 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  p(pParse);.     
1e250 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1e260 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1e270 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  2(v, OP_Null, 0,
1e280 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
1e290 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
1e2a0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1e2b0 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   || pParse->nErr
1e2c0 3e 30 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c  >0 .           |
1e2d0 7c 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65  | pParse->iCache
1e2e0 4c 65 76 65 6c 3d 3d 69 43 61 63 68 65 4c 65 76  Level==iCacheLev
1e2f0 65 6c 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  el );.      sqli
1e300 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
1e310 62 65 6c 28 76 2c 20 65 6e 64 4c 61 62 65 6c 29  bel(v, endLabel)
1e320 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1e330 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
1e340 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52  ITE_OMIT_TRIGGER
1e350 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 41 49  .    case TK_RAI
1e360 53 45 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  SE: {.      asse
1e370 72 74 28 20 70 45 78 70 72 2d 3e 61 66 66 69 6e  rt( pExpr->affin
1e380 69 74 79 3d 3d 4f 45 5f 52 6f 6c 6c 62 61 63 6b  ity==OE_Rollback
1e390 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20   .           || 
1e3a0 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d  pExpr->affinity=
1e3b0 3d 4f 45 5f 41 62 6f 72 74 0a 20 20 20 20 20 20  =OE_Abort.      
1e3c0 20 20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 61       || pExpr->a
1e3d0 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 46 61 69 6c  ffinity==OE_Fail
1e3e0 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70  .           || p
1e3f0 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d  Expr->affinity==
1e400 4f 45 5f 49 67 6e 6f 72 65 0a 20 20 20 20 20 20  OE_Ignore.      
1e410 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 50  );.      if( !pP
1e420 61 72 73 65 2d 3e 70 54 72 69 67 67 65 72 54 61  arse->pTriggerTa
1e430 62 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  b ){.        sql
1e440 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
1e450 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rse,.           
1e460 20 20 20 20 20 20 20 20 20 20 20 20 22 52 41 49              "RAI
1e470 53 45 28 29 20 6d 61 79 20 6f 6e 6c 79 20 62 65  SE() may only be
1e480 20 75 73 65 64 20 77 69 74 68 69 6e 20 61 20 74   used within a t
1e490 72 69 67 67 65 72 2d 70 72 6f 67 72 61 6d 22 29  rigger-program")
1e4a0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
1e4b0 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
1e4c0 20 20 69 66 28 20 70 45 78 70 72 2d 3e 61 66 66    if( pExpr->aff
1e4d0 69 6e 69 74 79 3d 3d 4f 45 5f 41 62 6f 72 74 20  inity==OE_Abort 
1e4e0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1e4f0 65 33 4d 61 79 41 62 6f 72 74 28 70 50 61 72 73  e3MayAbort(pPars
1e500 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
1e510 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
1e520 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
1e530 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29  , EP_IntValue) )
1e540 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  ;.      if( pExp
1e550 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f  r->affinity==OE_
1e560 49 67 6e 6f 72 65 20 29 7b 0a 20 20 20 20 20 20  Ignore ){.      
1e570 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1e580 4f 70 34 28 0a 20 20 20 20 20 20 20 20 20 20 20  Op4(.           
1e590 20 76 2c 20 4f 50 5f 48 61 6c 74 2c 20 53 51 4c   v, OP_Halt, SQL
1e5a0 49 54 45 5f 4f 4b 2c 20 4f 45 5f 49 67 6e 6f 72  ITE_OK, OE_Ignor
1e5b0 65 2c 20 30 2c 20 70 45 78 70 72 2d 3e 75 2e 7a  e, 0, pExpr->u.z
1e5c0 54 6f 6b 65 6e 2c 30 29 3b 0a 20 20 20 20 20 20  Token,0);.      
1e5d0 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
1e5e0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
1e5f0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 48          sqlite3H
1e600 61 6c 74 43 6f 6e 73 74 72 61 69 6e 74 28 70 50  altConstraint(pP
1e610 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 43 4f 4e  arse, SQLITE_CON
1e620 53 54 52 41 49 4e 54 5f 54 52 49 47 47 45 52 2c  STRAINT_TRIGGER,
1e630 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1e640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1e650 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 2c 20  Expr->affinity, 
1e660 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  pExpr->u.zToken,
1e670 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a   0, 0);.      }.
1e680 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1e690 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20    }.#endif.  }. 
1e6a0 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
1e6b0 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
1e6c0 65 67 46 72 65 65 31 29 3b 0a 20 20 73 71 6c 69  egFree1);.  sqli
1e6d0 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
1e6e0 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65  g(pParse, regFre
1e6f0 65 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 6e  e2);.  return in
1e700 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 61  Reg;.}../*.** Fa
1e710 63 74 6f 72 20 6f 75 74 20 74 68 65 20 63 6f 64  ctor out the cod
1e720 65 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 65  e of the given e
1e730 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 69 6e 69  xpression to ini
1e740 74 69 61 6c 69 7a 61 74 69 6f 6e 20 74 69 6d 65  tialization time
1e750 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1e760 33 45 78 70 72 43 6f 64 65 41 74 49 6e 69 74 28  3ExprCodeAtInit(
1e770 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
1e780 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20  ,    /* Parsing 
1e790 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
1e7a0 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 2f  r *pExpr,      /
1e7b0 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * The expression
1e7c0 20 74 6f 20 63 6f 64 65 20 77 68 65 6e 20 74 68   to code when th
1e7d0 65 20 56 44 42 45 20 69 6e 69 74 69 61 6c 69 7a  e VDBE initializ
1e7e0 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 44  es */.  int regD
1e7f0 65 73 74 2c 20 20 20 20 20 20 2f 2a 20 53 74 6f  est,      /* Sto
1e800 72 65 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20  re the value in 
1e810 74 68 69 73 20 72 65 67 69 73 74 65 72 20 2a 2f  this register */
1e820 0a 20 20 75 38 20 72 65 75 73 61 62 6c 65 20 20  .  u8 reusable  
1e830 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
1e840 74 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20  this expression 
1e850 69 73 20 72 65 75 73 61 62 6c 65 20 2a 2f 0a 29  is reusable */.)
1e860 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 3b  {.  ExprList *p;
1e870 0a 20 20 61 73 73 65 72 74 28 20 43 6f 6e 73 74  .  assert( Const
1e880 46 61 63 74 6f 72 4f 6b 28 70 50 61 72 73 65 29  FactorOk(pParse)
1e890 20 29 3b 0a 20 20 70 20 3d 20 70 50 61 72 73 65   );.  p = pParse
1e8a0 2d 3e 70 43 6f 6e 73 74 45 78 70 72 3b 0a 20 20  ->pConstExpr;.  
1e8b0 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45  pExpr = sqlite3E
1e8c0 78 70 72 44 75 70 28 70 50 61 72 73 65 2d 3e 64  xprDup(pParse->d
1e8d0 62 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20 20  b, pExpr, 0);.  
1e8e0 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  p = sqlite3ExprL
1e8f0 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65  istAppend(pParse
1e900 2c 20 70 2c 20 70 45 78 70 72 29 3b 0a 20 20 69  , p, pExpr);.  i
1e910 66 28 20 70 20 29 7b 0a 20 20 20 20 20 73 74 72  f( p ){.     str
1e920 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
1e930 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 2d 3e 61  m *pItem = &p->a
1e940 5b 70 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20 20  [p->nExpr-1];.  
1e950 20 20 20 70 49 74 65 6d 2d 3e 75 2e 69 43 6f 6e     pItem->u.iCon
1e960 73 74 45 78 70 72 52 65 67 20 3d 20 72 65 67 44  stExprReg = regD
1e970 65 73 74 3b 0a 20 20 20 20 20 70 49 74 65 6d 2d  est;.     pItem-
1e980 3e 72 65 75 73 61 62 6c 65 20 3d 20 72 65 75 73  >reusable = reus
1e990 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 70 50 61 72  able;.  }.  pPar
1e9a0 73 65 2d 3e 70 43 6f 6e 73 74 45 78 70 72 20 3d  se->pConstExpr =
1e9b0 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e   p;.}../*.** Gen
1e9c0 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 65 76  erate code to ev
1e9d0 61 6c 75 61 74 65 20 61 6e 20 65 78 70 72 65 73  aluate an expres
1e9e0 73 69 6f 6e 20 61 6e 64 20 73 74 6f 72 65 20 74  sion and store t
1e9f0 68 65 20 72 65 73 75 6c 74 73 0a 2a 2a 20 69 6e  he results.** in
1ea00 74 6f 20 61 20 72 65 67 69 73 74 65 72 2e 20 20  to a register.  
1ea10 52 65 74 75 72 6e 20 74 68 65 20 72 65 67 69 73  Return the regis
1ea20 74 65 72 20 6e 75 6d 62 65 72 20 77 68 65 72 65  ter number where
1ea30 20 74 68 65 20 72 65 73 75 6c 74 73 0a 2a 2a 20   the results.** 
1ea40 61 72 65 20 73 74 6f 72 65 64 2e 0a 2a 2a 0a 2a  are stored..**.*
1ea50 2a 20 49 66 20 74 68 65 20 72 65 67 69 73 74 65  * If the registe
1ea60 72 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79  r is a temporary
1ea70 20 72 65 67 69 73 74 65 72 20 74 68 61 74 20 63   register that c
1ea80 61 6e 20 62 65 20 64 65 61 6c 6c 6f 63 61 74 65  an be deallocate
1ea90 64 2c 0a 2a 2a 20 74 68 65 6e 20 77 72 69 74 65  d,.** then write
1eaa0 20 69 74 73 20 6e 75 6d 62 65 72 20 69 6e 74 6f   its number into
1eab0 20 2a 70 52 65 67 2e 20 20 49 66 20 74 68 65 20   *pReg.  If the 
1eac0 72 65 73 75 6c 74 20 72 65 67 69 73 74 65 72 20  result register 
1ead0 69 73 20 6e 6f 74 0a 2a 2a 20 61 20 74 65 6d 70  is not.** a temp
1eae0 6f 72 61 72 79 2c 20 74 68 65 6e 20 73 65 74 20  orary, then set 
1eaf0 2a 70 52 65 67 20 74 6f 20 7a 65 72 6f 2e 0a 2a  *pReg to zero..*
1eb00 2a 0a 2a 2a 20 49 66 20 70 45 78 70 72 20 69 73  *.** If pExpr is
1eb10 20 61 20 63 6f 6e 73 74 61 6e 74 2c 20 74 68 65   a constant, the
1eb20 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  n this routine m
1eb30 69 67 68 74 20 67 65 6e 65 72 61 74 65 20 74 68  ight generate th
1eb40 69 73 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 66 69  is.** code to fi
1eb50 6c 6c 20 74 68 65 20 72 65 67 69 73 74 65 72 20  ll the register 
1eb60 69 6e 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a  in the initializ
1eb70 61 74 69 6f 6e 20 73 65 63 74 69 6f 6e 20 6f 66  ation section of
1eb80 20 74 68 65 0a 2a 2a 20 56 44 42 45 20 70 72 6f   the.** VDBE pro
1eb90 67 72 61 6d 2c 20 69 6e 20 6f 72 64 65 72 20 74  gram, in order t
1eba0 6f 20 66 61 63 74 6f 72 20 69 74 20 6f 75 74 20  o factor it out 
1ebb0 6f 66 20 74 68 65 20 65 76 61 6c 75 61 74 69 6f  of the evaluatio
1ebc0 6e 20 6c 6f 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73  n loop..*/.int s
1ebd0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
1ebe0 6d 70 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  mp(Parse *pParse
1ebf0 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69  , Expr *pExpr, i
1ec00 6e 74 20 2a 70 52 65 67 29 7b 0a 20 20 69 6e 74  nt *pReg){.  int
1ec10 20 72 32 3b 0a 20 20 70 45 78 70 72 20 3d 20 73   r2;.  pExpr = s
1ec20 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f  qlite3ExprSkipCo
1ec30 6c 6c 61 74 65 28 70 45 78 70 72 29 3b 0a 20 20  llate(pExpr);.  
1ec40 69 66 28 20 43 6f 6e 73 74 46 61 63 74 6f 72 4f  if( ConstFactorO
1ec50 6b 28 70 50 61 72 73 65 29 0a 20 20 20 26 26 20  k(pParse).   && 
1ec60 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 52 45  pExpr->op!=TK_RE
1ec70 47 49 53 54 45 52 0a 20 20 20 26 26 20 73 71 6c  GISTER.   && sql
1ec80 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
1ec90 6e 74 4e 6f 74 4a 6f 69 6e 28 70 45 78 70 72 29  ntNotJoin(pExpr)
1eca0 0a 20 20 29 7b 0a 20 20 20 20 45 78 70 72 4c 69  .  ){.    ExprLi
1ecb0 73 74 20 2a 70 20 3d 20 70 50 61 72 73 65 2d 3e  st *p = pParse->
1ecc0 70 43 6f 6e 73 74 45 78 70 72 3b 0a 20 20 20 20  pConstExpr;.    
1ecd0 69 6e 74 20 69 3b 0a 20 20 20 20 2a 70 52 65 67  int i;.    *pReg
1ece0 20 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70    = 0;.    if( p
1ecf0 20 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74   ){.      struct
1ed00 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
1ed10 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 66 6f 72  pItem;.      for
1ed20 28 70 49 74 65 6d 3d 70 2d 3e 61 2c 20 69 3d 70  (pItem=p->a, i=p
1ed30 2d 3e 6e 45 78 70 72 3b 20 69 3e 30 3b 20 70 49  ->nExpr; i>0; pI
1ed40 74 65 6d 2b 2b 2c 20 69 2d 2d 29 7b 0a 20 20 20  tem++, i--){.   
1ed50 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e       if( pItem->
1ed60 72 65 75 73 61 62 6c 65 20 26 26 20 73 71 6c 69  reusable && sqli
1ed70 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70  te3ExprCompare(p
1ed80 49 74 65 6d 2d 3e 70 45 78 70 72 2c 70 45 78 70  Item->pExpr,pExp
1ed90 72 2c 2d 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20  r,-1)==0 ){.    
1eda0 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 49 74        return pIt
1edb0 65 6d 2d 3e 75 2e 69 43 6f 6e 73 74 45 78 70 72  em->u.iConstExpr
1edc0 52 65 67 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  Reg;.        }. 
1edd0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1ede0 20 72 32 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e   r2 = ++pParse->
1edf0 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65  nMem;.    sqlite
1ee00 33 45 78 70 72 43 6f 64 65 41 74 49 6e 69 74 28  3ExprCodeAtInit(
1ee10 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 72  pParse, pExpr, r
1ee20 32 2c 20 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  2, 1);.  }else{.
1ee30 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c      int r1 = sql
1ee40 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
1ee50 50 61 72 73 65 29 3b 0a 20 20 20 20 72 32 20 3d  Parse);.    r2 =
1ee60 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1ee70 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70  Target(pParse, p
1ee80 45 78 70 72 2c 20 72 31 29 3b 0a 20 20 20 20 69  Expr, r1);.    i
1ee90 66 28 20 72 32 3d 3d 72 31 20 29 7b 0a 20 20 20  f( r2==r1 ){.   
1eea0 20 20 20 2a 70 52 65 67 20 3d 20 72 31 3b 0a 20     *pReg = r1;. 
1eeb0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1eec0 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
1eed0 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31  mpReg(pParse, r1
1eee0 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 67 20 3d  );.      *pReg =
1eef0 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   0;.    }.  }.  
1ef00 72 65 74 75 72 6e 20 72 32 3b 0a 7d 0a 0a 2f 2a  return r2;.}../*
1ef10 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
1ef20 65 20 74 68 61 74 20 77 69 6c 6c 20 65 76 61 6c  e that will eval
1ef30 75 61 74 65 20 65 78 70 72 65 73 73 69 6f 6e 20  uate expression 
1ef40 70 45 78 70 72 20 61 6e 64 20 73 74 6f 72 65 20  pExpr and store 
1ef50 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 73 20 69  the.** results i
1ef60 6e 20 72 65 67 69 73 74 65 72 20 74 61 72 67 65  n register targe
1ef70 74 2e 20 20 54 68 65 20 72 65 73 75 6c 74 73 20  t.  The results 
1ef80 61 72 65 20 67 75 61 72 61 6e 74 65 65 64 20 74  are guaranteed t
1ef90 6f 20 61 70 70 65 61 72 0a 2a 2a 20 69 6e 20 72  o appear.** in r
1efa0 65 67 69 73 74 65 72 20 74 61 72 67 65 74 2e 0a  egister target..
1efb0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
1efc0 78 70 72 43 6f 64 65 28 50 61 72 73 65 20 2a 70  xprCode(Parse *p
1efd0 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
1efe0 70 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29 7b  pr, int target){
1eff0 0a 20 20 69 6e 74 20 69 6e 52 65 67 3b 0a 0a 20  .  int inReg;.. 
1f000 20 61 73 73 65 72 74 28 20 74 61 72 67 65 74 3e   assert( target>
1f010 30 20 26 26 20 74 61 72 67 65 74 3c 3d 70 50 61  0 && target<=pPa
1f020 72 73 65 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 69  rse->nMem );.  i
1f030 66 28 20 70 45 78 70 72 20 26 26 20 70 45 78 70  f( pExpr && pExp
1f040 72 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54  r->op==TK_REGIST
1f050 45 52 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ER ){.    sqlite
1f060 33 56 64 62 65 41 64 64 4f 70 32 28 70 50 61 72  3VdbeAddOp2(pPar
1f070 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 43 6f  se->pVdbe, OP_Co
1f080 70 79 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  py, pExpr->iTabl
1f090 65 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 7d 65  e, target);.  }e
1f0a0 6c 73 65 7b 0a 20 20 20 20 69 6e 52 65 67 20 3d  lse{.    inReg =
1f0b0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1f0c0 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70  Target(pParse, p
1f0d0 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20  Expr, target);. 
1f0e0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73     assert( pPars
1f0f0 65 2d 3e 70 56 64 62 65 21 3d 30 20 7c 7c 20 70  e->pVdbe!=0 || p
1f100 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
1f110 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 69  cFailed );.    i
1f120 66 28 20 69 6e 52 65 67 21 3d 74 61 72 67 65 74  f( inReg!=target
1f130 20 26 26 20 70 50 61 72 73 65 2d 3e 70 56 64 62   && pParse->pVdb
1f140 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  e ){.      sqlit
1f150 65 33 56 64 62 65 41 64 64 4f 70 32 28 70 50 61  e3VdbeAddOp2(pPa
1f160 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 53  rse->pVdbe, OP_S
1f170 43 6f 70 79 2c 20 69 6e 52 65 67 2c 20 74 61 72  Copy, inReg, tar
1f180 67 65 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  get);.    }.  }.
1f190 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20  }../*.** Make a 
1f1a0 74 72 61 6e 73 69 65 6e 74 20 63 6f 70 79 20 6f  transient copy o
1f1b0 66 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78  f expression pEx
1f1c0 70 72 20 61 6e 64 20 74 68 65 6e 20 63 6f 64 65  pr and then code
1f1d0 20 69 74 20 75 73 69 6e 67 0a 2a 2a 20 73 71 6c   it using.** sql
1f1e0 69 74 65 33 45 78 70 72 43 6f 64 65 28 29 2e 20  ite3ExprCode(). 
1f1f0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 6f   This routine wo
1f200 72 6b 73 20 6a 75 73 74 20 6c 69 6b 65 20 73 71  rks just like sq
1f210 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 29 0a  lite3ExprCode().
1f220 2a 2a 20 65 78 63 65 70 74 20 74 68 61 74 20 74  ** except that t
1f230 68 65 20 69 6e 70 75 74 20 65 78 70 72 65 73 73  he input express
1f240 69 6f 6e 20 69 73 20 67 75 61 72 61 6e 74 65 65  ion is guarantee
1f250 64 20 74 6f 20 62 65 20 75 6e 63 68 61 6e 67 65  d to be unchange
1f260 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
1f270 65 33 45 78 70 72 43 6f 64 65 43 6f 70 79 28 50  e3ExprCodeCopy(P
1f280 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
1f290 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 74  pr *pExpr, int t
1f2a0 61 72 67 65 74 29 7b 0a 20 20 73 71 6c 69 74 65  arget){.  sqlite
1f2b0 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
1f2c0 64 62 3b 0a 20 20 70 45 78 70 72 20 3d 20 73 71  db;.  pExpr = sq
1f2d0 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
1f2e0 20 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 69 66   pExpr, 0);.  if
1f2f0 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  ( !db->mallocFai
1f300 6c 65 64 20 29 20 73 71 6c 69 74 65 33 45 78 70  led ) sqlite3Exp
1f310 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
1f320 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  xpr, target);.  
1f330 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
1f340 65 28 64 62 2c 20 70 45 78 70 72 29 3b 0a 7d 0a  e(db, pExpr);.}.
1f350 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
1f360 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 65  code that will e
1f370 76 61 6c 75 61 74 65 20 65 78 70 72 65 73 73 69  valuate expressi
1f380 6f 6e 20 70 45 78 70 72 20 61 6e 64 20 73 74 6f  on pExpr and sto
1f390 72 65 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74  re the.** result
1f3a0 73 20 69 6e 20 72 65 67 69 73 74 65 72 20 74 61  s in register ta
1f3b0 72 67 65 74 2e 20 20 54 68 65 20 72 65 73 75 6c  rget.  The resul
1f3c0 74 73 20 61 72 65 20 67 75 61 72 61 6e 74 65 65  ts are guarantee
1f3d0 64 20 74 6f 20 61 70 70 65 61 72 0a 2a 2a 20 69  d to appear.** i
1f3e0 6e 20 72 65 67 69 73 74 65 72 20 74 61 72 67 65  n register targe
1f3f0 74 2e 20 20 49 66 20 74 68 65 20 65 78 70 72 65  t.  If the expre
1f400 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e  ssion is constan
1f410 74 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75  t, then this rou
1f420 74 69 6e 65 0a 2a 2a 20 6d 69 67 68 74 20 63 68  tine.** might ch
1f430 6f 6f 73 65 20 74 6f 20 63 6f 64 65 20 74 68 65  oose to code the
1f440 20 65 78 70 72 65 73 73 69 6f 6e 20 61 74 20 69   expression at i
1f450 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 74 69  nitialization ti
1f460 6d 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  me..*/.void sqli
1f470 74 65 33 45 78 70 72 43 6f 64 65 46 61 63 74 6f  te3ExprCodeFacto
1f480 72 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61  rable(Parse *pPa
1f490 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
1f4a0 2c 20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a 20  , int target){. 
1f4b0 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6f 6b 43   if( pParse->okC
1f4c0 6f 6e 73 74 46 61 63 74 6f 72 20 26 26 20 73 71  onstFactor && sq
1f4d0 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
1f4e0 61 6e 74 28 70 45 78 70 72 29 20 29 7b 0a 20 20  ant(pExpr) ){.  
1f4f0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
1f500 65 41 74 49 6e 69 74 28 70 50 61 72 73 65 2c 20  eAtInit(pParse, 
1f510 70 45 78 70 72 2c 20 74 61 72 67 65 74 2c 20 30  pExpr, target, 0
1f520 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1f530 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
1f540 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74  pParse, pExpr, t
1f550 61 72 67 65 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  arget);.  }.}../
1f560 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
1f570 64 65 20 74 68 61 74 20 65 76 61 6c 75 61 74 65  de that evaluate
1f580 73 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72  s the given expr
1f590 65 73 73 69 6f 6e 20 61 6e 64 20 70 75 74 73 20  ession and puts 
1f5a0 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 69 6e  the result.** in
1f5b0 20 72 65 67 69 73 74 65 72 20 74 61 72 67 65 74   register target
1f5c0 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 6d 61 6b  ..**.** Also mak
1f5d0 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  e a copy of the 
1f5e0 65 78 70 72 65 73 73 69 6f 6e 20 72 65 73 75 6c  expression resul
1f5f0 74 73 20 69 6e 74 6f 20 61 6e 6f 74 68 65 72 20  ts into another 
1f600 22 63 61 63 68 65 22 20 72 65 67 69 73 74 65 72  "cache" register
1f610 0a 2a 2a 20 61 6e 64 20 6d 6f 64 69 66 79 20 74  .** and modify t
1f620 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 73 6f  he expression so
1f630 20 74 68 61 74 20 74 68 65 20 6e 65 78 74 20 74   that the next t
1f640 69 6d 65 20 69 74 20 69 73 20 65 76 61 6c 75 61  ime it is evalua
1f650 74 65 64 2c 0a 2a 2a 20 74 68 65 20 72 65 73 75  ted,.** the resu
1f660 6c 74 20 69 73 20 61 20 63 6f 70 79 20 6f 66 20  lt is a copy of 
1f670 74 68 65 20 63 61 63 68 65 20 72 65 67 69 73 74  the cache regist
1f680 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  er..**.** This r
1f690 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66  outine is used f
1f6a0 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74  or expressions t
1f6b0 68 61 74 20 61 72 65 20 75 73 65 64 20 6d 75 6c  hat are used mul
1f6c0 74 69 70 6c 65 20 0a 2a 2a 20 74 69 6d 65 73 2e  tiple .** times.
1f6d0 20 20 54 68 65 79 20 61 72 65 20 65 76 61 6c 75    They are evalu
1f6e0 61 74 65 64 20 6f 6e 63 65 20 61 6e 64 20 74 68  ated once and th
1f6f0 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65  e results of the
1f700 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 61   expression.** a
1f710 72 65 20 72 65 75 73 65 64 2e 0a 2a 2f 0a 76 6f  re reused..*/.vo
1f720 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  id sqlite3ExprCo
1f730 64 65 41 6e 64 43 61 63 68 65 28 50 61 72 73 65  deAndCache(Parse
1f740 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
1f750 70 45 78 70 72 2c 20 69 6e 74 20 74 61 72 67 65  pExpr, int targe
1f760 74 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  t){.  Vdbe *v = 
1f770 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
1f780 20 69 6e 74 20 69 4d 65 6d 3b 0a 0a 20 20 61 73   int iMem;..  as
1f790 73 65 72 74 28 20 74 61 72 67 65 74 3e 30 20 29  sert( target>0 )
1f7a0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
1f7b0 72 2d 3e 6f 70 21 3d 54 4b 5f 52 45 47 49 53 54  r->op!=TK_REGIST
1f7c0 45 52 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  ER );.  sqlite3E
1f7d0 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
1f7e0 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a  pExpr, target);.
1f7f0 20 20 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73    iMem = ++pPars
1f800 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69 74  e->nMem;.  sqlit
1f810 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1f820 4f 50 5f 43 6f 70 79 2c 20 74 61 72 67 65 74 2c  OP_Copy, target,
1f830 20 69 4d 65 6d 29 3b 0a 20 20 65 78 70 72 54 6f   iMem);.  exprTo
1f840 52 65 67 69 73 74 65 72 28 70 45 78 70 72 2c 20  Register(pExpr, 
1f850 69 4d 65 6d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  iMem);.}../*.** 
1f860 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
1f870 61 74 20 70 75 73 68 65 73 20 74 68 65 20 76 61  at pushes the va
1f880 6c 75 65 20 6f 66 20 65 76 65 72 79 20 65 6c 65  lue of every ele
1f890 6d 65 6e 74 20 6f 66 20 74 68 65 20 67 69 76 65  ment of the give
1f8a0 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20  n.** expression 
1f8b0 6c 69 73 74 20 69 6e 74 6f 20 61 20 73 65 71 75  list into a sequ
1f8c0 65 6e 63 65 20 6f 66 20 72 65 67 69 73 74 65 72  ence of register
1f8d0 73 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 74  s beginning at t
1f8e0 61 72 67 65 74 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  arget..**.** Ret
1f8f0 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
1f900 66 20 65 6c 65 6d 65 6e 74 73 20 65 76 61 6c 75  f elements evalu
1f910 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ated..**.** The 
1f920 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50 20  SQLITE_ECEL_DUP 
1f930 66 6c 61 67 20 70 72 65 76 65 6e 74 73 20 74 68  flag prevents th
1f940 65 20 61 72 67 75 6d 65 6e 74 73 20 66 72 6f 6d  e arguments from
1f950 20 62 65 69 6e 67 0a 2a 2a 20 66 69 6c 6c 65 64   being.** filled
1f960 20 75 73 69 6e 67 20 4f 50 5f 53 43 6f 70 79 2e   using OP_SCopy.
1f970 20 20 4f 50 5f 43 6f 70 79 20 6d 75 73 74 20 62    OP_Copy must b
1f980 65 20 75 73 65 64 20 69 6e 73 74 65 61 64 2e 0a  e used instead..
1f990 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c 49 54 45  **.** The SQLITE
1f9a0 5f 45 43 45 4c 5f 46 41 43 54 4f 52 20 61 72 67  _ECEL_FACTOR arg
1f9b0 75 6d 65 6e 74 20 61 6c 6c 6f 77 73 20 63 6f 6e  ument allows con
1f9c0 73 74 61 6e 74 20 61 72 67 75 6d 65 6e 74 73 20  stant arguments 
1f9d0 74 6f 20 62 65 0a 2a 2a 20 66 61 63 74 6f 72 65  to be.** factore
1f9e0 64 20 6f 75 74 20 69 6e 74 6f 20 69 6e 69 74 69  d out into initi
1f9f0 61 6c 69 7a 61 74 69 6f 6e 20 63 6f 64 65 2e 0a  alization code..
1fa00 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c 49 54 45  **.** The SQLITE
1fa10 5f 45 43 45 4c 5f 52 45 46 20 66 6c 61 67 20 6d  _ECEL_REF flag m
1fa20 65 61 6e 73 20 74 68 61 74 20 65 78 70 72 65 73  eans that expres
1fa30 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 6c 69 73  sions in the lis
1fa40 74 20 77 69 74 68 0a 2a 2a 20 45 78 70 72 4c 69  t with.** ExprLi
1fa50 73 74 2e 61 5b 5d 2e 75 2e 78 2e 69 4f 72 64 65  st.a[].u.x.iOrde
1fa60 72 42 79 43 6f 6c 3e 30 20 68 61 76 65 20 61 6c  rByCol>0 have al
1fa70 72 65 61 64 79 20 62 65 65 6e 20 65 76 61 6c 75  ready been evalu
1fa80 61 74 65 64 20 61 6e 64 20 73 74 6f 72 65 64 0a  ated and stored.
1fa90 2a 2a 20 69 6e 20 72 65 67 69 73 74 65 72 73 20  ** in registers 
1faa0 61 74 20 73 72 63 52 65 67 2c 20 61 6e 64 20 73  at srcReg, and s
1fab0 6f 20 74 68 65 20 76 61 6c 75 65 20 63 61 6e 20  o the value can 
1fac0 62 65 20 63 6f 70 69 65 64 20 66 72 6f 6d 20 74  be copied from t
1fad0 68 65 72 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  here..*/.int sql
1fae0 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72  ite3ExprCodeExpr
1faf0 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70  List(.  Parse *p
1fb00 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 50 61  Parse,     /* Pa
1fb10 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
1fb20 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
1fb30 73 74 2c 20 20 20 2f 2a 20 54 68 65 20 65 78 70  st,   /* The exp
1fb40 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 74 6f 20  ression list to 
1fb50 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e  be coded */.  in
1fb60 74 20 74 61 72 67 65 74 2c 20 20 20 20 20 20 20  t target,       
1fb70 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 77 72 69   /* Where to wri
1fb80 74 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20  te results */.  
1fb90 69 6e 74 20 73 72 63 52 65 67 2c 20 20 20 20 20  int srcReg,     
1fba0 20 20 20 2f 2a 20 53 6f 75 72 63 65 20 72 65 67     /* Source reg
1fbb0 69 73 74 65 72 73 20 69 66 20 53 51 4c 49 54 45  isters if SQLITE
1fbc0 5f 45 43 45 4c 5f 52 45 46 20 2a 2f 0a 20 20 75  _ECEL_REF */.  u
1fbd0 38 20 66 6c 61 67 73 20 20 20 20 20 20 20 20 20  8 flags         
1fbe0 20 20 2f 2a 20 53 51 4c 49 54 45 5f 45 43 45 4c    /* SQLITE_ECEL
1fbf0 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20  _* flags */.){. 
1fc00 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
1fc10 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
1fc20 69 6e 74 20 69 2c 20 6a 2c 20 6e 3b 0a 20 20 75  int i, j, n;.  u
1fc30 38 20 63 6f 70 79 4f 70 20 3d 20 28 66 6c 61 67  8 copyOp = (flag
1fc40 73 20 26 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f  s & SQLITE_ECEL_
1fc50 44 55 50 29 20 3f 20 4f 50 5f 43 6f 70 79 20 3a  DUP) ? OP_Copy :
1fc60 20 4f 50 5f 53 43 6f 70 79 3b 0a 20 20 56 64 62   OP_SCopy;.  Vdb
1fc70 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
1fc80 56 64 62 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Vdbe;.  assert( 
1fc90 70 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 61 73  pList!=0 );.  as
1fca0 73 65 72 74 28 20 74 61 72 67 65 74 3e 30 20 29  sert( target>0 )
1fcb0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ;.  assert( pPar
1fcc0 73 65 2d 3e 70 56 64 62 65 21 3d 30 20 29 3b 20  se->pVdbe!=0 ); 
1fcd0 20 2f 2a 20 4e 65 76 65 72 20 67 65 74 73 20 74   /* Never gets t
1fce0 68 69 73 20 66 61 72 20 6f 74 68 65 72 77 69 73  his far otherwis
1fcf0 65 20 2a 2f 0a 20 20 6e 20 3d 20 70 4c 69 73 74  e */.  n = pList
1fd00 2d 3e 6e 45 78 70 72 3b 0a 20 20 69 66 28 20 21  ->nExpr;.  if( !
1fd10 43 6f 6e 73 74 46 61 63 74 6f 72 4f 6b 28 70 50  ConstFactorOk(pP
1fd20 61 72 73 65 29 20 29 20 66 6c 61 67 73 20 26 3d  arse) ) flags &=
1fd30 20 7e 53 51 4c 49 54 45 5f 45 43 45 4c 5f 46 41   ~SQLITE_ECEL_FA
1fd40 43 54 4f 52 3b 0a 20 20 66 6f 72 28 70 49 74 65  CTOR;.  for(pIte
1fd50 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b  m=pList->a, i=0;
1fd60 20 69 3c 6e 3b 20 69 2b 2b 2c 20 70 49 74 65 6d   i<n; i++, pItem
1fd70 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
1fd80 45 78 70 72 20 3d 20 70 49 74 65 6d 2d 3e 70 45  Expr = pItem->pE
1fd90 78 70 72 3b 0a 20 20 20 20 69 66 28 20 28 66 6c  xpr;.    if( (fl
1fda0 61 67 73 20 26 20 53 51 4c 49 54 45 5f 45 43 45  ags & SQLITE_ECE
1fdb0 4c 5f 52 45 46 29 21 3d 30 20 26 26 20 28 6a 20  L_REF)!=0 && (j 
1fdc0 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 75 2e  = pList->a[i].u.
1fdd0 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 29 3e 30  x.iOrderByCol)>0
1fde0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
1fdf0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 63  3VdbeAddOp2(v, c
1fe00 6f 70 79 4f 70 2c 20 6a 2b 73 72 63 52 65 67 2d  opyOp, j+srcReg-
1fe10 31 2c 20 74 61 72 67 65 74 2b 69 29 3b 0a 20 20  1, target+i);.  
1fe20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 66 6c 61    }else if( (fla
1fe30 67 73 20 26 20 53 51 4c 49 54 45 5f 45 43 45 4c  gs & SQLITE_ECEL
1fe40 5f 46 41 43 54 4f 52 29 21 3d 30 20 26 26 20 73  _FACTOR)!=0 && s
1fe50 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
1fe60 74 61 6e 74 28 70 45 78 70 72 29 20 29 7b 0a 20  tant(pExpr) ){. 
1fe70 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1fe80 43 6f 64 65 41 74 49 6e 69 74 28 70 50 61 72 73  CodeAtInit(pPars
1fe90 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65 74  e, pExpr, target
1fea0 2b 69 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73  +i, 0);.    }els
1feb0 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 6e 52  e{.      int inR
1fec0 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  eg = sqlite3Expr
1fed0 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73  CodeTarget(pPars
1fee0 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65 74  e, pExpr, target
1fef0 2b 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69  +i);.      if( i
1ff00 6e 52 65 67 21 3d 74 61 72 67 65 74 2b 69 20 29  nReg!=target+i )
1ff10 7b 0a 20 20 20 20 20 20 20 20 56 64 62 65 4f 70  {.        VdbeOp
1ff20 20 2a 70 4f 70 3b 0a 20 20 20 20 20 20 20 20 69   *pOp;.        i
1ff30 66 28 20 63 6f 70 79 4f 70 3d 3d 4f 50 5f 43 6f  f( copyOp==OP_Co
1ff40 70 79 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  py.         && (
1ff50 70 4f 70 3d 73 71 6c 69 74 65 33 56 64 62 65 47  pOp=sqlite3VdbeG
1ff60 65 74 4f 70 28 76 2c 20 2d 31 29 29 2d 3e 6f 70  etOp(v, -1))->op
1ff70 63 6f 64 65 3d 3d 4f 50 5f 43 6f 70 79 0a 20 20  code==OP_Copy.  
1ff80 20 20 20 20 20 20 20 26 26 20 70 4f 70 2d 3e 70         && pOp->p
1ff90 31 2b 70 4f 70 2d 3e 70 33 2b 31 3d 3d 69 6e 52  1+pOp->p3+1==inR
1ffa0 65 67 0a 20 20 20 20 20 20 20 20 20 26 26 20 70  eg.         && p
1ffb0 4f 70 2d 3e 70 32 2b 70 4f 70 2d 3e 70 33 2b 31  Op->p2+pOp->p3+1
1ffc0 3d 3d 74 61 72 67 65 74 2b 69 0a 20 20 20 20 20  ==target+i.     
1ffd0 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
1ffe0 70 4f 70 2d 3e 70 33 2b 2b 3b 0a 20 20 20 20 20  pOp->p3++;.     
1fff0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
20000 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
20010 64 64 4f 70 32 28 76 2c 20 63 6f 70 79 4f 70 2c  ddOp2(v, copyOp,
20020 20 69 6e 52 65 67 2c 20 74 61 72 67 65 74 2b 69   inReg, target+i
20030 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
20040 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
20050 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a   return n;.}../*
20060 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
20070 65 20 66 6f 72 20 61 20 42 45 54 57 45 45 4e 20  e for a BETWEEN 
20080 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20  operator..**.** 
20090 20 20 20 78 20 42 45 54 57 45 45 4e 20 79 20 41     x BETWEEN y A
200a0 4e 44 20 7a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61  ND z.**.** The a
200b0 62 6f 76 65 20 69 73 20 65 71 75 69 76 61 6c 65  bove is equivale
200c0 6e 74 20 74 6f 20 0a 2a 2a 0a 2a 2a 20 20 20 20  nt to .**.**    
200d0 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 0a 2a 2a  x>=y AND x<=z.**
200e0 0a 2a 2a 20 43 6f 64 65 20 69 74 20 61 73 20 73  .** Code it as s
200f0 75 63 68 2c 20 74 61 6b 69 6e 67 20 63 61 72 65  uch, taking care
20100 20 74 6f 20 64 6f 20 74 68 65 20 63 6f 6d 6d 6f   to do the commo
20110 6e 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 0a  n subexpression.
20120 2a 2a 20 65 6c 69 6d 69 6e 61 74 69 6f 6e 20 6f  ** elimination o
20130 66 20 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  f x..*/.static v
20140 6f 69 64 20 65 78 70 72 43 6f 64 65 42 65 74 77  oid exprCodeBetw
20150 65 65 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50  een(.  Parse *pP
20160 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73  arse,    /* Pars
20170 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e  ing and code gen
20180 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20  erating context 
20190 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  */.  Expr *pExpr
201a0 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 42 45  ,      /* The BE
201b0 54 57 45 45 4e 20 65 78 70 72 65 73 73 69 6f 6e  TWEEN expression
201c0 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 2c 20   */.  int dest, 
201d0 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
201e0 68 65 72 65 20 69 66 20 74 68 65 20 6a 75 6d 70  here if the jump
201f0 20 69 73 20 74 61 6b 65 6e 20 2a 2f 0a 20 20 76   is taken */.  v
20200 6f 69 64 20 28 2a 78 4a 75 6d 70 49 66 29 28 50  oid (*xJumpIf)(P
20210 61 72 73 65 2a 2c 45 78 70 72 2a 2c 69 6e 74 2c  arse*,Expr*,int,
20220 69 6e 74 29 2c 0a 20 20 69 6e 74 20 6a 75 6d 70  int),.  int jump
20230 49 66 4e 75 6c 6c 20 20 20 20 2f 2a 20 54 61 6b  IfNull    /* Tak
20240 65 20 74 68 65 20 6a 75 6d 70 20 69 66 20 74 68  e the jump if th
20250 65 20 42 45 54 57 45 45 4e 20 69 73 20 4e 55 4c  e BETWEEN is NUL
20260 4c 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 65  L */.){.  Expr e
20270 78 70 72 41 6e 64 3b 20 20 20 20 20 2f 2a 20 54  xprAnd;     /* T
20280 68 65 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 20  he AND operator 
20290 69 6e 20 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d  in  x>=y AND x<=
202a0 7a 20 20 2a 2f 0a 20 20 45 78 70 72 20 63 6f 6d  z  */.  Expr com
202b0 70 4c 65 66 74 3b 20 20 20 20 2f 2a 20 54 68 65  pLeft;    /* The
202c0 20 20 78 3e 3d 79 20 20 74 65 72 6d 20 2a 2f 0a    x>=y  term */.
202d0 20 20 45 78 70 72 20 63 6f 6d 70 52 69 67 68 74    Expr compRight
202e0 3b 20 20 20 2f 2a 20 54 68 65 20 20 78 3c 3d 7a  ;   /* The  x<=z
202f0 20 20 74 65 72 6d 20 2a 2f 0a 20 20 45 78 70 72    term */.  Expr
20300 20 65 78 70 72 58 3b 20 20 20 20 20 20 20 2f 2a   exprX;       /*
20310 20 54 68 65 20 20 78 20 20 73 75 62 65 78 70 72   The  x  subexpr
20320 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ession */.  int 
20330 72 65 67 46 72 65 65 31 20 3d 20 30 3b 20 2f 2a  regFree1 = 0; /*
20340 20 54 65 6d 70 6f 72 61 72 79 20 75 73 65 20 72   Temporary use r
20350 65 67 69 73 74 65 72 20 2a 2f 0a 0a 20 20 6d 65  egister */..  me
20360 6d 73 65 74 28 26 63 6f 6d 70 4c 65 66 74 2c 20  mset(&compLeft, 
20370 30 2c 20 73 69 7a 65 6f 66 28 45 78 70 72 29 29  0, sizeof(Expr))
20380 3b 0a 20 20 6d 65 6d 73 65 74 28 26 63 6f 6d 70  ;.  memset(&comp
20390 52 69 67 68 74 2c 20 30 2c 20 73 69 7a 65 6f 66  Right, 0, sizeof
203a0 28 45 78 70 72 29 29 3b 0a 20 20 6d 65 6d 73 65  (Expr));.  memse
203b0 74 28 26 65 78 70 72 41 6e 64 2c 20 30 2c 20 73  t(&exprAnd, 0, s
203c0 69 7a 65 6f 66 28 45 78 70 72 29 29 3b 0a 0a 20  izeof(Expr));.. 
203d0 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
203e0 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
203f0 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
20400 3b 0a 20 20 65 78 70 72 58 20 3d 20 2a 70 45 78  ;.  exprX = *pEx
20410 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 65 78 70  pr->pLeft;.  exp
20420 72 41 6e 64 2e 6f 70 20 3d 20 54 4b 5f 41 4e 44  rAnd.op = TK_AND
20430 3b 0a 20 20 65 78 70 72 41 6e 64 2e 70 4c 65 66  ;.  exprAnd.pLef
20440 74 20 3d 20 26 63 6f 6d 70 4c 65 66 74 3b 0a 20  t = &compLeft;. 
20450 20 65 78 70 72 41 6e 64 2e 70 52 69 67 68 74 20   exprAnd.pRight 
20460 3d 20 26 63 6f 6d 70 52 69 67 68 74 3b 0a 20 20  = &compRight;.  
20470 63 6f 6d 70 4c 65 66 74 2e 6f 70 20 3d 20 54 4b  compLeft.op = TK
20480 5f 47 45 3b 0a 20 20 63 6f 6d 70 4c 65 66 74 2e  _GE;.  compLeft.
20490 70 4c 65 66 74 20 3d 20 26 65 78 70 72 58 3b 0a  pLeft = &exprX;.
204a0 20 20 63 6f 6d 70 4c 65 66 74 2e 70 52 69 67 68    compLeft.pRigh
204b0 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  t = pExpr->x.pLi
204c0 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a  st->a[0].pExpr;.
204d0 20 20 63 6f 6d 70 52 69 67 68 74 2e 6f 70 20 3d    compRight.op =
204e0 20 54 4b 5f 4c 45 3b 0a 20 20 63 6f 6d 70 52 69   TK_LE;.  compRi
204f0 67 68 74 2e 70 4c 65 66 74 20 3d 20 26 65 78 70  ght.pLeft = &exp
20500 72 58 3b 0a 20 20 63 6f 6d 70 52 69 67 68 74 2e  rX;.  compRight.
20510 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e  pRight = pExpr->
20520 78 2e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45  x.pList->a[1].pE
20530 78 70 72 3b 0a 20 20 69 66 28 20 28 65 78 70 72  xpr;.  if( (expr
20540 58 2e 66 6c 61 67 73 20 26 20 45 50 5f 56 65 63  X.flags & EP_Vec
20550 74 6f 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20 65  tor)==0 ){.    e
20560 78 70 72 54 6f 52 65 67 69 73 74 65 72 28 26 65  xprToRegister(&e
20570 78 70 72 58 2c 20 73 71 6c 69 74 65 33 45 78 70  xprX, sqlite3Exp
20580 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
20590 2c 20 26 65 78 70 72 58 2c 20 26 72 65 67 46 72  , &exprX, &regFr
205a0 65 65 31 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ee1));.  }.  if(
205b0 20 78 4a 75 6d 70 49 66 20 29 7b 0a 20 20 20 20   xJumpIf ){.    
205c0 78 4a 75 6d 70 49 66 28 70 50 61 72 73 65 2c 20  xJumpIf(pParse, 
205d0 26 65 78 70 72 41 6e 64 2c 20 64 65 73 74 2c 20  &exprAnd, dest, 
205e0 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 7d  jumpIfNull);.  }
205f0 65 6c 73 65 7b 0a 20 20 20 20 65 78 70 72 58 2e  else{.    exprX.
20600 66 6c 61 67 73 20 7c 3d 20 45 50 5f 46 72 6f 6d  flags |= EP_From
20610 4a 6f 69 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65  Join;.    sqlite
20620 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28  3ExprCodeTarget(
20630 70 50 61 72 73 65 2c 20 26 65 78 70 72 41 6e 64  pParse, &exprAnd
20640 2c 20 64 65 73 74 29 3b 0a 20 20 7d 0a 20 20 73  , dest);.  }.  s
20650 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
20660 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
20670 46 72 65 65 31 29 3b 0a 0a 20 20 2f 2a 20 45 6e  Free1);..  /* En
20680 73 75 72 65 20 61 64 65 71 75 61 74 65 20 74 65  sure adequate te
20690 73 74 20 63 6f 76 65 72 61 67 65 20 2a 2f 0a 20  st coverage */. 
206a0 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
206b0 66 54 72 75 65 3d 3d 30 20 26 26 20 6a 75 6d 70  fTrue==0 && jump
206c0 49 66 4e 75 6c 6c 3d 3d 30 20 26 26 20 72 65 67  IfNull==0 && reg
206d0 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 74 65  Free1==0 );.  te
206e0 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 54 72  stcase( jumpIfTr
206f0 75 65 3d 3d 30 20 26 26 20 6a 75 6d 70 49 66 4e  ue==0 && jumpIfN
20700 75 6c 6c 3d 3d 30 20 26 26 20 72 65 67 46 72 65  ull==0 && regFre
20710 65 31 21 3d 30 20 29 3b 0a 20 20 74 65 73 74 63  e1!=0 );.  testc
20720 61 73 65 28 20 6a 75 6d 70 49 66 54 72 75 65 3d  ase( jumpIfTrue=
20730 3d 30 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c  =0 && jumpIfNull
20740 21 3d 30 20 26 26 20 72 65 67 46 72 65 65 31 3d  !=0 && regFree1=
20750 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =0 );.  testcase
20760 28 20 6a 75 6d 70 49 66 54 72 75 65 3d 3d 30 20  ( jumpIfTrue==0 
20770 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30  && jumpIfNull!=0
20780 20 26 26 20 72 65 67 46 72 65 65 31 21 3d 30 20   && regFree1!=0 
20790 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6a  );.  testcase( j
207a0 75 6d 70 49 66 54 72 75 65 21 3d 30 20 26 26 20  umpIfTrue!=0 && 
207b0 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26  jumpIfNull==0 &&
207c0 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
207d0 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
207e0 49 66 54 72 75 65 21 3d 30 20 26 26 20 6a 75 6d  IfTrue!=0 && jum
207f0 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26 20 72 65  pIfNull==0 && re
20800 67 46 72 65 65 31 21 3d 30 20 29 3b 0a 20 20 74  gFree1!=0 );.  t
20810 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 54  estcase( jumpIfT
20820 72 75 65 21 3d 30 20 26 26 20 6a 75 6d 70 49 66  rue!=0 && jumpIf
20830 4e 75 6c 6c 21 3d 30 20 26 26 20 72 65 67 46 72  Null!=0 && regFr
20840 65 65 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74  ee1==0 );.  test
20850 63 61 73 65 28 20 6a 75 6d 70 49 66 54 72 75 65  case( jumpIfTrue
20860 21 3d 30 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c  !=0 && jumpIfNul
20870 6c 21 3d 30 20 26 26 20 72 65 67 46 72 65 65 31  l!=0 && regFree1
20880 21 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  !=0 );.}../*.** 
20890 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
208a0 72 20 61 20 62 6f 6f 6c 65 61 6e 20 65 78 70 72  r a boolean expr
208b0 65 73 73 69 6f 6e 20 73 75 63 68 20 74 68 61 74  ession such that
208c0 20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 0a   a jump is made.
208d0 2a 2a 20 74 6f 20 74 68 65 20 6c 61 62 65 6c 20  ** to the label 
208e0 22 64 65 73 74 22 20 69 66 20 74 68 65 20 65 78  "dest" if the ex
208f0 70 72 65 73 73 69 6f 6e 20 69 73 20 74 72 75 65  pression is true
20900 20 62 75 74 20 65 78 65 63 75 74 69 6f 6e 0a 2a   but execution.*
20910 2a 20 63 6f 6e 74 69 6e 75 65 73 20 73 74 72 61  * continues stra
20920 69 67 68 74 20 74 68 72 75 20 69 66 20 74 68 65  ight thru if the
20930 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66   expression is f
20940 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  alse..**.** If t
20950 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 65 76  he expression ev
20960 61 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c 20  aluates to NULL 
20970 28 6e 65 69 74 68 65 72 20 74 72 75 65 20 6e 6f  (neither true no
20980 72 20 66 61 6c 73 65 29 2c 20 74 68 65 6e 0a 2a  r false), then.*
20990 2a 20 74 61 6b 65 20 74 68 65 20 6a 75 6d 70 20  * take the jump 
209a0 69 66 20 74 68 65 20 6a 75 6d 70 49 66 4e 75 6c  if the jumpIfNul
209b0 6c 20 66 6c 61 67 20 69 73 20 53 51 4c 49 54 45  l flag is SQLITE
209c0 5f 4a 55 4d 50 49 46 4e 55 4c 4c 2e 0a 2a 2a 0a  _JUMPIFNULL..**.
209d0 2a 2a 20 54 68 69 73 20 63 6f 64 65 20 64 65 70  ** This code dep
209e0 65 6e 64 73 20 6f 6e 20 74 68 65 20 66 61 63 74  ends on the fact
209f0 20 74 68 61 74 20 63 65 72 74 61 69 6e 20 74 6f   that certain to
20a00 6b 65 6e 20 76 61 6c 75 65 73 20 28 65 78 3a 20  ken values (ex: 
20a10 54 4b 5f 45 51 29 0a 2a 2a 20 61 72 65 20 74 68  TK_EQ).** are th
20a20 65 20 73 61 6d 65 20 61 73 20 6f 70 63 6f 64 65  e same as opcode
20a30 20 76 61 6c 75 65 73 20 28 65 78 3a 20 4f 50 5f   values (ex: OP_
20a40 45 71 29 20 74 68 61 74 20 69 6d 70 6c 65 6d 65  Eq) that impleme
20a50 6e 74 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  nt the correspon
20a60 64 69 6e 67 0a 2a 2a 20 6f 70 65 72 61 74 69 6f  ding.** operatio
20a70 6e 2e 20 20 53 70 65 63 69 61 6c 20 63 6f 6d 6d  n.  Special comm
20a80 65 6e 74 73 20 69 6e 20 76 64 62 65 2e 63 20 61  ents in vdbe.c a
20a90 6e 64 20 74 68 65 20 6d 6b 6f 70 63 6f 64 65 68  nd the mkopcodeh
20aa0 2e 61 77 6b 20 73 63 72 69 70 74 20 69 6e 0a 2a  .awk script in.*
20ab0 2a 20 74 68 65 20 6d 61 6b 65 20 70 72 6f 63 65  * the make proce
20ac0 73 73 20 63 61 75 73 65 20 74 68 65 73 65 20 76  ss cause these v
20ad0 61 6c 75 65 73 20 74 6f 20 61 6c 69 67 6e 2e 20  alues to align. 
20ae0 20 41 73 73 65 72 74 28 29 73 20 69 6e 20 74 68   Assert()s in th
20af0 65 20 63 6f 64 65 0a 2a 2a 20 62 65 6c 6f 77 20  e code.** below 
20b00 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  verify that the 
20b10 6e 75 6d 62 65 72 73 20 61 72 65 20 61 6c 69 67  numbers are alig
20b20 6e 65 64 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a  ned correctly..*
20b30 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
20b40 70 72 49 66 54 72 75 65 28 50 61 72 73 65 20 2a  prIfTrue(Parse *
20b50 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
20b60 78 70 72 2c 20 69 6e 74 20 64 65 73 74 2c 20 69  xpr, int dest, i
20b70 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a  nt jumpIfNull){.
20b80 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
20b90 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
20ba0 20 6f 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72   op = 0;.  int r
20bb0 65 67 46 72 65 65 31 20 3d 20 30 3b 0a 20 20 69  egFree1 = 0;.  i
20bc0 6e 74 20 72 65 67 46 72 65 65 32 20 3d 20 30 3b  nt regFree2 = 0;
20bd0 0a 20 20 69 6e 74 20 72 31 2c 20 72 32 3b 0a 0a  .  int r1, r2;..
20be0 20 20 61 73 73 65 72 74 28 20 6a 75 6d 70 49 66    assert( jumpIf
20bf0 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4a 55 4d  Null==SQLITE_JUM
20c00 50 49 46 4e 55 4c 4c 20 7c 7c 20 6a 75 6d 70 49  PIFNULL || jumpI
20c10 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 69 66  fNull==0 );.  if
20c20 28 20 4e 45 56 45 52 28 76 3d 3d 30 29 20 29 20  ( NEVER(v==0) ) 
20c30 20 20 20 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20      return;  /* 
20c40 45 78 69 73 74 65 6e 63 65 20 6f 66 20 56 44 42  Existence of VDB
20c50 45 20 63 68 65 63 6b 65 64 20 62 79 20 63 61 6c  E checked by cal
20c60 6c 65 72 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56  ler */.  if( NEV
20c70 45 52 28 70 45 78 70 72 3d 3d 30 29 20 29 20 72  ER(pExpr==0) ) r
20c80 65 74 75 72 6e 3b 20 20 2f 2a 20 4e 6f 20 77 61  eturn;  /* No wa
20c90 79 20 74 68 69 73 20 63 61 6e 20 68 61 70 70 65  y this can happe
20ca0 6e 20 2a 2f 0a 20 20 6f 70 20 3d 20 70 45 78 70  n */.  op = pExp
20cb0 72 2d 3e 6f 70 3b 0a 20 20 73 77 69 74 63 68 28  r->op;.  switch(
20cc0 20 6f 70 20 7c 20 28 70 45 78 70 72 2d 3e 70 4c   op | (pExpr->pL
20cd0 65 66 74 20 3f 20 28 70 45 78 70 72 2d 3e 70 4c  eft ? (pExpr->pL
20ce0 65 66 74 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  eft->flags & EP_
20cf0 56 65 63 74 6f 72 29 20 3a 20 30 29 29 7b 0a 20  Vector) : 0)){. 
20d00 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20     case TK_AND: 
20d10 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 32 20 3d  {.      int d2 =
20d20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
20d30 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
20d40 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
20d50 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Null==0 );.     
20d60 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
20d70 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  lse(pParse, pExp
20d80 72 2d 3e 70 4c 65 66 74 2c 20 64 32 2c 6a 75 6d  r->pLeft, d2,jum
20d90 70 49 66 4e 75 6c 6c 5e 53 51 4c 49 54 45 5f 4a  pIfNull^SQLITE_J
20da0 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20  UMPIFNULL);.    
20db0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
20dc0 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a  hePush(pParse);.
20dd0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
20de0 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20  rIfTrue(pParse, 
20df0 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64  pExpr->pRight, d
20e00 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
20e10 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
20e20 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
20e30 76 2c 20 64 32 29 3b 0a 20 20 20 20 20 20 73 71  v, d2);.      sq
20e40 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f  lite3ExprCachePo
20e50 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  p(pParse);.     
20e60 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
20e70 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a    case TK_OR: {.
20e80 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
20e90 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
20ea0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
20eb0 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c  prIfTrue(pParse,
20ec0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64   pExpr->pLeft, d
20ed0 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
20ee0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
20ef0 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61  xprCachePush(pPa
20f00 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  rse);.      sqli
20f10 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50  te3ExprIfTrue(pP
20f20 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69  arse, pExpr->pRi
20f30 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49  ght, dest, jumpI
20f40 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71  fNull);.      sq
20f50 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f  lite3ExprCachePo
20f60 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  p(pParse);.     
20f70 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
20f80 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b    case TK_NOT: {
20f90 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
20fa0 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
20fb0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
20fc0 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
20fd0 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
20fe0 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
20ff0 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  l);.      break;
21000 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
21010 54 4b 5f 49 53 3a 0a 20 20 20 20 63 61 73 65 20  TK_IS:.    case 
21020 54 4b 5f 49 53 4e 4f 54 3a 0a 20 20 20 20 20 20  TK_ISNOT:.      
21030 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
21040 5f 49 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _IS );.      tes
21050 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53  tcase( op==TK_IS
21060 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20 6f 70 20  NOT );.      op 
21070 3d 20 28 6f 70 3d 3d 54 4b 5f 49 53 29 20 3f 20  = (op==TK_IS) ? 
21080 54 4b 5f 45 51 20 3a 20 54 4b 5f 4e 45 3b 0a 20  TK_EQ : TK_NE;. 
21090 20 20 20 20 20 6a 75 6d 70 49 66 4e 75 6c 6c 20       jumpIfNull 
210a0 3d 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 3b  = SQLITE_NULLEQ;
210b0 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74  .      /* Fall t
210c0 68 72 75 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  hru */.    case 
210d0 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65 20  TK_LT:.    case 
210e0 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_LE:.    case 
210f0 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65 20  TK_GT:.    case 
21100 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_GE:.    case 
21110 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_NE:.    case 
21120 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20 74  TK_EQ: {.      t
21130 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e  estcase( jumpIfN
21140 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ull==0 );.      
21150 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
21160 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
21170 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26   pExpr->pLeft, &
21180 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
21190 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r2 = sqlite3Exp
211a0 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
211b0 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
211c0 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20   &regFree2);.   
211d0 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70     codeCompare(p
211e0 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
211f0 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  eft, pExpr->pRig
21200 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20 20  ht, op,.        
21210 20 20 20 20 20 20 20 20 20 20 72 31 2c 20 72 32            r1, r2
21220 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
21230 6c 6c 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ll);.      asser
21240 74 28 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 29 3b  t(TK_LT==OP_Lt);
21250 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50   testcase(op==OP
21260 5f 4c 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61  _Lt); VdbeCovera
21270 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 74  geIf(v,op==OP_Lt
21280 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
21290 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 29 3b 20 74  TK_LE==OP_Le); t
212a0 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c  estcase(op==OP_L
212b0 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  e); VdbeCoverage
212c0 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 65 29 3b  If(v,op==OP_Le);
212d0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b  .      assert(TK
212e0 5f 47 54 3d 3d 4f 50 5f 47 74 29 3b 20 74 65 73  _GT==OP_Gt); tes
212f0 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 74 29  tcase(op==OP_Gt)
21300 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66  ; VdbeCoverageIf
21310 28 76 2c 6f 70 3d 3d 4f 50 5f 47 74 29 3b 0a 20  (v,op==OP_Gt);. 
21320 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 47       assert(TK_G
21330 45 3d 3d 4f 50 5f 47 65 29 3b 20 74 65 73 74 63  E==OP_Ge); testc
21340 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 65 29 3b 20  ase(op==OP_Ge); 
21350 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
21360 2c 6f 70 3d 3d 4f 50 5f 47 65 29 3b 0a 20 20 20  ,op==OP_Ge);.   
21370 20 20 20 61 73 73 65 72 74 28 54 4b 5f 45 51 3d     assert(TK_EQ=
21380 3d 4f 50 5f 45 71 29 3b 20 74 65 73 74 63 61 73  =OP_Eq); testcas
21390 65 28 6f 70 3d 3d 4f 50 5f 45 71 29 3b 0a 20 20  e(op==OP_Eq);.  
213a0 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
213b0 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 45 71 20  If(v, op==OP_Eq 
213c0 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53  && jumpIfNull==S
213d0 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20  QLITE_NULLEQ);. 
213e0 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
213f0 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 45 71  eIf(v, op==OP_Eq
21400 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d   && jumpIfNull!=
21410 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a  SQLITE_NULLEQ);.
21420 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f        assert(TK_
21430 4e 45 3d 3d 4f 50 5f 4e 65 29 3b 20 74 65 73 74  NE==OP_Ne); test
21440 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4e 65 29 3b  case(op==OP_Ne);
21450 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
21460 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f  ageIf(v, op==OP_
21470 4e 65 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c  Ne && jumpIfNull
21480 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29  ==SQLITE_NULLEQ)
21490 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
214a0 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50  rageIf(v, op==OP
214b0 5f 4e 65 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c  _Ne && jumpIfNul
214c0 6c 21 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51  l!=SQLITE_NULLEQ
214d0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
214e0 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  e( regFree1==0 )
214f0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
21500 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b  ( regFree2==0 );
21510 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
21520 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
21530 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65  ISNULL:.    case
21540 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20   TK_NOTNULL: {. 
21550 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
21560 49 53 4e 55 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c  ISNULL==OP_IsNul
21570 6c 20 29 3b 20 20 20 74 65 73 74 63 61 73 65 28  l );   testcase(
21580 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29   op==TK_ISNULL )
21590 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
215a0 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e  TK_NOTNULL==OP_N
215b0 6f 74 4e 75 6c 6c 20 29 3b 20 74 65 73 74 63 61  otNull ); testca
215c0 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55  se( op==TK_NOTNU
215d0 4c 4c 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d  LL );.      r1 =
215e0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
215f0 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
21600 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46  pr->pLeft, &regF
21610 72 65 65 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  ree1);.      sql
21620 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
21630 2c 20 6f 70 2c 20 72 31 2c 20 64 65 73 74 29 3b  , op, r1, dest);
21640 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
21650 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f  ageIf(v, op==TK_
21660 49 53 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 56  ISNULL);.      V
21670 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
21680 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 29   op==TK_NOTNULL)
21690 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
216a0 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  ( regFree1==0 );
216b0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
216c0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
216d0 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20  BETWEEN: {.     
216e0 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
216f0 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  fNull==0 );.    
21700 20 20 65 78 70 72 43 6f 64 65 42 65 74 77 65 65    exprCodeBetwee
21710 6e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  n(pParse, pExpr,
21720 20 64 65 73 74 2c 20 73 71 6c 69 74 65 33 45 78   dest, sqlite3Ex
21730 70 72 49 66 54 72 75 65 2c 20 6a 75 6d 70 49 66  prIfTrue, jumpIf
21740 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65  Null);.      bre
21750 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  ak;.    }.#ifnde
21760 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
21770 42 51 55 45 52 59 0a 20 20 20 20 63 61 73 65 20  BQUERY.    case 
21780 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69  TK_IN: {.      i
21790 6e 74 20 64 65 73 74 49 66 46 61 6c 73 65 20 3d  nt destIfFalse =
217a0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
217b0 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
217c0 69 6e 74 20 64 65 73 74 49 66 4e 75 6c 6c 20 3d  int destIfNull =
217d0 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 3f 20 64 65   jumpIfNull ? de
217e0 73 74 20 3a 20 64 65 73 74 49 66 46 61 6c 73 65  st : destIfFalse
217f0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
21800 78 70 72 43 6f 64 65 49 4e 28 70 50 61 72 73 65  xprCodeIN(pParse
21810 2c 20 70 45 78 70 72 2c 20 64 65 73 74 49 66 46  , pExpr, destIfF
21820 61 6c 73 65 2c 20 64 65 73 74 49 66 4e 75 6c 6c  alse, destIfNull
21830 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
21840 56 64 62 65 47 6f 74 6f 28 76 2c 20 64 65 73 74  VdbeGoto(v, dest
21850 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
21860 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
21870 28 76 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29  (v, destIfFalse)
21880 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
21890 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
218a0 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
218b0 20 69 66 28 20 65 78 70 72 41 6c 77 61 79 73 54   if( exprAlwaysT
218c0 72 75 65 28 70 45 78 70 72 29 20 29 7b 0a 20 20  rue(pExpr) ){.  
218d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
218e0 65 47 6f 74 6f 28 76 2c 20 64 65 73 74 29 3b 0a  eGoto(v, dest);.
218f0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
21900 65 78 70 72 41 6c 77 61 79 73 46 61 6c 73 65 28  exprAlwaysFalse(
21910 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20  pExpr) ){.      
21920 20 20 2f 2a 20 4e 6f 2d 6f 70 20 2a 2f 0a 20 20    /* No-op */.  
21930 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
21940 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
21950 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
21960 73 65 2c 20 70 45 78 70 72 2c 20 26 72 65 67 46  se, pExpr, &regF
21970 72 65 65 31 29 3b 0a 20 20 20 20 20 20 20 20 73  ree1);.        s
21980 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
21990 28 76 2c 20 4f 50 5f 49 66 2c 20 72 31 2c 20 64  (v, OP_If, r1, d
219a0 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 21  est, jumpIfNull!
219b0 3d 30 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62  =0);.        Vdb
219c0 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
219d0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
219e0 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
219f0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
21a00 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
21a10 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
21a20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
21a30 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
21a40 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
21a50 20 72 65 67 46 72 65 65 31 29 3b 0a 20 20 73 71   regFree1);.  sq
21a60 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
21a70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46  Reg(pParse, regF
21a80 72 65 65 32 29 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a  ree2);  .}../*.*
21a90 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
21aa0 66 6f 72 20 61 20 62 6f 6f 6c 65 61 6e 20 65 78  for a boolean ex
21ab0 70 72 65 73 73 69 6f 6e 20 73 75 63 68 20 74 68  pression such th
21ac0 61 74 20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64  at a jump is mad
21ad0 65 0a 2a 2a 20 74 6f 20 74 68 65 20 6c 61 62 65  e.** to the labe
21ae0 6c 20 22 64 65 73 74 22 20 69 66 20 74 68 65 20  l "dest" if the 
21af0 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66 61  expression is fa
21b00 6c 73 65 20 62 75 74 20 65 78 65 63 75 74 69 6f  lse but executio
21b10 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 73 20 73  n.** continues s
21b20 74 72 61 69 67 68 74 20 74 68 72 75 20 69 66 20  traight thru if 
21b30 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
21b40 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  s true..**.** If
21b50 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
21b60 65 76 61 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c  evaluates to NUL
21b70 4c 20 28 6e 65 69 74 68 65 72 20 74 72 75 65 20  L (neither true 
21b80 6e 6f 72 20 66 61 6c 73 65 29 20 74 68 65 6e 0a  nor false) then.
21b90 2a 2a 20 6a 75 6d 70 20 69 66 20 6a 75 6d 70 49  ** jump if jumpI
21ba0 66 4e 75 6c 6c 20 69 73 20 53 51 4c 49 54 45 5f  fNull is SQLITE_
21bb0 4a 55 4d 50 49 46 4e 55 4c 4c 20 6f 72 20 66 61  JUMPIFNULL or fa
21bc0 6c 6c 20 74 68 72 6f 75 67 68 20 69 66 20 6a 75  ll through if ju
21bd0 6d 70 49 66 4e 75 6c 6c 0a 2a 2a 20 69 73 20 30  mpIfNull.** is 0
21be0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
21bf0 33 45 78 70 72 49 66 46 61 6c 73 65 28 50 61 72  3ExprIfFalse(Par
21c00 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
21c10 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 64 65 73   *pExpr, int des
21c20 74 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c  t, int jumpIfNul
21c30 6c 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  l){.  Vdbe *v = 
21c40 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
21c50 20 69 6e 74 20 6f 70 20 3d 20 30 3b 0a 20 20 69   int op = 0;.  i
21c60 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b  nt regFree1 = 0;
21c70 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65 32 20  .  int regFree2 
21c80 3d 20 30 3b 0a 20 20 69 6e 74 20 72 31 2c 20 72  = 0;.  int r1, r
21c90 32 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6a 75  2;..  assert( ju
21ca0 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45  mpIfNull==SQLITE
21cb0 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 7c 7c 20 6a  _JUMPIFNULL || j
21cc0 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
21cd0 20 20 69 66 28 20 4e 45 56 45 52 28 76 3d 3d 30    if( NEVER(v==0
21ce0 29 20 29 20 72 65 74 75 72 6e 3b 20 2f 2a 20 45  ) ) return; /* E
21cf0 78 69 73 74 65 6e 63 65 20 6f 66 20 56 44 42 45  xistence of VDBE
21d00 20 63 68 65 63 6b 65 64 20 62 79 20 63 61 6c 6c   checked by call
21d10 65 72 20 2a 2f 0a 20 20 69 66 28 20 70 45 78 70  er */.  if( pExp
21d20 72 3d 3d 30 20 29 20 20 20 20 72 65 74 75 72 6e  r==0 )    return
21d30 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 76 61 6c 75  ;..  /* The valu
21d40 65 20 6f 66 20 70 45 78 70 72 2d 3e 6f 70 20 61  e of pExpr->op a
21d50 6e 64 20 6f 70 20 61 72 65 20 72 65 6c 61 74 65  nd op are relate
21d60 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20  d as follows:.  
21d70 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 70 45  **.  **       pE
21d80 78 70 72 2d 3e 6f 70 20 20 20 20 20 20 20 20 20  xpr->op         
21d90 20 20 20 6f 70 0a 20 20 2a 2a 20 20 20 20 20 20     op.  **      
21da0 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 20   ---------      
21db0 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20      ----------. 
21dc0 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 49 53 4e   **       TK_ISN
21dd0 55 4c 4c 20 20 20 20 20 20 20 20 20 20 4f 50 5f  ULL          OP_
21de0 4e 6f 74 4e 75 6c 6c 0a 20 20 2a 2a 20 20 20 20  NotNull.  **    
21df0 20 20 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 20 20     TK_NOTNULL   
21e00 20 20 20 20 20 20 4f 50 5f 49 73 4e 75 6c 6c 0a        OP_IsNull.
21e10 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4e 45    **       TK_NE
21e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50                OP
21e30 5f 45 71 0a 20 20 2a 2a 20 20 20 20 20 20 20 54  _Eq.  **       T
21e40 4b 5f 45 51 20 20 20 20 20 20 20 20 20 20 20 20  K_EQ            
21e50 20 20 4f 50 5f 4e 65 0a 20 20 2a 2a 20 20 20 20    OP_Ne.  **    
21e60 20 20 20 54 4b 5f 47 54 20 20 20 20 20 20 20 20     TK_GT        
21e70 20 20 20 20 20 20 4f 50 5f 4c 65 0a 20 20 2a 2a        OP_Le.  **
21e80 20 20 20 20 20 20 20 54 4b 5f 4c 45 20 20 20 20         TK_LE    
21e90 20 20 20 20 20 20 20 20 20 20 4f 50 5f 47 74 0a            OP_Gt.
21ea0 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 47 45    **       TK_GE
21eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50                OP
21ec0 5f 4c 74 0a 20 20 2a 2a 20 20 20 20 20 20 20 54  _Lt.  **       T
21ed0 4b 5f 4c 54 20 20 20 20 20 20 20 20 20 20 20 20  K_LT            
21ee0 20 20 4f 50 5f 47 65 0a 20 20 2a 2a 0a 20 20 2a    OP_Ge.  **.  *
21ef0 2a 20 46 6f 72 20 6f 74 68 65 72 20 76 61 6c 75  * For other valu
21f00 65 73 20 6f 66 20 70 45 78 70 72 2d 3e 6f 70 2c  es of pExpr->op,
21f10 20 6f 70 20 69 73 20 75 6e 64 65 66 69 6e 65 64   op is undefined
21f20 20 61 6e 64 20 75 6e 75 73 65 64 2e 0a 20 20 2a   and unused..  *
21f30 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20 54  * The value of T
21f40 4b 5f 20 61 6e 64 20 4f 50 5f 20 63 6f 6e 73 74  K_ and OP_ const
21f50 61 6e 74 73 20 61 72 65 20 61 72 72 61 6e 67 65  ants are arrange
21f60 64 20 73 75 63 68 20 74 68 61 74 20 77 65 0a 20  d such that we. 
21f70 20 2a 2a 20 63 61 6e 20 63 6f 6d 70 75 74 65 20   ** can compute 
21f80 74 68 65 20 6d 61 70 70 69 6e 67 20 61 62 6f 76  the mapping abov
21f90 65 20 75 73 69 6e 67 20 74 68 65 20 66 6f 6c 6c  e using the foll
21fa0 6f 77 69 6e 67 20 65 78 70 72 65 73 73 69 6f 6e  owing expression
21fb0 2e 0a 20 20 2a 2a 20 41 73 73 65 72 74 28 29 73  ..  ** Assert()s
21fc0 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65   verify that the
21fd0 20 63 6f 6d 70 75 74 61 74 69 6f 6e 20 69 73 20   computation is 
21fe0 63 6f 72 72 65 63 74 2e 0a 20 20 2a 2f 0a 20 20  correct..  */.  
21ff0 6f 70 20 3d 20 28 28 70 45 78 70 72 2d 3e 6f 70  op = ((pExpr->op
22000 2b 28 54 4b 5f 49 53 4e 55 4c 4c 26 31 29 29 5e  +(TK_ISNULL&1))^
22010 31 29 2d 28 54 4b 5f 49 53 4e 55 4c 4c 26 31 29  1)-(TK_ISNULL&1)
22020 3b 0a 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 63  ;..  /* Verify c
22030 6f 72 72 65 63 74 20 61 6c 69 67 6e 6d 65 6e 74  orrect alignment
22040 20 6f 66 20 54 4b 5f 20 61 6e 64 20 4f 50 5f 20   of TK_ and OP_ 
22050 63 6f 6e 73 74 61 6e 74 73 0a 20 20 2a 2f 0a 20  constants.  */. 
22060 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
22070 6f 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20 7c 7c  op!=TK_ISNULL ||
22080 20 6f 70 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20   op==OP_NotNull 
22090 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
220a0 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 4f 54 4e 55  pr->op!=TK_NOTNU
220b0 4c 4c 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 49 73 4e  LL || op==OP_IsN
220c0 75 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ull );.  assert(
220d0 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4e   pExpr->op!=TK_N
220e0 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 45 71 20 29  E || op==OP_Eq )
220f0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
22100 72 2d 3e 6f 70 21 3d 54 4b 5f 45 51 20 7c 7c 20  r->op!=TK_EQ || 
22110 6f 70 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20 61  op==OP_Ne );.  a
22120 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
22130 21 3d 54 4b 5f 4c 54 20 7c 7c 20 6f 70 3d 3d 4f  !=TK_LT || op==O
22140 50 5f 47 65 20 29 3b 0a 20 20 61 73 73 65 72 74  P_Ge );.  assert
22150 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
22160 4c 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 74 20  LE || op==OP_Gt 
22170 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
22180 70 72 2d 3e 6f 70 21 3d 54 4b 5f 47 54 20 7c 7c  pr->op!=TK_GT ||
22190 20 6f 70 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20   op==OP_Le );.  
221a0 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
221b0 70 21 3d 54 4b 5f 47 45 20 7c 7c 20 6f 70 3d 3d  p!=TK_GE || op==
221c0 4f 50 5f 4c 74 20 29 3b 0a 0a 20 20 73 77 69 74  OP_Lt );..  swit
221d0 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b  ch( pExpr->op ){
221e0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44  .    case TK_AND
221f0 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61  : {.      testca
22200 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  se( jumpIfNull==
22210 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 );.      sqlit
22220 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
22230 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
22240 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  ft, dest, jumpIf
22250 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c  Null);.      sql
22260 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73  ite3ExprCachePus
22270 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  h(pParse);.     
22280 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
22290 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  lse(pParse, pExp
222a0 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c  r->pRight, dest,
222b0 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
222c0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
222d0 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b  achePop(pParse);
222e0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
222f0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
22300 4f 52 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  OR: {.      int 
22310 64 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  d2 = sqlite3Vdbe
22320 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
22330 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75      testcase( ju
22340 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
22350 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
22360 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70  IfTrue(pParse, p
22370 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 32 2c  Expr->pLeft, d2,
22380 20 6a 75 6d 70 49 66 4e 75 6c 6c 5e 53 51 4c 49   jumpIfNull^SQLI
22390 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a  TE_JUMPIFNULL);.
223a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
223b0 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73  rCachePush(pPars
223c0 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
223d0 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
223e0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
223f0 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  ht, dest, jumpIf
22400 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c  Null);.      sql
22410 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
22420 61 62 65 6c 28 76 2c 20 64 32 29 3b 0a 20 20 20  abel(v, d2);.   
22430 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
22440 63 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a  chePop(pParse);.
22450 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
22460 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e   }.    case TK_N
22470 4f 54 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74  OT: {.      test
22480 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  case( jumpIfNull
22490 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ==0 );.      sql
224a0 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70  ite3ExprIfTrue(p
224b0 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
224c0 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49  eft, dest, jumpI
224d0 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72  fNull);.      br
224e0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
224f0 61 73 65 20 54 4b 5f 49 53 3a 0a 20 20 20 20 63  ase TK_IS:.    c
22500 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 0a 20 20  ase TK_ISNOT:.  
22510 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
22520 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 29  xpr->op==TK_IS )
22530 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
22540 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
22550 49 53 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20 6f  ISNOT );.      o
22560 70 20 3d 20 28 70 45 78 70 72 2d 3e 6f 70 3d 3d  p = (pExpr->op==
22570 54 4b 5f 49 53 29 20 3f 20 54 4b 5f 4e 45 20 3a  TK_IS) ? TK_NE :
22580 20 54 4b 5f 45 51 3b 0a 20 20 20 20 20 20 6a 75   TK_EQ;.      ju
22590 6d 70 49 66 4e 75 6c 6c 20 3d 20 53 51 4c 49 54  mpIfNull = SQLIT
225a0 45 5f 4e 55 4c 4c 45 51 3b 0a 20 20 20 20 20 20  E_NULLEQ;.      
225b0 2f 2a 20 46 61 6c 6c 20 74 68 72 75 20 2a 2f 0a  /* Fall thru */.
225c0 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a      case TK_LT:.
225d0 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a      case TK_LE:.
225e0 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a      case TK_GT:.
225f0 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a      case TK_GE:.
22600 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a      case TK_NE:.
22610 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20      case TK_EQ: 
22620 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  {.      if( pExp
22630 72 2d 3e 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20  r->pLeft->flags 
22640 26 20 45 50 5f 56 65 63 74 6f 72 20 29 20 67 6f  & EP_Vector ) go
22650 74 6f 20 64 65 66 61 75 6c 74 5f 65 78 70 72 3b  to default_expr;
22660 0a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ..      testcase
22670 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  ( jumpIfNull==0 
22680 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71  );.      r1 = sq
22690 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
226a0 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
226b0 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65  >pLeft, &regFree
226c0 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73  1);.      r2 = s
226d0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
226e0 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
226f0 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46 72  ->pRight, &regFr
22700 65 65 32 29 3b 0a 20 20 20 20 20 20 63 6f 64 65  ee2);.      code
22710 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20  Compare(pParse, 
22720 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45  pExpr->pLeft, pE
22730 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c  xpr->pRight, op,
22740 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
22750 20 20 20 72 31 2c 20 72 32 2c 20 64 65 73 74 2c     r1, r2, dest,
22760 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
22770 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4c 54      assert(TK_LT
22780 3d 3d 4f 50 5f 4c 74 29 3b 20 74 65 73 74 63 61  ==OP_Lt); testca
22790 73 65 28 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 20 56  se(op==OP_Lt); V
227a0 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
227b0 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a 20 20 20 20  op==OP_Lt);.    
227c0 20 20 61 73 73 65 72 74 28 54 4b 5f 4c 45 3d 3d    assert(TK_LE==
227d0 4f 50 5f 4c 65 29 3b 20 74 65 73 74 63 61 73 65  OP_Le); testcase
227e0 28 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 20 56 64 62  (op==OP_Le); Vdb
227f0 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70  eCoverageIf(v,op
22800 3d 3d 4f 50 5f 4c 65 29 3b 0a 20 20 20 20 20 20  ==OP_Le);.      
22810 61 73 73 65 72 74 28 54 4b 5f 47 54 3d 3d 4f 50  assert(TK_GT==OP
22820 5f 47 74 29 3b 20 74 65 73 74 63 61 73 65 28 6f  _Gt); testcase(o
22830 70 3d 3d 4f 50 5f 47 74 29 3b 20 56 64 62 65 43  p==OP_Gt); VdbeC
22840 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d  overageIf(v,op==
22850 4f 50 5f 47 74 29 3b 0a 20 20 20 20 20 20 61 73  OP_Gt);.      as
22860 73 65 72 74 28 54 4b 5f 47 45 3d 3d 4f 50 5f 47  sert(TK_GE==OP_G
22870 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d  e); testcase(op=
22880 3d 4f 50 5f 47 65 29 3b 20 56 64 62 65 43 6f 76  =OP_Ge); VdbeCov
22890 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50  erageIf(v,op==OP
228a0 5f 47 65 29 3b 0a 20 20 20 20 20 20 61 73 73 65  _Ge);.      asse
228b0 72 74 28 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71 29  rt(TK_EQ==OP_Eq)
228c0 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f  ; testcase(op==O
228d0 50 5f 45 71 29 3b 0a 20 20 20 20 20 20 56 64 62  P_Eq);.      Vdb
228e0 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f  eCoverageIf(v, o
228f0 70 3d 3d 4f 50 5f 45 71 20 26 26 20 6a 75 6d 70  p==OP_Eq && jump
22900 49 66 4e 75 6c 6c 21 3d 53 51 4c 49 54 45 5f 4e  IfNull!=SQLITE_N
22910 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 56 64  ULLEQ);.      Vd
22920 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
22930 6f 70 3d 3d 4f 50 5f 45 71 20 26 26 20 6a 75 6d  op==OP_Eq && jum
22940 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f  pIfNull==SQLITE_
22950 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 61  NULLEQ);.      a
22960 73 73 65 72 74 28 54 4b 5f 4e 45 3d 3d 4f 50 5f  ssert(TK_NE==OP_
22970 4e 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70  Ne); testcase(op
22980 3d 3d 4f 50 5f 4e 65 29 3b 0a 20 20 20 20 20 20  ==OP_Ne);.      
22990 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
229a0 2c 20 6f 70 3d 3d 4f 50 5f 4e 65 20 26 26 20 6a  , op==OP_Ne && j
229b0 75 6d 70 49 66 4e 75 6c 6c 21 3d 53 51 4c 49 54  umpIfNull!=SQLIT
229c0 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20  E_NULLEQ);.     
229d0 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
229e0 76 2c 20 6f 70 3d 3d 4f 50 5f 4e 65 20 26 26 20  v, op==OP_Ne && 
229f0 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49  jumpIfNull==SQLI
22a00 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20  TE_NULLEQ);.    
22a10 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
22a20 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
22a30 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
22a40 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee2==0 );.      
22a50 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
22a60 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a   case TK_ISNULL:
22a70 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54  .    case TK_NOT
22a80 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 72 31  NULL: {.      r1
22a90 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
22aa0 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
22ab0 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65  Expr->pLeft, &re
22ac0 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 73  gFree1);.      s
22ad0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
22ae0 28 76 2c 20 6f 70 2c 20 72 31 2c 20 64 65 73 74  (v, op, r1, dest
22af0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
22b00 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c  e( op==TK_ISNULL
22b10 20 29 3b 20 20 20 56 64 62 65 43 6f 76 65 72 61   );   VdbeCovera
22b20 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 49  geIf(v, op==TK_I
22b30 53 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 74 65  SNULL);.      te
22b40 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e  stcase( op==TK_N
22b50 4f 54 4e 55 4c 4c 20 29 3b 20 20 56 64 62 65 43  OTNULL );  VdbeC
22b60 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d  overageIf(v, op=
22b70 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a 20 20  =TK_NOTNULL);.  
22b80 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
22b90 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20  gFree1==0 );.   
22ba0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
22bb0 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54 57      case TK_BETW
22bc0 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 74 65 73  EEN: {.      tes
22bd0 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c  tcase( jumpIfNul
22be0 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 65 78  l==0 );.      ex
22bf0 70 72 43 6f 64 65 42 65 74 77 65 65 6e 28 70 50  prCodeBetween(pP
22c00 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64 65 73  arse, pExpr, des
22c10 74 2c 20 73 71 6c 69 74 65 33 45 78 70 72 49 66  t, sqlite3ExprIf
22c20 46 61 6c 73 65 2c 20 6a 75 6d 70 49 66 4e 75 6c  False, jumpIfNul
22c30 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  l);.      break;
22c40 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
22c50 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
22c60 45 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ERY.    case TK_
22c70 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  IN: {.      if( 
22c80 6a 75 6d 70 49 66 4e 75 6c 6c 20 29 7b 0a 20 20  jumpIfNull ){.  
22c90 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
22ca0 72 43 6f 64 65 49 4e 28 70 50 61 72 73 65 2c 20  rCodeIN(pParse, 
22cb0 70 45 78 70 72 2c 20 64 65 73 74 2c 20 64 65 73  pExpr, dest, des
22cc0 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  t);.      }else{
22cd0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 64 65 73  .        int des
22ce0 74 49 66 4e 75 6c 6c 20 3d 20 73 71 6c 69 74 65  tIfNull = sqlite
22cf0 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
22d00 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
22d10 65 33 45 78 70 72 43 6f 64 65 49 4e 28 70 50 61  e3ExprCodeIN(pPa
22d20 72 73 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74  rse, pExpr, dest
22d30 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20  , destIfNull);. 
22d40 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
22d50 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
22d60 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20  , destIfNull);. 
22d70 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
22d80 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
22d90 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
22da0 20 20 20 20 64 65 66 61 75 6c 74 5f 65 78 70 72      default_expr
22db0 3a 20 0a 20 20 20 20 20 20 69 66 28 20 65 78 70  : .      if( exp
22dc0 72 41 6c 77 61 79 73 46 61 6c 73 65 28 70 45 78  rAlwaysFalse(pEx
22dd0 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73  pr) ){.        s
22de0 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76  qlite3VdbeGoto(v
22df0 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 7d  , dest);.      }
22e00 65 6c 73 65 20 69 66 28 20 65 78 70 72 41 6c 77  else if( exprAlw
22e10 61 79 73 54 72 75 65 28 70 45 78 70 72 29 20 29  aysTrue(pExpr) )
22e20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 6e 6f 2d  {.        /* no-
22e30 6f 70 20 2a 2f 0a 20 20 20 20 20 20 7d 65 6c 73  op */.      }els
22e40 65 7b 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20  e{.        r1 = 
22e50 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
22e60 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
22e70 72 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20  r, &regFree1);. 
22e80 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
22e90 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
22ea0 66 4e 6f 74 2c 20 72 31 2c 20 64 65 73 74 2c 20  fNot, r1, dest, 
22eb0 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 29 3b 0a  jumpIfNull!=0);.
22ec0 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
22ed0 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
22ee0 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
22ef0 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee1==0 );.      
22f00 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
22f10 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  IfNull==0 );.   
22f20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
22f30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
22f40 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
22f50 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46  Reg(pParse, regF
22f60 72 65 65 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  ree1);.  sqlite3
22f70 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
22f80 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 32 29  Parse, regFree2)
22f90 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 69 6b 65 20  ;.}../*.** Like 
22fa0 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
22fb0 73 65 28 29 20 65 78 63 65 70 74 20 74 68 61 74  se() except that
22fc0 20 61 20 63 6f 70 79 20 69 73 20 6d 61 64 65 20   a copy is made 
22fd0 6f 66 20 70 45 78 70 72 20 62 65 66 6f 72 65 0a  of pExpr before.
22fe0 2a 2a 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69  ** code generati
22ff0 6f 6e 2c 20 61 6e 64 20 74 68 61 74 20 63 6f 70  on, and that cop
23000 79 20 69 73 20 64 65 6c 65 74 65 64 20 61 66 74  y is deleted aft
23010 65 72 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69  er code generati
23020 6f 6e 2e 20 54 68 69 73 0a 2a 2a 20 65 6e 73 75  on. This.** ensu
23030 72 65 73 20 74 68 61 74 20 74 68 65 20 6f 72 69  res that the ori
23040 67 69 6e 61 6c 20 70 45 78 70 72 20 69 73 20 75  ginal pExpr is u
23050 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 76 6f 69  nchanged..*/.voi
23060 64 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46  d sqlite3ExprIfF
23070 61 6c 73 65 44 75 70 28 50 61 72 73 65 20 2a 70  alseDup(Parse *p
23080 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
23090 70 72 2c 20 69 6e 74 20 64 65 73 74 2c 69 6e 74  pr, int dest,int
230a0 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20   jumpIfNull){.  
230b0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
230c0 61 72 73 65 2d 3e 64 62 3b 0a 20 20 45 78 70 72  arse->db;.  Expr
230d0 20 2a 70 43 6f 70 79 20 3d 20 73 71 6c 69 74 65   *pCopy = sqlite
230e0 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 45 78  3ExprDup(db, pEx
230f0 70 72 2c 20 30 29 3b 0a 20 20 69 66 28 20 64 62  pr, 0);.  if( db
23100 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d  ->mallocFailed==
23110 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
23120 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
23130 73 65 2c 20 70 43 6f 70 79 2c 20 64 65 73 74 2c  se, pCopy, dest,
23140 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
23150 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  }.  sqlite3ExprD
23160 65 6c 65 74 65 28 64 62 2c 20 70 43 6f 70 79 29  elete(db, pCopy)
23170 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 61  ;.}.../*.** Do a
23180 20 64 65 65 70 20 63 6f 6d 70 61 72 69 73 6f 6e   deep comparison
23190 20 6f 66 20 74 77 6f 20 65 78 70 72 65 73 73 69   of two expressi
231a0 6f 6e 20 74 72 65 65 73 2e 20 20 52 65 74 75 72  on trees.  Retur
231b0 6e 20 30 20 69 66 20 74 68 65 20 74 77 6f 0a 2a  n 0 if the two.*
231c0 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72  * expressions ar
231d0 65 20 63 6f 6d 70 6c 65 74 65 6c 79 20 69 64 65  e completely ide
231e0 6e 74 69 63 61 6c 2e 20 20 52 65 74 75 72 6e 20  ntical.  Return 
231f0 31 20 69 66 20 74 68 65 79 20 64 69 66 66 65 72  1 if they differ
23200 20 6f 6e 6c 79 0a 2a 2a 20 62 79 20 61 20 43 4f   only.** by a CO
23210 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 20 61  LLATE operator a
23220 74 20 74 68 65 20 74 6f 70 20 6c 65 76 65 6c 2e  t the top level.
23230 20 20 52 65 74 75 72 6e 20 32 20 69 66 20 74 68    Return 2 if th
23240 65 72 65 20 61 72 65 20 64 69 66 66 65 72 65 6e  ere are differen
23250 63 65 73 0a 2a 2a 20 6f 74 68 65 72 20 74 68 61  ces.** other tha
23260 6e 20 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c 20  n the top-level 
23270 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72  COLLATE operator
23280 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 20 73  ..**.** If any s
23290 75 62 65 6c 65 6d 65 6e 74 20 6f 66 20 70 42 20  ubelement of pB 
232a0 68 61 73 20 45 78 70 72 2e 69 54 61 62 6c 65 3d  has Expr.iTable=
232b0 3d 28 2d 31 29 20 74 68 65 6e 20 69 74 20 69 73  =(-1) then it is
232c0 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 63   allowed.** to c
232d0 6f 6d 70 61 72 65 20 65 71 75 61 6c 20 74 6f 20  ompare equal to 
232e0 61 6e 20 65 71 75 69 76 61 6c 65 6e 74 20 65 6c  an equivalent el
232f0 65 6d 65 6e 74 20 69 6e 20 70 41 20 77 69 74 68  ement in pA with
23300 20 45 78 70 72 2e 69 54 61 62 6c 65 3d 3d 69 54   Expr.iTable==iT
23310 61 62 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 41  ab..**.** The pA
23320 20 73 69 64 65 20 6d 69 67 68 74 20 62 65 20 75   side might be u
23330 73 69 6e 67 20 54 4b 5f 52 45 47 49 53 54 45 52  sing TK_REGISTER
23340 2e 20 20 49 66 20 74 68 61 74 20 69 73 20 74 68  .  If that is th
23350 65 20 63 61 73 65 20 61 6e 64 20 70 42 20 69 73  e case and pB is
23360 0a 2a 2a 20 6e 6f 74 20 75 73 69 6e 67 20 54 4b  .** not using TK
23370 5f 52 45 47 49 53 54 45 52 20 62 75 74 20 69 73  _REGISTER but is
23380 20 6f 74 68 65 72 77 69 73 65 20 65 71 75 69 76   otherwise equiv
23390 61 6c 65 6e 74 2c 20 74 68 65 6e 20 73 74 69 6c  alent, then stil
233a0 6c 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2a 0a 2a  l return 0..**.*
233b0 2a 20 53 6f 6d 65 74 69 6d 65 73 20 74 68 69 73  * Sometimes this
233c0 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65   routine will re
233d0 74 75 72 6e 20 32 20 65 76 65 6e 20 69 66 20 74  turn 2 even if t
233e0 68 65 20 74 77 6f 20 65 78 70 72 65 73 73 69 6f  he two expressio
233f0 6e 73 0a 2a 2a 20 72 65 61 6c 6c 79 20 61 72 65  ns.** really are
23400 20 65 71 75 69 76 61 6c 65 6e 74 2e 20 20 49 66   equivalent.  If
23410 20 77 65 20 63 61 6e 6e 6f 74 20 70 72 6f 76 65   we cannot prove
23420 20 74 68 61 74 20 74 68 65 20 65 78 70 72 65 73   that the expres
23430 73 69 6f 6e 73 20 61 72 65 0a 2a 2a 20 69 64 65  sions are.** ide
23440 6e 74 69 63 61 6c 2c 20 77 65 20 72 65 74 75 72  ntical, we retur
23450 6e 20 32 20 6a 75 73 74 20 74 6f 20 62 65 20 73  n 2 just to be s
23460 61 66 65 2e 20 20 53 6f 20 69 66 20 74 68 69 73  afe.  So if this
23470 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75   routine.** retu
23480 72 6e 73 20 32 2c 20 74 68 65 6e 20 79 6f 75 20  rns 2, then you 
23490 64 6f 20 6e 6f 74 20 72 65 61 6c 6c 79 20 6b 6e  do not really kn
234a0 6f 77 20 66 6f 72 20 63 65 72 74 61 69 6e 20 69  ow for certain i
234b0 66 20 74 68 65 20 74 77 6f 0a 2a 2a 20 65 78 70  f the two.** exp
234c0 72 65 73 73 69 6f 6e 73 20 61 72 65 20 74 68 65  ressions are the
234d0 20 73 61 6d 65 2e 20 20 42 75 74 20 69 66 20 79   same.  But if y
234e0 6f 75 20 67 65 74 20 61 20 30 20 6f 72 20 31 20  ou get a 0 or 1 
234f0 72 65 74 75 72 6e 2c 20 74 68 65 6e 20 79 6f 75  return, then you
23500 0a 2a 2a 20 63 61 6e 20 62 65 20 73 75 72 65 20  .** can be sure 
23510 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20  the expressions 
23520 61 72 65 20 74 68 65 20 73 61 6d 65 2e 20 20 49  are the same.  I
23530 6e 20 74 68 65 20 70 6c 61 63 65 73 20 77 68 65  n the places whe
23540 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  re.** this routi
23550 6e 65 20 69 73 20 75 73 65 64 2c 20 69 74 20 64  ne is used, it d
23560 6f 65 73 20 6e 6f 74 20 68 75 72 74 20 74 6f 20  oes not hurt to 
23570 67 65 74 20 61 6e 20 65 78 74 72 61 20 32 20 2d  get an extra 2 -
23580 20 74 68 61 74 0a 2a 2a 20 6a 75 73 74 20 6d 69   that.** just mi
23590 67 68 74 20 72 65 73 75 6c 74 20 69 6e 20 73 6f  ght result in so
235a0 6d 65 20 73 6c 69 67 68 74 6c 79 20 73 6c 6f 77  me slightly slow
235b0 65 72 20 63 6f 64 65 2e 20 20 42 75 74 20 72 65  er code.  But re
235c0 74 75 72 6e 69 6e 67 0a 2a 2a 20 61 6e 20 69 6e  turning.** an in
235d0 63 6f 72 72 65 63 74 20 30 20 6f 72 20 31 20 63  correct 0 or 1 c
235e0 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20 61 20 6d  ould lead to a m
235f0 61 6c 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69  alfunction..*/.i
23600 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  nt sqlite3ExprCo
23610 6d 70 61 72 65 28 45 78 70 72 20 2a 70 41 2c 20  mpare(Expr *pA, 
23620 45 78 70 72 20 2a 70 42 2c 20 69 6e 74 20 69 54  Expr *pB, int iT
23630 61 62 29 7b 0a 20 20 75 33 32 20 63 6f 6d 62 69  ab){.  u32 combi
23640 6e 65 64 46 6c 61 67 73 3b 0a 20 20 69 66 28 20  nedFlags;.  if( 
23650 70 41 3d 3d 30 20 7c 7c 20 70 42 3d 3d 30 20 29  pA==0 || pB==0 )
23660 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 42 3d  {.    return pB=
23670 3d 70 41 20 3f 20 30 20 3a 20 32 3b 0a 20 20 7d  =pA ? 0 : 2;.  }
23680 0a 20 20 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73  .  combinedFlags
23690 20 3d 20 70 41 2d 3e 66 6c 61 67 73 20 7c 20 70   = pA->flags | p
236a0 42 2d 3e 66 6c 61 67 73 3b 0a 20 20 69 66 28 20  B->flags;.  if( 
236b0 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20 26 20  combinedFlags & 
236c0 45 50 5f 49 6e 74 56 61 6c 75 65 20 29 7b 0a 20  EP_IntValue ){. 
236d0 20 20 20 69 66 28 20 28 70 41 2d 3e 66 6c 61 67     if( (pA->flag
236e0 73 26 70 42 2d 3e 66 6c 61 67 73 26 45 50 5f 49  s&pB->flags&EP_I
236f0 6e 74 56 61 6c 75 65 29 21 3d 30 20 26 26 20 70  ntValue)!=0 && p
23700 41 2d 3e 75 2e 69 56 61 6c 75 65 3d 3d 70 42 2d  A->u.iValue==pB-
23710 3e 75 2e 69 56 61 6c 75 65 20 29 7b 0a 20 20 20  >u.iValue ){.   
23720 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
23730 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 32 3b   }.    return 2;
23740 0a 20 20 7d 0a 20 20 69 66 28 20 70 41 2d 3e 6f  .  }.  if( pA->o
23750 70 21 3d 70 42 2d 3e 6f 70 20 29 7b 0a 20 20 20  p!=pB->op ){.   
23760 20 69 66 28 20 70 41 2d 3e 6f 70 3d 3d 54 4b 5f   if( pA->op==TK_
23770 43 4f 4c 4c 41 54 45 20 26 26 20 73 71 6c 69 74  COLLATE && sqlit
23780 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 41  e3ExprCompare(pA
23790 2d 3e 70 4c 65 66 74 2c 20 70 42 2c 20 69 54 61  ->pLeft, pB, iTa
237a0 62 29 3c 32 20 29 7b 0a 20 20 20 20 20 20 72 65  b)<2 ){.      re
237b0 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
237c0 20 20 69 66 28 20 70 42 2d 3e 6f 70 3d 3d 54 4b    if( pB->op==TK
237d0 5f 43 4f 4c 4c 41 54 45 20 26 26 20 73 71 6c 69  _COLLATE && sqli
237e0 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70  te3ExprCompare(p
237f0 41 2c 20 70 42 2d 3e 70 4c 65 66 74 2c 20 69 54  A, pB->pLeft, iT
23800 61 62 29 3c 32 20 29 7b 0a 20 20 20 20 20 20 72  ab)<2 ){.      r
23810 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
23820 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 7d     return 2;.  }
23830 0a 20 20 69 66 28 20 70 41 2d 3e 6f 70 21 3d 54  .  if( pA->op!=T
23840 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 41 2d 3e  K_COLUMN && pA->
23850 6f 70 21 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  op!=TK_AGG_COLUM
23860 4e 20 26 26 20 70 41 2d 3e 75 2e 7a 54 6f 6b 65  N && pA->u.zToke
23870 6e 20 29 7b 0a 20 20 20 20 69 66 28 20 70 41 2d  n ){.    if( pA-
23880 3e 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e  >op==TK_FUNCTION
23890 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71   ){.      if( sq
238a0 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 41 2d  lite3StrICmp(pA-
238b0 3e 75 2e 7a 54 6f 6b 65 6e 2c 70 42 2d 3e 75 2e  >u.zToken,pB->u.
238c0 7a 54 6f 6b 65 6e 29 21 3d 30 20 29 20 72 65 74  zToken)!=0 ) ret
238d0 75 72 6e 20 32 3b 0a 20 20 20 20 7d 65 6c 73 65  urn 2;.    }else
238e0 20 69 66 28 20 73 74 72 63 6d 70 28 70 41 2d 3e   if( strcmp(pA->
238f0 75 2e 7a 54 6f 6b 65 6e 2c 70 42 2d 3e 75 2e 7a  u.zToken,pB->u.z
23900 54 6f 6b 65 6e 29 21 3d 30 20 29 7b 0a 20 20 20  Token)!=0 ){.   
23910 20 20 20 72 65 74 75 72 6e 20 70 41 2d 3e 6f 70     return pA->op
23920 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 3f 20 31  ==TK_COLLATE ? 1
23930 20 3a 20 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   : 2;.    }.  }.
23940 20 20 69 66 28 20 28 70 41 2d 3e 66 6c 61 67 73    if( (pA->flags
23950 20 26 20 45 50 5f 44 69 73 74 69 6e 63 74 29 21   & EP_Distinct)!
23960 3d 28 70 42 2d 3e 66 6c 61 67 73 20 26 20 45 50  =(pB->flags & EP
23970 5f 44 69 73 74 69 6e 63 74 29 20 29 20 72 65 74  _Distinct) ) ret
23980 75 72 6e 20 32 3b 0a 20 20 69 66 28 20 41 4c 57  urn 2;.  if( ALW
23990 41 59 53 28 28 63 6f 6d 62 69 6e 65 64 46 6c 61  AYS((combinedFla
239a0 67 73 20 26 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  gs & EP_TokenOnl
239b0 79 29 3d 3d 30 29 20 29 7b 0a 20 20 20 20 69 66  y)==0) ){.    if
239c0 28 20 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20  ( combinedFlags 
239d0 26 20 45 50 5f 78 49 73 53 65 6c 65 63 74 20 29  & EP_xIsSelect )
239e0 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 69   return 2;.    i
239f0 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  f( sqlite3ExprCo
23a00 6d 70 61 72 65 28 70 41 2d 3e 70 4c 65 66 74 2c  mpare(pA->pLeft,
23a10 20 70 42 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62   pB->pLeft, iTab
23a20 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20  ) ) return 2;.  
23a30 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
23a40 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e 70 52 69  rCompare(pA->pRi
23a50 67 68 74 2c 20 70 42 2d 3e 70 52 69 67 68 74 2c  ght, pB->pRight,
23a60 20 69 54 61 62 29 20 29 20 72 65 74 75 72 6e 20   iTab) ) return 
23a70 32 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  2;.    if( sqlit
23a80 65 33 45 78 70 72 4c 69 73 74 43 6f 6d 70 61 72  e3ExprListCompar
23a90 65 28 70 41 2d 3e 78 2e 70 4c 69 73 74 2c 20 70  e(pA->x.pList, p
23aa0 42 2d 3e 78 2e 70 4c 69 73 74 2c 20 69 54 61 62  B->x.pList, iTab
23ab0 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20  ) ) return 2;.  
23ac0 20 20 69 66 28 20 41 4c 57 41 59 53 28 28 63 6f    if( ALWAYS((co
23ad0 6d 62 69 6e 65 64 46 6c 61 67 73 20 26 20 45 50  mbinedFlags & EP
23ae0 5f 52 65 64 75 63 65 64 29 3d 3d 30 29 20 26 26  _Reduced)==0) &&
23af0 20 70 41 2d 3e 6f 70 21 3d 54 4b 5f 53 54 52 49   pA->op!=TK_STRI
23b00 4e 47 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  NG ){.      if( 
23b10 70 41 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70 42 2d  pA->iColumn!=pB-
23b20 3e 69 43 6f 6c 75 6d 6e 20 29 20 72 65 74 75 72  >iColumn ) retur
23b30 6e 20 32 3b 0a 20 20 20 20 20 20 69 66 28 20 70  n 2;.      if( p
23b40 41 2d 3e 69 54 61 62 6c 65 21 3d 70 42 2d 3e 69  A->iTable!=pB->i
23b50 54 61 62 6c 65 20 0a 20 20 20 20 20 20 20 26 26  Table .       &&
23b60 20 28 70 41 2d 3e 69 54 61 62 6c 65 21 3d 69 54   (pA->iTable!=iT
23b70 61 62 20 7c 7c 20 4e 45 56 45 52 28 70 42 2d 3e  ab || NEVER(pB->
23b80 69 54 61 62 6c 65 3e 3d 30 29 29 20 29 20 72 65  iTable>=0)) ) re
23b90 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d 0a 20 20  turn 2;.    }.  
23ba0 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
23bb0 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74  ./*.** Compare t
23bc0 77 6f 20 45 78 70 72 4c 69 73 74 20 6f 62 6a 65  wo ExprList obje
23bd0 63 74 73 2e 20 20 52 65 74 75 72 6e 20 30 20 69  cts.  Return 0 i
23be0 66 20 74 68 65 79 20 61 72 65 20 69 64 65 6e 74  f they are ident
23bf0 69 63 61 6c 20 61 6e 64 20 0a 2a 2a 20 6e 6f 6e  ical and .** non
23c00 2d 7a 65 72 6f 20 69 66 20 74 68 65 79 20 64 69  -zero if they di
23c10 66 66 65 72 20 69 6e 20 61 6e 79 20 77 61 79 2e  ffer in any way.
23c20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 20 73 75  .**.** If any su
23c30 62 65 6c 65 6d 65 6e 74 20 6f 66 20 70 42 20 68  belement of pB h
23c40 61 73 20 45 78 70 72 2e 69 54 61 62 6c 65 3d 3d  as Expr.iTable==
23c50 28 2d 31 29 20 74 68 65 6e 20 69 74 20 69 73 20  (-1) then it is 
23c60 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 63 6f  allowed.** to co
23c70 6d 70 61 72 65 20 65 71 75 61 6c 20 74 6f 20 61  mpare equal to a
23c80 6e 20 65 71 75 69 76 61 6c 65 6e 74 20 65 6c 65  n equivalent ele
23c90 6d 65 6e 74 20 69 6e 20 70 41 20 77 69 74 68 20  ment in pA with 
23ca0 45 78 70 72 2e 69 54 61 62 6c 65 3d 3d 69 54 61  Expr.iTable==iTa
23cb0 62 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  b..**.** This ro
23cc0 75 74 69 6e 65 20 6d 69 67 68 74 20 72 65 74 75  utine might retu
23cd0 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 66 6f 72 20  rn non-zero for 
23ce0 65 71 75 69 76 61 6c 65 6e 74 20 45 78 70 72 4c  equivalent ExprL
23cf0 69 73 74 73 2e 20 20 54 68 65 0a 2a 2a 20 6f 6e  ists.  The.** on
23d00 6c 79 20 63 6f 6e 73 65 71 75 65 6e 63 65 20 77  ly consequence w
23d10 69 6c 6c 20 62 65 20 64 69 73 61 62 6c 65 64 20  ill be disabled 
23d20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 2e 20 20  optimizations.  
23d30 42 75 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65  But this routine
23d40 0a 2a 2a 20 6d 75 73 74 20 6e 65 76 65 72 20 72  .** must never r
23d50 65 74 75 72 6e 20 30 20 69 66 20 74 68 65 20 74  eturn 0 if the t
23d60 77 6f 20 45 78 70 72 4c 69 73 74 20 6f 62 6a 65  wo ExprList obje
23d70 63 74 73 20 61 72 65 20 64 69 66 66 65 72 65 6e  cts are differen
23d80 74 2c 20 6f 72 0a 2a 2a 20 61 20 6d 61 6c 66 75  t, or.** a malfu
23d90 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 72 65 73 75  nction will resu
23da0 6c 74 2e 0a 2a 2a 0a 2a 2a 20 54 77 6f 20 4e 55  lt..**.** Two NU
23db0 4c 4c 20 70 6f 69 6e 74 65 72 73 20 61 72 65 20  LL pointers are 
23dc0 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65  considered to be
23dd0 20 74 68 65 20 73 61 6d 65 2e 20 20 42 75 74 20   the same.  But 
23de0 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 0a 2a  a NULL pointer.*
23df0 2a 20 61 6c 77 61 79 73 20 64 69 66 66 65 72 73  * always differs
23e00 20 66 72 6f 6d 20 61 20 6e 6f 6e 2d 4e 55 4c 4c   from a non-NULL
23e10 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 69 6e 74   pointer..*/.int
23e20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
23e30 43 6f 6d 70 61 72 65 28 45 78 70 72 4c 69 73 74  Compare(ExprList
23e40 20 2a 70 41 2c 20 45 78 70 72 4c 69 73 74 20 2a   *pA, ExprList *
23e50 70 42 2c 20 69 6e 74 20 69 54 61 62 29 7b 0a 20  pB, int iTab){. 
23e60 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 41   int i;.  if( pA
23e70 3d 3d 30 20 26 26 20 70 42 3d 3d 30 20 29 20 72  ==0 && pB==0 ) r
23e80 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70  eturn 0;.  if( p
23e90 41 3d 3d 30 20 7c 7c 20 70 42 3d 3d 30 20 29 20  A==0 || pB==0 ) 
23ea0 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20  return 1;.  if( 
23eb0 70 41 2d 3e 6e 45 78 70 72 21 3d 70 42 2d 3e 6e  pA->nExpr!=pB->n
23ec0 45 78 70 72 20 29 20 72 65 74 75 72 6e 20 31 3b  Expr ) return 1;
23ed0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41  .  for(i=0; i<pA
23ee0 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
23ef0 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 41 20     Expr *pExprA 
23f00 3d 20 70 41 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  = pA->a[i].pExpr
23f10 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70  ;.    Expr *pExp
23f20 72 42 20 3d 20 70 42 2d 3e 61 5b 69 5d 2e 70 45  rB = pB->a[i].pE
23f30 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70 41 2d  xpr;.    if( pA-
23f40 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 21  >a[i].sortOrder!
23f50 3d 70 42 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72  =pB->a[i].sortOr
23f60 64 65 72 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  der ) return 1;.
23f70 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
23f80 78 70 72 43 6f 6d 70 61 72 65 28 70 45 78 70 72  xprCompare(pExpr
23f90 41 2c 20 70 45 78 70 72 42 2c 20 69 54 61 62 29  A, pExprB, iTab)
23fa0 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d   ) return 1;.  }
23fb0 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
23fc0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
23fd0 65 20 69 66 20 77 65 20 63 61 6e 20 70 72 6f 76  e if we can prov
23fe0 65 20 74 68 65 20 70 45 32 20 77 69 6c 6c 20 61  e the pE2 will a
23ff0 6c 77 61 79 73 20 62 65 20 74 72 75 65 20 69 66  lways be true if
24000 20 70 45 31 20 69 73 0a 2a 2a 20 74 72 75 65 2e   pE1 is.** true.
24010 20 20 52 65 74 75 72 6e 20 66 61 6c 73 65 20 69    Return false i
24020 66 20 77 65 20 63 61 6e 6e 6f 74 20 63 6f 6d 70  f we cannot comp
24030 6c 65 74 65 20 74 68 65 20 70 72 6f 6f 66 20 6f  lete the proof o
24040 72 20 69 66 20 70 45 32 20 6d 69 67 68 74 0a 2a  r if pE2 might.*
24050 2a 20 62 65 20 66 61 6c 73 65 2e 20 20 45 78 61  * be false.  Exa
24060 6d 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  mples:.**.**    
24070 20 70 45 31 3a 20 78 3d 3d 35 20 20 20 20 20 20   pE1: x==5      
24080 20 70 45 32 3a 20 78 3d 3d 35 20 20 20 20 20 20   pE2: x==5      
24090 20 20 20 20 20 20 20 52 65 73 75 6c 74 3a 20 74         Result: t
240a0 72 75 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20  rue.**     pE1: 
240b0 78 3e 30 20 20 20 20 20 20 20 20 70 45 32 3a 20  x>0        pE2: 
240c0 78 3d 3d 35 20 20 20 20 20 20 20 20 20 20 20 20  x==5            
240d0 20 52 65 73 75 6c 74 3a 20 66 61 6c 73 65 0a 2a   Result: false.*
240e0 2a 20 20 20 20 20 70 45 31 3a 20 78 3d 32 31 20  *     pE1: x=21 
240f0 20 20 20 20 20 20 70 45 32 3a 20 78 3d 32 31 20        pE2: x=21 
24100 4f 52 20 79 3d 34 33 20 20 20 20 20 52 65 73 75  OR y=43     Resu
24110 6c 74 3a 20 74 72 75 65 0a 2a 2a 20 20 20 20 20  lt: true.**     
24120 70 45 31 3a 20 78 21 3d 31 32 33 20 20 20 20 20  pE1: x!=123     
24130 70 45 32 3a 20 78 20 49 53 20 4e 4f 54 20 4e 55  pE2: x IS NOT NU
24140 4c 4c 20 20 20 20 52 65 73 75 6c 74 3a 20 74 72  LL    Result: tr
24150 75 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78  ue.**     pE1: x
24160 21 3d 3f 31 20 20 20 20 20 20 70 45 32 3a 20 78  !=?1      pE2: x
24170 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20   IS NOT NULL    
24180 52 65 73 75 6c 74 3a 20 74 72 75 65 0a 2a 2a 20  Result: true.** 
24190 20 20 20 20 70 45 31 3a 20 78 20 49 53 20 4e 55      pE1: x IS NU
241a0 4c 4c 20 20 70 45 32 3a 20 78 20 49 53 20 4e 4f  LL  pE2: x IS NO
241b0 54 20 4e 55 4c 4c 20 20 20 20 52 65 73 75 6c 74  T NULL    Result
241c0 3a 20 66 61 6c 73 65 0a 2a 2a 20 20 20 20 20 70  : false.**     p
241d0 45 31 3a 20 78 20 49 53 20 3f 32 20 20 20 20 70  E1: x IS ?2    p
241e0 45 32 3a 20 78 20 49 53 20 4e 4f 54 20 4e 55 4c  E2: x IS NOT NUL
241f0 4c 20 20 20 20 52 65 75 73 6c 74 3a 20 66 61 6c  L    Reuslt: fal
24200 73 65 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 63 6f  se.**.** When co
24210 6d 70 61 72 69 6e 67 20 54 4b 5f 43 4f 4c 55 4d  mparing TK_COLUM
24220 4e 20 6e 6f 64 65 73 20 62 65 74 77 65 65 6e 20  N nodes between 
24230 70 45 31 20 61 6e 64 20 70 45 32 2c 20 69 66 20  pE1 and pE2, if 
24240 70 45 32 20 68 61 73 0a 2a 2a 20 45 78 70 72 2e  pE2 has.** Expr.
24250 69 54 61 62 6c 65 3c 30 20 74 68 65 6e 20 61 73  iTable<0 then as
24260 73 75 6d 65 20 61 20 74 61 62 6c 65 20 6e 75 6d  sume a table num
24270 62 65 72 20 67 69 76 65 6e 20 62 79 20 69 54 61  ber given by iTa
24280 62 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 69 6e  b..**.** When in
24290 20 64 6f 75 62 74 2c 20 72 65 74 75 72 6e 20 66   doubt, return f
242a0 61 6c 73 65 2e 20 20 52 65 74 75 72 6e 69 6e 67  alse.  Returning
242b0 20 74 72 75 65 20 6d 69 67 68 74 20 67 69 76 65   true might give
242c0 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a 2a   a performance.*
242d0 2a 20 69 6d 70 72 6f 76 65 6d 65 6e 74 2e 20 20  * improvement.  
242e0 52 65 74 75 72 6e 69 6e 67 20 66 61 6c 73 65 20  Returning false 
242f0 6d 69 67 68 74 20 63 61 75 73 65 20 61 20 70 65  might cause a pe
24300 72 66 6f 72 6d 61 6e 63 65 20 72 65 64 75 63 74  rformance reduct
24310 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20 69 74 20 77  ion, but.** it w
24320 69 6c 6c 20 61 6c 77 61 79 73 20 67 69 76 65 20  ill always give 
24330 74 68 65 20 63 6f 72 72 65 63 74 20 61 6e 73 77  the correct answ
24340 65 72 20 61 6e 64 20 69 73 20 68 65 6e 63 65 20  er and is hence 
24350 61 6c 77 61 79 73 20 73 61 66 65 2e 0a 2a 2f 0a  always safe..*/.
24360 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 49  int sqlite3ExprI
24370 6d 70 6c 69 65 73 45 78 70 72 28 45 78 70 72 20  mpliesExpr(Expr 
24380 2a 70 45 31 2c 20 45 78 70 72 20 2a 70 45 32 2c  *pE1, Expr *pE2,
24390 20 69 6e 74 20 69 54 61 62 29 7b 0a 20 20 69 66   int iTab){.  if
243a0 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  ( sqlite3ExprCom
243b0 70 61 72 65 28 70 45 31 2c 20 70 45 32 2c 20 69  pare(pE1, pE2, i
243c0 54 61 62 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72  Tab)==0 ){.    r
243d0 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69  eturn 1;.  }.  i
243e0 66 28 20 70 45 32 2d 3e 6f 70 3d 3d 54 4b 5f 4f  f( pE2->op==TK_O
243f0 52 0a 20 20 20 26 26 20 28 73 71 6c 69 74 65 33  R.   && (sqlite3
24400 45 78 70 72 49 6d 70 6c 69 65 73 45 78 70 72 28  ExprImpliesExpr(
24410 70 45 31 2c 20 70 45 32 2d 3e 70 4c 65 66 74 2c  pE1, pE2->pLeft,
24420 20 69 54 61 62 29 0a 20 20 20 20 20 20 20 20 20   iTab).         
24430 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 45 78      || sqlite3Ex
24440 70 72 49 6d 70 6c 69 65 73 45 78 70 72 28 70 45  prImpliesExpr(pE
24450 31 2c 20 70 45 32 2d 3e 70 52 69 67 68 74 2c 20  1, pE2->pRight, 
24460 69 54 61 62 29 20 29 0a 20 20 29 7b 0a 20 20 20  iTab) ).  ){.   
24470 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
24480 20 69 66 28 20 70 45 32 2d 3e 6f 70 3d 3d 54 4b   if( pE2->op==TK
24490 5f 4e 4f 54 4e 55 4c 4c 0a 20 20 20 26 26 20 73  _NOTNULL.   && s
244a0 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
244b0 65 28 70 45 31 2d 3e 70 4c 65 66 74 2c 20 70 45  e(pE1->pLeft, pE
244c0 32 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 29 3d  2->pLeft, iTab)=
244d0 3d 30 0a 20 20 20 26 26 20 28 70 45 31 2d 3e 6f  =0.   && (pE1->o
244e0 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20 26 26 20  p!=TK_ISNULL && 
244f0 70 45 31 2d 3e 6f 70 21 3d 54 4b 5f 49 53 29 0a  pE1->op!=TK_IS).
24500 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20    ){.    return 
24510 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
24520 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69  0;.}../*.** An i
24530 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66  nstance of the f
24540 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75  ollowing structu
24550 72 65 20 69 73 20 75 73 65 64 20 62 79 20 74 68  re is used by th
24560 65 20 74 72 65 65 20 77 61 6c 6b 65 72 0a 2a 2a  e tree walker.**
24570 20 74 6f 20 63 6f 75 6e 74 20 72 65 66 65 72 65   to count refere
24580 6e 63 65 73 20 74 6f 20 74 61 62 6c 65 20 63 6f  nces to table co
24590 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 61 72 67  lumns in the arg
245a0 75 6d 65 6e 74 73 20 6f 66 20 61 6e 20 0a 2a 2a  uments of an .**
245b0 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
245c0 69 6f 6e 2c 20 69 6e 20 6f 72 64 65 72 20 74 6f  ion, in order to
245d0 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 0a 2a   implement the.*
245e0 2a 20 73 71 6c 69 74 65 33 46 75 6e 63 74 69 6f  * sqlite3Functio
245f0 6e 54 68 69 73 53 72 63 28 29 20 72 6f 75 74 69  nThisSrc() routi
24600 6e 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 53 72  ne..*/.struct Sr
24610 63 43 6f 75 6e 74 20 7b 0a 20 20 53 72 63 4c 69  cCount {.  SrcLi
24620 73 74 20 2a 70 53 72 63 3b 20 20 20 2f 2a 20 4f  st *pSrc;   /* O
24630 6e 65 20 70 61 72 74 69 63 75 6c 61 72 20 46 52  ne particular FR
24640 4f 4d 20 63 6c 61 75 73 65 20 69 6e 20 61 20 6e  OM clause in a n
24650 65 73 74 65 64 20 71 75 65 72 79 20 2a 2f 0a 20  ested query */. 
24660 20 69 6e 74 20 6e 54 68 69 73 3b 20 20 20 20 20   int nThis;     
24670 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
24680 65 66 65 72 65 6e 63 65 73 20 74 6f 20 63 6f 6c  eferences to col
24690 75 6d 6e 73 20 69 6e 20 70 53 72 63 4c 69 73 74  umns in pSrcList
246a0 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 74 68 65 72   */.  int nOther
246b0 3b 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  ;      /* Number
246c0 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74   of references t
246d0 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 6f 74 68  o columns in oth
246e0 65 72 20 46 52 4f 4d 20 63 6c 61 75 73 65 73 20  er FROM clauses 
246f0 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 75  */.};../*.** Cou
24700 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  nt the number of
24710 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 63   references to c
24720 6f 6c 75 6d 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69  olumns..*/.stati
24730 63 20 69 6e 74 20 65 78 70 72 53 72 63 43 6f 75  c int exprSrcCou
24740 6e 74 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b  nt(Walker *pWalk
24750 65 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  er, Expr *pExpr)
24760 7b 0a 20 20 2f 2a 20 54 68 65 20 4e 45 56 45 52  {.  /* The NEVER
24770 28 29 20 6f 6e 20 74 68 65 20 73 65 63 6f 6e 64  () on the second
24780 20 74 65 72 6d 20 69 73 20 62 65 63 61 75 73 65   term is because
24790 20 73 71 6c 69 74 65 33 46 75 6e 63 74 69 6f 6e   sqlite3Function
247a0 55 73 65 73 54 68 69 73 53 72 63 28 29 0a 20 20  UsesThisSrc().  
247b0 2a 2a 20 69 73 20 61 6c 77 61 79 73 20 63 61 6c  ** is always cal
247c0 6c 65 64 20 62 65 66 6f 72 65 20 73 71 6c 69 74  led before sqlit
247d0 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
247e0 72 65 67 61 74 65 73 28 29 20 61 6e 64 20 73 6f  regates() and so
247f0 20 74 68 65 0a 20 20 2a 2a 20 54 4b 5f 43 4f 4c   the.  ** TK_COL
24800 55 4d 4e 73 20 68 61 76 65 20 6e 6f 74 20 79 65  UMNs have not ye
24810 74 20 62 65 65 6e 20 63 6f 6e 76 65 72 74 65 64  t been converted
24820 20 69 6e 74 6f 20 54 4b 5f 41 47 47 5f 43 4f 4c   into TK_AGG_COL
24830 55 4d 4e 2e 20 20 49 66 0a 20 20 2a 2a 20 73 71  UMN.  If.  ** sq
24840 6c 69 74 65 33 46 75 6e 63 74 69 6f 6e 55 73 65  lite3FunctionUse
24850 73 54 68 69 73 53 72 63 28 29 20 69 73 20 75 73  sThisSrc() is us
24860 65 64 20 64 69 66 66 65 72 65 6e 74 6c 79 20 69  ed differently i
24870 6e 20 74 68 65 20 66 75 74 75 72 65 2c 20 74 68  n the future, th
24880 65 0a 20 20 2a 2a 20 4e 45 56 45 52 28 29 20 77  e.  ** NEVER() w
24890 69 6c 6c 20 6e 65 65 64 20 74 6f 20 62 65 20 72  ill need to be r
248a0 65 6d 6f 76 65 64 2e 20 2a 2f 0a 20 20 69 66 28  emoved. */.  if(
248b0 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43   pExpr->op==TK_C
248c0 4f 4c 55 4d 4e 20 7c 7c 20 4e 45 56 45 52 28 70  OLUMN || NEVER(p
248d0 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47  Expr->op==TK_AGG
248e0 5f 43 4f 4c 55 4d 4e 29 20 29 7b 0a 20 20 20 20  _COLUMN) ){.    
248f0 69 6e 74 20 69 3b 0a 20 20 20 20 73 74 72 75 63  int i;.    struc
24900 74 20 53 72 63 43 6f 75 6e 74 20 2a 70 20 3d 20  t SrcCount *p = 
24910 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 53 72 63 43  pWalker->u.pSrcC
24920 6f 75 6e 74 3b 0a 20 20 20 20 53 72 63 4c 69 73  ount;.    SrcLis
24930 74 20 2a 70 53 72 63 20 3d 20 70 2d 3e 70 53 72  t *pSrc = p->pSr
24940 63 3b 0a 20 20 20 20 69 6e 74 20 6e 53 72 63 20  c;.    int nSrc 
24950 3d 20 70 53 72 63 20 3f 20 70 53 72 63 2d 3e 6e  = pSrc ? pSrc->n
24960 53 72 63 20 3a 20 30 3b 0a 20 20 20 20 66 6f 72  Src : 0;.    for
24970 28 69 3d 30 3b 20 69 3c 6e 53 72 63 3b 20 69 2b  (i=0; i<nSrc; i+
24980 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45  +){.      if( pE
24990 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 53 72  xpr->iTable==pSr
249a0 63 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 20  c->a[i].iCursor 
249b0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20  ) break;.    }. 
249c0 20 20 20 69 66 28 20 69 3c 6e 53 72 63 20 29 7b     if( i<nSrc ){
249d0 0a 20 20 20 20 20 20 70 2d 3e 6e 54 68 69 73 2b  .      p->nThis+
249e0 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  +;.    }else{.  
249f0 20 20 20 20 70 2d 3e 6e 4f 74 68 65 72 2b 2b 3b      p->nOther++;
24a00 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
24a10 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
24a20 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72  ;.}../*.** Deter
24a30 6d 69 6e 65 20 69 66 20 61 6e 79 20 6f 66 20 74  mine if any of t
24a40 68 65 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20  he arguments to 
24a50 74 68 65 20 70 45 78 70 72 20 46 75 6e 63 74 69  the pExpr Functi
24a60 6f 6e 20 72 65 66 65 72 65 6e 63 65 0a 2a 2a 20  on reference.** 
24a70 70 53 72 63 4c 69 73 74 2e 20 20 52 65 74 75 72  pSrcList.  Retur
24a80 6e 20 74 72 75 65 20 69 66 20 74 68 65 79 20 64  n true if they d
24a90 6f 2e 20 20 41 6c 73 6f 20 72 65 74 75 72 6e 20  o.  Also return 
24aa0 74 72 75 65 20 69 66 20 74 68 65 20 66 75 6e 63  true if the func
24ab0 74 69 6f 6e 0a 2a 2a 20 68 61 73 20 6e 6f 20 61  tion.** has no a
24ac0 72 67 75 6d 65 6e 74 73 20 6f 72 20 68 61 73 20  rguments or has 
24ad0 6f 6e 6c 79 20 63 6f 6e 73 74 61 6e 74 20 61 72  only constant ar
24ae0 67 75 6d 65 6e 74 73 2e 20 20 52 65 74 75 72 6e  guments.  Return
24af0 20 66 61 6c 73 65 20 69 66 20 70 45 78 70 72 0a   false if pExpr.
24b00 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 20 63 6f  ** references co
24b10 6c 75 6d 6e 73 20 62 75 74 20 6e 6f 74 20 63 6f  lumns but not co
24b20 6c 75 6d 6e 73 20 6f 66 20 74 61 62 6c 65 73 20  lumns of tables 
24b30 66 6f 75 6e 64 20 69 6e 20 70 53 72 63 4c 69 73  found in pSrcLis
24b40 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
24b50 33 46 75 6e 63 74 69 6f 6e 55 73 65 73 54 68 69  3FunctionUsesThi
24b60 73 53 72 63 28 45 78 70 72 20 2a 70 45 78 70 72  sSrc(Expr *pExpr
24b70 2c 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 4c  , SrcList *pSrcL
24b80 69 73 74 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77  ist){.  Walker w
24b90 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 43 6f  ;.  struct SrcCo
24ba0 75 6e 74 20 63 6e 74 3b 0a 20 20 61 73 73 65 72  unt cnt;.  asser
24bb0 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  t( pExpr->op==TK
24bc0 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 3b  _AGG_FUNCTION );
24bd0 0a 20 20 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c  .  memset(&w, 0,
24be0 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20 77   sizeof(w));.  w
24bf0 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d  .xExprCallback =
24c00 20 65 78 70 72 53 72 63 43 6f 75 6e 74 3b 0a 20   exprSrcCount;. 
24c10 20 77 2e 75 2e 70 53 72 63 43 6f 75 6e 74 20 3d   w.u.pSrcCount =
24c20 20 26 63 6e 74 3b 0a 20 20 63 6e 74 2e 70 53 72   &cnt;.  cnt.pSr
24c30 63 20 3d 20 70 53 72 63 4c 69 73 74 3b 0a 20 20  c = pSrcList;.  
24c40 63 6e 74 2e 6e 54 68 69 73 20 3d 20 30 3b 0a 20  cnt.nThis = 0;. 
24c50 20 63 6e 74 2e 6e 4f 74 68 65 72 20 3d 20 30 3b   cnt.nOther = 0;
24c60 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78  .  sqlite3WalkEx
24c70 70 72 4c 69 73 74 28 26 77 2c 20 70 45 78 70 72  prList(&w, pExpr
24c80 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 72 65  ->x.pList);.  re
24c90 74 75 72 6e 20 63 6e 74 2e 6e 54 68 69 73 3e 30  turn cnt.nThis>0
24ca0 20 7c 7c 20 63 6e 74 2e 6e 4f 74 68 65 72 3d 3d   || cnt.nOther==
24cb0 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  0;.}../*.** Add 
24cc0 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f  a new element to
24cd0 20 74 68 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61   the pAggInfo->a
24ce0 43 6f 6c 5b 5d 20 61 72 72 61 79 2e 20 20 52 65  Col[] array.  Re
24cf0 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f  turn the index o
24d00 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 65 6c 65  f.** the new ele
24d10 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 20 61 20  ment.  Return a 
24d20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72 20  negative number 
24d30 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 2e  if malloc fails.
24d40 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
24d50 64 64 41 67 67 49 6e 66 6f 43 6f 6c 75 6d 6e 28  ddAggInfoColumn(
24d60 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 41 67 67  sqlite3 *db, Agg
24d70 49 6e 66 6f 20 2a 70 49 6e 66 6f 29 7b 0a 20 20  Info *pInfo){.  
24d80 69 6e 74 20 69 3b 0a 20 20 70 49 6e 66 6f 2d 3e  int i;.  pInfo->
24d90 61 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 41 72  aCol = sqlite3Ar
24da0 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20 20  rayAllocate(.   
24db0 20 20 20 20 64 62 2c 0a 20 20 20 20 20 20 20 70      db,.       p
24dc0 49 6e 66 6f 2d 3e 61 43 6f 6c 2c 0a 20 20 20 20  Info->aCol,.    
24dd0 20 20 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d     sizeof(pInfo-
24de0 3e 61 43 6f 6c 5b 30 5d 29 2c 0a 20 20 20 20 20  >aCol[0]),.     
24df0 20 20 26 70 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d    &pInfo->nColum
24e00 6e 2c 0a 20 20 20 20 20 20 20 26 69 0a 20 20 29  n,.       &i.  )
24e10 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 20  ;.  return i;.} 
24e20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61     ../*.** Add a
24e30 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20   new element to 
24e40 74 68 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46  the pAggInfo->aF
24e50 75 6e 63 5b 5d 20 61 72 72 61 79 2e 20 20 52 65  unc[] array.  Re
24e60 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f  turn the index o
24e70 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 65 6c 65  f.** the new ele
24e80 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 20 61 20  ment.  Return a 
24e90 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72 20  negative number 
24ea0 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 2e  if malloc fails.
24eb0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
24ec0 64 64 41 67 67 49 6e 66 6f 46 75 6e 63 28 73 71  ddAggInfoFunc(sq
24ed0 6c 69 74 65 33 20 2a 64 62 2c 20 41 67 67 49 6e  lite3 *db, AggIn
24ee0 66 6f 20 2a 70 49 6e 66 6f 29 7b 0a 20 20 69 6e  fo *pInfo){.  in
24ef0 74 20 69 3b 0a 20 20 70 49 6e 66 6f 2d 3e 61 46  t i;.  pInfo->aF
24f00 75 6e 63 20 3d 20 73 71 6c 69 74 65 33 41 72 72  unc = sqlite3Arr
24f10 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20 20 20  ayAllocate(.    
24f20 20 20 20 64 62 2c 20 0a 20 20 20 20 20 20 20 70     db, .       p
24f30 49 6e 66 6f 2d 3e 61 46 75 6e 63 2c 0a 20 20 20  Info->aFunc,.   
24f40 20 20 20 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f      sizeof(pInfo
24f50 2d 3e 61 46 75 6e 63 5b 30 5d 29 2c 0a 20 20 20  ->aFunc[0]),.   
24f60 20 20 20 20 26 70 49 6e 66 6f 2d 3e 6e 46 75 6e      &pInfo->nFun
24f70 63 2c 0a 20 20 20 20 20 20 20 26 69 0a 20 20 29  c,.       &i.  )
24f80 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 20  ;.  return i;.} 
24f90 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20     ../*.** This 
24fa0 69 73 20 74 68 65 20 78 45 78 70 72 43 61 6c 6c  is the xExprCall
24fb0 62 61 63 6b 20 66 6f 72 20 61 20 74 72 65 65 20  back for a tree 
24fc0 77 61 6c 6b 65 72 2e 20 20 49 74 20 69 73 20 75  walker.  It is u
24fd0 73 65 64 20 74 6f 0a 2a 2a 20 69 6d 70 6c 65 6d  sed to.** implem
24fe0 65 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 41  ent sqlite3ExprA
24ff0 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73  nalyzeAggregates
25000 28 29 2e 20 20 53 65 65 20 73 71 6c 69 74 65 33  ().  See sqlite3
25010 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65  ExprAnalyzeAggre
25020 67 61 74 65 73 0a 2a 2a 20 66 6f 72 20 61 64 64  gates.** for add
25030 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
25040 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
25050 6e 74 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67  nt analyzeAggreg
25060 61 74 65 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c  ate(Walker *pWal
25070 6b 65 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72  ker, Expr *pExpr
25080 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4e 61  ){.  int i;.  Na
25090 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 20 3d  meContext *pNC =
250a0 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 4e 43 3b   pWalker->u.pNC;
250b0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
250c0 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a   = pNC->pParse;.
250d0 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 4c    SrcList *pSrcL
250e0 69 73 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c  ist = pNC->pSrcL
250f0 69 73 74 3b 0a 20 20 41 67 67 49 6e 66 6f 20 2a  ist;.  AggInfo *
25100 70 41 67 67 49 6e 66 6f 20 3d 20 70 4e 43 2d 3e  pAggInfo = pNC->
25110 70 41 67 67 49 6e 66 6f 3b 0a 0a 20 20 73 77 69  pAggInfo;..  swi
25120 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29  tch( pExpr->op )
25130 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47  {.    case TK_AG
25140 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61  G_COLUMN:.    ca
25150 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a  se TK_COLUMN: {.
25160 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
25170 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47  pExpr->op==TK_AG
25180 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20  G_COLUMN );.    
25190 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
251a0 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op==TK_COLUMN
251b0 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20 43 68 65   );.      /* Che
251c0 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ck to see if the
251d0 20 63 6f 6c 75 6d 6e 20 69 73 20 69 6e 20 6f 6e   column is in on
251e0 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 73 20  e of the tables 
251f0 69 6e 20 74 68 65 20 46 52 4f 4d 0a 20 20 20 20  in the FROM.    
25200 20 20 2a 2a 20 63 6c 61 75 73 65 20 6f 66 20 74    ** clause of t
25210 68 65 20 61 67 67 72 65 67 61 74 65 20 71 75 65  he aggregate que
25220 72 79 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ry */.      if( 
25230 41 4c 57 41 59 53 28 70 53 72 63 4c 69 73 74 21  ALWAYS(pSrcList!
25240 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73  =0) ){.        s
25250 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
25260 65 6d 20 2a 70 49 74 65 6d 20 3d 20 70 53 72 63  em *pItem = pSrc
25270 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20 20  List->a;.       
25280 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72 63   for(i=0; i<pSrc
25290 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c  List->nSrc; i++,
252a0 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
252b0 20 20 20 20 20 73 74 72 75 63 74 20 41 67 67 49       struct AggI
252c0 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 3b 0a 20  nfo_col *pCol;. 
252d0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
252e0 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
252f0 79 28 70 45 78 70 72 2c 20 45 50 5f 54 6f 6b 65  y(pExpr, EP_Toke
25300 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64  nOnly|EP_Reduced
25310 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ) );.          i
25320 66 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  f( pExpr->iTable
25330 3d 3d 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  ==pItem->iCursor
25340 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
25350 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68 20 74  /* If we reach t
25360 68 69 73 20 70 6f 69 6e 74 2c 20 69 74 20 6d 65  his point, it me
25370 61 6e 73 20 74 68 61 74 20 70 45 78 70 72 20 72  ans that pExpr r
25380 65 66 65 72 73 20 74 6f 20 61 20 74 61 62 6c 65  efers to a table
25390 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
253a0 74 68 61 74 20 69 73 20 69 6e 20 74 68 65 20 46  that is in the F
253b0 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ROM clause of th
253c0 65 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72  e aggregate quer
253d0 79 2e 20 20 0a 20 20 20 20 20 20 20 20 20 20 20  y.  .           
253e0 20 2a 2a 0a 20 20 20 20 20 20 20 20 20 20 20 20   **.            
253f0 2a 2a 20 4d 61 6b 65 20 61 6e 20 65 6e 74 72 79  ** Make an entry
25400 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20   for the column 
25410 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f  in pAggInfo->aCo
25420 6c 5b 5d 20 69 66 20 74 68 65 72 65 0a 20 20 20  l[] if there.   
25430 20 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 6e           ** is n
25440 6f 74 20 61 6e 20 65 6e 74 72 79 20 74 68 65 72  ot an entry ther
25450 65 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 20  e already..     
25460 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
25470 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20        int k;.   
25480 20 20 20 20 20 20 20 20 20 70 43 6f 6c 20 3d 20           pCol = 
25490 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 3b 0a  pAggInfo->aCol;.
254a0 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28              for(
254b0 6b 3d 30 3b 20 6b 3c 70 41 67 67 49 6e 66 6f 2d  k=0; k<pAggInfo-
254c0 3e 6e 43 6f 6c 75 6d 6e 3b 20 6b 2b 2b 2c 20 70  >nColumn; k++, p
254d0 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  Col++){.        
254e0 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e        if( pCol->
254f0 69 54 61 62 6c 65 3d 3d 70 45 78 70 72 2d 3e 69  iTable==pExpr->i
25500 54 61 62 6c 65 20 26 26 0a 20 20 20 20 20 20 20  Table &&.       
25510 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
25520 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d  >iColumn==pExpr-
25530 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20  >iColumn ){.    
25540 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
25550 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  k;.             
25560 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d   }.            }
25570 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
25580 20 28 6b 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6e   (k>=pAggInfo->n
25590 43 6f 6c 75 6d 6e 29 0a 20 20 20 20 20 20 20 20  Column).        
255a0 20 20 20 20 20 26 26 20 28 6b 20 3d 20 61 64 64       && (k = add
255b0 41 67 67 49 6e 66 6f 43 6f 6c 75 6d 6e 28 70 50  AggInfoColumn(pP
255c0 61 72 73 65 2d 3e 64 62 2c 20 70 41 67 67 49 6e  arse->db, pAggIn
255d0 66 6f 29 29 3e 3d 30 20 0a 20 20 20 20 20 20 20  fo))>=0 .       
255e0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
255f0 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 26 70 41        pCol = &pA
25600 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 6b 5d 3b  ggInfo->aCol[k];
25610 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
25620 43 6f 6c 2d 3e 70 54 61 62 20 3d 20 70 45 78 70  Col->pTab = pExp
25630 72 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 20  r->pTab;.       
25640 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 54 61         pCol->iTa
25650 62 6c 65 20 3d 20 70 45 78 70 72 2d 3e 69 54 61  ble = pExpr->iTa
25660 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ble;.           
25670 20 20 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e     pCol->iColumn
25680 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d   = pExpr->iColum
25690 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n;.             
256a0 20 70 43 6f 6c 2d 3e 69 4d 65 6d 20 3d 20 2b 2b   pCol->iMem = ++
256b0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
256c0 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
256d0 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 20  ->iSorterColumn 
256e0 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20  = -1;.          
256f0 20 20 20 20 70 43 6f 6c 2d 3e 70 45 78 70 72 20      pCol->pExpr 
25700 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  = pExpr;.       
25710 20 20 20 20 20 20 20 69 66 28 20 70 41 67 67 49         if( pAggI
25720 6e 66 6f 2d 3e 70 47 72 6f 75 70 42 79 20 29 7b  nfo->pGroupBy ){
25730 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
25740 20 69 6e 74 20 6a 2c 20 6e 3b 0a 20 20 20 20 20   int j, n;.     
25750 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72 4c             ExprL
25760 69 73 74 20 2a 70 47 42 20 3d 20 70 41 67 67 49  ist *pGB = pAggI
25770 6e 66 6f 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20  nfo->pGroupBy;. 
25780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
25790 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
257a0 74 65 6d 20 2a 70 54 65 72 6d 20 3d 20 70 47 42  tem *pTerm = pGB
257b0 2d 3e 61 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ->a;.           
257c0 20 20 20 20 20 6e 20 3d 20 70 47 42 2d 3e 6e 45       n = pGB->nE
257d0 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20  xpr;.           
257e0 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
257f0 6e 3b 20 6a 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29  n; j++, pTerm++)
25800 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
25810 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70      Expr *pE = p
25820 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Term->pExpr;.   
25830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
25840 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  f( pE->op==TK_CO
25850 4c 55 4d 4e 20 26 26 20 70 45 2d 3e 69 54 61 62  LUMN && pE->iTab
25860 6c 65 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c  le==pExpr->iTabl
25870 65 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20  e &&.           
25880 20 20 20 20 20 20 20 20 20 20 20 70 45 2d 3e 69             pE->i
25890 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d 3e 69  Column==pExpr->i
258a0 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20  Column ){.      
258b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
258c0 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d  ol->iSorterColum
258d0 6e 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 20  n = j;.         
258e0 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
258f0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
25900 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
25910 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
25920 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
25930 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e        if( pCol->
25940 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3c 30 20  iSorterColumn<0 
25950 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
25960 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72     pCol->iSorter
25970 43 6f 6c 75 6d 6e 20 3d 20 70 41 67 67 49 6e 66  Column = pAggInf
25980 6f 2d 3e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d  o->nSortingColum
25990 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  n++;.           
259a0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
259b0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f   }.            /
259c0 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 77 20 61  * There is now a
259d0 6e 20 65 6e 74 72 79 20 66 6f 72 20 70 45 78 70  n entry for pExp
259e0 72 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61  r in pAggInfo->a
259f0 43 6f 6c 5b 5d 20 28 65 69 74 68 65 72 0a 20 20  Col[] (either.  
25a00 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 65 63            ** bec
25a10 61 75 73 65 20 69 74 20 77 61 73 20 74 68 65 72  ause it was ther
25a20 65 20 62 65 66 6f 72 65 20 6f 72 20 62 65 63 61  e before or beca
25a30 75 73 65 20 77 65 20 6a 75 73 74 20 63 72 65 61  use we just crea
25a40 74 65 64 20 69 74 29 2e 0a 20 20 20 20 20 20 20  ted it)..       
25a50 20 20 20 20 20 2a 2a 20 43 6f 6e 76 65 72 74 20       ** Convert 
25a60 74 68 65 20 70 45 78 70 72 20 74 6f 20 62 65 20  the pExpr to be 
25a70 61 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20  a TK_AGG_COLUMN 
25a80 72 65 66 65 72 72 69 6e 67 20 74 6f 20 74 68 61  referring to tha
25a90 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  t.            **
25aa0 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b   pAggInfo->aCol[
25ab0 5d 20 65 6e 74 72 79 2e 0a 20 20 20 20 20 20 20  ] entry..       
25ac0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
25ad0 20 20 20 20 45 78 70 72 53 65 74 56 56 41 50 72      ExprSetVVAPr
25ae0 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
25af0 5f 4e 6f 52 65 64 75 63 65 29 3b 0a 20 20 20 20  _NoReduce);.    
25b00 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70          pExpr->p
25b10 41 67 67 49 6e 66 6f 20 3d 20 70 41 67 67 49 6e  AggInfo = pAggIn
25b20 66 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  fo;.            
25b30 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 41  pExpr->op = TK_A
25b40 47 47 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20  GG_COLUMN;.     
25b50 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 41         pExpr->iA
25b60 67 67 20 3d 20 28 69 31 36 29 6b 3b 0a 20 20 20  gg = (i16)k;.   
25b70 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
25b80 20 20 20 20 20 20 20 20 20 20 7d 20 2f 2a 20 65            } /* e
25b90 6e 64 69 66 20 70 45 78 70 72 2d 3e 69 54 61 62  ndif pExpr->iTab
25ba0 6c 65 3d 3d 70 49 74 65 6d 2d 3e 69 43 75 72 73  le==pItem->iCurs
25bb0 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 20  or */.        } 
25bc0 2f 2a 20 65 6e 64 20 6c 6f 6f 70 20 6f 76 65 72  /* end loop over
25bd0 20 70 53 72 63 4c 69 73 74 20 2a 2f 0a 20 20 20   pSrcList */.   
25be0 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72     }.      retur
25bf0 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20  n WRC_Prune;.   
25c00 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41   }.    case TK_A
25c10 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20  GG_FUNCTION: {. 
25c20 20 20 20 20 20 69 66 28 20 28 70 4e 43 2d 3e 6e       if( (pNC->n
25c30 63 46 6c 61 67 73 20 26 20 4e 43 5f 49 6e 41 67  cFlags & NC_InAg
25c40 67 46 75 6e 63 29 3d 3d 30 0a 20 20 20 20 20 20  gFunc)==0.      
25c50 20 26 26 20 70 57 61 6c 6b 65 72 2d 3e 77 61 6c   && pWalker->wal
25c60 6b 65 72 44 65 70 74 68 3d 3d 70 45 78 70 72 2d  kerDepth==pExpr-
25c70 3e 6f 70 32 0a 20 20 20 20 20 20 29 7b 0a 20 20  >op2.      ){.  
25c80 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74        /* Check t
25c90 6f 20 73 65 65 20 69 66 20 70 45 78 70 72 20 69  o see if pExpr i
25ca0 73 20 61 20 64 75 70 6c 69 63 61 74 65 20 6f 66  s a duplicate of
25cb0 20 61 6e 6f 74 68 65 72 20 61 67 67 72 65 67 61   another aggrega
25cc0 74 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 66  te .        ** f
25cd0 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 69 73 20  unction that is 
25ce0 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 70  already in the p
25cf0 41 67 67 49 6e 66 6f 20 73 74 72 75 63 74 75 72  AggInfo structur
25d00 65 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  e.        */.   
25d10 20 20 20 20 20 73 74 72 75 63 74 20 41 67 67 49       struct AggI
25d20 6e 66 6f 5f 66 75 6e 63 20 2a 70 49 74 65 6d 20  nfo_func *pItem 
25d30 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e  = pAggInfo->aFun
25d40 63 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  c;.        for(i
25d50 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e  =0; i<pAggInfo->
25d60 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 49 74 65  nFunc; i++, pIte
25d70 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  m++){.          
25d80 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43  if( sqlite3ExprC
25d90 6f 6d 70 61 72 65 28 70 49 74 65 6d 2d 3e 70 45  ompare(pItem->pE
25da0 78 70 72 2c 20 70 45 78 70 72 2c 20 2d 31 29 3d  xpr, pExpr, -1)=
25db0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
25dc0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
25dd0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
25de0 20 20 20 20 20 20 20 69 66 28 20 69 3e 3d 70 41         if( i>=pA
25df0 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 20 29 7b  ggInfo->nFunc ){
25e00 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 45  .          /* pE
25e10 78 70 72 20 69 73 20 6f 72 69 67 69 6e 61 6c 2e  xpr is original.
25e20 20 20 4d 61 6b 65 20 61 20 6e 65 77 20 65 6e 74    Make a new ent
25e30 72 79 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e  ry in pAggInfo->
25e40 61 46 75 6e 63 5b 5d 0a 20 20 20 20 20 20 20 20  aFunc[].        
25e50 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 75    */.          u
25e60 38 20 65 6e 63 20 3d 20 45 4e 43 28 70 50 61 72  8 enc = ENC(pPar
25e70 73 65 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20 20  se->db);.       
25e80 20 20 20 69 20 3d 20 61 64 64 41 67 67 49 6e 66     i = addAggInf
25e90 6f 46 75 6e 63 28 70 50 61 72 73 65 2d 3e 64 62  oFunc(pParse->db
25ea0 2c 20 70 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20  , pAggInfo);.   
25eb0 20 20 20 20 20 20 20 69 66 28 20 69 3e 3d 30 20         if( i>=0 
25ec0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  ){.            a
25ed0 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
25ee0 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
25ef0 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a  P_xIsSelect) );.
25f00 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65              pIte
25f10 6d 20 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e 61  m = &pAggInfo->a
25f20 46 75 6e 63 5b 69 5d 3b 0a 20 20 20 20 20 20 20  Func[i];.       
25f30 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 45 78 70       pItem->pExp
25f40 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20  r = pExpr;.     
25f50 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 4d         pItem->iM
25f60 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  em = ++pParse->n
25f70 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Mem;.           
25f80 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
25f90 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
25fa0 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b   EP_IntValue) );
25fb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74  .            pIt
25fc0 65 6d 2d 3e 70 46 75 6e 63 20 3d 20 73 71 6c 69  em->pFunc = sqli
25fd0 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28  te3FindFunction(
25fe0 70 50 61 72 73 65 2d 3e 64 62 2c 0a 20 20 20 20  pParse->db,.    
25ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
26000 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20  Expr->u.zToken, 
26010 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
26020 20 20 20 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69      pExpr->x.pLi
26030 73 74 20 3f 20 70 45 78 70 72 2d 3e 78 2e 70 4c  st ? pExpr->x.pL
26040 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 2c 20  ist->nExpr : 0, 
26050 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  enc, 0);.       
26060 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
26070 66 6c 61 67 73 20 26 20 45 50 5f 44 69 73 74 69  flags & EP_Disti
26080 6e 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  nct ){.         
26090 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 44 69 73       pItem->iDis
260a0 74 69 6e 63 74 20 3d 20 70 50 61 72 73 65 2d 3e  tinct = pParse->
260b0 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nTab++;.        
260c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
260d0 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e           pItem->
260e0 69 44 69 73 74 69 6e 63 74 20 3d 20 2d 31 3b 0a  iDistinct = -1;.
260f0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
26100 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
26110 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20 4d    }.        /* M
26120 61 6b 65 20 70 45 78 70 72 20 70 6f 69 6e 74 20  ake pExpr point 
26130 74 6f 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  to the appropria
26140 74 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75  te pAggInfo->aFu
26150 6e 63 5b 5d 20 65 6e 74 72 79 0a 20 20 20 20 20  nc[] entry.     
26160 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73     */.        as
26170 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
26180 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
26190 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65  _TokenOnly|EP_Re
261a0 64 75 63 65 64 29 20 29 3b 0a 20 20 20 20 20 20  duced) );.      
261b0 20 20 45 78 70 72 53 65 74 56 56 41 50 72 6f 70    ExprSetVVAProp
261c0 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 4e  erty(pExpr, EP_N
261d0 6f 52 65 64 75 63 65 29 3b 0a 20 20 20 20 20 20  oReduce);.      
261e0 20 20 70 45 78 70 72 2d 3e 69 41 67 67 20 3d 20    pExpr->iAgg = 
261f0 28 69 31 36 29 69 3b 0a 20 20 20 20 20 20 20 20  (i16)i;.        
26200 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f 20  pExpr->pAggInfo 
26210 3d 20 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20  = pAggInfo;.    
26220 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50      return WRC_P
26230 72 75 6e 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73  rune;.      }els
26240 65 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  e{.        retur
26250 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
26260 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
26270 7d 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43  }.  return WRC_C
26280 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 73 74 61 74 69  ontinue;.}.stati
26290 63 20 69 6e 74 20 61 6e 61 6c 79 7a 65 41 67 67  c int analyzeAgg
262a0 72 65 67 61 74 65 73 49 6e 53 65 6c 65 63 74 28  regatesInSelect(
262b0 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c  Walker *pWalker,
262c0 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
262d0 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
262e0 4d 45 54 45 52 28 70 57 61 6c 6b 65 72 29 3b 0a  METER(pWalker);.
262f0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
26300 45 52 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 72  ER(pSelect);.  r
26310 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e  eturn WRC_Contin
26320 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61  ue;.}../*.** Ana
26330 6c 79 7a 65 20 74 68 65 20 70 45 78 70 72 20 65  lyze the pExpr e
26340 78 70 72 65 73 73 69 6f 6e 20 6c 6f 6f 6b 69 6e  xpression lookin
26350 67 20 66 6f 72 20 61 67 67 72 65 67 61 74 65 20  g for aggregate 
26360 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 0a 2a 2a  functions and.**
26370 20 66 6f 72 20 76 61 72 69 61 62 6c 65 73 20 74   for variables t
26380 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20 61  hat need to be a
26390 64 64 65 64 20 74 6f 20 41 67 67 49 6e 66 6f 20  dded to AggInfo 
263a0 6f 62 6a 65 63 74 20 74 68 61 74 20 70 4e 43 2d  object that pNC-
263b0 3e 70 41 67 67 49 6e 66 6f 0a 2a 2a 20 70 6f 69  >pAggInfo.** poi
263c0 6e 74 73 20 74 6f 2e 20 20 41 64 64 69 74 69 6f  nts to.  Additio
263d0 6e 61 6c 20 65 6e 74 72 69 65 73 20 61 72 65 20  nal entries are 
263e0 6d 61 64 65 20 6f 6e 20 74 68 65 20 41 67 67 49  made on the AggI
263f0 6e 66 6f 20 6f 62 6a 65 63 74 20 61 73 0a 2a 2a  nfo object as.**
26400 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 0a 2a   necessary..**.*
26410 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * This routine s
26420 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61  hould only be ca
26430 6c 6c 65 64 20 61 66 74 65 72 20 74 68 65 20 65  lled after the e
26440 78 70 72 65 73 73 69 6f 6e 20 68 61 73 20 62 65  xpression has be
26450 65 6e 0a 2a 2a 20 61 6e 61 6c 79 7a 65 64 20 62  en.** analyzed b
26460 79 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65  y sqlite3Resolve
26470 45 78 70 72 4e 61 6d 65 73 28 29 2e 0a 2a 2f 0a  ExprNames()..*/.
26480 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
26490 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  AnalyzeAggregate
264a0 73 28 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70  s(NameContext *p
264b0 4e 43 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  NC, Expr *pExpr)
264c0 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20  {.  Walker w;.  
264d0 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c 20 73 69  memset(&w, 0, si
264e0 7a 65 6f 66 28 77 29 29 3b 0a 20 20 77 2e 78 45  zeof(w));.  w.xE
264f0 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 61 6e  xprCallback = an
26500 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 3b 0a  alyzeAggregate;.
26510 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62    w.xSelectCallb
26520 61 63 6b 20 3d 20 61 6e 61 6c 79 7a 65 41 67 67  ack = analyzeAgg
26530 72 65 67 61 74 65 73 49 6e 53 65 6c 65 63 74 3b  regatesInSelect;
26540 0a 20 20 77 2e 75 2e 70 4e 43 20 3d 20 70 4e 43  .  w.u.pNC = pNC
26550 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e 43 2d  ;.  assert( pNC-
26560 3e 70 53 72 63 4c 69 73 74 21 3d 30 20 29 3b 0a  >pSrcList!=0 );.
26570 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70    sqlite3WalkExp
26580 72 28 26 77 2c 20 70 45 78 70 72 29 3b 0a 7d 0a  r(&w, pExpr);.}.
26590 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 73 71 6c 69  ./*.** Call sqli
265a0 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
265b0 67 72 65 67 61 74 65 73 28 29 20 66 6f 72 20 65  gregates() for e
265c0 76 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20  very expression 
265d0 69 6e 20 61 6e 0a 2a 2a 20 65 78 70 72 65 73 73  in an.** express
265e0 69 6f 6e 20 6c 69 73 74 2e 20 20 52 65 74 75 72  ion list.  Retur
265f0 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
26600 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  errors..**.** If
26610 20 61 6e 20 65 72 72 6f 72 20 69 73 20 66 6f 75   an error is fou
26620 6e 64 2c 20 74 68 65 20 61 6e 61 6c 79 73 69 73  nd, the analysis
26630 20 69 73 20 63 75 74 20 73 68 6f 72 74 2e 0a 2a   is cut short..*
26640 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
26650 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74  prAnalyzeAggList
26660 28 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e  (NameContext *pN
26670 43 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  C, ExprList *pLi
26680 73 74 29 7b 0a 20 20 73 74 72 75 63 74 20 45 78  st){.  struct Ex
26690 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
266a0 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  em;.  int i;.  i
266b0 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  f( pList ){.    
266c0 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d  for(pItem=pList-
266d0 3e 61 2c 20 69 3d 30 3b 20 69 3c 70 4c 69 73 74  >a, i=0; i<pList
266e0 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49  ->nExpr; i++, pI
266f0 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71  tem++){.      sq
26700 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65  lite3ExprAnalyze
26710 41 67 67 72 65 67 61 74 65 73 28 70 4e 43 2c 20  Aggregates(pNC, 
26720 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20  pItem->pExpr);. 
26730 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
26740 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 73 69 6e  * Allocate a sin
26750 67 6c 65 20 6e 65 77 20 72 65 67 69 73 74 65 72  gle new register
26760 20 66 6f 72 20 75 73 65 20 74 6f 20 68 6f 6c 64   for use to hold
26770 20 73 6f 6d 65 20 69 6e 74 65 72 6d 65 64 69 61   some intermedia
26780 74 65 20 72 65 73 75 6c 74 2e 0a 2a 2f 0a 69 6e  te result..*/.in
26790 74 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  t sqlite3GetTemp
267a0 52 65 67 28 50 61 72 73 65 20 2a 70 50 61 72 73  Reg(Parse *pPars
267b0 65 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65  e){.  if( pParse
267c0 2d 3e 6e 54 65 6d 70 52 65 67 3d 3d 30 20 29 7b  ->nTempReg==0 ){
267d0 0a 20 20 20 20 72 65 74 75 72 6e 20 2b 2b 70 50  .    return ++pP
267e0 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 7d 0a  arse->nMem;.  }.
267f0 20 20 72 65 74 75 72 6e 20 70 50 61 72 73 65 2d    return pParse-
26800 3e 61 54 65 6d 70 52 65 67 5b 2d 2d 70 50 61 72  >aTempReg[--pPar
26810 73 65 2d 3e 6e 54 65 6d 70 52 65 67 5d 3b 0a 7d  se->nTempReg];.}
26820 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61  ../*.** Dealloca
26830 74 65 20 61 20 72 65 67 69 73 74 65 72 2c 20 6d  te a register, m
26840 61 6b 69 6e 67 20 61 76 61 69 6c 61 62 6c 65 20  aking available 
26850 66 6f 72 20 72 65 75 73 65 20 66 6f 72 20 73 6f  for reuse for so
26860 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 70 75 72 70  me other.** purp
26870 6f 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  ose..**.** If a 
26880 72 65 67 69 73 74 65 72 20 69 73 20 63 75 72 72  register is curr
26890 65 6e 74 6c 79 20 62 65 69 6e 67 20 75 73 65 64  ently being used
268a0 20 62 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63   by the column c
268b0 61 63 68 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68  ache, then.** th
268c0 65 20 64 65 61 6c 6c 6f 63 61 74 69 6f 6e 20 69  e deallocation i
268d0 73 20 64 65 66 65 72 72 65 64 20 75 6e 74 69 6c  s deferred until
268e0 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68   the column cach
268f0 65 20 6c 69 6e 65 20 74 68 61 74 20 75 73 65 73  e line that uses
26900 0a 2a 2a 20 74 68 65 20 72 65 67 69 73 74 65 72  .** the register
26910 20 62 65 63 6f 6d 65 73 20 73 74 61 6c 65 2e 0a   becomes stale..
26920 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52  */.void sqlite3R
26930 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 50 61  eleaseTempReg(Pa
26940 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
26950 20 69 52 65 67 29 7b 0a 20 20 69 66 28 20 69 52   iReg){.  if( iR
26960 65 67 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 54  eg && pParse->nT
26970 65 6d 70 52 65 67 3c 41 72 72 61 79 53 69 7a 65  empReg<ArraySize
26980 28 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65  (pParse->aTempRe
26990 67 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  g) ){.    int i;
269a0 0a 20 20 20 20 73 74 72 75 63 74 20 79 43 6f 6c  .    struct yCol
269b0 43 61 63 68 65 20 2a 70 3b 0a 20 20 20 20 66 6f  Cache *p;.    fo
269c0 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d  r(i=0, p=pParse-
269d0 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51  >aColCache; i<SQ
269e0 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b  LITE_N_COLCACHE;
269f0 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20   i++, p++){.    
26a00 20 20 69 66 28 20 70 2d 3e 69 52 65 67 3d 3d 69    if( p->iReg==i
26a10 52 65 67 20 29 7b 0a 20 20 20 20 20 20 20 20 70  Reg ){.        p
26a20 2d 3e 74 65 6d 70 52 65 67 20 3d 20 31 3b 0a 20  ->tempReg = 1;. 
26a30 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20         return;. 
26a40 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
26a50 20 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65   pParse->aTempRe
26a60 67 5b 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52  g[pParse->nTempR
26a70 65 67 2b 2b 5d 20 3d 20 69 52 65 67 3b 0a 20 20  eg++] = iReg;.  
26a80 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  }.}../*.** Alloc
26a90 61 74 65 20 6f 72 20 64 65 61 6c 6c 6f 63 61 74  ate or deallocat
26aa0 65 20 61 20 62 6c 6f 63 6b 20 6f 66 20 6e 52 65  e a block of nRe
26ab0 67 20 63 6f 6e 73 65 63 75 74 69 76 65 20 72 65  g consecutive re
26ac0 67 69 73 74 65 72 73 0a 2a 2f 0a 69 6e 74 20 73  gisters.*/.int s
26ad0 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e  qlite3GetTempRan
26ae0 67 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ge(Parse *pParse
26af0 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20 69  , int nReg){.  i
26b00 6e 74 20 69 2c 20 6e 3b 0a 20 20 69 20 3d 20 70  nt i, n;.  i = p
26b10 50 61 72 73 65 2d 3e 69 52 61 6e 67 65 52 65 67  Parse->iRangeReg
26b20 3b 0a 20 20 6e 20 3d 20 70 50 61 72 73 65 2d 3e  ;.  n = pParse->
26b30 6e 52 61 6e 67 65 52 65 67 3b 0a 20 20 69 66 28  nRangeReg;.  if(
26b40 20 6e 52 65 67 3c 3d 6e 20 29 7b 0a 20 20 20 20   nReg<=n ){.    
26b50 61 73 73 65 72 74 28 20 21 75 73 65 64 41 73 43  assert( !usedAsC
26b60 6f 6c 75 6d 6e 43 61 63 68 65 28 70 50 61 72 73  olumnCache(pPars
26b70 65 2c 20 69 2c 20 69 2b 6e 2d 31 29 20 29 3b 0a  e, i, i+n-1) );.
26b80 20 20 20 20 70 50 61 72 73 65 2d 3e 69 52 61 6e      pParse->iRan
26b90 67 65 52 65 67 20 2b 3d 20 6e 52 65 67 3b 0a 20  geReg += nReg;. 
26ba0 20 20 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67     pParse->nRang
26bb0 65 52 65 67 20 2d 3d 20 6e 52 65 67 3b 0a 20 20  eReg -= nReg;.  
26bc0 7d 65 6c 73 65 7b 0a 20 20 20 20 69 20 3d 20 70  }else{.    i = p
26bd0 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20  Parse->nMem+1;. 
26be0 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
26bf0 2b 3d 20 6e 52 65 67 3b 0a 20 20 7d 0a 20 20 72  += nReg;.  }.  r
26c00 65 74 75 72 6e 20 69 3b 0a 7d 0a 76 6f 69 64 20  eturn i;.}.void 
26c10 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
26c20 6d 70 52 61 6e 67 65 28 50 61 72 73 65 20 2a 70  mpRange(Parse *p
26c30 50 61 72 73 65 2c 20 69 6e 74 20 69 52 65 67 2c  Parse, int iReg,
26c40 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20 73 71   int nReg){.  sq
26c50 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 52 65  lite3ExprCacheRe
26c60 6d 6f 76 65 28 70 50 61 72 73 65 2c 20 69 52 65  move(pParse, iRe
26c70 67 2c 20 6e 52 65 67 29 3b 0a 20 20 69 66 28 20  g, nReg);.  if( 
26c80 6e 52 65 67 3e 70 50 61 72 73 65 2d 3e 6e 52 61  nReg>pParse->nRa
26c90 6e 67 65 52 65 67 20 29 7b 0a 20 20 20 20 70 50  ngeReg ){.    pP
26ca0 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20  arse->nRangeReg 
26cb0 3d 20 6e 52 65 67 3b 0a 20 20 20 20 70 50 61 72  = nReg;.    pPar
26cc0 73 65 2d 3e 69 52 61 6e 67 65 52 65 67 20 3d 20  se->iRangeReg = 
26cd0 69 52 65 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  iReg;.  }.}../*.
26ce0 2a 2a 20 4d 61 72 6b 20 61 6c 6c 20 74 65 6d 70  ** Mark all temp
26cf0 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 73 20  orary registers 
26d00 61 73 20 62 65 69 6e 67 20 75 6e 61 76 61 69 6c  as being unavail
26d10 61 62 6c 65 20 66 6f 72 20 72 65 75 73 65 2e 0a  able for reuse..
26d20 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43  */.void sqlite3C
26d30 6c 65 61 72 54 65 6d 70 52 65 67 43 61 63 68 65  learTempRegCache
26d40 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b  (Parse *pParse){
26d50 0a 20 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70  .  pParse->nTemp
26d60 52 65 67 20 3d 20 30 3b 0a 20 20 70 50 61 72 73  Reg = 0;.  pPars
26d70 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20 3d 20 30  e->nRangeReg = 0
26d80 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 56 61 6c 69 64  ;.}../*.** Valid
26d90 61 74 65 20 74 68 61 74 20 6e 6f 20 74 65 6d 70  ate that no temp
26da0 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 20 66  orary register f
26db0 61 6c 6c 73 20 77 69 74 68 69 6e 20 74 68 65 20  alls within the 
26dc0 72 61 6e 67 65 20 6f 66 0a 2a 2a 20 69 46 69 72  range of.** iFir
26dd0 73 74 2e 2e 69 4c 61 73 74 2c 20 69 6e 63 6c 75  st..iLast, inclu
26de0 73 69 76 65 2e 20 20 54 68 69 73 20 72 6f 75 74  sive.  This rout
26df0 69 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c  ine is only call
26e00 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 61 73 73   from within ass
26e10 65 72 74 28 29 0a 2a 2a 20 73 74 61 74 65 6d 65  ert().** stateme
26e20 6e 74 73 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  nts..*/.#ifdef S
26e30 51 4c 49 54 45 5f 44 45 42 55 47 0a 69 6e 74 20  QLITE_DEBUG.int 
26e40 73 71 6c 69 74 65 33 4e 6f 54 65 6d 70 73 49 6e  sqlite3NoTempsIn
26e50 52 61 6e 67 65 28 50 61 72 73 65 20 2a 70 50 61  Range(Parse *pPa
26e60 72 73 65 2c 20 69 6e 74 20 69 46 69 72 73 74 2c  rse, int iFirst,
26e70 20 69 6e 74 20 69 4c 61 73 74 29 7b 0a 20 20 69   int iLast){.  i
26e80 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 50 61 72  nt i;.  if( pPar
26e90 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 3e 30 0a  se->nRangeReg>0.
26ea0 20 20 20 26 26 20 70 50 61 72 73 65 2d 3e 69 52     && pParse->iR
26eb0 61 6e 67 65 52 65 67 2b 70 50 61 72 73 65 2d 3e  angeReg+pParse->
26ec0 6e 52 61 6e 67 65 52 65 67 3c 69 4c 61 73 74 0a  nRangeReg<iLast.
26ed0 20 20 20 26 26 20 70 50 61 72 73 65 2d 3e 69 52     && pParse->iR
26ee0 61 6e 67 65 52 65 67 3e 3d 69 46 69 72 73 74 0a  angeReg>=iFirst.
26ef0 20 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e    ){.     return
26f00 20 30 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d   0;.  }.  for(i=
26f10 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 54 65  0; i<pParse->nTe
26f20 6d 70 52 65 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  mpReg; i++){.   
26f30 20 69 66 28 20 70 50 61 72 73 65 2d 3e 61 54 65   if( pParse->aTe
26f40 6d 70 52 65 67 5b 69 5d 3e 3d 69 46 69 72 73 74  mpReg[i]>=iFirst
26f50 20 26 26 20 70 50 61 72 73 65 2d 3e 61 54 65 6d   && pParse->aTem
26f60 70 52 65 67 5b 69 5d 3c 3d 69 4c 61 73 74 20 29  pReg[i]<=iLast )
26f70 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  {.      return 0
26f80 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
26f90 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66  turn 1;.}.#endif
26fa0 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47   /* SQLITE_DEBUG
26fb0 20 2a 2f 0a                                       */.