/ Hex Artifact Content
Login

Artifact ff73eb6cae76c2423928d46ceff6f2fdc379a568:


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 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
2720: 20 69 66 20 65 78 70 72 65 73 73 69 6f 6e 20 70   if expression p
2730: 45 78 70 72 20 69 73 20 61 20 76 65 63 74 6f 72  Expr is a vector
2740: 2c 20 6f 72 20 66 61 6c 73 65 20 6f 74 68 65 72  , or false other
2750: 77 69 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  wise..*/.int sql
2760: 69 74 65 33 45 78 70 72 49 73 56 65 63 74 6f 72  ite3ExprIsVector
2770: 28 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20  (Expr *pExpr){. 
2780: 20 72 65 74 75 72 6e 20 28 20 28 70 45 78 70 72   return ( (pExpr
2790: 2d 3e 6f 70 3d 3d 54 4b 5f 56 45 43 54 4f 52 29  ->op==TK_VECTOR)
27a0: 0a 20 20 20 20 20 20 20 20 7c 7c 20 28 70 45 78  .        || (pEx
27b0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43  pr->op==TK_SELEC
27c0: 54 20 26 26 20 70 45 78 70 72 2d 3e 78 2e 70 53  T && pExpr->x.pS
27d0: 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e  elect->pEList->n
27e0: 45 78 70 72 3e 31 29 0a 20 20 29 3b 0a 7d 0a 0a  Expr>1).  );.}..
27f0: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70  /*.** If the exp
2800: 72 65 73 73 69 6f 6e 20 70 61 73 73 65 64 20 61  ression passed a
2810: 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d  s the only argum
2820: 65 6e 74 20 69 73 20 6f 66 20 74 79 70 65 20 54  ent is of type T
2830: 4b 5f 56 45 43 54 4f 52 20 0a 2a 2a 20 72 65 74  K_VECTOR .** ret
2840: 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
2850: 66 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e  f expressions in
2860: 20 74 68 65 20 76 65 63 74 6f 72 2e 20 4f 72 2c   the vector. Or,
2870: 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
2880: 6f 6e 0a 2a 2a 20 69 73 20 61 20 73 75 62 2d 73  on.** is a sub-s
2890: 65 6c 65 63 74 2c 20 72 65 74 75 72 6e 20 74 68  elect, return th
28a0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  e number of colu
28b0: 6d 6e 73 20 69 6e 20 74 68 65 20 73 75 62 2d 73  mns in the sub-s
28c0: 65 6c 65 63 74 2e 20 46 6f 72 0a 2a 2a 20 61 6e  elect. For.** an
28d0: 79 20 6f 74 68 65 72 20 74 79 70 65 20 6f 66 20  y other type of 
28e0: 65 78 70 72 65 73 73 69 6f 6e 2c 20 72 65 74 75  expression, retu
28f0: 72 6e 20 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rn 1..*/.int sql
2900: 69 74 65 33 45 78 70 72 56 65 63 74 6f 72 53 69  ite3ExprVectorSi
2910: 7a 65 28 45 78 70 72 20 2a 70 45 78 70 72 29 7b  ze(Expr *pExpr){
2920: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78  .  if( sqlite3Ex
2930: 70 72 49 73 56 65 63 74 6f 72 28 70 45 78 70 72  prIsVector(pExpr
2940: 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b  )==0 ) return 1;
2950: 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 66 6c  .  if( pExpr->fl
2960: 61 67 73 20 26 20 45 50 5f 78 49 73 53 65 6c 65  ags & EP_xIsSele
2970: 63 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ct ){.    return
2980: 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63   pExpr->x.pSelec
2990: 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  t->pEList->nExpr
29a0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
29b0: 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e  Expr->x.pList->n
29c0: 45 78 70 72 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  Expr;.}..#ifndef
29d0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
29e0: 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 49 6e 74 65  QUERY./*.** Inte
29f0: 72 70 72 65 74 20 74 68 65 20 70 56 65 63 74 6f  rpret the pVecto
2a00: 72 20 69 6e 70 75 74 20 61 73 20 61 20 76 65 63  r input as a vec
2a10: 74 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 2e 20  tor expression. 
2a20: 20 49 66 20 70 56 65 63 74 6f 72 20 69 73 0a 2a   If pVector is.*
2a30: 2a 20 61 6e 20 6f 72 64 69 6e 61 72 79 20 73 63  * an ordinary sc
2a40: 61 6c 61 72 20 65 78 70 72 65 73 73 69 6f 6e 2c  alar expression,
2a50: 20 74 72 65 61 74 20 69 74 20 61 73 20 61 20 76   treat it as a v
2a60: 65 63 74 6f 72 20 6f 66 20 73 69 7a 65 20 31 2e  ector of size 1.
2a70: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  .**.** Return a 
2a80: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 75 62  pointer to a sub
2a90: 65 78 70 72 65 73 73 69 6f 6e 20 6f 66 20 70 56  expression of pV
2aa0: 65 63 74 6f 72 20 74 68 61 74 20 69 73 20 74 68  ector that is th
2ab0: 65 20 69 2d 74 68 0a 2a 2a 20 63 6f 6c 75 6d 6e  e i-th.** column
2ac0: 20 6f 66 20 74 68 65 20 76 65 63 74 6f 72 20 28   of the vector (
2ad0: 6e 75 6d 62 65 72 65 64 20 73 74 61 72 74 69 6e  numbered startin
2ae0: 67 20 77 69 74 68 20 30 29 2e 20 20 54 68 65 20  g with 0).  The 
2af0: 63 61 6c 6c 65 72 20 6d 75 73 74 0a 2a 2a 20 65  caller must.** e
2b00: 6e 73 75 72 65 20 74 68 61 74 20 69 20 69 73 20  nsure that i is 
2b10: 77 69 74 68 69 6e 20 72 61 6e 67 65 2e 0a 2a 2a  within range..**
2b20: 0a 2a 2a 20 70 56 65 63 74 6f 72 20 72 65 74 61  .** pVector reta
2b30: 69 6e 73 20 6f 77 6e 65 72 73 68 69 70 20 6f 66  ins ownership of
2b40: 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 73 75   the returned su
2b50: 62 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a  bexpression..**.
2b60: 2a 2a 20 49 66 20 74 68 65 20 76 65 63 74 6f 72  ** If the vector
2b70: 20 69 73 20 61 20 28 53 45 4c 45 43 54 20 2e 2e   is a (SELECT ..
2b80: 2e 29 20 74 68 65 6e 20 74 68 65 20 65 78 70 72  .) then the expr
2b90: 65 73 73 69 6f 6e 20 72 65 74 75 72 6e 65 64 20  ession returned 
2ba0: 69 73 0a 2a 2a 20 6a 75 73 74 20 74 68 65 20 65  is.** just the e
2bb0: 78 70 72 65 73 73 69 6f 6e 20 66 6f 72 20 74 68  xpression for th
2bc0: 65 20 69 2d 74 68 20 74 65 72 6d 20 6f 66 20 74  e i-th term of t
2bd0: 68 65 20 72 65 73 75 6c 74 20 73 65 74 2c 20 61  he result set, a
2be0: 6e 64 20 69 73 0a 2a 2a 20 6e 65 63 65 73 73 61  nd is.** necessa
2bf0: 72 69 6c 79 20 72 65 61 64 79 20 74 6f 20 62 65  rily ready to be
2c00: 20 65 76 61 6c 75 61 74 65 64 20 62 65 63 61 75   evaluated becau
2c10: 73 65 20 74 68 65 20 74 61 62 6c 65 20 63 75 72  se the table cur
2c20: 73 6f 72 20 6d 69 67 68 74 0a 2a 2a 20 6e 6f 74  sor might.** not
2c30: 20 68 61 76 65 20 62 65 65 6e 20 70 6f 73 69 74   have been posit
2c40: 69 6f 6e 65 64 20 79 65 74 2e 0a 2a 2f 0a 45 78  ioned yet..*/.Ex
2c50: 70 72 20 2a 73 71 6c 69 74 65 33 56 65 63 74 6f  pr *sqlite3Vecto
2c60: 72 46 69 65 6c 64 53 75 62 65 78 70 72 28 45 78  rFieldSubexpr(Ex
2c70: 70 72 20 2a 70 56 65 63 74 6f 72 2c 20 69 6e 74  pr *pVector, int
2c80: 20 69 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69   i){.  assert( i
2c90: 3c 73 71 6c 69 74 65 33 45 78 70 72 56 65 63 74  <sqlite3ExprVect
2ca0: 6f 72 53 69 7a 65 28 70 56 65 63 74 6f 72 29 20  orSize(pVector) 
2cb0: 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
2cc0: 45 78 70 72 49 73 56 65 63 74 6f 72 28 70 56 65  ExprIsVector(pVe
2cd0: 63 74 6f 72 29 20 29 7b 0a 20 20 20 20 69 66 28  ctor) ){.    if(
2ce0: 20 70 56 65 63 74 6f 72 2d 3e 6f 70 3d 3d 54 4b   pVector->op==TK
2cf0: 5f 53 45 4c 45 43 54 20 29 7b 0a 20 20 20 20 20  _SELECT ){.     
2d00: 20 72 65 74 75 72 6e 20 70 56 65 63 74 6f 72 2d   return pVector-
2d10: 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69  >x.pSelect->pELi
2d20: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  st->a[i].pExpr;.
2d30: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2d40: 20 72 65 74 75 72 6e 20 70 56 65 63 74 6f 72 2d   return pVector-
2d50: 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  >x.pList->a[i].p
2d60: 45 78 70 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Expr;.    }.  }.
2d70: 20 20 72 65 74 75 72 6e 20 70 56 65 63 74 6f 72    return pVector
2d80: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64  ;.}.#endif /* !d
2d90: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
2da0: 49 54 5f 53 55 42 51 55 45 52 59 29 20 2a 2f 0a  IT_SUBQUERY) */.
2db0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2dc0: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a  OMIT_SUBQUERY./*
2dd0: 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61 6e 64 20  .** Compute and 
2de0: 72 65 74 75 72 6e 20 61 20 6e 65 77 20 45 78 70  return a new Exp
2df0: 72 20 6f 62 6a 65 63 74 20 77 68 69 63 68 20 77  r object which w
2e00: 68 65 6e 20 70 61 73 73 65 64 20 74 6f 0a 2a 2a  hen passed to.**
2e10: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
2e20: 28 29 20 77 69 6c 6c 20 67 65 6e 65 72 61 74 65  () will generate
2e30: 20 61 6c 6c 20 6e 65 63 65 73 73 61 72 79 20 63   all necessary c
2e40: 6f 64 65 20 74 6f 20 63 6f 6d 70 75 74 65 0a 2a  ode to compute.*
2e50: 2a 20 74 68 65 20 69 46 69 65 6c 64 2d 74 68 20  * the iField-th 
2e60: 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 76 65  column of the ve
2e70: 63 74 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 20  ctor expression 
2e80: 70 56 65 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54  pVector..**.** T
2e90: 68 65 20 63 61 6c 6c 65 72 20 6f 77 6e 73 20 74  he caller owns t
2ea0: 68 65 20 72 65 74 75 72 6e 65 64 20 45 78 70 72  he returned Expr
2eb0: 20 6f 62 6a 65 63 74 20 61 6e 64 20 69 73 20 72   object and is r
2ec0: 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 0a 2a  esponsible for.*
2ed0: 2a 20 65 6e 73 75 72 69 6e 67 20 74 68 61 74 20  * ensuring that 
2ee0: 74 68 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c  the returned val
2ef0: 75 65 20 65 76 65 6e 74 75 61 6c 6c 79 20 67 65  ue eventually ge
2f00: 74 73 20 66 72 65 65 64 2e 0a 2a 2a 0a 2a 2a 20  ts freed..**.** 
2f10: 4f 77 6e 65 72 73 68 69 70 20 6f 66 20 70 56 65  Ownership of pVe
2f20: 63 74 6f 72 20 69 73 20 63 6f 6e 74 72 6f 6c 6c  ctor is controll
2f30: 65 64 20 62 79 20 74 68 65 20 74 61 6b 65 4f 77  ed by the takeOw
2f40: 6e 65 72 73 68 69 70 20 70 61 72 61 6d 65 74 65  nership paramete
2f50: 72 2e 20 20 49 66 0a 2a 2a 20 74 61 6b 65 4f 77  r.  If.** takeOw
2f60: 6e 65 72 73 68 69 70 20 69 73 20 74 72 75 65 2c  nership is true,
2f70: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 61   this routine ta
2f80: 6b 65 73 20 72 65 73 70 6f 6e 73 69 62 69 6c 69  kes responsibili
2f90: 74 79 20 66 6f 72 20 66 72 65 65 69 6e 67 0a 2a  ty for freeing.*
2fa0: 2a 20 70 56 65 63 74 6f 72 2c 20 61 6e 64 20 6d  * pVector, and m
2fb0: 61 79 20 64 6f 20 73 6f 20 62 65 66 6f 72 65 20  ay do so before 
2fc0: 72 65 74 75 72 6e 69 6e 67 2c 20 68 65 6e 63 65  returning, hence
2fd0: 20 74 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74   the caller must
2fe0: 20 6e 6f 74 20 72 65 66 65 72 65 6e 63 65 0a 2a   not reference.*
2ff0: 2a 20 70 56 65 63 74 6f 72 20 61 67 61 69 6e 2e  * pVector again.
3000: 20 20 49 66 20 74 61 6b 65 4f 77 6e 65 72 73 68    If takeOwnersh
3010: 69 70 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65  ip is false, the
3020: 6e 20 74 68 65 20 63 61 6c 6c 65 72 20 74 61 6b  n the caller tak
3030: 65 73 0a 2a 2a 20 72 65 73 70 6f 6e 73 69 62 69  es.** responsibi
3040: 6c 69 74 79 20 66 6f 72 20 66 72 65 65 69 6e 67  lity for freeing
3050: 20 70 56 65 63 74 6f 72 20 61 6e 64 20 6d 75 73   pVector and mus
3060: 74 20 65 6e 73 75 72 65 20 74 68 65 20 70 56 65  t ensure the pVe
3070: 63 74 6f 72 20 72 65 6d 61 69 6e 73 0a 2a 2a 20  ctor remains.** 
3080: 76 61 6c 69 64 20 61 73 20 6c 6f 6e 67 20 61 73  valid as long as
3090: 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 76 61   the returned va
30a0: 6c 75 65 20 72 65 6d 61 69 6e 73 20 69 6e 20 75  lue remains in u
30b0: 73 65 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c  se..*/.Expr *sql
30c0: 69 74 65 33 45 78 70 72 46 6f 72 56 65 63 74 6f  ite3ExprForVecto
30d0: 72 46 69 65 6c 64 28 0a 20 20 50 61 72 73 65 20  rField(.  Parse 
30e0: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f  *pParse,       /
30f0: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
3100: 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 56 65  t */.  Expr *pVe
3110: 63 74 6f 72 2c 20 20 20 20 20 20 20 2f 2a 20 54  ctor,       /* T
3120: 68 65 20 76 65 63 74 6f 72 2e 20 20 4c 69 73 74  he vector.  List
3130: 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73 20   of expressions 
3140: 6f 72 20 61 20 73 75 62 2d 53 45 4c 45 43 54 20  or a sub-SELECT 
3150: 2a 2f 0a 20 20 69 6e 74 20 69 46 69 65 6c 64 2c  */.  int iField,
3160: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 69            /* Whi
3170: 63 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65  ch column of the
3180: 20 76 65 63 74 6f 72 20 74 6f 20 72 65 74 75 72   vector to retur
3190: 6e 20 2a 2f 0a 20 20 69 6e 74 20 74 61 6b 65 4f  n */.  int takeO
31a0: 77 6e 65 72 73 68 69 70 20 20 20 20 2f 2a 20 54  wnership    /* T
31b0: 72 75 65 20 74 6f 20 74 61 6b 65 20 6f 77 6e 65  rue to take owne
31c0: 72 73 68 69 70 20 6f 66 20 70 56 65 63 74 6f 72  rship of pVector
31d0: 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
31e0: 67 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a  g */.){.  Expr *
31f0: 70 52 65 74 3b 0a 20 20 61 73 73 65 72 74 28 20  pRet;.  assert( 
3200: 73 71 6c 69 74 65 33 45 78 70 72 49 73 56 65 63  sqlite3ExprIsVec
3210: 74 6f 72 28 70 56 65 63 74 6f 72 29 20 29 3b 0a  tor(pVector) );.
3220: 20 20 2f 2a 20 46 49 58 4d 45 3a 20 41 64 64 20    /* FIXME: Add 
3230: 73 75 70 70 6f 72 74 20 66 6f 72 20 74 61 6b 65  support for take
3240: 4f 77 6e 65 72 73 68 69 70 21 3d 30 20 2a 2f 20  Ownership!=0 */ 
3250: 61 73 73 65 72 74 28 20 74 61 6b 65 4f 77 6e 65  assert( takeOwne
3260: 72 73 68 69 70 3d 3d 30 20 29 3b 0a 20 20 69 66  rship==0 );.  if
3270: 28 20 70 56 65 63 74 6f 72 2d 3e 66 6c 61 67 73  ( pVector->flags
3280: 20 26 20 45 50 5f 78 49 73 53 65 6c 65 63 74 20   & EP_xIsSelect 
3290: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 54 4b  ){.    /* The TK
32a0: 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 45  _SELECT_COLUMN E
32b0: 78 70 72 20 6e 6f 64 65 3a 0a 20 20 20 20 2a 2a  xpr node:.    **
32c0: 0a 20 20 20 20 2a 2a 20 70 4c 65 66 74 3a 20 20  .    ** pLeft:  
32d0: 20 20 20 20 20 20 20 20 20 70 56 65 63 74 6f 72           pVector
32e0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 54 4b 5f 53   containing TK_S
32f0: 45 4c 45 43 54 0a 20 20 20 20 2a 2a 20 70 52 69  ELECT.    ** pRi
3300: 67 68 74 3a 20 20 20 20 20 20 20 20 20 20 70 56  ght:          pV
3310: 65 63 74 6f 72 20 69 66 20 6f 77 6e 65 72 73 68  ector if ownersh
3320: 69 70 20 74 61 6b 65 6e 0a 20 20 20 20 2a 2a 20  ip taken.    ** 
3330: 69 43 6f 6c 75 6d 6e 3a 20 20 20 20 20 20 20 20  iColumn:        
3340: 20 49 6e 64 65 78 20 6f 66 20 61 20 63 6f 6c 75   Index of a colu
3350: 6d 6e 20 69 6e 20 70 56 65 63 74 6f 72 0a 20 20  mn in pVector.  
3360: 20 20 2a 2a 20 70 4c 65 66 74 2d 3e 69 54 61 62    ** pLeft->iTab
3370: 6c 65 3a 20 20 20 46 69 72 73 74 20 69 6e 20 61  le:   First in a
3380: 6e 20 61 72 72 61 79 20 6f 66 20 72 65 67 69 73  n array of regis
3390: 74 65 72 20 68 6f 6c 64 69 6e 67 20 72 65 73 75  ter holding resu
33a0: 6c 74 2c 20 6f 72 20 30 0a 20 20 20 20 2a 2a 20  lt, or 0.    ** 
33b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33c0: 20 69 66 20 74 68 65 20 72 65 73 75 6c 74 20 69   if the result i
33d0: 73 20 6e 6f 74 20 79 65 74 20 63 6f 6d 70 75 74  s not yet comput
33e0: 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ed..    **.    *
33f0: 2a 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c  * sqlite3ExprDel
3400: 65 74 65 28 29 20 73 70 65 63 69 66 69 63 61 6c  ete() specifical
3410: 6c 79 20 73 6b 69 70 73 20 74 68 65 20 72 65 63  ly skips the rec
3420: 75 72 73 69 76 65 20 64 65 6c 65 74 65 20 6f 66  ursive delete of
3430: 0a 20 20 20 20 2a 2a 20 70 4c 65 66 74 20 6f 6e  .    ** pLeft on
3440: 20 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d   TK_SELECT_COLUM
3450: 4e 20 6e 6f 64 65 73 2e 20 20 42 75 74 20 70 52  N nodes.  But pR
3460: 69 67 68 74 20 69 73 20 66 6f 6c 6c 6f 77 65 64  ight is followed
3470: 2c 20 73 6f 20 70 56 65 63 74 6f 72 0a 20 20 20  , so pVector.   
3480: 20 2a 2a 20 69 73 20 69 6e 63 6c 75 64 65 64 20   ** is included 
3490: 6f 6e 20 70 52 69 67 68 74 20 69 66 20 6f 77 6e  on pRight if own
34a0: 65 72 73 68 69 70 20 69 73 20 74 61 6b 65 6e 2e  ership is taken.
34b0: 20 20 54 79 70 69 63 61 6c 6c 79 20 74 68 65 72    Typically ther
34c0: 65 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65  e will.    ** be
34d0: 20 6d 75 6c 74 69 70 6c 65 20 54 4b 5f 53 45 4c   multiple TK_SEL
34e0: 45 43 54 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73  ECT_COLUMN nodes
34f0: 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 70   with the same p
3500: 4c 65 66 74 20 70 6f 69 6e 74 65 72 20 74 6f 20  Left pointer to 
3510: 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 56 65 63  .    ** the pVec
3520: 74 6f 72 2c 20 62 75 74 20 6f 6e 6c 79 20 6f 6e  tor, but only on
3530: 65 20 6f 66 20 74 68 65 6d 20 77 69 6c 6c 20 6f  e of them will o
3540: 77 6e 20 74 68 65 20 70 56 65 63 74 6f 72 2e 0a  wn the pVector..
3550: 20 20 20 20 2a 2f 0a 20 20 20 20 70 52 65 74 20      */.    pRet 
3560: 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
3570: 50 61 72 73 65 2c 20 54 4b 5f 53 45 4c 45 43 54  Parse, TK_SELECT
3580: 5f 43 4f 4c 55 4d 4e 2c 20 70 56 65 63 74 6f 72  _COLUMN, pVector
3590: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  , 0, 0);.    if(
35a0: 20 70 52 65 74 20 29 20 70 52 65 74 2d 3e 69 43   pRet ) pRet->iC
35b0: 6f 6c 75 6d 6e 20 3d 20 69 46 69 65 6c 64 3b 0a  olumn = iField;.
35c0: 20 20 20 20 61 73 73 65 72 74 28 20 70 52 65 74      assert( pRet
35d0: 3d 3d 30 20 7c 7c 20 70 52 65 74 2d 3e 69 54 61  ==0 || pRet->iTa
35e0: 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 7d 65 6c 73  ble==0 );.  }els
35f0: 65 7b 0a 20 20 20 20 70 52 65 74 20 3d 20 73 71  e{.    pRet = sq
3600: 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 50 61  lite3ExprDup(pPa
3610: 72 73 65 2d 3e 64 62 2c 20 70 56 65 63 74 6f 72  rse->db, pVector
3620: 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 46 69  ->x.pList->a[iFi
3630: 65 6c 64 5d 2e 70 45 78 70 72 2c 20 30 29 3b 0a  eld].pExpr, 0);.
3640: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 52 65    }.  return pRe
3650: 74 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21  t;.}.#endif /* !
3660: 64 65 66 69 6e 65 28 53 51 4c 49 54 45 5f 4f 4d  define(SQLITE_OM
3670: 49 54 5f 53 55 42 51 55 45 52 59 29 20 2a 2f 0a  IT_SUBQUERY) */.
3680: 0a 2f 2a 0a 2a 2a 20 49 66 20 65 78 70 72 65 73  ./*.** If expres
3690: 73 69 6f 6e 20 70 45 78 70 72 20 69 73 20 6f 66  sion pExpr is of
36a0: 20 74 79 70 65 20 54 4b 5f 53 45 4c 45 43 54 2c   type TK_SELECT,
36b0: 20 67 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   generate code t
36c0: 6f 20 65 76 61 6c 75 61 74 65 0a 2a 2a 20 69 74  o evaluate.** it
36d0: 2e 20 52 65 74 75 72 6e 20 74 68 65 20 72 65 67  . Return the reg
36e0: 69 73 74 65 72 20 69 6e 20 77 68 69 63 68 20 74  ister in which t
36f0: 68 65 20 72 65 73 75 6c 74 20 69 73 20 73 74 6f  he result is sto
3700: 72 65 64 20 28 6f 72 2c 20 69 66 20 74 68 65 20  red (or, if the 
3710: 0a 2a 2a 20 73 75 62 2d 73 65 6c 65 63 74 20 72  .** sub-select r
3720: 65 74 75 72 6e 73 20 6d 6f 72 65 20 74 68 61 6e  eturns more than
3730: 20 6f 6e 65 20 63 6f 6c 75 6d 6e 2c 20 74 68 65   one column, the
3740: 20 66 69 72 73 74 20 69 6e 20 61 6e 20 61 72 72   first in an arr
3750: 61 79 0a 2a 2a 20 6f 66 20 72 65 67 69 73 74 65  ay.** of registe
3760: 72 73 20 69 6e 20 77 68 69 63 68 20 74 68 65 20  rs in which the 
3770: 72 65 73 75 6c 74 20 69 73 20 73 74 6f 72 65 64  result is stored
3780: 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78 70  )..**.** If pExp
3790: 72 20 69 73 20 6e 6f 74 20 61 20 54 4b 5f 53 45  r is not a TK_SE
37a0: 4c 45 43 54 20 65 78 70 72 65 73 73 69 6f 6e 2c  LECT expression,
37b0: 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73 74   return 0..*/.st
37c0: 61 74 69 63 20 69 6e 74 20 65 78 70 72 43 6f 64  atic int exprCod
37d0: 65 53 75 62 73 65 6c 65 63 74 28 50 61 72 73 65  eSubselect(Parse
37e0: 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
37f0: 70 45 78 70 72 29 7b 0a 20 20 69 6e 74 20 72 65  pExpr){.  int re
3800: 67 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53  g = 0;.#ifndef S
3810: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
3820: 45 52 59 0a 20 20 69 66 28 20 70 45 78 70 72 2d  ERY.  if( pExpr-
3830: 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29  >op==TK_SELECT )
3840: 7b 0a 20 20 20 20 72 65 67 20 3d 20 73 71 6c 69  {.    reg = sqli
3850: 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74  te3CodeSubselect
3860: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
3870: 30 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  0, 0);.  }.#endi
3880: 66 0a 20 20 72 65 74 75 72 6e 20 72 65 67 3b 0a  f.  return reg;.
3890: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e  }../*.** Argumen
38a0: 74 20 70 56 65 63 74 6f 72 20 70 6f 69 6e 74 73  t pVector points
38b0: 20 74 6f 20 61 20 76 65 63 74 6f 72 20 65 78 70   to a vector exp
38c0: 72 65 73 73 69 6f 6e 20 2d 20 65 69 74 68 65 72  ression - either
38d0: 20 61 20 54 4b 5f 56 45 43 54 4f 52 0a 2a 2a 20   a TK_VECTOR.** 
38e0: 6f 72 20 54 4b 5f 53 45 4c 45 43 54 20 74 68 61  or TK_SELECT tha
38f0: 74 20 72 65 74 75 72 6e 73 20 6d 6f 72 65 20 74  t returns more t
3900: 68 61 6e 20 6f 6e 65 20 63 6f 6c 75 6d 6e 2e 20  han one column. 
3910: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
3920: 74 75 72 6e 73 0a 2a 2a 20 74 68 65 20 72 65 67  turns.** the reg
3930: 69 73 74 65 72 20 6e 75 6d 62 65 72 20 6f 66 20  ister number of 
3940: 61 20 72 65 67 69 73 74 65 72 20 74 68 61 74 20  a register that 
3950: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 76 61 6c  contains the val
3960: 75 65 20 6f 66 0a 2a 2a 20 65 6c 65 6d 65 6e 74  ue of.** element
3970: 20 69 46 69 65 6c 64 20 6f 66 20 74 68 65 20 76   iField of the v
3980: 65 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ector..**.** If 
3990: 70 56 65 63 74 6f 72 20 69 73 20 61 20 54 4b 5f  pVector is a TK_
39a0: 53 45 4c 45 43 54 20 65 78 70 72 65 73 73 69 6f  SELECT expressio
39b0: 6e 2c 20 74 68 65 6e 20 63 6f 64 65 20 66 6f 72  n, then code for
39c0: 20 69 74 20 6d 75 73 74 20 68 61 76 65 20 0a 2a   it must have .*
39d0: 2a 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 67  * already been g
39e0: 65 6e 65 72 61 74 65 64 20 75 73 69 6e 67 20 74  enerated using t
39f0: 68 65 20 65 78 70 72 43 6f 64 65 53 75 62 73 65  he exprCodeSubse
3a00: 6c 65 63 74 28 29 20 72 6f 75 74 69 6e 65 2e 20  lect() routine. 
3a10: 49 6e 20 74 68 69 73 0a 2a 2a 20 63 61 73 65 20  In this.** case 
3a20: 70 61 72 61 6d 65 74 65 72 20 72 65 67 53 65 6c  parameter regSel
3a30: 65 63 74 20 73 68 6f 75 6c 64 20 62 65 20 74 68  ect should be th
3a40: 65 20 66 69 72 73 74 20 69 6e 20 61 6e 20 61 72  e first in an ar
3a50: 72 61 79 20 6f 66 20 72 65 67 69 73 74 65 72 73  ray of registers
3a60: 0a 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  .** containing t
3a70: 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68  he results of th
3a80: 65 20 73 75 62 2d 73 65 6c 65 63 74 2e 20 0a 2a  e sub-select. .*
3a90: 2a 0a 2a 2a 20 49 66 20 70 56 65 63 74 6f 72 20  *.** If pVector 
3aa0: 69 73 20 6f 66 20 74 79 70 65 20 54 4b 5f 56 45  is of type TK_VE
3ab0: 43 54 4f 52 2c 20 74 68 65 6e 20 63 6f 64 65 20  CTOR, then code 
3ac0: 66 6f 72 20 74 68 65 20 72 65 71 75 65 73 74 65  for the requeste
3ad0: 64 20 66 69 65 6c 64 0a 2a 2a 20 69 73 20 67 65  d field.** is ge
3ae0: 6e 65 72 61 74 65 64 2e 20 49 6e 20 74 68 69 73  nerated. In this
3af0: 20 63 61 73 65 20 28 2a 70 52 65 67 46 72 65 65   case (*pRegFree
3b00: 29 20 6d 61 79 20 62 65 20 73 65 74 20 74 6f 20  ) may be set to 
3b10: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a  the number of.**
3b20: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67   a temporary reg
3b30: 69 73 74 65 72 20 74 6f 20 62 65 20 66 72 65 65  ister to be free
3b40: 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20  d by the caller 
3b50: 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
3b60: 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 72  ..**.** Before r
3b70: 65 74 75 72 6e 69 6e 67 2c 20 6f 75 74 70 75 74  eturning, output
3b80: 20 70 61 72 61 6d 65 74 65 72 20 28 2a 70 70 45   parameter (*ppE
3b90: 78 70 72 29 20 69 73 20 73 65 74 20 74 6f 20 70  xpr) is set to p
3ba0: 6f 69 6e 74 20 74 6f 20 74 68 65 0a 2a 2a 20 45  oint to the.** E
3bb0: 78 70 72 20 6f 62 6a 65 63 74 20 63 6f 72 72 65  xpr object corre
3bc0: 73 70 6f 6e 64 69 6e 67 20 74 6f 20 65 6c 65 6d  sponding to elem
3bd0: 65 6e 74 20 69 45 6c 65 6d 20 6f 66 20 74 68 65  ent iElem of the
3be0: 20 76 65 63 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74   vector..*/.stat
3bf0: 69 63 20 69 6e 74 20 65 78 70 72 56 65 63 74 6f  ic int exprVecto
3c00: 72 52 65 67 69 73 74 65 72 28 0a 20 20 50 61 72  rRegister(.  Par
3c10: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
3c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3c30: 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f  Parse context */
3c40: 0a 20 20 45 78 70 72 20 2a 70 56 65 63 74 6f 72  .  Expr *pVector
3c50: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
3c60: 20 20 20 2f 2a 20 56 65 63 74 6f 72 20 74 6f 20     /* Vector to 
3c70: 65 78 74 72 61 63 74 20 65 6c 65 6d 65 6e 74 20  extract element 
3c80: 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 46  from */.  int iF
3c90: 69 65 6c 64 2c 20 20 20 20 20 20 20 20 20 20 20  ield,           
3ca0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 65            /* Fie
3cb0: 6c 64 20 74 6f 20 65 78 74 72 61 63 74 20 66 72  ld to extract fr
3cc0: 6f 6d 20 70 56 65 63 74 6f 72 20 2a 2f 0a 20 20  om pVector */.  
3cd0: 69 6e 74 20 72 65 67 53 65 6c 65 63 74 2c 20 20  int regSelect,  
3ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3cf0: 2f 2a 20 46 69 72 73 74 20 69 6e 20 61 72 72 61  /* First in arra
3d00: 79 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 2a  y of registers *
3d10: 2f 0a 20 20 45 78 70 72 20 2a 2a 70 70 45 78 70  /.  Expr **ppExp
3d20: 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
3d30: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 45 78 70 72      /* OUT: Expr
3d40: 65 73 73 69 6f 6e 20 65 6c 65 6d 65 6e 74 20 2a  ession element *
3d50: 2f 0a 20 20 69 6e 74 20 2a 70 52 65 67 46 72 65  /.  int *pRegFre
3d60: 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
3d70: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 54 65 6d 70      /* OUT: Temp
3d80: 20 72 65 67 69 73 74 65 72 20 74 6f 20 66 72 65   register to fre
3d90: 65 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74  e */.){.  assert
3da0: 28 20 70 56 65 63 74 6f 72 2d 3e 6f 70 3d 3d 54  ( pVector->op==T
3db0: 4b 5f 56 45 43 54 4f 52 20 7c 7c 20 70 56 65 63  K_VECTOR || pVec
3dc0: 74 6f 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45  tor->op==TK_SELE
3dd0: 43 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CT );.  assert( 
3de0: 28 70 56 65 63 74 6f 72 2d 3e 6f 70 3d 3d 54 4b  (pVector->op==TK
3df0: 5f 56 45 43 54 4f 52 29 3d 3d 28 72 65 67 53 65  _VECTOR)==(regSe
3e00: 6c 65 63 74 3d 3d 30 29 20 29 3b 0a 20 20 69 66  lect==0) );.  if
3e10: 28 20 72 65 67 53 65 6c 65 63 74 20 29 7b 0a 20  ( regSelect ){. 
3e20: 20 20 20 2a 70 70 45 78 70 72 20 3d 20 70 56 65     *ppExpr = pVe
3e30: 63 74 6f 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2d  ctor->x.pSelect-
3e40: 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 46 69 65 6c  >pEList->a[iFiel
3e50: 64 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 72  d].pExpr;.     r
3e60: 65 74 75 72 6e 20 72 65 67 53 65 6c 65 63 74 2b  eturn regSelect+
3e70: 69 46 69 65 6c 64 3b 0a 20 20 7d 0a 20 20 2a 70  iField;.  }.  *p
3e80: 70 45 78 70 72 20 3d 20 70 56 65 63 74 6f 72 2d  pExpr = pVector-
3e90: 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 46 69 65  >x.pList->a[iFie
3ea0: 6c 64 5d 2e 70 45 78 70 72 3b 0a 20 20 72 65 74  ld].pExpr;.  ret
3eb0: 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72 43  urn sqlite3ExprC
3ec0: 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
3ed0: 2a 70 70 45 78 70 72 2c 20 70 52 65 67 46 72 65  *ppExpr, pRegFre
3ee0: 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 70  e);.}../*.** Exp
3ef0: 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20 69 73  ression pExpr is
3f00: 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 62 65   a comparison be
3f10: 74 77 65 65 6e 20 74 77 6f 20 76 65 63 74 6f 72  tween two vector
3f20: 20 76 61 6c 75 65 73 2e 20 43 6f 6d 70 75 74 65   values. Compute
3f30: 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 6f  .** the result o
3f40: 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  f the comparison
3f50: 20 28 31 2c 20 30 2c 20 6f 72 20 4e 55 4c 4c 29   (1, 0, or NULL)
3f60: 20 61 6e 64 20 77 72 69 74 65 20 74 68 61 74 0a   and write that.
3f70: 2a 2a 20 72 65 73 75 6c 74 20 69 6e 74 6f 20 72  ** result into r
3f80: 65 67 69 73 74 65 72 20 64 65 73 74 2e 0a 2a 2a  egister dest..**
3f90: 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d  .** The caller m
3fa0: 75 73 74 20 73 61 74 69 73 66 79 20 74 68 65 20  ust satisfy the 
3fb0: 66 6f 6c 6c 6f 77 69 6e 67 20 70 72 65 63 6f 6e  following precon
3fc0: 64 69 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20  ditions:.**.**  
3fd0: 20 20 69 66 20 70 45 78 70 72 2d 3e 6f 70 3d 3d    if pExpr->op==
3fe0: 54 4b 5f 49 53 3a 20 20 20 20 20 20 6f 70 3d 3d  TK_IS:      op==
3ff0: 54 4b 5f 45 51 20 61 6e 64 20 70 35 3d 3d 53 51  TK_EQ and p5==SQ
4000: 4c 49 54 45 5f 4e 55 4c 4c 45 51 0a 2a 2a 20 20  LITE_NULLEQ.**  
4010: 20 20 69 66 20 70 45 78 70 72 2d 3e 6f 70 3d 3d    if pExpr->op==
4020: 54 4b 5f 49 53 4e 4f 54 3a 20 20 20 6f 70 3d 3d  TK_ISNOT:   op==
4030: 54 4b 5f 4e 45 20 61 6e 64 20 70 35 3d 3d 53 51  TK_NE and p5==SQ
4040: 4c 49 54 45 5f 4e 55 4c 4c 45 51 0a 2a 2a 20 20  LITE_NULLEQ.**  
4050: 20 20 6f 74 68 65 72 77 69 73 65 3a 20 20 20 20    otherwise:    
4060: 20 20 20 20 20 20 20 20 20 20 20 20 6f 70 3d 3d              op==
4070: 70 45 78 70 72 2d 3e 6f 70 20 61 6e 64 20 70 35  pExpr->op and p5
4080: 3d 3d 30 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ==0.*/.static vo
4090: 69 64 20 63 6f 64 65 56 65 63 74 6f 72 43 6f 6d  id codeVectorCom
40a0: 70 61 72 65 28 0a 20 20 50 61 72 73 65 20 2a 70  pare(.  Parse *p
40b0: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a  Parse,        /*
40c0: 20 43 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20   Code generator 
40d0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
40e0: 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20  r *pExpr,       
40f0: 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 61 72     /* The compar
4100: 69 73 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 20 2a  ison operation *
4110: 2f 0a 20 20 69 6e 74 20 64 65 73 74 2c 20 20 20  /.  int dest,   
4120: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
4130: 74 65 20 72 65 73 75 6c 74 73 20 69 6e 74 6f 20  te results into 
4140: 74 68 69 73 20 72 65 67 69 73 74 65 72 20 2a 2f  this register */
4150: 0a 20 20 75 38 20 6f 70 2c 20 20 20 20 20 20 20  .  u8 op,       
4160: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70           /* Comp
4170: 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 20  arison operator 
4180: 2a 2f 0a 20 20 75 38 20 70 35 20 20 20 20 20 20  */.  u8 p5      
4190: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51             /* SQ
41a0: 4c 49 54 45 5f 4e 55 4c 4c 45 51 20 6f 72 20 7a  LITE_NULLEQ or z
41b0: 65 72 6f 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65  ero */.){.  Vdbe
41c0: 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
41d0: 64 62 65 3b 0a 20 20 45 78 70 72 20 2a 70 4c 65  dbe;.  Expr *pLe
41e0: 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66  ft = pExpr->pLef
41f0: 74 3b 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68  t;.  Expr *pRigh
4200: 74 20 3d 20 70 45 78 70 72 2d 3e 70 52 69 67 68  t = pExpr->pRigh
4210: 74 3b 0a 20 20 69 6e 74 20 6e 4c 65 66 74 20 3d  t;.  int nLeft =
4220: 20 73 71 6c 69 74 65 33 45 78 70 72 56 65 63 74   sqlite3ExprVect
4230: 6f 72 53 69 7a 65 28 70 4c 65 66 74 29 3b 0a 20  orSize(pLeft);. 
4240: 20 69 6e 74 20 6e 52 69 67 68 74 20 3d 20 73 71   int nRight = sq
4250: 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f 72 53  lite3ExprVectorS
4260: 69 7a 65 28 70 52 69 67 68 74 29 3b 0a 0a 20 20  ize(pRight);..  
4270: 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 62 6f  /* Check that bo
4280: 74 68 20 73 69 64 65 73 20 6f 66 20 74 68 65 20  th sides of the 
4290: 63 6f 6d 70 61 72 69 73 6f 6e 20 61 72 65 20 76  comparison are v
42a0: 65 63 74 6f 72 73 2c 20 61 6e 64 20 74 68 61 74  ectors, and that
42b0: 0a 20 20 2a 2a 20 62 6f 74 68 20 61 72 65 20 74  .  ** both are t
42c0: 68 65 20 73 61 6d 65 20 6c 65 6e 67 74 68 2e 20  he same length. 
42d0: 20 2a 2f 0a 20 20 69 66 28 20 6e 4c 65 66 74 21   */.  if( nLeft!
42e0: 3d 6e 52 69 67 68 74 20 29 7b 0a 20 20 20 20 73  =nRight ){.    s
42f0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
4300: 50 61 72 73 65 2c 20 22 69 6e 76 61 6c 69 64 20  Parse, "invalid 
4310: 75 73 65 20 6f 66 20 72 6f 77 20 76 61 6c 75 65  use of row value
4320: 22 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ");.  }else{.   
4330: 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20   int i;.    int 
4340: 72 65 67 4c 65 66 74 20 3d 20 30 3b 0a 20 20 20  regLeft = 0;.   
4350: 20 69 6e 74 20 72 65 67 52 69 67 68 74 20 3d 20   int regRight = 
4360: 30 3b 0a 20 20 20 20 75 38 20 6f 70 78 20 3d 20  0;.    u8 opx = 
4370: 6f 70 3b 0a 20 20 20 20 69 6e 74 20 61 64 64 72  op;.    int addr
4380: 44 6f 6e 65 20 3d 20 73 71 6c 69 74 65 33 56 64  Done = sqlite3Vd
4390: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
43a0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78  .    assert( pEx
43b0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 20 7c 7c  pr->op==TK_EQ ||
43c0: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4e   pExpr->op==TK_N
43d0: 45 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70  E .         || p
43e0: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20  Expr->op==TK_IS 
43f0: 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  || pExpr->op==TK
4400: 5f 49 53 4e 4f 54 20 0a 20 20 20 20 20 20 20 20  _ISNOT .        
4410: 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54   || pExpr->op==T
4420: 4b 5f 4c 54 20 7c 7c 20 70 45 78 70 72 2d 3e 6f  K_LT || pExpr->o
4430: 70 3d 3d 54 4b 5f 47 54 20 0a 20 20 20 20 20 20  p==TK_GT .      
4440: 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d     || pExpr->op=
4450: 3d 54 4b 5f 4c 45 20 7c 7c 20 70 45 78 70 72 2d  =TK_LE || pExpr-
4460: 3e 6f 70 3d 3d 54 4b 5f 47 45 20 0a 20 20 20 20  >op==TK_GE .    
4470: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
4480: 45 78 70 72 2d 3e 6f 70 3d 3d 6f 70 20 7c 7c 20  Expr->op==op || 
4490: 28 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49  (pExpr->op==TK_I
44a0: 53 20 26 26 20 6f 70 3d 3d 54 4b 5f 45 51 29 0a  S && op==TK_EQ).
44b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c                ||
44c0: 20 28 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f   (pExpr->op==TK_
44d0: 49 53 4e 4f 54 20 26 26 20 6f 70 3d 3d 54 4b 5f  ISNOT && op==TK_
44e0: 4e 45 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72  NE) );.    asser
44f0: 74 28 20 70 35 3d 3d 30 20 7c 7c 20 70 45 78 70  t( p5==0 || pExp
4500: 72 2d 3e 6f 70 21 3d 6f 70 20 29 3b 0a 20 20 20  r->op!=op );.   
4510: 20 61 73 73 65 72 74 28 20 70 35 3d 3d 53 51 4c   assert( p5==SQL
4520: 49 54 45 5f 4e 55 4c 4c 45 51 20 7c 7c 20 70 45  ITE_NULLEQ || pE
4530: 78 70 72 2d 3e 6f 70 3d 3d 6f 70 20 29 3b 0a 0a  xpr->op==op );..
4540: 20 20 20 20 70 35 20 7c 3d 20 53 51 4c 49 54 45      p5 |= SQLITE
4550: 5f 53 54 4f 52 45 50 32 3b 0a 20 20 20 20 69 66  _STOREP2;.    if
4560: 28 20 6f 70 78 3d 3d 54 4b 5f 4c 45 20 29 20 6f  ( opx==TK_LE ) o
4570: 70 78 20 3d 20 54 4b 5f 4c 54 3b 0a 20 20 20 20  px = TK_LT;.    
4580: 69 66 28 20 6f 70 78 3d 3d 54 4b 5f 47 45 20 29  if( opx==TK_GE )
4590: 20 6f 70 78 20 3d 20 54 4b 5f 47 54 3b 0a 0a 20   opx = TK_GT;.. 
45a0: 20 20 20 72 65 67 4c 65 66 74 20 3d 20 65 78 70     regLeft = exp
45b0: 72 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70  rCodeSubselect(p
45c0: 50 61 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a 20  Parse, pLeft);. 
45d0: 20 20 20 72 65 67 52 69 67 68 74 20 3d 20 65 78     regRight = ex
45e0: 70 72 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28  prCodeSubselect(
45f0: 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 29 3b  pParse, pRight);
4600: 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ..    for(i=0; i
4610: 3c 6e 4c 65 66 74 3b 20 69 2b 2b 29 7b 0a 20 20  <nLeft; i++){.  
4620: 20 20 20 20 69 6e 74 20 72 65 67 46 72 65 65 31      int regFree1
4630: 20 3d 20 30 2c 20 72 65 67 46 72 65 65 32 20 3d   = 0, regFree2 =
4640: 20 30 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a   0;.      Expr *
4650: 70 4c 2c 20 2a 70 52 3b 20 0a 20 20 20 20 20 20  pL, *pR; .      
4660: 69 6e 74 20 72 31 2c 20 72 32 3b 0a 20 20 20 20  int r1, r2;.    
4670: 20 20 69 66 28 20 69 3e 30 20 29 20 73 71 6c 69    if( i>0 ) sqli
4680: 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68  te3ExprCachePush
4690: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
46a0: 72 31 20 3d 20 65 78 70 72 56 65 63 74 6f 72 52  r1 = exprVectorR
46b0: 65 67 69 73 74 65 72 28 70 50 61 72 73 65 2c 20  egister(pParse, 
46c0: 70 4c 65 66 74 2c 20 69 2c 20 72 65 67 4c 65 66  pLeft, i, regLef
46d0: 74 2c 20 26 70 4c 2c 20 26 72 65 67 46 72 65 65  t, &pL, &regFree
46e0: 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 65  1);.      r2 = e
46f0: 78 70 72 56 65 63 74 6f 72 52 65 67 69 73 74 65  xprVectorRegiste
4700: 72 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74  r(pParse, pRight
4710: 2c 20 69 2c 20 72 65 67 52 69 67 68 74 2c 20 26  , i, regRight, &
4720: 70 52 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a  pR, &regFree2);.
4730: 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72        codeCompar
4740: 65 28 70 50 61 72 73 65 2c 20 70 4c 2c 20 70 52  e(pParse, pL, pR
4750: 2c 20 6f 70 78 2c 20 72 31 2c 20 72 32 2c 20 64  , opx, r1, r2, d
4760: 65 73 74 2c 20 70 35 29 3b 0a 20 20 20 20 20 20  est, p5);.      
4770: 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
4780: 4c 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Lt); VdbeCoverag
4790: 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 74 29  eIf(v,op==OP_Lt)
47a0: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
47b0: 28 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 20 56 64 62  (op==OP_Le); Vdb
47c0: 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70  eCoverageIf(v,op
47d0: 3d 3d 4f 50 5f 4c 65 29 3b 0a 20 20 20 20 20 20  ==OP_Le);.      
47e0: 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
47f0: 47 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Gt); VdbeCoverag
4800: 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 74 29  eIf(v,op==OP_Gt)
4810: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
4820: 28 6f 70 3d 3d 4f 50 5f 47 65 29 3b 20 56 64 62  (op==OP_Ge); Vdb
4830: 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70  eCoverageIf(v,op
4840: 3d 3d 4f 50 5f 47 65 29 3b 0a 20 20 20 20 20 20  ==OP_Ge);.      
4850: 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
4860: 45 71 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Eq); VdbeCoverag
4870: 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 45 71 29  eIf(v,op==OP_Eq)
4880: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
4890: 28 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 20 56 64 62  (op==OP_Ne); Vdb
48a0: 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70  eCoverageIf(v,op
48b0: 3d 3d 4f 50 5f 4e 65 29 3b 0a 20 20 20 20 20 20  ==OP_Ne);.      
48c0: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
48d0: 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
48e0: 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 73  gFree1);.      s
48f0: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
4900: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
4910: 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 69 66  Free2);.      if
4920: 28 20 69 3e 30 20 29 20 73 71 6c 69 74 65 33 45  ( i>0 ) sqlite3E
4930: 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72  xprCachePop(pPar
4940: 73 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69  se);.      if( i
4950: 3d 3d 6e 4c 65 66 74 2d 31 20 29 7b 0a 20 20 20  ==nLeft-1 ){.   
4960: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
4970: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6f 70    }.      if( op
4980: 78 3d 3d 54 4b 5f 45 51 20 29 7b 0a 20 20 20 20  x==TK_EQ ){.    
4990: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
49a0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 4e 6f  ddOp2(v, OP_IfNo
49b0: 74 2c 20 64 65 73 74 2c 20 61 64 64 72 44 6f 6e  t, dest, addrDon
49c0: 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  e); VdbeCoverage
49d0: 28 76 29 3b 0a 20 20 20 20 20 20 20 20 70 35 20  (v);.        p5 
49e0: 7c 3d 20 53 51 4c 49 54 45 5f 4b 45 45 50 4e 55  |= SQLITE_KEEPNU
49f0: 4c 4c 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  LL;.      }else 
4a00: 69 66 28 20 6f 70 78 3d 3d 54 4b 5f 4e 45 20 29  if( opx==TK_NE )
4a10: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
4a20: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
4a30: 50 5f 49 66 2c 20 64 65 73 74 2c 20 61 64 64 72  P_If, dest, addr
4a40: 44 6f 6e 65 29 3b 20 56 64 62 65 43 6f 76 65 72  Done); VdbeCover
4a50: 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
4a60: 70 35 20 7c 3d 20 53 51 4c 49 54 45 5f 4b 45 45  p5 |= SQLITE_KEE
4a70: 50 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 7d 65 6c  PNULL;.      }el
4a80: 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  se{.        asse
4a90: 72 74 28 20 6f 70 3d 3d 54 4b 5f 4c 54 20 7c 7c  rt( op==TK_LT ||
4aa0: 20 6f 70 3d 3d 54 4b 5f 47 54 20 7c 7c 20 6f 70   op==TK_GT || op
4ab0: 3d 3d 54 4b 5f 4c 45 20 7c 7c 20 6f 70 3d 3d 54  ==TK_LE || op==T
4ac0: 4b 5f 47 45 20 29 3b 0a 20 20 20 20 20 20 20 20  K_GE );.        
4ad0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4ae0: 32 28 76 2c 20 4f 50 5f 45 6c 73 65 4e 6f 74 45  2(v, OP_ElseNotE
4af0: 71 2c 20 30 2c 20 61 64 64 72 44 6f 6e 65 29 3b  q, 0, addrDone);
4b00: 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76  .        VdbeCov
4b10: 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54  erageIf(v, op==T
4b20: 4b 5f 4c 54 29 3b 0a 20 20 20 20 20 20 20 20 56  K_LT);.        V
4b30: 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
4b40: 20 6f 70 3d 3d 54 4b 5f 47 54 29 3b 0a 20 20 20   op==TK_GT);.   
4b50: 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
4b60: 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4c 45  eIf(v, op==TK_LE
4b70: 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43  );.        VdbeC
4b80: 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d  overageIf(v, op=
4b90: 3d 54 4b 5f 47 45 29 3b 0a 20 20 20 20 20 20 20  =TK_GE);.       
4ba0: 20 69 66 28 20 69 3d 3d 6e 4c 65 66 74 2d 32 20   if( i==nLeft-2 
4bb0: 29 20 6f 70 78 20 3d 20 6f 70 3b 0a 20 20 20 20  ) opx = op;.    
4bc0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
4bd0: 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
4be0: 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 44 6f 6e  Label(v, addrDon
4bf0: 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 53  e);.  }.}..#if S
4c00: 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44  QLITE_MAX_EXPR_D
4c10: 45 50 54 48 3e 30 0a 2f 2a 0a 2a 2a 20 43 68 65  EPTH>0./*.** Che
4c20: 63 6b 20 74 68 61 74 20 61 72 67 75 6d 65 6e 74  ck that argument
4c30: 20 6e 48 65 69 67 68 74 20 69 73 20 6c 65 73 73   nHeight is less
4c40: 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
4c50: 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 0a 2a 2a  o the maximum.**
4c60: 20 65 78 70 72 65 73 73 69 6f 6e 20 64 65 70 74   expression dept
4c70: 68 20 61 6c 6c 6f 77 65 64 2e 20 49 66 20 69 74  h allowed. If it
4c80: 20 69 73 20 6e 6f 74 2c 20 6c 65 61 76 65 20 61   is not, leave a
4c90: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
4ca0: 69 6e 0a 2a 2a 20 70 50 61 72 73 65 2e 0a 2a 2f  in.** pParse..*/
4cb0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
4cc0: 43 68 65 63 6b 48 65 69 67 68 74 28 50 61 72 73  CheckHeight(Pars
4cd0: 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 6e  e *pParse, int n
4ce0: 48 65 69 67 68 74 29 7b 0a 20 20 69 6e 74 20 72  Height){.  int r
4cf0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
4d00: 20 69 6e 74 20 6d 78 48 65 69 67 68 74 20 3d 20   int mxHeight = 
4d10: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 4c 69 6d  pParse->db->aLim
4d20: 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
4d30: 45 58 50 52 5f 44 45 50 54 48 5d 3b 0a 20 20 69  EXPR_DEPTH];.  i
4d40: 66 28 20 6e 48 65 69 67 68 74 3e 6d 78 48 65 69  f( nHeight>mxHei
4d50: 67 68 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ght ){.    sqlit
4d60: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
4d70: 65 2c 20 0a 20 20 20 20 20 20 20 22 45 78 70 72  e, .       "Expr
4d80: 65 73 73 69 6f 6e 20 74 72 65 65 20 69 73 20 74  ession tree is t
4d90: 6f 6f 20 6c 61 72 67 65 20 28 6d 61 78 69 6d 75  oo large (maximu
4da0: 6d 20 64 65 70 74 68 20 25 64 29 22 2c 20 6d 78  m depth %d)", mx
4db0: 48 65 69 67 68 74 0a 20 20 20 20 29 3b 0a 20 20  Height.    );.  
4dc0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
4dd0: 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ROR;.  }.  retur
4de0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20  n rc;.}../* The 
4df0: 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 72 65 65 20  following three 
4e00: 66 75 6e 63 74 69 6f 6e 73 2c 20 68 65 69 67 68  functions, heigh
4e10: 74 4f 66 45 78 70 72 28 29 2c 20 68 65 69 67 68  tOfExpr(), heigh
4e20: 74 4f 66 45 78 70 72 4c 69 73 74 28 29 0a 2a 2a  tOfExprList().**
4e30: 20 61 6e 64 20 68 65 69 67 68 74 4f 66 53 65 6c   and heightOfSel
4e40: 65 63 74 28 29 2c 20 61 72 65 20 75 73 65 64 20  ect(), are used 
4e50: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  to determine the
4e60: 20 6d 61 78 69 6d 75 6d 20 68 65 69 67 68 74 0a   maximum height.
4e70: 2a 2a 20 6f 66 20 61 6e 79 20 65 78 70 72 65 73  ** of any expres
4e80: 73 69 6f 6e 20 74 72 65 65 20 72 65 66 65 72 65  sion tree refere
4e90: 6e 63 65 64 20 62 79 20 74 68 65 20 73 74 72 75  nced by the stru
4ea0: 63 74 75 72 65 20 70 61 73 73 65 64 20 61 73 20  cture passed as 
4eb0: 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 61 72 67  the.** first arg
4ec0: 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ument..**.** If 
4ed0: 74 68 69 73 20 6d 61 78 69 6d 75 6d 20 68 65 69  this maximum hei
4ee0: 67 68 74 20 69 73 20 67 72 65 61 74 65 72 20 74  ght is greater t
4ef0: 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20  han the current 
4f00: 76 61 6c 75 65 20 70 6f 69 6e 74 65 64 0a 2a 2a  value pointed.**
4f10: 20 74 6f 20 62 79 20 70 6e 48 65 69 67 68 74 2c   to by pnHeight,
4f20: 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61   the second para
4f30: 6d 65 74 65 72 2c 20 74 68 65 6e 20 73 65 74 20  meter, then set 
4f40: 2a 70 6e 48 65 69 67 68 74 20 74 6f 20 74 68 61  *pnHeight to tha
4f50: 74 0a 2a 2a 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73  t.** value..*/.s
4f60: 74 61 74 69 63 20 76 6f 69 64 20 68 65 69 67 68  tatic void heigh
4f70: 74 4f 66 45 78 70 72 28 45 78 70 72 20 2a 70 2c  tOfExpr(Expr *p,
4f80: 20 69 6e 74 20 2a 70 6e 48 65 69 67 68 74 29 7b   int *pnHeight){
4f90: 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
4fa0: 69 66 28 20 70 2d 3e 6e 48 65 69 67 68 74 3e 2a  if( p->nHeight>*
4fb0: 70 6e 48 65 69 67 68 74 20 29 7b 0a 20 20 20 20  pnHeight ){.    
4fc0: 20 20 2a 70 6e 48 65 69 67 68 74 20 3d 20 70 2d    *pnHeight = p-
4fd0: 3e 6e 48 65 69 67 68 74 3b 0a 20 20 20 20 7d 0a  >nHeight;.    }.
4fe0: 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69    }.}.static voi
4ff0: 64 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69  d heightOfExprLi
5000: 73 74 28 45 78 70 72 4c 69 73 74 20 2a 70 2c 20  st(ExprList *p, 
5010: 69 6e 74 20 2a 70 6e 48 65 69 67 68 74 29 7b 0a  int *pnHeight){.
5020: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69    if( p ){.    i
5030: 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
5040: 30 3b 20 69 3c 70 2d 3e 6e 45 78 70 72 3b 20 69  0; i<p->nExpr; i
5050: 2b 2b 29 7b 0a 20 20 20 20 20 20 68 65 69 67 68  ++){.      heigh
5060: 74 4f 66 45 78 70 72 28 70 2d 3e 61 5b 69 5d 2e  tOfExpr(p->a[i].
5070: 70 45 78 70 72 2c 20 70 6e 48 65 69 67 68 74 29  pExpr, pnHeight)
5080: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74  ;.    }.  }.}.st
5090: 61 74 69 63 20 76 6f 69 64 20 68 65 69 67 68 74  atic void height
50a0: 4f 66 53 65 6c 65 63 74 28 53 65 6c 65 63 74 20  OfSelect(Select 
50b0: 2a 70 2c 20 69 6e 74 20 2a 70 6e 48 65 69 67 68  *p, int *pnHeigh
50c0: 74 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  t){.  if( p ){. 
50d0: 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 28     heightOfExpr(
50e0: 70 2d 3e 70 57 68 65 72 65 2c 20 70 6e 48 65 69  p->pWhere, pnHei
50f0: 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74  ght);.    height
5100: 4f 66 45 78 70 72 28 70 2d 3e 70 48 61 76 69 6e  OfExpr(p->pHavin
5110: 67 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20  g, pnHeight);.  
5120: 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 28 70    heightOfExpr(p
5130: 2d 3e 70 4c 69 6d 69 74 2c 20 70 6e 48 65 69 67  ->pLimit, pnHeig
5140: 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f  ht);.    heightO
5150: 66 45 78 70 72 28 70 2d 3e 70 4f 66 66 73 65 74  fExpr(p->pOffset
5160: 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20  , pnHeight);.   
5170: 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73   heightOfExprLis
5180: 74 28 70 2d 3e 70 45 4c 69 73 74 2c 20 70 6e 48  t(p->pEList, pnH
5190: 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67  eight);.    heig
51a0: 68 74 4f 66 45 78 70 72 4c 69 73 74 28 70 2d 3e  htOfExprList(p->
51b0: 70 47 72 6f 75 70 42 79 2c 20 70 6e 48 65 69 67  pGroupBy, pnHeig
51c0: 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f  ht);.    heightO
51d0: 66 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 4f 72  fExprList(p->pOr
51e0: 64 65 72 42 79 2c 20 70 6e 48 65 69 67 68 74 29  derBy, pnHeight)
51f0: 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 53 65  ;.    heightOfSe
5200: 6c 65 63 74 28 70 2d 3e 70 50 72 69 6f 72 2c 20  lect(p->pPrior, 
5210: 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 7d 0a 7d  pnHeight);.  }.}
5220: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
5230: 45 78 70 72 2e 6e 48 65 69 67 68 74 20 76 61 72  Expr.nHeight var
5240: 69 61 62 6c 65 20 69 6e 20 74 68 65 20 73 74 72  iable in the str
5250: 75 63 74 75 72 65 20 70 61 73 73 65 64 20 61 73  ucture passed as
5260: 20 61 6e 20 0a 2a 2a 20 61 72 67 75 6d 65 6e 74   an .** argument
5270: 2e 20 41 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  . An expression 
5280: 77 69 74 68 20 6e 6f 20 63 68 69 6c 64 72 65 6e  with no children
5290: 2c 20 45 78 70 72 2e 70 4c 69 73 74 20 6f 72 20  , Expr.pList or 
52a0: 0a 2a 2a 20 45 78 70 72 2e 70 53 65 6c 65 63 74  .** Expr.pSelect
52b0: 20 6d 65 6d 62 65 72 20 68 61 73 20 61 20 68 65   member has a he
52c0: 69 67 68 74 20 6f 66 20 31 2e 20 41 6e 79 20 6f  ight of 1. Any o
52d0: 74 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e 0a  ther expression.
52e0: 2a 2a 20 68 61 73 20 61 20 68 65 69 67 68 74 20  ** has a height 
52f0: 65 71 75 61 6c 20 74 6f 20 74 68 65 20 6d 61 78  equal to the max
5300: 69 6d 75 6d 20 68 65 69 67 68 74 20 6f 66 20 61  imum height of a
5310: 6e 79 20 6f 74 68 65 72 20 0a 2a 2a 20 72 65 66  ny other .** ref
5320: 65 72 65 6e 63 65 64 20 45 78 70 72 20 70 6c 75  erenced Expr plu
5330: 73 20 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73  s one..**.** Als
5340: 6f 20 70 72 6f 70 61 67 61 74 65 20 45 50 5f 50  o propagate EP_P
5350: 72 6f 70 61 67 61 74 65 20 66 6c 61 67 73 20 75  ropagate flags u
5360: 70 20 66 72 6f 6d 20 45 78 70 72 2e 78 2e 70 4c  p from Expr.x.pL
5370: 69 73 74 20 74 6f 20 45 78 70 72 2e 66 6c 61 67  ist to Expr.flag
5380: 73 2c 0a 2a 2a 20 69 66 20 61 70 70 72 6f 70 72  s,.** if appropr
5390: 69 61 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  iate..*/.static 
53a0: 76 6f 69 64 20 65 78 70 72 53 65 74 48 65 69 67  void exprSetHeig
53b0: 68 74 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69  ht(Expr *p){.  i
53c0: 6e 74 20 6e 48 65 69 67 68 74 20 3d 20 30 3b 0a  nt nHeight = 0;.
53d0: 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 28 70    heightOfExpr(p
53e0: 2d 3e 70 4c 65 66 74 2c 20 26 6e 48 65 69 67 68  ->pLeft, &nHeigh
53f0: 74 29 3b 0a 20 20 68 65 69 67 68 74 4f 66 45 78  t);.  heightOfEx
5400: 70 72 28 70 2d 3e 70 52 69 67 68 74 2c 20 26 6e  pr(p->pRight, &n
5410: 48 65 69 67 68 74 29 3b 0a 20 20 69 66 28 20 45  Height);.  if( E
5420: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
5430: 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
5440: 29 7b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 53  ){.    heightOfS
5450: 65 6c 65 63 74 28 70 2d 3e 78 2e 70 53 65 6c 65  elect(p->x.pSele
5460: 63 74 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a 20  ct, &nHeight);. 
5470: 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 78 2e   }else if( p->x.
5480: 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 68 65 69  pList ){.    hei
5490: 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28 70 2d  ghtOfExprList(p-
54a0: 3e 78 2e 70 4c 69 73 74 2c 20 26 6e 48 65 69 67  >x.pList, &nHeig
54b0: 68 74 29 3b 0a 20 20 20 20 70 2d 3e 66 6c 61 67  ht);.    p->flag
54c0: 73 20 7c 3d 20 45 50 5f 50 72 6f 70 61 67 61 74  s |= EP_Propagat
54d0: 65 20 26 20 73 71 6c 69 74 65 33 45 78 70 72 4c  e & sqlite3ExprL
54e0: 69 73 74 46 6c 61 67 73 28 70 2d 3e 78 2e 70 4c  istFlags(p->x.pL
54f0: 69 73 74 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6e  ist);.  }.  p->n
5500: 48 65 69 67 68 74 20 3d 20 6e 48 65 69 67 68 74  Height = nHeight
5510: 20 2b 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53   + 1;.}../*.** S
5520: 65 74 20 74 68 65 20 45 78 70 72 2e 6e 48 65 69  et the Expr.nHei
5530: 67 68 74 20 76 61 72 69 61 62 6c 65 20 75 73 69  ght variable usi
5540: 6e 67 20 74 68 65 20 65 78 70 72 53 65 74 48 65  ng the exprSetHe
5550: 69 67 68 74 28 29 20 66 75 6e 63 74 69 6f 6e 2e  ight() function.
5560: 20 49 66 0a 2a 2a 20 74 68 65 20 68 65 69 67 68   If.** the heigh
5570: 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  t is greater tha
5580: 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 61 6c  n the maximum al
5590: 6c 6f 77 65 64 20 65 78 70 72 65 73 73 69 6f 6e  lowed expression
55a0: 20 64 65 70 74 68 2c 0a 2a 2a 20 6c 65 61 76 65   depth,.** leave
55b0: 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 70 50 61   an error in pPa
55c0: 72 73 65 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20  rse..**.** Also 
55d0: 70 72 6f 70 61 67 61 74 65 20 61 6c 6c 20 45 50  propagate all EP
55e0: 5f 50 72 6f 70 61 67 61 74 65 20 66 6c 61 67 73  _Propagate flags
55f0: 20 66 72 6f 6d 20 74 68 65 20 45 78 70 72 2e 78   from the Expr.x
5600: 2e 70 4c 69 73 74 20 69 6e 74 6f 0a 2a 2a 20 45  .pList into.** E
5610: 78 70 72 2e 66 6c 61 67 73 2e 20 0a 2a 2f 0a 76  xpr.flags. .*/.v
5620: 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 53  oid sqlite3ExprS
5630: 65 74 48 65 69 67 68 74 41 6e 64 46 6c 61 67 73  etHeightAndFlags
5640: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
5650: 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20  Expr *p){.  if( 
5660: 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 72  pParse->nErr ) r
5670: 65 74 75 72 6e 3b 0a 20 20 65 78 70 72 53 65 74  eturn;.  exprSet
5680: 48 65 69 67 68 74 28 70 29 3b 0a 20 20 73 71 6c  Height(p);.  sql
5690: 69 74 65 33 45 78 70 72 43 68 65 63 6b 48 65 69  ite3ExprCheckHei
56a0: 67 68 74 28 70 50 61 72 73 65 2c 20 70 2d 3e 6e  ght(pParse, p->n
56b0: 48 65 69 67 68 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Height);.}../*.*
56c0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6d 61 78  * Return the max
56d0: 69 6d 75 6d 20 68 65 69 67 68 74 20 6f 66 20 61  imum height of a
56e0: 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  ny expression tr
56f0: 65 65 20 72 65 66 65 72 65 6e 63 65 64 0a 2a 2a  ee referenced.**
5700: 20 62 79 20 74 68 65 20 73 65 6c 65 63 74 20 73   by the select s
5710: 74 61 74 65 6d 65 6e 74 20 70 61 73 73 65 64 20  tatement passed 
5720: 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 0a  as an argument..
5730: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 65  */.int sqlite3Se
5740: 6c 65 63 74 45 78 70 72 48 65 69 67 68 74 28 53  lectExprHeight(S
5750: 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69 6e 74  elect *p){.  int
5760: 20 6e 48 65 69 67 68 74 20 3d 20 30 3b 0a 20 20   nHeight = 0;.  
5770: 68 65 69 67 68 74 4f 66 53 65 6c 65 63 74 28 70  heightOfSelect(p
5780: 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a 20 20 72  , &nHeight);.  r
5790: 65 74 75 72 6e 20 6e 48 65 69 67 68 74 3b 0a 7d  eturn nHeight;.}
57a0: 0a 23 65 6c 73 65 20 2f 2a 20 41 42 4f 56 45 3a  .#else /* ABOVE:
57b0: 20 20 48 65 69 67 68 74 20 65 6e 66 6f 72 63 65    Height enforce
57c0: 6d 65 6e 74 20 65 6e 61 62 6c 65 64 2e 20 20 42  ment enabled.  B
57d0: 45 4c 4f 57 3a 20 48 65 69 67 68 74 20 65 6e 66  ELOW: Height enf
57e0: 6f 72 63 65 6d 65 6e 74 20 6f 66 66 20 2a 2f 0a  orcement off */.
57f0: 2f 2a 0a 2a 2a 20 50 72 6f 70 61 67 61 74 65 20  /*.** Propagate 
5800: 61 6c 6c 20 45 50 5f 50 72 6f 70 61 67 61 74 65  all EP_Propagate
5810: 20 66 6c 61 67 73 20 66 72 6f 6d 20 74 68 65 20   flags from the 
5820: 45 78 70 72 2e 78 2e 70 4c 69 73 74 20 69 6e 74  Expr.x.pList int
5830: 6f 0a 2a 2a 20 45 78 70 72 2e 66 6c 61 67 73 2e  o.** Expr.flags.
5840: 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65   .*/.void sqlite
5850: 33 45 78 70 72 53 65 74 48 65 69 67 68 74 41 6e  3ExprSetHeightAn
5860: 64 46 6c 61 67 73 28 50 61 72 73 65 20 2a 70 50  dFlags(Parse *pP
5870: 61 72 73 65 2c 20 45 78 70 72 20 2a 70 29 7b 0a  arse, Expr *p){.
5880: 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e 78 2e    if( p && p->x.
5890: 70 4c 69 73 74 20 26 26 20 21 45 78 70 72 48 61  pList && !ExprHa
58a0: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
58b0: 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20  xIsSelect) ){.  
58c0: 20 20 70 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50    p->flags |= EP
58d0: 5f 50 72 6f 70 61 67 61 74 65 20 26 20 73 71 6c  _Propagate & sql
58e0: 69 74 65 33 45 78 70 72 4c 69 73 74 46 6c 61 67  ite3ExprListFlag
58f0: 73 28 70 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20  s(p->x.pList);. 
5900: 20 7d 0a 7d 0a 23 64 65 66 69 6e 65 20 65 78 70   }.}.#define exp
5910: 72 53 65 74 48 65 69 67 68 74 28 79 29 0a 23 65  rSetHeight(y).#e
5920: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4d  ndif /* SQLITE_M
5930: 41 58 5f 45 58 50 52 5f 44 45 50 54 48 3e 30 20  AX_EXPR_DEPTH>0 
5940: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  */../*.** This r
5950: 6f 75 74 69 6e 65 20 69 73 20 74 68 65 20 63 6f  outine is the co
5960: 72 65 20 61 6c 6c 6f 63 61 74 6f 72 20 66 6f 72  re allocator for
5970: 20 45 78 70 72 20 6e 6f 64 65 73 2e 0a 2a 2a 0a   Expr nodes..**.
5980: 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20 6e  ** Construct a n
5990: 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f  ew expression no
59a0: 64 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20  de and return a 
59b0: 70 6f 69 6e 74 65 72 20 74 6f 20 69 74 2e 20 20  pointer to it.  
59c0: 4d 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72 20 74 68  Memory.** for th
59d0: 69 73 20 6e 6f 64 65 20 61 6e 64 20 66 6f 72 20  is node and for 
59e0: 74 68 65 20 70 54 6f 6b 65 6e 20 61 72 67 75 6d  the pToken argum
59f0: 65 6e 74 20 69 73 20 61 20 73 69 6e 67 6c 65 20  ent is a single 
5a00: 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 6f 62  allocation.** ob
5a10: 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  tained from sqli
5a20: 74 65 33 44 62 4d 61 6c 6c 6f 63 28 29 2e 20 20  te3DbMalloc().  
5a30: 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63  The calling func
5a40: 74 69 6f 6e 0a 2a 2a 20 69 73 20 72 65 73 70 6f  tion.** is respo
5a50: 6e 73 69 62 6c 65 20 66 6f 72 20 6d 61 6b 69 6e  nsible for makin
5a60: 67 20 73 75 72 65 20 74 68 65 20 6e 6f 64 65 20  g sure the node 
5a70: 65 76 65 6e 74 75 61 6c 6c 79 20 67 65 74 73 20  eventually gets 
5a80: 66 72 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  freed..**.** If 
5a90: 64 65 71 75 6f 74 65 20 69 73 20 74 72 75 65 2c  dequote is true,
5aa0: 20 74 68 65 6e 20 74 68 65 20 74 6f 6b 65 6e 20   then the token 
5ab0: 28 69 66 20 69 74 20 65 78 69 73 74 73 29 20 69  (if it exists) i
5ac0: 73 20 64 65 71 75 6f 74 65 64 2e 0a 2a 2a 20 49  s dequoted..** I
5ad0: 66 20 64 65 71 75 6f 74 65 20 69 73 20 66 61 6c  f dequote is fal
5ae0: 73 65 2c 20 6e 6f 20 64 65 71 75 6f 74 69 6e 67  se, no dequoting
5af0: 20 69 73 20 70 65 72 66 6f 72 6d 65 64 2e 20 20   is performed.  
5b00: 54 68 65 20 64 65 51 75 6f 74 65 0a 2a 2a 20 70  The deQuote.** p
5b10: 61 72 61 6d 65 74 65 72 20 69 73 20 69 67 6e 6f  arameter is igno
5b20: 72 65 64 20 69 66 20 70 54 6f 6b 65 6e 20 69 73  red if pToken is
5b30: 20 4e 55 4c 4c 20 6f 72 20 69 66 20 74 68 65 20   NULL or if the 
5b40: 74 6f 6b 65 6e 20 64 6f 65 73 20 6e 6f 74 0a 2a  token does not.*
5b50: 2a 20 61 70 70 65 61 72 20 74 6f 20 62 65 20 71  * appear to be q
5b60: 75 6f 74 65 64 2e 20 20 49 66 20 74 68 65 20 71  uoted.  If the q
5b70: 75 6f 74 65 73 20 77 65 72 65 20 6f 66 20 74 68  uotes were of th
5b80: 65 20 66 6f 72 6d 20 22 2e 2e 2e 22 20 28 64 6f  e form "..." (do
5b90: 75 62 6c 65 2d 71 75 6f 74 65 73 29 0a 2a 2a 20  uble-quotes).** 
5ba0: 74 68 65 6e 20 74 68 65 20 45 50 5f 44 62 6c 51  then the EP_DblQ
5bb0: 75 6f 74 65 64 20 66 6c 61 67 20 69 73 20 73 65  uoted flag is se
5bc0: 74 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73  t on the express
5bd0: 69 6f 6e 20 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  ion node..**.** 
5be0: 53 70 65 63 69 61 6c 20 63 61 73 65 3a 20 20 49  Special case:  I
5bf0: 66 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47 45 52  f op==TK_INTEGER
5c00: 20 61 6e 64 20 70 54 6f 6b 65 6e 20 70 6f 69 6e   and pToken poin
5c10: 74 73 20 74 6f 20 61 20 73 74 72 69 6e 67 20 74  ts to a string t
5c20: 68 61 74 0a 2a 2a 20 63 61 6e 20 62 65 20 74 72  hat.** can be tr
5c30: 61 6e 73 6c 61 74 65 64 20 69 6e 74 6f 20 61 20  anslated into a 
5c40: 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 2c 20  32-bit integer, 
5c50: 74 68 65 6e 20 74 68 65 20 74 6f 6b 65 6e 20 69  then the token i
5c60: 73 20 6e 6f 74 0a 2a 2a 20 73 74 6f 72 65 64 20  s not.** stored 
5c70: 69 6e 20 75 2e 7a 54 6f 6b 65 6e 2e 20 20 49 6e  in u.zToken.  In
5c80: 73 74 65 61 64 2c 20 74 68 65 20 69 6e 74 65 67  stead, the integ
5c90: 65 72 20 76 61 6c 75 65 73 20 69 73 20 77 72 69  er values is wri
5ca0: 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f 20 75 2e 69  tten.** into u.i
5cb0: 56 61 6c 75 65 20 61 6e 64 20 74 68 65 20 45 50  Value and the EP
5cc0: 5f 49 6e 74 56 61 6c 75 65 20 66 6c 61 67 20 69  _IntValue flag i
5cd0: 73 20 73 65 74 2e 20 20 4e 6f 20 65 78 74 72 61  s set.  No extra
5ce0: 20 73 74 6f 72 61 67 65 0a 2a 2a 20 69 73 20 61   storage.** is a
5cf0: 6c 6c 6f 63 61 74 65 64 20 74 6f 20 68 6f 6c 64  llocated to hold
5d00: 20 74 68 65 20 69 6e 74 65 67 65 72 20 74 65 78   the integer tex
5d10: 74 20 61 6e 64 20 74 68 65 20 64 65 71 75 6f 74  t and the dequot
5d20: 65 20 66 6c 61 67 20 69 73 20 69 67 6e 6f 72 65  e flag is ignore
5d30: 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69  d..*/.Expr *sqli
5d40: 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 0a 20 20  te3ExprAlloc(.  
5d50: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
5d60: 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c          /* Handl
5d70: 65 20 66 6f 72 20 73 71 6c 69 74 65 33 44 62 4d  e for sqlite3DbM
5d80: 61 6c 6c 6f 63 5a 65 72 6f 28 29 20 28 6d 61 79  allocZero() (may
5d90: 20 62 65 20 6e 75 6c 6c 29 20 2a 2f 0a 20 20 69   be null) */.  i
5da0: 6e 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20  nt op,          
5db0: 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73         /* Expres
5dc0: 73 69 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20  sion opcode */. 
5dd0: 20 63 6f 6e 73 74 20 54 6f 6b 65 6e 20 2a 70 54   const Token *pT
5de0: 6f 6b 65 6e 2c 20 20 20 20 2f 2a 20 54 6f 6b 65  oken,    /* Toke
5df0: 6e 20 61 72 67 75 6d 65 6e 74 2e 20 20 4d 69 67  n argument.  Mig
5e00: 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ht be NULL */.  
5e10: 69 6e 74 20 64 65 71 75 6f 74 65 20 20 20 20 20  int dequote     
5e20: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
5e30: 74 6f 20 64 65 71 75 6f 74 65 20 2a 2f 0a 29 7b  to dequote */.){
5e40: 0a 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20  .  Expr *pNew;. 
5e50: 20 69 6e 74 20 6e 45 78 74 72 61 20 3d 20 30 3b   int nExtra = 0;
5e60: 0a 20 20 69 6e 74 20 69 56 61 6c 75 65 20 3d 20  .  int iValue = 
5e70: 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62  0;..  assert( db
5e80: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 54 6f  !=0 );.  if( pTo
5e90: 6b 65 6e 20 29 7b 0a 20 20 20 20 69 66 28 20 6f  ken ){.    if( o
5ea0: 70 21 3d 54 4b 5f 49 4e 54 45 47 45 52 20 7c 7c  p!=TK_INTEGER ||
5eb0: 20 70 54 6f 6b 65 6e 2d 3e 7a 3d 3d 30 0a 20 20   pToken->z==0.  
5ec0: 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74          || sqlit
5ed0: 65 33 47 65 74 49 6e 74 33 32 28 70 54 6f 6b 65  e3GetInt32(pToke
5ee0: 6e 2d 3e 7a 2c 20 26 69 56 61 6c 75 65 29 3d 3d  n->z, &iValue)==
5ef0: 30 20 29 7b 0a 20 20 20 20 20 20 6e 45 78 74 72  0 ){.      nExtr
5f00: 61 20 3d 20 70 54 6f 6b 65 6e 2d 3e 6e 2b 31 3b  a = pToken->n+1;
5f10: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
5f20: 56 61 6c 75 65 3e 3d 30 20 29 3b 0a 20 20 20 20  Value>=0 );.    
5f30: 7d 0a 20 20 7d 0a 20 20 70 4e 65 77 20 3d 20 73  }.  }.  pNew = s
5f40: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
5f50: 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 45  wNN(db, sizeof(E
5f60: 78 70 72 29 2b 6e 45 78 74 72 61 29 3b 0a 20 20  xpr)+nExtra);.  
5f70: 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20  if( pNew ){.    
5f80: 6d 65 6d 73 65 74 28 70 4e 65 77 2c 20 30 2c 20  memset(pNew, 0, 
5f90: 73 69 7a 65 6f 66 28 45 78 70 72 29 29 3b 0a 20  sizeof(Expr));. 
5fa0: 20 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 28 75     pNew->op = (u
5fb0: 38 29 6f 70 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  8)op;.    pNew->
5fc0: 69 41 67 67 20 3d 20 2d 31 3b 0a 20 20 20 20 69  iAgg = -1;.    i
5fd0: 66 28 20 70 54 6f 6b 65 6e 20 29 7b 0a 20 20 20  f( pToken ){.   
5fe0: 20 20 20 69 66 28 20 6e 45 78 74 72 61 3d 3d 30     if( nExtra==0
5ff0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77   ){.        pNew
6000: 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 49 6e  ->flags |= EP_In
6010: 74 56 61 6c 75 65 3b 0a 20 20 20 20 20 20 20 20  tValue;.        
6020: 70 4e 65 77 2d 3e 75 2e 69 56 61 6c 75 65 20 3d  pNew->u.iValue =
6030: 20 69 56 61 6c 75 65 3b 0a 20 20 20 20 20 20 7d   iValue;.      }
6040: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 4e  else{.        pN
6050: 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 3d 20 28  ew->u.zToken = (
6060: 63 68 61 72 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a  char*)&pNew[1];.
6070: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
6080: 70 54 6f 6b 65 6e 2d 3e 7a 21 3d 30 20 7c 7c 20  pToken->z!=0 || 
6090: 70 54 6f 6b 65 6e 2d 3e 6e 3d 3d 30 20 29 3b 0a  pToken->n==0 );.
60a0: 20 20 20 20 20 20 20 20 69 66 28 20 70 54 6f 6b          if( pTok
60b0: 65 6e 2d 3e 6e 20 29 20 6d 65 6d 63 70 79 28 70  en->n ) memcpy(p
60c0: 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 70  New->u.zToken, p
60d0: 54 6f 6b 65 6e 2d 3e 7a 2c 20 70 54 6f 6b 65 6e  Token->z, pToken
60e0: 2d 3e 6e 29 3b 0a 20 20 20 20 20 20 20 20 70 4e  ->n);.        pN
60f0: 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 70 54 6f  ew->u.zToken[pTo
6100: 6b 65 6e 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 20  ken->n] = 0;.   
6110: 20 20 20 20 20 69 66 28 20 64 65 71 75 6f 74 65       if( dequote
6120: 20 26 26 20 73 71 6c 69 74 65 33 49 73 71 75 6f   && sqlite3Isquo
6130: 74 65 28 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65  te(pNew->u.zToke
6140: 6e 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  n[0]) ){.       
6150: 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 75 2e 7a     if( pNew->u.z
6160: 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 22 27 20 29 20  Token[0]=='"' ) 
6170: 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45  pNew->flags |= E
6180: 50 5f 44 62 6c 51 75 6f 74 65 64 3b 0a 20 20 20  P_DblQuoted;.   
6190: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
61a0: 71 75 6f 74 65 28 70 4e 65 77 2d 3e 75 2e 7a 54  quote(pNew->u.zT
61b0: 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 7d  oken);.        }
61c0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
61d0: 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58  if SQLITE_MAX_EX
61e0: 50 52 5f 44 45 50 54 48 3e 30 0a 20 20 20 20 70  PR_DEPTH>0.    p
61f0: 4e 65 77 2d 3e 6e 48 65 69 67 68 74 20 3d 20 31  New->nHeight = 1
6200: 3b 0a 23 65 6e 64 69 66 20 20 0a 20 20 7d 0a 20  ;.#endif  .  }. 
6210: 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a   return pNew;.}.
6220: 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
6230: 61 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e  a new expression
6240: 20 6e 6f 64 65 20 66 72 6f 6d 20 61 20 7a 65 72   node from a zer
6250: 6f 2d 74 65 72 6d 69 6e 61 74 65 64 20 74 6f 6b  o-terminated tok
6260: 65 6e 20 74 68 61 74 20 68 61 73 0a 2a 2a 20 61  en that has.** a
6270: 6c 72 65 61 64 79 20 62 65 65 6e 20 64 65 71 75  lready been dequ
6280: 6f 74 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73  oted..*/.Expr *s
6290: 71 6c 69 74 65 33 45 78 70 72 28 0a 20 20 73 71  qlite3Expr(.  sq
62a0: 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
62b0: 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20        /* Handle 
62c0: 66 6f 72 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  for sqlite3DbMal
62d0: 6c 6f 63 5a 65 72 6f 28 29 20 28 6d 61 79 20 62  locZero() (may b
62e0: 65 20 6e 75 6c 6c 29 20 2a 2f 0a 20 20 69 6e 74  e null) */.  int
62f0: 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   op,            
6300: 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69       /* Expressi
6310: 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 63  on opcode */.  c
6320: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 6f 6b 65  onst char *zToke
6330: 6e 20 20 20 20 20 20 2f 2a 20 54 6f 6b 65 6e 20  n      /* Token 
6340: 61 72 67 75 6d 65 6e 74 2e 20 20 4d 69 67 68 74  argument.  Might
6350: 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20   be NULL */.){. 
6360: 20 54 6f 6b 65 6e 20 78 3b 0a 20 20 78 2e 7a 20   Token x;.  x.z 
6370: 3d 20 7a 54 6f 6b 65 6e 3b 0a 20 20 78 2e 6e 20  = zToken;.  x.n 
6380: 3d 20 7a 54 6f 6b 65 6e 20 3f 20 73 71 6c 69 74  = zToken ? sqlit
6390: 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 6f 6b 65  e3Strlen30(zToke
63a0: 6e 29 20 3a 20 30 3b 0a 20 20 72 65 74 75 72 6e  n) : 0;.  return
63b0: 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f   sqlite3ExprAllo
63c0: 63 28 64 62 2c 20 6f 70 2c 20 26 78 2c 20 30 29  c(db, op, &x, 0)
63d0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 61 63  ;.}../*.** Attac
63e0: 68 20 73 75 62 74 72 65 65 73 20 70 4c 65 66 74  h subtrees pLeft
63f0: 20 61 6e 64 20 70 52 69 67 68 74 20 74 6f 20 74   and pRight to t
6400: 68 65 20 45 78 70 72 20 6e 6f 64 65 20 70 52 6f  he Expr node pRo
6410: 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 52 6f  ot..**.** If pRo
6420: 6f 74 3d 3d 4e 55 4c 4c 20 74 68 61 74 20 6d 65  ot==NULL that me
6430: 61 6e 73 20 74 68 61 74 20 61 20 6d 65 6d 6f 72  ans that a memor
6440: 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72  y allocation err
6450: 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65 64 2e  or has occurred.
6460: 0a 2a 2a 20 49 6e 20 74 68 61 74 20 63 61 73 65  .** In that case
6470: 2c 20 64 65 6c 65 74 65 20 74 68 65 20 73 75 62  , delete the sub
6480: 74 72 65 65 73 20 70 4c 65 66 74 20 61 6e 64 20  trees pLeft and 
6490: 70 52 69 67 68 74 2e 0a 2a 2f 0a 76 6f 69 64 20  pRight..*/.void 
64a0: 73 71 6c 69 74 65 33 45 78 70 72 41 74 74 61 63  sqlite3ExprAttac
64b0: 68 53 75 62 74 72 65 65 73 28 0a 20 20 73 71 6c  hSubtrees(.  sql
64c0: 69 74 65 33 20 2a 64 62 2c 0a 20 20 45 78 70 72  ite3 *db,.  Expr
64d0: 20 2a 70 52 6f 6f 74 2c 0a 20 20 45 78 70 72 20   *pRoot,.  Expr 
64e0: 2a 70 4c 65 66 74 2c 0a 20 20 45 78 70 72 20 2a  *pLeft,.  Expr *
64f0: 70 52 69 67 68 74 0a 29 7b 0a 20 20 69 66 28 20  pRight.){.  if( 
6500: 70 52 6f 6f 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pRoot==0 ){.    
6510: 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c  assert( db->mall
6520: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
6530: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
6540: 65 28 64 62 2c 20 70 4c 65 66 74 29 3b 0a 20 20  e(db, pLeft);.  
6550: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
6560: 65 74 65 28 64 62 2c 20 70 52 69 67 68 74 29 3b  ete(db, pRight);
6570: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66  .  }else{.    if
6580: 28 20 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20  ( pRight ){.    
6590: 20 20 70 52 6f 6f 74 2d 3e 70 52 69 67 68 74 20    pRoot->pRight 
65a0: 3d 20 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20  = pRight;.      
65b0: 70 52 6f 6f 74 2d 3e 66 6c 61 67 73 20 7c 3d 20  pRoot->flags |= 
65c0: 45 50 5f 50 72 6f 70 61 67 61 74 65 20 26 20 70  EP_Propagate & p
65d0: 52 69 67 68 74 2d 3e 66 6c 61 67 73 3b 0a 20 20  Right->flags;.  
65e0: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 65 66    }.    if( pLef
65f0: 74 20 29 7b 0a 20 20 20 20 20 20 70 52 6f 6f 74  t ){.      pRoot
6600: 2d 3e 70 4c 65 66 74 20 3d 20 70 4c 65 66 74 3b  ->pLeft = pLeft;
6610: 0a 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e 66 6c  .      pRoot->fl
6620: 61 67 73 20 7c 3d 20 45 50 5f 50 72 6f 70 61 67  ags |= EP_Propag
6630: 61 74 65 20 26 20 70 4c 65 66 74 2d 3e 66 6c 61  ate & pLeft->fla
6640: 67 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 78  gs;.    }.    ex
6650: 70 72 53 65 74 48 65 69 67 68 74 28 70 52 6f 6f  prSetHeight(pRoo
6660: 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  t);.  }.}../*.**
6670: 20 41 6c 6c 6f 63 61 74 65 20 61 6e 20 45 78 70   Allocate an Exp
6680: 72 20 6e 6f 64 65 20 77 68 69 63 68 20 6a 6f 69  r node which joi
6690: 6e 73 20 61 73 20 6d 61 6e 79 20 61 73 20 74 77  ns as many as tw
66a0: 6f 20 73 75 62 74 72 65 65 73 2e 0a 2a 2a 0a 2a  o subtrees..**.*
66b0: 2a 20 4f 6e 65 20 6f 72 20 62 6f 74 68 20 6f 66  * One or both of
66c0: 20 74 68 65 20 73 75 62 74 72 65 65 73 20 63 61   the subtrees ca
66d0: 6e 20 62 65 20 4e 55 4c 4c 2e 20 20 52 65 74 75  n be NULL.  Retu
66e0: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
66f0: 74 68 65 20 6e 65 77 0a 2a 2a 20 45 78 70 72 20  the new.** Expr 
6700: 6e 6f 64 65 2e 20 20 4f 72 2c 20 69 66 20 61 6e  node.  Or, if an
6710: 20 4f 4f 4d 20 65 72 72 6f 72 20 6f 63 63 75 72   OOM error occur
6720: 73 2c 20 73 65 74 20 70 50 61 72 73 65 2d 3e 64  s, set pParse->d
6730: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 2c  b->mallocFailed,
6740: 0a 2a 2a 20 66 72 65 65 20 74 68 65 20 73 75 62  .** free the sub
6750: 74 72 65 65 73 20 61 6e 64 20 72 65 74 75 72 6e  trees and return
6760: 20 4e 55 4c 4c 2e 0a 2a 2f 0a 45 78 70 72 20 2a   NULL..*/.Expr *
6770: 73 71 6c 69 74 65 33 50 45 78 70 72 28 0a 20 20  sqlite3PExpr(.  
6780: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
6790: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
67a0: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
67b0: 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20  int op,         
67c0: 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65          /* Expre
67d0: 73 73 69 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a  ssion opcode */.
67e0: 20 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 20    Expr *pLeft,  
67f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 66            /* Lef
6800: 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 45  t operand */.  E
6810: 78 70 72 20 2a 70 52 69 67 68 74 2c 20 20 20 20  xpr *pRight,    
6820: 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20         /* Right 
6830: 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 63 6f 6e  operand */.  con
6840: 73 74 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e  st Token *pToken
6850: 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74       /* Argument
6860: 20 74 6f 6b 65 6e 20 2a 2f 0a 29 7b 0a 20 20 45   token */.){.  E
6870: 78 70 72 20 2a 70 3b 0a 20 20 69 66 28 20 6f 70  xpr *p;.  if( op
6880: 3d 3d 54 4b 5f 41 4e 44 20 26 26 20 70 50 61 72  ==TK_AND && pPar
6890: 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a 20  se->nErr==0 ){. 
68a0: 20 20 20 2f 2a 20 54 61 6b 65 20 61 64 76 61 6e     /* Take advan
68b0: 74 61 67 65 20 6f 66 20 73 68 6f 72 74 2d 63 69  tage of short-ci
68c0: 72 63 75 69 74 20 66 61 6c 73 65 20 6f 70 74 69  rcuit false opti
68d0: 6d 69 7a 61 74 69 6f 6e 20 66 6f 72 20 41 4e 44  mization for AND
68e0: 20 2a 2f 0a 20 20 20 20 70 20 3d 20 73 71 6c 69   */.    p = sqli
68f0: 74 65 33 45 78 70 72 41 6e 64 28 70 50 61 72 73  te3ExprAnd(pPars
6900: 65 2d 3e 64 62 2c 20 70 4c 65 66 74 2c 20 70 52  e->db, pLeft, pR
6910: 69 67 68 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ight);.  }else{.
6920: 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 45      p = sqlite3E
6930: 78 70 72 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d  xprAlloc(pParse-
6940: 3e 64 62 2c 20 6f 70 20 26 20 54 4b 46 4c 47 5f  >db, op & TKFLG_
6950: 4d 41 53 4b 2c 20 70 54 6f 6b 65 6e 2c 20 31 29  MASK, pToken, 1)
6960: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
6970: 72 41 74 74 61 63 68 53 75 62 74 72 65 65 73 28  rAttachSubtrees(
6980: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 2c 20 70  pParse->db, p, p
6990: 4c 65 66 74 2c 20 70 52 69 67 68 74 29 3b 0a 20  Left, pRight);. 
69a0: 20 7d 0a 20 20 69 66 28 20 70 20 29 20 7b 0a 20   }.  if( p ) {. 
69b0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 68     sqlite3ExprCh
69c0: 65 63 6b 48 65 69 67 68 74 28 70 50 61 72 73 65  eckHeight(pParse
69d0: 2c 20 70 2d 3e 6e 48 65 69 67 68 74 29 3b 0a 20  , p->nHeight);. 
69e0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d   }.  return p;.}
69f0: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 70 53 65 6c  ../*.** Add pSel
6a00: 65 63 74 20 74 6f 20 74 68 65 20 45 78 70 72 2e  ect to the Expr.
6a10: 78 2e 70 53 65 6c 65 63 74 20 66 69 65 6c 64 2e  x.pSelect field.
6a20: 20 20 4f 72 2c 20 69 66 20 70 45 78 70 72 20 69    Or, if pExpr i
6a30: 73 20 4e 55 4c 4c 20 28 64 75 65 0a 2a 2a 20 64  s NULL (due.** d
6a40: 6f 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  o a memory alloc
6a50: 61 74 69 6f 6e 20 66 61 69 6c 75 72 65 29 20 74  ation failure) t
6a60: 68 65 6e 20 64 65 6c 65 74 65 20 74 68 65 20 70  hen delete the p
6a70: 53 65 6c 65 63 74 20 6f 62 6a 65 63 74 2e 0a 2a  Select object..*
6a80: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 45  /.void sqlite3PE
6a90: 78 70 72 41 64 64 53 65 6c 65 63 74 28 50 61 72  xprAddSelect(Par
6aa0: 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
6ab0: 20 2a 70 45 78 70 72 2c 20 53 65 6c 65 63 74 20   *pExpr, Select 
6ac0: 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 69 66 28  *pSelect){.  if(
6ad0: 20 70 45 78 70 72 20 29 7b 0a 20 20 20 20 70 45   pExpr ){.    pE
6ae0: 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 20 3d  xpr->x.pSelect =
6af0: 20 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 45 78   pSelect;.    Ex
6b00: 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 45  prSetProperty(pE
6b10: 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  xpr, EP_xIsSelec
6b20: 74 7c 45 50 5f 53 75 62 71 75 65 72 79 29 3b 0a  t|EP_Subquery);.
6b30: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 53      sqlite3ExprS
6b40: 65 74 48 65 69 67 68 74 41 6e 64 46 6c 61 67 73  etHeightAndFlags
6b50: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 29 3b  (pParse, pExpr);
6b60: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
6b70: 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64 62  sert( pParse->db
6b80: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
6b90: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c  ;.    sqlite3Sel
6ba0: 65 63 74 44 65 6c 65 74 65 28 70 50 61 72 73 65  ectDelete(pParse
6bb0: 2d 3e 64 62 2c 20 70 53 65 6c 65 63 74 29 3b 0a  ->db, pSelect);.
6bc0: 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66    }.}.../*.** If
6bd0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
6be0: 69 73 20 61 6c 77 61 79 73 20 65 69 74 68 65 72  is always either
6bf0: 20 54 52 55 45 20 6f 72 20 46 41 4c 53 45 20 28   TRUE or FALSE (
6c00: 72 65 73 70 65 63 74 69 76 65 6c 79 29 2c 0a 2a  respectively),.*
6c10: 2a 20 74 68 65 6e 20 72 65 74 75 72 6e 20 31 2e  * then return 1.
6c20: 20 20 49 66 20 6f 6e 65 20 63 61 6e 6e 6f 74 20    If one cannot 
6c30: 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 74 72  determine the tr
6c40: 75 74 68 20 76 61 6c 75 65 20 6f 66 20 74 68 65  uth value of the
6c50: 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 61  .** expression a
6c60: 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 72  t compile-time r
6c70: 65 74 75 72 6e 20 30 2e 0a 2a 2a 0a 2a 2a 20 54  eturn 0..**.** T
6c80: 68 69 73 20 69 73 20 61 6e 20 6f 70 74 69 6d 69  his is an optimi
6c90: 7a 61 74 69 6f 6e 2e 20 20 49 66 20 69 73 20 4f  zation.  If is O
6ca0: 4b 20 74 6f 20 72 65 74 75 72 6e 20 30 20 68 65  K to return 0 he
6cb0: 72 65 20 65 76 65 6e 20 69 66 0a 2a 2a 20 74 68  re even if.** th
6cc0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 72 65 61  e expression rea
6cd0: 6c 6c 79 20 69 73 20 61 6c 77 61 79 73 20 66 61  lly is always fa
6ce0: 6c 73 65 20 6f 72 20 66 61 6c 73 65 20 28 61 20  lse or false (a 
6cf0: 66 61 6c 73 65 20 6e 65 67 61 74 69 76 65 29 2e  false negative).
6d00: 0a 2a 2a 20 42 75 74 20 69 74 20 69 73 20 61 20  .** But it is a 
6d10: 62 75 67 20 74 6f 20 72 65 74 75 72 6e 20 31 20  bug to return 1 
6d20: 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
6d30: 6e 20 6d 69 67 68 74 20 68 61 76 65 20 64 69 66  n might have dif
6d40: 66 65 72 65 6e 74 0a 2a 2a 20 62 6f 6f 6c 65 61  ferent.** boolea
6d50: 6e 20 76 61 6c 75 65 73 20 69 6e 20 64 69 66 66  n values in diff
6d60: 65 72 65 6e 74 20 63 69 72 63 75 6d 73 74 61 6e  erent circumstan
6d70: 63 65 73 20 28 61 20 66 61 6c 73 65 20 70 6f 73  ces (a false pos
6d80: 69 74 69 76 65 2e 29 0a 2a 2a 0a 2a 2a 20 4e 6f  itive.).**.** No
6d90: 74 65 20 74 68 61 74 20 69 66 20 74 68 65 20 65  te that if the e
6da0: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 70 61 72  xpression is par
6db0: 74 20 6f 66 20 63 6f 6e 64 69 74 69 6f 6e 61 6c  t of conditional
6dc0: 20 66 6f 72 20 61 0a 2a 2a 20 4c 45 46 54 20 4a   for a.** LEFT J
6dd0: 4f 49 4e 2c 20 74 68 65 6e 20 77 65 20 63 61 6e  OIN, then we can
6de0: 6e 6f 74 20 64 65 74 65 72 6d 69 6e 65 20 61 74  not determine at
6df0: 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 77 68   compile-time wh
6e00: 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20  ether or not.** 
6e10: 69 73 20 69 74 20 74 72 75 65 20 6f 72 20 66 61  is it true or fa
6e20: 6c 73 65 2c 20 73 6f 20 61 6c 77 61 79 73 20 72  lse, so always r
6e30: 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74  eturn 0..*/.stat
6e40: 69 63 20 69 6e 74 20 65 78 70 72 41 6c 77 61 79  ic int exprAlway
6e50: 73 54 72 75 65 28 45 78 70 72 20 2a 70 29 7b 0a  sTrue(Expr *p){.
6e60: 20 20 69 6e 74 20 76 20 3d 20 30 3b 0a 20 20 69    int v = 0;.  i
6e70: 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
6e80: 74 79 28 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69  ty(p, EP_FromJoi
6e90: 6e 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  n) ) return 0;. 
6ea0: 20 69 66 28 20 21 73 71 6c 69 74 65 33 45 78 70   if( !sqlite3Exp
6eb0: 72 49 73 49 6e 74 65 67 65 72 28 70 2c 20 26 76  rIsInteger(p, &v
6ec0: 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
6ed0: 72 65 74 75 72 6e 20 76 21 3d 30 3b 0a 7d 0a 73  return v!=0;.}.s
6ee0: 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 41 6c  tatic int exprAl
6ef0: 77 61 79 73 46 61 6c 73 65 28 45 78 70 72 20 2a  waysFalse(Expr *
6f00: 70 29 7b 0a 20 20 69 6e 74 20 76 20 3d 20 30 3b  p){.  int v = 0;
6f10: 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72  .  if( ExprHasPr
6f20: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 46 72 6f  operty(p, EP_Fro
6f30: 6d 4a 6f 69 6e 29 20 29 20 72 65 74 75 72 6e 20  mJoin) ) return 
6f40: 30 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  0;.  if( !sqlite
6f50: 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70  3ExprIsInteger(p
6f60: 2c 20 26 76 29 20 29 20 72 65 74 75 72 6e 20 30  , &v) ) return 0
6f70: 3b 0a 20 20 72 65 74 75 72 6e 20 76 3d 3d 30 3b  ;.  return v==0;
6f80: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 69 6e 20 74  .}../*.** Join t
6f90: 77 6f 20 65 78 70 72 65 73 73 69 6f 6e 73 20 75  wo expressions u
6fa0: 73 69 6e 67 20 61 6e 20 41 4e 44 20 6f 70 65 72  sing an AND oper
6fb0: 61 74 6f 72 2e 20 20 49 66 20 65 69 74 68 65 72  ator.  If either
6fc0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 0a 2a   expression is.*
6fd0: 2a 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 6a 75 73  * NULL, then jus
6fe0: 74 20 72 65 74 75 72 6e 20 74 68 65 20 6f 74 68  t return the oth
6ff0: 65 72 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a  er expression..*
7000: 2a 0a 2a 2a 20 49 66 20 6f 6e 65 20 73 69 64 65  *.** If one side
7010: 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66   or the other of
7020: 20 74 68 65 20 41 4e 44 20 69 73 20 6b 6e 6f 77   the AND is know
7030: 6e 20 74 6f 20 62 65 20 66 61 6c 73 65 2c 20 74  n to be false, t
7040: 68 65 6e 20 69 6e 73 74 65 61 64 0a 2a 2a 20 6f  hen instead.** o
7050: 66 20 72 65 74 75 72 6e 69 6e 67 20 61 6e 20 41  f returning an A
7060: 4e 44 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 6a  ND expression, j
7070: 75 73 74 20 72 65 74 75 72 6e 20 61 20 63 6f 6e  ust return a con
7080: 73 74 61 6e 74 20 65 78 70 72 65 73 73 69 6f 6e  stant expression
7090: 20 77 69 74 68 0a 2a 2a 20 61 20 76 61 6c 75 65   with.** a value
70a0: 20 6f 66 20 66 61 6c 73 65 2e 0a 2a 2f 0a 45 78   of false..*/.Ex
70b0: 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 41  pr *sqlite3ExprA
70c0: 6e 64 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  nd(sqlite3 *db, 
70d0: 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 45 78 70  Expr *pLeft, Exp
70e0: 72 20 2a 70 52 69 67 68 74 29 7b 0a 20 20 69 66  r *pRight){.  if
70f0: 28 20 70 4c 65 66 74 3d 3d 30 20 29 7b 0a 20 20  ( pLeft==0 ){.  
7100: 20 20 72 65 74 75 72 6e 20 70 52 69 67 68 74 3b    return pRight;
7110: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 52 69  .  }else if( pRi
7120: 67 68 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  ght==0 ){.    re
7130: 74 75 72 6e 20 70 4c 65 66 74 3b 0a 20 20 7d 65  turn pLeft;.  }e
7140: 6c 73 65 20 69 66 28 20 65 78 70 72 41 6c 77 61  lse if( exprAlwa
7150: 79 73 46 61 6c 73 65 28 70 4c 65 66 74 29 20 7c  ysFalse(pLeft) |
7160: 7c 20 65 78 70 72 41 6c 77 61 79 73 46 61 6c 73  | exprAlwaysFals
7170: 65 28 70 52 69 67 68 74 29 20 29 7b 0a 20 20 20  e(pRight) ){.   
7180: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
7190: 74 65 28 64 62 2c 20 70 4c 65 66 74 29 3b 0a 20  te(db, pLeft);. 
71a0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
71b0: 6c 65 74 65 28 64 62 2c 20 70 52 69 67 68 74 29  lete(db, pRight)
71c0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c  ;.    return sql
71d0: 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 64 62  ite3ExprAlloc(db
71e0: 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c 20 26 73  , TK_INTEGER, &s
71f0: 71 6c 69 74 65 33 49 6e 74 54 6f 6b 65 6e 73 5b  qlite3IntTokens[
7200: 30 5d 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b  0], 0);.  }else{
7210: 0a 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 20  .    Expr *pNew 
7220: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c  = sqlite3ExprAll
7230: 6f 63 28 64 62 2c 20 54 4b 5f 41 4e 44 2c 20 30  oc(db, TK_AND, 0
7240: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
7250: 33 45 78 70 72 41 74 74 61 63 68 53 75 62 74 72  3ExprAttachSubtr
7260: 65 65 73 28 64 62 2c 20 70 4e 65 77 2c 20 70 4c  ees(db, pNew, pL
7270: 65 66 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20  eft, pRight);.  
7280: 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 20    return pNew;. 
7290: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73   }.}../*.** Cons
72a0: 74 72 75 63 74 20 61 20 6e 65 77 20 65 78 70 72  truct a new expr
72b0: 65 73 73 69 6f 6e 20 6e 6f 64 65 20 66 6f 72 20  ession node for 
72c0: 61 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20  a function with 
72d0: 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 61 72 67 75  multiple.** argu
72e0: 6d 65 6e 74 73 2e 0a 2a 2f 0a 45 78 70 72 20 2a  ments..*/.Expr *
72f0: 73 71 6c 69 74 65 33 45 78 70 72 46 75 6e 63 74  sqlite3ExprFunct
7300: 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73  ion(Parse *pPars
7310: 65 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  e, ExprList *pLi
7320: 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65  st, Token *pToke
7330: 6e 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65 77  n){.  Expr *pNew
7340: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
7350: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
7360: 61 73 73 65 72 74 28 20 70 54 6f 6b 65 6e 20 29  assert( pToken )
7370: 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74  ;.  pNew = sqlit
7380: 65 33 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20  e3ExprAlloc(db, 
7390: 54 4b 5f 46 55 4e 43 54 49 4f 4e 2c 20 70 54 6f  TK_FUNCTION, pTo
73a0: 6b 65 6e 2c 20 31 29 3b 0a 20 20 69 66 28 20 70  ken, 1);.  if( p
73b0: 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  New==0 ){.    sq
73c0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
73d0: 65 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 20  ete(db, pList); 
73e0: 2f 2a 20 41 76 6f 69 64 20 6d 65 6d 6f 72 79 20  /* Avoid memory 
73f0: 6c 65 61 6b 20 77 68 65 6e 20 6d 61 6c 6c 6f 63  leak when malloc
7400: 20 66 61 69 6c 73 20 2a 2f 0a 20 20 20 20 72 65   fails */.    re
7410: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4e  turn 0;.  }.  pN
7420: 65 77 2d 3e 78 2e 70 4c 69 73 74 20 3d 20 70 4c  ew->x.pList = pL
7430: 69 73 74 3b 0a 20 20 61 73 73 65 72 74 28 20 21  ist;.  assert( !
7440: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
7450: 70 4e 65 77 2c 20 45 50 5f 78 49 73 53 65 6c 65  pNew, EP_xIsSele
7460: 63 74 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  ct) );.  sqlite3
7470: 45 78 70 72 53 65 74 48 65 69 67 68 74 41 6e 64  ExprSetHeightAnd
7480: 46 6c 61 67 73 28 70 50 61 72 73 65 2c 20 70 4e  Flags(pParse, pN
7490: 65 77 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e  ew);.  return pN
74a0: 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73  ew;.}../*.** Ass
74b0: 69 67 6e 20 61 20 76 61 72 69 61 62 6c 65 20 6e  ign a variable n
74c0: 75 6d 62 65 72 20 74 6f 20 61 6e 20 65 78 70 72  umber to an expr
74d0: 65 73 73 69 6f 6e 20 74 68 61 74 20 65 6e 63 6f  ession that enco
74e0: 64 65 73 20 61 20 77 69 6c 64 63 61 72 64 0a 2a  des a wildcard.*
74f0: 2a 20 69 6e 20 74 68 65 20 6f 72 69 67 69 6e 61  * in the origina
7500: 6c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e  l SQL statement.
7510: 20 20 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72    .**.** Wildcar
7520: 64 73 20 63 6f 6e 73 69 73 74 69 6e 67 20 6f 66  ds consisting of
7530: 20 61 20 73 69 6e 67 6c 65 20 22 3f 22 20 61 72   a single "?" ar
7540: 65 20 61 73 73 69 67 6e 65 64 20 74 68 65 20 6e  e assigned the n
7550: 65 78 74 20 73 65 71 75 65 6e 74 69 61 6c 0a 2a  ext sequential.*
7560: 2a 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65  * variable numbe
7570: 72 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72  r..**.** Wildcar
7580: 64 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  ds of the form "
7590: 3f 6e 6e 6e 22 20 61 72 65 20 61 73 73 69 67 6e  ?nnn" are assign
75a0: 65 64 20 74 68 65 20 6e 75 6d 62 65 72 20 22 6e  ed the number "n
75b0: 6e 6e 22 2e 20 20 57 65 20 6d 61 6b 65 0a 2a 2a  nn".  We make.**
75c0: 20 73 75 72 65 20 22 6e 6e 6e 22 20 69 73 20 6e   sure "nnn" is n
75d0: 6f 74 20 74 6f 6f 20 62 65 20 74 6f 20 61 76 6f  ot too be to avo
75e0: 69 64 20 61 20 64 65 6e 69 61 6c 20 6f 66 20 73  id a denial of s
75f0: 65 72 76 69 63 65 20 61 74 74 61 63 6b 20 77 68  ervice attack wh
7600: 65 6e 0a 2a 2a 20 74 68 65 20 53 51 4c 20 73 74  en.** the SQL st
7610: 61 74 65 6d 65 6e 74 20 63 6f 6d 65 73 20 66 72  atement comes fr
7620: 6f 6d 20 61 6e 20 65 78 74 65 72 6e 61 6c 20 73  om an external s
7630: 6f 75 72 63 65 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c  ource..**.** Wil
7640: 64 63 61 72 64 73 20 6f 66 20 74 68 65 20 66 6f  dcards of the fo
7650: 72 6d 20 22 3a 61 61 61 22 2c 20 22 40 61 61 61  rm ":aaa", "@aaa
7660: 22 2c 20 6f 72 20 22 24 61 61 61 22 20 61 72 65  ", or "$aaa" are
7670: 20 61 73 73 69 67 6e 65 64 20 74 68 65 20 73 61   assigned the sa
7680: 6d 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 61 73 20  me number.** as 
7690: 74 68 65 20 70 72 65 76 69 6f 75 73 20 69 6e 73  the previous ins
76a0: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 73 61 6d  tance of the sam
76b0: 65 20 77 69 6c 64 63 61 72 64 2e 20 20 4f 72 20  e wildcard.  Or 
76c0: 69 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66  if this is the f
76d0: 69 72 73 74 0a 2a 2a 20 69 6e 73 74 61 6e 63 65  irst.** instance
76e0: 20 6f 66 20 74 68 65 20 77 69 6c 64 63 61 72 64   of the wildcard
76f0: 2c 20 74 68 65 20 6e 65 78 74 20 73 65 71 75 65  , the next seque
7700: 6e 74 69 61 6c 20 76 61 72 69 61 62 6c 65 20 6e  ntial variable n
7710: 75 6d 62 65 72 20 69 73 0a 2a 2a 20 61 73 73 69  umber is.** assi
7720: 67 6e 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  gned..*/.void sq
7730: 6c 69 74 65 33 45 78 70 72 41 73 73 69 67 6e 56  lite3ExprAssignV
7740: 61 72 4e 75 6d 62 65 72 28 50 61 72 73 65 20 2a  arNumber(Parse *
7750: 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
7760: 78 70 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  xpr){.  sqlite3 
7770: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
7780: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
7790: 7a 3b 0a 0a 20 20 69 66 28 20 70 45 78 70 72 3d  z;..  if( pExpr=
77a0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61  =0 ) return;.  a
77b0: 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
77c0: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
77d0: 50 5f 49 6e 74 56 61 6c 75 65 7c 45 50 5f 52 65  P_IntValue|EP_Re
77e0: 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e  duced|EP_TokenOn
77f0: 6c 79 29 20 29 3b 0a 20 20 7a 20 3d 20 70 45 78  ly) );.  z = pEx
7800: 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20  pr->u.zToken;.  
7810: 61 73 73 65 72 74 28 20 7a 21 3d 30 20 29 3b 0a  assert( z!=0 );.
7820: 20 20 61 73 73 65 72 74 28 20 7a 5b 30 5d 21 3d    assert( z[0]!=
7830: 30 20 29 3b 0a 20 20 69 66 28 20 7a 5b 31 5d 3d  0 );.  if( z[1]=
7840: 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 57 69 6c  =0 ){.    /* Wil
7850: 64 63 61 72 64 20 6f 66 20 74 68 65 20 66 6f 72  dcard of the for
7860: 6d 20 22 3f 22 2e 20 20 41 73 73 69 67 6e 20 74  m "?".  Assign t
7870: 68 65 20 6e 65 78 74 20 76 61 72 69 61 62 6c 65  he next variable
7880: 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20 61   number */.    a
7890: 73 73 65 72 74 28 20 7a 5b 30 5d 3d 3d 27 3f 27  ssert( z[0]=='?'
78a0: 20 29 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 69   );.    pExpr->i
78b0: 43 6f 6c 75 6d 6e 20 3d 20 28 79 6e 56 61 72 29  Column = (ynVar)
78c0: 28 2b 2b 70 50 61 72 73 65 2d 3e 6e 56 61 72 29  (++pParse->nVar)
78d0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 79  ;.  }else{.    y
78e0: 6e 56 61 72 20 78 20 3d 20 30 3b 0a 20 20 20 20  nVar x = 0;.    
78f0: 75 33 32 20 6e 20 3d 20 73 71 6c 69 74 65 33 53  u32 n = sqlite3S
7900: 74 72 6c 65 6e 33 30 28 7a 29 3b 0a 20 20 20 20  trlen30(z);.    
7910: 69 66 28 20 7a 5b 30 5d 3d 3d 27 3f 27 20 29 7b  if( z[0]=='?' ){
7920: 0a 20 20 20 20 20 20 2f 2a 20 57 69 6c 64 63 61  .      /* Wildca
7930: 72 64 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  rd of the form "
7940: 3f 6e 6e 6e 22 2e 20 20 43 6f 6e 76 65 72 74 20  ?nnn".  Convert 
7950: 22 6e 6e 6e 22 20 74 6f 20 61 6e 20 69 6e 74 65  "nnn" to an inte
7960: 67 65 72 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a  ger and.      **
7970: 20 75 73 65 20 69 74 20 61 73 20 74 68 65 20 76   use it as the v
7980: 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 2a  ariable number *
7990: 2f 0a 20 20 20 20 20 20 69 36 34 20 69 3b 0a 20  /.      i64 i;. 
79a0: 20 20 20 20 20 69 6e 74 20 62 4f 6b 20 3d 20 30       int bOk = 0
79b0: 3d 3d 73 71 6c 69 74 65 33 41 74 6f 69 36 34 28  ==sqlite3Atoi64(
79c0: 26 7a 5b 31 5d 2c 20 26 69 2c 20 6e 2d 31 2c 20  &z[1], &i, n-1, 
79d0: 53 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 20  SQLITE_UTF8);.  
79e0: 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75      pExpr->iColu
79f0: 6d 6e 20 3d 20 78 20 3d 20 28 79 6e 56 61 72 29  mn = x = (ynVar)
7a00: 69 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  i;.      testcas
7a10: 65 28 20 69 3d 3d 30 20 29 3b 0a 20 20 20 20 20  e( i==0 );.     
7a20: 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d 31 20   testcase( i==1 
7a30: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
7a40: 65 28 20 69 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74  e( i==db->aLimit
7a50: 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41  [SQLITE_LIMIT_VA
7a60: 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 2d 31  RIABLE_NUMBER]-1
7a70: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
7a80: 73 65 28 20 69 3d 3d 64 62 2d 3e 61 4c 69 6d 69  se( i==db->aLimi
7a90: 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56  t[SQLITE_LIMIT_V
7aa0: 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 20  ARIABLE_NUMBER] 
7ab0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 62 4f 6b  );.      if( bOk
7ac0: 3d 3d 30 20 7c 7c 20 69 3c 31 20 7c 7c 20 69 3e  ==0 || i<1 || i>
7ad0: 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54  db->aLimit[SQLIT
7ae0: 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45  E_LIMIT_VARIABLE
7af0: 5f 4e 55 4d 42 45 52 5d 20 29 7b 0a 20 20 20 20  _NUMBER] ){.    
7b00: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
7b10: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 76 61 72  Msg(pParse, "var
7b20: 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 6d 75 73  iable number mus
7b30: 74 20 62 65 20 62 65 74 77 65 65 6e 20 3f 31 20  t be between ?1 
7b40: 61 6e 64 20 3f 25 64 22 2c 0a 20 20 20 20 20 20  and ?%d",.      
7b50: 20 20 20 20 20 20 64 62 2d 3e 61 4c 69 6d 69 74        db->aLimit
7b60: 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41  [SQLITE_LIMIT_VA
7b70: 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 29 3b  RIABLE_NUMBER]);
7b80: 0a 20 20 20 20 20 20 20 20 78 20 3d 20 30 3b 0a  .        x = 0;.
7b90: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
7ba0: 28 20 69 3e 70 50 61 72 73 65 2d 3e 6e 56 61 72  ( i>pParse->nVar
7bb0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 72   ){.        pPar
7bc0: 73 65 2d 3e 6e 56 61 72 20 3d 20 28 69 6e 74 29  se->nVar = (int)
7bd0: 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  i;.      }.    }
7be0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 57  else{.      /* W
7bf0: 69 6c 64 63 61 72 64 73 20 6c 69 6b 65 20 22 3a  ildcards like ":
7c00: 61 61 61 22 2c 20 22 24 61 61 61 22 20 6f 72 20  aaa", "$aaa" or 
7c10: 22 40 61 61 61 22 2e 20 20 52 65 75 73 65 20 74  "@aaa".  Reuse t
7c20: 68 65 20 73 61 6d 65 20 76 61 72 69 61 62 6c 65  he same variable
7c30: 0a 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72  .      ** number
7c40: 20 61 73 20 74 68 65 20 70 72 69 6f 72 20 61 70   as the prior ap
7c50: 70 65 61 72 61 6e 63 65 20 6f 66 20 74 68 65 20  pearance of the 
7c60: 73 61 6d 65 20 6e 61 6d 65 2c 20 6f 72 20 69 66  same name, or if
7c70: 20 74 68 65 20 6e 61 6d 65 0a 20 20 20 20 20 20   the name.      
7c80: 2a 2a 20 68 61 73 20 6e 65 76 65 72 20 61 70 70  ** has never app
7c90: 65 61 72 65 64 20 62 65 66 6f 72 65 2c 20 72 65  eared before, re
7ca0: 75 73 65 20 74 68 65 20 73 61 6d 65 20 76 61 72  use the same var
7cb0: 69 61 62 6c 65 20 6e 75 6d 62 65 72 0a 20 20 20  iable number.   
7cc0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 79 6e 56 61     */.      ynVa
7cd0: 72 20 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  r i;.      for(i
7ce0: 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 7a  =0; i<pParse->nz
7cf0: 56 61 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Var; i++){.     
7d00: 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 61     if( pParse->a
7d10: 7a 56 61 72 5b 69 5d 20 26 26 20 73 74 72 63 6d  zVar[i] && strcm
7d20: 70 28 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 5b  p(pParse->azVar[
7d30: 69 5d 2c 7a 29 3d 3d 30 20 29 7b 0a 20 20 20 20  i],z)==0 ){.    
7d40: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f        pExpr->iCo
7d50: 6c 75 6d 6e 20 3d 20 78 20 3d 20 28 79 6e 56 61  lumn = x = (ynVa
7d60: 72 29 69 2b 31 3b 0a 20 20 20 20 20 20 20 20 20  r)i+1;.         
7d70: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
7d80: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
7d90: 69 66 28 20 78 3d 3d 30 20 29 20 78 20 3d 20 70  if( x==0 ) x = p
7da0: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20  Expr->iColumn = 
7db0: 28 79 6e 56 61 72 29 28 2b 2b 70 50 61 72 73 65  (ynVar)(++pParse
7dc0: 2d 3e 6e 56 61 72 29 3b 0a 20 20 20 20 7d 0a 20  ->nVar);.    }. 
7dd0: 20 20 20 69 66 28 20 78 3e 30 20 29 7b 0a 20 20     if( x>0 ){.  
7de0: 20 20 20 20 69 66 28 20 78 3e 70 50 61 72 73 65      if( x>pParse
7df0: 2d 3e 6e 7a 56 61 72 20 29 7b 0a 20 20 20 20 20  ->nzVar ){.     
7e00: 20 20 20 63 68 61 72 20 2a 2a 61 3b 0a 20 20 20     char **a;.   
7e10: 20 20 20 20 20 61 20 3d 20 73 71 6c 69 74 65 33       a = sqlite3
7e20: 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70 50  DbRealloc(db, pP
7e30: 61 72 73 65 2d 3e 61 7a 56 61 72 2c 20 78 2a 73  arse->azVar, x*s
7e40: 69 7a 65 6f 66 28 61 5b 30 5d 29 29 3b 0a 20 20  izeof(a[0]));.  
7e50: 20 20 20 20 20 20 69 66 28 20 61 3d 3d 30 20 29        if( a==0 )
7e60: 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  {.          asse
7e70: 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  rt( db->mallocFa
7e80: 69 6c 65 64 20 29 3b 20 2f 2a 20 45 72 72 6f 72  iled ); /* Error
7e90: 20 72 65 70 6f 72 74 65 64 20 74 68 72 6f 75 67   reported throug
7ea0: 68 20 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 2a  h mallocFailed *
7eb0: 2f 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  /.          retu
7ec0: 72 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rn;.        }.  
7ed0: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61 7a        pParse->az
7ee0: 56 61 72 20 3d 20 61 3b 0a 20 20 20 20 20 20 20  Var = a;.       
7ef0: 20 6d 65 6d 73 65 74 28 26 61 5b 70 50 61 72 73   memset(&a[pPars
7f00: 65 2d 3e 6e 7a 56 61 72 5d 2c 20 30 2c 20 28 78  e->nzVar], 0, (x
7f10: 2d 70 50 61 72 73 65 2d 3e 6e 7a 56 61 72 29 2a  -pParse->nzVar)*
7f20: 73 69 7a 65 6f 66 28 61 5b 30 5d 29 29 3b 0a 20  sizeof(a[0]));. 
7f30: 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e         pParse->n
7f40: 7a 56 61 72 20 3d 20 78 3b 0a 20 20 20 20 20 20  zVar = x;.      
7f50: 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 30 5d  }.      if( z[0]
7f60: 21 3d 27 3f 27 20 7c 7c 20 70 50 61 72 73 65 2d  !='?' || pParse-
7f70: 3e 61 7a 56 61 72 5b 78 2d 31 5d 3d 3d 30 20 29  >azVar[x-1]==0 )
7f80: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
7f90: 33 44 62 46 72 65 65 28 64 62 2c 20 70 50 61 72  3DbFree(db, pPar
7fa0: 73 65 2d 3e 61 7a 56 61 72 5b 78 2d 31 5d 29 3b  se->azVar[x-1]);
7fb0: 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d  .        pParse-
7fc0: 3e 61 7a 56 61 72 5b 78 2d 31 5d 20 3d 20 73 71  >azVar[x-1] = sq
7fd0: 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70 28 64  lite3DbStrNDup(d
7fe0: 62 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20  b, z, n);.      
7ff0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 20 0a 20 20 69  }.    }.  } .  i
8000: 66 28 20 21 70 50 61 72 73 65 2d 3e 6e 45 72 72  f( !pParse->nErr
8010: 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 56 61 72   && pParse->nVar
8020: 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49  >db->aLimit[SQLI
8030: 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c  TE_LIMIT_VARIABL
8040: 45 5f 4e 55 4d 42 45 52 5d 20 29 7b 0a 20 20 20  E_NUMBER] ){.   
8050: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
8060: 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61  (pParse, "too ma
8070: 6e 79 20 53 51 4c 20 76 61 72 69 61 62 6c 65 73  ny SQL variables
8080: 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ");.  }.}../*.**
8090: 20 52 65 63 75 72 73 69 76 65 6c 79 20 64 65 6c   Recursively del
80a0: 65 74 65 20 61 6e 20 65 78 70 72 65 73 73 69 6f  ete an expressio
80b0: 6e 20 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69  n tree..*/.stati
80c0: 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e  c SQLITE_NOINLIN
80d0: 45 20 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  E void sqlite3Ex
80e0: 70 72 44 65 6c 65 74 65 4e 4e 28 73 71 6c 69 74  prDeleteNN(sqlit
80f0: 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 29  e3 *db, Expr *p)
8100: 7b 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30  {.  assert( p!=0
8110: 20 29 3b 0a 20 20 2f 2a 20 53 61 6e 69 74 79 20   );.  /* Sanity 
8120: 63 68 65 63 6b 3a 20 41 73 73 65 72 74 20 74 68  check: Assert th
8130: 61 74 20 74 68 65 20 49 6e 74 56 61 6c 75 65 20  at the IntValue 
8140: 69 73 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 20  is non-negative 
8150: 69 66 20 69 74 20 65 78 69 73 74 73 20 2a 2f 0a  if it exists */.
8160: 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
8170: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
8180: 5f 49 6e 74 56 61 6c 75 65 29 20 7c 7c 20 70 2d  _IntValue) || p-
8190: 3e 75 2e 69 56 61 6c 75 65 3e 3d 30 20 29 3b 0a  >u.iValue>=0 );.
81a0: 20 20 69 66 28 20 21 45 78 70 72 48 61 73 50 72    if( !ExprHasPr
81b0: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b  operty(p, EP_Tok
81c0: 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 2f  enOnly) ){.    /
81d0: 2a 20 54 68 65 20 45 78 70 72 2e 78 20 75 6e 69  * The Expr.x uni
81e0: 6f 6e 20 69 73 20 6e 65 76 65 72 20 75 73 65 64  on is never used
81f0: 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d   at the same tim
8200: 65 20 61 73 20 45 78 70 72 2e 70 52 69 67 68 74  e as Expr.pRight
8210: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
8220: 70 2d 3e 78 2e 70 4c 69 73 74 3d 3d 30 20 7c 7c  p->x.pList==0 ||
8230: 20 70 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b   p->pRight==0 );
8240: 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 21 3d  .    if( p->op!=
8250: 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e  TK_SELECT_COLUMN
8260: 20 29 20 73 71 6c 69 74 65 33 45 78 70 72 44 65   ) sqlite3ExprDe
8270: 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c 65 66  lete(db, p->pLef
8280: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  t);.    sqlite3E
8290: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  xprDelete(db, p-
82a0: 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 69 66  >pRight);.    if
82b0: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
82c0: 79 28 70 2c 20 45 50 5f 4d 65 6d 54 6f 6b 65 6e  y(p, EP_MemToken
82d0: 29 20 29 20 73 71 6c 69 74 65 33 44 62 46 72 65  ) ) sqlite3DbFre
82e0: 65 28 64 62 2c 20 70 2d 3e 75 2e 7a 54 6f 6b 65  e(db, p->u.zToke
82f0: 6e 29 3b 0a 20 20 20 20 69 66 28 20 45 78 70 72  n);.    if( Expr
8300: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
8310: 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a  P_xIsSelect) ){.
8320: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
8330: 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  ectDelete(db, p-
8340: 3e 78 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  >x.pSelect);.   
8350: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
8360: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
8370: 65 74 65 28 64 62 2c 20 70 2d 3e 78 2e 70 4c 69  ete(db, p->x.pLi
8380: 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  st);.    }.  }. 
8390: 20 69 66 28 20 21 45 78 70 72 48 61 73 50 72 6f   if( !ExprHasPro
83a0: 70 65 72 74 79 28 70 2c 20 45 50 5f 53 74 61 74  perty(p, EP_Stat
83b0: 69 63 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ic) ){.    sqlit
83c0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b  e3DbFree(db, p);
83d0: 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69  .  }.}.void sqli
83e0: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 73 71  te3ExprDelete(sq
83f0: 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72 20  lite3 *db, Expr 
8400: 2a 70 29 7b 0a 20 20 69 66 28 20 70 20 29 20 73  *p){.  if( p ) s
8410: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
8420: 4e 4e 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a  NN(db, p);.}../*
8430: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
8440: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 61  umber of bytes a
8450: 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 74 68 65  llocated for the
8460: 20 65 78 70 72 65 73 73 69 6f 6e 20 73 74 72 75   expression stru
8470: 63 74 75 72 65 20 0a 2a 2a 20 70 61 73 73 65 64  cture .** passed
8480: 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
8490: 67 75 6d 65 6e 74 2e 20 54 68 69 73 20 69 73 20  gument. This is 
84a0: 61 6c 77 61 79 73 20 6f 6e 65 20 6f 66 20 45 58  always one of EX
84b0: 50 52 5f 46 55 4c 4c 53 49 5a 45 2c 0a 2a 2a 20  PR_FULLSIZE,.** 
84c0: 45 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45  EXPR_REDUCEDSIZE
84d0: 20 6f 72 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e   or EXPR_TOKENON
84e0: 4c 59 53 49 5a 45 2e 0a 2a 2f 0a 73 74 61 74 69  LYSIZE..*/.stati
84f0: 63 20 69 6e 74 20 65 78 70 72 53 74 72 75 63 74  c int exprStruct
8500: 53 69 7a 65 28 45 78 70 72 20 2a 70 29 7b 0a 20  Size(Expr *p){. 
8510: 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
8520: 65 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e  erty(p, EP_Token
8530: 4f 6e 6c 79 29 20 29 20 72 65 74 75 72 6e 20 45  Only) ) return E
8540: 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a  XPR_TOKENONLYSIZ
8550: 45 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73  E;.  if( ExprHas
8560: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 52  Property(p, EP_R
8570: 65 64 75 63 65 64 29 20 29 20 72 65 74 75 72 6e  educed) ) return
8580: 20 45 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a   EXPR_REDUCEDSIZ
8590: 45 3b 0a 20 20 72 65 74 75 72 6e 20 45 58 50 52  E;.  return EXPR
85a0: 5f 46 55 4c 4c 53 49 5a 45 3b 0a 7d 0a 0a 2f 2a  _FULLSIZE;.}../*
85b0: 0a 2a 2a 20 54 68 65 20 64 75 70 65 64 45 78 70  .** The dupedExp
85c0: 72 2a 53 69 7a 65 28 29 20 72 6f 75 74 69 6e 65  r*Size() routine
85d0: 73 20 65 61 63 68 20 72 65 74 75 72 6e 20 74 68  s each return th
85e0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
85f0: 73 20 72 65 71 75 69 72 65 64 0a 2a 2a 20 74 6f  s required.** to
8600: 20 73 74 6f 72 65 20 61 20 63 6f 70 79 20 6f 66   store a copy of
8610: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6f   an expression o
8620: 72 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  r expression tre
8630: 65 2e 20 20 54 68 65 79 20 64 69 66 66 65 72 20  e.  They differ 
8640: 69 6e 0a 2a 2a 20 68 6f 77 20 6d 75 63 68 20 6f  in.** how much o
8650: 66 20 74 68 65 20 74 72 65 65 20 69 73 20 6d 65  f the tree is me
8660: 61 73 75 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20  asured..**.**   
8670: 20 20 64 75 70 65 64 45 78 70 72 53 74 72 75 63    dupedExprStruc
8680: 74 53 69 7a 65 28 29 20 20 20 20 20 53 69 7a 65  tSize()     Size
8690: 20 6f 66 20 6f 6e 6c 79 20 74 68 65 20 45 78 70   of only the Exp
86a0: 72 20 73 74 72 75 63 74 75 72 65 20 0a 2a 2a 20  r structure .** 
86b0: 20 20 20 20 64 75 70 65 64 45 78 70 72 4e 6f 64      dupedExprNod
86c0: 65 53 69 7a 65 28 29 20 20 20 20 20 20 20 53 69  eSize()       Si
86d0: 7a 65 20 6f 66 20 45 78 70 72 20 2b 20 73 70 61  ze of Expr + spa
86e0: 63 65 20 66 6f 72 20 74 6f 6b 65 6e 0a 2a 2a 20  ce for token.** 
86f0: 20 20 20 20 64 75 70 65 64 45 78 70 72 53 69 7a      dupedExprSiz
8700: 65 28 29 20 20 20 20 20 20 20 20 20 20 20 45 78  e()           Ex
8710: 70 72 20 2b 20 74 6f 6b 65 6e 20 2b 20 73 75 62  pr + token + sub
8720: 74 72 65 65 20 63 6f 6d 70 6f 6e 65 6e 74 73 0a  tree components.
8730: 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
8740: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8750: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8760: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8770: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
8780: 2a 0a 2a 2a 20 54 68 65 20 64 75 70 65 64 45 78  *.** The dupedEx
8790: 70 72 53 74 72 75 63 74 53 69 7a 65 28 29 20 66  prStructSize() f
87a0: 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
87b0: 74 77 6f 20 76 61 6c 75 65 73 20 4f 52 2d 65 64  two values OR-ed
87c0: 20 74 6f 67 65 74 68 65 72 3a 20 20 0a 2a 2a 20   together:  .** 
87d0: 28 31 29 20 74 68 65 20 73 70 61 63 65 20 72 65  (1) the space re
87e0: 71 75 69 72 65 64 20 66 6f 72 20 61 20 63 6f 70  quired for a cop
87f0: 79 20 6f 66 20 74 68 65 20 45 78 70 72 20 73 74  y of the Expr st
8800: 72 75 63 74 75 72 65 20 6f 6e 6c 79 20 61 6e 64  ructure only and
8810: 20 0a 2a 2a 20 28 32 29 20 74 68 65 20 45 50 5f   .** (2) the EP_
8820: 78 78 78 20 66 6c 61 67 73 20 74 68 61 74 20 69  xxx flags that i
8830: 6e 64 69 63 61 74 65 20 77 68 61 74 20 74 68 65  ndicate what the
8840: 20 73 74 72 75 63 74 75 72 65 20 73 69 7a 65 20   structure size 
8850: 73 68 6f 75 6c 64 20 62 65 2e 0a 2a 2a 20 54 68  should be..** Th
8860: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 73 20  e return values 
8870: 69 73 20 61 6c 77 61 79 73 20 6f 6e 65 20 6f 66  is always one of
8880: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 45 58 50  :.**.**      EXP
8890: 52 5f 46 55 4c 4c 53 49 5a 45 0a 2a 2a 20 20 20  R_FULLSIZE.**   
88a0: 20 20 20 45 58 50 52 5f 52 45 44 55 43 45 44 53     EXPR_REDUCEDS
88b0: 49 5a 45 20 20 20 7c 20 45 50 5f 52 65 64 75 63  IZE   | EP_Reduc
88c0: 65 64 0a 2a 2a 20 20 20 20 20 20 45 58 50 52 5f  ed.**      EXPR_
88d0: 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 20 7c 20  TOKENONLYSIZE | 
88e0: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 0a 2a 2a 0a  EP_TokenOnly.**.
88f0: 2a 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74  ** The size of t
8900: 68 65 20 73 74 72 75 63 74 75 72 65 20 63 61 6e  he structure can
8910: 20 62 65 20 66 6f 75 6e 64 20 62 79 20 6d 61 73   be found by mas
8920: 6b 69 6e 67 20 74 68 65 20 72 65 74 75 72 6e 20  king the return 
8930: 76 61 6c 75 65 0a 2a 2a 20 6f 66 20 74 68 69 73  value.** of this
8940: 20 72 6f 75 74 69 6e 65 20 77 69 74 68 20 30 78   routine with 0x
8950: 66 66 66 2e 20 20 54 68 65 20 66 6c 61 67 73 20  fff.  The flags 
8960: 63 61 6e 20 62 65 20 66 6f 75 6e 64 20 62 79 20  can be found by 
8970: 6d 61 73 6b 69 6e 67 20 74 68 65 0a 2a 2a 20 72  masking the.** r
8980: 65 74 75 72 6e 20 76 61 6c 75 65 20 77 69 74 68  eturn value with
8990: 20 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f 54   EP_Reduced|EP_T
89a0: 6f 6b 65 6e 4f 6e 6c 79 2e 0a 2a 2a 0a 2a 2a 20  okenOnly..**.** 
89b0: 4e 6f 74 65 20 74 68 61 74 20 77 69 74 68 20 66  Note that with f
89c0: 6c 61 67 73 3d 3d 45 58 50 52 44 55 50 5f 52 45  lags==EXPRDUP_RE
89d0: 44 55 43 45 2c 20 74 68 69 73 20 72 6f 75 74 69  DUCE, this routi
89e0: 6e 65 73 20 77 6f 72 6b 73 20 6f 6e 20 66 75 6c  nes works on ful
89f0: 6c 2d 73 69 7a 65 0a 2a 2a 20 28 75 6e 72 65 64  l-size.** (unred
8a00: 75 63 65 64 29 20 45 78 70 72 20 6f 62 6a 65 63  uced) Expr objec
8a10: 74 73 20 61 73 20 74 68 65 79 20 6f 72 20 6f 72  ts as they or or
8a20: 69 67 69 6e 61 6c 6c 79 20 63 6f 6e 73 74 72 75  iginally constru
8a30: 63 74 65 64 20 62 79 20 74 68 65 20 70 61 72 73  cted by the pars
8a40: 65 72 2e 0a 2a 2a 20 44 75 72 69 6e 67 20 65 78  er..** During ex
8a50: 70 72 65 73 73 69 6f 6e 20 61 6e 61 6c 79 73 69  pression analysi
8a60: 73 2c 20 65 78 74 72 61 20 69 6e 66 6f 72 6d 61  s, extra informa
8a70: 74 69 6f 6e 20 69 73 20 63 6f 6d 70 75 74 65 64  tion is computed
8a80: 20 61 6e 64 20 6d 6f 76 65 64 20 69 6e 74 6f 0a   and moved into.
8a90: 2a 2a 20 6c 61 74 65 72 20 70 61 72 74 73 20 6f  ** later parts o
8aa0: 66 20 74 65 68 20 45 78 70 72 20 6f 62 6a 65 63  f teh Expr objec
8ab0: 74 20 61 6e 64 20 74 68 61 74 20 65 78 74 72 61  t and that extra
8ac0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6d 69 67   information mig
8ad0: 68 74 20 67 65 74 20 63 68 6f 70 70 65 64 0a 2a  ht get chopped.*
8ae0: 2a 20 6f 66 66 20 69 66 20 74 68 65 20 65 78 70  * off if the exp
8af0: 72 65 73 73 69 6f 6e 20 69 73 20 72 65 64 75 63  ression is reduc
8b00: 65 64 2e 20 20 4e 6f 74 65 20 61 6c 73 6f 20 74  ed.  Note also t
8b10: 68 61 74 20 69 74 20 64 6f 65 73 20 6e 6f 74 20  hat it does not 
8b20: 77 6f 72 6b 20 74 6f 0a 2a 2a 20 6d 61 6b 65 20  work to.** make 
8b30: 61 6e 20 45 58 50 52 44 55 50 5f 52 45 44 55 43  an EXPRDUP_REDUC
8b40: 45 20 63 6f 70 79 20 6f 66 20 61 20 72 65 64 75  E copy of a redu
8b50: 63 65 64 20 65 78 70 72 65 73 73 69 6f 6e 2e 20  ced expression. 
8b60: 20 49 74 20 69 73 20 6f 6e 6c 79 20 6c 65 67 61   It is only lega
8b70: 6c 0a 2a 2a 20 74 6f 20 72 65 64 75 63 65 20 61  l.** to reduce a
8b80: 20 70 72 69 73 74 69 6e 65 20 65 78 70 72 65 73   pristine expres
8b90: 73 69 6f 6e 20 74 72 65 65 20 66 72 6f 6d 20 74  sion tree from t
8ba0: 68 65 20 70 61 72 73 65 72 2e 20 20 54 68 65 20  he parser.  The 
8bb0: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 0a 2a  implementation.*
8bc0: 2a 20 6f 66 20 64 75 70 65 64 45 78 70 72 53 74  * of dupedExprSt
8bd0: 72 75 63 74 53 69 7a 65 28 29 20 63 6f 6e 74 61  ructSize() conta
8be0: 69 6e 20 6d 75 6c 74 69 70 6c 65 20 61 73 73 65  in multiple asse
8bf0: 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20  rt() statements 
8c00: 74 68 61 74 20 61 74 74 65 6d 70 74 0a 2a 2a 20  that attempt.** 
8c10: 74 6f 20 65 6e 66 6f 72 63 65 20 74 68 69 73 20  to enforce this 
8c20: 63 6f 6e 73 74 72 61 69 6e 74 2e 0a 2a 2f 0a 73  constraint..*/.s
8c30: 74 61 74 69 63 20 69 6e 74 20 64 75 70 65 64 45  tatic int dupedE
8c40: 78 70 72 53 74 72 75 63 74 53 69 7a 65 28 45 78  xprStructSize(Ex
8c50: 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73  pr *p, int flags
8c60: 29 7b 0a 20 20 69 6e 74 20 6e 53 69 7a 65 3b 0a  ){.  int nSize;.
8c70: 20 20 61 73 73 65 72 74 28 20 66 6c 61 67 73 3d    assert( flags=
8c80: 3d 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 20  =EXPRDUP_REDUCE 
8c90: 7c 7c 20 66 6c 61 67 73 3d 3d 30 20 29 3b 20 2f  || flags==0 ); /
8ca0: 2a 20 4f 6e 6c 79 20 6f 6e 65 20 66 6c 61 67 20  * Only one flag 
8cb0: 76 61 6c 75 65 20 61 6c 6c 6f 77 65 64 20 2a 2f  value allowed */
8cc0: 0a 20 20 61 73 73 65 72 74 28 20 45 58 50 52 5f  .  assert( EXPR_
8cd0: 46 55 4c 4c 53 49 5a 45 3c 3d 30 78 66 66 66 20  FULLSIZE<=0xfff 
8ce0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 30 78  );.  assert( (0x
8cf0: 66 66 66 20 26 20 28 45 50 5f 52 65 64 75 63 65  fff & (EP_Reduce
8d00: 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 29  d|EP_TokenOnly))
8d10: 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 30 3d 3d  ==0 );.  if( 0==
8d20: 66 6c 61 67 73 20 29 7b 0a 20 20 20 20 6e 53 69  flags ){.    nSi
8d30: 7a 65 20 3d 20 45 58 50 52 5f 46 55 4c 4c 53 49  ze = EXPR_FULLSI
8d40: 5a 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ZE;.  }else{.   
8d50: 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
8d60: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
8d70: 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64  TokenOnly|EP_Red
8d80: 75 63 65 64 29 20 29 3b 0a 20 20 20 20 61 73 73  uced) );.    ass
8d90: 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
8da0: 70 65 72 74 79 28 70 2c 20 45 50 5f 46 72 6f 6d  perty(p, EP_From
8db0: 4a 6f 69 6e 29 20 29 3b 20 0a 20 20 20 20 61 73  Join) ); .    as
8dc0: 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
8dd0: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 4d 65 6d  operty(p, EP_Mem
8de0: 54 6f 6b 65 6e 29 20 29 3b 0a 20 20 20 20 61 73  Token) );.    as
8df0: 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
8e00: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 4e 6f 52  operty(p, EP_NoR
8e10: 65 64 75 63 65 29 20 29 3b 0a 20 20 20 20 69 66  educe) );.    if
8e20: 28 20 70 2d 3e 70 4c 65 66 74 20 7c 7c 20 70 2d  ( p->pLeft || p-
8e30: 3e 78 2e 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  >x.pList ){.    
8e40: 20 20 6e 53 69 7a 65 20 3d 20 45 58 50 52 5f 52    nSize = EXPR_R
8e50: 45 44 55 43 45 44 53 49 5a 45 20 7c 20 45 50 5f  EDUCEDSIZE | EP_
8e60: 52 65 64 75 63 65 64 3b 0a 20 20 20 20 7d 65 6c  Reduced;.    }el
8e70: 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
8e80: 28 20 70 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29  ( p->pRight==0 )
8e90: 3b 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20  ;.      nSize = 
8ea0: 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49  EXPR_TOKENONLYSI
8eb0: 5a 45 20 7c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  ZE | EP_TokenOnl
8ec0: 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  y;.    }.  }.  r
8ed0: 65 74 75 72 6e 20 6e 53 69 7a 65 3b 0a 7d 0a 0a  eturn nSize;.}..
8ee0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
8ef0: 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20  ion returns the 
8f00: 73 70 61 63 65 20 69 6e 20 62 79 74 65 73 20 72  space in bytes r
8f10: 65 71 75 69 72 65 64 20 74 6f 20 73 74 6f 72 65  equired to store
8f20: 20 74 68 65 20 63 6f 70 79 20 0a 2a 2a 20 6f 66   the copy .** of
8f30: 20 74 68 65 20 45 78 70 72 20 73 74 72 75 63 74   the Expr struct
8f40: 75 72 65 20 61 6e 64 20 61 20 63 6f 70 79 20 6f  ure and a copy o
8f50: 66 20 74 68 65 20 45 78 70 72 2e 75 2e 7a 54 6f  f the Expr.u.zTo
8f60: 6b 65 6e 20 73 74 72 69 6e 67 20 28 69 66 20 74  ken string (if t
8f70: 68 61 74 0a 2a 2a 20 73 74 72 69 6e 67 20 69 73  hat.** string is
8f80: 20 64 65 66 69 6e 65 64 2e 29 0a 2a 2f 0a 73 74   defined.).*/.st
8f90: 61 74 69 63 20 69 6e 74 20 64 75 70 65 64 45 78  atic int dupedEx
8fa0: 70 72 4e 6f 64 65 53 69 7a 65 28 45 78 70 72 20  prNodeSize(Expr 
8fb0: 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a  *p, int flags){.
8fc0: 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 64 75    int nByte = du
8fd0: 70 65 64 45 78 70 72 53 74 72 75 63 74 53 69 7a  pedExprStructSiz
8fe0: 65 28 70 2c 20 66 6c 61 67 73 29 20 26 20 30 78  e(p, flags) & 0x
8ff0: 66 66 66 3b 0a 20 20 69 66 28 20 21 45 78 70 72  fff;.  if( !Expr
9000: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
9010: 50 5f 49 6e 74 56 61 6c 75 65 29 20 26 26 20 70  P_IntValue) && p
9020: 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 29 7b 0a 20 20  ->u.zToken ){.  
9030: 20 20 6e 42 79 74 65 20 2b 3d 20 73 71 6c 69 74    nByte += sqlit
9040: 65 33 53 74 72 6c 65 6e 33 30 28 70 2d 3e 75 2e  e3Strlen30(p->u.
9050: 7a 54 6f 6b 65 6e 29 2b 31 3b 0a 20 20 7d 0a 20  zToken)+1;.  }. 
9060: 20 72 65 74 75 72 6e 20 52 4f 55 4e 44 38 28 6e   return ROUND8(n
9070: 42 79 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Byte);.}../*.** 
9080: 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
9090: 72 20 6f 66 20 62 79 74 65 73 20 72 65 71 75 69  r of bytes requi
90a0: 72 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 20  red to create a 
90b0: 64 75 70 6c 69 63 61 74 65 20 6f 66 20 74 68 65  duplicate of the
90c0: 20 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20   .** expression 
90d0: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69  passed as the fi
90e0: 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 54 68  rst argument. Th
90f0: 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
9100: 74 20 69 73 20 61 0a 2a 2a 20 6d 61 73 6b 20 63  t is a.** mask c
9110: 6f 6e 74 61 69 6e 69 6e 67 20 45 58 50 52 44 55  ontaining EXPRDU
9120: 50 5f 58 58 58 20 66 6c 61 67 73 2e 0a 2a 2a 0a  P_XXX flags..**.
9130: 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65 74  ** The value ret
9140: 75 72 6e 65 64 20 69 6e 63 6c 75 64 65 73 20 73  urned includes s
9150: 70 61 63 65 20 74 6f 20 63 72 65 61 74 65 20 61  pace to create a
9160: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 45 78 70   copy of the Exp
9170: 72 20 73 74 72 75 63 74 0a 2a 2a 20 69 74 73 65  r struct.** itse
9180: 6c 66 20 61 6e 64 20 74 68 65 20 62 75 66 66 65  lf and the buffe
9190: 72 20 72 65 66 65 72 72 65 64 20 74 6f 20 62 79  r referred to by
91a0: 20 45 78 70 72 2e 75 2e 7a 54 6f 6b 65 6e 2c 20   Expr.u.zToken, 
91b0: 69 66 20 61 6e 79 2e 0a 2a 2a 0a 2a 2a 20 49 66  if any..**.** If
91c0: 20 74 68 65 20 45 58 50 52 44 55 50 5f 52 45 44   the EXPRDUP_RED
91d0: 55 43 45 20 66 6c 61 67 20 69 73 20 73 65 74 2c  UCE flag is set,
91e0: 20 74 68 65 6e 20 74 68 65 20 72 65 74 75 72 6e   then the return
91f0: 20 76 61 6c 75 65 20 69 6e 63 6c 75 64 65 73 20   value includes 
9200: 0a 2a 2a 20 73 70 61 63 65 20 74 6f 20 64 75 70  .** space to dup
9210: 6c 69 63 61 74 65 20 61 6c 6c 20 45 78 70 72 20  licate all Expr 
9220: 6e 6f 64 65 73 20 69 6e 20 74 68 65 20 74 72 65  nodes in the tre
9230: 65 20 66 6f 72 6d 65 64 20 62 79 20 45 78 70 72  e formed by Expr
9240: 2e 70 4c 65 66 74 20 0a 2a 2a 20 61 6e 64 20 45  .pLeft .** and E
9250: 78 70 72 2e 70 52 69 67 68 74 20 76 61 72 69 61  xpr.pRight varia
9260: 62 6c 65 73 20 28 62 75 74 20 6e 6f 74 20 66 6f  bles (but not fo
9270: 72 20 61 6e 79 20 73 74 72 75 63 74 75 72 65 73  r any structures
9280: 20 70 6f 69 6e 74 65 64 20 74 6f 20 6f 72 20 0a   pointed to or .
9290: 2a 2a 20 64 65 73 63 65 6e 64 65 64 20 66 72 6f  ** descended fro
92a0: 6d 20 74 68 65 20 45 78 70 72 2e 78 2e 70 4c 69  m the Expr.x.pLi
92b0: 73 74 20 6f 72 20 45 78 70 72 2e 78 2e 70 53 65  st or Expr.x.pSe
92c0: 6c 65 63 74 20 76 61 72 69 61 62 6c 65 73 29 2e  lect variables).
92d0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
92e0: 75 70 65 64 45 78 70 72 53 69 7a 65 28 45 78 70  upedExprSize(Exp
92f0: 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29  r *p, int flags)
9300: 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20  {.  int nByte = 
9310: 30 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  0;.  if( p ){.  
9320: 20 20 6e 42 79 74 65 20 3d 20 64 75 70 65 64 45    nByte = dupedE
9330: 78 70 72 4e 6f 64 65 53 69 7a 65 28 70 2c 20 66  xprNodeSize(p, f
9340: 6c 61 67 73 29 3b 0a 20 20 20 20 69 66 28 20 66  lags);.    if( f
9350: 6c 61 67 73 26 45 58 50 52 44 55 50 5f 52 45 44  lags&EXPRDUP_RED
9360: 55 43 45 20 29 7b 0a 20 20 20 20 20 20 6e 42 79  UCE ){.      nBy
9370: 74 65 20 2b 3d 20 64 75 70 65 64 45 78 70 72 53  te += dupedExprS
9380: 69 7a 65 28 70 2d 3e 70 4c 65 66 74 2c 20 66 6c  ize(p->pLeft, fl
9390: 61 67 73 29 20 2b 20 64 75 70 65 64 45 78 70 72  ags) + dupedExpr
93a0: 53 69 7a 65 28 70 2d 3e 70 52 69 67 68 74 2c 20  Size(p->pRight, 
93b0: 66 6c 61 67 73 29 3b 0a 20 20 20 20 7d 0a 20 20  flags);.    }.  
93c0: 7d 0a 20 20 72 65 74 75 72 6e 20 6e 42 79 74 65  }.  return nByte
93d0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
93e0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 73 69 6d 69  function is simi
93f0: 6c 61 72 20 74 6f 20 73 71 6c 69 74 65 33 45 78  lar to sqlite3Ex
9400: 70 72 44 75 70 28 29 2c 20 65 78 63 65 70 74 20  prDup(), except 
9410: 74 68 61 74 20 69 66 20 70 7a 42 75 66 66 65 72  that if pzBuffer
9420: 20 0a 2a 2a 20 69 73 20 6e 6f 74 20 4e 55 4c 4c   .** is not NULL
9430: 20 74 68 65 6e 20 2a 70 7a 42 75 66 66 65 72 20   then *pzBuffer 
9440: 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20 70 6f  is assumed to po
9450: 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72 20  int to a buffer 
9460: 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 0a 2a 2a  large enough .**
9470: 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 63 6f   to store the co
9480: 70 79 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e  py of expression
9490: 20 70 2c 20 74 68 65 20 63 6f 70 69 65 73 20 6f   p, the copies o
94a0: 66 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 0a 2a 2a  f p->u.zToken.**
94b0: 20 28 69 66 20 61 70 70 6c 69 63 61 62 6c 65 29   (if applicable)
94c0: 2c 20 61 6e 64 20 74 68 65 20 63 6f 70 69 65 73  , and the copies
94d0: 20 6f 66 20 74 68 65 20 70 2d 3e 70 4c 65 66 74   of the p->pLeft
94e0: 20 61 6e 64 20 70 2d 3e 70 52 69 67 68 74 20 65   and p->pRight e
94f0: 78 70 72 65 73 73 69 6f 6e 73 2c 0a 2a 2a 20 69  xpressions,.** i
9500: 66 20 61 6e 79 2e 20 42 65 66 6f 72 65 20 72 65  f any. Before re
9510: 74 75 72 6e 69 6e 67 2c 20 2a 70 7a 42 75 66 66  turning, *pzBuff
9520: 65 72 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  er is set to the
9530: 20 66 69 72 73 74 20 62 79 74 65 20 70 61 73 74   first byte past
9540: 20 74 68 65 0a 2a 2a 20 70 6f 72 74 69 6f 6e 20   the.** portion 
9550: 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 63 6f  of the buffer co
9560: 70 69 65 64 20 69 6e 74 6f 20 62 79 20 74 68 69  pied into by thi
9570: 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  s function..*/.s
9580: 74 61 74 69 63 20 45 78 70 72 20 2a 65 78 70 72  tatic Expr *expr
9590: 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  Dup(sqlite3 *db,
95a0: 20 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 64 75   Expr *p, int du
95b0: 70 46 6c 61 67 73 2c 20 75 38 20 2a 2a 70 7a 42  pFlags, u8 **pzB
95c0: 75 66 66 65 72 29 7b 0a 20 20 45 78 70 72 20 2a  uffer){.  Expr *
95d0: 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20  pNew;           
95e0: 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72 65 74 75  /* Value to retu
95f0: 72 6e 20 2a 2f 0a 20 20 75 38 20 2a 7a 41 6c 6c  rn */.  u8 *zAll
9600: 6f 63 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  oc;           /*
9610: 20 4d 65 6d 6f 72 79 20 73 70 61 63 65 20 66 72   Memory space fr
9620: 6f 6d 20 77 68 69 63 68 20 74 6f 20 62 75 69 6c  om which to buil
9630: 64 20 45 78 70 72 20 6f 62 6a 65 63 74 20 2a 2f  d Expr object */
9640: 0a 20 20 75 33 32 20 73 74 61 74 69 63 46 6c 61  .  u32 staticFla
9650: 67 3b 20 20 20 20 20 20 20 2f 2a 20 45 50 5f 53  g;       /* EP_S
9660: 74 61 74 69 63 20 69 66 20 73 70 61 63 65 20 6e  tatic if space n
9670: 6f 74 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ot obtained from
9680: 20 6d 61 6c 6c 6f 63 20 2a 2f 0a 0a 20 20 61 73   malloc */..  as
9690: 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20  sert( db!=0 );. 
96a0: 20 61 73 73 65 72 74 28 20 70 20 29 3b 0a 20 20   assert( p );.  
96b0: 61 73 73 65 72 74 28 20 64 75 70 46 6c 61 67 73  assert( dupFlags
96c0: 3d 3d 30 20 7c 7c 20 64 75 70 46 6c 61 67 73 3d  ==0 || dupFlags=
96d0: 3d 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 20  =EXPRDUP_REDUCE 
96e0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 7a 42  );.  assert( pzB
96f0: 75 66 66 65 72 3d 3d 30 20 7c 7c 20 64 75 70 46  uffer==0 || dupF
9700: 6c 61 67 73 3d 3d 45 58 50 52 44 55 50 5f 52 45  lags==EXPRDUP_RE
9710: 44 55 43 45 20 29 3b 0a 0a 20 20 2f 2a 20 46 69  DUCE );..  /* Fi
9720: 67 75 72 65 20 6f 75 74 20 77 68 65 72 65 20 74  gure out where t
9730: 6f 20 77 72 69 74 65 20 74 68 65 20 6e 65 77 20  o write the new 
9740: 45 78 70 72 20 73 74 72 75 63 74 75 72 65 2e 20  Expr structure. 
9750: 2a 2f 0a 20 20 69 66 28 20 70 7a 42 75 66 66 65  */.  if( pzBuffe
9760: 72 20 29 7b 0a 20 20 20 20 7a 41 6c 6c 6f 63 20  r ){.    zAlloc 
9770: 3d 20 2a 70 7a 42 75 66 66 65 72 3b 0a 20 20 20  = *pzBuffer;.   
9780: 20 73 74 61 74 69 63 46 6c 61 67 20 3d 20 45 50   staticFlag = EP
9790: 5f 53 74 61 74 69 63 3b 0a 20 20 7d 65 6c 73 65  _Static;.  }else
97a0: 7b 0a 20 20 20 20 7a 41 6c 6c 6f 63 20 3d 20 73  {.    zAlloc = s
97b0: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
97c0: 77 4e 4e 28 64 62 2c 20 64 75 70 65 64 45 78 70  wNN(db, dupedExp
97d0: 72 53 69 7a 65 28 70 2c 20 64 75 70 46 6c 61 67  rSize(p, dupFlag
97e0: 73 29 29 3b 0a 20 20 20 20 73 74 61 74 69 63 46  s));.    staticF
97f0: 6c 61 67 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70  lag = 0;.  }.  p
9800: 4e 65 77 20 3d 20 28 45 78 70 72 20 2a 29 7a 41  New = (Expr *)zA
9810: 6c 6c 6f 63 3b 0a 0a 20 20 69 66 28 20 70 4e 65  lloc;..  if( pNe
9820: 77 20 29 7b 0a 20 20 20 20 2f 2a 20 53 65 74 20  w ){.    /* Set 
9830: 6e 4e 65 77 53 69 7a 65 20 74 6f 20 74 68 65 20  nNewSize to the 
9840: 73 69 7a 65 20 61 6c 6c 6f 63 61 74 65 64 20 66  size allocated f
9850: 6f 72 20 74 68 65 20 73 74 72 75 63 74 75 72 65  or the structure
9860: 20 70 6f 69 6e 74 65 64 20 74 6f 0a 20 20 20 20   pointed to.    
9870: 2a 2a 20 62 79 20 70 4e 65 77 2e 20 54 68 69 73  ** by pNew. This
9880: 20 69 73 20 65 69 74 68 65 72 20 45 58 50 52 5f   is either EXPR_
9890: 46 55 4c 4c 53 49 5a 45 2c 20 45 58 50 52 5f 52  FULLSIZE, EXPR_R
98a0: 45 44 55 43 45 44 53 49 5a 45 20 6f 72 0a 20 20  EDUCEDSIZE or.  
98b0: 20 20 2a 2a 20 45 58 50 52 5f 54 4f 4b 45 4e 4f    ** EXPR_TOKENO
98c0: 4e 4c 59 53 49 5a 45 2e 20 6e 54 6f 6b 65 6e 20  NLYSIZE. nToken 
98d0: 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75  is set to the nu
98e0: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 63 6f  mber of bytes co
98f0: 6e 73 75 6d 65 64 0a 20 20 20 20 2a 2a 20 62 79  nsumed.    ** by
9900: 20 74 68 65 20 63 6f 70 79 20 6f 66 20 74 68 65   the copy of the
9910: 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 73 74 72   p->u.zToken str
9920: 69 6e 67 20 28 69 66 20 61 6e 79 29 2e 0a 20 20  ing (if any)..  
9930: 20 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 75    */.    const u
9940: 6e 73 69 67 6e 65 64 20 6e 53 74 72 75 63 74 53  nsigned nStructS
9950: 69 7a 65 20 3d 20 64 75 70 65 64 45 78 70 72 53  ize = dupedExprS
9960: 74 72 75 63 74 53 69 7a 65 28 70 2c 20 64 75 70  tructSize(p, dup
9970: 46 6c 61 67 73 29 3b 0a 20 20 20 20 63 6f 6e 73  Flags);.    cons
9980: 74 20 69 6e 74 20 6e 4e 65 77 53 69 7a 65 20 3d  t int nNewSize =
9990: 20 6e 53 74 72 75 63 74 53 69 7a 65 20 26 20 30   nStructSize & 0
99a0: 78 66 66 66 3b 0a 20 20 20 20 69 6e 74 20 6e 54  xfff;.    int nT
99b0: 6f 6b 65 6e 3b 0a 20 20 20 20 69 66 28 20 21 45  oken;.    if( !E
99c0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
99d0: 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 26  , EP_IntValue) &
99e0: 26 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 29 7b  & p->u.zToken ){
99f0: 0a 20 20 20 20 20 20 6e 54 6f 6b 65 6e 20 3d 20  .      nToken = 
9a00: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
9a10: 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 20 2b 20 31  p->u.zToken) + 1
9a20: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
9a30: 20 20 20 6e 54 6f 6b 65 6e 20 3d 20 30 3b 0a 20     nToken = 0;. 
9a40: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64 75 70     }.    if( dup
9a50: 46 6c 61 67 73 20 29 7b 0a 20 20 20 20 20 20 61  Flags ){.      a
9a60: 73 73 65 72 74 28 20 45 78 70 72 48 61 73 50 72  ssert( ExprHasPr
9a70: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 52 65 64  operty(p, EP_Red
9a80: 75 63 65 64 29 3d 3d 30 20 29 3b 0a 20 20 20 20  uced)==0 );.    
9a90: 20 20 6d 65 6d 63 70 79 28 7a 41 6c 6c 6f 63 2c    memcpy(zAlloc,
9aa0: 20 70 2c 20 6e 4e 65 77 53 69 7a 65 29 3b 0a 20   p, nNewSize);. 
9ab0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
9ac0: 75 33 32 20 6e 53 69 7a 65 20 3d 20 28 75 33 32  u32 nSize = (u32
9ad0: 29 65 78 70 72 53 74 72 75 63 74 53 69 7a 65 28  )exprStructSize(
9ae0: 70 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79  p);.      memcpy
9af0: 28 7a 41 6c 6c 6f 63 2c 20 70 2c 20 6e 53 69 7a  (zAlloc, p, nSiz
9b00: 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 53  e);.      if( nS
9b10: 69 7a 65 3c 45 58 50 52 5f 46 55 4c 4c 53 49 5a  ize<EXPR_FULLSIZ
9b20: 45 20 29 7b 20 0a 20 20 20 20 20 20 20 20 6d 65  E ){ .        me
9b30: 6d 73 65 74 28 26 7a 41 6c 6c 6f 63 5b 6e 53 69  mset(&zAlloc[nSi
9b40: 7a 65 5d 2c 20 30 2c 20 45 58 50 52 5f 46 55 4c  ze], 0, EXPR_FUL
9b50: 4c 53 49 5a 45 2d 6e 53 69 7a 65 29 3b 0a 20 20  LSIZE-nSize);.  
9b60: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
9b70: 20 2f 2a 20 53 65 74 20 74 68 65 20 45 50 5f 52   /* Set the EP_R
9b80: 65 64 75 63 65 64 2c 20 45 50 5f 54 6f 6b 65 6e  educed, EP_Token
9b90: 4f 6e 6c 79 2c 20 61 6e 64 20 45 50 5f 53 74 61  Only, and EP_Sta
9ba0: 74 69 63 20 66 6c 61 67 73 20 61 70 70 72 6f 70  tic flags approp
9bb0: 72 69 61 74 65 6c 79 2e 20 2a 2f 0a 20 20 20 20  riately. */.    
9bc0: 70 4e 65 77 2d 3e 66 6c 61 67 73 20 26 3d 20 7e  pNew->flags &= ~
9bd0: 28 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f 54  (EP_Reduced|EP_T
9be0: 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 53 74 61 74  okenOnly|EP_Stat
9bf0: 69 63 7c 45 50 5f 4d 65 6d 54 6f 6b 65 6e 29 3b  ic|EP_MemToken);
9c00: 0a 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73  .    pNew->flags
9c10: 20 7c 3d 20 6e 53 74 72 75 63 74 53 69 7a 65 20   |= nStructSize 
9c20: 26 20 28 45 50 5f 52 65 64 75 63 65 64 7c 45 50  & (EP_Reduced|EP
9c30: 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 3b 0a 20 20 20  _TokenOnly);.   
9c40: 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20   pNew->flags |= 
9c50: 73 74 61 74 69 63 46 6c 61 67 3b 0a 0a 20 20 20  staticFlag;..   
9c60: 20 2f 2a 20 43 6f 70 79 20 74 68 65 20 70 2d 3e   /* Copy the p->
9c70: 75 2e 7a 54 6f 6b 65 6e 20 73 74 72 69 6e 67 2c  u.zToken string,
9c80: 20 69 66 20 61 6e 79 2e 20 2a 2f 0a 20 20 20 20   if any. */.    
9c90: 69 66 28 20 6e 54 6f 6b 65 6e 20 29 7b 0a 20 20  if( nToken ){.  
9ca0: 20 20 20 20 63 68 61 72 20 2a 7a 54 6f 6b 65 6e      char *zToken
9cb0: 20 3d 20 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65   = pNew->u.zToke
9cc0: 6e 20 3d 20 28 63 68 61 72 2a 29 26 7a 41 6c 6c  n = (char*)&zAll
9cd0: 6f 63 5b 6e 4e 65 77 53 69 7a 65 5d 3b 0a 20 20  oc[nNewSize];.  
9ce0: 20 20 20 20 6d 65 6d 63 70 79 28 7a 54 6f 6b 65      memcpy(zToke
9cf0: 6e 2c 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20  n, p->u.zToken, 
9d00: 6e 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 7d 0a 0a  nToken);.    }..
9d10: 20 20 20 20 69 66 28 20 30 3d 3d 28 28 70 2d 3e      if( 0==((p->
9d20: 66 6c 61 67 73 7c 70 4e 65 77 2d 3e 66 6c 61 67  flags|pNew->flag
9d30: 73 29 20 26 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  s) & EP_TokenOnl
9d40: 79 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46  y) ){.      /* F
9d50: 69 6c 6c 20 69 6e 20 74 68 65 20 70 4e 65 77 2d  ill in the pNew-
9d60: 3e 78 2e 70 53 65 6c 65 63 74 20 6f 72 20 70 4e  >x.pSelect or pN
9d70: 65 77 2d 3e 78 2e 70 4c 69 73 74 20 6d 65 6d 62  ew->x.pList memb
9d80: 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  er. */.      if(
9d90: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
9da0: 28 70 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  (p, EP_xIsSelect
9db0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65  ) ){.        pNe
9dc0: 77 2d 3e 78 2e 70 53 65 6c 65 63 74 20 3d 20 73  w->x.pSelect = s
9dd0: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28  qlite3SelectDup(
9de0: 64 62 2c 20 70 2d 3e 78 2e 70 53 65 6c 65 63 74  db, p->x.pSelect
9df0: 2c 20 64 75 70 46 6c 61 67 73 29 3b 0a 20 20 20  , dupFlags);.   
9e00: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
9e10: 20 20 70 4e 65 77 2d 3e 78 2e 70 4c 69 73 74 20    pNew->x.pList 
9e20: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
9e30: 74 44 75 70 28 64 62 2c 20 70 2d 3e 78 2e 70 4c  tDup(db, p->x.pL
9e40: 69 73 74 2c 20 64 75 70 46 6c 61 67 73 29 3b 0a  ist, dupFlags);.
9e50: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
9e60: 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 70 4e     /* Fill in pN
9e70: 65 77 2d 3e 70 4c 65 66 74 20 61 6e 64 20 70 4e  ew->pLeft and pN
9e80: 65 77 2d 3e 70 52 69 67 68 74 2e 20 2a 2f 0a 20  ew->pRight. */. 
9e90: 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72     if( ExprHasPr
9ea0: 6f 70 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f  operty(pNew, EP_
9eb0: 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e  Reduced|EP_Token
9ec0: 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 7a  Only) ){.      z
9ed0: 41 6c 6c 6f 63 20 2b 3d 20 64 75 70 65 64 45 78  Alloc += dupedEx
9ee0: 70 72 4e 6f 64 65 53 69 7a 65 28 70 2c 20 64 75  prNodeSize(p, du
9ef0: 70 46 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 69  pFlags);.      i
9f00: 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
9f10: 74 79 28 70 4e 65 77 2c 20 45 50 5f 52 65 64 75  ty(pNew, EP_Redu
9f20: 63 65 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ced) ){.        
9f30: 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20 70 2d  pNew->pLeft = p-
9f40: 3e 70 4c 65 66 74 20 3f 0a 20 20 20 20 20 20 20  >pLeft ?.       
9f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65                 e
9f60: 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 4c  xprDup(db, p->pL
9f70: 65 66 74 2c 20 45 58 50 52 44 55 50 5f 52 45 44  eft, EXPRDUP_RED
9f80: 55 43 45 2c 20 26 7a 41 6c 6c 6f 63 29 20 3a 20  UCE, &zAlloc) : 
9f90: 30 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  0;.        pNew-
9fa0: 3e 70 52 69 67 68 74 20 3d 20 70 2d 3e 70 52 69  >pRight = p->pRi
9fb0: 67 68 74 20 3f 0a 20 20 20 20 20 20 20 20 20 20  ght ?.          
9fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 65 78 70               exp
9fd0: 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 52 69 67  rDup(db, p->pRig
9fe0: 68 74 2c 20 45 58 50 52 44 55 50 5f 52 45 44 55  ht, EXPRDUP_REDU
9ff0: 43 45 2c 20 26 7a 41 6c 6c 6f 63 29 20 3a 20 30  CE, &zAlloc) : 0
a000: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
a010: 69 66 28 20 70 7a 42 75 66 66 65 72 20 29 7b 0a  if( pzBuffer ){.
a020: 20 20 20 20 20 20 20 20 2a 70 7a 42 75 66 66 65          *pzBuffe
a030: 72 20 3d 20 7a 41 6c 6c 6f 63 3b 0a 20 20 20 20  r = zAlloc;.    
a040: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
a050: 20 20 20 20 20 69 66 28 20 21 45 78 70 72 48 61       if( !ExprHa
a060: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
a070: 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20  TokenOnly) ){.  
a080: 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 4c 65 66        pNew->pLef
a090: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  t = sqlite3ExprD
a0a0: 75 70 28 64 62 2c 20 70 2d 3e 70 4c 65 66 74 2c  up(db, p->pLeft,
a0b0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65   0);.        pNe
a0c0: 77 2d 3e 70 52 69 67 68 74 20 3d 20 73 71 6c 69  w->pRight = sqli
a0d0: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
a0e0: 2d 3e 70 52 69 67 68 74 2c 20 30 29 3b 0a 20 20  ->pRight, 0);.  
a0f0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
a100: 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d    return pNew;.}
a110: 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
a120: 6e 64 20 72 65 74 75 72 6e 20 61 20 64 65 65 70  nd return a deep
a130: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 6f 62 6a   copy of the obj
a140: 65 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68  ect passed as th
a150: 65 20 73 65 63 6f 6e 64 20 0a 2a 2a 20 61 72 67  e second .** arg
a160: 75 6d 65 6e 74 2e 20 49 66 20 61 6e 20 4f 4f 4d  ument. If an OOM
a170: 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20 65 6e   condition is en
a180: 63 6f 75 6e 74 65 72 65 64 2c 20 4e 55 4c 4c 20  countered, NULL 
a190: 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61  is returned.** a
a1a0: 6e 64 20 74 68 65 20 64 62 2d 3e 6d 61 6c 6c 6f  nd the db->mallo
a1b0: 63 46 61 69 6c 65 64 20 66 6c 61 67 20 73 65 74  cFailed flag set
a1c0: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
a1d0: 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 73 74 61  ITE_OMIT_CTE.sta
a1e0: 74 69 63 20 57 69 74 68 20 2a 77 69 74 68 44 75  tic With *withDu
a1f0: 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57  p(sqlite3 *db, W
a200: 69 74 68 20 2a 70 29 7b 0a 20 20 57 69 74 68 20  ith *p){.  With 
a210: 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20 69 66 28  *pRet = 0;.  if(
a220: 20 70 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 42   p ){.    int nB
a230: 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70 29  yte = sizeof(*p)
a240: 20 2b 20 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30   + sizeof(p->a[0
a250: 5d 29 20 2a 20 28 70 2d 3e 6e 43 74 65 2d 31 29  ]) * (p->nCte-1)
a260: 3b 0a 20 20 20 20 70 52 65 74 20 3d 20 73 71 6c  ;.    pRet = sql
a270: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
a280: 28 64 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20  (db, nByte);.   
a290: 20 69 66 28 20 70 52 65 74 20 29 7b 0a 20 20 20   if( pRet ){.   
a2a0: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
a2b0: 70 52 65 74 2d 3e 6e 43 74 65 20 3d 20 70 2d 3e  pRet->nCte = p->
a2c0: 6e 43 74 65 3b 0a 20 20 20 20 20 20 66 6f 72 28  nCte;.      for(
a2d0: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 74 65 3b 20  i=0; i<p->nCte; 
a2e0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 52  i++){.        pR
a2f0: 65 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74  et->a[i].pSelect
a300: 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
a310: 44 75 70 28 64 62 2c 20 70 2d 3e 61 5b 69 5d 2e  Dup(db, p->a[i].
a320: 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 20  pSelect, 0);.   
a330: 20 20 20 20 20 70 52 65 74 2d 3e 61 5b 69 5d 2e       pRet->a[i].
a340: 70 43 6f 6c 73 20 3d 20 73 71 6c 69 74 65 33 45  pCols = sqlite3E
a350: 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70  xprListDup(db, p
a360: 2d 3e 61 5b 69 5d 2e 70 43 6f 6c 73 2c 20 30 29  ->a[i].pCols, 0)
a370: 3b 0a 20 20 20 20 20 20 20 20 70 52 65 74 2d 3e  ;.        pRet->
a380: 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c  a[i].zName = sql
a390: 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
a3a0: 20 70 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b   p->a[i].zName);
a3b0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
a3c0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74   }.  return pRet
a3d0: 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  ;.}.#else.# defi
a3e0: 6e 65 20 77 69 74 68 44 75 70 28 78 2c 79 29 20  ne withDup(x,y) 
a3f0: 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  0.#endif../*.** 
a400: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 72  The following gr
a410: 6f 75 70 20 6f 66 20 72 6f 75 74 69 6e 65 73 20  oup of routines 
a420: 6d 61 6b 65 20 64 65 65 70 20 63 6f 70 69 65 73  make deep copies
a430: 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73 2c   of expressions,
a440: 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  .** expression l
a450: 69 73 74 73 2c 20 49 44 20 6c 69 73 74 73 2c 20  ists, ID lists, 
a460: 61 6e 64 20 73 65 6c 65 63 74 20 73 74 61 74 65  and select state
a470: 6d 65 6e 74 73 2e 20 20 54 68 65 20 63 6f 70 69  ments.  The copi
a480: 65 73 20 63 61 6e 0a 2a 2a 20 62 65 20 64 65 6c  es can.** be del
a490: 65 74 65 64 20 28 62 79 20 62 65 69 6e 67 20 70  eted (by being p
a4a0: 61 73 73 65 64 20 74 6f 20 74 68 65 69 72 20 72  assed to their r
a4b0: 65 73 70 65 63 74 69 76 65 20 2e 2e 2e 44 65 6c  espective ...Del
a4c0: 65 74 65 28 29 20 72 6f 75 74 69 6e 65 73 29 0a  ete() routines).
a4d0: 2a 2a 20 77 69 74 68 6f 75 74 20 65 66 66 65 63  ** without effec
a4e0: 74 69 6e 67 20 74 68 65 20 6f 72 69 67 69 6e 61  ting the origina
a4f0: 6c 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 78  ls..**.** The ex
a500: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2c 20 49  pression list, I
a510: 44 2c 20 61 6e 64 20 73 6f 75 72 63 65 20 6c 69  D, and source li
a520: 73 74 73 20 72 65 74 75 72 6e 20 62 79 20 73 71  sts return by sq
a530: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
a540: 28 29 2c 0a 2a 2a 20 73 71 6c 69 74 65 33 49 64  (),.** sqlite3Id
a550: 4c 69 73 74 44 75 70 28 29 2c 20 61 6e 64 20 73  ListDup(), and s
a560: 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 75 70  qlite3SrcListDup
a570: 28 29 20 63 61 6e 20 6e 6f 74 20 62 65 20 66 75  () can not be fu
a580: 72 74 68 65 72 20 65 78 70 61 6e 64 65 64 20 0a  rther expanded .
a590: 2a 2a 20 62 79 20 73 75 62 73 65 71 75 65 6e 74  ** by subsequent
a5a0: 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65   calls to sqlite
a5b0: 2a 4c 69 73 74 41 70 70 65 6e 64 28 29 20 72 6f  *ListAppend() ro
a5c0: 75 74 69 6e 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e  utines..**.** An
a5d0: 79 20 74 61 62 6c 65 73 20 74 68 61 74 20 74 68  y tables that th
a5e0: 65 20 53 72 63 4c 69 73 74 20 6d 69 67 68 74 20  e SrcList might 
a5f0: 70 6f 69 6e 74 20 74 6f 20 61 72 65 20 6e 6f 74  point to are not
a600: 20 64 75 70 6c 69 63 61 74 65 64 2e 0a 2a 2a 0a   duplicated..**.
a610: 2a 2a 20 54 68 65 20 66 6c 61 67 73 20 70 61 72  ** The flags par
a620: 61 6d 65 74 65 72 20 63 6f 6e 74 61 69 6e 73 20  ameter contains 
a630: 61 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66  a combination of
a640: 20 74 68 65 20 45 58 50 52 44 55 50 5f 58 58 58   the EXPRDUP_XXX
a650: 20 66 6c 61 67 73 2e 0a 2a 2a 20 49 66 20 74 68   flags..** If th
a660: 65 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 45  e EXPRDUP_REDUCE
a670: 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68   flag is set, th
a680: 65 6e 20 74 68 65 20 73 74 72 75 63 74 75 72 65  en the structure
a690: 20 72 65 74 75 72 6e 65 64 20 69 73 20 61 0a 2a   returned is a.*
a6a0: 2a 20 74 72 75 6e 63 61 74 65 64 20 76 65 72 73  * truncated vers
a6b0: 69 6f 6e 20 6f 66 20 74 68 65 20 75 73 75 61 6c  ion of the usual
a6c0: 20 45 78 70 72 20 73 74 72 75 63 74 75 72 65 20   Expr structure 
a6d0: 74 68 61 74 20 77 69 6c 6c 20 62 65 20 73 74 6f  that will be sto
a6e0: 72 65 64 20 61 73 0a 2a 2a 20 70 61 72 74 20 6f  red as.** part o
a6f0: 66 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  f the in-memory 
a700: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f  representation o
a710: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  f the database s
a720: 63 68 65 6d 61 2e 0a 2a 2f 0a 45 78 70 72 20 2a  chema..*/.Expr *
a730: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 73  sqlite3ExprDup(s
a740: 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72  qlite3 *db, Expr
a750: 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b   *p, int flags){
a760: 0a 20 20 61 73 73 65 72 74 28 20 66 6c 61 67 73  .  assert( flags
a770: 3d 3d 30 20 7c 7c 20 66 6c 61 67 73 3d 3d 45 58  ==0 || flags==EX
a780: 50 52 44 55 50 5f 52 45 44 55 43 45 20 29 3b 0a  PRDUP_REDUCE );.
a790: 20 20 72 65 74 75 72 6e 20 70 20 3f 20 65 78 70    return p ? exp
a7a0: 72 44 75 70 28 64 62 2c 20 70 2c 20 66 6c 61 67  rDup(db, p, flag
a7b0: 73 2c 20 30 29 20 3a 20 30 3b 0a 7d 0a 45 78 70  s, 0) : 0;.}.Exp
a7c0: 72 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 45 78  rList *sqlite3Ex
a7d0: 70 72 4c 69 73 74 44 75 70 28 73 71 6c 69 74 65  prListDup(sqlite
a7e0: 33 20 2a 64 62 2c 20 45 78 70 72 4c 69 73 74 20  3 *db, ExprList 
a7f0: 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a  *p, int flags){.
a800: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4e 65 77    ExprList *pNew
a810: 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c  ;.  struct ExprL
a820: 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 2c  ist_item *pItem,
a830: 20 2a 70 4f 6c 64 49 74 65 6d 3b 0a 20 20 69 6e   *pOldItem;.  in
a840: 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20 64  t i;.  assert( d
a850: 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 3d  b!=0 );.  if( p=
a860: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
a870: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44   pNew = sqlite3D
a880: 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c  bMallocRawNN(db,
a890: 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29   sizeof(*pNew) )
a8a0: 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20  ;.  if( pNew==0 
a8b0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e  ) return 0;.  pN
a8c0: 65 77 2d 3e 6e 45 78 70 72 20 3d 20 69 20 3d 20  ew->nExpr = i = 
a8d0: 70 2d 3e 6e 45 78 70 72 3b 0a 20 20 69 66 28 20  p->nExpr;.  if( 
a8e0: 28 66 6c 61 67 73 20 26 20 45 58 50 52 44 55 50  (flags & EXPRDUP
a8f0: 5f 52 45 44 55 43 45 29 3d 3d 30 20 29 20 66 6f  _REDUCE)==0 ) fo
a900: 72 28 69 3d 31 3b 20 69 3c 70 2d 3e 6e 45 78 70  r(i=1; i<p->nExp
a910: 72 3b 20 69 2b 3d 69 29 7b 7d 0a 20 20 70 4e 65  r; i+=i){}.  pNe
a920: 77 2d 3e 61 20 3d 20 70 49 74 65 6d 20 3d 20 73  w->a = pItem = s
a930: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
a940: 77 4e 4e 28 64 62 2c 20 20 69 2a 73 69 7a 65 6f  wNN(db,  i*sizeo
a950: 66 28 70 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20  f(p->a[0]) );.  
a960: 69 66 28 20 70 49 74 65 6d 3d 3d 30 20 29 7b 0a  if( pItem==0 ){.
a970: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
a980: 65 28 64 62 2c 20 70 4e 65 77 29 3b 0a 20 20 20  e(db, pNew);.   
a990: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 20 0a   return 0;.  } .
a9a0: 20 20 70 4f 6c 64 49 74 65 6d 20 3d 20 70 2d 3e    pOldItem = p->
a9b0: 61 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  a;.  for(i=0; i<
a9c0: 70 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70  p->nExpr; i++, p
a9d0: 49 74 65 6d 2b 2b 2c 20 70 4f 6c 64 49 74 65 6d  Item++, pOldItem
a9e0: 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
a9f0: 4f 6c 64 45 78 70 72 20 3d 20 70 4f 6c 64 49 74  OldExpr = pOldIt
aa00: 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 70  em->pExpr;.    p
aa10: 49 74 65 6d 2d 3e 70 45 78 70 72 20 3d 20 73 71  Item->pExpr = sq
aa20: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
aa30: 20 70 4f 6c 64 45 78 70 72 2c 20 66 6c 61 67 73   pOldExpr, flags
aa40: 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 4e  );.    pItem->zN
aa50: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ame = sqlite3DbS
aa60: 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74  trDup(db, pOldIt
aa70: 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  em->zName);.    
aa80: 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 20 3d 20 73  pItem->zSpan = s
aa90: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
aaa0: 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 53 70  b, pOldItem->zSp
aab0: 61 6e 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e  an);.    pItem->
aac0: 73 6f 72 74 4f 72 64 65 72 20 3d 20 70 4f 6c 64  sortOrder = pOld
aad0: 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3b  Item->sortOrder;
aae0: 0a 20 20 20 20 70 49 74 65 6d 2d 3e 64 6f 6e 65  .    pItem->done
aaf0: 20 3d 20 30 3b 0a 20 20 20 20 70 49 74 65 6d 2d   = 0;.    pItem-
ab00: 3e 62 53 70 61 6e 49 73 54 61 62 20 3d 20 70 4f  >bSpanIsTab = pO
ab10: 6c 64 49 74 65 6d 2d 3e 62 53 70 61 6e 49 73 54  ldItem->bSpanIsT
ab20: 61 62 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 75  ab;.    pItem->u
ab30: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 75 3b 0a   = pOldItem->u;.
ab40: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65    }.  return pNe
ab50: 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 63  w;.}../*.** If c
ab60: 75 72 73 6f 72 73 2c 20 74 72 69 67 67 65 72 73  ursors, triggers
ab70: 2c 20 76 69 65 77 73 20 61 6e 64 20 73 75 62 71  , views and subq
ab80: 75 65 72 69 65 73 20 61 72 65 20 61 6c 6c 20 6f  ueries are all o
ab90: 6d 69 74 74 65 64 20 66 72 6f 6d 0a 2a 2a 20 74  mitted from.** t
aba0: 68 65 20 62 75 69 6c 64 2c 20 74 68 65 6e 20 6e  he build, then n
abb0: 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  one of the follo
abc0: 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 2c 20 65  wing routines, e
abd0: 78 63 65 70 74 20 66 6f 72 20 0a 2a 2a 20 73 71  xcept for .** sq
abe0: 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 29  lite3SelectDup()
abf0: 2c 20 63 61 6e 20 62 65 20 63 61 6c 6c 65 64 2e  , can be called.
ac00: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75   sqlite3SelectDu
ac10: 70 28 29 20 69 73 20 73 6f 6d 65 74 69 6d 65 73  p() is sometimes
ac20: 0a 2a 2a 20 63 61 6c 6c 65 64 20 77 69 74 68 20  .** called with 
ac30: 61 20 4e 55 4c 4c 20 61 72 67 75 6d 65 6e 74 2e  a NULL argument.
ac40: 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64  .*/.#if !defined
ac50: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45  (SQLITE_OMIT_VIE
ac60: 57 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  W) || !defined(S
ac70: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47  QLITE_OMIT_TRIGG
ac80: 45 52 29 20 5c 0a 20 7c 7c 20 21 64 65 66 69 6e  ER) \. || !defin
ac90: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
aca0: 55 42 51 55 45 52 59 29 0a 53 72 63 4c 69 73 74  UBQUERY).SrcList
acb0: 20 2a 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74   *sqlite3SrcList
acc0: 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  Dup(sqlite3 *db,
acd0: 20 53 72 63 4c 69 73 74 20 2a 70 2c 20 69 6e 74   SrcList *p, int
ace0: 20 66 6c 61 67 73 29 7b 0a 20 20 53 72 63 4c 69   flags){.  SrcLi
acf0: 73 74 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20  st *pNew;.  int 
ad00: 69 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a  i;.  int nByte;.
ad10: 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20    assert( db!=0 
ad20: 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  );.  if( p==0 ) 
ad30: 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e 42 79 74  return 0;.  nByt
ad40: 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70 29 20 2b  e = sizeof(*p) +
ad50: 20 28 70 2d 3e 6e 53 72 63 3e 30 20 3f 20 73 69   (p->nSrc>0 ? si
ad60: 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 2a 20  zeof(p->a[0]) * 
ad70: 28 70 2d 3e 6e 53 72 63 2d 31 29 20 3a 20 30 29  (p->nSrc-1) : 0)
ad80: 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74  ;.  pNew = sqlit
ad90: 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28  e3DbMallocRawNN(
ada0: 64 62 2c 20 6e 42 79 74 65 20 29 3b 0a 20 20 69  db, nByte );.  i
adb0: 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74  f( pNew==0 ) ret
adc0: 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e  urn 0;.  pNew->n
add0: 53 72 63 20 3d 20 70 4e 65 77 2d 3e 6e 41 6c 6c  Src = pNew->nAll
ade0: 6f 63 20 3d 20 70 2d 3e 6e 53 72 63 3b 0a 20 20  oc = p->nSrc;.  
adf0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 53  for(i=0; i<p->nS
ae00: 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74  rc; i++){.    st
ae10: 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
ae20: 6d 20 2a 70 4e 65 77 49 74 65 6d 20 3d 20 26 70  m *pNewItem = &p
ae30: 4e 65 77 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 73  New->a[i];.    s
ae40: 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
ae50: 65 6d 20 2a 70 4f 6c 64 49 74 65 6d 20 3d 20 26  em *pOldItem = &
ae60: 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 54 61 62  p->a[i];.    Tab
ae70: 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 70 4e  le *pTab;.    pN
ae80: 65 77 49 74 65 6d 2d 3e 70 53 63 68 65 6d 61 20  ewItem->pSchema 
ae90: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 53 63 68  = pOldItem->pSch
aea0: 65 6d 61 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  ema;.    pNewIte
aeb0: 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d 20 73  m->zDatabase = s
aec0: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
aed0: 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 44 61  b, pOldItem->zDa
aee0: 74 61 62 61 73 65 29 3b 0a 20 20 20 20 70 4e 65  tabase);.    pNe
aef0: 77 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73  wItem->zName = s
af00: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
af10: 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61  b, pOldItem->zNa
af20: 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  me);.    pNewIte
af30: 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 73 71 6c 69  m->zAlias = sqli
af40: 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
af50: 70 4f 6c 64 49 74 65 6d 2d 3e 7a 41 6c 69 61 73  pOldItem->zAlias
af60: 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  );.    pNewItem-
af70: 3e 66 67 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e  >fg = pOldItem->
af80: 66 67 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  fg;.    pNewItem
af90: 2d 3e 69 43 75 72 73 6f 72 20 3d 20 70 4f 6c 64  ->iCursor = pOld
afa0: 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20  Item->iCursor;. 
afb0: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 61 64 64     pNewItem->add
afc0: 72 46 69 6c 6c 53 75 62 20 3d 20 70 4f 6c 64 49  rFillSub = pOldI
afd0: 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62  tem->addrFillSub
afe0: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
aff0: 72 65 67 52 65 74 75 72 6e 20 3d 20 70 4f 6c 64  regReturn = pOld
b000: 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 3b  Item->regReturn;
b010: 0a 20 20 20 20 69 66 28 20 70 4e 65 77 49 74 65  .    if( pNewIte
b020: 6d 2d 3e 66 67 2e 69 73 49 6e 64 65 78 65 64 42  m->fg.isIndexedB
b030: 79 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 49  y ){.      pNewI
b040: 74 65 6d 2d 3e 75 31 2e 7a 49 6e 64 65 78 65 64  tem->u1.zIndexed
b050: 42 79 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  By = sqlite3DbSt
b060: 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65  rDup(db, pOldIte
b070: 6d 2d 3e 75 31 2e 7a 49 6e 64 65 78 65 64 42 79  m->u1.zIndexedBy
b080: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e 65  );.    }.    pNe
b090: 77 49 74 65 6d 2d 3e 70 49 42 49 6e 64 65 78 20  wItem->pIBIndex 
b0a0: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 49 42 49  = pOldItem->pIBI
b0b0: 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20 70 4e  ndex;.    if( pN
b0c0: 65 77 49 74 65 6d 2d 3e 66 67 2e 69 73 54 61 62  ewItem->fg.isTab
b0d0: 46 75 6e 63 20 29 7b 0a 20 20 20 20 20 20 70 4e  Func ){.      pN
b0e0: 65 77 49 74 65 6d 2d 3e 75 31 2e 70 46 75 6e 63  ewItem->u1.pFunc
b0f0: 41 72 67 20 3d 20 0a 20 20 20 20 20 20 20 20 20  Arg = .         
b100: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
b110: 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d  Dup(db, pOldItem
b120: 2d 3e 75 31 2e 70 46 75 6e 63 41 72 67 2c 20 66  ->u1.pFuncArg, f
b130: 6c 61 67 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20  lags);.    }.   
b140: 20 70 54 61 62 20 3d 20 70 4e 65 77 49 74 65 6d   pTab = pNewItem
b150: 2d 3e 70 54 61 62 20 3d 20 70 4f 6c 64 49 74 65  ->pTab = pOldIte
b160: 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69 66 28  m->pTab;.    if(
b170: 20 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20 70   pTab ){.      p
b180: 54 61 62 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20  Tab->nRef++;.   
b190: 20 7d 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d   }.    pNewItem-
b1a0: 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74  >pSelect = sqlit
b1b0: 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20  e3SelectDup(db, 
b1c0: 70 4f 6c 64 49 74 65 6d 2d 3e 70 53 65 6c 65 63  pOldItem->pSelec
b1d0: 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70  t, flags);.    p
b1e0: 4e 65 77 49 74 65 6d 2d 3e 70 4f 6e 20 3d 20 73  NewItem->pOn = s
b1f0: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
b200: 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 4f 6e 2c  , pOldItem->pOn,
b210: 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e 65   flags);.    pNe
b220: 77 49 74 65 6d 2d 3e 70 55 73 69 6e 67 20 3d 20  wItem->pUsing = 
b230: 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 75 70  sqlite3IdListDup
b240: 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 70  (db, pOldItem->p
b250: 55 73 69 6e 67 29 3b 0a 20 20 20 20 70 4e 65 77  Using);.    pNew
b260: 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 20 3d 20  Item->colUsed = 
b270: 70 4f 6c 64 49 74 65 6d 2d 3e 63 6f 6c 55 73 65  pOldItem->colUse
b280: 64 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  d;.  }.  return 
b290: 70 4e 65 77 3b 0a 7d 0a 49 64 4c 69 73 74 20 2a  pNew;.}.IdList *
b2a0: 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 75 70  sqlite3IdListDup
b2b0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 49 64  (sqlite3 *db, Id
b2c0: 4c 69 73 74 20 2a 70 29 7b 0a 20 20 49 64 4c 69  List *p){.  IdLi
b2d0: 73 74 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20  st *pNew;.  int 
b2e0: 69 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 21  i;.  assert( db!
b2f0: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30  =0 );.  if( p==0
b300: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
b310: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  New = sqlite3DbM
b320: 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73  allocRawNN(db, s
b330: 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a  izeof(*pNew) );.
b340: 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20    if( pNew==0 ) 
b350: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77  return 0;.  pNew
b360: 2d 3e 6e 49 64 20 3d 20 70 2d 3e 6e 49 64 3b 0a  ->nId = p->nId;.
b370: 20 20 70 4e 65 77 2d 3e 61 20 3d 20 73 71 6c 69    pNew->a = sqli
b380: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e  te3DbMallocRawNN
b390: 28 64 62 2c 20 70 2d 3e 6e 49 64 2a 73 69 7a 65  (db, p->nId*size
b3a0: 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20  of(p->a[0]) );. 
b3b0: 20 69 66 28 20 70 4e 65 77 2d 3e 61 3d 3d 30 20   if( pNew->a==0 
b3c0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  ){.    sqlite3Db
b3d0: 46 72 65 65 28 64 62 2c 20 70 4e 65 77 29 3b 0a  Free(db, pNew);.
b3e0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
b3f0: 7d 0a 20 20 2f 2a 20 4e 6f 74 65 20 74 68 61 74  }.  /* Note that
b400: 20 62 65 63 61 75 73 65 20 74 68 65 20 73 69 7a   because the siz
b410: 65 20 6f 66 20 74 68 65 20 61 6c 6c 6f 63 61 74  e of the allocat
b420: 69 6f 6e 20 66 6f 72 20 70 2d 3e 61 5b 5d 20 69  ion for p->a[] i
b430: 73 20 6e 6f 74 0a 20 20 2a 2a 20 6e 65 63 65 73  s not.  ** neces
b440: 73 61 72 69 6c 79 20 61 20 70 6f 77 65 72 20 6f  sarily a power o
b450: 66 20 74 77 6f 2c 20 73 71 6c 69 74 65 33 49 64  f two, sqlite3Id
b460: 4c 69 73 74 41 70 70 65 6e 64 28 29 20 6d 61 79  ListAppend() may
b470: 20 6e 6f 74 20 62 65 20 63 61 6c 6c 65 64 0a 20   not be called. 
b480: 20 2a 2a 20 6f 6e 20 74 68 65 20 64 75 70 6c 69   ** on the dupli
b490: 63 61 74 65 20 63 72 65 61 74 65 64 20 62 79 20  cate created by 
b4a0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 2a  this function. *
b4b0: 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  /.  for(i=0; i<p
b4c0: 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nId; i++){.   
b4d0: 20 73 74 72 75 63 74 20 49 64 4c 69 73 74 5f 69   struct IdList_i
b4e0: 74 65 6d 20 2a 70 4e 65 77 49 74 65 6d 20 3d 20  tem *pNewItem = 
b4f0: 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b 0a 20 20 20  &pNew->a[i];.   
b500: 20 73 74 72 75 63 74 20 49 64 4c 69 73 74 5f 69   struct IdList_i
b510: 74 65 6d 20 2a 70 4f 6c 64 49 74 65 6d 20 3d 20  tem *pOldItem = 
b520: 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 70 4e  &p->a[i];.    pN
b530: 65 77 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20  ewItem->zName = 
b540: 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
b550: 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e  db, pOldItem->zN
b560: 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77 49 74  ame);.    pNewIt
b570: 65 6d 2d 3e 69 64 78 20 3d 20 70 4f 6c 64 49 74  em->idx = pOldIt
b580: 65 6d 2d 3e 69 64 78 3b 0a 20 20 7d 0a 20 20 72  em->idx;.  }.  r
b590: 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 53 65  eturn pNew;.}.Se
b5a0: 6c 65 63 74 20 2a 73 71 6c 69 74 65 33 53 65 6c  lect *sqlite3Sel
b5b0: 65 63 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a  ectDup(sqlite3 *
b5c0: 64 62 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69  db, Select *p, i
b5d0: 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 53 65 6c  nt flags){.  Sel
b5e0: 65 63 74 20 2a 70 4e 65 77 2c 20 2a 70 50 72 69  ect *pNew, *pPri
b5f0: 6f 72 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62  or;.  assert( db
b600: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d  !=0 );.  if( p==
b610: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
b620: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62  pNew = sqlite3Db
b630: 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20  MallocRawNN(db, 
b640: 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20  sizeof(*p) );.  
b650: 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65  if( pNew==0 ) re
b660: 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  turn 0;.  pNew->
b670: 70 45 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33  pEList = sqlite3
b680: 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20  ExprListDup(db, 
b690: 70 2d 3e 70 45 4c 69 73 74 2c 20 66 6c 61 67 73  p->pEList, flags
b6a0: 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 53 72 63 20  );.  pNew->pSrc 
b6b0: 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  = sqlite3SrcList
b6c0: 44 75 70 28 64 62 2c 20 70 2d 3e 70 53 72 63 2c  Dup(db, p->pSrc,
b6d0: 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d   flags);.  pNew-
b6e0: 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65  >pWhere = sqlite
b6f0: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e  3ExprDup(db, p->
b700: 70 57 68 65 72 65 2c 20 66 6c 61 67 73 29 3b 0a  pWhere, flags);.
b710: 20 20 70 4e 65 77 2d 3e 70 47 72 6f 75 70 42 79    pNew->pGroupBy
b720: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
b730: 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 47 72  stDup(db, p->pGr
b740: 6f 75 70 42 79 2c 20 66 6c 61 67 73 29 3b 0a 20  oupBy, flags);. 
b750: 20 70 4e 65 77 2d 3e 70 48 61 76 69 6e 67 20 3d   pNew->pHaving =
b760: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
b770: 64 62 2c 20 70 2d 3e 70 48 61 76 69 6e 67 2c 20  db, p->pHaving, 
b780: 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e  flags);.  pNew->
b790: 70 4f 72 64 65 72 42 79 20 3d 20 73 71 6c 69 74  pOrderBy = sqlit
b7a0: 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62  e3ExprListDup(db
b7b0: 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 66  , p->pOrderBy, f
b7c0: 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 6f  lags);.  pNew->o
b7d0: 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 70 4e 65  p = p->op;.  pNe
b7e0: 77 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69  w->pPrior = pPri
b7f0: 6f 72 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  or = sqlite3Sele
b800: 63 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 50 72  ctDup(db, p->pPr
b810: 69 6f 72 2c 20 66 6c 61 67 73 29 3b 0a 20 20 69  ior, flags);.  i
b820: 66 28 20 70 50 72 69 6f 72 20 29 20 70 50 72 69  f( pPrior ) pPri
b830: 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 70 4e 65 77  or->pNext = pNew
b840: 3b 0a 20 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20  ;.  pNew->pNext 
b850: 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69  = 0;.  pNew->pLi
b860: 6d 69 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  mit = sqlite3Exp
b870: 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 4c 69 6d  rDup(db, p->pLim
b880: 69 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e  it, flags);.  pN
b890: 65 77 2d 3e 70 4f 66 66 73 65 74 20 3d 20 73 71  ew->pOffset = sq
b8a0: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
b8b0: 20 70 2d 3e 70 4f 66 66 73 65 74 2c 20 66 6c 61   p->pOffset, fla
b8c0: 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 69 4c 69  gs);.  pNew->iLi
b8d0: 6d 69 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d  mit = 0;.  pNew-
b8e0: 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20  >iOffset = 0;.  
b8f0: 70 4e 65 77 2d 3e 73 65 6c 46 6c 61 67 73 20 3d  pNew->selFlags =
b900: 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 7e   p->selFlags & ~
b910: 53 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61 6c  SF_UsesEphemeral
b920: 3b 0a 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70  ;.  pNew->addrOp
b930: 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 2d 31 3b 0a  enEphm[0] = -1;.
b940: 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e    pNew->addrOpen
b950: 45 70 68 6d 5b 31 5d 20 3d 20 2d 31 3b 0a 20 20  Ephm[1] = -1;.  
b960: 70 4e 65 77 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  pNew->nSelectRow
b970: 20 3d 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77   = p->nSelectRow
b980: 3b 0a 20 20 70 4e 65 77 2d 3e 70 57 69 74 68 20  ;.  pNew->pWith 
b990: 3d 20 77 69 74 68 44 75 70 28 64 62 2c 20 70 2d  = withDup(db, p-
b9a0: 3e 70 57 69 74 68 29 3b 0a 20 20 73 71 6c 69 74  >pWith);.  sqlit
b9b0: 65 33 53 65 6c 65 63 74 53 65 74 4e 61 6d 65 28  e3SelectSetName(
b9c0: 70 4e 65 77 2c 20 70 2d 3e 7a 53 65 6c 4e 61 6d  pNew, p->zSelNam
b9d0: 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65  e);.  return pNe
b9e0: 77 3b 0a 7d 0a 23 65 6c 73 65 0a 53 65 6c 65 63  w;.}.#else.Selec
b9f0: 74 20 2a 73 71 6c 69 74 65 33 53 65 6c 65 63 74  t *sqlite3Select
ba00: 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  Dup(sqlite3 *db,
ba10: 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20   Select *p, int 
ba20: 66 6c 61 67 73 29 7b 0a 20 20 61 73 73 65 72 74  flags){.  assert
ba30: 28 20 70 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75  ( p==0 );.  retu
ba40: 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  rn 0;.}.#endif..
ba50: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77  ./*.** Add a new
ba60: 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20   element to the 
ba70: 65 6e 64 20 6f 66 20 61 6e 20 65 78 70 72 65 73  end of an expres
ba80: 73 69 6f 6e 20 6c 69 73 74 2e 20 20 49 66 20 70  sion list.  If p
ba90: 4c 69 73 74 20 69 73 0a 2a 2a 20 69 6e 69 74 69  List is.** initi
baa0: 61 6c 6c 79 20 4e 55 4c 4c 2c 20 74 68 65 6e 20  ally NULL, then 
bab0: 63 72 65 61 74 65 20 61 20 6e 65 77 20 65 78 70  create a new exp
bac0: 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a  ression list..**
bad0: 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79 20  .** If a memory 
bae0: 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72  allocation error
baf0: 20 6f 63 63 75 72 73 2c 20 74 68 65 20 65 6e 74   occurs, the ent
bb00: 69 72 65 20 6c 69 73 74 20 69 73 20 66 72 65 65  ire list is free
bb10: 64 20 61 6e 64 0a 2a 2a 20 4e 55 4c 4c 20 69 73  d and.** NULL is
bb20: 20 72 65 74 75 72 6e 65 64 2e 20 20 49 66 20 6e   returned.  If n
bb30: 6f 6e 2d 4e 55 4c 4c 20 69 73 20 72 65 74 75 72  on-NULL is retur
bb40: 6e 65 64 2c 20 74 68 65 6e 20 69 74 20 69 73 20  ned, then it is 
bb50: 67 75 61 72 61 6e 74 65 65 64 0a 2a 2a 20 74 68  guaranteed.** th
bb60: 61 74 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79  at the new entry
bb70: 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c   was successfull
bb80: 79 20 61 70 70 65 6e 64 65 64 2e 0a 2a 2f 0a 45  y appended..*/.E
bb90: 78 70 72 4c 69 73 74 20 2a 73 71 6c 69 74 65 33  xprList *sqlite3
bba0: 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 0a  ExprListAppend(.
bbb0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
bbc0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
bbd0: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
bbe0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
bbf0: 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73  t,        /* Lis
bc00: 74 20 74 6f 20 77 68 69 63 68 20 74 6f 20 61 70  t to which to ap
bc10: 70 65 6e 64 2e 20 4d 69 67 68 74 20 62 65 20 4e  pend. Might be N
bc20: 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ULL */.  Expr *p
bc30: 45 78 70 72 20 20 20 20 20 20 20 20 20 20 20 20  Expr            
bc40: 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 74   /* Expression t
bc50: 6f 20 62 65 20 61 70 70 65 6e 64 65 64 2e 20 4d  o be appended. M
bc60: 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a  ight be NULL */.
bc70: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
bc80: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
bc90: 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29   assert( db!=0 )
bca0: 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ;.  if( pList==0
bcb0: 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20   ){.    pList = 
bcc0: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
bcd0: 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28  awNN(db, sizeof(
bce0: 45 78 70 72 4c 69 73 74 29 20 29 3b 0a 20 20 20  ExprList) );.   
bcf0: 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b   if( pList==0 ){
bd00: 0a 20 20 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d  .      goto no_m
bd10: 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c  em;.    }.    pL
bd20: 69 73 74 2d 3e 6e 45 78 70 72 20 3d 20 30 3b 0a  ist->nExpr = 0;.
bd30: 20 20 20 20 70 4c 69 73 74 2d 3e 61 20 3d 20 73      pList->a = s
bd40: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
bd50: 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 70  wNN(db, sizeof(p
bd60: 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20  List->a[0]));.  
bd70: 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 61 3d 3d    if( pList->a==
bd80: 30 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b  0 ) goto no_mem;
bd90: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 4c  .  }else if( (pL
bda0: 69 73 74 2d 3e 6e 45 78 70 72 20 26 20 28 70 4c  ist->nExpr & (pL
bdb0: 69 73 74 2d 3e 6e 45 78 70 72 2d 31 29 29 3d 3d  ist->nExpr-1))==
bdc0: 30 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  0 ){.    struct 
bdd0: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61  ExprList_item *a
bde0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c  ;.    assert( pL
bdf0: 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a  ist->nExpr>0 );.
be00: 20 20 20 20 61 20 3d 20 73 71 6c 69 74 65 33 44      a = sqlite3D
be10: 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70 4c 69  bRealloc(db, pLi
be20: 73 74 2d 3e 61 2c 20 70 4c 69 73 74 2d 3e 6e 45  st->a, pList->nE
be30: 78 70 72 2a 32 2a 73 69 7a 65 6f 66 28 70 4c 69  xpr*2*sizeof(pLi
be40: 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 20 20  st->a[0]));.    
be50: 69 66 28 20 61 3d 3d 30 20 29 7b 0a 20 20 20 20  if( a==0 ){.    
be60: 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20    goto no_mem;. 
be70: 20 20 20 7d 0a 20 20 20 20 70 4c 69 73 74 2d 3e     }.    pList->
be80: 61 20 3d 20 61 3b 0a 20 20 7d 0a 20 20 61 73 73  a = a;.  }.  ass
be90: 65 72 74 28 20 70 4c 69 73 74 2d 3e 61 21 3d 30  ert( pList->a!=0
bea0: 20 29 3b 0a 20 20 69 66 28 20 31 20 29 7b 0a 20   );.  if( 1 ){. 
beb0: 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
bec0: 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d  st_item *pItem =
bed0: 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74   &pList->a[pList
bee0: 2d 3e 6e 45 78 70 72 2b 2b 5d 3b 0a 20 20 20 20  ->nExpr++];.    
bef0: 6d 65 6d 73 65 74 28 70 49 74 65 6d 2c 20 30 2c  memset(pItem, 0,
bf00: 20 73 69 7a 65 6f 66 28 2a 70 49 74 65 6d 29 29   sizeof(*pItem))
bf10: 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 70 45 78  ;.    pItem->pEx
bf20: 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 7d 0a  pr = pExpr;.  }.
bf30: 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a    return pList;.
bf40: 0a 6e 6f 5f 6d 65 6d 3a 20 20 20 20 20 0a 20 20  .no_mem:     .  
bf50: 2f 2a 20 41 76 6f 69 64 20 6c 65 61 6b 69 6e 67  /* Avoid leaking
bf60: 20 6d 65 6d 6f 72 79 20 69 66 20 6d 61 6c 6c 6f   memory if mallo
bf70: 63 20 68 61 73 20 66 61 69 6c 65 64 2e 20 2a 2f  c has failed. */
bf80: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  .  sqlite3ExprDe
bf90: 6c 65 74 65 28 64 62 2c 20 70 45 78 70 72 29 3b  lete(db, pExpr);
bfa0: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  .  sqlite3ExprLi
bfb0: 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69  stDelete(db, pLi
bfc0: 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b  st);.  return 0;
bfd0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
bfe0: 65 20 73 6f 72 74 20 6f 72 64 65 72 20 66 6f 72  e sort order for
bff0: 20 74 68 65 20 6c 61 73 74 20 65 6c 65 6d 65 6e   the last elemen
c000: 74 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 45  t on the given E
c010: 78 70 72 4c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64  xprList..*/.void
c020: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
c030: 53 65 74 53 6f 72 74 4f 72 64 65 72 28 45 78 70  SetSortOrder(Exp
c040: 72 4c 69 73 74 20 2a 70 2c 20 69 6e 74 20 69 53  rList *p, int iS
c050: 6f 72 74 4f 72 64 65 72 29 7b 0a 20 20 69 66 28  ortOrder){.  if(
c060: 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   p==0 ) return;.
c070: 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45    assert( SQLITE
c080: 5f 53 4f 5f 55 4e 44 45 46 49 4e 45 44 3c 30 20  _SO_UNDEFINED<0 
c090: 26 26 20 53 51 4c 49 54 45 5f 53 4f 5f 41 53 43  && SQLITE_SO_ASC
c0a0: 3e 3d 30 20 26 26 20 53 51 4c 49 54 45 5f 53 4f  >=0 && SQLITE_SO
c0b0: 5f 44 45 53 43 3e 30 20 29 3b 0a 20 20 61 73 73  _DESC>0 );.  ass
c0c0: 65 72 74 28 20 70 2d 3e 6e 45 78 70 72 3e 30 20  ert( p->nExpr>0 
c0d0: 29 3b 0a 20 20 69 66 28 20 69 53 6f 72 74 4f 72  );.  if( iSortOr
c0e0: 64 65 72 3c 30 20 29 7b 0a 20 20 20 20 61 73 73  der<0 ){.    ass
c0f0: 65 72 74 28 20 70 2d 3e 61 5b 70 2d 3e 6e 45 78  ert( p->a[p->nEx
c100: 70 72 2d 31 5d 2e 73 6f 72 74 4f 72 64 65 72 3d  pr-1].sortOrder=
c110: 3d 53 51 4c 49 54 45 5f 53 4f 5f 41 53 43 20 29  =SQLITE_SO_ASC )
c120: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
c130: 7d 0a 20 20 70 2d 3e 61 5b 70 2d 3e 6e 45 78 70  }.  p->a[p->nExp
c140: 72 2d 31 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3d  r-1].sortOrder =
c150: 20 28 75 38 29 69 53 6f 72 74 4f 72 64 65 72 3b   (u8)iSortOrder;
c160: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
c170: 65 20 45 78 70 72 4c 69 73 74 2e 61 5b 5d 2e 7a  e ExprList.a[].z
c180: 4e 61 6d 65 20 65 6c 65 6d 65 6e 74 20 6f 66 20  Name element of 
c190: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  the most recentl
c1a0: 79 20 61 64 64 65 64 20 69 74 65 6d 0a 2a 2a 20  y added item.** 
c1b0: 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  on the expressio
c1c0: 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c  n list..**.** pL
c1d0: 69 73 74 20 6d 69 67 68 74 20 62 65 20 4e 55 4c  ist might be NUL
c1e0: 4c 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 6e 20 4f  L following an O
c1f0: 4f 4d 20 65 72 72 6f 72 2e 20 20 42 75 74 20 70  OM error.  But p
c200: 4e 61 6d 65 20 73 68 6f 75 6c 64 20 6e 65 76 65  Name should neve
c210: 72 20 62 65 0a 2a 2a 20 4e 55 4c 4c 2e 20 20 49  r be.** NULL.  I
c220: 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  f a memory alloc
c230: 61 74 69 6f 6e 20 66 61 69 6c 73 2c 20 74 68 65  ation fails, the
c240: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
c250: 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 0a 2a  locFailed flag.*
c260: 2a 20 69 73 20 73 65 74 2e 0a 2a 2f 0a 76 6f 69  * is set..*/.voi
c270: 64 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  d sqlite3ExprLis
c280: 74 53 65 74 4e 61 6d 65 28 0a 20 20 50 61 72 73  tSetName(.  Pars
c290: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
c2a0: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
c2b0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
c2c0: 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20  List *pList,    
c2d0: 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 77      /* List to w
c2e0: 68 69 63 68 20 74 6f 20 61 64 64 20 74 68 65 20  hich to add the 
c2f0: 73 70 61 6e 2e 20 2a 2f 0a 20 20 54 6f 6b 65 6e  span. */.  Token
c300: 20 2a 70 4e 61 6d 65 2c 20 20 20 20 20 20 20 20   *pName,        
c310: 20 20 20 2f 2a 20 4e 61 6d 65 20 74 6f 20 62 65     /* Name to be
c320: 20 61 64 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20   added */.  int 
c330: 64 65 71 75 6f 74 65 20 20 20 20 20 20 20 20 20  dequote         
c340: 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 63      /* True to c
c350: 61 75 73 65 20 74 68 65 20 6e 61 6d 65 20 74 6f  ause the name to
c360: 20 62 65 20 64 65 71 75 6f 74 65 64 20 2a 2f 0a   be dequoted */.
c370: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69  ){.  assert( pLi
c380: 73 74 21 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d  st!=0 || pParse-
c390: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
c3a0: 64 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 4c  d!=0 );.  if( pL
c3b0: 69 73 74 20 29 7b 0a 20 20 20 20 73 74 72 75 63  ist ){.    struc
c3c0: 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
c3d0: 2a 70 49 74 65 6d 3b 0a 20 20 20 20 61 73 73 65  *pItem;.    asse
c3e0: 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  rt( pList->nExpr
c3f0: 3e 30 20 29 3b 0a 20 20 20 20 70 49 74 65 6d 20  >0 );.    pItem 
c400: 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73  = &pList->a[pLis
c410: 74 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20 20 20  t->nExpr-1];.   
c420: 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e   assert( pItem->
c430: 7a 4e 61 6d 65 3d 3d 30 20 29 3b 0a 20 20 20 20  zName==0 );.    
c440: 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73  pItem->zName = s
c450: 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70 28  qlite3DbStrNDup(
c460: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4e 61 6d  pParse->db, pNam
c470: 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b  e->z, pName->n);
c480: 0a 20 20 20 20 69 66 28 20 64 65 71 75 6f 74 65  .    if( dequote
c490: 20 29 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74   ) sqlite3Dequot
c4a0: 65 28 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b  e(pItem->zName);
c4b0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  .  }.}../*.** Se
c4c0: 74 20 74 68 65 20 45 78 70 72 4c 69 73 74 2e 61  t the ExprList.a
c4d0: 5b 5d 2e 7a 53 70 61 6e 20 65 6c 65 6d 65 6e 74  [].zSpan element
c4e0: 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63   of the most rec
c4f0: 65 6e 74 6c 79 20 61 64 64 65 64 20 69 74 65 6d  ently added item
c500: 0a 2a 2a 20 6f 6e 20 74 68 65 20 65 78 70 72 65  .** on the expre
c510: 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a  ssion list..**.*
c520: 2a 20 70 4c 69 73 74 20 6d 69 67 68 74 20 62 65  * pList might be
c530: 20 4e 55 4c 4c 20 66 6f 6c 6c 6f 77 69 6e 67 20   NULL following 
c540: 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e 20 20 42  an OOM error.  B
c550: 75 74 20 70 53 70 61 6e 20 73 68 6f 75 6c 64 20  ut pSpan should 
c560: 6e 65 76 65 72 20 62 65 0a 2a 2a 20 4e 55 4c 4c  never be.** NULL
c570: 2e 20 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61  .  If a memory a
c580: 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c  llocation fails,
c590: 20 74 68 65 20 70 50 61 72 73 65 2d 3e 64 62 2d   the pParse->db-
c5a0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c  >mallocFailed fl
c5b0: 61 67 0a 2a 2a 20 69 73 20 73 65 74 2e 0a 2a 2f  ag.** is set..*/
c5c0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
c5d0: 72 4c 69 73 74 53 65 74 53 70 61 6e 28 0a 20 20  rListSetSpan(.  
c5e0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
c5f0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
c600: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
c610: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c  ExprList *pList,
c620: 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20          /* List 
c630: 74 6f 20 77 68 69 63 68 20 74 6f 20 61 64 64 20  to which to add 
c640: 74 68 65 20 73 70 61 6e 2e 20 2a 2f 0a 20 20 45  the span. */.  E
c650: 78 70 72 53 70 61 6e 20 2a 70 53 70 61 6e 20 20  xprSpan *pSpan  
c660: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 70         /* The sp
c670: 61 6e 20 74 6f 20 62 65 20 61 64 64 65 64 20 2a  an to be added *
c680: 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
c690: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
c6a0: 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74  .  assert( pList
c6b0: 21 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  !=0 || db->mallo
c6c0: 63 46 61 69 6c 65 64 21 3d 30 20 29 3b 0a 20 20  cFailed!=0 );.  
c6d0: 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20  if( pList ){.   
c6e0: 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
c6f0: 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26  _item *pItem = &
c700: 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e  pList->a[pList->
c710: 6e 45 78 70 72 2d 31 5d 3b 0a 20 20 20 20 61 73  nExpr-1];.    as
c720: 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78  sert( pList->nEx
c730: 70 72 3e 30 20 29 3b 0a 20 20 20 20 61 73 73 65  pr>0 );.    asse
c740: 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  rt( db->mallocFa
c750: 69 6c 65 64 20 7c 7c 20 70 49 74 65 6d 2d 3e 70  iled || pItem->p
c760: 45 78 70 72 3d 3d 70 53 70 61 6e 2d 3e 70 45 78  Expr==pSpan->pEx
c770: 70 72 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  pr );.    sqlite
c780: 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 74 65  3DbFree(db, pIte
c790: 6d 2d 3e 7a 53 70 61 6e 29 3b 0a 20 20 20 20 70  m->zSpan);.    p
c7a0: 49 74 65 6d 2d 3e 7a 53 70 61 6e 20 3d 20 73 71  Item->zSpan = sq
c7b0: 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70 28 64  lite3DbStrNDup(d
c7c0: 62 2c 20 28 63 68 61 72 2a 29 70 53 70 61 6e 2d  b, (char*)pSpan-
c7d0: 3e 7a 53 74 61 72 74 2c 0a 20 20 20 20 20 20 20  >zStart,.       
c7e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c7f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 69 6e               (in
c800: 74 29 28 70 53 70 61 6e 2d 3e 7a 45 6e 64 20 2d  t)(pSpan->zEnd -
c810: 20 70 53 70 61 6e 2d 3e 7a 53 74 61 72 74 29 29   pSpan->zStart))
c820: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  ;.  }.}../*.** I
c830: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
c840: 20 6c 69 73 74 20 70 45 4c 69 73 74 20 63 6f 6e   list pEList con
c850: 74 61 69 6e 73 20 6d 6f 72 65 20 74 68 61 6e 20  tains more than 
c860: 69 4c 69 6d 69 74 20 65 6c 65 6d 65 6e 74 73 2c  iLimit elements,
c870: 0a 2a 2a 20 6c 65 61 76 65 20 61 6e 20 65 72 72  .** leave an err
c880: 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50  or message in pP
c890: 61 72 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  arse..*/.void sq
c8a0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43 68 65  lite3ExprListChe
c8b0: 63 6b 4c 65 6e 67 74 68 28 0a 20 20 50 61 72 73  ckLength(.  Pars
c8c0: 65 20 2a 70 50 61 72 73 65 2c 0a 20 20 45 78 70  e *pParse,.  Exp
c8d0: 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 0a 20  rList *pEList,. 
c8e0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 62   const char *zOb
c8f0: 6a 65 63 74 0a 29 7b 0a 20 20 69 6e 74 20 6d 78  ject.){.  int mx
c900: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61   = pParse->db->a
c910: 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
c920: 49 54 5f 43 4f 4c 55 4d 4e 5d 3b 0a 20 20 74 65  IT_COLUMN];.  te
c930: 73 74 63 61 73 65 28 20 70 45 4c 69 73 74 20 26  stcase( pEList &
c940: 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d  & pEList->nExpr=
c950: 3d 6d 78 20 29 3b 0a 20 20 74 65 73 74 63 61 73  =mx );.  testcas
c960: 65 28 20 70 45 4c 69 73 74 20 26 26 20 70 45 4c  e( pEList && pEL
c970: 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 6d 78 2b 31  ist->nExpr==mx+1
c980: 20 29 3b 0a 20 20 69 66 28 20 70 45 4c 69 73 74   );.  if( pEList
c990: 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70   && pEList->nExp
c9a0: 72 3e 6d 78 20 29 7b 0a 20 20 20 20 73 71 6c 69  r>mx ){.    sqli
c9b0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
c9c0: 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 63 6f  se, "too many co
c9d0: 6c 75 6d 6e 73 20 69 6e 20 25 73 22 2c 20 7a 4f  lumns in %s", zO
c9e0: 62 6a 65 63 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  bject);.  }.}../
c9f0: 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 65  *.** Delete an e
ca00: 6e 74 69 72 65 20 65 78 70 72 65 73 73 69 6f 6e  ntire expression
ca10: 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63   list..*/.static
ca20: 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45   SQLITE_NOINLINE
ca30: 20 76 6f 69 64 20 65 78 70 72 4c 69 73 74 44 65   void exprListDe
ca40: 6c 65 74 65 4e 4e 28 73 71 6c 69 74 65 33 20 2a  leteNN(sqlite3 *
ca50: 64 62 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  db, ExprList *pL
ca60: 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ist){.  int i;. 
ca70: 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
ca80: 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
ca90: 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 61  assert( pList->a
caa0: 21 3d 30 20 7c 7c 20 70 4c 69 73 74 2d 3e 6e 45  !=0 || pList->nE
cab0: 78 70 72 3d 3d 30 20 29 3b 0a 20 20 66 6f 72 28  xpr==0 );.  for(
cac0: 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20  pItem=pList->a, 
cad0: 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45  i=0; i<pList->nE
cae0: 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b  xpr; i++, pItem+
caf0: 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  +){.    sqlite3E
cb00: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 49  xprDelete(db, pI
cb10: 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20  tem->pExpr);.   
cb20: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
cb30: 62 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29  b, pItem->zName)
cb40: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
cb50: 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a  ree(db, pItem->z
cb60: 53 70 61 6e 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  Span);.  }.  sql
cb70: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
cb80: 4c 69 73 74 2d 3e 61 29 3b 0a 20 20 73 71 6c 69  List->a);.  sqli
cb90: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4c  te3DbFree(db, pL
cba0: 69 73 74 29 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c  ist);.}.void sql
cbb0: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
cbc0: 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  te(sqlite3 *db, 
cbd0: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29  ExprList *pList)
cbe0: 7b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29 20  {.  if( pList ) 
cbf0: 65 78 70 72 4c 69 73 74 44 65 6c 65 74 65 4e 4e  exprListDeleteNN
cc00: 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a 0a  (db, pList);.}..
cc10: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
cc20: 20 62 69 74 77 69 73 65 2d 4f 52 20 6f 66 20 61   bitwise-OR of a
cc30: 6c 6c 20 45 78 70 72 2e 66 6c 61 67 73 20 66 69  ll Expr.flags fi
cc40: 65 6c 64 73 20 69 6e 20 74 68 65 20 67 69 76 65  elds in the give
cc50: 6e 0a 2a 2a 20 45 78 70 72 4c 69 73 74 2e 0a 2a  n.** ExprList..*
cc60: 2f 0a 75 33 32 20 73 71 6c 69 74 65 33 45 78 70  /.u32 sqlite3Exp
cc70: 72 4c 69 73 74 46 6c 61 67 73 28 63 6f 6e 73 74  rListFlags(const
cc80: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
cc90: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75 33  ){.  int i;.  u3
cca0: 32 20 6d 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  2 m = 0;.  if( p
ccb0: 4c 69 73 74 20 29 7b 0a 20 20 20 20 66 6f 72 28  List ){.    for(
ccc0: 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45  i=0; i<pList->nE
ccd0: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
cce0: 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20    Expr *pExpr = 
ccf0: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
cd00: 72 3b 0a 20 20 20 20 20 20 20 61 73 73 65 72 74  r;.       assert
cd10: 28 20 70 45 78 70 72 21 3d 30 20 29 3b 0a 20 20  ( pExpr!=0 );.  
cd20: 20 20 20 20 20 6d 20 7c 3d 20 70 45 78 70 72 2d       m |= pExpr-
cd30: 3e 66 6c 61 67 73 3b 0a 20 20 20 20 7d 0a 20 20  >flags;.    }.  
cd40: 7d 0a 20 20 72 65 74 75 72 6e 20 6d 3b 0a 7d 0a  }.  return m;.}.
cd50: 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75  ./*.** These rou
cd60: 74 69 6e 65 73 20 61 72 65 20 57 61 6c 6b 65 72  tines are Walker
cd70: 20 63 61 6c 6c 62 61 63 6b 73 20 75 73 65 64 20   callbacks used 
cd80: 74 6f 20 63 68 65 63 6b 20 65 78 70 72 65 73 73  to check express
cd90: 69 6f 6e 73 20 74 6f 0a 2a 2a 20 73 65 65 20 69  ions to.** see i
cda0: 66 20 74 68 65 79 20 61 72 65 20 22 63 6f 6e 73  f they are "cons
cdb0: 74 61 6e 74 22 20 66 6f 72 20 73 6f 6d 65 20 64  tant" for some d
cdc0: 65 66 69 6e 69 74 69 6f 6e 20 6f 66 20 63 6f 6e  efinition of con
cdd0: 73 74 61 6e 74 2e 20 20 54 68 65 0a 2a 2a 20 57  stant.  The.** W
cde0: 61 6c 6b 65 72 2e 65 43 6f 64 65 20 76 61 6c 75  alker.eCode valu
cdf0: 65 20 64 65 74 65 72 6d 69 6e 65 73 20 74 68 65  e determines the
ce00: 20 74 79 70 65 20 6f 66 20 22 63 6f 6e 73 74 61   type of "consta
ce10: 6e 74 22 20 77 65 20 61 72 65 20 6c 6f 6f 6b 69  nt" we are looki
ce20: 6e 67 0a 2a 2a 20 66 6f 72 2e 0a 2a 2a 0a 2a 2a  ng.** for..**.**
ce30: 20 54 68 65 73 65 20 63 61 6c 6c 62 61 63 6b 20   These callback 
ce40: 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73 65  routines are use
ce50: 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74  d to implement t
ce60: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a  he following:.**
ce70: 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33 45  .**     sqlite3E
ce80: 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 29 20  xprIsConstant() 
ce90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cea0: 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d   pWalker->eCode=
ceb0: 3d 31 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65  =1.**     sqlite
cec0: 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e  3ExprIsConstantN
ced0: 6f 74 4a 6f 69 6e 28 29 20 20 20 20 20 20 20 20  otJoin()        
cee0: 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64     pWalker->eCod
cef0: 65 3d 3d 32 0a 2a 2a 20 20 20 20 20 73 71 6c 69  e==2.**     sqli
cf00: 74 65 33 45 78 70 72 49 73 54 61 62 6c 65 43 6f  te3ExprIsTableCo
cf10: 6e 73 74 61 6e 74 28 29 20 20 20 20 20 20 20 20  nstant()        
cf20: 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43       pWalker->eC
cf30: 6f 64 65 3d 3d 33 0a 2a 2a 20 20 20 20 20 73 71  ode==3.**     sq
cf40: 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
cf50: 61 6e 74 4f 72 46 75 6e 63 74 69 6f 6e 28 29 20  antOrFunction() 
cf60: 20 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e         pWalker->
cf70: 65 43 6f 64 65 3d 3d 34 20 6f 72 20 35 0a 2a 2a  eCode==4 or 5.**
cf80: 0a 2a 2a 20 49 6e 20 61 6c 6c 20 63 61 73 65 73  .** In all cases
cf90: 2c 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 73 20  , the callbacks 
cfa0: 73 65 74 20 57 61 6c 6b 65 72 2e 65 43 6f 64 65  set Walker.eCode
cfb0: 3d 30 20 61 6e 64 20 61 62 6f 72 74 20 69 66 20  =0 and abort if 
cfc0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a  the expression.*
cfd0: 2a 20 69 73 20 66 6f 75 6e 64 20 74 6f 20 6e 6f  * is found to no
cfe0: 74 20 62 65 20 61 20 63 6f 6e 73 74 61 6e 74 2e  t be a constant.
cff0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74  .**.** The sqlit
d000: 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
d010: 4f 72 46 75 6e 63 74 69 6f 6e 28 29 20 69 73 20  OrFunction() is 
d020: 75 73 65 64 20 66 6f 72 20 65 76 61 6c 75 61 74  used for evaluat
d030: 69 6e 67 20 65 78 70 72 65 73 73 69 6f 6e 73 0a  ing expressions.
d040: 2a 2a 20 69 6e 20 61 20 43 52 45 41 54 45 20 54  ** in a CREATE T
d050: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20  ABLE statement. 
d060: 20 54 68 65 20 57 61 6c 6b 65 72 2e 65 43 6f 64   The Walker.eCod
d070: 65 20 76 61 6c 75 65 20 69 73 20 35 20 77 68 65  e value is 5 whe
d080: 6e 20 70 61 72 73 69 6e 67 0a 2a 2a 20 61 6e 20  n parsing.** an 
d090: 65 78 69 73 74 69 6e 67 20 73 63 68 65 6d 61 20  existing schema 
d0a0: 61 6e 64 20 34 20 77 68 65 6e 20 70 72 6f 63 65  and 4 when proce
d0b0: 73 73 69 6e 67 20 61 20 6e 65 77 20 73 74 61 74  ssing a new stat
d0c0: 65 6d 65 6e 74 2e 20 20 41 20 62 6f 75 6e 64 0a  ement.  A bound.
d0d0: 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 72 61 69  ** parameter rai
d0e0: 73 65 73 20 61 6e 20 65 72 72 6f 72 20 66 6f 72  ses an error for
d0f0: 20 6e 65 77 20 73 74 61 74 65 6d 65 6e 74 73 2c   new statements,
d100: 20 62 75 74 20 69 73 20 73 69 6c 65 6e 74 6c 79   but is silently
d110: 20 63 6f 6e 76 65 72 74 65 64 0a 2a 2a 20 74 6f   converted.** to
d120: 20 4e 55 4c 4c 20 66 6f 72 20 65 78 69 73 74 69   NULL for existi
d130: 6e 67 20 73 63 68 65 6d 61 73 2e 20 20 54 68 69  ng schemas.  Thi
d140: 73 20 61 6c 6c 6f 77 73 20 73 71 6c 69 74 65 5f  s allows sqlite_
d150: 6d 61 73 74 65 72 20 74 61 62 6c 65 73 20 74 68  master tables th
d160: 61 74 20 0a 2a 2a 20 63 6f 6e 74 61 69 6e 20 61  at .** contain a
d170: 20 62 6f 75 6e 64 20 70 61 72 61 6d 65 74 65 72   bound parameter
d180: 20 62 65 63 61 75 73 65 20 74 68 65 79 20 77 65   because they we
d190: 72 65 20 67 65 6e 65 72 61 74 65 64 20 62 79 20  re generated by 
d1a0: 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e 73 0a 2a  older versions.*
d1b0: 2a 20 6f 66 20 53 51 4c 69 74 65 20 74 6f 20 62  * of SQLite to b
d1c0: 65 20 70 61 72 73 65 64 20 62 79 20 6e 65 77 65  e parsed by newe
d1d0: 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51  r versions of SQ
d1e0: 4c 69 74 65 20 77 69 74 68 6f 75 74 20 72 61 69  Lite without rai
d1f0: 73 69 6e 67 20 61 0a 2a 2a 20 6d 61 6c 66 6f 72  sing a.** malfor
d200: 6d 65 64 20 73 63 68 65 6d 61 20 65 72 72 6f 72  med schema error
d210: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
d220: 65 78 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74 61  exprNodeIsConsta
d230: 6e 74 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b  nt(Walker *pWalk
d240: 65 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  er, Expr *pExpr)
d250: 7b 0a 0a 20 20 2f 2a 20 49 66 20 70 57 61 6c 6b  {..  /* If pWalk
d260: 65 72 2d 3e 65 43 6f 64 65 20 69 73 20 32 20 74  er->eCode is 2 t
d270: 68 65 6e 20 61 6e 79 20 74 65 72 6d 20 6f 66 20  hen any term of 
d280: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74  the expression t
d290: 68 61 74 20 63 6f 6d 65 73 20 66 72 6f 6d 0a 20  hat comes from. 
d2a0: 20 2a 2a 20 74 68 65 20 4f 4e 20 6f 72 20 55 53   ** the ON or US
d2b0: 49 4e 47 20 63 6c 61 75 73 65 73 20 6f 66 20 61  ING clauses of a
d2c0: 20 6c 65 66 74 20 6a 6f 69 6e 20 64 69 73 71 75   left join disqu
d2d0: 61 6c 69 66 69 65 73 20 74 68 65 20 65 78 70 72  alifies the expr
d2e0: 65 73 73 69 6f 6e 0a 20 20 2a 2a 20 66 72 6f 6d  ession.  ** from
d2f0: 20 62 65 69 6e 67 20 63 6f 6e 73 69 64 65 72 65   being considere
d300: 64 20 63 6f 6e 73 74 61 6e 74 2e 20 2a 2f 0a 20  d constant. */. 
d310: 20 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e 65 43   if( pWalker->eC
d320: 6f 64 65 3d 3d 32 20 26 26 20 45 78 70 72 48 61  ode==2 && ExprHa
d330: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
d340: 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b   EP_FromJoin) ){
d350: 0a 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43  .    pWalker->eC
d360: 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 72 65 74  ode = 0;.    ret
d370: 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
d380: 20 7d 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45   }..  switch( pE
d390: 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 2f  xpr->op ){.    /
d3a0: 2a 20 43 6f 6e 73 69 64 65 72 20 66 75 6e 63 74  * Consider funct
d3b0: 69 6f 6e 73 20 74 6f 20 62 65 20 63 6f 6e 73 74  ions to be const
d3c0: 61 6e 74 20 69 66 20 61 6c 6c 20 74 68 65 69 72  ant if all their
d3d0: 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65 20 63   arguments are c
d3e0: 6f 6e 73 74 61 6e 74 0a 20 20 20 20 2a 2a 20 61  onstant.    ** a
d3f0: 6e 64 20 65 69 74 68 65 72 20 70 57 61 6c 6b 65  nd either pWalke
d400: 72 2d 3e 65 43 6f 64 65 3d 3d 34 20 6f 72 20 35  r->eCode==4 or 5
d410: 20 6f 72 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   or the function
d420: 20 68 61 73 20 74 68 65 0a 20 20 20 20 2a 2a 20   has the.    ** 
d430: 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43 4f 4e 53  SQLITE_FUNC_CONS
d440: 54 20 66 6c 61 67 2e 20 2a 2f 0a 20 20 20 20 63  T flag. */.    c
d450: 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a  ase TK_FUNCTION:
d460: 0a 20 20 20 20 20 20 69 66 28 20 70 57 61 6c 6b  .      if( pWalk
d470: 65 72 2d 3e 65 43 6f 64 65 3e 3d 34 20 7c 7c 20  er->eCode>=4 || 
d480: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
d490: 70 45 78 70 72 2c 45 50 5f 43 6f 6e 73 74 46 75  pExpr,EP_ConstFu
d4a0: 6e 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  nc) ){.        r
d4b0: 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e  eturn WRC_Contin
d4c0: 75 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ue;.      }else{
d4d0: 0a 20 20 20 20 20 20 20 20 70 57 61 6c 6b 65 72  .        pWalker
d4e0: 2d 3e 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20  ->eCode = 0;.   
d4f0: 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f       return WRC_
d500: 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 7d 0a 20  Abort;.      }. 
d510: 20 20 20 63 61 73 65 20 54 4b 5f 49 44 3a 0a 20     case TK_ID:. 
d520: 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d     case TK_COLUM
d530: 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41  N:.    case TK_A
d540: 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20  GG_FUNCTION:.   
d550: 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c   case TK_AGG_COL
d560: 55 4d 4e 3a 0a 20 20 20 20 20 20 74 65 73 74 63  UMN:.      testc
d570: 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
d580: 54 4b 5f 49 44 20 29 3b 0a 20 20 20 20 20 20 74  TK_ID );.      t
d590: 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
d5a0: 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b  op==TK_COLUMN );
d5b0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
d5c0: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41   pExpr->op==TK_A
d5d0: 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20  GG_FUNCTION );. 
d5e0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
d5f0: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47  Expr->op==TK_AGG
d600: 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20  _COLUMN );.     
d610: 20 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e 65 43   if( pWalker->eC
d620: 6f 64 65 3d 3d 33 20 26 26 20 70 45 78 70 72 2d  ode==3 && pExpr-
d630: 3e 69 54 61 62 6c 65 3d 3d 70 57 61 6c 6b 65 72  >iTable==pWalker
d640: 2d 3e 75 2e 69 43 75 72 20 29 7b 0a 20 20 20 20  ->u.iCur ){.    
d650: 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43      return WRC_C
d660: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d  ontinue;.      }
d670: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 57  else{.        pW
d680: 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20 30  alker->eCode = 0
d690: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
d6a0: 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20   WRC_Abort;.    
d6b0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
d6c0: 56 41 52 49 41 42 4c 45 3a 0a 20 20 20 20 20 20  VARIABLE:.      
d6d0: 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f  if( pWalker->eCo
d6e0: 64 65 3d 3d 35 20 29 7b 0a 20 20 20 20 20 20 20  de==5 ){.       
d6f0: 20 2f 2a 20 53 69 6c 65 6e 74 6c 79 20 63 6f 6e   /* Silently con
d700: 76 65 72 74 20 62 6f 75 6e 64 20 70 61 72 61 6d  vert bound param
d710: 65 74 65 72 73 20 74 68 61 74 20 61 70 70 65 61  eters that appea
d720: 72 20 69 6e 73 69 64 65 20 6f 66 20 43 52 45 41  r inside of CREA
d730: 54 45 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 74  TE.        ** st
d740: 61 74 65 6d 65 6e 74 73 20 69 6e 74 6f 20 61 20  atements into a 
d750: 4e 55 4c 4c 20 77 68 65 6e 20 70 61 72 73 69 6e  NULL when parsin
d760: 67 20 74 68 65 20 43 52 45 41 54 45 20 73 74 61  g the CREATE sta
d770: 74 65 6d 65 6e 74 20 74 65 78 74 20 6f 75 74 0a  tement text out.
d780: 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68          ** of th
d790: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
d7a0: 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20  table */.       
d7b0: 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f   pExpr->op = TK_
d7c0: 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 7d 65 6c 73  NULL;.      }els
d7d0: 65 20 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e 65  e if( pWalker->e
d7e0: 43 6f 64 65 3d 3d 34 20 29 7b 0a 20 20 20 20 20  Code==4 ){.     
d7f0: 20 20 20 2f 2a 20 41 20 62 6f 75 6e 64 20 70 61     /* A bound pa
d800: 72 61 6d 65 74 65 72 20 69 6e 20 61 20 43 52 45  rameter in a CRE
d810: 41 54 45 20 73 74 61 74 65 6d 65 6e 74 20 74 68  ATE statement th
d820: 61 74 20 6f 72 69 67 69 6e 61 74 65 73 20 66 72  at originates fr
d830: 6f 6d 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 71  om.        ** sq
d840: 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28 29 20  lite3_prepare() 
d850: 63 61 75 73 65 73 20 61 6e 20 65 72 72 6f 72 20  causes an error 
d860: 2a 2f 0a 20 20 20 20 20 20 20 20 70 57 61 6c 6b  */.        pWalk
d870: 65 72 2d 3e 65 43 6f 64 65 20 3d 20 30 3b 0a 20  er->eCode = 0;. 
d880: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52         return WR
d890: 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 7d  C_Abort;.      }
d8a0: 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74  .      /* Fall t
d8b0: 68 72 6f 75 67 68 20 2a 2f 0a 20 20 20 20 64 65  hrough */.    de
d8c0: 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 74 65 73  fault:.      tes
d8d0: 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
d8e0: 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b 20 2f  ==TK_SELECT ); /
d8f0: 2a 20 73 65 6c 65 63 74 4e 6f 64 65 49 73 43 6f  * selectNodeIsCo
d900: 6e 73 74 61 6e 74 20 77 69 6c 6c 20 64 69 73 61  nstant will disa
d910: 6c 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20 74 65  llow */.      te
d920: 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
d930: 70 3d 3d 54 4b 5f 45 58 49 53 54 53 20 29 3b 20  p==TK_EXISTS ); 
d940: 2f 2a 20 73 65 6c 65 63 74 4e 6f 64 65 49 73 43  /* selectNodeIsC
d950: 6f 6e 73 74 61 6e 74 20 77 69 6c 6c 20 64 69 73  onstant will dis
d960: 61 6c 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20 72  allow */.      r
d970: 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e  eturn WRC_Contin
d980: 75 65 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63  ue;.  }.}.static
d990: 20 69 6e 74 20 73 65 6c 65 63 74 4e 6f 64 65 49   int selectNodeI
d9a0: 73 43 6f 6e 73 74 61 6e 74 28 57 61 6c 6b 65 72  sConstant(Walker
d9b0: 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63   *pWalker, Selec
d9c0: 74 20 2a 4e 6f 74 55 73 65 64 29 7b 0a 20 20 55  t *NotUsed){.  U
d9d0: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
d9e0: 4e 6f 74 55 73 65 64 29 3b 0a 20 20 70 57 61 6c  NotUsed);.  pWal
d9f0: 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20 30 3b 0a  ker->eCode = 0;.
da00: 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f    return WRC_Abo
da10: 72 74 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74  rt;.}.static int
da20: 20 65 78 70 72 49 73 43 6f 6e 73 74 28 45 78 70   exprIsConst(Exp
da30: 72 20 2a 70 2c 20 69 6e 74 20 69 6e 69 74 46 6c  r *p, int initFl
da40: 61 67 2c 20 69 6e 74 20 69 43 75 72 29 7b 0a 20  ag, int iCur){. 
da50: 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 6d 65 6d   Walker w;.  mem
da60: 73 65 74 28 26 77 2c 20 30 2c 20 73 69 7a 65 6f  set(&w, 0, sizeo
da70: 66 28 77 29 29 3b 0a 20 20 77 2e 65 43 6f 64 65  f(w));.  w.eCode
da80: 20 3d 20 69 6e 69 74 46 6c 61 67 3b 0a 20 20 77   = initFlag;.  w
da90: 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d  .xExprCallback =
daa0: 20 65 78 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74   exprNodeIsConst
dab0: 61 6e 74 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74  ant;.  w.xSelect
dac0: 43 61 6c 6c 62 61 63 6b 20 3d 20 73 65 6c 65 63  Callback = selec
dad0: 74 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 3b  tNodeIsConstant;
dae0: 0a 20 20 77 2e 75 2e 69 43 75 72 20 3d 20 69 43  .  w.u.iCur = iC
daf0: 75 72 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c  ur;.  sqlite3Wal
db00: 6b 45 78 70 72 28 26 77 2c 20 70 29 3b 0a 20 20  kExpr(&w, p);.  
db10: 72 65 74 75 72 6e 20 77 2e 65 43 6f 64 65 3b 0a  return w.eCode;.
db20: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e  }../*.** Walk an
db30: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
db40: 2e 20 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65  .  Return non-ze
db50: 72 6f 20 69 66 20 74 68 65 20 65 78 70 72 65 73  ro if the expres
db60: 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74  sion is constant
db70: 0a 2a 2a 20 61 6e 64 20 30 20 69 66 20 69 74 20  .** and 0 if it 
db80: 69 6e 76 6f 6c 76 65 73 20 76 61 72 69 61 62 6c  involves variabl
db90: 65 73 20 6f 72 20 66 75 6e 63 74 69 6f 6e 20 63  es or function c
dba0: 61 6c 6c 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  alls..**.** For 
dbb0: 74 68 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20  the purposes of 
dbc0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61  this function, a
dbd0: 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65 64 20 73   double-quoted s
dbe0: 74 72 69 6e 67 20 28 65 78 3a 20 22 61 62 63 22  tring (ex: "abc"
dbf0: 29 0a 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65 72  ).** is consider
dc00: 65 64 20 61 20 76 61 72 69 61 62 6c 65 20 62 75  ed a variable bu
dc10: 74 20 61 20 73 69 6e 67 6c 65 2d 71 75 6f 74 65  t a single-quote
dc20: 64 20 73 74 72 69 6e 67 20 28 65 78 3a 20 27 61  d string (ex: 'a
dc30: 62 63 27 29 20 69 73 0a 2a 2a 20 61 20 63 6f 6e  bc') is.** a con
dc40: 73 74 61 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  stant..*/.int sq
dc50: 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
dc60: 61 6e 74 28 45 78 70 72 20 2a 70 29 7b 0a 20 20  ant(Expr *p){.  
dc70: 72 65 74 75 72 6e 20 65 78 70 72 49 73 43 6f 6e  return exprIsCon
dc80: 73 74 28 70 2c 20 31 2c 20 30 29 3b 0a 7d 0a 0a  st(p, 1, 0);.}..
dc90: 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78  /*.** Walk an ex
dca0: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20  pression tree.  
dcb0: 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20  Return non-zero 
dcc0: 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
dcd0: 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a  n is constant.**
dce0: 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 20 6f 72   that does no or
dcf0: 69 67 69 6e 61 74 65 20 66 72 6f 6d 20 74 68 65  iginate from the
dd00: 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61   ON or USING cla
dd10: 75 73 65 73 20 6f 66 20 61 20 6a 6f 69 6e 2e 0a  uses of a join..
dd20: 2a 2a 20 52 65 74 75 72 6e 20 30 20 69 66 20 69  ** Return 0 if i
dd30: 74 20 69 6e 76 6f 6c 76 65 73 20 76 61 72 69 61  t involves varia
dd40: 62 6c 65 73 20 6f 72 20 66 75 6e 63 74 69 6f 6e  bles or function
dd50: 20 63 61 6c 6c 73 20 6f 72 20 74 65 72 6d 73 20   calls or terms 
dd60: 66 72 6f 6d 0a 2a 2a 20 61 6e 20 4f 4e 20 6f 72  from.** an ON or
dd70: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2e 0a 2a   USING clause..*
dd80: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
dd90: 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f  rIsConstantNotJo
dda0: 69 6e 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 72  in(Expr *p){.  r
ddb0: 65 74 75 72 6e 20 65 78 70 72 49 73 43 6f 6e 73  eturn exprIsCons
ddc0: 74 28 70 2c 20 32 2c 20 30 29 3b 0a 7d 0a 0a 2f  t(p, 2, 0);.}../
ddd0: 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70  *.** Walk an exp
dde0: 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52  ression tree.  R
ddf0: 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69  eturn non-zero i
de00: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
de10: 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20   is constant.** 
de20: 66 6f 72 20 61 6e 79 20 73 69 6e 67 6c 65 20 72  for any single r
de30: 6f 77 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  ow of the table 
de40: 77 69 74 68 20 63 75 72 73 6f 72 20 69 43 75 72  with cursor iCur
de50: 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
de60: 73 2c 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73  s, the.** expres
de70: 73 69 6f 6e 20 6d 75 73 74 20 6e 6f 74 20 72 65  sion must not re
de80: 66 65 72 20 74 6f 20 61 6e 79 20 6e 6f 6e 2d 64  fer to any non-d
de90: 65 74 65 72 6d 69 6e 69 73 74 69 63 20 66 75 6e  eterministic fun
dea0: 63 74 69 6f 6e 20 6e 6f 72 20 61 6e 79 0a 2a 2a  ction nor any.**
deb0: 20 74 61 62 6c 65 20 6f 74 68 65 72 20 74 68 61   table other tha
dec0: 6e 20 69 43 75 72 2e 0a 2a 2f 0a 69 6e 74 20 73  n iCur..*/.int s
ded0: 71 6c 69 74 65 33 45 78 70 72 49 73 54 61 62 6c  qlite3ExprIsTabl
dee0: 65 43 6f 6e 73 74 61 6e 74 28 45 78 70 72 20 2a  eConstant(Expr *
def0: 70 2c 20 69 6e 74 20 69 43 75 72 29 7b 0a 20 20  p, int iCur){.  
df00: 72 65 74 75 72 6e 20 65 78 70 72 49 73 43 6f 6e  return exprIsCon
df10: 73 74 28 70 2c 20 33 2c 20 69 43 75 72 29 3b 0a  st(p, 3, iCur);.
df20: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e  }../*.** Walk an
df30: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
df40: 2e 20 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65  .  Return non-ze
df50: 72 6f 20 69 66 20 74 68 65 20 65 78 70 72 65 73  ro if the expres
df60: 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74  sion is constant
df70: 0a 2a 2a 20 6f 72 20 61 20 66 75 6e 63 74 69 6f  .** or a functio
df80: 6e 20 63 61 6c 6c 20 77 69 74 68 20 63 6f 6e 73  n call with cons
df90: 74 61 6e 74 20 61 72 67 75 6d 65 6e 74 73 2e 20  tant arguments. 
dfa0: 20 52 65 74 75 72 6e 20 61 6e 64 20 30 20 69 66   Return and 0 if
dfb0: 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 61 6e   there.** are an
dfc0: 79 20 76 61 72 69 61 62 6c 65 73 2e 0a 2a 2a 0a  y variables..**.
dfd0: 2a 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f  ** For the purpo
dfe0: 73 65 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63  ses of this func
dff0: 74 69 6f 6e 2c 20 61 20 64 6f 75 62 6c 65 2d 71  tion, a double-q
e000: 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65 78  uoted string (ex
e010: 3a 20 22 61 62 63 22 29 0a 2a 2a 20 69 73 20 63  : "abc").** is c
e020: 6f 6e 73 69 64 65 72 65 64 20 61 20 76 61 72 69  onsidered a vari
e030: 61 62 6c 65 20 62 75 74 20 61 20 73 69 6e 67 6c  able but a singl
e040: 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20  e-quoted string 
e050: 28 65 78 3a 20 27 61 62 63 27 29 20 69 73 0a 2a  (ex: 'abc') is.*
e060: 2a 20 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f  * a constant..*/
e070: 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
e080: 49 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63  IsConstantOrFunc
e090: 74 69 6f 6e 28 45 78 70 72 20 2a 70 2c 20 75 38  tion(Expr *p, u8
e0a0: 20 69 73 49 6e 69 74 29 7b 0a 20 20 61 73 73 65   isInit){.  asse
e0b0: 72 74 28 20 69 73 49 6e 69 74 3d 3d 30 20 7c 7c  rt( isInit==0 ||
e0c0: 20 69 73 49 6e 69 74 3d 3d 31 20 29 3b 0a 20 20   isInit==1 );.  
e0d0: 72 65 74 75 72 6e 20 65 78 70 72 49 73 43 6f 6e  return exprIsCon
e0e0: 73 74 28 70 2c 20 34 2b 69 73 49 6e 69 74 2c 20  st(p, 4+isInit, 
e0f0: 30 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51  0);.}..#ifdef SQ
e100: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52 53  LITE_ENABLE_CURS
e110: 4f 52 5f 48 49 4e 54 53 0a 2f 2a 0a 2a 2a 20 57  OR_HINTS./*.** W
e120: 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f  alk an expressio
e130: 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20  n tree.  Return 
e140: 31 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  1 if the express
e150: 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 61 0a 2a  ion contains a.*
e160: 2a 20 73 75 62 71 75 65 72 79 20 6f 66 20 73 6f  * subquery of so
e170: 6d 65 20 6b 69 6e 64 2e 20 20 52 65 74 75 72 6e  me kind.  Return
e180: 20 30 20 69 66 20 74 68 65 72 65 20 61 72 65 20   0 if there are 
e190: 6e 6f 20 73 75 62 71 75 65 72 69 65 73 2e 0a 2a  no subqueries..*
e1a0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
e1b0: 72 43 6f 6e 74 61 69 6e 73 53 75 62 71 75 65 72  rContainsSubquer
e1c0: 79 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 57 61  y(Expr *p){.  Wa
e1d0: 6c 6b 65 72 20 77 3b 0a 20 20 6d 65 6d 73 65 74  lker w;.  memset
e1e0: 28 26 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77  (&w, 0, sizeof(w
e1f0: 29 29 3b 0a 20 20 77 2e 65 43 6f 64 65 20 3d 20  ));.  w.eCode = 
e200: 31 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c  1;.  w.xExprCall
e210: 62 61 63 6b 20 3d 20 73 71 6c 69 74 65 33 45 78  back = sqlite3Ex
e220: 70 72 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e  prWalkNoop;.  w.
e230: 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20  xSelectCallback 
e240: 3d 20 73 65 6c 65 63 74 4e 6f 64 65 49 73 43 6f  = selectNodeIsCo
e250: 6e 73 74 61 6e 74 3b 0a 20 20 73 71 6c 69 74 65  nstant;.  sqlite
e260: 33 57 61 6c 6b 45 78 70 72 28 26 77 2c 20 70 29  3WalkExpr(&w, p)
e270: 3b 0a 20 20 72 65 74 75 72 6e 20 77 2e 65 43 6f  ;.  return w.eCo
e280: 64 65 3d 3d 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a  de==0;.}.#endif.
e290: 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78  ./*.** If the ex
e2a0: 70 72 65 73 73 69 6f 6e 20 70 20 63 6f 64 65 73  pression p codes
e2b0: 20 61 20 63 6f 6e 73 74 61 6e 74 20 69 6e 74 65   a constant inte
e2c0: 67 65 72 20 74 68 61 74 20 69 73 20 73 6d 61 6c  ger that is smal
e2d0: 6c 20 65 6e 6f 75 67 68 0a 2a 2a 20 74 6f 20 66  l enough.** to f
e2e0: 69 74 20 69 6e 20 61 20 33 32 2d 62 69 74 20 69  it in a 32-bit i
e2f0: 6e 74 65 67 65 72 2c 20 72 65 74 75 72 6e 20 31  nteger, return 1
e300: 20 61 6e 64 20 70 75 74 20 74 68 65 20 76 61 6c   and put the val
e310: 75 65 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65  ue of the intege
e320: 72 0a 2a 2a 20 69 6e 20 2a 70 56 61 6c 75 65 2e  r.** in *pValue.
e330: 20 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73    If the express
e340: 69 6f 6e 20 69 73 20 6e 6f 74 20 61 6e 20 69 6e  ion is not an in
e350: 74 65 67 65 72 20 6f 72 20 69 66 20 69 74 20 69  teger or if it i
e360: 73 20 74 6f 6f 20 62 69 67 0a 2a 2a 20 74 6f 20  s too big.** to 
e370: 66 69 74 20 69 6e 20 61 20 73 69 67 6e 65 64 20  fit in a signed 
e380: 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 2c 20  32-bit integer, 
e390: 72 65 74 75 72 6e 20 30 20 61 6e 64 20 6c 65 61  return 0 and lea
e3a0: 76 65 20 2a 70 56 61 6c 75 65 20 75 6e 63 68 61  ve *pValue uncha
e3b0: 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  nged..*/.int sql
e3c0: 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65  ite3ExprIsIntege
e3d0: 72 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 2a  r(Expr *p, int *
e3e0: 70 56 61 6c 75 65 29 7b 0a 20 20 69 6e 74 20 72  pValue){.  int r
e3f0: 63 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49 66 20  c = 0;..  /* If 
e400: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  an expression is
e410: 20 61 6e 20 69 6e 74 65 67 65 72 20 6c 69 74 65   an integer lite
e420: 72 61 6c 20 74 68 61 74 20 66 69 74 73 20 69 6e  ral that fits in
e430: 20 61 20 73 69 67 6e 65 64 20 33 32 2d 62 69 74   a signed 32-bit
e440: 0a 20 20 2a 2a 20 69 6e 74 65 67 65 72 2c 20 74  .  ** integer, t
e450: 68 65 6e 20 74 68 65 20 45 50 5f 49 6e 74 56 61  hen the EP_IntVa
e460: 6c 75 65 20 66 6c 61 67 20 77 69 6c 6c 20 68 61  lue flag will ha
e470: 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ve already been 
e480: 73 65 74 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  set */.  assert(
e490: 20 70 2d 3e 6f 70 21 3d 54 4b 5f 49 4e 54 45 47   p->op!=TK_INTEG
e4a0: 45 52 20 7c 7c 20 28 70 2d 3e 66 6c 61 67 73 20  ER || (p->flags 
e4b0: 26 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 21 3d  & EP_IntValue)!=
e4c0: 30 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  0.           || 
e4d0: 73 71 6c 69 74 65 33 47 65 74 49 6e 74 33 32 28  sqlite3GetInt32(
e4e0: 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 26 72 63  p->u.zToken, &rc
e4f0: 29 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 70  )==0 );..  if( p
e500: 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e 74  ->flags & EP_Int
e510: 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 2a 70 56  Value ){.    *pV
e520: 61 6c 75 65 20 3d 20 70 2d 3e 75 2e 69 56 61 6c  alue = p->u.iVal
e530: 75 65 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  ue;.    return 1
e540: 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63 68 28 20  ;.  }.  switch( 
e550: 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  p->op ){.    cas
e560: 65 20 54 4b 5f 55 50 4c 55 53 3a 20 7b 0a 20 20  e TK_UPLUS: {.  
e570: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
e580: 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 2d  ExprIsInteger(p-
e590: 3e 70 4c 65 66 74 2c 20 70 56 61 6c 75 65 29 3b  >pLeft, pValue);
e5a0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
e5b0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
e5c0: 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20 20 20 20  UMINUS: {.      
e5d0: 69 6e 74 20 76 3b 0a 20 20 20 20 20 20 69 66 28  int v;.      if(
e5e0: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e   sqlite3ExprIsIn
e5f0: 74 65 67 65 72 28 70 2d 3e 70 4c 65 66 74 2c 20  teger(p->pLeft, 
e600: 26 76 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61  &v) ){.        a
e610: 73 73 65 72 74 28 20 76 21 3d 28 2d 32 31 34 37  ssert( v!=(-2147
e620: 34 38 33 36 34 37 2d 31 29 20 29 3b 0a 20 20 20  483647-1) );.   
e630: 20 20 20 20 20 2a 70 56 61 6c 75 65 20 3d 20 2d       *pValue = -
e640: 76 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  v;.        rc = 
e650: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
e660: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
e670: 20 20 64 65 66 61 75 6c 74 3a 20 62 72 65 61 6b    default: break
e680: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
e690: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
e6a0: 72 6e 20 46 41 4c 53 45 20 69 66 20 74 68 65 72  rn FALSE if ther
e6b0: 65 20 69 73 20 6e 6f 20 63 68 61 6e 63 65 20 74  e is no chance t
e6c0: 68 61 74 20 74 68 65 20 65 78 70 72 65 73 73 69  hat the expressi
e6d0: 6f 6e 20 63 61 6e 20 62 65 20 4e 55 4c 4c 2e 0a  on can be NULL..
e6e0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70  **.** If the exp
e6f0: 72 65 73 73 69 6f 6e 20 6d 69 67 68 74 20 62 65  ression might be
e700: 20 4e 55 4c 4c 20 6f 72 20 69 66 20 74 68 65 20   NULL or if the 
e710: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 6f  expression is to
e720: 6f 20 63 6f 6d 70 6c 65 78 0a 2a 2a 20 74 6f 20  o complex.** to 
e730: 74 65 6c 6c 20 72 65 74 75 72 6e 20 54 52 55 45  tell return TRUE
e740: 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  .  .**.** This r
e750: 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 61  outine is used a
e760: 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f  s an optimizatio
e770: 6e 2c 20 74 6f 20 73 6b 69 70 20 4f 50 5f 49 73  n, to skip OP_Is
e780: 4e 75 6c 6c 20 6f 70 63 6f 64 65 73 0a 2a 2a 20  Null opcodes.** 
e790: 77 68 65 6e 20 77 65 20 6b 6e 6f 77 20 74 68 61  when we know tha
e7a0: 74 20 61 20 76 61 6c 75 65 20 63 61 6e 6e 6f 74  t a value cannot
e7b0: 20 62 65 20 4e 55 4c 4c 2e 20 20 48 65 6e 63 65   be NULL.  Hence
e7c0: 2c 20 61 20 66 61 6c 73 65 20 70 6f 73 69 74 69  , a false positi
e7d0: 76 65 0a 2a 2a 20 28 72 65 74 75 72 6e 69 6e 67  ve.** (returning
e7e0: 20 54 52 55 45 20 77 68 65 6e 20 69 6e 20 66 61   TRUE when in fa
e7f0: 63 74 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  ct the expressio
e800: 6e 20 63 61 6e 20 6e 65 76 65 72 20 62 65 20 4e  n can never be N
e810: 55 4c 4c 29 20 6d 69 67 68 74 0a 2a 2a 20 62 65  ULL) might.** be
e820: 20 61 20 73 6d 61 6c 6c 20 70 65 72 66 6f 72 6d   a small perform
e830: 61 6e 63 65 20 68 69 74 20 62 75 74 20 69 73 20  ance hit but is 
e840: 6f 74 68 65 72 77 69 73 65 20 68 61 72 6d 6c 65  otherwise harmle
e850: 73 73 2e 20 20 4f 6e 20 74 68 65 20 6f 74 68 65  ss.  On the othe
e860: 72 0a 2a 2a 20 68 61 6e 64 2c 20 61 20 66 61 6c  r.** hand, a fal
e870: 73 65 20 6e 65 67 61 74 69 76 65 20 28 72 65 74  se negative (ret
e880: 75 72 6e 69 6e 67 20 46 41 4c 53 45 20 77 68 65  urning FALSE whe
e890: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f 75  n the result cou
e8a0: 6c 64 20 62 65 20 4e 55 4c 4c 29 0a 2a 2a 20 77  ld be NULL).** w
e8b0: 69 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 73 75 6c  ill likely resul
e8c0: 74 20 69 6e 20 61 6e 20 69 6e 63 6f 72 72 65 63  t in an incorrec
e8d0: 74 20 61 6e 73 77 65 72 2e 20 20 53 6f 20 77 68  t answer.  So wh
e8e0: 65 6e 20 69 6e 20 64 6f 75 62 74 2c 20 72 65 74  en in doubt, ret
e8f0: 75 72 6e 0a 2a 2a 20 54 52 55 45 2e 0a 2a 2f 0a  urn.** TRUE..*/.
e900: 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43  int sqlite3ExprC
e910: 61 6e 42 65 4e 75 6c 6c 28 63 6f 6e 73 74 20 45  anBeNull(const E
e920: 78 70 72 20 2a 70 29 7b 0a 20 20 75 38 20 6f 70  xpr *p){.  u8 op
e930: 3b 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 6f 70  ;.  while( p->op
e940: 3d 3d 54 4b 5f 55 50 4c 55 53 20 7c 7c 20 70 2d  ==TK_UPLUS || p-
e950: 3e 6f 70 3d 3d 54 4b 5f 55 4d 49 4e 55 53 20 29  >op==TK_UMINUS )
e960: 7b 20 70 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 20  { p = p->pLeft; 
e970: 7d 0a 20 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a  }.  op = p->op;.
e980: 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 52 45 47    if( op==TK_REG
e990: 49 53 54 45 52 20 29 20 6f 70 20 3d 20 70 2d 3e  ISTER ) op = p->
e9a0: 6f 70 32 3b 0a 20 20 73 77 69 74 63 68 28 20 6f  op2;.  switch( o
e9b0: 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
e9c0: 5f 49 4e 54 45 47 45 52 3a 0a 20 20 20 20 63 61  _INTEGER:.    ca
e9d0: 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 0a 20 20  se TK_STRING:.  
e9e0: 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a    case TK_FLOAT:
e9f0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 4c 4f  .    case TK_BLO
ea00: 42 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  B:.      return 
ea10: 30 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43  0;.    case TK_C
ea20: 4f 4c 55 4d 4e 3a 0a 20 20 20 20 20 20 61 73 73  OLUMN:.      ass
ea30: 65 72 74 28 20 70 2d 3e 70 54 61 62 21 3d 30 20  ert( p->pTab!=0 
ea40: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
ea50: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
ea60: 70 2c 20 45 50 5f 43 61 6e 42 65 4e 75 6c 6c 29  p, EP_CanBeNull)
ea70: 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20   ||.            
ea80: 20 28 70 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20   (p->iColumn>=0 
ea90: 26 26 20 70 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c  && p->pTab->aCol
eaa0: 5b 70 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 6e 6f 74  [p->iColumn].not
eab0: 4e 75 6c 6c 3d 3d 30 29 3b 0a 20 20 20 20 64 65  Null==0);.    de
eac0: 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 72 65 74  fault:.      ret
ead0: 75 72 6e 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  urn 1;.  }.}../*
eae0: 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
eaf0: 69 66 20 74 68 65 20 67 69 76 65 6e 20 65 78 70  if the given exp
eb00: 72 65 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6e  ression is a con
eb10: 73 74 61 6e 74 20 77 68 69 63 68 20 77 6f 75 6c  stant which woul
eb20: 64 20 62 65 0a 2a 2a 20 75 6e 63 68 61 6e 67 65  d be.** unchange
eb30: 64 20 62 79 20 4f 50 5f 41 66 66 69 6e 69 74 79  d by OP_Affinity
eb40: 20 77 69 74 68 20 74 68 65 20 61 66 66 69 6e 69   with the affini
eb50: 74 79 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20  ty given in the 
eb60: 73 65 63 6f 6e 64 0a 2a 2a 20 61 72 67 75 6d 65  second.** argume
eb70: 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  nt..**.** This r
eb80: 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 74  outine is used t
eb90: 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74  o determine if t
eba0: 68 65 20 4f 50 5f 41 66 66 69 6e 69 74 79 20 6f  he OP_Affinity o
ebb0: 70 65 72 61 74 69 6f 6e 0a 2a 2a 20 63 61 6e 20  peration.** can 
ebc0: 62 65 20 6f 6d 69 74 74 65 64 2e 20 20 57 68 65  be omitted.  Whe
ebd0: 6e 20 69 6e 20 64 6f 75 62 74 20 72 65 74 75 72  n in doubt retur
ebe0: 6e 20 46 41 4c 53 45 2e 20 20 41 20 66 61 6c 73  n FALSE.  A fals
ebf0: 65 20 6e 65 67 61 74 69 76 65 0a 2a 2a 20 69 73  e negative.** is
ec00: 20 68 61 72 6d 6c 65 73 73 2e 20 20 41 20 66 61   harmless.  A fa
ec10: 6c 73 65 20 70 6f 73 69 74 69 76 65 2c 20 68 6f  lse positive, ho
ec20: 77 65 76 65 72 2c 20 63 61 6e 20 72 65 73 75 6c  wever, can resul
ec30: 74 20 69 6e 20 74 68 65 20 77 72 6f 6e 67 0a 2a  t in the wrong.*
ec40: 2a 20 61 6e 73 77 65 72 2e 0a 2a 2f 0a 69 6e 74  * answer..*/.int
ec50: 20 73 71 6c 69 74 65 33 45 78 70 72 4e 65 65 64   sqlite3ExprNeed
ec60: 73 4e 6f 41 66 66 69 6e 69 74 79 43 68 61 6e 67  sNoAffinityChang
ec70: 65 28 63 6f 6e 73 74 20 45 78 70 72 20 2a 70 2c  e(const Expr *p,
ec80: 20 63 68 61 72 20 61 66 66 29 7b 0a 20 20 75 38   char aff){.  u8
ec90: 20 6f 70 3b 0a 20 20 69 66 28 20 61 66 66 3d 3d   op;.  if( aff==
eca0: 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20  SQLITE_AFF_BLOB 
ecb0: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 77 68  ) return 1;.  wh
ecc0: 69 6c 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55  ile( p->op==TK_U
ecd0: 50 4c 55 53 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54  PLUS || p->op==T
ece0: 4b 5f 55 4d 49 4e 55 53 20 29 7b 20 70 20 3d 20  K_UMINUS ){ p = 
ecf0: 70 2d 3e 70 4c 65 66 74 3b 20 7d 0a 20 20 6f 70  p->pLeft; }.  op
ed00: 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 69 66 28 20   = p->op;.  if( 
ed10: 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20  op==TK_REGISTER 
ed20: 29 20 6f 70 20 3d 20 70 2d 3e 6f 70 32 3b 0a 20  ) op = p->op2;. 
ed30: 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20   switch( op ){. 
ed40: 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 47     case TK_INTEG
ed50: 45 52 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75  ER: {.      retu
ed60: 72 6e 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41  rn aff==SQLITE_A
ed70: 46 46 5f 49 4e 54 45 47 45 52 20 7c 7c 20 61 66  FF_INTEGER || af
ed80: 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55  f==SQLITE_AFF_NU
ed90: 4d 45 52 49 43 3b 0a 20 20 20 20 7d 0a 20 20 20  MERIC;.    }.   
eda0: 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 20   case TK_FLOAT: 
edb0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 61  {.      return a
edc0: 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52  ff==SQLITE_AFF_R
edd0: 45 41 4c 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49  EAL || aff==SQLI
ede0: 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a  TE_AFF_NUMERIC;.
edf0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
ee00: 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20  K_STRING: {.    
ee10: 20 20 72 65 74 75 72 6e 20 61 66 66 3d 3d 53 51    return aff==SQ
ee20: 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20  LITE_AFF_TEXT;. 
ee30: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
ee40: 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20 72  _BLOB: {.      r
ee50: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
ee60: 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d     case TK_COLUM
ee70: 4e 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  N: {.      asser
ee80: 74 28 20 70 2d 3e 69 54 61 62 6c 65 3e 3d 30 20  t( p->iTable>=0 
ee90: 29 3b 20 20 2f 2a 20 70 20 63 61 6e 6e 6f 74 20  );  /* p cannot 
eea0: 62 65 20 70 61 72 74 20 6f 66 20 61 20 43 48 45  be part of a CHE
eeb0: 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f  CK constraint */
eec0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 2d  .      return p-
eed0: 3e 69 43 6f 6c 75 6d 6e 3c 30 0a 20 20 20 20 20  >iColumn<0.     
eee0: 20 20 20 20 20 26 26 20 28 61 66 66 3d 3d 53 51       && (aff==SQ
eef0: 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52  LITE_AFF_INTEGER
ef00: 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f   || aff==SQLITE_
ef10: 41 46 46 5f 4e 55 4d 45 52 49 43 29 3b 0a 20 20  AFF_NUMERIC);.  
ef20: 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a    }.    default:
ef30: 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   {.      return 
ef40: 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  0;.    }.  }.}..
ef50: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
ef60: 45 20 69 66 20 74 68 65 20 67 69 76 65 6e 20 73  E if the given s
ef70: 74 72 69 6e 67 20 69 73 20 61 20 72 6f 77 2d 69  tring is a row-i
ef80: 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 2e 0a 2a  d column name..*
ef90: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 73 52  /.int sqlite3IsR
efa0: 6f 77 69 64 28 63 6f 6e 73 74 20 63 68 61 72 20  owid(const char 
efb0: 2a 7a 29 7b 0a 20 20 69 66 28 20 73 71 6c 69 74  *z){.  if( sqlit
efc0: 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22 5f 52  e3StrICmp(z, "_R
efd0: 4f 57 49 44 5f 22 29 3d 3d 30 20 29 20 72 65 74  OWID_")==0 ) ret
efe0: 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 73 71 6c  urn 1;.  if( sql
eff0: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22  ite3StrICmp(z, "
f000: 52 4f 57 49 44 22 29 3d 3d 30 20 29 20 72 65 74  ROWID")==0 ) ret
f010: 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 73 71 6c  urn 1;.  if( sql
f020: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22  ite3StrICmp(z, "
f030: 4f 49 44 22 29 3d 3d 30 20 29 20 72 65 74 75 72  OID")==0 ) retur
f040: 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b  n 1;.  return 0;
f050: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 58 20 69 73 20  .}../*.** pX is 
f060: 74 68 65 20 52 48 53 20 6f 66 20 61 6e 20 49 4e  the RHS of an IN
f070: 20 6f 70 65 72 61 74 6f 72 2e 20 20 49 66 20 70   operator.  If p
f080: 58 20 69 73 20 61 20 53 45 4c 45 43 54 20 73 74  X is a SELECT st
f090: 61 74 65 6d 65 6e 74 20 0a 2a 2a 20 74 68 61 74  atement .** that
f0a0: 20 63 61 6e 20 62 65 20 73 69 6d 70 6c 69 66 69   can be simplifi
f0b0: 65 64 20 74 6f 20 61 20 64 69 72 65 63 74 20 74  ed to a direct t
f0c0: 61 62 6c 65 20 61 63 63 65 73 73 2c 20 74 68 65  able access, the
f0d0: 6e 20 72 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f  n return.** a po
f0e0: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 53 45 4c  inter to the SEL
f0f0: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  ECT statement.  
f100: 49 66 20 70 58 20 69 73 20 6e 6f 74 20 61 20 53  If pX is not a S
f110: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c  ELECT statement,
f120: 0a 2a 2a 20 6f 72 20 69 66 20 74 68 65 20 53 45  .** or if the SE
f130: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 6e  LECT statement n
f140: 65 65 64 73 20 74 6f 20 62 65 20 6d 61 6e 69 66  eeds to be manif
f150: 65 73 74 65 64 20 69 6e 74 6f 20 61 20 74 72 61  ested into a tra
f160: 6e 73 69 65 6e 74 0a 2a 2a 20 74 61 62 6c 65 2c  nsient.** table,
f170: 20 74 68 65 6e 20 72 65 74 75 72 6e 20 4e 55 4c   then return NUL
f180: 4c 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  L..*/.#ifndef SQ
f190: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
f1a0: 52 59 0a 73 74 61 74 69 63 20 53 65 6c 65 63 74  RY.static Select
f1b0: 20 2a 69 73 43 61 6e 64 69 64 61 74 65 46 6f 72   *isCandidateFor
f1c0: 49 6e 4f 70 74 28 45 78 70 72 20 2a 70 58 29 7b  InOpt(Expr *pX){
f1d0: 0a 20 20 53 65 6c 65 63 74 20 2a 70 3b 0a 20 20  .  Select *p;.  
f1e0: 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 0a 20  SrcList *pSrc;. 
f1f0: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
f200: 74 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  t;.  Table *pTab
f210: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  ;.  int i;.  if(
f220: 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
f230: 79 28 70 58 2c 20 45 50 5f 78 49 73 53 65 6c 65  y(pX, EP_xIsSele
f240: 63 74 29 20 29 20 72 65 74 75 72 6e 20 30 3b 20  ct) ) return 0; 
f250: 20 2f 2a 20 4e 6f 74 20 61 20 73 75 62 71 75 65   /* Not a subque
f260: 72 79 20 2a 2f 0a 20 20 69 66 28 20 45 78 70 72  ry */.  if( Expr
f270: 48 61 73 50 72 6f 70 65 72 74 79 28 70 58 2c 20  HasProperty(pX, 
f280: 45 50 5f 56 61 72 53 65 6c 65 63 74 29 20 20 29  EP_VarSelect)  )
f290: 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 43   return 0;  /* C
f2a0: 6f 72 72 65 6c 61 74 65 64 20 73 75 62 71 20 2a  orrelated subq *
f2b0: 2f 0a 20 20 70 20 3d 20 70 58 2d 3e 78 2e 70 53  /.  p = pX->x.pS
f2c0: 65 6c 65 63 74 3b 0a 20 20 69 66 28 20 70 2d 3e  elect;.  if( p->
f2d0: 70 50 72 69 6f 72 20 29 20 72 65 74 75 72 6e 20  pPrior ) return 
f2e0: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
f2f0: 2f 2a 20 4e 6f 74 20 61 20 63 6f 6d 70 6f 75 6e  /* Not a compoun
f300: 64 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 69 66  d SELECT */.  if
f310: 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ( p->selFlags & 
f320: 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f  (SF_Distinct|SF_
f330: 41 67 67 72 65 67 61 74 65 29 20 29 7b 0a 20 20  Aggregate) ){.  
f340: 20 20 74 65 73 74 63 61 73 65 28 20 28 70 2d 3e    testcase( (p->
f350: 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44  selFlags & (SF_D
f360: 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65  istinct|SF_Aggre
f370: 67 61 74 65 29 29 3d 3d 53 46 5f 44 69 73 74 69  gate))==SF_Disti
f380: 6e 63 74 20 29 3b 0a 20 20 20 20 74 65 73 74 63  nct );.    testc
f390: 61 73 65 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67  ase( (p->selFlag
f3a0: 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74  s & (SF_Distinct
f3b0: 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29 29 3d  |SF_Aggregate))=
f3c0: 3d 53 46 5f 41 67 67 72 65 67 61 74 65 20 29 3b  =SF_Aggregate );
f3d0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 2f  .    return 0; /
f3e0: 2a 20 4e 6f 20 44 49 53 54 49 4e 43 54 20 6b 65  * No DISTINCT ke
f3f0: 79 77 6f 72 64 20 61 6e 64 20 6e 6f 20 61 67 67  yword and no agg
f400: 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73  regate functions
f410: 20 2a 2f 0a 20 20 7d 0a 20 20 61 73 73 65 72 74   */.  }.  assert
f420: 28 20 70 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30  ( p->pGroupBy==0
f430: 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   );             
f440: 20 2f 2a 20 48 61 73 20 6e 6f 20 47 52 4f 55 50   /* Has no GROUP
f450: 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
f460: 69 66 28 20 70 2d 3e 70 4c 69 6d 69 74 20 29 20  if( p->pLimit ) 
f470: 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
f480: 20 20 20 20 20 20 20 2f 2a 20 48 61 73 20 6e 6f         /* Has no
f490: 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 2a 2f   LIMIT clause */
f4a0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f  .  assert( p->pO
f4b0: 66 66 73 65 74 3d 3d 30 20 29 3b 20 20 20 20 20  ffset==0 );     
f4c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20            /* No 
f4d0: 4c 49 4d 49 54 20 6d 65 61 6e 73 20 6e 6f 20 4f  LIMIT means no O
f4e0: 46 46 53 45 54 20 2a 2f 0a 20 20 69 66 28 20 70  FFSET */.  if( p
f4f0: 2d 3e 70 57 68 65 72 65 20 29 20 72 65 74 75 72  ->pWhere ) retur
f500: 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
f510: 20 20 2f 2a 20 48 61 73 20 6e 6f 20 57 48 45 52    /* Has no WHER
f520: 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 70 53  E clause */.  pS
f530: 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20  rc = p->pSrc;.  
f540: 61 73 73 65 72 74 28 20 70 53 72 63 21 3d 30 20  assert( pSrc!=0 
f550: 29 3b 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 6e  );.  if( pSrc->n
f560: 53 72 63 21 3d 31 20 29 20 72 65 74 75 72 6e 20  Src!=1 ) return 
f570: 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  0;          /* S
f580: 69 6e 67 6c 65 20 74 65 72 6d 20 69 6e 20 46 52  ingle term in FR
f590: 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69  OM clause */.  i
f5a0: 66 28 20 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53  f( pSrc->a[0].pS
f5b0: 65 6c 65 63 74 20 29 20 72 65 74 75 72 6e 20 30  elect ) return 0
f5c0: 3b 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 69 73  ;     /* FROM is
f5d0: 20 6e 6f 74 20 61 20 73 75 62 71 75 65 72 79 20   not a subquery 
f5e0: 6f 72 20 76 69 65 77 20 2a 2f 0a 20 20 70 54 61  or view */.  pTa
f5f0: 62 20 3d 20 70 53 72 63 2d 3e 61 5b 30 5d 2e 70  b = pSrc->a[0].p
f600: 54 61 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70  Tab;.  assert( p
f610: 54 61 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  Tab!=0 );.  asse
f620: 72 74 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63  rt( pTab->pSelec
f630: 74 3d 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20  t==0 );         
f640: 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73     /* FROM claus
f650: 65 20 69 73 20 6e 6f 74 20 61 20 76 69 65 77 20  e is not a view 
f660: 2a 2f 0a 20 20 69 66 28 20 49 73 56 69 72 74 75  */.  if( IsVirtu
f670: 61 6c 28 70 54 61 62 29 20 29 20 72 65 74 75 72  al(pTab) ) retur
f680: 6e 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 46  n 0;        /* F
f690: 52 4f 4d 20 63 6c 61 75 73 65 20 6e 6f 74 20 61  ROM clause not a
f6a0: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 2a   virtual table *
f6b0: 2f 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e  /.  pEList = p->
f6c0: 70 45 4c 69 73 74 3b 0a 0a 20 20 2f 2a 20 41 6c  pEList;..  /* Al
f6d0: 6c 20 53 45 4c 45 43 54 20 72 65 73 75 6c 74 73  l SELECT results
f6e0: 20 6d 75 73 74 20 62 65 20 63 6f 6c 75 6d 6e 73   must be columns
f6f0: 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20  . */.  for(i=0; 
f700: 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  i<pEList->nExpr;
f710: 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20   i++){.    Expr 
f720: 2a 70 52 65 73 20 3d 20 70 45 4c 69 73 74 2d 3e  *pRes = pEList->
f730: 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
f740: 69 66 28 20 70 52 65 73 2d 3e 6f 70 21 3d 54 4b  if( pRes->op!=TK
f750: 5f 43 4f 4c 55 4d 4e 20 29 20 72 65 74 75 72 6e  _COLUMN ) return
f760: 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   0;.    assert( 
f770: 70 52 65 73 2d 3e 69 54 61 62 6c 65 3d 3d 70 53  pRes->iTable==pS
f780: 72 63 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72  rc->a[0].iCursor
f790: 20 29 3b 20 20 2f 2a 20 4e 6f 74 20 61 20 63 6f   );  /* Not a co
f7a0: 72 72 65 6c 61 74 65 64 20 73 75 62 71 75 65 72  rrelated subquer
f7b0: 79 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72  y */.  }.  retur
f7c0: 6e 20 70 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  n p;.}.#endif /*
f7d0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
f7e0: 51 55 45 52 59 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  QUERY */../*.** 
f7f0: 43 6f 64 65 20 61 6e 20 4f 50 5f 4f 6e 63 65 20  Code an OP_Once 
f800: 69 6e 73 74 72 75 63 74 69 6f 6e 20 61 6e 64 20  instruction and 
f810: 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66  allocate space f
f820: 6f 72 20 69 74 73 20 66 6c 61 67 2e 20 52 65 74  or its flag. Ret
f830: 75 72 6e 20 74 68 65 20 0a 2a 2a 20 61 64 64 72  urn the .** addr
f840: 65 73 73 20 6f 66 20 74 68 65 20 6e 65 77 20 69  ess of the new i
f850: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 69  nstruction..*/.i
f860: 6e 74 20 73 71 6c 69 74 65 33 43 6f 64 65 4f 6e  nt sqlite3CodeOn
f870: 63 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ce(Parse *pParse
f880: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73  ){.  Vdbe *v = s
f890: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
f8a0: 61 72 73 65 29 3b 20 20 20 20 20 20 2f 2a 20 56  arse);      /* V
f8b0: 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 62  irtual machine b
f8c0: 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20  eing coded */.  
f8d0: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64  return sqlite3Vd
f8e0: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4f  beAddOp1(v, OP_O
f8f0: 6e 63 65 2c 20 70 50 61 72 73 65 2d 3e 6e 4f 6e  nce, pParse->nOn
f900: 63 65 2b 2b 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65  ce++);.}..#ifnde
f910: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
f920: 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 47 65 6e  BQUERY./*.** Gen
f930: 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
f940: 63 68 65 63 6b 73 20 74 68 65 20 6c 65 66 74 2d  checks the left-
f950: 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 69  most column of i
f960: 6e 64 65 78 20 74 61 62 6c 65 20 69 43 75 72 20  ndex table iCur 
f970: 74 6f 20 73 65 65 20 69 66 0a 2a 2a 20 69 74 20  to see if.** it 
f980: 63 6f 6e 74 61 69 6e 73 20 61 6e 79 20 4e 55 4c  contains any NUL
f990: 4c 20 65 6e 74 72 69 65 73 2e 20 20 43 61 75 73  L entries.  Caus
f9a0: 65 20 74 68 65 20 72 65 67 69 73 74 65 72 20 61  e the register a
f9b0: 74 20 72 65 67 48 61 73 4e 75 6c 6c 20 74 6f 20  t regHasNull to 
f9c0: 62 65 20 73 65 74 0a 2a 2a 20 74 6f 20 61 20 6e  be set.** to a n
f9d0: 6f 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65 20 69 66  on-NULL value if
f9e0: 20 69 43 75 72 20 63 6f 6e 74 61 69 6e 73 20 6e   iCur contains n
f9f0: 6f 20 4e 55 4c 4c 73 2e 20 20 43 61 75 73 65 20  o NULLs.  Cause 
fa00: 72 65 67 69 73 74 65 72 20 72 65 67 48 61 73 4e  register regHasN
fa10: 75 6c 6c 0a 2a 2a 20 74 6f 20 62 65 20 73 65 74  ull.** to be set
fa20: 20 74 6f 20 4e 55 4c 4c 20 69 66 20 69 43 75 72   to NULL if iCur
fa30: 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72   contains one or
fa40: 20 6d 6f 72 65 20 4e 55 4c 4c 20 76 61 6c 75 65   more NULL value
fa50: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
fa60: 64 20 73 71 6c 69 74 65 33 53 65 74 48 61 73 4e  d sqlite3SetHasN
fa70: 75 6c 6c 46 6c 61 67 28 56 64 62 65 20 2a 76 2c  ullFlag(Vdbe *v,
fa80: 20 69 6e 74 20 69 43 75 72 2c 20 69 6e 74 20 72   int iCur, int r
fa90: 65 67 48 61 73 4e 75 6c 6c 29 7b 0a 20 20 69 6e  egHasNull){.  in
faa0: 74 20 61 64 64 72 31 3b 0a 20 20 73 71 6c 69 74  t addr1;.  sqlit
fab0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
fac0: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72  OP_Integer, 0, r
fad0: 65 67 48 61 73 4e 75 6c 6c 29 3b 0a 20 20 61 64  egHasNull);.  ad
fae0: 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62  dr1 = sqlite3Vdb
faf0: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65  eAddOp1(v, OP_Re
fb00: 77 69 6e 64 2c 20 69 43 75 72 29 3b 20 56 64 62  wind, iCur); Vdb
fb10: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
fb20: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
fb30: 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  3(v, OP_Column, 
fb40: 69 43 75 72 2c 20 30 2c 20 72 65 67 48 61 73 4e  iCur, 0, regHasN
fb50: 75 6c 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  ull);.  sqlite3V
fb60: 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f  dbeChangeP5(v, O
fb70: 50 46 4c 41 47 5f 54 59 50 45 4f 46 41 52 47 29  PFLAG_TYPEOFARG)
fb80: 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28  ;.  VdbeComment(
fb90: 28 76 2c 20 22 66 69 72 73 74 5f 65 6e 74 72 79  (v, "first_entry
fba0: 5f 69 6e 28 25 64 29 22 2c 20 69 43 75 72 29 29  _in(%d)", iCur))
fbb0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a  ;.  sqlite3VdbeJ
fbc0: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 31  umpHere(v, addr1
fbd0: 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23 69  );.}.#endif...#i
fbe0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
fbf0: 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a  T_SUBQUERY./*.**
fc00: 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73   The argument is
fc10: 20 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72 20   an IN operator 
fc20: 77 69 74 68 20 61 20 6c 69 73 74 20 28 6e 6f 74  with a list (not
fc30: 20 61 20 73 75 62 71 75 65 72 79 29 20 6f 6e 20   a subquery) on 
fc40: 74 68 65 20 0a 2a 2a 20 72 69 67 68 74 2d 68 61  the .** right-ha
fc50: 6e 64 20 73 69 64 65 2e 20 20 52 65 74 75 72 6e  nd side.  Return
fc60: 20 54 52 55 45 20 69 66 20 74 68 61 74 20 6c 69   TRUE if that li
fc70: 73 74 20 69 73 20 63 6f 6e 73 74 61 6e 74 2e 0a  st is constant..
fc80: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71  */.static int sq
fc90: 6c 69 74 65 33 49 6e 52 68 73 49 73 43 6f 6e 73  lite3InRhsIsCons
fca0: 74 61 6e 74 28 45 78 70 72 20 2a 70 49 6e 29 7b  tant(Expr *pIn){
fcb0: 0a 20 20 45 78 70 72 20 2a 70 4c 48 53 3b 0a 20  .  Expr *pLHS;. 
fcc0: 20 69 6e 74 20 72 65 73 3b 0a 20 20 61 73 73 65   int res;.  asse
fcd0: 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
fce0: 65 72 74 79 28 70 49 6e 2c 20 45 50 5f 78 49 73  erty(pIn, EP_xIs
fcf0: 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 70 4c 48  Select) );.  pLH
fd00: 53 20 3d 20 70 49 6e 2d 3e 70 4c 65 66 74 3b 0a  S = pIn->pLeft;.
fd10: 20 20 70 49 6e 2d 3e 70 4c 65 66 74 20 3d 20 30    pIn->pLeft = 0
fd20: 3b 0a 20 20 72 65 73 20 3d 20 73 71 6c 69 74 65  ;.  res = sqlite
fd30: 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28  3ExprIsConstant(
fd40: 70 49 6e 29 3b 0a 20 20 70 49 6e 2d 3e 70 4c 65  pIn);.  pIn->pLe
fd50: 66 74 20 3d 20 70 4c 48 53 3b 0a 20 20 72 65 74  ft = pLHS;.  ret
fd60: 75 72 6e 20 72 65 73 3b 0a 7d 0a 23 65 6e 64 69  urn res;.}.#endi
fd70: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  f../*.** This fu
fd80: 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 62  nction is used b
fd90: 79 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  y the implementa
fda0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 49 4e 20 28  tion of the IN (
fdb0: 2e 2e 2e 29 20 6f 70 65 72 61 74 6f 72 2e 0a 2a  ...) operator..*
fdc0: 2a 20 54 68 65 20 70 58 20 70 61 72 61 6d 65 74  * The pX paramet
fdd0: 65 72 20 69 73 20 74 68 65 20 65 78 70 72 65 73  er is the expres
fde0: 73 69 6f 6e 20 6f 6e 20 74 68 65 20 52 48 53 20  sion on the RHS 
fdf0: 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74  of the IN operat
fe00: 6f 72 2c 20 77 68 69 63 68 0a 2a 2a 20 6d 69 67  or, which.** mig
fe10: 68 74 20 62 65 20 65 69 74 68 65 72 20 61 20 6c  ht be either a l
fe20: 69 73 74 20 6f 66 20 65 78 70 72 65 73 73 69 6f  ist of expressio
fe30: 6e 73 20 6f 72 20 61 20 73 75 62 71 75 65 72 79  ns or a subquery
fe40: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 62 20  ..**.** The job 
fe50: 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  of this routine 
fe60: 69 73 20 74 6f 20 66 69 6e 64 20 6f 72 20 63 72  is to find or cr
fe70: 65 61 74 65 20 61 20 62 2d 74 72 65 65 20 6f 62  eate a b-tree ob
fe80: 6a 65 63 74 20 74 68 61 74 20 63 61 6e 0a 2a 2a  ject that can.**
fe90: 20 62 65 20 75 73 65 64 20 65 69 74 68 65 72 20   be used either 
fea0: 74 6f 20 74 65 73 74 20 66 6f 72 20 6d 65 6d 62  to test for memb
feb0: 65 72 73 68 69 70 20 69 6e 20 74 68 65 20 52 48  ership in the RH
fec0: 53 20 73 65 74 20 6f 72 20 74 6f 20 69 74 65 72  S set or to iter
fed0: 61 74 65 20 74 68 72 6f 75 67 68 0a 2a 2a 20 61  ate through.** a
fee0: 6c 6c 20 6d 65 6d 62 65 72 73 20 6f 66 20 74 68  ll members of th
fef0: 65 20 52 48 53 20 73 65 74 2c 20 73 6b 69 70 70  e RHS set, skipp
ff00: 69 6e 67 20 64 75 70 6c 69 63 61 74 65 73 2e 0a  ing duplicates..
ff10: 2a 2a 0a 2a 2a 20 41 20 63 75 72 73 6f 72 20 69  **.** A cursor i
ff20: 73 20 6f 70 65 6e 65 64 20 6f 6e 20 74 68 65 20  s opened on the 
ff30: 62 2d 74 72 65 65 20 6f 62 6a 65 63 74 20 74 68  b-tree object th
ff40: 61 74 20 69 73 20 74 68 65 20 52 48 53 20 6f 66  at is the RHS of
ff50: 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   the IN operator
ff60: 0a 2a 2a 20 61 6e 64 20 70 58 2d 3e 69 54 61 62  .** and pX->iTab
ff70: 6c 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  le is set to the
ff80: 20 69 6e 64 65 78 20 6f 66 20 74 68 61 74 20 63   index of that c
ff90: 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ursor..**.** The
ffa0: 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20   returned value 
ffb0: 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
ffc0: 20 69 6e 64 69 63 61 74 65 73 20 74 68 65 20 62   indicates the b
ffd0: 2d 74 72 65 65 20 74 79 70 65 2c 20 61 73 20 66  -tree type, as f
ffe0: 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ollows:.**.**   
fff0: 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 20 20  IN_INDEX_ROWID  
10000 20 20 20 20 2d 20 54 68 65 20 63 75 72 73 6f 72      - The cursor
10010 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61   was opened on a
10020 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 2e   database table.
10030 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 49  .**   IN_INDEX_I
10040 4e 44 45 58 5f 41 53 43 20 20 2d 20 54 68 65 20  NDEX_ASC  - The 
10050 63 75 72 73 6f 72 20 77 61 73 20 6f 70 65 6e 65  cursor was opene
10060 64 20 6f 6e 20 61 6e 20 61 73 63 65 6e 64 69 6e  d on an ascendin
10070 67 20 69 6e 64 65 78 2e 0a 2a 2a 20 20 20 49 4e  g index..**   IN
10080 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 44 45 53  _INDEX_INDEX_DES
10090 43 20 2d 20 54 68 65 20 63 75 72 73 6f 72 20 77  C - The cursor w
100a0 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 64  as opened on a d
100b0 65 73 63 65 6e 64 69 6e 67 20 69 6e 64 65 78 2e  escending index.
100c0 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 45  .**   IN_INDEX_E
100d0 50 48 20 20 20 20 20 20 20 20 2d 20 54 68 65 20  PH        - The 
100e0 63 75 72 73 6f 72 20 77 61 73 20 6f 70 65 6e 65  cursor was opene
100f0 64 20 6f 6e 20 61 20 73 70 65 63 69 61 6c 6c 79  d on a specially
10100 20 63 72 65 61 74 65 64 20 61 6e 64 0a 2a 2a 20   created and.** 
10110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10120 20 20 20 20 20 20 20 20 70 6f 70 75 6c 61 74 65          populate
10130 64 20 65 70 68 65 72 65 6d 61 6c 20 74 61 62 6c  d epheremal tabl
10140 65 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58  e..**   IN_INDEX
10150 5f 4e 4f 4f 50 20 20 20 20 20 20 20 2d 20 4e 6f  _NOOP       - No
10160 20 63 75 72 73 6f 72 20 77 61 73 20 61 6c 6c 6f   cursor was allo
10170 63 61 74 65 64 2e 20 20 54 68 65 20 49 4e 20 6f  cated.  The IN o
10180 70 65 72 61 74 6f 72 20 6d 75 73 74 20 62 65 0a  perator must be.
10190 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
101a0 20 20 20 20 20 20 20 20 20 20 20 69 6d 70 6c 65             imple
101b0 6d 65 6e 74 65 64 20 61 73 20 61 20 73 65 71 75  mented as a sequ
101c0 65 6e 63 65 20 6f 66 20 63 6f 6d 70 61 72 69 73  ence of comparis
101d0 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78  ons..**.** An ex
101e0 69 73 74 69 6e 67 20 62 2d 74 72 65 65 20 6d 69  isting b-tree mi
101f0 67 68 74 20 62 65 20 75 73 65 64 20 69 66 20 74  ght be used if t
10200 68 65 20 52 48 53 20 65 78 70 72 65 73 73 69 6f  he RHS expressio
10210 6e 20 70 58 20 69 73 20 61 20 73 69 6d 70 6c 65  n pX is a simple
10220 0a 2a 2a 20 73 75 62 71 75 65 72 79 20 73 75 63  .** subquery suc
10230 68 20 61 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  h as:.**.**     
10240 53 45 4c 45 43 54 20 3c 63 6f 6c 75 6d 6e 31 3e  SELECT <column1>
10250 2c 20 3c 63 6f 6c 75 6d 6e 32 3e 2e 2e 2e 20 46  , <column2>... F
10260 52 4f 4d 20 3c 74 61 62 6c 65 3e 0a 2a 2a 0a 2a  ROM <table>.**.*
10270 2a 20 49 66 20 74 68 65 20 52 48 53 20 6f 66 20  * If the RHS of 
10280 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20  the IN operator 
10290 69 73 20 61 20 6c 69 73 74 20 6f 72 20 61 20 6d  is a list or a m
102a0 6f 72 65 20 63 6f 6d 70 6c 65 78 20 73 75 62 71  ore complex subq
102b0 75 65 72 79 2c 20 74 68 65 6e 0a 2a 2a 20 61 6e  uery, then.** an
102c0 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65   ephemeral table
102d0 20 6d 69 67 68 74 20 6e 65 65 64 20 74 6f 20 62   might need to b
102e0 65 20 67 65 6e 65 72 61 74 65 64 20 66 72 6f 6d  e generated from
102f0 20 74 68 65 20 52 48 53 20 61 6e 64 20 74 68 65   the RHS and the
10300 6e 0a 2a 2a 20 70 58 2d 3e 69 54 61 62 6c 65 20  n.** pX->iTable 
10310 6d 61 64 65 20 74 6f 20 70 6f 69 6e 74 20 74 6f  made to point to
10320 20 74 68 65 20 65 70 68 65 6d 65 72 61 6c 20 74   the ephemeral t
10330 61 62 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20  able instead of 
10340 61 6e 0a 2a 2a 20 65 78 69 73 74 69 6e 67 20 74  an.** existing t
10350 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  able..**.** The 
10360 69 6e 46 6c 61 67 73 20 70 61 72 61 6d 65 74 65  inFlags paramete
10370 72 20 6d 75 73 74 20 63 6f 6e 74 61 69 6e 20 65  r must contain e
10380 78 61 63 74 6c 79 20 6f 6e 65 20 6f 66 20 74 68  xactly one of th
10390 65 20 62 69 74 73 0a 2a 2a 20 49 4e 5f 49 4e 44  e bits.** IN_IND
103a0 45 58 5f 4d 45 4d 42 45 52 53 48 49 50 20 6f 72  EX_MEMBERSHIP or
103b0 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 2e 20   IN_INDEX_LOOP. 
103c0 20 49 66 20 69 6e 46 6c 61 67 73 20 63 6f 6e 74   If inFlags cont
103d0 61 69 6e 73 0a 2a 2a 20 49 4e 5f 49 4e 44 45 58  ains.** IN_INDEX
103e0 5f 4d 45 4d 42 45 52 53 48 49 50 2c 20 74 68 65  _MEMBERSHIP, the
103f0 6e 20 74 68 65 20 67 65 6e 65 72 61 74 65 64 20  n the generated 
10400 74 61 62 6c 65 20 77 69 6c 6c 20 62 65 20 75 73  table will be us
10410 65 64 20 66 6f 72 20 61 0a 2a 2a 20 66 61 73 74  ed for a.** fast
10420 20 6d 65 6d 62 65 72 73 68 69 70 20 74 65 73 74   membership test
10430 2e 20 20 57 68 65 6e 20 74 68 65 20 49 4e 5f 49  .  When the IN_I
10440 4e 44 45 58 5f 4c 4f 4f 50 20 62 69 74 20 69 73  NDEX_LOOP bit is
10450 20 73 65 74 2c 20 74 68 65 0a 2a 2a 20 49 4e 20   set, the.** IN 
10460 69 6e 64 65 78 20 77 69 6c 6c 20 62 65 20 75 73  index will be us
10470 65 64 20 74 6f 20 6c 6f 6f 70 20 6f 76 65 72 20  ed to loop over 
10480 61 6c 6c 20 76 61 6c 75 65 73 20 6f 66 20 74 68  all values of th
10490 65 20 52 48 53 20 6f 66 20 74 68 65 0a 2a 2a 20  e RHS of the.** 
104a0 49 4e 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 0a  IN operator..**.
104b0 2a 2a 20 57 68 65 6e 20 49 4e 5f 49 4e 44 45 58  ** When IN_INDEX
104c0 5f 4c 4f 4f 50 20 69 73 20 75 73 65 64 20 28 61  _LOOP is used (a
104d0 6e 64 20 74 68 65 20 62 2d 74 72 65 65 20 77 69  nd the b-tree wi
104e0 6c 6c 20 62 65 20 75 73 65 64 20 74 6f 20 69 74  ll be used to it
104f0 65 72 61 74 65 0a 2a 2a 20 74 68 72 6f 75 67 68  erate.** through
10500 20 74 68 65 20 73 65 74 20 6d 65 6d 62 65 72 73   the set members
10510 29 20 74 68 65 6e 20 74 68 65 20 62 2d 74 72 65  ) then the b-tre
10520 65 20 6d 75 73 74 20 6e 6f 74 20 63 6f 6e 74 61  e must not conta
10530 69 6e 20 64 75 70 6c 69 63 61 74 65 73 2e 0a 2a  in duplicates..*
10540 2a 20 41 6e 20 65 70 68 65 72 65 6d 61 6c 20 74  * An epheremal t
10550 61 62 6c 65 20 6d 75 73 74 20 62 65 20 75 73 65  able must be use
10560 64 20 75 6e 6c 65 73 73 20 74 68 65 20 73 65 6c  d unless the sel
10570 65 63 74 65 64 20 63 6f 6c 75 6d 6e 73 20 61 72  ected columns ar
10580 65 20 67 75 61 72 61 6e 74 65 65 64 0a 2a 2a 20  e guaranteed.** 
10590 74 6f 20 62 65 20 75 6e 69 71 75 65 20 2d 20 65  to be unique - e
105a0 69 74 68 65 72 20 62 65 63 61 75 73 65 20 69 74  ither because it
105b0 20 69 73 20 61 6e 20 49 4e 54 45 47 45 52 20 50   is an INTEGER P
105c0 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 64 75  RIMARY KEY or du
105d0 65 20 74 6f 0a 2a 2a 20 61 20 55 4e 49 51 55 45  e to.** a UNIQUE
105e0 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 72 20 69   constraint or i
105f0 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  ndex..**.** When
10600 20 49 4e 5f 49 4e 44 45 58 5f 4d 45 4d 42 45 52   IN_INDEX_MEMBER
10610 53 48 49 50 20 69 73 20 75 73 65 64 20 28 61 6e  SHIP is used (an
10620 64 20 74 68 65 20 62 2d 74 72 65 65 20 77 69 6c  d the b-tree wil
10630 6c 20 62 65 20 75 73 65 64 20 0a 2a 2a 20 66 6f  l be used .** fo
10640 72 20 66 61 73 74 20 73 65 74 20 6d 65 6d 62 65  r fast set membe
10650 72 73 68 69 70 20 74 65 73 74 73 29 20 74 68 65  rship tests) the
10660 6e 20 61 6e 20 65 70 68 65 72 65 6d 61 6c 20 74  n an epheremal t
10670 61 62 6c 65 20 6d 75 73 74 20 0a 2a 2a 20 62 65  able must .** be
10680 20 75 73 65 64 20 75 6e 6c 65 73 73 20 3c 63 6f   used unless <co
10690 6c 75 6d 6e 73 3e 20 69 73 20 61 20 73 69 6e 67  lumns> is a sing
106a0 6c 65 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  le INTEGER PRIMA
106b0 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 20 6f 72  RY KEY column or
106c0 20 61 6e 20 0a 2a 2a 20 69 6e 64 65 78 20 63 61   an .** index ca
106d0 6e 20 62 65 20 66 6f 75 6e 64 20 77 69 74 68 20  n be found with 
106e0 74 68 65 20 73 70 65 63 69 66 69 65 64 20 3c 63  the specified <c
106f0 6f 6c 75 6d 6e 73 3e 20 61 73 20 69 74 73 20 6c  olumns> as its l
10700 65 66 74 2d 6d 6f 73 74 2e 0a 2a 2a 0a 2a 2a 20  eft-most..**.** 
10710 49 66 20 74 68 65 20 49 4e 5f 49 4e 44 45 58 5f  If the IN_INDEX_
10720 4e 4f 4f 50 5f 4f 4b 20 61 6e 64 20 49 4e 5f 49  NOOP_OK and IN_I
10730 4e 44 45 58 5f 4d 45 4d 42 45 52 53 48 49 50 20  NDEX_MEMBERSHIP 
10740 61 72 65 20 62 6f 74 68 20 73 65 74 20 61 6e 64  are both set and
10750 0a 2a 2a 20 69 66 20 74 68 65 20 52 48 53 20 6f  .** if the RHS o
10760 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f  f the IN operato
10770 72 20 69 73 20 61 20 6c 69 73 74 20 28 6e 6f 74  r is a list (not
10780 20 61 20 73 75 62 71 75 65 72 79 29 20 74 68 65   a subquery) the
10790 6e 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e  n this.** routin
107a0 65 20 6d 69 67 68 74 20 64 65 63 69 64 65 20 74  e might decide t
107b0 68 61 74 20 63 72 65 61 74 69 6e 67 20 61 6e 20  hat creating an 
107c0 65 70 68 65 6d 65 72 61 6c 20 62 2d 74 72 65 65  ephemeral b-tree
107d0 20 66 6f 72 20 6d 65 6d 62 65 72 73 68 69 70 0a   for membership.
107e0 2a 2a 20 74 65 73 74 69 6e 67 20 69 73 20 74 6f  ** testing is to
107f0 6f 20 65 78 70 65 6e 73 69 76 65 20 61 6e 64 20  o expensive and 
10800 72 65 74 75 72 6e 20 49 4e 5f 49 4e 44 45 58 5f  return IN_INDEX_
10810 4e 4f 4f 50 2e 20 20 49 6e 20 74 68 61 74 20 63  NOOP.  In that c
10820 61 73 65 2c 20 74 68 65 0a 2a 2a 20 63 61 6c 6c  ase, the.** call
10830 69 6e 67 20 72 6f 75 74 69 6e 65 20 73 68 6f 75  ing routine shou
10840 6c 64 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65  ld implement the
10850 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 75 73 69   IN operator usi
10860 6e 67 20 61 20 73 65 71 75 65 6e 63 65 0a 2a 2a  ng a sequence.**
10870 20 6f 66 20 45 71 20 6f 72 20 4e 65 20 63 6f 6d   of Eq or Ne com
10880 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 69 6f  parison operatio
10890 6e 73 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74  ns..**.** When t
108a0 68 65 20 62 2d 74 72 65 65 20 69 73 20 62 65 69  he b-tree is bei
108b0 6e 67 20 75 73 65 64 20 66 6f 72 20 6d 65 6d 62  ng used for memb
108c0 65 72 73 68 69 70 20 74 65 73 74 73 2c 20 74 68  ership tests, th
108d0 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  e calling functi
108e0 6f 6e 0a 2a 2a 20 6d 69 67 68 74 20 6e 65 65 64  on.** might need
108f0 20 74 6f 20 6b 6e 6f 77 20 77 68 65 74 68 65 72   to know whether
10900 20 6f 72 20 6e 6f 74 20 74 68 65 20 52 48 53 20   or not the RHS 
10910 73 69 64 65 20 6f 66 20 74 68 65 20 49 4e 20 6f  side of the IN o
10920 70 65 72 61 74 6f 72 0a 2a 2a 20 63 6f 6e 74 61  perator.** conta
10930 69 6e 73 20 61 20 4e 55 4c 4c 2e 20 20 49 66 20  ins a NULL.  If 
10940 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 69 73 20  prRhsHasNull is 
10950 6e 6f 74 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74  not a NULL point
10960 65 72 20 61 6e 64 20 0a 2a 2a 20 69 66 20 74 68  er and .** if th
10970 65 72 65 20 69 73 20 61 6e 79 20 63 68 61 6e 63  ere is any chanc
10980 65 20 74 68 61 74 20 74 68 65 20 28 2e 2e 2e 29  e that the (...)
10990 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 61   might contain a
109a0 20 4e 55 4c 4c 20 76 61 6c 75 65 20 61 74 0a 2a   NULL value at.*
109b0 2a 20 72 75 6e 74 69 6d 65 2c 20 74 68 65 6e 20  * runtime, then 
109c0 61 20 72 65 67 69 73 74 65 72 20 69 73 20 61 6c  a register is al
109d0 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68 65 20  located and the 
109e0 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72 20  register number 
109f0 77 72 69 74 74 65 6e 0a 2a 2a 20 74 6f 20 2a 70  written.** to *p
10a00 72 52 68 73 48 61 73 4e 75 6c 6c 2e 20 49 66 20  rRhsHasNull. If 
10a10 74 68 65 72 65 20 69 73 20 6e 6f 20 63 68 61 6e  there is no chan
10a20 63 65 20 74 68 61 74 20 74 68 65 20 28 2e 2e 2e  ce that the (...
10a30 29 20 63 6f 6e 74 61 69 6e 73 20 61 0a 2a 2a 20  ) contains a.** 
10a40 4e 55 4c 4c 20 76 61 6c 75 65 2c 20 74 68 65 6e  NULL value, then
10a50 20 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 69   *prRhsHasNull i
10a60 73 20 6c 65 66 74 20 75 6e 63 68 61 6e 67 65 64  s left unchanged
10a70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 72 65 67  ..**.** If a reg
10a80 69 73 74 65 72 20 69 73 20 61 6c 6c 6f 63 61 74  ister is allocat
10a90 65 64 20 61 6e 64 20 69 74 73 20 6c 6f 63 61 74  ed and its locat
10aa0 69 6f 6e 20 73 74 6f 72 65 64 20 69 6e 20 2a 70  ion stored in *p
10ab0 72 52 68 73 48 61 73 4e 75 6c 6c 2c 20 74 68 65  rRhsHasNull, the
10ac0 6e 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 69  n.** the value i
10ad0 6e 20 74 68 61 74 20 72 65 67 69 73 74 65 72 20  n that register 
10ae0 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 20 69 66 20  will be NULL if 
10af0 74 68 65 20 62 2d 74 72 65 65 20 63 6f 6e 74 61  the b-tree conta
10b00 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 0a  ins one or more.
10b10 2a 2a 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2c 20  ** NULL values, 
10b20 61 6e 64 20 69 74 20 77 69 6c 6c 20 62 65 20 73  and it will be s
10b30 6f 6d 65 20 6e 6f 6e 2d 4e 55 4c 4c 20 76 61 6c  ome non-NULL val
10b40 75 65 20 69 66 20 74 68 65 20 62 2d 74 72 65 65  ue if the b-tree
10b50 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 0a 2a 2a 20   contains no.** 
10b60 4e 55 4c 4c 20 76 61 6c 75 65 73 2e 0a 2a 2a 0a  NULL values..**.
10b70 2a 2a 20 49 66 20 74 68 65 20 61 69 4d 61 70 20  ** If the aiMap 
10b80 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74  parameter is not
10b90 20 4e 55 4c 4c 2c 20 69 74 20 6d 75 73 74 20 70   NULL, it must p
10ba0 6f 69 6e 74 20 74 6f 20 61 6e 20 61 72 72 61 79  oint to an array
10bb0 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 2a 2a 20 6f   containing.** o
10bc0 6e 65 20 65 6c 65 6d 65 6e 74 20 66 6f 72 20 65  ne element for e
10bd0 61 63 68 20 63 6f 6c 75 6d 6e 20 72 65 74 75 72  ach column retur
10be0 6e 65 64 20 62 79 20 74 68 65 20 53 45 4c 45 43  ned by the SELEC
10bf0 54 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 20 74  T statement on t
10c00 68 65 20 52 48 53 0a 2a 2a 20 6f 66 20 74 68 65  he RHS.** of the
10c10 20 49 4e 28 2e 2e 2e 29 20 6f 70 65 72 61 74 6f   IN(...) operato
10c20 72 2e 20 54 68 65 20 69 27 74 68 20 65 6e 74 72  r. The i'th entr
10c30 79 20 6f 66 20 74 68 65 20 61 72 72 61 79 20 69  y of the array i
10c40 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68  s populated with
10c50 20 74 68 65 0a 2a 2a 20 6f 66 66 73 65 74 20 6f   the.** offset o
10c60 66 20 74 68 65 20 69 6e 64 65 78 20 63 6f 6c 75  f the index colu
10c70 6d 6e 20 74 68 61 74 20 6d 61 74 63 68 65 73 20  mn that matches 
10c80 74 68 65 20 69 27 74 68 20 63 6f 6c 75 6d 6e 20  the i'th column 
10c90 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 0a  returned by the.
10ca0 2a 2a 20 53 45 4c 45 43 54 2e 20 46 6f 72 20 65  ** SELECT. For e
10cb0 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 65  xample, if the e
10cc0 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 73 65  xpression and se
10cd0 6c 65 63 74 65 64 20 69 6e 64 65 78 20 61 72 65  lected index are
10ce0 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 3f 2c 3f 2c 3f  :.**.**   (?,?,?
10cf0 29 20 49 4e 20 28 53 45 4c 45 43 54 20 61 2c 20  ) IN (SELECT a, 
10d00 62 2c 20 63 20 46 52 4f 4d 20 74 31 29 0a 2a 2a  b, c FROM t1).**
10d10 20 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20     CREATE INDEX 
10d20 69 31 20 4f 4e 20 74 31 28 62 2c 20 63 2c 20 61  i1 ON t1(b, c, a
10d30 29 3b 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 61 69  );.**.** then ai
10d40 4d 61 70 5b 5d 20 69 73 20 70 6f 70 75 6c 61 74  Map[] is populat
10d50 65 64 20 77 69 74 68 20 7b 32 2c 20 30 2c 20 31  ed with {2, 0, 1
10d60 7d 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  }..*/.#ifndef SQ
10d70 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
10d80 52 59 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 69  RY.int sqlite3Fi
10d90 6e 64 49 6e 49 6e 64 65 78 28 0a 20 20 50 61 72  ndInIndex(.  Par
10da0 73 65 20 2a 70 50 61 72 73 65 2c 20 0a 20 20 45  se *pParse, .  E
10db0 78 70 72 20 2a 70 58 2c 20 0a 20 20 75 33 32 20  xpr *pX, .  u32 
10dc0 69 6e 46 6c 61 67 73 2c 20 0a 20 20 69 6e 74 20  inFlags, .  int 
10dd0 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c 2c 0a 20  *prRhsHasNull,. 
10de0 20 69 6e 74 20 2a 61 69 4d 61 70 0a 29 7b 0a 20   int *aiMap.){. 
10df0 20 53 65 6c 65 63 74 20 2a 70 3b 20 20 20 20 20   Select *p;     
10e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e10 20 20 20 20 20 20 20 2f 2a 20 53 45 4c 45 43 54         /* SELECT
10e20 20 74 6f 20 74 68 65 20 72 69 67 68 74 20 6f 66   to the right of
10e30 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a   IN operator */.
10e40 20 20 69 6e 74 20 65 54 79 70 65 20 3d 20 30 3b    int eType = 0;
10e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e60 20 20 20 20 20 20 20 20 2f 2a 20 54 79 70 65 20          /* Type 
10e70 6f 66 20 52 48 53 20 74 61 62 6c 65 2e 20 49 4e  of RHS table. IN
10e80 5f 49 4e 44 45 58 5f 2a 20 2a 2f 0a 20 20 69 6e  _INDEX_* */.  in
10e90 74 20 69 54 61 62 20 3d 20 70 50 61 72 73 65 2d  t iTab = pParse-
10ea0 3e 6e 54 61 62 2b 2b 3b 20 20 20 20 20 20 20 20  >nTab++;        
10eb0 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f 66      /* Cursor of
10ec0 20 74 68 65 20 52 48 53 20 74 61 62 6c 65 20 2a   the RHS table *
10ed0 2f 0a 20 20 69 6e 74 20 6d 75 73 74 42 65 55 6e  /.  int mustBeUn
10ee0 69 71 75 65 3b 20 20 20 20 20 20 20 20 20 20 20  ique;           
10ef0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
10f00 65 20 69 66 20 52 48 53 20 6d 75 73 74 20 62 65  e if RHS must be
10f10 20 75 6e 69 71 75 65 20 2a 2f 0a 20 20 56 64 62   unique */.  Vdb
10f20 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65  e *v = sqlite3Ge
10f30 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 20 20  tVdbe(pParse);  
10f40 20 20 20 2f 2a 20 56 69 72 74 75 61 6c 20 6d 61     /* Virtual ma
10f50 63 68 69 6e 65 20 62 65 69 6e 67 20 63 6f 64 65  chine being code
10f60 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  d */..  assert( 
10f70 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 29 3b  pX->op==TK_IN );
10f80 0a 20 20 6d 75 73 74 42 65 55 6e 69 71 75 65 20  .  mustBeUnique 
10f90 3d 20 28 69 6e 46 6c 61 67 73 20 26 20 49 4e 5f  = (inFlags & IN_
10fa0 49 4e 44 45 58 5f 4c 4f 4f 50 29 21 3d 30 3b 0a  INDEX_LOOP)!=0;.
10fb0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 52 48 53  .  /* If the RHS
10fc0 20 6f 66 20 74 68 69 73 20 49 4e 28 2e 2e 2e 29   of this IN(...)
10fd0 20 6f 70 65 72 61 74 6f 72 20 69 73 20 61 20 53   operator is a S
10fe0 45 4c 45 43 54 2c 20 61 6e 64 20 69 66 20 69 74  ELECT, and if it
10ff0 20 6d 61 74 74 65 72 73 20 0a 20 20 2a 2a 20 77   matters .  ** w
11000 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68  hether or not th
11010 65 20 53 45 4c 45 43 54 20 72 65 73 75 6c 74 20  e SELECT result 
11020 63 6f 6e 74 61 69 6e 73 20 4e 55 4c 4c 20 76 61  contains NULL va
11030 6c 75 65 73 2c 20 63 68 65 63 6b 20 77 68 65 74  lues, check whet
11040 68 65 72 0a 20 20 2a 2a 20 6f 72 20 6e 6f 74 20  her.  ** or not 
11050 4e 55 4c 4c 20 69 73 20 61 63 74 75 61 6c 6c 79  NULL is actually
11060 20 70 6f 73 73 69 62 6c 65 20 28 69 74 20 6d 61   possible (it ma
11070 79 20 6e 6f 74 20 62 65 2c 20 66 6f 72 20 65 78  y not be, for ex
11080 61 6d 70 6c 65 2c 20 64 75 65 20 0a 20 20 2a 2a  ample, due .  **
11090 20 74 6f 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6e   to NOT NULL con
110a0 73 74 72 61 69 6e 74 73 20 69 6e 20 74 68 65 20  straints in the 
110b0 73 63 68 65 6d 61 29 2e 20 49 66 20 6e 6f 20 4e  schema). If no N
110c0 55 4c 4c 20 76 61 6c 75 65 73 20 61 72 65 20 70  ULL values are p
110d0 6f 73 73 69 62 6c 65 2c 0a 20 20 2a 2a 20 73 65  ossible,.  ** se
110e0 74 20 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 74  t prRhsHasNull t
110f0 6f 20 30 20 62 65 66 6f 72 65 20 63 6f 6e 74 69  o 0 before conti
11100 6e 75 69 6e 67 2e 20 20 2a 2f 0a 20 20 69 66 28  nuing.  */.  if(
11110 20 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 26 26   prRhsHasNull &&
11120 20 28 70 58 2d 3e 66 6c 61 67 73 20 26 20 45 50   (pX->flags & EP
11130 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20  _xIsSelect) ){. 
11140 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 45 78     int i;.    Ex
11150 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 3d  prList *pEList =
11160 20 70 58 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e   pX->x.pSelect->
11170 70 45 4c 69 73 74 3b 0a 20 20 20 20 66 6f 72 28  pEList;.    for(
11180 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e  i=0; i<pEList->n
11190 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
111a0 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
111b0 72 43 61 6e 42 65 4e 75 6c 6c 28 70 45 4c 69 73  rCanBeNull(pELis
111c0 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20 29  t->a[i].pExpr) )
111d0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
111e0 20 20 69 66 28 20 69 3d 3d 70 45 4c 69 73 74 2d    if( i==pEList-
111f0 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20  >nExpr ){.      
11200 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 3d 20 30  prRhsHasNull = 0
11210 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
11220 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
11230 66 20 61 6e 20 65 78 69 73 74 69 6e 67 20 74 61  f an existing ta
11240 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 63 61 6e  ble or index can
11250 20 62 65 20 75 73 65 64 20 74 6f 0a 20 20 2a 2a   be used to.  **
11260 20 73 61 74 69 73 66 79 20 74 68 65 20 71 75 65   satisfy the que
11270 72 79 2e 20 20 54 68 69 73 20 69 73 20 70 72 65  ry.  This is pre
11280 66 65 72 61 62 6c 65 20 74 6f 20 67 65 6e 65 72  ferable to gener
11290 61 74 69 6e 67 20 61 20 6e 65 77 20 0a 20 20 2a  ating a new .  *
112a0 2a 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c  * ephemeral tabl
112b0 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  e.  */.  if( pPa
112c0 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 26 26 20  rse->nErr==0 && 
112d0 28 70 20 3d 20 69 73 43 61 6e 64 69 64 61 74 65  (p = isCandidate
112e0 46 6f 72 49 6e 4f 70 74 28 70 58 29 29 21 3d 30  ForInOpt(pX))!=0
112f0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20   ){.    sqlite3 
11300 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
11310 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
11320 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * Database conne
11330 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 54 61 62  ction */.    Tab
11340 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20  le *pTab;       
11350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11360 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 3c 74 61      /* Table <ta
11370 62 6c 65 3e 2e 20 2a 2f 0a 20 20 20 20 69 31 36  ble>. */.    i16
11380 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20 20   iDb;           
11390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
113a0 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
113b0 69 64 78 20 66 6f 72 20 70 54 61 62 20 2a 2f 0a  idx for pTab */.
113c0 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45      ExprList *pE
113d0 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74  List = p->pEList
113e0 3b 0a 20 20 20 20 69 6e 74 20 6e 45 78 70 72 20  ;.    int nExpr 
113f0 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  = pEList->nExpr;
11400 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  ..    assert( p-
11410 3e 70 45 4c 69 73 74 21 3d 30 20 29 3b 20 20 20  >pEList!=0 );   
11420 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65 63            /* Bec
11430 61 75 73 65 20 6f 66 20 69 73 43 61 6e 64 69 64  ause of isCandid
11440 61 74 65 46 6f 72 49 6e 4f 70 74 28 70 29 20 2a  ateForInOpt(p) *
11450 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  /.    assert( p-
11460 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45  >pEList->a[0].pE
11470 78 70 72 21 3d 30 20 29 3b 20 2f 2a 20 42 65 63  xpr!=0 ); /* Bec
11480 61 75 73 65 20 6f 66 20 69 73 43 61 6e 64 69 64  ause of isCandid
11490 61 74 65 46 6f 72 49 6e 4f 70 74 28 70 29 20 2a  ateForInOpt(p) *
114a0 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  /.    assert( p-
114b0 3e 70 53 72 63 21 3d 30 20 29 3b 20 20 20 20 20  >pSrc!=0 );     
114c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65 63            /* Bec
114d0 61 75 73 65 20 6f 66 20 69 73 43 61 6e 64 69 64  ause of isCandid
114e0 61 74 65 46 6f 72 49 6e 4f 70 74 28 70 29 20 2a  ateForInOpt(p) *
114f0 2f 0a 20 20 20 20 70 54 61 62 20 3d 20 70 2d 3e  /.    pTab = p->
11500 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b  pSrc->a[0].pTab;
11510 0a 0a 20 20 20 20 2f 2a 20 43 6f 64 65 20 61 6e  ..    /* Code an
11520 20 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 20   OP_Transaction 
11530 61 6e 64 20 4f 50 5f 54 61 62 6c 65 4c 6f 63 6b  and OP_TableLock
11540 20 66 6f 72 20 3c 74 61 62 6c 65 3e 2e 20 2a 2f   for <table>. */
11550 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74  .    iDb = sqlit
11560 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
11570 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d  db, pTab->pSchem
11580 61 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43  a);.    sqlite3C
11590 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28  odeVerifySchema(
115a0 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20  pParse, iDb);.  
115b0 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f    sqlite3TableLo
115c0 63 6b 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20  ck(pParse, iDb, 
115d0 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70  pTab->tnum, 0, p
115e0 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20  Tab->zName);..  
115f0 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69    /* This functi
11600 6f 6e 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65  on is only calle
11610 64 20 66 72 6f 6d 20 74 77 6f 20 70 6c 61 63 65  d from two place
11620 73 2e 20 49 6e 20 62 6f 74 68 20 63 61 73 65 73  s. In both cases
11630 20 74 68 65 20 76 64 62 65 0a 20 20 20 20 2a 2a   the vdbe.    **
11640 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
11650 6e 20 61 6c 6c 6f 63 61 74 65 64 2e 20 53 6f 20  n allocated. So 
11660 61 73 73 75 6d 65 20 73 71 6c 69 74 65 33 47 65  assume sqlite3Ge
11670 74 56 64 62 65 28 29 20 69 73 20 61 6c 77 61 79  tVdbe() is alway
11680 73 0a 20 20 20 20 2a 2a 20 73 75 63 63 65 73 73  s.    ** success
11690 66 75 6c 20 68 65 72 65 2e 0a 20 20 20 20 2a 2f  ful here..    */
116a0 0a 20 20 20 20 61 73 73 65 72 74 28 76 29 3b 0a  .    assert(v);.
116b0 20 20 20 20 69 66 28 20 6e 45 78 70 72 3d 3d 31      if( nExpr==1
116c0 20 26 26 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d   && pEList->a[0]
116d0 2e 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c  .pExpr->iColumn<
116e0 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  0 ){.      int i
116f0 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33 43 6f  Addr = sqlite3Co
11700 64 65 4f 6e 63 65 28 70 50 61 72 73 65 29 3b 0a  deOnce(pParse);.
11710 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
11720 67 65 28 76 29 3b 0a 0a 20 20 20 20 20 20 73 71  ge(v);..      sq
11730 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 70  lite3OpenTable(p
11740 50 61 72 73 65 2c 20 69 54 61 62 2c 20 69 44 62  Parse, iTab, iDb
11750 2c 20 70 54 61 62 2c 20 4f 50 5f 4f 70 65 6e 52  , pTab, OP_OpenR
11760 65 61 64 29 3b 0a 20 20 20 20 20 20 65 54 79 70  ead);.      eTyp
11770 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 52 4f 57  e = IN_INDEX_ROW
11780 49 44 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74  ID;..      sqlit
11790 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
117a0 2c 20 69 41 64 64 72 29 3b 0a 20 20 20 20 7d 65  , iAddr);.    }e
117b0 6c 73 65 7b 0a 20 20 20 20 20 20 49 6e 64 65 78  lse{.      Index
117c0 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20 20   *pIdx;         
117d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
117e0 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72 69  /* Iterator vari
117f0 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e  able */.      in
11800 74 20 61 66 66 69 6e 69 74 79 5f 6f 6b 20 3d 20  t affinity_ok = 
11810 31 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  1;.      int i;.
11820 0a 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  .      /* Check 
11830 74 68 61 74 20 74 68 65 20 61 66 66 69 6e 69 74  that the affinit
11840 79 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 75  y that will be u
11850 73 65 64 20 74 6f 20 70 65 72 66 6f 72 6d 20 65  sed to perform e
11860 61 63 68 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f  ach .      ** co
11870 6d 70 61 72 69 73 6f 6e 20 69 73 20 74 68 65 20  mparison is the 
11880 73 61 6d 65 20 61 73 20 74 68 65 20 61 66 66 69  same as the affi
11890 6e 69 74 79 20 6f 66 20 65 61 63 68 20 63 6f 6c  nity of each col
118a0 75 6d 6e 2e 20 49 66 0a 20 20 20 20 20 20 2a 2a  umn. If.      **
118b0 20 69 74 20 6e 6f 74 2c 20 69 74 20 69 73 20 6e   it not, it is n
118c0 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 75  ot possible to u
118d0 73 65 20 61 6e 79 20 69 6e 64 65 78 2e 20 20 2a  se any index.  *
118e0 2f 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  /.      for(i=0;
118f0 20 69 3c 6e 45 78 70 72 20 26 26 20 61 66 66 69   i<nExpr && affi
11900 6e 69 74 79 5f 6f 6b 3b 20 69 2b 2b 29 7b 0a 20  nity_ok; i++){. 
11910 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 68         Expr *pLh
11920 73 20 3d 20 73 71 6c 69 74 65 33 56 65 63 74 6f  s = sqlite3Vecto
11930 72 46 69 65 6c 64 53 75 62 65 78 70 72 28 70 58  rFieldSubexpr(pX
11940 2d 3e 70 4c 65 66 74 2c 20 69 29 3b 0a 20 20 20  ->pLeft, i);.   
11950 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20       int iCol = 
11960 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  pEList->a[i].pEx
11970 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20  pr->iColumn;.   
11980 20 20 20 20 20 63 68 61 72 20 69 64 78 61 66 66       char idxaff
11990 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43   = pTab->aCol[iC
119a0 6f 6c 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20  ol].affinity;.  
119b0 20 20 20 20 20 20 63 68 61 72 20 63 6d 70 61 66        char cmpaf
119c0 66 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70 61  f = sqlite3Compa
119d0 72 65 41 66 66 69 6e 69 74 79 28 70 4c 68 73 2c  reAffinity(pLhs,
119e0 20 69 64 78 61 66 66 29 3b 0a 20 20 20 20 20 20   idxaff);.      
119f0 20 20 73 77 69 74 63 68 28 20 63 6d 70 61 66 66    switch( cmpaff
11a00 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 61   ){.          ca
11a10 73 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c  se SQLITE_AFF_BL
11a20 4f 42 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  OB:.            
11a30 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
11a40 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 46 46   case SQLITE_AFF
11a50 5f 54 45 58 54 3a 0a 20 20 20 20 20 20 20 20 20  _TEXT:.         
11a60 20 20 20 61 66 66 69 6e 69 74 79 5f 6f 6b 20 3d     affinity_ok =
11a70 20 28 69 64 78 61 66 66 3d 3d 53 51 4c 49 54 45   (idxaff==SQLITE
11a80 5f 41 46 46 5f 54 45 58 54 29 3b 0a 20 20 20 20  _AFF_TEXT);.    
11a90 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
11aa0 20 20 20 20 20 20 20 20 20 64 65 66 61 75 6c 74           default
11ab0 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 66  :.            af
11ac0 66 69 6e 69 74 79 5f 6f 6b 20 3d 20 73 71 6c 69  finity_ok = sqli
11ad0 74 65 33 49 73 4e 75 6d 65 72 69 63 41 66 66 69  te3IsNumericAffi
11ae0 6e 69 74 79 28 69 64 78 61 66 66 29 3b 0a 20 20  nity(idxaff);.  
11af0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
11b00 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f  .      /* The co
11b10 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
11b20 20 75 73 65 64 20 62 79 20 74 68 65 20 63 6f 6d   used by the com
11b30 70 61 72 69 73 6f 6e 2e 20 49 66 20 61 6e 20 69  parison. If an i
11b40 6e 64 65 78 20 69 73 20 74 6f 0a 20 20 20 20 20  ndex is to.     
11b50 20 2a 2a 20 62 65 20 75 73 65 64 20 69 6e 20 70   ** be used in p
11b60 6c 61 63 65 20 6f 66 20 61 20 74 65 6d 70 2d 74  lace of a temp-t
11b70 61 62 6c 65 2c 20 69 74 20 6d 75 73 74 20 62 65  able, it must be
11b80 20 6f 72 64 65 72 65 64 20 61 63 63 6f 72 64 69   ordered accordi
11b90 6e 67 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 74  ng.      ** to t
11ba0 68 69 73 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  his collation se
11bb0 71 75 65 6e 63 65 2e 20 20 2a 2f 0a 0a 20 20 20  quence.  */..   
11bc0 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62     for(pIdx=pTab
11bd0 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 20 26  ->pIndex; pIdx &
11be0 26 20 65 54 79 70 65 3d 3d 30 20 26 26 20 61 66  & eType==0 && af
11bf0 66 69 6e 69 74 79 5f 6f 6b 3b 20 70 49 64 78 3d  finity_ok; pIdx=
11c00 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pIdx->pNext){.  
11c10 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e        if( pIdx->
11c20 6e 4b 65 79 43 6f 6c 3c 6e 45 78 70 72 20 29 20  nKeyCol<nExpr ) 
11c30 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
11c40 20 20 69 66 28 20 6d 75 73 74 42 65 55 6e 69 71    if( mustBeUniq
11c50 75 65 20 26 26 20 28 70 49 64 78 2d 3e 6e 4b 65  ue && (pIdx->nKe
11c60 79 43 6f 6c 21 3d 6e 45 78 70 72 20 7c 7c 20 21  yCol!=nExpr || !
11c70 49 73 55 6e 69 71 75 65 49 6e 64 65 78 28 70 49  IsUniqueIndex(pI
11c80 64 78 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20  dx)) ){.        
11c90 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
11ca0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 66      }..        f
11cb0 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72 3b  or(i=0; i<nExpr;
11cc0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
11cd0 20 45 78 70 72 20 2a 70 4c 68 73 20 3d 20 73 71   Expr *pLhs = sq
11ce0 6c 69 74 65 33 56 65 63 74 6f 72 46 69 65 6c 64  lite3VectorField
11cf0 53 75 62 65 78 70 72 28 70 58 2d 3e 70 4c 65 66  Subexpr(pX->pLef
11d00 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20  t, i);.         
11d10 20 45 78 70 72 20 2a 70 52 68 73 20 3d 20 70 45   Expr *pRhs = pE
11d20 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
11d30 3b 0a 20 20 20 20 20 20 20 20 20 20 43 6f 6c 6c  ;.          Coll
11d40 53 65 71 20 2a 70 52 65 71 20 3d 20 73 71 6c 69  Seq *pReq = sqli
11d50 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65  te3BinaryCompare
11d60 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
11d70 70 4c 68 73 2c 20 70 52 68 73 29 3b 0a 20 20 20  pLhs, pRhs);.   
11d80 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 0a 20         int j;.. 
11d90 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
11da0 20 70 52 65 71 20 7c 7c 20 70 50 61 72 73 65 2d   pReq || pParse-
11db0 3e 6e 45 72 72 20 29 3b 0a 20 20 20 20 20 20 20  >nErr );.       
11dc0 20 20 20 69 66 28 20 70 52 65 71 3d 3d 30 20 29     if( pReq==0 )
11dd0 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 20   break;..       
11de0 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 45     for(j=0; j<nE
11df0 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  xpr; j++){.     
11e00 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d         if( pIdx-
11e10 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 21 3d 70 52  >aiColumn[j]!=pR
11e20 68 73 2d 3e 69 43 6f 6c 75 6d 6e 20 29 20 63 6f  hs->iColumn ) co
11e30 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
11e40 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78      assert( pIdx
11e50 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 20 29 3b 0a 20  ->azColl[j] );. 
11e60 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73             if( s
11e70 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 52  qlite3StrICmp(pR
11e80 65 71 2d 3e 7a 4e 61 6d 65 2c 20 70 49 64 78 2d  eq->zName, pIdx-
11e90 3e 61 7a 43 6f 6c 6c 5b 6a 5d 29 21 3d 30 20 29  >azColl[j])!=0 )
11ea0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
11eb0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
11ec0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
11ed0 20 20 20 20 69 66 28 20 6a 3d 3d 6e 45 78 70 72      if( j==nExpr
11ee0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
11ef0 20 20 20 20 69 66 28 20 61 69 4d 61 70 20 29 20      if( aiMap ) 
11f00 61 69 4d 61 70 5b 69 5d 20 3d 20 6a 3b 0a 20 20  aiMap[i] = j;.  
11f10 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
11f20 20 69 66 28 20 69 3d 3d 6e 45 78 70 72 20 29 7b   if( i==nExpr ){
11f30 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69  .          int i
11f40 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33 43 6f  Addr = sqlite3Co
11f50 64 65 4f 6e 63 65 28 70 50 61 72 73 65 29 3b 20  deOnce(pParse); 
11f60 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
11f70 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
11f80 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
11f90 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69 54 61  OP_OpenRead, iTa
11fa0 62 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c 20 69  b, pIdx->tnum, i
11fb0 44 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  Db);.          s
11fc0 71 6c 69 74 65 33 56 64 62 65 53 65 74 50 34 4b  qlite3VdbeSetP4K
11fd0 65 79 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70  eyInfo(pParse, p
11fe0 49 64 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Idx);.          
11ff0 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
12000 22 25 73 22 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d  "%s", pIdx->zNam
12010 65 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61  e));.          a
12020 73 73 65 72 74 28 20 49 4e 5f 49 4e 44 45 58 5f  ssert( IN_INDEX_
12030 49 4e 44 45 58 5f 44 45 53 43 20 3d 3d 20 49 4e  INDEX_DESC == IN
12040 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 41 53 43  _INDEX_INDEX_ASC
12050 2b 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  +1 );.          
12060 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58  eType = IN_INDEX
12070 5f 49 4e 44 45 58 5f 41 53 43 20 2b 20 70 49 64  _INDEX_ASC + pId
12080 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 30 5d  x->aSortOrder[0]
12090 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ;..          if(
120a0 20 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 29 7b   prRhsHasNull ){
120b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 72  .            *pr
120c0 52 68 73 48 61 73 4e 75 6c 6c 20 3d 20 2b 2b 70  RhsHasNull = ++p
120d0 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 23 69 66  Parse->nMem;.#if
120e0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
120f0 45 5f 43 4f 4c 55 4d 4e 5f 55 53 45 44 5f 4d 41  E_COLUMN_USED_MA
12100 53 4b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  SK.            i
12110 36 34 20 6d 61 73 6b 20 3d 20 28 31 3c 3c 6e 45  64 mask = (1<<nE
12120 78 70 72 29 2d 31 3b 0a 20 20 20 20 20 20 20 20  xpr)-1;.        
12130 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
12140 64 64 4f 70 34 44 75 70 38 28 76 2c 20 4f 50 5f  ddOp4Dup8(v, OP_
12150 43 6f 6c 75 6d 6e 73 55 73 65 64 2c 20 0a 20 20  ColumnsUsed, .  
12160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 54                iT
12170 61 62 2c 20 30 2c 20 30 2c 20 28 75 38 2a 29 26  ab, 0, 0, (u8*)&
12180 6d 61 73 6b 2c 20 50 34 5f 49 4e 54 36 34 29 3b  mask, P4_INT64);
12190 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
121a0 20 20 20 20 69 66 28 20 6e 45 78 70 72 3d 3d 31      if( nExpr==1
121b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
121c0 20 20 73 71 6c 69 74 65 33 53 65 74 48 61 73 4e    sqlite3SetHasN
121d0 75 6c 6c 46 6c 61 67 28 76 2c 20 69 54 61 62 2c  ullFlag(v, iTab,
121e0 20 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c 29 3b   *prRhsHasNull);
121f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
12200 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
12210 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
12220 4a 75 6d 70 48 65 72 65 28 76 2c 20 69 41 64 64  JumpHere(v, iAdd
12230 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  r);.        }.  
12240 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
12250 0a 20 20 2f 2a 20 49 66 20 6e 6f 20 70 72 65 65  .  /* If no pree
12260 78 69 73 74 69 6e 67 20 69 6e 64 65 78 20 69 73  xisting index is
12270 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 74   available for t
12280 68 65 20 49 4e 20 63 6c 61 75 73 65 0a 20 20 2a  he IN clause.  *
12290 2a 20 61 6e 64 20 49 4e 5f 49 4e 44 45 58 5f 4e  * and IN_INDEX_N
122a0 4f 4f 50 20 69 73 20 61 6e 20 61 6c 6c 6f 77 65  OOP is an allowe
122b0 64 20 72 65 70 6c 79 0a 20 20 2a 2a 20 61 6e 64  d reply.  ** and
122c0 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 65 20   the RHS of the 
122d0 49 4e 20 6f 70 65 72 61 74 6f 72 20 69 73 20 61  IN operator is a
122e0 20 6c 69 73 74 2c 20 6e 6f 74 20 61 20 73 75 62   list, not a sub
122f0 71 75 65 72 79 0a 20 20 2a 2a 20 61 6e 64 20 74  query.  ** and t
12300 68 65 20 52 48 53 20 69 73 20 6e 6f 74 20 63 6f  he RHS is not co
12310 6e 73 74 61 6e 74 20 6f 72 20 68 61 73 20 74 77  nstant or has tw
12320 6f 20 6f 72 20 66 65 77 65 72 20 74 65 72 6d 73  o or fewer terms
12330 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 69 74 20 69  ,.  ** then it i
12340 73 20 6e 6f 74 20 77 6f 72 74 68 20 63 72 65 61  s not worth crea
12350 74 69 6e 67 20 61 6e 20 65 70 68 65 6d 65 72 61  ting an ephemera
12360 6c 20 74 61 62 6c 65 20 74 6f 20 65 76 61 6c 75  l table to evalu
12370 61 74 65 0a 20 20 2a 2a 20 74 68 65 20 49 4e 20  ate.  ** the IN 
12380 6f 70 65 72 61 74 6f 72 20 73 6f 20 72 65 74 75  operator so retu
12390 72 6e 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50  rn IN_INDEX_NOOP
123a0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79  ..  */.  if( eTy
123b0 70 65 3d 3d 30 0a 20 20 20 26 26 20 28 69 6e 46  pe==0.   && (inF
123c0 6c 61 67 73 20 26 20 49 4e 5f 49 4e 44 45 58 5f  lags & IN_INDEX_
123d0 4e 4f 4f 50 5f 4f 4b 29 0a 20 20 20 26 26 20 21  NOOP_OK).   && !
123e0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
123f0 70 58 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pX, EP_xIsSelect
12400 29 0a 20 20 20 26 26 20 28 21 73 71 6c 69 74 65  ).   && (!sqlite
12410 33 49 6e 52 68 73 49 73 43 6f 6e 73 74 61 6e 74  3InRhsIsConstant
12420 28 70 58 29 20 7c 7c 20 70 58 2d 3e 78 2e 70 4c  (pX) || pX->x.pL
12430 69 73 74 2d 3e 6e 45 78 70 72 3c 3d 32 29 0a 20  ist->nExpr<=2). 
12440 20 29 7b 0a 20 20 20 20 65 54 79 70 65 20 3d 20   ){.    eType = 
12450 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 3b 0a 20  IN_INDEX_NOOP;. 
12460 20 7d 0a 0a 20 20 69 66 28 20 65 54 79 70 65 3d   }..  if( eType=
12470 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 75  =0 ){.    /* Cou
12480 6c 64 20 6e 6f 74 20 66 69 6e 64 20 61 6e 20 65  ld not find an e
12490 78 69 73 74 69 6e 67 20 74 61 62 6c 65 20 6f 72  xisting table or
124a0 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20 61 73   index to use as
124b0 20 74 68 65 20 52 48 53 20 62 2d 74 72 65 65 2e   the RHS b-tree.
124c0 0a 20 20 20 20 2a 2a 20 57 65 20 77 69 6c 6c 20  .    ** We will 
124d0 68 61 76 65 20 74 6f 20 67 65 6e 65 72 61 74 65  have to generate
124e0 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 74 61   an ephemeral ta
124f0 62 6c 65 20 74 6f 20 64 6f 20 74 68 65 20 6a 6f  ble to do the jo
12500 62 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 75 33  b..    */.    u3
12510 32 20 73 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f  2 savedNQueryLoo
12520 70 20 3d 20 70 50 61 72 73 65 2d 3e 6e 51 75 65  p = pParse->nQue
12530 72 79 4c 6f 6f 70 3b 0a 20 20 20 20 69 6e 74 20  ryLoop;.    int 
12540 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20 3d 20 30  rMayHaveNull = 0
12550 3b 0a 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e  ;.    eType = IN
12560 5f 49 4e 44 45 58 5f 45 50 48 3b 0a 20 20 20 20  _INDEX_EPH;.    
12570 69 66 28 20 69 6e 46 6c 61 67 73 20 26 20 49 4e  if( inFlags & IN
12580 5f 49 4e 44 45 58 5f 4c 4f 4f 50 20 29 7b 0a 20  _INDEX_LOOP ){. 
12590 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 51 75       pParse->nQu
125a0 65 72 79 4c 6f 6f 70 20 3d 20 30 3b 0a 20 20 20  eryLoop = 0;.   
125b0 20 20 20 69 66 28 20 70 58 2d 3e 70 4c 65 66 74     if( pX->pLeft
125c0 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 26 26 20 21  ->iColumn<0 && !
125d0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
125e0 70 58 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pX, EP_xIsSelect
125f0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 65 54 79  ) ){.        eTy
12600 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 52 4f  pe = IN_INDEX_RO
12610 57 49 44 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  WID;.      }.   
12620 20 7d 65 6c 73 65 20 69 66 28 20 70 72 52 68 73   }else if( prRhs
12630 48 61 73 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20  HasNull ){.     
12640 20 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 3d   *prRhsHasNull =
12650 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20 3d 20   rMayHaveNull = 
12660 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
12670 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
12680 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70  3CodeSubselect(p
12690 50 61 72 73 65 2c 20 70 58 2c 20 72 4d 61 79 48  Parse, pX, rMayH
126a0 61 76 65 4e 75 6c 6c 2c 20 65 54 79 70 65 3d 3d  aveNull, eType==
126b0 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 29 3b  IN_INDEX_ROWID);
126c0 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 51 75  .    pParse->nQu
126d0 65 72 79 4c 6f 6f 70 20 3d 20 73 61 76 65 64 4e  eryLoop = savedN
126e0 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 7d 65 6c  QueryLoop;.  }el
126f0 73 65 7b 0a 20 20 20 20 70 58 2d 3e 69 54 61 62  se{.    pX->iTab
12700 6c 65 20 3d 20 69 54 61 62 3b 0a 20 20 7d 0a 0a  le = iTab;.  }..
12710 20 20 69 66 28 20 61 69 4d 61 70 20 26 26 20 65    if( aiMap && e
12720 54 79 70 65 21 3d 49 4e 5f 49 4e 44 45 58 5f 49  Type!=IN_INDEX_I
12730 4e 44 45 58 5f 41 53 43 20 26 26 20 65 54 79 70  NDEX_ASC && eTyp
12740 65 21 3d 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45  e!=IN_INDEX_INDE
12750 58 5f 44 45 53 43 20 29 7b 0a 20 20 20 20 69 6e  X_DESC ){.    in
12760 74 20 69 2c 20 6e 3b 0a 20 20 20 20 6e 20 3d 20  t i, n;.    n = 
12770 73 71 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f  sqlite3ExprVecto
12780 72 53 69 7a 65 28 70 58 2d 3e 70 4c 65 66 74 29  rSize(pX->pLeft)
12790 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
127a0 3c 6e 3b 20 69 2b 2b 29 20 61 69 4d 61 70 5b 69  <n; i++) aiMap[i
127b0 5d 20 3d 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74  ] = i;.  }.  ret
127c0 75 72 6e 20 65 54 79 70 65 3b 0a 7d 0a 23 65 6e  urn eType;.}.#en
127d0 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  dif..#ifndef SQL
127e0 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
127f0 59 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74  Y./*.** Argument
12800 20 70 45 78 70 72 20 69 73 20 61 6e 20 28 3f 2c   pExpr is an (?,
12810 20 3f 2e 2e 2e 29 20 49 4e 28 2e 2e 2e 29 20 65   ?...) IN(...) e
12820 78 70 72 65 73 73 69 6f 6e 2e 20 54 68 69 73 20  xpression. This 
12830 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c  .** function all
12840 6f 63 61 74 65 73 20 61 6e 64 20 72 65 74 75 72  ocates and retur
12850 6e 73 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61  ns a nul-termina
12860 74 65 64 20 73 74 72 69 6e 67 20 63 6f 6e 74 61  ted string conta
12870 69 6e 69 6e 67 20 0a 2a 2a 20 74 68 65 20 61 66  ining .** the af
12880 66 69 6e 69 74 69 65 73 20 74 6f 20 62 65 20 75  finities to be u
12890 73 65 64 20 66 6f 72 20 65 61 63 68 20 63 6f 6c  sed for each col
128a0 75 6d 6e 20 6f 66 20 74 68 65 20 63 6f 6d 70 61  umn of the compa
128b0 72 69 73 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 74 20  rison..**.** It 
128c0 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62  is the responsib
128d0 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c  ility of the cal
128e0 6c 65 72 20 74 6f 20 65 6e 73 75 72 65 20 74 68  ler to ensure th
128f0 61 74 20 74 68 65 20 72 65 74 75 72 6e 65 64 0a  at the returned.
12900 2a 2a 20 73 74 72 69 6e 67 20 69 73 20 65 76 65  ** string is eve
12910 6e 74 75 61 6c 6c 79 20 66 72 65 65 64 20 75 73  ntually freed us
12920 69 6e 67 20 73 71 6c 69 74 65 33 44 62 46 72 65  ing sqlite3DbFre
12930 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  e()..*/.static c
12940 68 61 72 20 2a 65 78 70 72 49 4e 41 66 66 69 6e  har *exprINAffin
12950 69 74 79 28 50 61 72 73 65 20 2a 70 50 61 72 73  ity(Parse *pPars
12960 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  e, Expr *pExpr){
12970 0a 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d  .  Expr *pLeft =
12980 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20   pExpr->pLeft;. 
12990 20 69 6e 74 20 6e 56 61 6c 20 3d 20 73 71 6c 69   int nVal = sqli
129a0 74 65 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a  te3ExprVectorSiz
129b0 65 28 70 4c 65 66 74 29 3b 0a 20 20 53 65 6c 65  e(pLeft);.  Sele
129c0 63 74 20 2a 70 53 65 6c 65 63 74 20 3d 20 28 70  ct *pSelect = (p
129d0 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50  Expr->flags & EP
129e0 5f 78 49 73 53 65 6c 65 63 74 29 20 3f 20 70 45  _xIsSelect) ? pE
129f0 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 20 3a  xpr->x.pSelect :
12a00 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 52 65 74   0;.  char *zRet
12a10 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  ;..  assert( pEx
12a20 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 29 3b  pr->op==TK_IN );
12a30 0a 20 20 7a 52 65 74 20 3d 20 73 71 6c 69 74 65  .  zRet = sqlite
12a40 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 50  3DbMallocZero(pP
12a50 61 72 73 65 2d 3e 64 62 2c 20 6e 56 61 6c 2b 31  arse->db, nVal+1
12a60 29 3b 0a 20 20 69 66 28 20 7a 52 65 74 20 29 7b  );.  if( zRet ){
12a70 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
12a80 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 61 6c 3b  for(i=0; i<nVal;
12a90 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70   i++){.      Exp
12aa0 72 20 2a 70 41 20 3d 20 73 71 6c 69 74 65 33 56  r *pA = sqlite3V
12ab0 65 63 74 6f 72 46 69 65 6c 64 53 75 62 65 78 70  ectorFieldSubexp
12ac0 72 28 70 4c 65 66 74 2c 20 69 29 3b 0a 20 20 20  r(pLeft, i);.   
12ad0 20 20 20 63 68 61 72 20 61 20 3d 20 73 71 6c 69     char a = sqli
12ae0 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28  te3ExprAffinity(
12af0 70 41 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  pA);.      if( p
12b00 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20  Select ){.      
12b10 20 20 7a 52 65 74 5b 69 5d 20 3d 20 73 71 6c 69    zRet[i] = sqli
12b20 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69  te3CompareAffini
12b30 74 79 28 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69  ty(pSelect->pELi
12b40 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20  st->a[i].pExpr, 
12b50 61 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  a);.      }else{
12b60 0a 20 20 20 20 20 20 20 20 7a 52 65 74 5b 69 5d  .        zRet[i]
12b70 20 3d 20 61 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = a;.      }.  
12b80 20 20 7d 0a 20 20 20 20 7a 52 65 74 5b 6e 56 61    }.    zRet[nVa
12b90 6c 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 7d 0a 20  l] = '\0';.  }. 
12ba0 20 72 65 74 75 72 6e 20 7a 52 65 74 3b 0a 7d 0a   return zRet;.}.
12bb0 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
12bc0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
12bd0 55 45 52 59 0a 2f 2a 0a 2a 2a 20 4c 6f 61 64 20  UERY./*.** Load 
12be0 74 68 65 20 50 61 72 73 65 20 6f 62 6a 65 63 74  the Parse object
12bf0 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66   passed as the f
12c00 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 77 69  irst argument wi
12c10 74 68 20 61 6e 20 65 72 72 6f 72 20 0a 2a 2a 20  th an error .** 
12c20 6d 65 73 73 61 67 65 20 6f 66 20 74 68 65 20 66  message of the f
12c30 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 73 75  orm:.**.**   "su
12c40 62 2d 73 65 6c 65 63 74 20 72 65 74 75 72 6e 73  b-select returns
12c50 20 4e 20 63 6f 6c 75 6d 6e 73 20 2d 20 65 78 70   N columns - exp
12c60 65 63 74 65 64 20 4d 22 0a 2a 2f 20 20 20 0a 76  ected M".*/   .v
12c70 6f 69 64 20 73 71 6c 69 74 65 33 53 75 62 73 65  oid sqlite3Subse
12c80 6c 65 63 74 45 72 72 6f 72 28 50 61 72 73 65 20  lectError(Parse 
12c90 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 6e 41 63  *pParse, int nAc
12ca0 74 75 61 6c 2c 20 69 6e 74 20 6e 45 78 70 65 63  tual, int nExpec
12cb0 74 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  t){.  const char
12cc0 20 2a 7a 46 6d 74 20 3d 20 22 73 75 62 2d 73 65   *zFmt = "sub-se
12cd0 6c 65 63 74 20 72 65 74 75 72 6e 73 20 25 64 20  lect returns %d 
12ce0 63 6f 6c 75 6d 6e 73 20 2d 20 65 78 70 65 63 74  columns - expect
12cf0 65 64 20 25 64 22 3b 0a 20 20 73 71 6c 69 74 65  ed %d";.  sqlite
12d00 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
12d10 2c 20 7a 46 6d 74 2c 20 6e 41 63 74 75 61 6c 2c  , zFmt, nActual,
12d20 20 6e 45 78 70 65 63 74 29 3b 0a 7d 0a 23 65 6e   nExpect);.}.#en
12d30 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  dif../*.** Gener
12d40 61 74 65 20 63 6f 64 65 20 66 6f 72 20 73 63 61  ate code for sca
12d50 6c 61 72 20 73 75 62 71 75 65 72 69 65 73 20 75  lar subqueries u
12d60 73 65 64 20 61 73 20 61 20 73 75 62 71 75 65 72  sed as a subquer
12d70 79 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 45 58  y expression, EX
12d80 49 53 54 53 2c 0a 2a 2a 20 6f 72 20 49 4e 20 6f  ISTS,.** or IN o
12d90 70 65 72 61 74 6f 72 73 2e 20 20 45 78 61 6d 70  perators.  Examp
12da0 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28  les:.**.**     (
12db0 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 62 29  SELECT a FROM b)
12dc0 20 20 20 20 20 20 20 20 20 20 2d 2d 20 73 75 62            -- sub
12dd0 71 75 65 72 79 0a 2a 2a 20 20 20 20 20 45 58 49  query.**     EXI
12de0 53 54 53 20 28 53 45 4c 45 43 54 20 61 20 46 52  STS (SELECT a FR
12df0 4f 4d 20 62 29 20 20 20 2d 2d 20 45 58 49 53 54  OM b)   -- EXIST
12e00 53 20 73 75 62 71 75 65 72 79 0a 2a 2a 20 20 20  S subquery.**   
12e10 20 20 78 20 49 4e 20 28 34 2c 35 2c 31 31 29 20    x IN (4,5,11) 
12e20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20               -- 
12e30 49 4e 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68  IN operator with
12e40 20 6c 69 73 74 20 6f 6e 20 72 69 67 68 74 2d 68   list on right-h
12e50 61 6e 64 20 73 69 64 65 0a 2a 2a 20 20 20 20 20  and side.**     
12e60 78 20 49 4e 20 28 53 45 4c 45 43 54 20 61 20 46  x IN (SELECT a F
12e70 52 4f 4d 20 62 29 20 20 20 20 20 2d 2d 20 49 4e  ROM b)     -- IN
12e80 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68 20 73   operator with s
12e90 75 62 71 75 65 72 79 20 6f 6e 20 74 68 65 20 72  ubquery on the r
12ea0 69 67 68 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  ight.**.** The p
12eb0 45 78 70 72 20 70 61 72 61 6d 65 74 65 72 20 64  Expr parameter d
12ec0 65 73 63 72 69 62 65 73 20 74 68 65 20 65 78 70  escribes the exp
12ed0 72 65 73 73 69 6f 6e 20 74 68 61 74 20 63 6f 6e  ression that con
12ee0 74 61 69 6e 73 20 74 68 65 20 49 4e 0a 2a 2a 20  tains the IN.** 
12ef0 6f 70 65 72 61 74 6f 72 20 6f 72 20 73 75 62 71  operator or subq
12f00 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  uery..**.** If p
12f10 61 72 61 6d 65 74 65 72 20 69 73 52 6f 77 69 64  arameter isRowid
12f20 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
12f30 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45  en expression pE
12f40 78 70 72 20 69 73 20 67 75 61 72 61 6e 74 65 65  xpr is guarantee
12f50 64 0a 2a 2a 20 74 6f 20 62 65 20 6f 66 20 74 68  d.** to be of th
12f60 65 20 66 6f 72 6d 20 22 3c 72 6f 77 69 64 3e 20  e form "<rowid> 
12f70 49 4e 20 28 3f 2c 20 3f 2c 20 3f 29 22 2c 20 77  IN (?, ?, ?)", w
12f80 68 65 72 65 20 3c 72 6f 77 69 64 3e 20 69 73 20  here <rowid> is 
12f90 61 20 72 65 66 65 72 65 6e 63 65 0a 2a 2a 20 74  a reference.** t
12fa0 6f 20 73 6f 6d 65 20 69 6e 74 65 67 65 72 20 6b  o some integer k
12fb0 65 79 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 20 74  ey column of a t
12fc0 61 62 6c 65 20 42 2d 54 72 65 65 2e 20 49 6e 20  able B-Tree. In 
12fd0 74 68 69 73 20 63 61 73 65 2c 20 75 73 65 20 61  this case, use a
12fe0 6e 0a 2a 2a 20 69 6e 74 6b 65 79 20 42 2d 54 72  n.** intkey B-Tr
12ff0 65 65 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20  ee to store the 
13000 73 65 74 20 6f 66 20 49 4e 28 2e 2e 2e 29 20 76  set of IN(...) v
13010 61 6c 75 65 73 20 69 6e 73 74 65 61 64 20 6f 66  alues instead of
13020 20 74 68 65 20 75 73 75 61 6c 0a 2a 2a 20 28 73   the usual.** (s
13030 6c 6f 77 65 72 29 20 76 61 72 69 61 62 6c 65 20  lower) variable 
13040 6c 65 6e 67 74 68 20 6b 65 79 73 20 42 2d 54 72  length keys B-Tr
13050 65 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72 4d 61  ee..**.** If rMa
13060 79 48 61 76 65 4e 75 6c 6c 20 69 73 20 6e 6f 6e  yHaveNull is non
13070 2d 7a 65 72 6f 2c 20 74 68 61 74 20 6d 65 61 6e  -zero, that mean
13080 73 20 74 68 61 74 20 74 68 65 20 6f 70 65 72 61  s that the opera
13090 74 69 6f 6e 20 69 73 20 61 6e 20 49 4e 0a 2a 2a  tion is an IN.**
130a0 20 28 6e 6f 74 20 61 20 53 45 4c 45 43 54 20 6f   (not a SELECT o
130b0 72 20 45 58 49 53 54 53 29 20 61 6e 64 20 74 68  r EXISTS) and th
130c0 61 74 20 74 68 65 20 52 48 53 20 6d 69 67 68 74  at the RHS might
130d0 20 63 6f 6e 74 61 69 6e 73 20 4e 55 4c 4c 73 2e   contains NULLs.
130e0 0a 2a 2a 20 41 6c 6c 20 74 68 69 73 20 72 6f 75  .** All this rou
130f0 74 69 6e 65 20 64 6f 65 73 20 69 73 20 69 6e 69  tine does is ini
13100 74 69 61 6c 69 7a 65 20 74 68 65 20 72 65 67 69  tialize the regi
13110 73 74 65 72 20 67 69 76 65 6e 20 62 79 20 72 4d  ster given by rM
13120 61 79 48 61 76 65 4e 75 6c 6c 0a 2a 2a 20 74 6f  ayHaveNull.** to
13130 20 4e 55 4c 4c 2e 20 20 43 61 6c 6c 69 6e 67 20   NULL.  Calling 
13140 72 6f 75 74 69 6e 65 73 20 77 69 6c 6c 20 74 61  routines will ta
13150 6b 65 20 63 61 72 65 20 6f 66 20 63 68 61 6e 67  ke care of chang
13160 69 6e 67 20 74 68 69 73 20 72 65 67 69 73 74 65  ing this registe
13170 72 0a 2a 2a 20 76 61 6c 75 65 20 74 6f 20 6e 6f  r.** value to no
13180 6e 2d 4e 55 4c 4c 20 69 66 20 74 68 65 20 52 48  n-NULL if the RH
13190 53 20 69 73 20 4e 55 4c 4c 2d 66 72 65 65 2e 0a  S is NULL-free..
131a0 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 53 45 4c 45  **.** For a SELE
131b0 43 54 20 6f 72 20 45 58 49 53 54 53 20 6f 70 65  CT or EXISTS ope
131c0 72 61 74 6f 72 2c 20 72 65 74 75 72 6e 20 74 68  rator, return th
131d0 65 20 72 65 67 69 73 74 65 72 20 74 68 61 74 20  e register that 
131e0 68 6f 6c 64 73 20 74 68 65 0a 2a 2a 20 72 65 73  holds the.** res
131f0 75 6c 74 2e 20 20 46 6f 72 20 61 20 6d 75 6c 74  ult.  For a mult
13200 69 2d 63 6f 6c 75 6d 6e 20 53 45 4c 45 43 54 2c  i-column SELECT,
13210 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 73   the result is s
13220 74 6f 72 65 64 20 69 6e 20 61 20 63 6f 6e 74 69  tored in a conti
13230 67 75 6f 75 73 0a 2a 2a 20 61 72 72 61 79 20 6f  guous.** array o
13240 66 20 72 65 67 69 73 74 65 72 73 20 61 6e 64 20  f registers and 
13250 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
13260 20 69 73 20 74 68 65 20 72 65 67 69 73 74 65 72   is the register
13270 20 6f 66 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73   of the left-mos
13280 74 0a 2a 2a 20 72 65 73 75 6c 74 20 63 6f 6c 75  t.** result colu
13290 6d 6e 2e 20 20 52 65 74 75 72 6e 20 30 20 66 6f  mn.  Return 0 fo
132a0 72 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 20 6f  r IN operators o
132b0 72 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  r if an error oc
132c0 63 75 72 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  curs..*/.#ifndef
132d0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
132e0 51 55 45 52 59 0a 69 6e 74 20 73 71 6c 69 74 65  QUERY.int sqlite
132f0 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 0a  3CodeSubselect(.
13300 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
13310 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
13320 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
13330 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20    Expr *pExpr,  
13340 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
13350 20 49 4e 2c 20 53 45 4c 45 43 54 2c 20 6f 72 20   IN, SELECT, or 
13360 45 58 49 53 54 53 20 6f 70 65 72 61 74 6f 72 20  EXISTS operator 
13370 2a 2f 0a 20 20 69 6e 74 20 72 48 61 73 4e 75 6c  */.  int rHasNul
13380 6c 46 6c 61 67 2c 20 20 20 20 20 20 20 2f 2a 20  lFlag,       /* 
13390 52 65 67 69 73 74 65 72 20 74 68 61 74 20 72 65  Register that re
133a0 63 6f 72 64 73 20 77 68 65 74 68 65 72 20 4e 55  cords whether NU
133b0 4c 4c 73 20 65 78 69 73 74 20 69 6e 20 52 48 53  LLs exist in RHS
133c0 20 2a 2f 0a 20 20 69 6e 74 20 69 73 52 6f 77 69   */.  int isRowi
133d0 64 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  d             /*
133e0 20 49 66 20 74 72 75 65 2c 20 4c 48 53 20 6f 66   If true, LHS of
133f0 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 69 73 20   IN operator is 
13400 61 20 72 6f 77 69 64 20 2a 2f 0a 29 7b 0a 20 20  a rowid */.){.  
13410 69 6e 74 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63  int jmpIfDynamic
13420 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20 20   = -1;          
13430 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
13440 6e 65 2d 74 69 6d 65 20 74 65 73 74 20 61 64 64  ne-time test add
13450 72 65 73 73 20 2a 2f 0a 20 20 69 6e 74 20 72 52  ress */.  int rR
13460 65 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  eg = 0;         
13470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13480 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 73 74    /* Register st
13490 6f 72 69 6e 67 20 72 65 73 75 6c 74 69 6e 67 20  oring resulting 
134a0 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73  */.  Vdbe *v = s
134b0 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
134c0 61 72 73 65 29 3b 0a 20 20 69 66 28 20 4e 45 56  arse);.  if( NEV
134d0 45 52 28 76 3d 3d 30 29 20 29 20 72 65 74 75 72  ER(v==0) ) retur
134e0 6e 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  n 0;.  sqlite3Ex
134f0 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72  prCachePush(pPar
13500 73 65 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 65  se);..  /* The e
13510 76 61 6c 75 61 74 69 6f 6e 20 6f 66 20 74 68 65  valuation of the
13520 20 49 4e 2f 45 58 49 53 54 53 2f 53 45 4c 45 43   IN/EXISTS/SELEC
13530 54 20 6d 75 73 74 20 62 65 20 72 65 70 65 61 74  T must be repeat
13540 65 64 20 65 76 65 72 79 20 74 69 6d 65 20 69 74  ed every time it
13550 0a 20 20 2a 2a 20 69 73 20 65 6e 63 6f 75 6e 74  .  ** is encount
13560 65 72 65 64 20 69 66 20 61 6e 79 20 6f 66 20 74  ered if any of t
13570 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20  he following is 
13580 74 72 75 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  true:.  **.  ** 
13590 20 20 20 2a 20 20 54 68 65 20 72 69 67 68 74 2d     *  The right-
135a0 68 61 6e 64 20 73 69 64 65 20 69 73 20 61 20 63  hand side is a c
135b0 6f 72 72 65 6c 61 74 65 64 20 73 75 62 71 75 65  orrelated subque
135c0 72 79 0a 20 20 2a 2a 20 20 20 20 2a 20 20 54 68  ry.  **    *  Th
135d0 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64  e right-hand sid
135e0 65 20 69 73 20 61 6e 20 65 78 70 72 65 73 73 69  e is an expressi
135f0 6f 6e 20 6c 69 73 74 20 63 6f 6e 74 61 69 6e 69  on list containi
13600 6e 67 20 76 61 72 69 61 62 6c 65 73 0a 20 20 2a  ng variables.  *
13610 2a 20 20 20 20 2a 20 20 57 65 20 61 72 65 20 69  *    *  We are i
13620 6e 73 69 64 65 20 61 20 74 72 69 67 67 65 72 0a  nside a trigger.
13630 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 61 6c 6c    **.  ** If all
13640 20 6f 66 20 74 68 65 20 61 62 6f 76 65 20 61 72   of the above ar
13650 65 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 77 65  e false, then we
13660 20 63 61 6e 20 72 75 6e 20 74 68 69 73 20 63 6f   can run this co
13670 64 65 20 6a 75 73 74 20 6f 6e 63 65 0a 20 20 2a  de just once.  *
13680 2a 20 73 61 76 65 20 74 68 65 20 72 65 73 75 6c  * save the resul
13690 74 73 2c 20 61 6e 64 20 72 65 75 73 65 20 74 68  ts, and reuse th
136a0 65 20 73 61 6d 65 20 72 65 73 75 6c 74 20 6f 6e  e same result on
136b0 20 73 75 62 73 65 71 75 65 6e 74 20 69 6e 76 6f   subsequent invo
136c0 63 61 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20  cations..  */.  
136d0 69 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  if( !ExprHasProp
136e0 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 56  erty(pExpr, EP_V
136f0 61 72 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20  arSelect) ){.   
13700 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63 20 3d 20   jmpIfDynamic = 
13710 73 71 6c 69 74 65 33 43 6f 64 65 4f 6e 63 65 28  sqlite3CodeOnce(
13720 70 50 61 72 73 65 29 3b 20 56 64 62 65 43 6f 76  pParse); VdbeCov
13730 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 0a 23  erage(v);.  }..#
13740 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
13750 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 69 66 28  IT_EXPLAIN.  if(
13760 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e   pParse->explain
13770 3d 3d 32 20 29 7b 0a 20 20 20 20 63 68 61 72 20  ==2 ){.    char 
13780 2a 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d  *zMsg = sqlite3M
13790 50 72 69 6e 74 66 28 70 50 61 72 73 65 2d 3e 64  Printf(pParse->d
137a0 62 2c 20 22 45 58 45 43 55 54 45 20 25 73 25 73  b, "EXECUTE %s%s
137b0 20 53 55 42 51 55 45 52 59 20 25 64 22 2c 0a 20   SUBQUERY %d",. 
137c0 20 20 20 20 20 20 20 6a 6d 70 49 66 44 79 6e 61         jmpIfDyna
137d0 6d 69 63 3e 3d 30 3f 22 22 3a 22 43 4f 52 52 45  mic>=0?"":"CORRE
137e0 4c 41 54 45 44 20 22 2c 0a 20 20 20 20 20 20 20  LATED ",.       
137f0 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49   pExpr->op==TK_I
13800 4e 3f 22 4c 49 53 54 22 3a 22 53 43 41 4c 41 52  N?"LIST":"SCALAR
13810 22 2c 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  ",.        pPars
13820 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64  e->iNextSelectId
13830 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69  .    );.    sqli
13840 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
13850 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 70 50 61   OP_Explain, pPa
13860 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20  rse->iSelectId, 
13870 30 2c 20 30 2c 20 7a 4d 73 67 2c 20 50 34 5f 44  0, 0, zMsg, P4_D
13880 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 23 65 6e  YNAMIC);.  }.#en
13890 64 69 66 0a 0a 20 20 73 77 69 74 63 68 28 20 70  dif..  switch( p
138a0 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  Expr->op ){.    
138b0 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20  case TK_IN: {.  
138c0 20 20 20 20 69 6e 74 20 61 64 64 72 3b 20 20 20      int addr;   
138d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
138e0 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 4f 50  /* Address of OP
138f0 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69  _OpenEphemeral i
13900 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20  nstruction */.  
13910 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20      Expr *pLeft 
13920 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 20  = pExpr->pLeft; 
13930 2f 2a 20 74 68 65 20 4c 48 53 20 6f 66 20 74 68  /* the LHS of th
13940 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f  e IN operator */
13950 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a  .      KeyInfo *
13960 70 4b 65 79 49 6e 66 6f 20 3d 20 30 3b 20 20 20  pKeyInfo = 0;   
13970 20 20 20 2f 2a 20 4b 65 79 20 69 6e 66 6f 72 6d     /* Key inform
13980 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69  ation */.      i
13990 6e 74 20 6e 56 61 6c 3b 20 20 20 20 20 20 20 20  nt nVal;        
139a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
139b0 7a 65 20 6f 66 20 76 65 63 74 6f 72 20 70 4c 65  ze of vector pLe
139c0 66 74 20 2a 2f 0a 20 20 20 20 20 20 0a 20 20 20  ft */.      .   
139d0 20 20 20 6e 56 61 6c 20 3d 20 73 71 6c 69 74 65     nVal = sqlite
139e0 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28  3ExprVectorSize(
139f0 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 61 73  pLeft);.      as
13a00 73 65 72 74 28 20 21 69 73 52 6f 77 69 64 20 7c  sert( !isRowid |
13a10 7c 20 6e 56 61 6c 3d 3d 31 20 29 3b 0a 0a 20 20  | nVal==1 );..  
13a20 20 20 20 20 2f 2a 20 57 68 65 74 68 65 72 20 74      /* Whether t
13a30 68 69 73 20 69 73 20 61 6e 20 27 78 20 49 4e 28  his is an 'x IN(
13a40 53 45 4c 45 43 54 2e 2e 2e 29 27 20 6f 72 20 61  SELECT...)' or a
13a50 6e 20 27 78 20 49 4e 28 3c 65 78 70 72 6c 69 73  n 'x IN(<exprlis
13a60 74 3e 29 27 0a 20 20 20 20 20 20 2a 2a 20 65 78  t>)'.      ** ex
13a70 70 72 65 73 73 69 6f 6e 20 69 74 20 69 73 20 68  pression it is h
13a80 61 6e 64 6c 65 64 20 74 68 65 20 73 61 6d 65 20  andled the same 
13a90 77 61 79 2e 20 20 41 6e 20 65 70 68 65 6d 65 72  way.  An ephemer
13aa0 61 6c 20 74 61 62 6c 65 20 69 73 20 0a 20 20 20  al table is .   
13ab0 20 20 20 2a 2a 20 66 69 6c 6c 65 64 20 77 69 74     ** filled wit
13ac0 68 20 69 6e 64 65 78 20 6b 65 79 73 20 72 65 70  h index keys rep
13ad0 72 65 73 65 6e 74 69 6e 67 20 74 68 65 20 72 65  resenting the re
13ae0 73 75 6c 74 73 20 66 72 6f 6d 20 74 68 65 20 0a  sults from the .
13af0 20 20 20 20 20 20 2a 2a 20 53 45 4c 45 43 54 20        ** SELECT 
13b00 6f 72 20 74 68 65 20 3c 65 78 70 72 6c 69 73 74  or the <exprlist
13b10 3e 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  >..      **.    
13b20 20 20 2a 2a 20 49 66 20 74 68 65 20 27 78 27 20    ** If the 'x' 
13b30 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20  expression is a 
13b40 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 2c 20 6f 72  column value, or
13b50 20 74 68 65 20 53 45 4c 45 43 54 2e 2e 2e 0a 20   the SELECT.... 
13b60 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e       ** statemen
13b70 74 20 72 65 74 75 72 6e 73 20 61 20 63 6f 6c 75  t returns a colu
13b80 6d 6e 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 74  mn value, then t
13b90 68 65 20 61 66 66 69 6e 69 74 79 20 6f 66 20 74  he affinity of t
13ba0 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6c  hat.      ** col
13bb0 75 6d 6e 20 69 73 20 75 73 65 64 20 74 6f 20 62  umn is used to b
13bc0 75 69 6c 64 20 74 68 65 20 69 6e 64 65 78 20 6b  uild the index k
13bd0 65 79 73 2e 20 49 66 20 62 6f 74 68 20 27 78 27  eys. If both 'x'
13be0 20 61 6e 64 20 74 68 65 0a 20 20 20 20 20 20 2a   and the.      *
13bf0 2a 20 53 45 4c 45 43 54 2e 2e 2e 20 73 74 61 74  * SELECT... stat
13c00 65 6d 65 6e 74 20 61 72 65 20 63 6f 6c 75 6d 6e  ement are column
13c10 73 2c 20 74 68 65 6e 20 6e 75 6d 65 72 69 63 20  s, then numeric 
13c20 61 66 66 69 6e 69 74 79 20 69 73 20 75 73 65 64  affinity is used
13c30 0a 20 20 20 20 20 20 2a 2a 20 69 66 20 65 69 74  .      ** if eit
13c40 68 65 72 20 63 6f 6c 75 6d 6e 20 68 61 73 20 4e  her column has N
13c50 55 4d 45 52 49 43 20 6f 72 20 49 4e 54 45 47 45  UMERIC or INTEGE
13c60 52 20 61 66 66 69 6e 69 74 79 2e 20 49 66 20 6e  R affinity. If n
13c70 65 69 74 68 65 72 0a 20 20 20 20 20 20 2a 2a 20  either.      ** 
13c80 27 78 27 20 6e 6f 72 20 74 68 65 20 53 45 4c 45  'x' nor the SELE
13c90 43 54 2e 2e 2e 20 73 74 61 74 65 6d 65 6e 74 20  CT... statement 
13ca0 61 72 65 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65  are columns, the
13cb0 6e 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e 69  n numeric affini
13cc0 74 79 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 75  ty.      ** is u
13cd0 73 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  sed..      */.  
13ce0 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c      pExpr->iTabl
13cf0 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  e = pParse->nTab
13d00 2b 2b 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d  ++;.      addr =
13d10 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
13d20 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p2(v, OP_OpenEph
13d30 65 6d 65 72 61 6c 2c 20 0a 20 20 20 20 20 20 20  emeral, .       
13d40 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65     pExpr->iTable
13d50 2c 20 28 69 73 52 6f 77 69 64 3f 30 3a 6e 56 61  , (isRowid?0:nVa
13d60 6c 29 29 3b 0a 20 20 20 20 20 20 70 4b 65 79 49  l));.      pKeyI
13d70 6e 66 6f 20 3d 20 69 73 52 6f 77 69 64 20 3f 20  nfo = isRowid ? 
13d80 30 20 3a 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  0 : sqlite3KeyIn
13d90 66 6f 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e  foAlloc(pParse->
13da0 64 62 2c 20 6e 56 61 6c 2c 20 31 29 3b 0a 0a 20  db, nVal, 1);.. 
13db0 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73       if( ExprHas
13dc0 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
13dd0 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b  EP_xIsSelect) ){
13de0 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 61 73 65  .        /* Case
13df0 20 31 3a 20 20 20 20 20 65 78 70 72 20 49 4e 20   1:     expr IN 
13e00 28 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 20 20 20  (SELECT ...).   
13e10 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
13e20 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
13e30 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 72 65   to write the re
13e40 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73 65 6c  sults of the sel
13e50 65 63 74 20 69 6e 74 6f 20 74 68 65 20 74 65 6d  ect into the tem
13e60 70 6f 72 61 72 79 0a 20 20 20 20 20 20 20 20 2a  porary.        *
13e70 2a 20 74 61 62 6c 65 20 61 6c 6c 6f 63 61 74 65  * table allocate
13e80 64 20 61 6e 64 20 6f 70 65 6e 65 64 20 61 62 6f  d and opened abo
13e90 76 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ve..        */. 
13ea0 20 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70         Select *p
13eb0 53 65 6c 65 63 74 20 3d 20 70 45 78 70 72 2d 3e  Select = pExpr->
13ec0 78 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20  x.pSelect;.     
13ed0 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c     ExprList *pEL
13ee0 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70  ist = pSelect->p
13ef0 45 4c 69 73 74 3b 0a 0a 20 20 20 20 20 20 20 20  EList;..        
13f00 61 73 73 65 72 74 28 20 21 69 73 52 6f 77 69 64  assert( !isRowid
13f10 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
13f20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 6e  pEList->nExpr!=n
13f30 56 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Val ){.         
13f40 20 73 71 6c 69 74 65 33 53 75 62 73 65 6c 65 63   sqlite3Subselec
13f50 74 45 72 72 6f 72 28 70 50 61 72 73 65 2c 20 70  tError(pParse, p
13f60 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 6e 56  EList->nExpr, nV
13f70 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  al);.        }el
13f80 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 53 65  se{.          Se
13f90 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b 0a 20  lectDest dest;. 
13fa0 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a           int i;.
13fb0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
13fc0 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28  3SelectDestInit(
13fd0 26 64 65 73 74 2c 20 53 52 54 5f 53 65 74 2c 20  &dest, SRT_Set, 
13fe0 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 29 3b 0a  pExpr->iTable);.
13ff0 20 20 20 20 20 20 20 20 20 20 64 65 73 74 2e 7a            dest.z
14000 41 66 66 53 64 73 74 20 3d 20 65 78 70 72 49 4e  AffSdst = exprIN
14010 41 66 66 69 6e 69 74 79 28 70 50 61 72 73 65 2c  Affinity(pParse,
14020 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20   pExpr);.       
14030 20 20 20 61 73 73 65 72 74 28 20 28 70 45 78 70     assert( (pExp
14040 72 2d 3e 69 54 61 62 6c 65 26 30 78 30 30 30 30  r->iTable&0x0000
14050 46 46 46 46 29 3d 3d 70 45 78 70 72 2d 3e 69 54  FFFF)==pExpr->iT
14060 61 62 6c 65 20 29 3b 0a 20 20 20 20 20 20 20 20  able );.        
14070 20 20 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69    pSelect->iLimi
14080 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  t = 0;.         
14090 20 74 65 73 74 63 61 73 65 28 20 70 53 65 6c 65   testcase( pSele
140a0 63 74 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  ct->selFlags & S
140b0 46 5f 44 69 73 74 69 6e 63 74 20 29 3b 0a 20 20  F_Distinct );.  
140c0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
140d0 28 20 70 4b 65 79 49 6e 66 6f 3d 3d 30 20 29 3b  ( pKeyInfo==0 );
140e0 20 2f 2a 20 43 61 75 73 65 64 20 62 79 20 4f 4f   /* Caused by OO
140f0 4d 20 69 6e 20 73 71 6c 69 74 65 33 4b 65 79 49  M in sqlite3KeyI
14100 6e 66 6f 41 6c 6c 6f 63 28 29 20 2a 2f 0a 20 20  nfoAlloc() */.  
14110 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
14120 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
14130 2c 20 70 53 65 6c 65 63 74 2c 20 26 64 65 73 74  , pSelect, &dest
14140 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
14150 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70   sqlite3DbFree(p
14160 50 61 72 73 65 2d 3e 64 62 2c 20 64 65 73 74 2e  Parse->db, dest.
14170 7a 41 66 66 53 64 73 74 29 3b 0a 20 20 20 20 20  zAffSdst);.     
14180 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4b 65         sqlite3Ke
14190 79 49 6e 66 6f 55 6e 72 65 66 28 70 4b 65 79 49  yInfoUnref(pKeyI
141a0 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20  nfo);.          
141b0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
141c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
141d0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
141e0 70 50 61 72 73 65 2d 3e 64 62 2c 20 64 65 73 74  pParse->db, dest
141f0 2e 7a 41 66 66 53 64 73 74 29 3b 0a 20 20 20 20  .zAffSdst);.    
14200 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4b        assert( pK
14210 65 79 49 6e 66 6f 21 3d 30 20 29 3b 20 2f 2a 20  eyInfo!=0 ); /* 
14220 4f 4f 4d 20 77 69 6c 6c 20 63 61 75 73 65 20 65  OOM will cause e
14230 78 69 74 20 61 66 74 65 72 20 73 71 6c 69 74 65  xit after sqlite
14240 33 53 65 6c 65 63 74 28 29 20 2a 2f 0a 20 20 20  3Select() */.   
14250 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
14260 45 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 20 20  EList!=0 );.    
14270 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
14280 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b  List->nExpr>0 );
14290 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
142a0 74 28 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66  t( sqlite3KeyInf
142b0 6f 49 73 57 72 69 74 65 61 62 6c 65 28 70 4b 65  oIsWriteable(pKe
142c0 79 49 6e 66 6f 29 20 29 3b 0a 20 20 20 20 20 20  yInfo) );.      
142d0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
142e0 56 61 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Val; i++){.     
142f0 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 20 3d         Expr *p =
14300 20 28 6e 56 61 6c 3e 31 29 20 3f 20 73 71 6c 69   (nVal>1) ? sqli
14310 74 65 33 56 65 63 74 6f 72 46 69 65 6c 64 53 75  te3VectorFieldSu
14320 62 65 78 70 72 28 70 4c 65 66 74 2c 20 69 29 20  bexpr(pLeft, i) 
14330 3a 20 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 20  : pLeft;.       
14340 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 61       pKeyInfo->a
14350 43 6f 6c 6c 5b 69 5d 20 3d 20 73 71 6c 69 74 65  Coll[i] = sqlite
14360 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f  3BinaryCompareCo
14370 6c 6c 53 65 71 28 0a 20 20 20 20 20 20 20 20 20  llSeq(.         
14380 20 20 20 20 20 20 20 70 50 61 72 73 65 2c 20 70         pParse, p
14390 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  , pEList->a[i].p
143a0 45 78 70 72 0a 20 20 20 20 20 20 20 20 20 20 20  Expr.           
143b0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   );.          }.
143c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
143d0 7d 65 6c 73 65 20 69 66 28 20 41 4c 57 41 59 53  }else if( ALWAYS
143e0 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 21  (pExpr->x.pList!
143f0 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  =0) ){.        /
14400 2a 20 43 61 73 65 20 32 3a 20 20 20 20 20 65 78  * Case 2:     ex
14410 70 72 20 49 4e 20 28 65 78 70 72 6c 69 73 74 29  pr IN (exprlist)
14420 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
14430 20 20 20 20 2a 2a 20 46 6f 72 20 65 61 63 68 20      ** For each 
14440 65 78 70 72 65 73 73 69 6f 6e 2c 20 62 75 69 6c  expression, buil
14450 64 20 61 6e 20 69 6e 64 65 78 20 6b 65 79 20 66  d an index key f
14460 72 6f 6d 20 74 68 65 20 65 76 61 6c 75 61 74 69  rom the evaluati
14470 6f 6e 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a  on and.        *
14480 2a 20 73 74 6f 72 65 20 69 74 20 69 6e 20 74 68  * store it in th
14490 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  e temporary tabl
144a0 65 2e 20 49 66 20 3c 65 78 70 72 3e 20 69 73 20  e. If <expr> is 
144b0 61 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e 20 75  a column, then u
144c0 73 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  se.        ** th
144d0 61 74 20 63 6f 6c 75 6d 6e 73 20 61 66 66 69 6e  at columns affin
144e0 69 74 79 20 77 68 65 6e 20 62 75 69 6c 64 69 6e  ity when buildin
144f0 67 20 69 6e 64 65 78 20 6b 65 79 73 2e 20 49 66  g index keys. If
14500 20 3c 65 78 70 72 3e 20 69 73 20 6e 6f 74 0a 20   <expr> is not. 
14510 20 20 20 20 20 20 20 2a 2a 20 61 20 63 6f 6c 75         ** a colu
14520 6d 6e 2c 20 75 73 65 20 6e 75 6d 65 72 69 63 20  mn, use numeric 
14530 61 66 66 69 6e 69 74 79 2e 0a 20 20 20 20 20 20  affinity..      
14540 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 68 61    */.        cha
14550 72 20 61 66 66 69 6e 69 74 79 3b 20 20 20 20 20  r affinity;     
14560 20 20 20 20 20 20 20 2f 2a 20 41 66 66 69 6e 69         /* Affini
14570 74 79 20 6f 66 20 74 68 65 20 4c 48 53 20 6f 66  ty of the LHS of
14580 20 74 68 65 20 49 4e 20 2a 2f 0a 20 20 20 20 20   the IN */.     
14590 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
145a0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
145b0 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  t = pExpr->x.pLi
145c0 73 74 3b 0a 20 20 20 20 20 20 20 20 73 74 72 75  st;.        stru
145d0 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
145e0 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 20   *pItem;.       
145f0 20 69 6e 74 20 72 31 2c 20 72 32 2c 20 72 33 3b   int r1, r2, r3;
14600 0a 0a 20 20 20 20 20 20 20 20 61 66 66 69 6e 69  ..        affini
14610 74 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ty = sqlite3Expr
14620 41 66 66 69 6e 69 74 79 28 70 4c 65 66 74 29 3b  Affinity(pLeft);
14630 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 61 66  .        if( !af
14640 66 69 6e 69 74 79 20 29 7b 0a 20 20 20 20 20 20  finity ){.      
14650 20 20 20 20 61 66 66 69 6e 69 74 79 20 3d 20 53      affinity = S
14660 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a  QLITE_AFF_BLOB;.
14670 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
14680 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 20 29    if( pKeyInfo )
14690 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  {.          asse
146a0 72 74 28 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  rt( sqlite3KeyIn
146b0 66 6f 49 73 57 72 69 74 65 61 62 6c 65 28 70 4b  foIsWriteable(pK
146c0 65 79 49 6e 66 6f 29 20 29 3b 0a 20 20 20 20 20  eyInfo) );.     
146d0 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 61       pKeyInfo->a
146e0 43 6f 6c 6c 5b 30 5d 20 3d 20 73 71 6c 69 74 65  Coll[0] = sqlite
146f0 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
14700 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
14710 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  t);.        }.. 
14720 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74         /* Loop t
14730 68 72 6f 75 67 68 20 65 61 63 68 20 65 78 70 72  hrough each expr
14740 65 73 73 69 6f 6e 20 69 6e 20 3c 65 78 70 72 6c  ession in <exprl
14750 69 73 74 3e 2e 20 2a 2f 0a 20 20 20 20 20 20 20  ist>. */.       
14760 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
14770 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
14780 0a 20 20 20 20 20 20 20 20 72 32 20 3d 20 73 71  .        r2 = sq
14790 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
147a0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
147b0 20 69 66 28 20 69 73 52 6f 77 69 64 20 29 20 73   if( isRowid ) s
147c0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
147d0 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20  (v, OP_Null, 0, 
147e0 72 32 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  r2);.        for
147f0 28 69 3d 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2c  (i=pList->nExpr,
14800 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b   pItem=pList->a;
14810 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 49 74 65 6d   i>0; i--, pItem
14820 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45  ++){.          E
14830 78 70 72 20 2a 70 45 32 20 3d 20 70 49 74 65 6d  xpr *pE2 = pItem
14840 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ->pExpr;.       
14850 20 20 20 69 6e 74 20 69 56 61 6c 54 6f 49 6e 73     int iValToIns
14860 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;..          /* 
14870 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  If the expressio
14880 6e 20 69 73 20 6e 6f 74 20 63 6f 6e 73 74 61 6e  n is not constan
14890 74 20 74 68 65 6e 20 77 65 20 77 69 6c 6c 20 6e  t then we will n
148a0 65 65 64 20 74 6f 0a 20 20 20 20 20 20 20 20 20  eed to.         
148b0 20 2a 2a 20 64 69 73 61 62 6c 65 20 74 68 65 20   ** disable the 
148c0 74 65 73 74 20 74 68 61 74 20 77 61 73 20 67 65  test that was ge
148d0 6e 65 72 61 74 65 64 20 61 62 6f 76 65 20 74 68  nerated above th
148e0 61 74 20 6d 61 6b 65 73 20 73 75 72 65 0a 20 20  at makes sure.  
148f0 20 20 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20          ** this 
14900 63 6f 64 65 20 6f 6e 6c 79 20 65 78 65 63 75 74  code only execut
14910 65 73 20 6f 6e 63 65 2e 20 20 42 65 63 61 75 73  es once.  Becaus
14920 65 20 66 6f 72 20 61 20 6e 6f 6e 2d 63 6f 6e 73  e for a non-cons
14930 74 61 6e 74 0a 20 20 20 20 20 20 20 20 20 20 2a  tant.          *
14940 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 77 65 20  * expression we 
14950 6e 65 65 64 20 74 6f 20 72 65 72 75 6e 20 74 68  need to rerun th
14960 69 73 20 63 6f 64 65 20 65 61 63 68 20 74 69 6d  is code each tim
14970 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  e..          */.
14980 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6a 6d            if( jm
14990 70 49 66 44 79 6e 61 6d 69 63 3e 3d 30 20 26 26  pIfDynamic>=0 &&
149a0 20 21 73 71 6c 69 74 65 33 45 78 70 72 49 73 43   !sqlite3ExprIsC
149b0 6f 6e 73 74 61 6e 74 28 70 45 32 29 20 29 7b 0a  onstant(pE2) ){.
149c0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
149d0 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e  te3VdbeChangeToN
149e0 6f 6f 70 28 76 2c 20 6a 6d 70 49 66 44 79 6e 61  oop(v, jmpIfDyna
149f0 6d 69 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20  mic);.          
14a00 20 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63 20 3d    jmpIfDynamic =
14a10 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   -1;.          }
14a20 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45  ..          /* E
14a30 76 61 6c 75 61 74 65 20 74 68 65 20 65 78 70 72  valuate the expr
14a40 65 73 73 69 6f 6e 20 61 6e 64 20 69 6e 73 65 72  ession and inser
14a50 74 20 69 74 20 69 6e 74 6f 20 74 68 65 20 74 65  t it into the te
14a60 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  mp table */.    
14a70 20 20 20 20 20 20 69 66 28 20 69 73 52 6f 77 69        if( isRowi
14a80 64 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72  d && sqlite3Expr
14a90 49 73 49 6e 74 65 67 65 72 28 70 45 32 2c 20 26  IsInteger(pE2, &
14aa0 69 56 61 6c 54 6f 49 6e 73 29 20 29 7b 0a 20 20  iValToIns) ){.  
14ab0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
14ac0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
14ad0 50 5f 49 6e 73 65 72 74 49 6e 74 2c 20 70 45 78  P_InsertInt, pEx
14ae0 70 72 2d 3e 69 54 61 62 6c 65 2c 20 72 32 2c 20  pr->iTable, r2, 
14af0 69 56 61 6c 54 6f 49 6e 73 29 3b 0a 20 20 20 20  iValToIns);.    
14b00 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
14b10 20 20 20 20 20 20 20 20 20 72 33 20 3d 20 73 71           r3 = sq
14b20 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72  lite3ExprCodeTar
14b30 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 32 2c  get(pParse, pE2,
14b40 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20   r1);.          
14b50 20 20 69 66 28 20 69 73 52 6f 77 69 64 20 29 7b    if( isRowid ){
14b60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
14b70 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
14b80 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74  (v, OP_MustBeInt
14b90 2c 20 72 33 2c 0a 20 20 20 20 20 20 20 20 20 20  , r3,.          
14ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14bb0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
14bc0 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b  eCurrentAddr(v)+
14bd0 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  2);.            
14be0 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
14bf0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
14c00 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
14c10 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c  p3(v, OP_Insert,
14c20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
14c30 72 32 2c 20 72 33 29 3b 0a 20 20 20 20 20 20 20  r2, r3);.       
14c40 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
14c50 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
14c60 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
14c70 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 33  P_MakeRecord, r3
14c80 2c 20 31 2c 20 72 32 2c 20 26 61 66 66 69 6e 69  , 1, r2, &affini
14c90 74 79 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  ty, 1);.        
14ca0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
14cb0 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68  rCacheAffinityCh
14cc0 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 33 2c  ange(pParse, r3,
14cd0 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   1);.           
14ce0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
14cf0 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e  dOp2(v, OP_IdxIn
14d00 73 65 72 74 2c 20 70 45 78 70 72 2d 3e 69 54 61  sert, pExpr->iTa
14d10 62 6c 65 2c 20 72 32 29 3b 0a 20 20 20 20 20 20  ble, r2);.      
14d20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
14d30 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
14d40 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
14d50 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
14d60 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20  se, r1);.       
14d70 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
14d80 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
14d90 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  2);.      }.    
14da0 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 20 29    if( pKeyInfo )
14db0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
14dc0 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c  3VdbeChangeP4(v,
14dd0 20 61 64 64 72 2c 20 28 76 6f 69 64 20 2a 29 70   addr, (void *)p
14de0 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49  KeyInfo, P4_KEYI
14df0 4e 46 4f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  NFO);.      }.  
14e00 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
14e10 0a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58  ..    case TK_EX
14e20 49 53 54 53 3a 0a 20 20 20 20 63 61 73 65 20 54  ISTS:.    case T
14e30 4b 5f 53 45 4c 45 43 54 3a 0a 20 20 20 20 64 65  K_SELECT:.    de
14e40 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 2f  fault: {.      /
14e50 2a 20 43 61 73 65 20 33 3a 20 20 20 20 28 53 45  * Case 3:    (SE
14e60 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 2e 2e  LECT ... FROM ..
14e70 2e 29 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20  .).      **     
14e80 6f 72 3a 20 20 20 20 45 58 49 53 54 53 28 53 45  or:    EXISTS(SE
14e90 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 2e 2e  LECT ... FROM ..
14ea0 2e 29 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .).      **.    
14eb0 20 20 2a 2a 20 46 6f 72 20 61 20 53 45 4c 45 43    ** For a SELEC
14ec0 54 2c 20 67 65 6e 65 72 61 74 65 20 63 6f 64 65  T, generate code
14ed0 20 74 6f 20 70 75 74 20 74 68 65 20 76 61 6c 75   to put the valu
14ee0 65 73 20 66 6f 72 20 61 6c 6c 20 63 6f 6c 75 6d  es for all colum
14ef0 6e 73 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 74  ns of.      ** t
14f00 68 65 20 66 69 72 73 74 20 72 6f 77 20 69 6e 74  he first row int
14f10 6f 20 61 6e 20 61 72 72 61 79 20 6f 66 20 72 65  o an array of re
14f20 67 69 73 74 65 72 73 20 61 6e 64 20 72 65 74 75  gisters and retu
14f30 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66 0a  rn the index of.
14f40 20 20 20 20 20 20 2a 2a 20 74 68 65 20 66 69 72        ** the fir
14f50 73 74 20 72 65 67 69 73 74 65 72 2e 0a 20 20 20  st register..   
14f60 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49     **.      ** I
14f70 66 20 74 68 69 73 20 69 73 20 61 6e 20 45 58 49  f this is an EXI
14f80 53 54 53 2c 20 77 72 69 74 65 20 61 6e 20 69 6e  STS, write an in
14f90 74 65 67 65 72 20 30 20 28 6e 6f 74 20 65 78 69  teger 0 (not exi
14fa0 73 74 73 29 20 6f 72 20 31 20 28 65 78 69 73 74  sts) or 1 (exist
14fb0 73 29 0a 20 20 20 20 20 20 2a 2a 20 69 6e 74 6f  s).      ** into
14fc0 20 61 20 72 65 67 69 73 74 65 72 20 61 6e 64 20   a register and 
14fd0 72 65 74 75 72 6e 20 74 68 61 74 20 72 65 67 69  return that regi
14fe0 73 74 65 72 20 6e 75 6d 62 65 72 2e 0a 20 20 20  ster number..   
14ff0 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49     **.      ** I
15000 6e 20 62 6f 74 68 20 63 61 73 65 73 2c 20 74 68  n both cases, th
15010 65 20 71 75 65 72 79 20 69 73 20 61 75 67 6d 65  e query is augme
15020 6e 74 65 64 20 77 69 74 68 20 22 4c 49 4d 49 54  nted with "LIMIT
15030 20 31 22 2e 20 20 41 6e 79 20 0a 20 20 20 20 20   1".  Any .     
15040 20 2a 2a 20 70 72 65 65 78 69 73 74 69 6e 67 20   ** preexisting 
15050 6c 69 6d 69 74 20 69 73 20 64 69 73 63 61 72 64  limit is discard
15060 65 64 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 74  ed in place of t
15070 68 65 20 6e 65 77 20 4c 49 4d 49 54 20 31 2e 0a  he new LIMIT 1..
15080 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 53        */.      S
15090 65 6c 65 63 74 20 2a 70 53 65 6c 3b 20 20 20 20  elect *pSel;    
150a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
150b0 20 20 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 73       /* SELECT s
150c0 74 61 74 65 6d 65 6e 74 20 74 6f 20 65 6e 63 6f  tatement to enco
150d0 64 65 20 2a 2f 0a 20 20 20 20 20 20 53 65 6c 65  de */.      Sele
150e0 63 74 44 65 73 74 20 64 65 73 74 3b 20 20 20 20  ctDest dest;    
150f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15100 20 20 2f 2a 20 48 6f 77 20 74 6f 20 64 65 61 6c    /* How to deal
15110 20 77 69 74 68 20 53 45 4c 45 43 54 20 72 65 73   with SELECT res
15120 75 6c 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  ult */.      int
15130 20 6e 52 65 67 3b 20 20 20 20 20 20 20 20 20 20   nReg;          
15140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15150 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 73 20     /* Registers 
15160 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 0a  to allocate */..
15170 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
15180 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58  pExpr->op==TK_EX
15190 49 53 54 53 20 29 3b 0a 20 20 20 20 20 20 74 65  ISTS );.      te
151a0 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
151b0 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a  p==TK_SELECT );.
151c0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
151d0 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53  xpr->op==TK_EXIS
151e0 54 53 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d  TS || pExpr->op=
151f0 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 20 20  =TK_SELECT );.  
15200 20 20 20 20 61 73 73 65 72 74 28 20 45 78 70 72      assert( Expr
15210 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
15220 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
15230 20 29 3b 0a 0a 20 20 20 20 20 20 70 53 65 6c 20   );..      pSel 
15240 3d 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65  = pExpr->x.pSele
15250 63 74 3b 0a 20 20 20 20 20 20 6e 52 65 67 20 3d  ct;.      nReg =
15260 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53   pExpr->op==TK_S
15270 45 4c 45 43 54 20 3f 20 70 53 65 6c 2d 3e 70 45  ELECT ? pSel->pE
15280 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 31 3b  List->nExpr : 1;
15290 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65  .      sqlite3Se
152a0 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65  lectDestInit(&de
152b0 73 74 2c 20 30 2c 20 70 50 61 72 73 65 2d 3e 6e  st, 0, pParse->n
152c0 4d 65 6d 2b 31 29 3b 0a 20 20 20 20 20 20 70 50  Mem+1);.      pP
152d0 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52  arse->nMem += nR
152e0 65 67 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45  eg;.      if( pE
152f0 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45  xpr->op==TK_SELE
15300 43 54 20 29 7b 0a 20 20 20 20 20 20 20 20 64 65  CT ){.        de
15310 73 74 2e 65 44 65 73 74 20 3d 20 53 52 54 5f 4d  st.eDest = SRT_M
15320 65 6d 3b 0a 20 20 20 20 20 20 20 20 64 65 73 74  em;.        dest
15330 2e 69 53 64 73 74 20 3d 20 64 65 73 74 2e 69 53  .iSdst = dest.iS
15340 44 50 61 72 6d 3b 0a 20 20 20 20 20 20 20 20 64  DParm;.        d
15350 65 73 74 2e 6e 53 64 73 74 20 3d 20 6e 52 65 67  est.nSdst = nReg
15360 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
15370 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
15380 50 5f 4e 75 6c 6c 2c 20 30 2c 20 64 65 73 74 2e  P_Null, 0, dest.
15390 69 53 44 50 61 72 6d 2c 20 64 65 73 74 2e 69 53  iSDParm, dest.iS
153a0 44 50 61 72 6d 2b 6e 52 65 67 2d 31 29 3b 0a 20  DParm+nReg-1);. 
153b0 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65         VdbeComme
153c0 6e 74 28 28 76 2c 20 22 49 6e 69 74 20 73 75 62  nt((v, "Init sub
153d0 71 75 65 72 79 20 72 65 73 75 6c 74 22 29 29 3b  query result"));
153e0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
153f0 20 20 20 20 20 20 64 65 73 74 2e 65 44 65 73 74        dest.eDest
15400 20 3d 20 53 52 54 5f 45 78 69 73 74 73 3b 0a 20   = SRT_Exists;. 
15410 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
15420 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
15430 6e 74 65 67 65 72 2c 20 30 2c 20 64 65 73 74 2e  nteger, 0, dest.
15440 69 53 44 50 61 72 6d 29 3b 0a 20 20 20 20 20 20  iSDParm);.      
15450 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
15460 2c 20 22 49 6e 69 74 20 45 58 49 53 54 53 20 72  , "Init EXISTS r
15470 65 73 75 6c 74 22 29 29 3b 0a 20 20 20 20 20 20  esult"));.      
15480 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  }.      sqlite3E
15490 78 70 72 44 65 6c 65 74 65 28 70 50 61 72 73 65  xprDelete(pParse
154a0 2d 3e 64 62 2c 20 70 53 65 6c 2d 3e 70 4c 69 6d  ->db, pSel->pLim
154b0 69 74 29 3b 0a 20 20 20 20 20 20 70 53 65 6c 2d  it);.      pSel-
154c0 3e 70 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74 65  >pLimit = sqlite
154d0 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
154e0 4b 5f 49 4e 54 45 47 45 52 2c 20 30 2c 20 30 2c  K_INTEGER, 0, 0,
154f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
15500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15510 20 20 20 26 73 71 6c 69 74 65 33 49 6e 74 54 6f     &sqlite3IntTo
15520 6b 65 6e 73 5b 31 5d 29 3b 0a 20 20 20 20 20 20  kens[1]);.      
15530 70 53 65 6c 2d 3e 69 4c 69 6d 69 74 20 3d 20 30  pSel->iLimit = 0
15540 3b 0a 20 20 20 20 20 20 70 53 65 6c 2d 3e 73 65  ;.      pSel->se
15550 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f 4d 75  lFlags &= ~SF_Mu
15560 6c 74 69 56 61 6c 75 65 3b 0a 20 20 20 20 20 20  ltiValue;.      
15570 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63  if( sqlite3Selec
15580 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 2c 20  t(pParse, pSel, 
15590 26 64 65 73 74 29 20 29 7b 0a 20 20 20 20 20 20  &dest) ){.      
155a0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
155b0 20 20 7d 0a 20 20 20 20 20 20 72 52 65 67 20 3d    }.      rReg =
155c0 20 64 65 73 74 2e 69 53 44 50 61 72 6d 3b 0a 20   dest.iSDParm;. 
155d0 20 20 20 20 20 45 78 70 72 53 65 74 56 56 41 50       ExprSetVVAP
155e0 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
155f0 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a 20 20 20  P_NoReduce);.   
15600 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
15610 20 20 7d 0a 0a 20 20 69 66 28 20 72 48 61 73 4e    }..  if( rHasN
15620 75 6c 6c 46 6c 61 67 20 29 7b 0a 20 20 20 20 73  ullFlag ){.    s
15630 71 6c 69 74 65 33 53 65 74 48 61 73 4e 75 6c 6c  qlite3SetHasNull
15640 46 6c 61 67 28 76 2c 20 70 45 78 70 72 2d 3e 69  Flag(v, pExpr->i
15650 54 61 62 6c 65 2c 20 72 48 61 73 4e 75 6c 6c 46  Table, rHasNullF
15660 6c 61 67 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  lag);.  }..  if(
15670 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63 3e 3d 30   jmpIfDynamic>=0
15680 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
15690 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a  dbeJumpHere(v, j
156a0 6d 70 49 66 44 79 6e 61 6d 69 63 29 3b 0a 20 20  mpIfDynamic);.  
156b0 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43  }.  sqlite3ExprC
156c0 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b  achePop(pParse);
156d0 0a 0a 20 20 72 65 74 75 72 6e 20 72 52 65 67 3b  ..  return rReg;
156e0 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
156f0 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
15700 59 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  Y */..#ifndef SQ
15710 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
15720 52 59 0a 2f 2a 0a 2a 2a 20 45 78 70 72 20 70 49  RY./*.** Expr pI
15730 6e 20 69 73 20 61 6e 20 49 4e 28 2e 2e 2e 29 20  n is an IN(...) 
15740 65 78 70 72 65 73 73 69 6f 6e 2e 20 54 68 69 73  expression. This
15750 20 66 75 6e 63 74 69 6f 6e 20 63 68 65 63 6b 73   function checks
15760 20 74 68 61 74 20 74 68 65 20 0a 2a 2a 20 73 75   that the .** su
15770 62 2d 73 65 6c 65 63 74 20 6f 6e 20 74 68 65 20  b-select on the 
15780 52 48 53 20 6f 66 20 74 68 65 20 49 4e 28 29 20  RHS of the IN() 
15790 6f 70 65 72 61 74 6f 72 20 68 61 73 20 74 68 65  operator has the
157a0 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20   same number of 
157b0 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 20 61 73 20 74  .** columns as t
157c0 68 65 20 76 65 63 74 6f 72 20 6f 6e 20 74 68 65  he vector on the
157d0 20 4c 48 53 2e 20 4f 72 2c 20 69 66 20 74 68 65   LHS. Or, if the
157e0 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e 28 29   RHS of the IN()
157f0 20 69 73 20 6e 6f 74 20 0a 2a 2a 20 61 20 73 75   is not .** a su
15800 62 2d 71 75 65 72 79 2c 20 74 68 61 74 20 74 68  b-query, that th
15810 65 20 4c 48 53 20 69 73 20 61 20 76 65 63 74 6f  e LHS is a vecto
15820 72 20 6f 66 20 73 69 7a 65 20 31 2e 0a 2a 2f 0a  r of size 1..*/.
15830 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43  int sqlite3ExprC
15840 68 65 63 6b 49 4e 28 50 61 72 73 65 20 2a 70 50  heckIN(Parse *pP
15850 61 72 73 65 2c 20 45 78 70 72 20 2a 70 49 6e 29  arse, Expr *pIn)
15860 7b 0a 20 20 69 6e 74 20 6e 56 65 63 74 6f 72 20  {.  int nVector 
15870 3d 20 73 71 6c 69 74 65 33 45 78 70 72 56 65 63  = sqlite3ExprVec
15880 74 6f 72 53 69 7a 65 28 70 49 6e 2d 3e 70 4c 65  torSize(pIn->pLe
15890 66 74 29 3b 0a 20 20 69 66 28 20 28 70 49 6e 2d  ft);.  if( (pIn-
158a0 3e 66 6c 61 67 73 20 26 20 45 50 5f 78 49 73 53  >flags & EP_xIsS
158b0 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 69 66  elect) ){.    if
158c0 28 20 6e 56 65 63 74 6f 72 21 3d 70 49 6e 2d 3e  ( nVector!=pIn->
158d0 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73  x.pSelect->pELis
158e0 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  t->nExpr ){.    
158f0 20 20 73 71 6c 69 74 65 33 53 75 62 73 65 6c 65    sqlite3Subsele
15900 63 74 45 72 72 6f 72 28 70 50 61 72 73 65 2c 20  ctError(pParse, 
15910 70 49 6e 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e  pIn->x.pSelect->
15920 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 6e  pEList->nExpr, n
15930 56 65 63 74 6f 72 29 3b 0a 20 20 20 20 20 20 72  Vector);.      r
15940 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
15950 20 7d 65 6c 73 65 20 69 66 28 20 6e 56 65 63 74   }else if( nVect
15960 6f 72 21 3d 31 20 29 7b 0a 20 20 20 20 69 66 28  or!=1 ){.    if(
15970 20 28 70 49 6e 2d 3e 70 4c 65 66 74 2d 3e 66 6c   (pIn->pLeft->fl
15980 61 67 73 20 26 20 45 50 5f 78 49 73 53 65 6c 65  ags & EP_xIsSele
15990 63 74 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ct) ){.      sql
159a0 69 74 65 33 53 75 62 73 65 6c 65 63 74 45 72 72  ite3SubselectErr
159b0 6f 72 28 70 50 61 72 73 65 2c 20 6e 56 65 63 74  or(pParse, nVect
159c0 6f 72 2c 20 31 29 3b 0a 20 20 20 20 7d 65 6c 73  or, 1);.    }els
159d0 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
159e0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
159f0 20 22 69 6e 76 61 6c 69 64 20 75 73 65 20 6f 66   "invalid use of
15a00 20 72 6f 77 20 76 61 6c 75 65 22 29 3b 0a 20 20   row value");.  
15a10 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 31    }.    return 1
15a20 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
15a30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  ;.}.#endif..#ifn
15a40 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
15a50 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 47  SUBQUERY./*.** G
15a60 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
15a70 20 61 6e 20 49 4e 20 65 78 70 72 65 73 73 69 6f   an IN expressio
15a80 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 78 20  n..**.**      x 
15a90 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 0a  IN (SELECT ...).
15aa0 2a 2a 20 20 20 20 20 20 78 20 49 4e 20 28 76 61  **      x IN (va
15ab0 6c 75 65 2c 20 76 61 6c 75 65 2c 20 2e 2e 2e 29  lue, value, ...)
15ac0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 65 66 74 2d  .**.** The left-
15ad0 68 61 6e 64 20 73 69 64 65 20 28 4c 48 53 29 20  hand side (LHS) 
15ae0 69 73 20 61 20 73 63 61 6c 61 72 20 65 78 70 72  is a scalar expr
15af0 65 73 73 69 6f 6e 2e 20 20 54 68 65 20 72 69 67  ession.  The rig
15b00 68 74 2d 68 61 6e 64 20 73 69 64 65 20 28 52 48  ht-hand side (RH
15b10 53 29 0a 2a 2a 20 69 73 20 61 6e 20 61 72 72 61  S).** is an arra
15b20 79 20 6f 66 20 7a 65 72 6f 20 6f 72 20 6d 6f 72  y of zero or mor
15b30 65 20 76 61 6c 75 65 73 2e 20 20 54 68 65 20 65  e values.  The e
15b40 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 72 75  xpression is tru
15b50 65 20 69 66 20 74 68 65 20 4c 48 53 20 69 73 0a  e if the LHS is.
15b60 2a 2a 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74  ** contained wit
15b70 68 69 6e 20 74 68 65 20 52 48 53 2e 20 20 54 68  hin the RHS.  Th
15b80 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 65  e value of the e
15b90 78 70 72 65 73 73 69 6f 6e 20 69 73 20 75 6e 6b  xpression is unk
15ba0 6e 6f 77 6e 20 28 4e 55 4c 4c 29 0a 2a 2a 20 69  nown (NULL).** i
15bb0 66 20 74 68 65 20 4c 48 53 20 69 73 20 4e 55 4c  f the LHS is NUL
15bc0 4c 20 6f 72 20 69 66 20 74 68 65 20 4c 48 53 20  L or if the LHS 
15bd0 69 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64  is not contained
15be0 20 77 69 74 68 69 6e 20 74 68 65 20 52 48 53 20   within the RHS 
15bf0 61 6e 64 20 74 68 65 0a 2a 2a 20 52 48 53 20 63  and the.** RHS c
15c00 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d  ontains one or m
15c10 6f 72 65 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2e  ore NULL values.
15c20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
15c30 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 63 6f  ine generates co
15c40 64 65 20 74 68 61 74 20 6a 75 6d 70 73 20 74 6f  de that jumps to
15c50 20 64 65 73 74 49 66 46 61 6c 73 65 20 69 66 20   destIfFalse if 
15c60 74 68 65 20 4c 48 53 20 69 73 20 6e 6f 74 20 0a  the LHS is not .
15c70 2a 2a 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74  ** contained wit
15c80 68 69 6e 20 74 68 65 20 52 48 53 2e 20 20 49 66  hin the RHS.  If
15c90 20 64 75 65 20 74 6f 20 4e 55 4c 4c 73 20 77 65   due to NULLs we
15ca0 20 63 61 6e 6e 6f 74 20 64 65 74 65 72 6d 69 6e   cannot determin
15cb0 65 20 69 66 20 74 68 65 20 4c 48 53 0a 2a 2a 20  e if the LHS.** 
15cc0 69 73 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20  is contained in 
15cd0 74 68 65 20 52 48 53 20 74 68 65 6e 20 6a 75 6d  the RHS then jum
15ce0 70 20 74 6f 20 64 65 73 74 49 66 4e 75 6c 6c 2e  p to destIfNull.
15cf0 20 20 49 66 20 74 68 65 20 4c 48 53 20 69 73 20    If the LHS is 
15d00 63 6f 6e 74 61 69 6e 65 64 0a 2a 2a 20 77 69 74  contained.** wit
15d10 68 69 6e 20 74 68 65 20 52 48 53 20 74 68 65 6e  hin the RHS then
15d20 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 2e 0a 2a   fall through..*
15d30 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71  /.static void sq
15d40 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e 28  lite3ExprCodeIN(
15d50 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
15d60 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  ,        /* Pars
15d70 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e  ing and code gen
15d80 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20  erating context 
15d90 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  */.  Expr *pExpr
15da0 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ,          /* Th
15db0 65 20 49 4e 20 65 78 70 72 65 73 73 69 6f 6e 20  e IN expression 
15dc0 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 49 66 46  */.  int destIfF
15dd0 61 6c 73 65 2c 20 20 20 20 20 20 2f 2a 20 4a 75  alse,      /* Ju
15de0 6d 70 20 68 65 72 65 20 69 66 20 4c 48 53 20 69  mp here if LHS i
15df0 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20  s not contained 
15e00 69 6e 20 74 68 65 20 52 48 53 20 2a 2f 0a 20 20  in the RHS */.  
15e10 69 6e 74 20 64 65 73 74 49 66 4e 75 6c 6c 20 20  int destIfNull  
15e20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
15e30 72 65 20 69 66 20 74 68 65 20 72 65 73 75 6c 74  re if the result
15e40 73 20 61 72 65 20 75 6e 6b 6e 6f 77 6e 20 64 75  s are unknown du
15e50 65 20 74 6f 20 4e 55 4c 4c 73 20 2a 2f 0a 29 7b  e to NULLs */.){
15e60 0a 20 20 69 6e 74 20 72 52 68 73 48 61 73 4e 75  .  int rRhsHasNu
15e70 6c 6c 20 3d 20 30 3b 20 20 2f 2a 20 52 65 67 69  ll = 0;  /* Regi
15e80 73 74 65 72 20 74 68 61 74 20 69 73 20 74 72 75  ster that is tru
15e90 65 20 69 66 20 52 48 53 20 63 6f 6e 74 61 69 6e  e if RHS contain
15ea0 73 20 4e 55 4c 4c 20 76 61 6c 75 65 73 20 2a 2f  s NULL values */
15eb0 0a 20 20 69 6e 74 20 65 54 79 70 65 3b 20 20 20  .  int eType;   
15ec0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 79 70 65           /* Type
15ed0 20 6f 66 20 74 68 65 20 52 48 53 20 2a 2f 0a 20   of the RHS */. 
15ee0 20 69 6e 74 20 72 31 3b 20 20 20 20 20 20 20 20   int r1;        
15ef0 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72         /* Tempor
15f00 61 72 79 20 75 73 65 20 72 65 67 69 73 74 65 72  ary use register
15f10 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20   */.  Vdbe *v;  
15f20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
15f30 74 61 74 65 6d 65 6e 74 20 75 6e 64 65 72 20 63  tatement under c
15f40 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20  onstruction */. 
15f50 20 69 6e 74 20 2a 61 69 4d 61 70 20 3d 20 30 3b   int *aiMap = 0;
15f60 20 20 20 20 20 20 20 2f 2a 20 4d 61 70 20 66 72         /* Map fr
15f70 6f 6d 20 76 65 63 74 6f 72 20 66 69 65 6c 64 20  om vector field 
15f80 74 6f 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 20  to index column 
15f90 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 41 66 66 20  */.  char *zAff 
15fa0 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 41 66  = 0;       /* Af
15fb0 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20 66 6f  finity string fo
15fc0 72 20 63 6f 6d 70 61 72 69 73 6f 6e 73 20 2a 2f  r comparisons */
15fd0 0a 20 20 69 6e 74 20 6e 56 65 63 74 6f 72 3b 20  .  int nVector; 
15fe0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
15ff0 20 6f 66 20 76 65 63 74 6f 72 73 20 66 6f 72 20   of vectors for 
16000 74 68 69 73 20 49 4e 28 2e 2e 2e 29 20 6f 70 20  this IN(...) op 
16010 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c 65 66 74  */.  Expr *pLeft
16020 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b   = pExpr->pLeft;
16030 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 69 66 28  .  int i;..  if(
16040 20 73 71 6c 69 74 65 33 45 78 70 72 43 68 65 63   sqlite3ExprChec
16050 6b 49 4e 28 70 50 61 72 73 65 2c 20 70 45 78 70  kIN(pParse, pExp
16060 72 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7a  r) ) return;.  z
16070 41 66 66 20 3d 20 65 78 70 72 49 4e 41 66 66 69  Aff = exprINAffi
16080 6e 69 74 79 28 70 50 61 72 73 65 2c 20 70 45 78  nity(pParse, pEx
16090 70 72 29 3b 0a 20 20 69 66 28 20 7a 41 66 66 3d  pr);.  if( zAff=
160a0 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 6e  =0 ) return;.  n
160b0 56 65 63 74 6f 72 20 3d 20 73 71 6c 69 74 65 33  Vector = sqlite3
160c0 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70  ExprVectorSize(p
160d0 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
160e0 61 69 4d 61 70 20 3d 20 28 69 6e 74 2a 29 73 71  aiMap = (int*)sq
160f0 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
16100 6f 28 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  o(.      pParse-
16110 3e 64 62 2c 20 6e 56 65 63 74 6f 72 2a 28 73 69  >db, nVector*(si
16120 7a 65 6f 66 28 69 6e 74 29 20 2b 20 73 69 7a 65  zeof(int) + size
16130 6f 66 28 63 68 61 72 29 29 20 2b 20 31 0a 20 20  of(char)) + 1.  
16140 29 3b 0a 20 20 69 66 28 20 61 69 4d 61 70 3d 3d  );.  if( aiMap==
16150 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
16160 44 62 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64  DbFree(pParse->d
16170 62 2c 20 7a 41 66 66 29 3b 0a 20 20 20 20 72 65  b, zAff);.    re
16180 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  turn;.  }..  /* 
16190 41 74 74 65 6d 70 74 20 74 6f 20 63 6f 6d 70 75  Attempt to compu
161a0 74 65 20 74 68 65 20 52 48 53 2e 20 41 66 74 65  te the RHS. Afte
161b0 72 20 74 68 69 73 20 73 74 65 70 2c 20 69 66 20  r this step, if 
161c0 61 6e 79 74 68 69 6e 67 20 6f 74 68 65 72 20 74  anything other t
161d0 68 61 6e 0a 20 20 2a 2a 20 49 4e 5f 49 4e 44 45  han.  ** IN_INDE
161e0 58 5f 4e 4f 4f 50 20 69 73 20 72 65 74 75 72 6e  X_NOOP is return
161f0 65 64 2c 20 74 68 65 20 74 61 62 6c 65 20 6f 70  ed, the table op
16200 65 6e 65 64 20 69 74 68 20 63 75 72 73 6f 72 20  ened ith cursor 
16210 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 0a 20  pExpr->iTable . 
16220 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68 65   ** contains the
16230 20 76 61 6c 75 65 73 20 74 68 61 74 20 6d 61 6b   values that mak
16240 65 20 75 70 20 74 68 65 20 52 48 53 2e 20 49 66  e up the RHS. If
16250 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 20 69   IN_INDEX_NOOP i
16260 73 20 72 65 74 75 72 6e 65 64 2c 0a 20 20 2a 2a  s returned,.  **
16270 20 74 68 65 20 52 48 53 20 68 61 73 20 6e 6f 74   the RHS has not
16280 20 79 65 74 20 62 65 65 6e 20 63 6f 64 65 64 2e   yet been coded.
16290 20 20 2a 2f 0a 20 20 76 20 3d 20 70 50 61 72 73    */.  v = pPars
162a0 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65  e->pVdbe;.  asse
162b0 72 74 28 20 76 21 3d 30 20 29 3b 20 20 20 20 20  rt( v!=0 );     
162c0 20 20 2f 2a 20 4f 4f 4d 20 64 65 74 65 63 74 65    /* OOM detecte
162d0 64 20 70 72 69 6f 72 20 74 6f 20 74 68 69 73 20  d prior to this 
162e0 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 56 64 62  routine */.  Vdb
162f0 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c  eNoopComment((v,
16300 20 22 62 65 67 69 6e 20 49 4e 20 65 78 70 72 22   "begin IN expr"
16310 29 29 3b 0a 20 20 65 54 79 70 65 20 3d 20 73 71  ));.  eType = sq
16320 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e 64 65 78  lite3FindInIndex
16330 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 0a  (pParse, pExpr,.
16340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16350 20 20 20 20 20 20 20 20 20 20 20 20 20 49 4e 5f               IN_
16360 49 4e 44 45 58 5f 4d 45 4d 42 45 52 53 48 49 50  INDEX_MEMBERSHIP
16370 20 7c 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50   | IN_INDEX_NOOP
16380 5f 4f 4b 2c 0a 20 20 20 20 20 20 20 20 20 20 20  _OK,.           
16390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
163a0 20 20 64 65 73 74 49 66 46 61 6c 73 65 3d 3d 64    destIfFalse==d
163b0 65 73 74 49 66 4e 75 6c 6c 20 3f 20 30 20 3a 20  estIfNull ? 0 : 
163c0 26 72 52 68 73 48 61 73 4e 75 6c 6c 2c 20 61 69  &rRhsHasNull, ai
163d0 4d 61 70 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  Map);..  assert(
163e0 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c   pParse->nErr ||
163f0 20 6e 56 65 63 74 6f 72 3d 3d 31 20 7c 7c 20 65   nVector==1 || e
16400 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 45  Type==IN_INDEX_E
16410 50 48 0a 20 20 20 20 20 20 20 7c 7c 20 65 54 79  PH.       || eTy
16420 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 49 4e 44  pe==IN_INDEX_IND
16430 45 58 5f 41 53 43 20 7c 7c 20 65 54 79 70 65 3d  EX_ASC || eType=
16440 3d 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f  =IN_INDEX_INDEX_
16450 44 45 53 43 20 0a 20 20 29 3b 0a 0a 20 20 2f 2a  DESC .  );..  /*
16460 20 43 6f 64 65 20 74 68 65 20 4c 48 53 2c 20 74   Code the LHS, t
16470 68 65 20 3c 65 78 70 72 3e 20 66 72 6f 6d 20 22  he <expr> from "
16480 3c 65 78 70 72 3e 20 49 4e 20 28 2e 2e 2e 29 22  <expr> IN (...)"
16490 2e 20 49 66 20 74 68 65 20 4c 48 53 20 69 73 20  . If the LHS is 
164a0 61 20 0a 20 20 2a 2a 20 76 65 63 74 6f 72 2c 20  a .  ** vector, 
164b0 74 68 65 6e 20 69 74 20 69 73 20 73 74 6f 72 65  then it is store
164c0 64 20 69 6e 20 61 6e 20 61 72 72 61 79 20 6f 66  d in an array of
164d0 20 6e 56 65 63 74 6f 72 20 72 65 67 69 73 74 65   nVector registe
164e0 72 73 20 73 74 61 72 74 69 6e 67 20 0a 20 20 2a  rs starting .  *
164f0 2a 20 61 74 20 72 31 2e 0a 20 20 2a 2f 0a 20 20  * at r1..  */.  
16500 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r1 = sqlite3GetT
16510 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
16520 20 6e 56 65 63 74 6f 72 29 3b 0a 20 20 73 71 6c   nVector);.  sql
16530 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73  ite3ExprCachePus
16540 68 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  h(pParse);.  if(
16550 20 6e 56 65 63 74 6f 72 3e 31 20 26 26 20 28 70   nVector>1 && (p
16560 4c 65 66 74 2d 3e 66 6c 61 67 73 20 26 20 45 50  Left->flags & EP
16570 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20  _xIsSelect) ){. 
16580 20 20 20 69 6e 74 20 72 65 67 53 65 6c 65 63 74     int regSelect
16590 20 3d 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75   = sqlite3CodeSu
165a0 62 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  bselect(pParse, 
165b0 70 4c 65 66 74 2c 20 30 2c 20 30 29 3b 0a 20 20  pLeft, 0, 0);.  
165c0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 65    for(i=0; i<nVe
165d0 63 74 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  ctor; i++){.    
165e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
165f0 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20  Op3(v, OP_Copy, 
16600 72 65 67 53 65 6c 65 63 74 2b 69 2c 20 72 31 2b  regSelect+i, r1+
16610 61 69 4d 61 70 5b 69 5d 2c 20 30 29 3b 0a 20 20  aiMap[i], 0);.  
16620 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
16630 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 65 63   for(i=0; i<nVec
16640 74 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  tor; i++){.     
16650 20 45 78 70 72 20 2a 70 4c 68 73 20 3d 20 73 71   Expr *pLhs = sq
16660 6c 69 74 65 33 56 65 63 74 6f 72 46 69 65 6c 64  lite3VectorField
16670 53 75 62 65 78 70 72 28 70 4c 65 66 74 2c 20 69  Subexpr(pLeft, i
16680 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
16690 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
166a0 20 70 4c 68 73 2c 20 72 31 2b 61 69 4d 61 70 5b   pLhs, r1+aiMap[
166b0 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  i]);.    }.  }..
166c0 20 20 2f 2a 20 49 66 20 73 71 6c 69 74 65 33 46    /* If sqlite3F
166d0 69 6e 64 49 6e 49 6e 64 65 78 28 29 20 64 69 64  indInIndex() did
166e0 20 6e 6f 74 20 66 69 6e 64 20 6f 72 20 63 72 65   not find or cre
166f0 61 74 65 20 61 6e 20 69 6e 64 65 78 20 74 68 61  ate an index tha
16700 74 20 69 73 0a 20 20 2a 2a 20 73 75 69 74 61 62  t is.  ** suitab
16710 6c 65 20 66 6f 72 20 65 76 61 6c 75 61 74 69 6e  le for evaluatin
16720 67 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f  g the IN operato
16730 72 2c 20 74 68 65 6e 20 65 76 61 6c 75 61 74 65  r, then evaluate
16740 20 75 73 69 6e 67 20 61 0a 20 20 2a 2a 20 73 65   using a.  ** se
16750 71 75 65 6e 63 65 20 6f 66 20 63 6f 6d 70 61 72  quence of compar
16760 69 73 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  isons..  */.  if
16770 28 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45  ( eType==IN_INDE
16780 58 5f 4e 4f 4f 50 20 29 7b 0a 20 20 20 20 45 78  X_NOOP ){.    Ex
16790 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20  prList *pList = 
167a0 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a  pExpr->x.pList;.
167b0 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
167c0 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
167d0 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
167e0 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
167f0 20 20 20 69 6e 74 20 6c 61 62 65 6c 4f 6b 20 3d     int labelOk =
16800 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
16810 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 69 6e  Label(v);.    in
16820 74 20 72 32 2c 20 72 65 67 54 6f 46 72 65 65 3b  t r2, regToFree;
16830 0a 20 20 20 20 69 6e 74 20 72 65 67 43 6b 4e 75  .    int regCkNu
16840 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  ll = 0;.    int 
16850 69 69 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ii;.    assert( 
16860 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
16870 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  (pExpr, EP_xIsSe
16880 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 69 66 28  lect) );.    if(
16890 20 64 65 73 74 49 66 4e 75 6c 6c 21 3d 64 65 73   destIfNull!=des
168a0 74 49 66 46 61 6c 73 65 20 29 7b 0a 20 20 20 20  tIfFalse ){.    
168b0 20 20 72 65 67 43 6b 4e 75 6c 6c 20 3d 20 73 71    regCkNull = sq
168c0 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
168d0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73  pParse);.      s
168e0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
168f0 28 76 2c 20 4f 50 5f 42 69 74 41 6e 64 2c 20 72  (v, OP_BitAnd, r
16900 31 2c 20 72 31 2c 20 72 65 67 43 6b 4e 75 6c 6c  1, r1, regCkNull
16910 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  );.    }.    for
16920 28 69 69 3d 30 3b 20 69 69 3c 70 4c 69 73 74 2d  (ii=0; ii<pList-
16930 3e 6e 45 78 70 72 3b 20 69 69 2b 2b 29 7b 0a 20  >nExpr; ii++){. 
16940 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65       r2 = sqlite
16950 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
16960 61 72 73 65 2c 20 70 4c 69 73 74 2d 3e 61 5b 69  arse, pList->a[i
16970 69 5d 2e 70 45 78 70 72 2c 20 26 72 65 67 54 6f  i].pExpr, &regTo
16980 46 72 65 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Free);.      if(
16990 20 72 65 67 43 6b 4e 75 6c 6c 20 26 26 20 73 71   regCkNull && sq
169a0 6c 69 74 65 33 45 78 70 72 43 61 6e 42 65 4e 75  lite3ExprCanBeNu
169b0 6c 6c 28 70 4c 69 73 74 2d 3e 61 5b 69 69 5d 2e  ll(pList->a[ii].
169c0 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20  pExpr) ){.      
169d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
169e0 4f 70 33 28 76 2c 20 4f 50 5f 42 69 74 41 6e 64  Op3(v, OP_BitAnd
169f0 2c 20 72 65 67 43 6b 4e 75 6c 6c 2c 20 72 32 2c  , regCkNull, r2,
16a00 20 72 65 67 43 6b 4e 75 6c 6c 29 3b 0a 20 20 20   regCkNull);.   
16a10 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69     }.      if( i
16a20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31  i<pList->nExpr-1
16a30 20 7c 7c 20 64 65 73 74 49 66 4e 75 6c 6c 21 3d   || destIfNull!=
16a40 64 65 73 74 49 66 46 61 6c 73 65 20 29 7b 0a 20  destIfFalse ){. 
16a50 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
16a60 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 45  beAddOp4(v, OP_E
16a70 71 2c 20 72 31 2c 20 6c 61 62 65 6c 4f 6b 2c 20  q, r1, labelOk, 
16a80 72 32 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  r2,.            
16a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 76                (v
16aa0 6f 69 64 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43  oid*)pColl, P4_C
16ab0 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 20 20 20  OLLSEQ);.       
16ac0 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
16ad0 76 2c 20 69 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  v, ii<pList->nEx
16ae0 70 72 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 56  pr-1);.        V
16af0 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
16b00 20 69 69 3d 3d 70 4c 69 73 74 2d 3e 6e 45 78 70   ii==pList->nExp
16b10 72 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71  r-1);.        sq
16b20 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
16b30 35 28 76 2c 20 7a 41 66 66 5b 30 5d 29 3b 0a 20  5(v, zAff[0]);. 
16b40 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
16b50 20 20 20 20 61 73 73 65 72 74 28 20 64 65 73 74      assert( dest
16b60 49 66 4e 75 6c 6c 3d 3d 64 65 73 74 49 66 46 61  IfNull==destIfFa
16b70 6c 73 65 20 29 3b 0a 20 20 20 20 20 20 20 20 73  lse );.        s
16b80 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
16b90 28 76 2c 20 4f 50 5f 4e 65 2c 20 72 31 2c 20 64  (v, OP_Ne, r1, d
16ba0 65 73 74 49 66 46 61 6c 73 65 2c 20 72 32 2c 0a  estIfFalse, r2,.
16bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16bc0 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a            (void*
16bd0 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53  )pColl, P4_COLLS
16be0 45 51 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  EQ); VdbeCoverag
16bf0 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71  e(v);.        sq
16c00 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
16c10 35 28 76 2c 20 7a 41 66 66 5b 30 5d 20 7c 20 53  5(v, zAff[0] | S
16c20 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
16c30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
16c40 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
16c50 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
16c60 65 67 54 6f 46 72 65 65 29 3b 0a 20 20 20 20 7d  egToFree);.    }
16c70 0a 20 20 20 20 69 66 28 20 72 65 67 43 6b 4e 75  .    if( regCkNu
16c80 6c 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ll ){.      sqli
16c90 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
16ca0 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 65 67 43   OP_IsNull, regC
16cb0 6b 4e 75 6c 6c 2c 20 64 65 73 74 49 66 4e 75 6c  kNull, destIfNul
16cc0 6c 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  l); VdbeCoverage
16cd0 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (v);.      sqlit
16ce0 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 64 65  e3VdbeGoto(v, de
16cf0 73 74 49 66 46 61 6c 73 65 29 3b 0a 20 20 20 20  stIfFalse);.    
16d00 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  }.    sqlite3Vdb
16d10 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
16d20 20 6c 61 62 65 6c 4f 6b 29 3b 0a 20 20 20 20 73   labelOk);.    s
16d30 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
16d40 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
16d50 43 6b 4e 75 6c 6c 29 3b 0a 20 20 7d 65 6c 73 65  CkNull);.  }else
16d60 7b 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 61  {.  .    /* If a
16d70 6e 79 20 76 61 6c 75 65 20 6f 6e 20 74 68 65 20  ny value on the 
16d80 4c 48 53 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65  LHS is NULL, the
16d90 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 49   result of the I
16da0 4e 28 2e 2e 2e 29 20 6f 70 65 72 61 74 6f 72 0a  N(...) operator.
16db0 20 20 20 20 2a 2a 20 6d 75 73 74 20 62 65 20 65      ** must be e
16dc0 69 74 68 65 72 20 66 61 6c 73 65 20 6f 72 20 4e  ither false or N
16dd0 55 4c 4c 2e 20 49 66 20 74 68 65 73 65 20 74 77  ULL. If these tw
16de0 6f 20 61 72 65 20 68 61 6e 64 6c 65 64 20 69 64  o are handled id
16df0 65 6e 74 69 63 61 6c 6c 79 2c 0a 20 20 20 20 2a  entically,.    *
16e00 2a 20 74 65 73 74 20 74 68 65 20 4c 48 53 20 66  * test the LHS f
16e10 6f 72 20 4e 55 4c 4c 73 20 61 6e 64 20 6a 75 6d  or NULLs and jum
16e20 70 20 64 69 72 65 63 74 6c 79 20 74 6f 20 64 65  p directly to de
16e30 73 74 49 66 4e 75 6c 6c 20 69 66 20 61 6e 79 20  stIfNull if any 
16e40 61 72 65 0a 20 20 20 20 2a 2a 20 66 6f 75 6e 64  are.    ** found
16e50 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  . .    **.    **
16e60 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 4e   Otherwise, if N
16e70 55 4c 4c 20 61 6e 64 20 66 61 6c 73 65 20 61 72  ULL and false ar
16e80 65 20 68 61 6e 64 6c 65 64 20 64 69 66 66 65 72  e handled differ
16e90 65 6e 74 6c 79 2c 20 61 6e 64 20 74 68 65 0a 20  ently, and the. 
16ea0 20 20 20 2a 2a 20 49 4e 28 2e 2e 2e 29 20 6f 70     ** IN(...) op
16eb0 65 72 61 74 69 6f 6e 20 69 73 20 6e 6f 74 20 61  eration is not a
16ec0 20 76 65 63 74 6f 72 20 6f 70 65 72 61 74 69 6f   vector operatio
16ed0 6e 2c 20 61 6e 64 20 74 68 65 20 4c 48 53 20 6f  n, and the LHS o
16ee0 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 70 65  f the.    ** ope
16ef0 72 61 74 6f 72 20 69 73 20 4e 55 4c 4c 2c 20 74  rator is NULL, t
16f00 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 69  hen the result i
16f10 73 20 66 61 6c 73 65 20 69 66 20 74 68 65 20 69  s false if the i
16f20 6e 64 65 78 20 69 73 20 0a 20 20 20 20 2a 2a 20  ndex is .    ** 
16f30 63 6f 6d 70 6c 65 74 65 6c 79 20 65 6d 70 74 79  completely empty
16f40 2c 20 6f 72 20 4e 55 4c 4c 20 6f 74 68 65 72 77  , or NULL otherw
16f50 69 73 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28  ise.  */.    if(
16f60 20 64 65 73 74 49 66 4e 75 6c 6c 3d 3d 64 65 73   destIfNull==des
16f70 74 49 66 46 61 6c 73 65 20 29 7b 0a 20 20 20 20  tIfFalse ){.    
16f80 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 65    for(i=0; i<nVe
16f90 63 74 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  ctor; i++){.    
16fa0 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 73 71      Expr *p = sq
16fb0 6c 69 74 65 33 56 65 63 74 6f 72 46 69 65 6c 64  lite3VectorField
16fc0 53 75 62 65 78 70 72 28 70 45 78 70 72 2d 3e 70  Subexpr(pExpr->p
16fd0 4c 65 66 74 2c 20 69 29 3b 0a 20 20 20 20 20 20  Left, i);.      
16fe0 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
16ff0 72 43 61 6e 42 65 4e 75 6c 6c 28 70 29 20 29 7b  rCanBeNull(p) ){
17000 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
17010 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
17020 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 31 2b 61 69  OP_IsNull, r1+ai
17030 4d 61 70 5b 69 5d 2c 20 64 65 73 74 49 66 4e 75  Map[i], destIfNu
17040 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 56  ll);.          V
17050 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
17060 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
17070 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  }.    }else if( 
17080 6e 56 65 63 74 6f 72 3d 3d 31 20 26 26 20 73 71  nVector==1 && sq
17090 6c 69 74 65 33 45 78 70 72 43 61 6e 42 65 4e 75  lite3ExprCanBeNu
170a0 6c 6c 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  ll(pExpr->pLeft)
170b0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64   ){.      int ad
170c0 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62  dr1 = sqlite3Vdb
170d0 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 6f  eAddOp1(v, OP_No
170e0 74 4e 75 6c 6c 2c 20 72 31 29 3b 20 56 64 62 65  tNull, r1); Vdbe
170f0 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
17100 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
17110 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e  dOp2(v, OP_Rewin
17120 64 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  d, pExpr->iTable
17130 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a  , destIfFalse);.
17140 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
17150 67 65 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c  ge(v);.      sql
17160 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20  ite3VdbeGoto(v, 
17170 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  destIfNull);.   
17180 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
17190 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 31 29  mpHere(v, addr1)
171a0 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69  ;.    }.  .    i
171b0 66 28 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44  f( eType==IN_IND
171c0 45 58 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20 20  EX_ROWID ){.    
171d0 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 63 61 73    /* In this cas
171e0 65 2c 20 74 68 65 20 52 48 53 20 69 73 20 74 68  e, the RHS is th
171f0 65 20 52 4f 57 49 44 20 6f 66 20 74 61 62 6c 65  e ROWID of table
17200 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20 20 20 20   b-tree */.     
17210 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
17220 70 33 28 76 2c 20 4f 50 5f 53 65 65 6b 52 6f 77  p3(v, OP_SeekRow
17230 69 64 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  id, pExpr->iTabl
17240 65 2c 20 64 65 73 74 49 66 46 61 6c 73 65 2c 20  e, destIfFalse, 
17250 72 31 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  r1);.      VdbeC
17260 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
17270 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
17280 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 74 68  In this case, th
17290 65 20 52 48 53 20 69 73 20 61 6e 20 69 6e 64 65  e RHS is an inde
172a0 78 20 62 2d 74 72 65 65 2e 20 41 70 70 6c 79 20  x b-tree. Apply 
172b0 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 0a 20  the comparison. 
172c0 20 20 20 20 20 2a 2a 20 61 66 66 69 6e 69 74 69       ** affiniti
172d0 65 73 20 74 6f 20 65 61 63 68 20 76 61 6c 75 65  es to each value
172e0 20 6f 6e 20 74 68 65 20 4c 48 53 20 6f 66 20 74   on the LHS of t
172f0 68 65 20 6f 70 65 72 61 74 6f 72 2e 20 20 2a 2f  he operator.  */
17300 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
17310 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 41  beAddOp4(v, OP_A
17320 66 66 69 6e 69 74 79 2c 20 72 31 2c 20 6e 56 65  ffinity, r1, nVe
17330 63 74 6f 72 2c 20 30 2c 20 7a 41 66 66 2c 20 6e  ctor, 0, zAff, n
17340 56 65 63 74 6f 72 29 3b 0a 20 20 20 20 20 20 0a  Vector);.      .
17350 20 20 20 20 20 20 69 66 28 20 6e 56 65 63 74 6f        if( nVecto
17360 72 3e 31 20 26 26 20 64 65 73 74 49 66 4e 75 6c  r>1 && destIfNul
17370 6c 21 3d 64 65 73 74 49 66 46 61 6c 73 65 20 29  l!=destIfFalse )
17380 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 49  {.        int iI
17390 64 78 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62  dx = pExpr->iTab
173a0 6c 65 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  le;.        int 
173b0 61 64 64 72 3b 0a 20 20 20 20 20 20 20 20 69 6e  addr;.        in
173c0 74 20 61 64 64 72 4e 65 78 74 3b 0a 0a 20 20 20  t addrNext;..   
173d0 20 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20 74       /* Search t
173e0 68 65 20 69 6e 64 65 78 20 66 6f 72 20 74 68 65  he index for the
173f0 20 6b 65 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20   key. */.       
17400 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
17410 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
17420 4f 50 5f 46 6f 75 6e 64 2c 20 69 49 64 78 2c 20  OP_Found, iIdx, 
17430 30 2c 20 72 31 2c 20 6e 56 65 63 74 6f 72 29 3b  0, r1, nVector);
17440 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76  .        VdbeCov
17450 65 72 61 67 65 28 76 29 3b 0a 0a 20 20 20 20 20  erage(v);..     
17460 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f     /* At this po
17470 69 6e 74 20 74 68 65 20 73 70 65 63 69 66 69 65  int the specifie
17480 64 20 6b 65 79 20 69 73 20 6e 6f 74 20 70 72 65  d key is not pre
17490 73 65 6e 74 20 69 6e 20 74 68 65 20 69 6e 64 65  sent in the inde
174a0 78 2c 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 73  x, .        ** s
174b0 6f 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20  o the result of 
174c0 74 68 65 20 49 4e 28 2e 2e 29 20 6f 70 65 72 61  the IN(..) opera
174d0 74 6f 72 20 6d 75 73 74 20 62 65 20 65 69 74 68  tor must be eith
174e0 65 72 20 4e 55 4c 4c 20 6f 72 0a 20 20 20 20 20  er NULL or.     
174f0 20 20 20 2a 2a 20 30 2e 20 54 68 65 20 76 64 62     ** 0. The vdb
17500 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64  e code generated
17510 20 62 65 6c 6f 77 20 66 69 67 75 72 65 73 20 6f   below figures o
17520 75 74 20 77 68 69 63 68 2e 20 20 2a 2f 0a 20 20  ut which.  */.  
17530 20 20 20 20 20 20 61 64 64 72 4e 65 78 74 20 3d        addrNext =
17540 20 31 2b 73 71 6c 69 74 65 33 56 64 62 65 41 64   1+sqlite3VdbeAd
17550 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e  dOp2(v, OP_Rewin
17560 64 2c 20 69 49 64 78 2c 20 64 65 73 74 49 66 46  d, iIdx, destIfF
17570 61 6c 73 65 29 3b 0a 20 20 20 20 20 20 20 20 56  alse);.        V
17580 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
17590 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
175a0 3b 20 69 3c 6e 56 65 63 74 6f 72 3b 20 69 2b 2b  ; i<nVector; i++
175b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45 78 70  ){.          Exp
175c0 72 20 2a 70 3b 0a 20 20 20 20 20 20 20 20 20 20  r *p;.          
175d0 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a  CollSeq *pColl;.
175e0 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 72 32            int r2
175f0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
17600 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
17610 20 20 20 20 20 20 20 20 70 20 3d 20 73 71 6c 69          p = sqli
17620 74 65 33 56 65 63 74 6f 72 46 69 65 6c 64 53 75  te3VectorFieldSu
17630 62 65 78 70 72 28 70 4c 65 66 74 2c 20 69 29 3b  bexpr(pLeft, i);
17640 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 6c  .          pColl
17650 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
17660 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 29  llSeq(pParse, p)
17670 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ;..          sql
17680 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
17690 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 49 64  , OP_Column, iId
176a0 78 2c 20 69 2c 20 72 32 29 3b 0a 20 20 20 20 20  x, i, r2);.     
176b0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
176c0 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 45 71 2c  AddOp4(v, OP_Eq,
176d0 20 72 31 2b 69 2c 20 30 2c 20 72 32 2c 20 28 76   r1+i, 0, r2, (v
176e0 6f 69 64 2a 29 70 43 6f 6c 6c 2c 50 34 5f 43 4f  oid*)pColl,P4_CO
176f0 4c 4c 53 45 51 29 3b 0a 20 20 20 20 20 20 20 20  LLSEQ);.        
17700 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
17710 6e 67 65 50 35 28 76 2c 20 53 51 4c 49 54 45 5f  ngeP5(v, SQLITE_
17720 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20  JUMPIFNULL);.   
17730 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
17740 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
17750 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
17760 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20  Op2(v, OP_Next, 
17770 69 49 64 78 2c 20 61 64 64 72 4e 65 78 74 29 3b  iIdx, addrNext);
17780 0a 20 20 20 20 20 20 20 20 20 20 56 64 62 65 43  .          VdbeC
17790 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
177a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
177b0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
177c0 74 6f 2c 20 30 2c 20 64 65 73 74 49 66 46 61 6c  to, 0, destIfFal
177d0 73 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  se);.          s
177e0 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
177f0 72 65 28 76 2c 20 73 71 6c 69 74 65 33 56 64 62  re(v, sqlite3Vdb
17800 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2d  eCurrentAddr(v)-
17810 33 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  3);.          sq
17820 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
17830 52 65 67 28 70 50 61 72 73 65 2c 20 72 32 29 3b  Reg(pParse, r2);
17840 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
17850 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
17860 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
17870 20 30 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b   0, destIfNull);
17880 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ..        /* The
17890 20 6b 65 79 20 77 61 73 20 66 6f 75 6e 64 20 69   key was found i
178a0 6e 20 74 68 65 20 69 6e 64 65 78 2e 20 49 66 20  n the index. If 
178b0 69 74 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79 20  it contains any 
178c0 4e 55 4c 4c 20 76 61 6c 75 65 73 2c 0a 20 20 20  NULL values,.   
178d0 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65       ** then the
178e0 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 49   result of the I
178f0 4e 28 2e 2e 2e 29 20 6f 70 65 72 61 74 6f 72 20  N(...) operator 
17900 69 73 20 4e 55 4c 4c 2e 20 4f 74 68 65 72 77 69  is NULL. Otherwi
17910 73 65 2c 20 74 68 65 0a 20 20 20 20 20 20 20 20  se, the.        
17920 2a 2a 20 72 65 73 75 6c 74 20 69 73 20 31 2e 20  ** result is 1. 
17930 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69   */.        sqli
17940 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
17950 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 20 20  v, addr);.      
17960 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 65    for(i=0; i<nVe
17970 63 74 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  ctor; i++){.    
17980 20 20 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20        Expr *p = 
17990 73 71 6c 69 74 65 33 56 65 63 74 6f 72 46 69 65  sqlite3VectorFie
179a0 6c 64 53 75 62 65 78 70 72 28 70 45 78 70 72 2d  ldSubexpr(pExpr-
179b0 3e 70 4c 65 66 74 2c 20 69 29 3b 0a 20 20 20 20  >pLeft, i);.    
179c0 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
179d0 33 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28 70  3ExprCanBeNull(p
179e0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
179f0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
17a00 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c  p2(v, OP_IsNull,
17a10 20 72 31 2b 61 69 4d 61 70 5b 69 5d 2c 20 64 65   r1+aiMap[i], de
17a20 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  stIfNull);.     
17a30 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
17a40 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
17a50 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20    }.        }.. 
17a60 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72       }else if( r
17a70 52 68 73 48 61 73 4e 75 6c 6c 3d 3d 30 20 29 7b  RhsHasNull==0 ){
17a80 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73  .        /* This
17a90 20 62 72 61 6e 63 68 20 72 75 6e 73 20 69 66 20   branch runs if 
17aa0 69 74 20 69 73 20 6b 6e 6f 77 6e 20 61 74 20 63  it is known at c
17ab0 6f 6d 70 69 6c 65 20 74 69 6d 65 20 74 68 61 74  ompile time that
17ac0 20 74 68 65 20 52 48 53 0a 20 20 20 20 20 20 20   the RHS.       
17ad0 20 2a 2a 20 63 61 6e 6e 6f 74 20 63 6f 6e 74 61   ** cannot conta
17ae0 69 6e 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2e 20  in NULL values. 
17af0 54 68 69 73 20 68 61 70 70 65 6e 73 20 61 73 20  This happens as 
17b00 61 20 72 65 73 75 6c 74 0a 20 20 20 20 20 20 20  a result.       
17b10 20 2a 2a 20 6f 66 20 22 4e 4f 54 20 4e 55 4c 4c   ** of "NOT NULL
17b20 22 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 69 6e  " constraints in
17b30 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
17b40 68 65 6d 61 2e 0a 20 20 20 20 20 20 20 20 2a 2a  hema..        **
17b50 0a 20 20 20 20 20 20 20 20 2a 2a 20 41 6c 73 6f  .        ** Also
17b60 20 72 75 6e 20 74 68 69 73 20 62 72 61 6e 63 68   run this branch
17b70 20 69 66 20 4e 55 4c 4c 20 69 73 20 65 71 75 69   if NULL is equi
17b80 76 61 6c 65 6e 74 20 74 6f 20 46 41 4c 53 45 0a  valent to FALSE.
17b90 20 20 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74          ** for t
17ba0 68 69 73 20 70 61 72 74 69 63 75 6c 61 72 20 49  his particular I
17bb0 4e 20 6f 70 65 72 61 74 6f 72 2e 20 20 2a 2f 0a  N operator.  */.
17bc0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
17bd0 64 62 65 41 64 64 4f 70 34 49 6e 74 28 0a 20 20  dbeAddOp4Int(.  
17be0 20 20 20 20 20 20 20 20 20 20 76 2c 20 4f 50 5f            v, OP_
17bf0 4e 6f 74 46 6f 75 6e 64 2c 20 70 45 78 70 72 2d  NotFound, pExpr-
17c00 3e 69 54 61 62 6c 65 2c 20 64 65 73 74 49 66 46  >iTable, destIfF
17c10 61 6c 73 65 2c 20 72 31 2c 20 6e 56 65 63 74 6f  alse, r1, nVecto
17c20 72 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  r.        );.   
17c30 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
17c40 65 28 76 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  e(v);.      }els
17c50 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 6e  e{.        /* In
17c60 20 74 68 69 73 20 62 72 61 6e 63 68 2c 20 74 68   this branch, th
17c70 65 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20  e RHS of the IN 
17c80 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 61 20  might contain a 
17c90 4e 55 4c 4c 20 61 6e 64 0a 20 20 20 20 20 20 20  NULL and.       
17ca0 20 2a 2a 20 74 68 65 20 70 72 65 73 65 6e 63 65   ** the presence
17cb0 20 6f 66 20 61 20 4e 55 4c 4c 20 6f 6e 20 74 68   of a NULL on th
17cc0 65 20 52 48 53 20 6d 61 6b 65 73 20 61 20 64 69  e RHS makes a di
17cd0 66 66 65 72 65 6e 63 65 20 69 6e 20 74 68 65 0a  fference in the.
17ce0 20 20 20 20 20 20 20 20 2a 2a 20 6f 75 74 63 6f          ** outco
17cf0 6d 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  me..        */. 
17d00 20 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 31         int addr1
17d10 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 69  ;..        /* Fi
17d20 72 73 74 20 63 68 65 63 6b 20 74 6f 20 73 65 65  rst check to see
17d30 20 69 66 20 74 68 65 20 4c 48 53 20 69 73 20 63   if the LHS is c
17d40 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20  ontained in the 
17d50 52 48 53 2e 20 20 49 66 20 73 6f 2c 0a 20 20 20  RHS.  If so,.   
17d60 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65       ** then the
17d70 20 61 6e 73 77 65 72 20 69 73 20 54 52 55 45 20   answer is TRUE 
17d80 74 68 65 20 70 72 65 73 65 6e 63 65 20 6f 66 20  the presence of 
17d90 4e 55 4c 4c 73 20 69 6e 20 74 68 65 20 52 48 53  NULLs in the RHS
17da0 20 64 6f 65 73 0a 20 20 20 20 20 20 20 20 2a 2a   does.        **
17db0 20 6e 6f 74 20 6d 61 74 74 65 72 2e 20 20 49 66   not matter.  If
17dc0 20 74 68 65 20 4c 48 53 20 69 73 20 6e 6f 74 20   the LHS is not 
17dd0 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65  contained in the
17de0 20 52 48 53 2c 20 74 68 65 6e 20 74 68 65 0a 20   RHS, then the. 
17df0 20 20 20 20 20 20 20 2a 2a 20 61 6e 73 77 65 72         ** answer
17e00 20 69 73 20 4e 55 4c 4c 20 69 66 20 74 68 65 20   is NULL if the 
17e10 52 48 53 20 63 6f 6e 74 61 69 6e 73 20 4e 55 4c  RHS contains NUL
17e20 4c 73 20 61 6e 64 20 74 68 65 20 61 6e 73 77 65  Ls and the answe
17e30 72 20 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  r is.        ** 
17e40 46 41 4c 53 45 20 69 66 20 74 68 65 20 52 48 53  FALSE if the RHS
17e50 20 69 73 20 4e 55 4c 4c 2d 66 72 65 65 2e 0a 20   is NULL-free.. 
17e60 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
17e70 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65    addr1 = sqlite
17e80 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
17e90 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 70 45 78 70  , OP_Found, pExp
17ea0 72 2d 3e 69 54 61 62 6c 65 2c 20 30 2c 20 72 31  r->iTable, 0, r1
17eb0 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 56 64  , 1);.        Vd
17ec0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
17ed0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
17ee0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
17ef0 73 4e 75 6c 6c 2c 20 72 52 68 73 48 61 73 4e 75  sNull, rRhsHasNu
17f00 6c 6c 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b  ll, destIfNull);
17f10 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76  .        VdbeCov
17f20 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
17f30 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74    sqlite3VdbeGot
17f40 6f 28 76 2c 20 64 65 73 74 49 66 46 61 6c 73 65  o(v, destIfFalse
17f50 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
17f60 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
17f70 2c 20 61 64 64 72 31 29 3b 0a 20 20 20 20 20 20  , addr1);.      
17f80 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  }.    }.  }.  sq
17f90 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
17fa0 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b  Reg(pParse, r1);
17fb0 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  .  sqlite3ExprCa
17fc0 63 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a  chePop(pParse);.
17fd0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
17fe0 70 50 61 72 73 65 2d 3e 64 62 2c 20 61 69 4d 61  pParse->db, aiMa
17ff0 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  p);.  sqlite3DbF
18000 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ree(pParse->db, 
18010 7a 41 66 66 29 3b 0a 20 20 56 64 62 65 43 6f 6d  zAff);.  VdbeCom
18020 6d 65 6e 74 28 28 76 2c 20 22 65 6e 64 20 49 4e  ment((v, "end IN
18030 20 65 78 70 72 22 29 29 3b 0a 7d 0a 23 65 6e 64   expr"));.}.#end
18040 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
18050 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 23  T_SUBQUERY */..#
18060 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
18070 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e  IT_FLOATING_POIN
18080 54 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  T./*.** Generate
18090 20 61 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20   an instruction 
180a0 74 68 61 74 20 77 69 6c 6c 20 70 75 74 20 74 68  that will put th
180b0 65 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74  e floating point
180c0 0a 2a 2a 20 76 61 6c 75 65 20 64 65 73 63 72 69  .** value descri
180d0 62 65 64 20 62 79 20 7a 5b 30 2e 2e 6e 2d 31 5d  bed by z[0..n-1]
180e0 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20 69   into register i
180f0 4d 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a  Mem..**.** The z
18100 5b 5d 20 73 74 72 69 6e 67 20 77 69 6c 6c 20 70  [] string will p
18110 72 6f 62 61 62 6c 79 20 6e 6f 74 20 62 65 20 7a  robably not be z
18120 65 72 6f 2d 74 65 72 6d 69 6e 61 74 65 64 2e 20  ero-terminated. 
18130 20 42 75 74 20 74 68 65 20 0a 2a 2a 20 7a 5b 6e   But the .** z[n
18140 5d 20 63 68 61 72 61 63 74 65 72 20 69 73 20 67  ] character is g
18150 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20  uaranteed to be 
18160 73 6f 6d 65 74 68 69 6e 67 20 74 68 61 74 20 64  something that d
18170 6f 65 73 20 6e 6f 74 20 6c 6f 6f 6b 0a 2a 2a 20  oes not look.** 
18180 6c 69 6b 65 20 74 68 65 20 63 6f 6e 74 69 6e 75  like the continu
18190 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e 75 6d  ation of the num
181a0 62 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ber..*/.static v
181b0 6f 69 64 20 63 6f 64 65 52 65 61 6c 28 56 64 62  oid codeReal(Vdb
181c0 65 20 2a 76 2c 20 63 6f 6e 73 74 20 63 68 61 72  e *v, const char
181d0 20 2a 7a 2c 20 69 6e 74 20 6e 65 67 61 74 65 46   *z, int negateF
181e0 6c 61 67 2c 20 69 6e 74 20 69 4d 65 6d 29 7b 0a  lag, int iMem){.
181f0 20 20 69 66 28 20 41 4c 57 41 59 53 28 7a 21 3d    if( ALWAYS(z!=
18200 30 29 20 29 7b 0a 20 20 20 20 64 6f 75 62 6c 65  0) ){.    double
18210 20 76 61 6c 75 65 3b 0a 20 20 20 20 73 71 6c 69   value;.    sqli
18220 74 65 33 41 74 6f 46 28 7a 2c 20 26 76 61 6c 75  te3AtoF(z, &valu
18230 65 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  e, sqlite3Strlen
18240 33 30 28 7a 29 2c 20 53 51 4c 49 54 45 5f 55 54  30(z), SQLITE_UT
18250 46 38 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  F8);.    assert(
18260 20 21 73 71 6c 69 74 65 33 49 73 4e 61 4e 28 76   !sqlite3IsNaN(v
18270 61 6c 75 65 29 20 29 3b 20 2f 2a 20 54 68 65 20  alue) ); /* The 
18280 6e 65 77 20 41 74 6f 46 20 6e 65 76 65 72 20 72  new AtoF never r
18290 65 74 75 72 6e 73 20 4e 61 4e 20 2a 2f 0a 20 20  eturns NaN */.  
182a0 20 20 69 66 28 20 6e 65 67 61 74 65 46 6c 61 67    if( negateFlag
182b0 20 29 20 76 61 6c 75 65 20 3d 20 2d 76 61 6c 75   ) value = -valu
182c0 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  e;.    sqlite3Vd
182d0 62 65 41 64 64 4f 70 34 44 75 70 38 28 76 2c 20  beAddOp4Dup8(v, 
182e0 4f 50 5f 52 65 61 6c 2c 20 30 2c 20 69 4d 65 6d  OP_Real, 0, iMem
182f0 2c 20 30 2c 20 28 75 38 2a 29 26 76 61 6c 75 65  , 0, (u8*)&value
18300 2c 20 50 34 5f 52 45 41 4c 29 3b 0a 20 20 7d 0a  , P4_REAL);.  }.
18310 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  }.#endif.../*.**
18320 20 47 65 6e 65 72 61 74 65 20 61 6e 20 69 6e 73   Generate an ins
18330 74 72 75 63 74 69 6f 6e 20 74 68 61 74 20 77 69  truction that wi
18340 6c 6c 20 70 75 74 20 74 68 65 20 69 6e 74 65 67  ll put the integ
18350 65 72 20 64 65 73 63 72 69 62 65 20 62 79 0a 2a  er describe by.*
18360 2a 20 74 65 78 74 20 7a 5b 30 2e 2e 6e 2d 31 5d  * text z[0..n-1]
18370 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20 69   into register i
18380 4d 65 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78 70 72 2e  Mem..**.** Expr.
18390 75 2e 7a 54 6f 6b 65 6e 20 69 73 20 61 6c 77 61  u.zToken is alwa
183a0 79 73 20 55 54 46 38 20 61 6e 64 20 7a 65 72 6f  ys UTF8 and zero
183b0 2d 74 65 72 6d 69 6e 61 74 65 64 2e 0a 2a 2f 0a  -terminated..*/.
183c0 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65  static void code
183d0 49 6e 74 65 67 65 72 28 50 61 72 73 65 20 2a 70  Integer(Parse *p
183e0 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
183f0 70 72 2c 20 69 6e 74 20 6e 65 67 46 6c 61 67 2c  pr, int negFlag,
18400 20 69 6e 74 20 69 4d 65 6d 29 7b 0a 20 20 56 64   int iMem){.  Vd
18410 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
18420 70 56 64 62 65 3b 0a 20 20 69 66 28 20 70 45 78  pVdbe;.  if( pEx
18430 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 49  pr->flags & EP_I
18440 6e 74 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 69  ntValue ){.    i
18450 6e 74 20 69 20 3d 20 70 45 78 70 72 2d 3e 75 2e  nt i = pExpr->u.
18460 69 56 61 6c 75 65 3b 0a 20 20 20 20 61 73 73 65  iValue;.    asse
18470 72 74 28 20 69 3e 3d 30 20 29 3b 0a 20 20 20 20  rt( i>=0 );.    
18480 69 66 28 20 6e 65 67 46 6c 61 67 20 29 20 69 20  if( negFlag ) i 
18490 3d 20 2d 69 3b 0a 20 20 20 20 73 71 6c 69 74 65  = -i;.    sqlite
184a0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
184b0 50 5f 49 6e 74 65 67 65 72 2c 20 69 2c 20 69 4d  P_Integer, i, iM
184c0 65 6d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  em);.  }else{.  
184d0 20 20 69 6e 74 20 63 3b 0a 20 20 20 20 69 36 34    int c;.    i64
184e0 20 76 61 6c 75 65 3b 0a 20 20 20 20 63 6f 6e 73   value;.    cons
184f0 74 20 63 68 61 72 20 2a 7a 20 3d 20 70 45 78 70  t char *z = pExp
18500 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20  r->u.zToken;.   
18510 20 61 73 73 65 72 74 28 20 7a 21 3d 30 20 29 3b   assert( z!=0 );
18520 0a 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33  .    c = sqlite3
18530 44 65 63 4f 72 48 65 78 54 6f 49 36 34 28 7a 2c  DecOrHexToI64(z,
18540 20 26 76 61 6c 75 65 29 3b 0a 20 20 20 20 69 66   &value);.    if
18550 28 20 63 3d 3d 30 20 7c 7c 20 28 63 3d 3d 32 20  ( c==0 || (c==2 
18560 26 26 20 6e 65 67 46 6c 61 67 29 20 29 7b 0a 20  && negFlag) ){. 
18570 20 20 20 20 20 69 66 28 20 6e 65 67 46 6c 61 67       if( negFlag
18580 20 29 7b 20 76 61 6c 75 65 20 3d 20 63 3d 3d 32   ){ value = c==2
18590 20 3f 20 53 4d 41 4c 4c 45 53 54 5f 49 4e 54 36   ? SMALLEST_INT6
185a0 34 20 3a 20 2d 76 61 6c 75 65 3b 20 7d 0a 20 20  4 : -value; }.  
185b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
185c0 64 64 4f 70 34 44 75 70 38 28 76 2c 20 4f 50 5f  ddOp4Dup8(v, OP_
185d0 49 6e 74 36 34 2c 20 30 2c 20 69 4d 65 6d 2c 20  Int64, 0, iMem, 
185e0 30 2c 20 28 75 38 2a 29 26 76 61 6c 75 65 2c 20  0, (u8*)&value, 
185f0 50 34 5f 49 4e 54 36 34 29 3b 0a 20 20 20 20 7d  P4_INT64);.    }
18600 65 6c 73 65 7b 0a 23 69 66 64 65 66 20 53 51 4c  else{.#ifdef SQL
18610 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e  ITE_OMIT_FLOATIN
18620 47 5f 50 4f 49 4e 54 0a 20 20 20 20 20 20 73 71  G_POINT.      sq
18630 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
18640 61 72 73 65 2c 20 22 6f 76 65 72 73 69 7a 65 64  arse, "oversized
18650 20 69 6e 74 65 67 65 72 3a 20 25 73 25 73 22 2c   integer: %s%s",
18660 20 6e 65 67 46 6c 61 67 20 3f 20 22 2d 22 20 3a   negFlag ? "-" :
18670 20 22 22 2c 20 7a 29 3b 0a 23 65 6c 73 65 0a 23   "", z);.#else.#
18680 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
18690 49 54 5f 48 45 58 5f 49 4e 54 45 47 45 52 0a 20  IT_HEX_INTEGER. 
186a0 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
186b0 5f 73 74 72 6e 69 63 6d 70 28 7a 2c 22 30 78 22  _strnicmp(z,"0x"
186c0 2c 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ,2)==0 ){.      
186d0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
186e0 67 28 70 50 61 72 73 65 2c 20 22 68 65 78 20 6c  g(pParse, "hex l
186f0 69 74 65 72 61 6c 20 74 6f 6f 20 62 69 67 3a 20  iteral too big: 
18700 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 7d  %s", z);.      }
18710 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20  else.#endif.    
18720 20 20 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65    {.        code
18730 52 65 61 6c 28 76 2c 20 7a 2c 20 6e 65 67 46 6c  Real(v, z, negFl
18740 61 67 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20 20  ag, iMem);.     
18750 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a   }.#endif.    }.
18760 20 20 7d 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e    }.}..#if defin
18770 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29  ed(SQLITE_DEBUG)
18780 0a 2f 2a 0a 2a 2a 20 56 65 72 69 66 79 20 74 68  ./*.** Verify th
18790 65 20 63 6f 6e 73 69 73 74 65 6e 63 79 20 6f 66  e consistency of
187a0 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68   the column cach
187b0 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  e.*/.static int 
187c0 63 61 63 68 65 49 73 56 61 6c 69 64 28 50 61 72  cacheIsValid(Par
187d0 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 69  se *pParse){.  i
187e0 6e 74 20 69 2c 20 6e 3b 0a 20 20 66 6f 72 28 69  nt i, n;.  for(i
187f0 3d 6e 3d 30 3b 20 69 3c 53 51 4c 49 54 45 5f 4e  =n=0; i<SQLITE_N
18800 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 29 7b  _COLCACHE; i++){
18810 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d  .    if( pParse-
18820 3e 61 43 6f 6c 43 61 63 68 65 5b 69 5d 2e 69 52  >aColCache[i].iR
18830 65 67 3e 30 20 29 20 6e 2b 2b 3b 0a 20 20 7d 0a  eg>0 ) n++;.  }.
18840 20 20 72 65 74 75 72 6e 20 6e 3d 3d 70 50 61 72    return n==pPar
18850 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 3b 0a 7d  se->nColCache;.}
18860 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43  .#endif../*.** C
18870 6c 65 61 72 20 61 20 63 61 63 68 65 20 65 6e 74  lear a cache ent
18880 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ry..*/.static vo
18890 69 64 20 63 61 63 68 65 45 6e 74 72 79 43 6c 65  id cacheEntryCle
188a0 61 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ar(Parse *pParse
188b0 2c 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63  , struct yColCac
188c0 68 65 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d  he *p){.  if( p-
188d0 3e 74 65 6d 70 52 65 67 20 29 7b 0a 20 20 20 20  >tempReg ){.    
188e0 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d  if( pParse->nTem
188f0 70 52 65 67 3c 41 72 72 61 79 53 69 7a 65 28 70  pReg<ArraySize(p
18900 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 29  Parse->aTempReg)
18910 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65   ){.      pParse
18920 2d 3e 61 54 65 6d 70 52 65 67 5b 70 50 61 72 73  ->aTempReg[pPars
18930 65 2d 3e 6e 54 65 6d 70 52 65 67 2b 2b 5d 20 3d  e->nTempReg++] =
18940 20 70 2d 3e 69 52 65 67 3b 0a 20 20 20 20 7d 0a   p->iReg;.    }.
18950 20 20 20 20 70 2d 3e 74 65 6d 70 52 65 67 20 3d      p->tempReg =
18960 20 30 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69 52 65   0;.  }.  p->iRe
18970 67 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d  g = 0;.  pParse-
18980 3e 6e 43 6f 6c 43 61 63 68 65 2d 2d 3b 0a 20 20  >nColCache--;.  
18990 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
189a0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
189b0 20 7c 7c 20 63 61 63 68 65 49 73 56 61 6c 69 64   || cacheIsValid
189c0 28 70 50 61 72 73 65 29 20 29 3b 0a 7d 0a 0a 0a  (pParse) );.}...
189d0 2f 2a 0a 2a 2a 20 52 65 63 6f 72 64 20 69 6e 20  /*.** Record in 
189e0 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65  the column cache
189f0 20 74 68 61 74 20 61 20 70 61 72 74 69 63 75 6c   that a particul
18a00 61 72 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d 20 61  ar column from a
18a10 0a 2a 2a 20 70 61 72 74 69 63 75 6c 61 72 20 74  .** particular t
18a20 61 62 6c 65 20 69 73 20 73 74 6f 72 65 64 20 69  able is stored i
18a30 6e 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 72  n a particular r
18a40 65 67 69 73 74 65 72 2e 0a 2a 2f 0a 76 6f 69 64  egister..*/.void
18a50 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
18a60 65 53 74 6f 72 65 28 50 61 72 73 65 20 2a 70 50  eStore(Parse *pP
18a70 61 72 73 65 2c 20 69 6e 74 20 69 54 61 62 2c 20  arse, int iTab, 
18a80 69 6e 74 20 69 43 6f 6c 2c 20 69 6e 74 20 69 52  int iCol, int iR
18a90 65 67 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  eg){.  int i;.  
18aa0 69 6e 74 20 6d 69 6e 4c 72 75 3b 0a 20 20 69 6e  int minLru;.  in
18ab0 74 20 69 64 78 4c 72 75 3b 0a 20 20 73 74 72 75  t idxLru;.  stru
18ac0 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b  ct yColCache *p;
18ad0 0a 0a 20 20 2f 2a 20 55 6e 6c 65 73 73 20 61 6e  ..  /* Unless an
18ae0 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72   error has occur
18af0 72 65 64 2c 20 72 65 67 69 73 74 65 72 20 6e 75  red, register nu
18b00 6d 62 65 72 73 20 61 72 65 20 61 6c 77 61 79 73  mbers are always
18b10 20 70 6f 73 69 74 69 76 65 2e 20 2a 2f 0a 20 20   positive. */.  
18b20 61 73 73 65 72 74 28 20 69 52 65 67 3e 30 20 7c  assert( iReg>0 |
18b30 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  | pParse->nErr |
18b40 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  | pParse->db->ma
18b50 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
18b60 61 73 73 65 72 74 28 20 69 43 6f 6c 3e 3d 2d 31  assert( iCol>=-1
18b70 20 26 26 20 69 43 6f 6c 3c 33 32 37 36 38 20 29   && iCol<32768 )
18b80 3b 20 20 2f 2a 20 46 69 6e 69 74 65 20 63 6f 6c  ;  /* Finite col
18b90 75 6d 6e 20 6e 75 6d 62 65 72 73 20 2a 2f 0a 0a  umn numbers */..
18ba0 20 20 2f 2a 20 54 68 65 20 53 51 4c 49 54 45 5f    /* The SQLITE_
18bb0 43 6f 6c 75 6d 6e 43 61 63 68 65 20 66 6c 61 67  ColumnCache flag
18bc0 20 64 69 73 61 62 6c 65 73 20 74 68 65 20 63 6f   disables the co
18bd0 6c 75 6d 6e 20 63 61 63 68 65 2e 20 20 54 68 69  lumn cache.  Thi
18be0 73 20 69 73 20 75 73 65 64 0a 20 20 2a 2a 20 66  s is used.  ** f
18bf0 6f 72 20 74 65 73 74 69 6e 67 20 6f 6e 6c 79 20  or testing only 
18c00 2d 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74  - to verify that
18c10 20 53 51 4c 69 74 65 20 61 6c 77 61 79 73 20 67   SQLite always g
18c20 65 74 73 20 74 68 65 20 73 61 6d 65 20 61 6e 73  ets the same ans
18c30 77 65 72 0a 20 20 2a 2a 20 77 69 74 68 20 61 6e  wer.  ** with an
18c40 64 20 77 69 74 68 6f 75 74 20 74 68 65 20 63 6f  d without the co
18c50 6c 75 6d 6e 20 63 61 63 68 65 2e 0a 20 20 2a 2f  lumn cache..  */
18c60 0a 20 20 69 66 28 20 4f 70 74 69 6d 69 7a 61 74  .  if( Optimizat
18c70 69 6f 6e 44 69 73 61 62 6c 65 64 28 70 50 61 72  ionDisabled(pPar
18c80 73 65 2d 3e 64 62 2c 20 53 51 4c 49 54 45 5f 43  se->db, SQLITE_C
18c90 6f 6c 75 6d 6e 43 61 63 68 65 29 20 29 20 72 65  olumnCache) ) re
18ca0 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 46 69 72 73  turn;..  /* Firs
18cb0 74 20 72 65 70 6c 61 63 65 20 61 6e 79 20 65 78  t replace any ex
18cc0 69 73 74 69 6e 67 20 65 6e 74 72 79 2e 0a 20 20  isting entry..  
18cd0 2a 2a 0a 20 20 2a 2a 20 41 63 74 75 61 6c 6c 79  **.  ** Actually
18ce0 2c 20 74 68 65 20 77 61 79 20 74 68 65 20 63 6f  , the way the co
18cf0 6c 75 6d 6e 20 63 61 63 68 65 20 69 73 20 63 75  lumn cache is cu
18d00 72 72 65 6e 74 6c 79 20 75 73 65 64 2c 20 77 65  rrently used, we
18d10 20 61 72 65 20 67 75 61 72 61 6e 74 65 65 64 0a   are guaranteed.
18d20 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20 6f 62    ** that the ob
18d30 6a 65 63 74 20 77 69 6c 6c 20 6e 65 76 65 72 20  ject will never 
18d40 61 6c 72 65 61 64 79 20 62 65 20 69 6e 20 63 61  already be in ca
18d50 63 68 65 2e 20 20 56 65 72 69 66 79 20 74 68 69  che.  Verify thi
18d60 73 20 67 75 61 72 61 6e 74 65 65 2e 0a 20 20 2a  s guarantee..  *
18d70 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  /.#ifndef NDEBUG
18d80 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50  .  for(i=0, p=pP
18d90 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b  arse->aColCache;
18da0 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43   i<SQLITE_N_COLC
18db0 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b  ACHE; i++, p++){
18dc0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
18dd0 69 52 65 67 3d 3d 30 20 7c 7c 20 70 2d 3e 69 54  iReg==0 || p->iT
18de0 61 62 6c 65 21 3d 69 54 61 62 20 7c 7c 20 70 2d  able!=iTab || p-
18df0 3e 69 43 6f 6c 75 6d 6e 21 3d 69 43 6f 6c 20 29  >iColumn!=iCol )
18e00 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
18e10 2f 2a 20 46 69 6e 64 20 61 6e 20 65 6d 70 74 79  /* Find an empty
18e20 20 73 6c 6f 74 20 61 6e 64 20 72 65 70 6c 61 63   slot and replac
18e30 65 20 69 74 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  e it */.  for(i=
18e40 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f  0, p=pParse->aCo
18e50 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45  lCache; i<SQLITE
18e60 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b  _N_COLCACHE; i++
18e70 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  , p++){.    if( 
18e80 70 2d 3e 69 52 65 67 3d 3d 30 20 29 7b 0a 20 20  p->iReg==0 ){.  
18e90 20 20 20 20 70 2d 3e 69 4c 65 76 65 6c 20 3d 20      p->iLevel = 
18ea0 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65  pParse->iCacheLe
18eb0 76 65 6c 3b 0a 20 20 20 20 20 20 70 2d 3e 69 54  vel;.      p->iT
18ec0 61 62 6c 65 20 3d 20 69 54 61 62 3b 0a 20 20 20  able = iTab;.   
18ed0 20 20 20 70 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20     p->iColumn = 
18ee0 69 43 6f 6c 3b 0a 20 20 20 20 20 20 70 2d 3e 69  iCol;.      p->i
18ef0 52 65 67 20 3d 20 69 52 65 67 3b 0a 20 20 20 20  Reg = iReg;.    
18f00 20 20 70 2d 3e 74 65 6d 70 52 65 67 20 3d 20 30    p->tempReg = 0
18f10 3b 0a 20 20 20 20 20 20 70 2d 3e 6c 72 75 20 3d  ;.      p->lru =
18f20 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 43   pParse->iCacheC
18f30 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 70 50 61 72  nt++;.      pPar
18f40 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 2b 2b 3b  se->nColCache++;
18f50 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
18f60 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
18f70 63 46 61 69 6c 65 64 20 7c 7c 20 63 61 63 68 65  cFailed || cache
18f80 49 73 56 61 6c 69 64 28 70 50 61 72 73 65 29 20  IsValid(pParse) 
18f90 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  );.      return;
18fa0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
18fb0 20 52 65 70 6c 61 63 65 20 74 68 65 20 6c 61 73   Replace the las
18fc0 74 20 72 65 63 65 6e 74 6c 79 20 75 73 65 64 20  t recently used 
18fd0 2a 2f 0a 20 20 6d 69 6e 4c 72 75 20 3d 20 30 78  */.  minLru = 0x
18fe0 37 66 66 66 66 66 66 66 3b 0a 20 20 69 64 78 4c  7fffffff;.  idxL
18ff0 72 75 20 3d 20 2d 31 3b 0a 20 20 66 6f 72 28 69  ru = -1;.  for(i
19000 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43  =0, p=pParse->aC
19010 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54  olCache; i<SQLIT
19020 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b  E_N_COLCACHE; i+
19030 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28  +, p++){.    if(
19040 20 70 2d 3e 6c 72 75 3c 6d 69 6e 4c 72 75 20 29   p->lru<minLru )
19050 7b 0a 20 20 20 20 20 20 69 64 78 4c 72 75 20 3d  {.      idxLru =
19060 20 69 3b 0a 20 20 20 20 20 20 6d 69 6e 4c 72 75   i;.      minLru
19070 20 3d 20 70 2d 3e 6c 72 75 3b 0a 20 20 20 20 7d   = p->lru;.    }
19080 0a 20 20 7d 0a 20 20 69 66 28 20 41 4c 57 41 59  .  }.  if( ALWAY
19090 53 28 69 64 78 4c 72 75 3e 3d 30 29 20 29 7b 0a  S(idxLru>=0) ){.
190a0 20 20 20 20 70 20 3d 20 26 70 50 61 72 73 65 2d      p = &pParse-
190b0 3e 61 43 6f 6c 43 61 63 68 65 5b 69 64 78 4c 72  >aColCache[idxLr
190c0 75 5d 3b 0a 20 20 20 20 70 2d 3e 69 4c 65 76 65  u];.    p->iLeve
190d0 6c 20 3d 20 70 50 61 72 73 65 2d 3e 69 43 61 63  l = pParse->iCac
190e0 68 65 4c 65 76 65 6c 3b 0a 20 20 20 20 70 2d 3e  heLevel;.    p->
190f0 69 54 61 62 6c 65 20 3d 20 69 54 61 62 3b 0a 20  iTable = iTab;. 
19100 20 20 20 70 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20     p->iColumn = 
19110 69 43 6f 6c 3b 0a 20 20 20 20 70 2d 3e 69 52 65  iCol;.    p->iRe
19120 67 20 3d 20 69 52 65 67 3b 0a 20 20 20 20 70 2d  g = iReg;.    p-
19130 3e 74 65 6d 70 52 65 67 20 3d 20 30 3b 0a 20 20  >tempReg = 0;.  
19140 20 20 70 2d 3e 6c 72 75 20 3d 20 70 50 61 72 73    p->lru = pPars
19150 65 2d 3e 69 43 61 63 68 65 43 6e 74 2b 2b 3b 0a  e->iCacheCnt++;.
19160 20 20 20 20 61 73 73 65 72 74 28 20 63 61 63 68      assert( cach
19170 65 49 73 56 61 6c 69 64 28 70 50 61 72 73 65 29  eIsValid(pParse)
19180 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   );.    return;.
19190 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64    }.}../*.** Ind
191a0 69 63 61 74 65 20 74 68 61 74 20 72 65 67 69 73  icate that regis
191b0 74 65 72 73 20 62 65 74 77 65 65 6e 20 69 52 65  ters between iRe
191c0 67 2e 2e 69 52 65 67 2b 6e 52 65 67 2d 31 20 61  g..iReg+nReg-1 a
191d0 72 65 20 62 65 69 6e 67 20 6f 76 65 72 77 72 69  re being overwri
191e0 74 74 65 6e 2e 0a 2a 2a 20 50 75 72 67 65 20 74  tten..** Purge t
191f0 68 65 20 72 61 6e 67 65 20 6f 66 20 72 65 67 69  he range of regi
19200 73 74 65 72 73 20 66 72 6f 6d 20 74 68 65 20 63  sters from the c
19210 6f 6c 75 6d 6e 20 63 61 63 68 65 2e 0a 2a 2f 0a  olumn cache..*/.
19220 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
19230 43 61 63 68 65 52 65 6d 6f 76 65 28 50 61 72 73  CacheRemove(Pars
19240 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
19250 52 65 67 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a  Reg, int nReg){.
19260 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63    struct yColCac
19270 68 65 20 2a 70 3b 0a 20 20 69 66 28 20 69 52 65  he *p;.  if( iRe
19280 67 3c 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e  g<=0 || pParse->
19290 6e 43 6f 6c 43 61 63 68 65 3d 3d 30 20 29 20 72  nColCache==0 ) r
192a0 65 74 75 72 6e 3b 0a 20 20 70 20 3d 20 26 70 50  eturn;.  p = &pP
192b0 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b  arse->aColCache[
192c0 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48  SQLITE_N_COLCACH
192d0 45 2d 31 5d 3b 0a 20 20 77 68 69 6c 65 28 31 29  E-1];.  while(1)
192e0 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 52 65  {.    if( p->iRe
192f0 67 20 3e 3d 20 69 52 65 67 20 26 26 20 70 2d 3e  g >= iReg && p->
19300 69 52 65 67 20 3c 20 69 52 65 67 2b 6e 52 65 67  iReg < iReg+nReg
19310 20 29 20 63 61 63 68 65 45 6e 74 72 79 43 6c 65   ) cacheEntryCle
19320 61 72 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20  ar(pParse, p);. 
19330 20 20 20 69 66 28 20 70 3d 3d 70 50 61 72 73 65     if( p==pParse
19340 2d 3e 61 43 6f 6c 43 61 63 68 65 20 29 20 62 72  ->aColCache ) br
19350 65 61 6b 3b 0a 20 20 20 20 70 2d 2d 3b 0a 20 20  eak;.    p--;.  
19360 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 65 6d  }.}../*.** Remem
19370 62 65 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  ber the current 
19380 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 63 6f 6e  column cache con
19390 74 65 78 74 2e 20 20 41 6e 79 20 6e 65 77 20 65  text.  Any new e
193a0 6e 74 72 69 65 73 20 61 64 64 65 64 0a 2a 2a 20  ntries added.** 
193b0 61 64 64 65 64 20 74 6f 20 74 68 65 20 63 6f 6c  added to the col
193c0 75 6d 6e 20 63 61 63 68 65 20 61 66 74 65 72 20  umn cache after 
193d0 74 68 69 73 20 63 61 6c 6c 20 61 72 65 20 72 65  this call are re
193e0 6d 6f 76 65 64 20 77 68 65 6e 20 74 68 65 0a 2a  moved when the.*
193f0 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  * corresponding 
19400 70 6f 70 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 76  pop occurs..*/.v
19410 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43  oid sqlite3ExprC
19420 61 63 68 65 50 75 73 68 28 50 61 72 73 65 20 2a  achePush(Parse *
19430 70 50 61 72 73 65 29 7b 0a 20 20 70 50 61 72 73  pParse){.  pPars
19440 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 2b 2b  e->iCacheLevel++
19450 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
19460 44 45 42 55 47 0a 20 20 69 66 28 20 70 50 61 72  DEBUG.  if( pPar
19470 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20  se->db->flags & 
19480 53 51 4c 49 54 45 5f 56 64 62 65 41 64 64 6f 70  SQLITE_VdbeAddop
19490 54 72 61 63 65 20 29 7b 0a 20 20 20 20 70 72 69  Trace ){.    pri
194a0 6e 74 66 28 22 50 55 53 48 20 74 6f 20 25 64 5c  ntf("PUSH to %d\
194b0 6e 22 2c 20 70 50 61 72 73 65 2d 3e 69 43 61 63  n", pParse->iCac
194c0 68 65 4c 65 76 65 6c 29 3b 0a 20 20 7d 0a 23 65  heLevel);.  }.#e
194d0 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ndif.}../*.** Re
194e0 6d 6f 76 65 20 66 72 6f 6d 20 74 68 65 20 63 6f  move from the co
194f0 6c 75 6d 6e 20 63 61 63 68 65 20 61 6e 79 20 65  lumn cache any e
19500 6e 74 72 69 65 73 20 74 68 61 74 20 77 65 72 65  ntries that were
19510 20 61 64 64 65 64 20 73 69 6e 63 65 20 74 68 65   added since the
19520 0a 2a 2a 20 74 68 65 20 70 72 65 76 69 6f 75 73  .** the previous
19530 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
19540 65 50 75 73 68 20 6f 70 65 72 61 74 69 6f 6e 2e  ePush operation.
19550 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
19560 2c 20 72 65 73 74 6f 72 65 0a 2a 2a 20 74 68 65  , restore.** the
19570 20 63 61 63 68 65 20 74 6f 20 74 68 65 20 73 74   cache to the st
19580 61 74 65 20 69 74 20 77 61 73 20 69 6e 20 70 72  ate it was in pr
19590 69 6f 72 20 74 68 65 20 6d 6f 73 74 20 72 65 63  ior the most rec
195a0 65 6e 74 20 50 75 73 68 2e 0a 2a 2f 0a 76 6f 69  ent Push..*/.voi
195b0 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63  d sqlite3ExprCac
195c0 68 65 50 6f 70 28 50 61 72 73 65 20 2a 70 50 61  hePop(Parse *pPa
195d0 72 73 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  rse){.  int i;. 
195e0 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68   struct yColCach
195f0 65 20 2a 70 3b 0a 20 20 61 73 73 65 72 74 28 20  e *p;.  assert( 
19600 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65  pParse->iCacheLe
19610 76 65 6c 3e 3d 31 20 29 3b 0a 20 20 70 50 61 72  vel>=1 );.  pPar
19620 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 2d  se->iCacheLevel-
19630 2d 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  -;.#ifdef SQLITE
19640 5f 44 45 42 55 47 0a 20 20 69 66 28 20 70 50 61  _DEBUG.  if( pPa
19650 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26  rse->db->flags &
19660 20 53 51 4c 49 54 45 5f 56 64 62 65 41 64 64 6f   SQLITE_VdbeAddo
19670 70 54 72 61 63 65 20 29 7b 0a 20 20 20 20 70 72  pTrace ){.    pr
19680 69 6e 74 66 28 22 50 4f 50 20 20 74 6f 20 25 64  intf("POP  to %d
19690 5c 6e 22 2c 20 70 50 61 72 73 65 2d 3e 69 43 61  \n", pParse->iCa
196a0 63 68 65 4c 65 76 65 6c 29 3b 0a 20 20 7d 0a 23  cheLevel);.  }.#
196b0 65 6e 64 69 66 0a 20 20 66 6f 72 28 69 3d 30 2c  endif.  for(i=0,
196c0 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43   p=pParse->aColC
196d0 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e  ache; i<SQLITE_N
196e0 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20  _COLCACHE; i++, 
196f0 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  p++){.    if( p-
19700 3e 69 52 65 67 20 26 26 20 70 2d 3e 69 4c 65 76  >iReg && p->iLev
19710 65 6c 3e 70 50 61 72 73 65 2d 3e 69 43 61 63 68  el>pParse->iCach
19720 65 4c 65 76 65 6c 20 29 7b 0a 20 20 20 20 20 20  eLevel ){.      
19730 63 61 63 68 65 45 6e 74 72 79 43 6c 65 61 72 28  cacheEntryClear(
19740 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20  pParse, p);.    
19750 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  }.  }.}../*.** W
19760 68 65 6e 20 61 20 63 61 63 68 65 64 20 63 6f 6c  hen a cached col
19770 75 6d 6e 20 69 73 20 72 65 75 73 65 64 2c 20 6d  umn is reused, m
19780 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 69 74  ake sure that it
19790 73 20 72 65 67 69 73 74 65 72 20 69 73 0a 2a 2a  s register is.**
197a0 20 6e 6f 20 6c 6f 6e 67 65 72 20 61 76 61 69 6c   no longer avail
197b0 61 62 6c 65 20 61 73 20 61 20 74 65 6d 70 20 72  able as a temp r
197c0 65 67 69 73 74 65 72 2e 20 20 74 69 63 6b 65 74  egister.  ticket
197d0 20 23 33 38 37 39 3a 20 20 74 68 61 74 20 73 61   #3879:  that sa
197e0 6d 65 0a 2a 2a 20 72 65 67 69 73 74 65 72 20 6d  me.** register m
197f0 69 67 68 74 20 62 65 20 69 6e 20 74 68 65 20 63  ight be in the c
19800 61 63 68 65 20 69 6e 20 6d 75 6c 74 69 70 6c 65  ache in multiple
19810 20 70 6c 61 63 65 73 2c 20 73 6f 20 62 65 20 73   places, so be s
19820 75 72 65 20 74 6f 0a 2a 2a 20 67 65 74 20 74 68  ure to.** get th
19830 65 6d 20 61 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69  em all..*/.stati
19840 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  c void sqlite3Ex
19850 70 72 43 61 63 68 65 50 69 6e 52 65 67 69 73 74  prCachePinRegist
19860 65 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  er(Parse *pParse
19870 2c 20 69 6e 74 20 69 52 65 67 29 7b 0a 20 20 69  , int iReg){.  i
19880 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 79  nt i;.  struct y
19890 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20 66  ColCache *p;.  f
198a0 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65  or(i=0, p=pParse
198b0 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53  ->aColCache; i<S
198c0 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45  QLITE_N_COLCACHE
198d0 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20  ; i++, p++){.   
198e0 20 69 66 28 20 70 2d 3e 69 52 65 67 3d 3d 69 52   if( p->iReg==iR
198f0 65 67 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 74  eg ){.      p->t
19900 65 6d 70 52 65 67 20 3d 20 30 3b 0a 20 20 20 20  empReg = 0;.    
19910 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 47 65 6e 65  }.  }.}../* Gene
19920 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77  rate code that w
19930 69 6c 6c 20 6c 6f 61 64 20 69 6e 74 6f 20 72 65  ill load into re
19940 67 69 73 74 65 72 20 72 65 67 4f 75 74 20 61 20  gister regOut a 
19950 76 61 6c 75 65 20 74 68 61 74 20 69 73 0a 2a 2a  value that is.**
19960 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72   appropriate for
19970 20 74 68 65 20 69 49 64 78 43 6f 6c 2d 74 68 20   the iIdxCol-th 
19980 63 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78 20  column of index 
19990 70 49 64 78 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  pIdx..*/.void sq
199a0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4c 6f 61  lite3ExprCodeLoa
199b0 64 49 6e 64 65 78 43 6f 6c 75 6d 6e 28 0a 20 20  dIndexColumn(.  
199c0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
199d0 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63  /* The parsing c
199e0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 49 6e 64 65  ontext */.  Inde
199f0 78 20 2a 70 49 64 78 2c 20 20 20 20 2f 2a 20 54  x *pIdx,    /* T
19a00 68 65 20 69 6e 64 65 78 20 77 68 6f 73 65 20 63  he index whose c
19a10 6f 6c 75 6d 6e 20 69 73 20 74 6f 20 62 65 20 6c  olumn is to be l
19a20 6f 61 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69  oaded */.  int i
19a30 54 61 62 43 75 72 2c 20 20 20 20 2f 2a 20 43 75  TabCur,    /* Cu
19a40 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f  rsor pointing to
19a50 20 61 20 74 61 62 6c 65 20 72 6f 77 20 2a 2f 0a   a table row */.
19a60 20 20 69 6e 74 20 69 49 64 78 43 6f 6c 2c 20 20    int iIdxCol,  
19a70 20 20 2f 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20    /* The column 
19a80 6f 66 20 74 68 65 20 69 6e 64 65 78 20 74 6f 20  of the index to 
19a90 62 65 20 6c 6f 61 64 65 64 20 2a 2f 0a 20 20 69  be loaded */.  i
19aa0 6e 74 20 72 65 67 4f 75 74 20 20 20 20 20 20 2f  nt regOut      /
19ab0 2a 20 53 74 6f 72 65 20 74 68 65 20 69 6e 64 65  * Store the inde
19ac0 78 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69  x column value i
19ad0 6e 20 74 68 69 73 20 72 65 67 69 73 74 65 72 20  n this register 
19ae0 2a 2f 0a 29 7b 0a 20 20 69 31 36 20 69 54 61 62  */.){.  i16 iTab
19af0 43 6f 6c 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f  Col = pIdx->aiCo
19b00 6c 75 6d 6e 5b 69 49 64 78 43 6f 6c 5d 3b 0a 20  lumn[iIdxCol];. 
19b10 20 69 66 28 20 69 54 61 62 43 6f 6c 3d 3d 58 4e   if( iTabCol==XN
19b20 5f 45 58 50 52 20 29 7b 0a 20 20 20 20 61 73 73  _EXPR ){.    ass
19b30 65 72 74 28 20 70 49 64 78 2d 3e 61 43 6f 6c 45  ert( pIdx->aColE
19b40 78 70 72 20 29 3b 0a 20 20 20 20 61 73 73 65 72  xpr );.    asser
19b50 74 28 20 70 49 64 78 2d 3e 61 43 6f 6c 45 78 70  t( pIdx->aColExp
19b60 72 2d 3e 6e 45 78 70 72 3e 69 49 64 78 43 6f 6c  r->nExpr>iIdxCol
19b70 20 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e   );.    pParse->
19b80 69 53 65 6c 66 54 61 62 20 3d 20 69 54 61 62 43  iSelfTab = iTabC
19b90 75 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  ur;.    sqlite3E
19ba0 78 70 72 43 6f 64 65 43 6f 70 79 28 70 50 61 72  xprCodeCopy(pPar
19bb0 73 65 2c 20 70 49 64 78 2d 3e 61 43 6f 6c 45 78  se, pIdx->aColEx
19bc0 70 72 2d 3e 61 5b 69 49 64 78 43 6f 6c 5d 2e 70  pr->a[iIdxCol].p
19bd0 45 78 70 72 2c 20 72 65 67 4f 75 74 29 3b 0a 20  Expr, regOut);. 
19be0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
19bf0 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f  te3ExprCodeGetCo
19c00 6c 75 6d 6e 4f 66 54 61 62 6c 65 28 70 50 61 72  lumnOfTable(pPar
19c10 73 65 2d 3e 70 56 64 62 65 2c 20 70 49 64 78 2d  se->pVdbe, pIdx-
19c20 3e 70 54 61 62 6c 65 2c 20 69 54 61 62 43 75 72  >pTable, iTabCur
19c30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
19c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19c50 20 20 20 20 20 20 69 54 61 62 43 6f 6c 2c 20 72        iTabCol, r
19c60 65 67 4f 75 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  egOut);.  }.}../
19c70 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
19c80 64 65 20 74 6f 20 65 78 74 72 61 63 74 20 74 68  de to extract th
19c90 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 69  e value of the i
19ca0 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66  Col-th column of
19cb0 20 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69   a table..*/.voi
19cc0 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  d sqlite3ExprCod
19cd0 65 47 65 74 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c  eGetColumnOfTabl
19ce0 65 28 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20  e(.  Vdbe *v,   
19cf0 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45       /* The VDBE
19d00 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
19d10 69 6f 6e 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a  ion */.  Table *
19d20 70 54 61 62 2c 20 20 20 20 2f 2a 20 54 68 65 20  pTab,    /* The 
19d30 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67  table containing
19d40 20 74 68 65 20 76 61 6c 75 65 20 2a 2f 0a 20 20   the value */.  
19d50 69 6e 74 20 69 54 61 62 43 75 72 2c 20 20 20 20  int iTabCur,    
19d60 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 63 75 72  /* The table cur
19d70 73 6f 72 2e 20 20 4f 72 20 74 68 65 20 50 4b 20  sor.  Or the PK 
19d80 63 75 72 73 6f 72 20 66 6f 72 20 57 49 54 48 4f  cursor for WITHO
19d90 55 54 20 52 4f 57 49 44 20 2a 2f 0a 20 20 69 6e  UT ROWID */.  in
19da0 74 20 69 43 6f 6c 2c 20 20 20 20 20 20 20 2f 2a  t iCol,       /*
19db0 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20 63 6f   Index of the co
19dc0 6c 75 6d 6e 20 74 6f 20 65 78 74 72 61 63 74 20  lumn to extract 
19dd0 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75 74 20  */.  int regOut 
19de0 20 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20       /* Extract 
19df0 74 68 65 20 76 61 6c 75 65 20 69 6e 74 6f 20 74  the value into t
19e00 68 69 73 20 72 65 67 69 73 74 65 72 20 2a 2f 0a  his register */.
19e10 29 7b 0a 20 20 69 66 28 20 69 43 6f 6c 3c 30 20  ){.  if( iCol<0 
19e20 7c 7c 20 69 43 6f 6c 3d 3d 70 54 61 62 2d 3e 69  || iCol==pTab->i
19e30 50 4b 65 79 20 29 7b 0a 20 20 20 20 73 71 6c 69  PKey ){.    sqli
19e40 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
19e50 20 4f 50 5f 52 6f 77 69 64 2c 20 69 54 61 62 43   OP_Rowid, iTabC
19e60 75 72 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20 7d  ur, regOut);.  }
19e70 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6f 70  else{.    int op
19e80 20 3d 20 49 73 56 69 72 74 75 61 6c 28 70 54 61   = IsVirtual(pTa
19e90 62 29 20 3f 20 4f 50 5f 56 43 6f 6c 75 6d 6e 20  b) ? OP_VColumn 
19ea0 3a 20 4f 50 5f 43 6f 6c 75 6d 6e 3b 0a 20 20 20  : OP_Column;.   
19eb0 20 69 6e 74 20 78 20 3d 20 69 43 6f 6c 3b 0a 20   int x = iCol;. 
19ec0 20 20 20 69 66 28 20 21 48 61 73 52 6f 77 69 64     if( !HasRowid
19ed0 28 70 54 61 62 29 20 26 26 20 21 49 73 56 69 72  (pTab) && !IsVir
19ee0 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20  tual(pTab) ){.  
19ef0 20 20 20 20 78 20 3d 20 73 71 6c 69 74 65 33 43      x = sqlite3C
19f00 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78 28 73 71 6c  olumnOfIndex(sql
19f10 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e  ite3PrimaryKeyIn
19f20 64 65 78 28 70 54 61 62 29 2c 20 69 43 6f 6c 29  dex(pTab), iCol)
19f30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
19f40 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
19f50 20 6f 70 2c 20 69 54 61 62 43 75 72 2c 20 78 2c   op, iTabCur, x,
19f60 20 72 65 67 4f 75 74 29 3b 0a 20 20 7d 0a 20 20   regOut);.  }.  
19f70 69 66 28 20 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20  if( iCol>=0 ){. 
19f80 20 20 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e     sqlite3Column
19f90 44 65 66 61 75 6c 74 28 76 2c 20 70 54 61 62 2c  Default(v, pTab,
19fa0 20 69 43 6f 6c 2c 20 72 65 67 4f 75 74 29 3b 0a   iCol, regOut);.
19fb0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e    }.}../*.** Gen
19fc0 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
19fd0 77 69 6c 6c 20 65 78 74 72 61 63 74 20 74 68 65  will extract the
19fe0 20 69 43 6f 6c 75 6d 6e 2d 74 68 20 63 6f 6c 75   iColumn-th colu
19ff0 6d 6e 20 66 72 6f 6d 0a 2a 2a 20 74 61 62 6c 65  mn from.** table
1a000 20 70 54 61 62 20 61 6e 64 20 73 74 6f 72 65 20   pTab and store 
1a010 74 68 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65  the column value
1a020 20 69 6e 20 61 20 72 65 67 69 73 74 65 72 2e 20   in a register. 
1a030 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 66 66 6f 72 74  .**.** An effort
1a040 20 69 73 20 6d 61 64 65 20 74 6f 20 73 74 6f 72   is made to stor
1a050 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 76 61 6c  e the column val
1a060 75 65 20 69 6e 20 72 65 67 69 73 74 65 72 20 69  ue in register i
1a070 52 65 67 2e 20 20 54 68 69 73 0a 2a 2a 20 69 73  Reg.  This.** is
1a080 20 6e 6f 74 20 67 61 72 61 6e 74 65 65 65 64 20   not garanteeed 
1a090 66 6f 72 20 47 65 74 43 6f 6c 75 6d 6e 28 29 20  for GetColumn() 
1a0a0 2d 20 74 68 65 20 72 65 73 75 6c 74 20 63 61 6e  - the result can
1a0b0 20 62 65 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a   be stored in.**
1a0c0 20 61 6e 79 20 72 65 67 69 73 74 65 72 2e 20 20   any register.  
1a0d0 42 75 74 20 74 68 65 20 72 65 73 75 6c 74 20 69  But the result i
1a0e0 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  s guaranteed to 
1a0f0 6c 61 6e 64 20 69 6e 20 72 65 67 69 73 74 65 72  land in register
1a100 20 69 52 65 67 0a 2a 2a 20 66 6f 72 20 47 65 74   iReg.** for Get
1a110 43 6f 6c 75 6d 6e 54 6f 52 65 67 28 29 2e 0a 2a  ColumnToReg()..*
1a120 2a 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73 74 20  *.** There must 
1a130 62 65 20 61 6e 20 6f 70 65 6e 20 63 75 72 73 6f  be an open curso
1a140 72 20 74 6f 20 70 54 61 62 20 69 6e 20 69 54 61  r to pTab in iTa
1a150 62 6c 65 20 77 68 65 6e 20 74 68 69 73 20 72 6f  ble when this ro
1a160 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c  utine.** is call
1a170 65 64 2e 20 20 49 66 20 69 43 6f 6c 75 6d 6e 3c  ed.  If iColumn<
1a180 30 20 74 68 65 6e 20 63 6f 64 65 20 69 73 20 67  0 then code is g
1a190 65 6e 65 72 61 74 65 64 20 74 68 61 74 20 65 78  enerated that ex
1a1a0 74 72 61 63 74 73 20 74 68 65 20 72 6f 77 69 64  tracts the rowid
1a1b0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1a1c0 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d  ExprCodeGetColum
1a1d0 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  n(.  Parse *pPar
1a1e0 73 65 2c 20 20 20 2f 2a 20 50 61 72 73 69 6e 67  se,   /* Parsing
1a1f0 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61   and code genera
1a200 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  ting context */.
1a210 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20    Table *pTab,  
1a220 20 20 20 2f 2a 20 44 65 73 63 72 69 70 74 69 6f     /* Descriptio
1a230 6e 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 77  n of the table w
1a240 65 20 61 72 65 20 72 65 61 64 69 6e 67 20 66 72  e are reading fr
1a250 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c  om */.  int iCol
1a260 75 6d 6e 2c 20 20 20 20 20 2f 2a 20 49 6e 64 65  umn,     /* Inde
1a270 78 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 63  x of the table c
1a280 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  olumn */.  int i
1a290 54 61 62 6c 65 2c 20 20 20 20 20 20 2f 2a 20 54  Table,      /* T
1a2a0 68 65 20 63 75 72 73 6f 72 20 70 6f 69 6e 74 69  he cursor pointi
1a2b0 6e 67 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20  ng to the table 
1a2c0 2a 2f 0a 20 20 69 6e 74 20 69 52 65 67 2c 20 20  */.  int iReg,  
1a2d0 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 72        /* Store r
1a2e0 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 20  esults here */. 
1a2f0 20 75 38 20 70 35 20 20 20 20 20 20 20 20 20 20   u8 p5          
1a300 20 20 2f 2a 20 50 35 20 76 61 6c 75 65 20 66 6f    /* P5 value fo
1a310 72 20 4f 50 5f 43 6f 6c 75 6d 6e 20 2b 20 46 4c  r OP_Column + FL
1a320 41 47 53 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65  AGS */.){.  Vdbe
1a330 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
1a340 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  dbe;.  int i;.  
1a350 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65  struct yColCache
1a360 20 2a 70 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 2c   *p;..  for(i=0,
1a370 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43   p=pParse->aColC
1a380 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e  ache; i<SQLITE_N
1a390 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20  _COLCACHE; i++, 
1a3a0 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  p++){.    if( p-
1a3b0 3e 69 52 65 67 3e 30 20 26 26 20 70 2d 3e 69 54  >iReg>0 && p->iT
1a3c0 61 62 6c 65 3d 3d 69 54 61 62 6c 65 20 26 26 20  able==iTable && 
1a3d0 70 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c  p->iColumn==iCol
1a3e0 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  umn ){.      p->
1a3f0 6c 72 75 20 3d 20 70 50 61 72 73 65 2d 3e 69 43  lru = pParse->iC
1a400 61 63 68 65 43 6e 74 2b 2b 3b 0a 20 20 20 20 20  acheCnt++;.     
1a410 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
1a420 65 50 69 6e 52 65 67 69 73 74 65 72 28 70 50 61  ePinRegister(pPa
1a430 72 73 65 2c 20 70 2d 3e 69 52 65 67 29 3b 0a 20  rse, p->iReg);. 
1a440 20 20 20 20 20 72 65 74 75 72 6e 20 70 2d 3e 69       return p->i
1a450 52 65 67 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 20  Reg;.    }.  }  
1a460 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20  .  assert( v!=0 
1a470 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
1a480 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 4f 66 54  CodeGetColumnOfT
1a490 61 62 6c 65 28 76 2c 20 70 54 61 62 2c 20 69 54  able(v, pTab, iT
1a4a0 61 62 6c 65 2c 20 69 43 6f 6c 75 6d 6e 2c 20 69  able, iColumn, i
1a4b0 52 65 67 29 3b 0a 20 20 69 66 28 20 70 35 20 29  Reg);.  if( p5 )
1a4c0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
1a4d0 65 43 68 61 6e 67 65 50 35 28 76 2c 20 70 35 29  eChangeP5(v, p5)
1a4e0 3b 0a 20 20 7d 65 6c 73 65 7b 20 20 20 0a 20 20  ;.  }else{   .  
1a4f0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
1a500 68 65 53 74 6f 72 65 28 70 50 61 72 73 65 2c 20  heStore(pParse, 
1a510 69 54 61 62 6c 65 2c 20 69 43 6f 6c 75 6d 6e 2c  iTable, iColumn,
1a520 20 69 52 65 67 29 3b 0a 20 20 7d 0a 20 20 72 65   iReg);.  }.  re
1a530 74 75 72 6e 20 69 52 65 67 3b 0a 7d 0a 76 6f 69  turn iReg;.}.voi
1a540 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  d sqlite3ExprCod
1a550 65 47 65 74 43 6f 6c 75 6d 6e 54 6f 52 65 67 28  eGetColumnToReg(
1a560 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
1a570 2c 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61  ,   /* Parsing a
1a580 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69  nd code generati
1a590 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
1a5a0 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20  Table *pTab,    
1a5b0 20 2f 2a 20 44 65 73 63 72 69 70 74 69 6f 6e 20   /* Description 
1a5c0 6f 66 20 74 68 65 20 74 61 62 6c 65 20 77 65 20  of the table we 
1a5d0 61 72 65 20 72 65 61 64 69 6e 67 20 66 72 6f 6d  are reading from
1a5e0 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d   */.  int iColum
1a5f0 6e 2c 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20  n,     /* Index 
1a600 6f 66 20 74 68 65 20 74 61 62 6c 65 20 63 6f 6c  of the table col
1a610 75 6d 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  umn */.  int iTa
1a620 62 6c 65 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  ble,      /* The
1a630 20 63 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67   cursor pointing
1a640 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 2a 2f   to the table */
1a650 0a 20 20 69 6e 74 20 69 52 65 67 20 20 20 20 20  .  int iReg     
1a660 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 72 65 73      /* Store res
1a670 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  ults here */.){.
1a680 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74    int r1 = sqlit
1a690 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c  e3ExprCodeGetCol
1a6a0 75 6d 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62  umn(pParse, pTab
1a6b0 2c 20 69 43 6f 6c 75 6d 6e 2c 20 69 54 61 62 6c  , iColumn, iTabl
1a6c0 65 2c 20 69 52 65 67 2c 20 30 29 3b 0a 20 20 69  e, iReg, 0);.  i
1a6d0 66 28 20 72 31 21 3d 69 52 65 67 20 29 20 73 71  f( r1!=iReg ) sq
1a6e0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1a6f0 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f  pParse->pVdbe, O
1a700 50 5f 53 43 6f 70 79 2c 20 72 31 2c 20 69 52 65  P_SCopy, r1, iRe
1a710 67 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6c  g);.}.../*.** Cl
1a720 65 61 72 20 61 6c 6c 20 63 6f 6c 75 6d 6e 20 63  ear all column c
1a730 61 63 68 65 20 65 6e 74 72 69 65 73 2e 0a 2a 2f  ache entries..*/
1a740 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
1a750 72 43 61 63 68 65 43 6c 65 61 72 28 50 61 72 73  rCacheClear(Pars
1a760 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 69 6e  e *pParse){.  in
1a770 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 79 43  t i;.  struct yC
1a780 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 0a 23 69 66  olCache *p;..#if
1a790 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
1a7a0 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  if( pParse->db->
1a7b0 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 56  flags & SQLITE_V
1a7c0 64 62 65 41 64 64 6f 70 54 72 61 63 65 20 29 7b  dbeAddopTrace ){
1a7d0 0a 20 20 20 20 70 72 69 6e 74 66 28 22 43 4c 45  .    printf("CLE
1a7e0 41 52 5c 6e 22 29 3b 0a 20 20 7d 0a 23 65 6e 64  AR\n");.  }.#end
1a7f0 69 66 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d  if.  for(i=0, p=
1a800 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68  pParse->aColCach
1a810 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f  e; i<SQLITE_N_CO
1a820 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b  LCACHE; i++, p++
1a830 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 52  ){.    if( p->iR
1a840 65 67 20 29 7b 0a 20 20 20 20 20 20 63 61 63 68  eg ){.      cach
1a850 65 45 6e 74 72 79 43 6c 65 61 72 28 70 50 61 72  eEntryClear(pPar
1a860 73 65 2c 20 70 29 3b 0a 20 20 20 20 7d 0a 20 20  se, p);.    }.  
1a870 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 72  }.}../*.** Recor
1a880 64 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20  d the fact that 
1a890 61 6e 20 61 66 66 69 6e 69 74 79 20 63 68 61 6e  an affinity chan
1a8a0 67 65 20 68 61 73 20 6f 63 63 75 72 72 65 64 20  ge has occurred 
1a8b0 6f 6e 20 69 43 6f 75 6e 74 0a 2a 2a 20 72 65 67  on iCount.** reg
1a8c0 69 73 74 65 72 73 20 73 74 61 72 74 69 6e 67 20  isters starting 
1a8d0 77 69 74 68 20 69 53 74 61 72 74 2e 0a 2a 2f 0a  with iStart..*/.
1a8e0 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
1a8f0 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61  CacheAffinityCha
1a900 6e 67 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  nge(Parse *pPars
1a910 65 2c 20 69 6e 74 20 69 53 74 61 72 74 2c 20 69  e, int iStart, i
1a920 6e 74 20 69 43 6f 75 6e 74 29 7b 0a 20 20 73 71  nt iCount){.  sq
1a930 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 52 65  lite3ExprCacheRe
1a940 6d 6f 76 65 28 70 50 61 72 73 65 2c 20 69 53 74  move(pParse, iSt
1a950 61 72 74 2c 20 69 43 6f 75 6e 74 29 3b 0a 7d 0a  art, iCount);.}.
1a960 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
1a970 63 6f 64 65 20 74 6f 20 6d 6f 76 65 20 63 6f 6e  code to move con
1a980 74 65 6e 74 20 66 72 6f 6d 20 72 65 67 69 73 74  tent from regist
1a990 65 72 73 20 69 46 72 6f 6d 2e 2e 2e 69 46 72 6f  ers iFrom...iFro
1a9a0 6d 2b 6e 52 65 67 2d 31 0a 2a 2a 20 6f 76 65 72  m+nReg-1.** over
1a9b0 20 74 6f 20 69 54 6f 2e 2e 69 54 6f 2b 6e 52 65   to iTo..iTo+nRe
1a9c0 67 2d 31 2e 20 4b 65 65 70 20 74 68 65 20 63 6f  g-1. Keep the co
1a9d0 6c 75 6d 6e 20 63 61 63 68 65 20 75 70 2d 74 6f  lumn cache up-to
1a9e0 2d 64 61 74 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73  -date..*/.void s
1a9f0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f  qlite3ExprCodeMo
1aa00 76 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ve(Parse *pParse
1aa10 2c 20 69 6e 74 20 69 46 72 6f 6d 2c 20 69 6e 74  , int iFrom, int
1aa20 20 69 54 6f 2c 20 69 6e 74 20 6e 52 65 67 29 7b   iTo, int nReg){
1aa30 0a 20 20 61 73 73 65 72 74 28 20 69 46 72 6f 6d  .  assert( iFrom
1aa40 3e 3d 69 54 6f 2b 6e 52 65 67 20 7c 7c 20 69 46  >=iTo+nReg || iF
1aa50 72 6f 6d 2b 6e 52 65 67 3c 3d 69 54 6f 20 29 3b  rom+nReg<=iTo );
1aa60 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
1aa70 64 4f 70 33 28 70 50 61 72 73 65 2d 3e 70 56 64  dOp3(pParse->pVd
1aa80 62 65 2c 20 4f 50 5f 4d 6f 76 65 2c 20 69 46 72  be, OP_Move, iFr
1aa90 6f 6d 2c 20 69 54 6f 2c 20 6e 52 65 67 29 3b 0a  om, iTo, nReg);.
1aaa0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
1aab0 68 65 52 65 6d 6f 76 65 28 70 50 61 72 73 65 2c  heRemove(pParse,
1aac0 20 69 46 72 6f 6d 2c 20 6e 52 65 67 29 3b 0a 7d   iFrom, nReg);.}
1aad0 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ..#if defined(SQ
1aae0 4c 49 54 45 5f 44 45 42 55 47 29 20 7c 7c 20 64  LITE_DEBUG) || d
1aaf0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 43 4f  efined(SQLITE_CO
1ab00 56 45 52 41 47 45 5f 54 45 53 54 29 0a 2f 2a 0a  VERAGE_TEST)./*.
1ab10 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
1ab20 66 20 61 6e 79 20 72 65 67 69 73 74 65 72 20 69  f any register i
1ab30 6e 20 74 68 65 20 72 61 6e 67 65 20 69 46 72 6f  n the range iFro
1ab40 6d 2e 2e 69 54 6f 20 28 69 6e 63 6c 75 73 69 76  m..iTo (inclusiv
1ab50 65 29 0a 2a 2a 20 69 73 20 75 73 65 64 20 61 73  e).** is used as
1ab60 20 70 61 72 74 20 6f 66 20 74 68 65 20 63 6f 6c   part of the col
1ab70 75 6d 6e 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a  umn cache..**.**
1ab80 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
1ab90 20 75 73 65 64 20 77 69 74 68 69 6e 20 61 73 73   used within ass
1aba0 65 72 74 28 29 20 61 6e 64 20 74 65 73 74 63 61  ert() and testca
1abb0 73 65 28 29 20 6d 61 63 72 6f 73 20 6f 6e 6c 79  se() macros only
1abc0 0a 2a 2a 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74  .** and does not
1abd0 20 61 70 70 65 61 72 20 69 6e 20 61 20 6e 6f 72   appear in a nor
1abe0 6d 61 6c 20 62 75 69 6c 64 2e 0a 2a 2f 0a 73 74  mal build..*/.st
1abf0 61 74 69 63 20 69 6e 74 20 75 73 65 64 41 73 43  atic int usedAsC
1ac00 6f 6c 75 6d 6e 43 61 63 68 65 28 50 61 72 73 65  olumnCache(Parse
1ac10 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 46   *pParse, int iF
1ac20 72 6f 6d 2c 20 69 6e 74 20 69 54 6f 29 7b 0a 20  rom, int iTo){. 
1ac30 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74   int i;.  struct
1ac40 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 20   yColCache *p;. 
1ac50 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72   for(i=0, p=pPar
1ac60 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69  se->aColCache; i
1ac70 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43  <SQLITE_N_COLCAC
1ac80 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20  HE; i++, p++){. 
1ac90 20 20 20 69 6e 74 20 72 20 3d 20 70 2d 3e 69 52     int r = p->iR
1aca0 65 67 3b 0a 20 20 20 20 69 66 28 20 72 3e 3d 69  eg;.    if( r>=i
1acb0 46 72 6f 6d 20 26 26 20 72 3c 3d 69 54 6f 20 29  From && r<=iTo )
1acc0 20 72 65 74 75 72 6e 20 31 3b 20 20 20 20 2f 2a   return 1;    /*
1acd0 4e 4f 5f 54 45 53 54 2a 2f 0a 20 20 7d 0a 20 20  NO_TEST*/.  }.  
1ace0 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64  return 0;.}.#end
1acf0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42  if /* SQLITE_DEB
1ad00 55 47 20 7c 7c 20 53 51 4c 49 54 45 5f 43 4f 56  UG || SQLITE_COV
1ad10 45 52 41 47 45 5f 54 45 53 54 20 2a 2f 0a 0a 0a  ERAGE_TEST */...
1ad20 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 6e  /*.** Convert an
1ad30 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65   expression node
1ad40 20 74 6f 20 61 20 54 4b 5f 52 45 47 49 53 54 45   to a TK_REGISTE
1ad50 52 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  R.*/.static void
1ad60 20 65 78 70 72 54 6f 52 65 67 69 73 74 65 72 28   exprToRegister(
1ad70 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 69 52 65  Expr *p, int iRe
1ad80 67 29 7b 0a 20 20 70 2d 3e 6f 70 32 20 3d 20 70  g){.  p->op2 = p
1ad90 2d 3e 6f 70 3b 0a 20 20 70 2d 3e 6f 70 20 3d 20  ->op;.  p->op = 
1ada0 54 4b 5f 52 45 47 49 53 54 45 52 3b 0a 20 20 70  TK_REGISTER;.  p
1adb0 2d 3e 69 54 61 62 6c 65 20 3d 20 69 52 65 67 3b  ->iTable = iReg;
1adc0 0a 20 20 45 78 70 72 43 6c 65 61 72 50 72 6f 70  .  ExprClearProp
1add0 65 72 74 79 28 70 2c 20 45 50 5f 53 6b 69 70 29  erty(p, EP_Skip)
1ade0 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  ;.}..static void
1adf0 20 65 78 70 72 43 6f 64 65 42 65 74 77 65 65 6e   exprCodeBetween
1ae00 28 50 61 72 73 65 2a 2c 45 78 70 72 2a 2c 69 6e  (Parse*,Expr*,in
1ae10 74 2c 76 6f 69 64 28 2a 29 28 50 61 72 73 65 2a  t,void(*)(Parse*
1ae20 2c 45 78 70 72 2a 2c 69 6e 74 2c 69 6e 74 29 2c  ,Expr*,int,int),
1ae30 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  int);../*.** Gen
1ae40 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20  erate code into 
1ae50 74 68 65 20 63 75 72 72 65 6e 74 20 56 64 62 65  the current Vdbe
1ae60 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65   to evaluate the
1ae70 20 67 69 76 65 6e 0a 2a 2a 20 65 78 70 72 65 73   given.** expres
1ae80 73 69 6f 6e 2e 20 20 41 74 74 65 6d 70 74 20 74  sion.  Attempt t
1ae90 6f 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75  o store the resu
1aea0 6c 74 73 20 69 6e 20 72 65 67 69 73 74 65 72 20  lts in register 
1aeb0 22 74 61 72 67 65 74 22 2e 0a 2a 2a 20 52 65 74  "target"..** Ret
1aec0 75 72 6e 20 74 68 65 20 72 65 67 69 73 74 65 72  urn the register
1aed0 20 77 68 65 72 65 20 72 65 73 75 6c 74 73 20 61   where results a
1aee0 72 65 20 73 74 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a  re stored..**.**
1aef0 20 57 69 74 68 20 74 68 69 73 20 72 6f 75 74 69   With this routi
1af00 6e 65 2c 20 74 68 65 72 65 20 69 73 20 6e 6f 20  ne, there is no 
1af10 67 75 61 72 61 6e 74 65 65 20 74 68 61 74 20 72  guarantee that r
1af20 65 73 75 6c 74 73 20 77 69 6c 6c 0a 2a 2a 20 62  esults will.** b
1af30 65 20 73 74 6f 72 65 64 20 69 6e 20 74 61 72 67  e stored in targ
1af40 65 74 2e 20 20 54 68 65 20 72 65 73 75 6c 74 20  et.  The result 
1af50 6d 69 67 68 74 20 62 65 20 73 74 6f 72 65 64 20  might be stored 
1af60 69 6e 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a  in some other.**
1af70 20 72 65 67 69 73 74 65 72 20 69 66 20 69 74 20   register if it 
1af80 69 73 20 63 6f 6e 76 65 6e 69 65 6e 74 20 74 6f  is convenient to
1af90 20 64 6f 20 73 6f 2e 20 20 54 68 65 20 63 61 6c   do so.  The cal
1afa0 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  ling function.**
1afb0 20 6d 75 73 74 20 63 68 65 63 6b 20 74 68 65 20   must check the 
1afc0 72 65 74 75 72 6e 20 63 6f 64 65 20 61 6e 64 20  return code and 
1afd0 6d 6f 76 65 20 74 68 65 20 72 65 73 75 6c 74 73  move the results
1afe0 20 74 6f 20 74 68 65 20 64 65 73 69 72 65 64 0a   to the desired.
1aff0 2a 2a 20 72 65 67 69 73 74 65 72 2e 0a 2a 2f 0a  ** register..*/.
1b000 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43  int sqlite3ExprC
1b010 6f 64 65 54 61 72 67 65 74 28 50 61 72 73 65 20  odeTarget(Parse 
1b020 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
1b030 45 78 70 72 2c 20 69 6e 74 20 74 61 72 67 65 74  Expr, int target
1b040 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
1b050 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 2f  Parse->pVdbe;  /
1b060 2a 20 54 68 65 20 56 4d 20 75 6e 64 65 72 20 63  * The VM under c
1b070 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20  onstruction */. 
1b080 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20   int op;        
1b090 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1b0a0 65 20 6f 70 63 6f 64 65 20 62 65 69 6e 67 20 63  e opcode being c
1b0b0 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 6e  oded */.  int in
1b0c0 52 65 67 20 3d 20 74 61 72 67 65 74 3b 20 20 20  Reg = target;   
1b0d0 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 73 20 73      /* Results s
1b0e0 74 6f 72 65 64 20 69 6e 20 72 65 67 69 73 74 65  tored in registe
1b0f0 72 20 69 6e 52 65 67 20 2a 2f 0a 20 20 69 6e 74  r inReg */.  int
1b100 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b 20 20   regFree1 = 0;  
1b110 20 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e         /* If non
1b120 2d 7a 65 72 6f 20 66 72 65 65 20 74 68 69 73 20  -zero free this 
1b130 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74  temporary regist
1b140 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 46  er */.  int regF
1b150 72 65 65 32 20 3d 20 30 3b 20 20 20 20 20 20 20  ree2 = 0;       
1b160 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f    /* If non-zero
1b170 20 66 72 65 65 20 74 68 69 73 20 74 65 6d 70 6f   free this tempo
1b180 72 61 72 79 20 72 65 67 69 73 74 65 72 20 2a 2f  rary register */
1b190 0a 20 20 69 6e 74 20 72 31 2c 20 72 32 3b 20 20  .  int r1, r2;  
1b1a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b1b0 56 61 72 69 6f 75 73 20 72 65 67 69 73 74 65 72  Various register
1b1c0 20 6e 75 6d 62 65 72 73 20 2a 2f 0a 20 20 73 71   numbers */.  sq
1b1d0 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
1b1e0 73 65 2d 3e 64 62 3b 20 2f 2a 20 54 68 65 20 64  se->db; /* The d
1b1f0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
1b200 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 20 74 65 6d  on */.  Expr tem
1b210 70 58 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  pX;             
1b220 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 65    /* Temporary e
1b230 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 2a  xpression node *
1b240 2f 0a 20 20 69 6e 74 20 70 35 20 3d 20 30 3b 0a  /.  int p5 = 0;.
1b250 0a 20 20 61 73 73 65 72 74 28 20 74 61 72 67 65  .  assert( targe
1b260 74 3e 30 20 26 26 20 74 61 72 67 65 74 3c 3d 70  t>0 && target<=p
1b270 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 29 3b 0a 20  Parse->nMem );. 
1b280 20 69 66 28 20 76 3d 3d 30 20 29 7b 0a 20 20 20   if( v==0 ){.   
1b290 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
1b2a0 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
1b2b0 64 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  d );.    return 
1b2c0 30 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 45  0;.  }..  if( pE
1b2d0 78 70 72 3d 3d 30 20 29 7b 0a 20 20 20 20 6f 70  xpr==0 ){.    op
1b2e0 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 7d 65   = TK_NULL;.  }e
1b2f0 6c 73 65 7b 0a 20 20 20 20 6f 70 20 3d 20 70 45  lse{.    op = pE
1b300 78 70 72 2d 3e 6f 70 3b 0a 20 20 7d 0a 20 20 73  xpr->op;.  }.  s
1b310 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20  witch( op ){.   
1b320 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c   case TK_AGG_COL
1b330 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 41 67 67  UMN: {.      Agg
1b340 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 20 3d  Info *pAggInfo =
1b350 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f   pExpr->pAggInfo
1b360 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 41  ;.      struct A
1b370 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c  ggInfo_col *pCol
1b380 20 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e 61 43   = &pAggInfo->aC
1b390 6f 6c 5b 70 45 78 70 72 2d 3e 69 41 67 67 5d 3b  ol[pExpr->iAgg];
1b3a0 0a 20 20 20 20 20 20 69 66 28 20 21 70 41 67 67  .      if( !pAgg
1b3b0 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65  Info->directMode
1b3c0 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
1b3d0 72 74 28 20 70 43 6f 6c 2d 3e 69 4d 65 6d 3e 30  rt( pCol->iMem>0
1b3e0 20 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 52 65   );.        inRe
1b3f0 67 20 3d 20 70 43 6f 6c 2d 3e 69 4d 65 6d 3b 0a  g = pCol->iMem;.
1b400 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1b410 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
1b420 41 67 67 49 6e 66 6f 2d 3e 75 73 65 53 6f 72 74  AggInfo->useSort
1b430 69 6e 67 49 64 78 20 29 7b 0a 20 20 20 20 20 20  ingIdx ){.      
1b440 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1b450 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  Op3(v, OP_Column
1b460 2c 20 70 41 67 67 49 6e 66 6f 2d 3e 73 6f 72 74  , pAggInfo->sort
1b470 69 6e 67 49 64 78 50 54 61 62 2c 0a 20 20 20 20  ingIdxPTab,.    
1b480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b490 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e            pCol->
1b4a0 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 2c 20 74  iSorterColumn, t
1b4b0 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20  arget);.        
1b4c0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
1b4d0 20 20 20 20 20 2f 2a 20 4f 74 68 65 72 77 69 73       /* Otherwis
1b4e0 65 2c 20 66 61 6c 6c 20 74 68 72 75 20 69 6e 74  e, fall thru int
1b4f0 6f 20 74 68 65 20 54 4b 5f 43 4f 4c 55 4d 4e 20  o the TK_COLUMN 
1b500 63 61 73 65 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  case */.    }.  
1b510 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e    case TK_COLUMN
1b520 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 54  : {.      int iT
1b530 61 62 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62  ab = pExpr->iTab
1b540 6c 65 3b 0a 20 20 20 20 20 20 69 66 28 20 69 54  le;.      if( iT
1b550 61 62 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ab<0 ){.        
1b560 69 66 28 20 70 50 61 72 73 65 2d 3e 63 6b 42 61  if( pParse->ckBa
1b570 73 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  se>0 ){.        
1b580 20 20 2f 2a 20 47 65 6e 65 72 61 74 69 6e 67 20    /* Generating 
1b590 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74  CHECK constraint
1b5a0 73 20 6f 72 20 69 6e 73 65 72 74 69 6e 67 20 69  s or inserting i
1b5b0 6e 74 6f 20 70 61 72 74 69 61 6c 20 69 6e 64 65  nto partial inde
1b5c0 78 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69  x */.          i
1b5d0 6e 52 65 67 20 3d 20 70 45 78 70 72 2d 3e 69 43  nReg = pExpr->iC
1b5e0 6f 6c 75 6d 6e 20 2b 20 70 50 61 72 73 65 2d 3e  olumn + pParse->
1b5f0 63 6b 42 61 73 65 3b 0a 20 20 20 20 20 20 20 20  ckBase;.        
1b600 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
1b610 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1b620 20 20 2f 2a 20 43 6f 64 69 6e 67 20 61 6e 20 65    /* Coding an e
1b630 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 69  xpression that i
1b640 73 20 70 61 72 74 20 6f 66 20 61 6e 20 69 6e 64  s part of an ind
1b650 65 78 20 77 68 65 72 65 20 63 6f 6c 75 6d 6e 20  ex where column 
1b660 6e 61 6d 65 73 0a 20 20 20 20 20 20 20 20 20 20  names.          
1b670 2a 2a 20 69 6e 20 74 68 65 20 69 6e 64 65 78 20  ** in the index 
1b680 72 65 66 65 72 20 74 6f 20 74 68 65 20 74 61 62  refer to the tab
1b690 6c 65 20 74 6f 20 77 68 69 63 68 20 74 68 65 20  le to which the 
1b6a0 69 6e 64 65 78 20 62 65 6c 6f 6e 67 73 20 2a 2f  index belongs */
1b6b0 0a 20 20 20 20 20 20 20 20 20 20 69 54 61 62 20  .          iTab 
1b6c0 3d 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 66 54  = pParse->iSelfT
1b6d0 61 62 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ab;.        }.  
1b6e0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 6e 52 65      }.      inRe
1b6f0 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  g = sqlite3ExprC
1b700 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28 70 50 61  odeGetColumn(pPa
1b710 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 54 61 62  rse, pExpr->pTab
1b720 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1b730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b740 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c   pExpr->iColumn,
1b750 20 69 54 61 62 2c 20 74 61 72 67 65 74 2c 0a 20   iTab, target,. 
1b760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
1b780 78 70 72 2d 3e 6f 70 32 29 3b 0a 20 20 20 20 20  xpr->op2);.     
1b790 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1b7a0 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45    case TK_INTEGE
1b7b0 52 3a 20 7b 0a 20 20 20 20 20 20 63 6f 64 65 49  R: {.      codeI
1b7c0 6e 74 65 67 65 72 28 70 50 61 72 73 65 2c 20 70  nteger(pParse, p
1b7d0 45 78 70 72 2c 20 30 2c 20 74 61 72 67 65 74 29  Expr, 0, target)
1b7e0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1b7f0 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
1b800 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e  ITE_OMIT_FLOATIN
1b810 47 5f 50 4f 49 4e 54 0a 20 20 20 20 63 61 73 65  G_POINT.    case
1b820 20 54 4b 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20   TK_FLOAT: {.   
1b830 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
1b840 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
1b850 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20  r, EP_IntValue) 
1b860 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 52 65 61  );.      codeRea
1b870 6c 28 76 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54  l(v, pExpr->u.zT
1b880 6f 6b 65 6e 2c 20 30 2c 20 74 61 72 67 65 74 29  oken, 0, target)
1b890 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1b8a0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
1b8b0 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 20  case TK_STRING: 
1b8c0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
1b8d0 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
1b8e0 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61  (pExpr, EP_IntVa
1b8f0 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 73 71  lue) );.      sq
1b900 6c 69 74 65 33 56 64 62 65 4c 6f 61 64 53 74 72  lite3VdbeLoadStr
1b910 69 6e 67 28 76 2c 20 74 61 72 67 65 74 2c 20 70  ing(v, target, p
1b920 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b  Expr->u.zToken);
1b930 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1b940 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
1b950 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71  NULL: {.      sq
1b960 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1b970 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74  v, OP_Null, 0, t
1b980 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 62 72  arget);.      br
1b990 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  eak;.    }.#ifnd
1b9a0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42  ef SQLITE_OMIT_B
1b9b0 4c 4f 42 5f 4c 49 54 45 52 41 4c 0a 20 20 20 20  LOB_LITERAL.    
1b9c0 63 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 20 7b 0a  case TK_BLOB: {.
1b9d0 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20        int n;.   
1b9e0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
1b9f0 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 42  ;.      char *zB
1ba00 6c 6f 62 3b 0a 20 20 20 20 20 20 61 73 73 65 72  lob;.      asser
1ba10 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
1ba20 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e  rty(pExpr, EP_In
1ba30 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20  tValue) );.     
1ba40 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
1ba50 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 78 27  u.zToken[0]=='x'
1ba60 20 7c 7c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f   || pExpr->u.zTo
1ba70 6b 65 6e 5b 30 5d 3d 3d 27 58 27 20 29 3b 0a 20  ken[0]=='X' );. 
1ba80 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
1ba90 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 31 5d 3d  pr->u.zToken[1]=
1baa0 3d 27 5c 27 27 20 29 3b 0a 20 20 20 20 20 20 7a  ='\'' );.      z
1bab0 20 3d 20 26 70 45 78 70 72 2d 3e 75 2e 7a 54 6f   = &pExpr->u.zTo
1bac0 6b 65 6e 5b 32 5d 3b 0a 20 20 20 20 20 20 6e 20  ken[2];.      n 
1bad0 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
1bae0 30 28 7a 29 20 2d 20 31 3b 0a 20 20 20 20 20 20  0(z) - 1;.      
1baf0 61 73 73 65 72 74 28 20 7a 5b 6e 5d 3d 3d 27 5c  assert( z[n]=='\
1bb00 27 27 20 29 3b 0a 20 20 20 20 20 20 7a 42 6c 6f  '' );.      zBlo
1bb10 62 20 3d 20 73 71 6c 69 74 65 33 48 65 78 54 6f  b = sqlite3HexTo
1bb20 42 6c 6f 62 28 73 71 6c 69 74 65 33 56 64 62 65  Blob(sqlite3Vdbe
1bb30 44 62 28 76 29 2c 20 7a 2c 20 6e 29 3b 0a 20 20  Db(v), z, n);.  
1bb40 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1bb50 64 64 4f 70 34 28 76 2c 20 4f 50 5f 42 6c 6f 62  ddOp4(v, OP_Blob
1bb60 2c 20 6e 2f 32 2c 20 74 61 72 67 65 74 2c 20 30  , n/2, target, 0
1bb70 2c 20 7a 42 6c 6f 62 2c 20 50 34 5f 44 59 4e 41  , zBlob, P4_DYNA
1bb80 4d 49 43 29 3b 0a 20 20 20 20 20 20 62 72 65 61  MIC);.      brea
1bb90 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
1bba0 20 20 20 20 63 61 73 65 20 54 4b 5f 56 41 52 49      case TK_VARI
1bbb0 41 42 4c 45 3a 20 7b 0a 20 20 20 20 20 20 61 73  ABLE: {.      as
1bbc0 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
1bbd0 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
1bbe0 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20  _IntValue) );.  
1bbf0 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
1bc00 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 21 3d 30 20 29  r->u.zToken!=0 )
1bc10 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1bc20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b  pExpr->u.zToken[
1bc30 30 5d 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 73  0]!=0 );.      s
1bc40 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1bc50 28 76 2c 20 4f 50 5f 56 61 72 69 61 62 6c 65 2c  (v, OP_Variable,
1bc60 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c   pExpr->iColumn,
1bc70 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
1bc80 69 66 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  if( pExpr->u.zTo
1bc90 6b 65 6e 5b 31 5d 21 3d 30 20 29 7b 0a 20 20 20  ken[1]!=0 ){.   
1bca0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
1bcb0 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d  pr->u.zToken[0]=
1bcc0 3d 27 3f 27 20 0a 20 20 20 20 20 20 20 20 20 20  ='?' .          
1bcd0 20 20 20 7c 7c 20 73 74 72 63 6d 70 28 70 45 78     || strcmp(pEx
1bce0 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 70 50  pr->u.zToken, pP
1bcf0 61 72 73 65 2d 3e 61 7a 56 61 72 5b 70 45 78 70  arse->azVar[pExp
1bd00 72 2d 3e 69 43 6f 6c 75 6d 6e 2d 31 5d 29 3d 3d  r->iColumn-1])==
1bd10 30 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 );.        sql
1bd20 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34  ite3VdbeChangeP4
1bd30 28 76 2c 20 2d 31 2c 20 70 50 61 72 73 65 2d 3e  (v, -1, pParse->
1bd40 61 7a 56 61 72 5b 70 45 78 70 72 2d 3e 69 43 6f  azVar[pExpr->iCo
1bd50 6c 75 6d 6e 2d 31 5d 2c 20 50 34 5f 53 54 41 54  lumn-1], P4_STAT
1bd60 49 43 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  IC);.      }.   
1bd70 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1bd80 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45 47 49      case TK_REGI
1bd90 53 54 45 52 3a 20 7b 0a 20 20 20 20 20 20 69 6e  STER: {.      in
1bda0 52 65 67 20 3d 20 70 45 78 70 72 2d 3e 69 54 61  Reg = pExpr->iTa
1bdb0 62 6c 65 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ble;.      break
1bdc0 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
1bdd0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54  SQLITE_OMIT_CAST
1bde0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 41 53  .    case TK_CAS
1bdf0 54 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 78  T: {.      /* Ex
1be00 70 72 65 73 73 69 6f 6e 73 20 6f 66 20 74 68 65  pressions of the
1be10 20 66 6f 72 6d 3a 20 20 20 43 41 53 54 28 70 4c   form:   CAST(pL
1be20 65 66 74 20 41 53 20 74 6f 6b 65 6e 29 20 2a 2f  eft AS token) */
1be30 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 73  .      inReg = s
1be40 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61  qlite3ExprCodeTa
1be50 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 78  rget(pParse, pEx
1be60 70 72 2d 3e 70 4c 65 66 74 2c 20 74 61 72 67 65  pr->pLeft, targe
1be70 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 6e  t);.      if( in
1be80 52 65 67 21 3d 74 61 72 67 65 74 20 29 7b 0a 20  Reg!=target ){. 
1be90 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
1bea0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
1beb0 43 6f 70 79 2c 20 69 6e 52 65 67 2c 20 74 61 72  Copy, inReg, tar
1bec0 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 69 6e  get);.        in
1bed0 52 65 67 20 3d 20 74 61 72 67 65 74 3b 0a 20 20  Reg = target;.  
1bee0 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
1bef0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1bf00 20 4f 50 5f 43 61 73 74 2c 20 74 61 72 67 65 74   OP_Cast, target
1bf10 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1bf20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1bf30 33 41 66 66 69 6e 69 74 79 54 79 70 65 28 70 45  3AffinityType(pE
1bf40 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30  xpr->u.zToken, 0
1bf50 29 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  ));.      testca
1bf60 73 65 28 20 75 73 65 64 41 73 43 6f 6c 75 6d 6e  se( usedAsColumn
1bf70 43 61 63 68 65 28 70 50 61 72 73 65 2c 20 69 6e  Cache(pParse, in
1bf80 52 65 67 2c 20 69 6e 52 65 67 29 20 29 3b 0a 20  Reg, inReg) );. 
1bf90 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1bfa0 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61  CacheAffinityCha
1bfb0 6e 67 65 28 70 50 61 72 73 65 2c 20 69 6e 52 65  nge(pParse, inRe
1bfc0 67 2c 20 31 29 3b 0a 20 20 20 20 20 20 62 72 65  g, 1);.      bre
1bfd0 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
1bfe0 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
1bff0 43 41 53 54 20 2a 2f 0a 20 20 20 20 63 61 73 65  CAST */.    case
1c000 20 54 4b 5f 49 53 3a 0a 20 20 20 20 63 61 73 65   TK_IS:.    case
1c010 20 54 4b 5f 49 53 4e 4f 54 3a 0a 20 20 20 20 20   TK_ISNOT:.     
1c020 20 6f 70 20 3d 20 28 6f 70 3d 3d 54 4b 5f 49 53   op = (op==TK_IS
1c030 29 20 3f 20 54 4b 5f 45 51 20 3a 20 54 4b 5f 4e  ) ? TK_EQ : TK_N
1c040 45 3b 0a 20 20 20 20 20 20 70 35 20 3d 20 53 51  E;.      p5 = SQ
1c050 4c 49 54 45 5f 4e 55 4c 4c 45 51 3b 0a 20 20 20  LITE_NULLEQ;.   
1c060 20 20 20 2f 2a 20 66 61 6c 6c 2d 74 68 72 6f 75     /* fall-throu
1c070 67 68 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54  gh */.    case T
1c080 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65 20 54  K_LT:.    case T
1c090 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 54  K_LE:.    case T
1c0a0 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65 20 54  K_GT:.    case T
1c0b0 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65 20 54  K_GE:.    case T
1c0c0 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65 20 54  K_NE:.    case T
1c0d0 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20 45 78  K_EQ: {.      Ex
1c0e0 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70  pr *pLeft = pExp
1c0f0 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20  r->pLeft;.      
1c100 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49  if( sqlite3ExprI
1c110 73 56 65 63 74 6f 72 28 70 4c 65 66 74 29 20 29  sVector(pLeft) )
1c120 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 56 65  {.        codeVe
1c130 63 74 6f 72 43 6f 6d 70 61 72 65 28 70 50 61 72  ctorCompare(pPar
1c140 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65  se, pExpr, targe
1c150 74 2c 20 6f 70 2c 20 70 35 29 3b 0a 20 20 20 20  t, op, p5);.    
1c160 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1c170 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r1 = sqlite3Exp
1c180 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
1c190 2c 20 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65  , pLeft, &regFre
1c1a0 65 31 29 3b 0a 20 20 20 20 20 20 20 20 72 32 20  e1);.        r2 
1c1b0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
1c1c0 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
1c1d0 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65  xpr->pRight, &re
1c1e0 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 20  gFree2);.       
1c1f0 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61   codeCompare(pPa
1c200 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 45 78 70  rse, pLeft, pExp
1c210 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20  r->pRight, op,. 
1c220 20 20 20 20 20 20 20 20 20 20 20 72 31 2c 20 72             r1, r
1c230 32 2c 20 69 6e 52 65 67 2c 20 53 51 4c 49 54 45  2, inReg, SQLITE
1c240 5f 53 54 4f 52 45 50 32 20 7c 20 70 35 29 3b 0a  _STOREP2 | p5);.
1c250 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 54          assert(T
1c260 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 29 3b 20 74 65  K_LT==OP_Lt); te
1c270 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 74  stcase(op==OP_Lt
1c280 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49  ); VdbeCoverageI
1c290 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a  f(v,op==OP_Lt);.
1c2a0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 54          assert(T
1c2b0 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 29 3b 20 74 65  K_LE==OP_Le); te
1c2c0 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 65  stcase(op==OP_Le
1c2d0 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49  ); VdbeCoverageI
1c2e0 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 0a  f(v,op==OP_Le);.
1c2f0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 54          assert(T
1c300 4b 5f 47 54 3d 3d 4f 50 5f 47 74 29 3b 20 74 65  K_GT==OP_Gt); te
1c310 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 74  stcase(op==OP_Gt
1c320 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49  ); VdbeCoverageI
1c330 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 74 29 3b 0a  f(v,op==OP_Gt);.
1c340 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 54          assert(T
1c350 4b 5f 47 45 3d 3d 4f 50 5f 47 65 29 3b 20 74 65  K_GE==OP_Ge); te
1c360 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 65  stcase(op==OP_Ge
1c370 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49  ); VdbeCoverageI
1c380 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 65 29 3b 0a  f(v,op==OP_Ge);.
1c390 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 54          assert(T
1c3a0 4b 5f 45 51 3d 3d 4f 50 5f 45 71 29 3b 20 74 65  K_EQ==OP_Eq); te
1c3b0 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 45 71  stcase(op==OP_Eq
1c3c0 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49  ); VdbeCoverageI
1c3d0 66 28 76 2c 6f 70 3d 3d 4f 50 5f 45 71 29 3b 0a  f(v,op==OP_Eq);.
1c3e0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 54          assert(T
1c3f0 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 29 3b 20 74 65  K_NE==OP_Ne); te
1c400 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4e 65  stcase(op==OP_Ne
1c410 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49  ); VdbeCoverageI
1c420 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 0a  f(v,op==OP_Ne);.
1c430 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
1c440 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  ( regFree1==0 );
1c450 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
1c460 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29  e( regFree2==0 )
1c470 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1c480 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1c490 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 0a 20 20   case TK_AND:.  
1c4a0 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 0a 20 20    case TK_OR:.  
1c4b0 20 20 63 61 73 65 20 54 4b 5f 50 4c 55 53 3a 0a    case TK_PLUS:.
1c4c0 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 41 52      case TK_STAR
1c4d0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4d 49  :.    case TK_MI
1c4e0 4e 55 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  NUS:.    case TK
1c4f0 5f 52 45 4d 3a 0a 20 20 20 20 63 61 73 65 20 54  _REM:.    case T
1c500 4b 5f 42 49 54 41 4e 44 3a 0a 20 20 20 20 63 61  K_BITAND:.    ca
1c510 73 65 20 54 4b 5f 42 49 54 4f 52 3a 0a 20 20 20  se TK_BITOR:.   
1c520 20 63 61 73 65 20 54 4b 5f 53 4c 41 53 48 3a 0a   case TK_SLASH:.
1c530 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 53 48 49      case TK_LSHI
1c540 46 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  FT:.    case TK_
1c550 52 53 48 49 46 54 3a 20 0a 20 20 20 20 63 61 73  RSHIFT: .    cas
1c560 65 20 54 4b 5f 43 4f 4e 43 41 54 3a 20 7b 0a 20  e TK_CONCAT: {. 
1c570 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
1c580 41 4e 44 3d 3d 4f 50 5f 41 6e 64 20 29 3b 20 20  AND==OP_And );  
1c590 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
1c5a0 73 65 28 20 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29  se( op==TK_AND )
1c5b0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1c5c0 54 4b 5f 4f 52 3d 3d 4f 50 5f 4f 72 20 29 3b 20  TK_OR==OP_Or ); 
1c5d0 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73               tes
1c5e0 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4f 52  tcase( op==TK_OR
1c5f0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1c600 28 20 54 4b 5f 50 4c 55 53 3d 3d 4f 50 5f 41 64  ( TK_PLUS==OP_Ad
1c610 64 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 74  d );           t
1c620 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
1c630 50 4c 55 53 20 29 3b 0a 20 20 20 20 20 20 61 73  PLUS );.      as
1c640 73 65 72 74 28 20 54 4b 5f 4d 49 4e 55 53 3d 3d  sert( TK_MINUS==
1c650 4f 50 5f 53 75 62 74 72 61 63 74 20 29 3b 20 20  OP_Subtract );  
1c660 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
1c670 3d 54 4b 5f 4d 49 4e 55 53 20 29 3b 0a 20 20 20  =TK_MINUS );.   
1c680 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 52 45     assert( TK_RE
1c690 4d 3d 3d 4f 50 5f 52 65 6d 61 69 6e 64 65 72 20  M==OP_Remainder 
1c6a0 29 3b 20 20 20 20 20 20 74 65 73 74 63 61 73 65  );      testcase
1c6b0 28 20 6f 70 3d 3d 54 4b 5f 52 45 4d 20 29 3b 0a  ( op==TK_REM );.
1c6c0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
1c6d0 5f 42 49 54 41 4e 44 3d 3d 4f 50 5f 42 69 74 41  _BITAND==OP_BitA
1c6e0 6e 64 20 29 3b 20 20 20 20 20 20 74 65 73 74 63  nd );      testc
1c6f0 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 42 49 54 41  ase( op==TK_BITA
1c700 4e 44 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ND );.      asse
1c710 72 74 28 20 54 4b 5f 42 49 54 4f 52 3d 3d 4f 50  rt( TK_BITOR==OP
1c720 5f 42 69 74 4f 72 20 29 3b 20 20 20 20 20 20 20  _BitOr );       
1c730 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
1c740 4b 5f 42 49 54 4f 52 20 29 3b 0a 20 20 20 20 20  K_BITOR );.     
1c750 20 61 73 73 65 72 74 28 20 54 4b 5f 53 4c 41 53   assert( TK_SLAS
1c760 48 3d 3d 4f 50 5f 44 69 76 69 64 65 20 29 3b 20  H==OP_Divide ); 
1c770 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1c780 6f 70 3d 3d 54 4b 5f 53 4c 41 53 48 20 29 3b 0a  op==TK_SLASH );.
1c790 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
1c7a0 5f 4c 53 48 49 46 54 3d 3d 4f 50 5f 53 68 69 66  _LSHIFT==OP_Shif
1c7b0 74 4c 65 66 74 20 29 3b 20 20 20 74 65 73 74 63  tLeft );   testc
1c7c0 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c 53 48 49  ase( op==TK_LSHI
1c7d0 46 54 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  FT );.      asse
1c7e0 72 74 28 20 54 4b 5f 52 53 48 49 46 54 3d 3d 4f  rt( TK_RSHIFT==O
1c7f0 50 5f 53 68 69 66 74 52 69 67 68 74 20 29 3b 20  P_ShiftRight ); 
1c800 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
1c810 4b 5f 52 53 48 49 46 54 20 29 3b 0a 20 20 20 20  K_RSHIFT );.    
1c820 20 20 61 73 73 65 72 74 28 20 54 4b 5f 43 4f 4e    assert( TK_CON
1c830 43 41 54 3d 3d 4f 50 5f 43 6f 6e 63 61 74 20 29  CAT==OP_Concat )
1c840 3b 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  ;      testcase(
1c850 20 6f 70 3d 3d 54 4b 5f 43 4f 4e 43 41 54 20 29   op==TK_CONCAT )
1c860 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  ;.      r1 = sql
1c870 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
1c880 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
1c890 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31  pLeft, &regFree1
1c8a0 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71  );.      r2 = sq
1c8b0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
1c8c0 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
1c8d0 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46 72 65  >pRight, &regFre
1c8e0 65 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  e2);.      sqlit
1c8f0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
1c900 6f 70 2c 20 72 32 2c 20 72 31 2c 20 74 61 72 67  op, r2, r1, targ
1c910 65 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  et);.      testc
1c920 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30  ase( regFree1==0
1c930 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
1c940 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20  se( regFree2==0 
1c950 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1c960 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
1c970 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20 20  K_UMINUS: {.    
1c980 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20    Expr *pLeft = 
1c990 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20  pExpr->pLeft;.  
1c9a0 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 65 66      assert( pLef
1c9b0 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  t );.      if( p
1c9c0 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54  Left->op==TK_INT
1c9d0 45 47 45 52 20 29 7b 0a 20 20 20 20 20 20 20 20  EGER ){.        
1c9e0 63 6f 64 65 49 6e 74 65 67 65 72 28 70 50 61 72  codeInteger(pPar
1c9f0 73 65 2c 20 70 4c 65 66 74 2c 20 31 2c 20 74 61  se, pLeft, 1, ta
1ca00 72 67 65 74 29 3b 0a 23 69 66 6e 64 65 66 20 53  rget);.#ifndef S
1ca10 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54  QLITE_OMIT_FLOAT
1ca20 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20 20 20  ING_POINT.      
1ca30 7d 65 6c 73 65 20 69 66 28 20 70 4c 65 66 74 2d  }else if( pLeft-
1ca40 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20 29 7b  >op==TK_FLOAT ){
1ca50 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1ca60 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
1ca70 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56  y(pExpr, EP_IntV
1ca80 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 20  alue) );.       
1ca90 20 63 6f 64 65 52 65 61 6c 28 76 2c 20 70 4c 65   codeReal(v, pLe
1caa0 66 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 31 2c  ft->u.zToken, 1,
1cab0 20 74 61 72 67 65 74 29 3b 0a 23 65 6e 64 69 66   target);.#endif
1cac0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1cad0 20 20 20 20 20 20 74 65 6d 70 58 2e 6f 70 20 3d        tempX.op =
1cae0 20 54 4b 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20   TK_INTEGER;.   
1caf0 20 20 20 20 20 74 65 6d 70 58 2e 66 6c 61 67 73       tempX.flags
1cb00 20 3d 20 45 50 5f 49 6e 74 56 61 6c 75 65 7c 45   = EP_IntValue|E
1cb10 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 3b 0a 20 20 20  P_TokenOnly;.   
1cb20 20 20 20 20 20 74 65 6d 70 58 2e 75 2e 69 56 61       tempX.u.iVa
1cb30 6c 75 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  lue = 0;.       
1cb40 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r1 = sqlite3Exp
1cb50 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
1cb60 2c 20 26 74 65 6d 70 58 2c 20 26 72 65 67 46 72  , &tempX, &regFr
1cb70 65 65 31 29 3b 0a 20 20 20 20 20 20 20 20 72 32  ee1);.        r2
1cb80 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1cb90 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
1cba0 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65  Expr->pLeft, &re
1cbb0 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 20  gFree2);.       
1cbc0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1cbd0 70 33 28 76 2c 20 4f 50 5f 53 75 62 74 72 61 63  p3(v, OP_Subtrac
1cbe0 74 2c 20 72 32 2c 20 72 31 2c 20 74 61 72 67 65  t, r2, r1, targe
1cbf0 74 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  t);.        test
1cc00 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d  case( regFree2==
1cc10 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  0 );.      }.   
1cc20 20 20 20 69 6e 52 65 67 20 3d 20 74 61 72 67 65     inReg = targe
1cc30 74 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  t;.      break;.
1cc40 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
1cc50 4b 5f 42 49 54 4e 4f 54 3a 0a 20 20 20 20 63 61  K_BITNOT:.    ca
1cc60 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20  se TK_NOT: {.   
1cc70 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 42 49     assert( TK_BI
1cc80 54 4e 4f 54 3d 3d 4f 50 5f 42 69 74 4e 6f 74 20  TNOT==OP_BitNot 
1cc90 29 3b 20 20 20 74 65 73 74 63 61 73 65 28 20 6f  );   testcase( o
1cca0 70 3d 3d 54 4b 5f 42 49 54 4e 4f 54 20 29 3b 0a  p==TK_BITNOT );.
1ccb0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
1ccc0 5f 4e 4f 54 3d 3d 4f 50 5f 4e 6f 74 20 29 3b 20  _NOT==OP_Not ); 
1ccd0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
1cce0 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 20 29 3b 0a  ( op==TK_NOT );.
1ccf0 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
1cd00 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
1cd10 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
1cd20 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b  eft, &regFree1);
1cd30 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1cd40 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
1cd50 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 74 61        inReg = ta
1cd60 72 67 65 74 3b 0a 20 20 20 20 20 20 73 71 6c 69  rget;.      sqli
1cd70 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1cd80 20 6f 70 2c 20 72 31 2c 20 69 6e 52 65 67 29 3b   op, r1, inReg);
1cd90 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1cda0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
1cdb0 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65  ISNULL:.    case
1cdc0 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20   TK_NOTNULL: {. 
1cdd0 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20       int addr;. 
1cde0 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
1cdf0 49 53 4e 55 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c  ISNULL==OP_IsNul
1ce00 6c 20 29 3b 20 20 20 74 65 73 74 63 61 73 65 28  l );   testcase(
1ce10 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29   op==TK_ISNULL )
1ce20 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1ce30 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e  TK_NOTNULL==OP_N
1ce40 6f 74 4e 75 6c 6c 20 29 3b 20 74 65 73 74 63 61  otNull ); testca
1ce50 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55  se( op==TK_NOTNU
1ce60 4c 4c 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  LL );.      sqli
1ce70 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1ce80 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20   OP_Integer, 1, 
1ce90 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 72  target);.      r
1cea0 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  1 = sqlite3ExprC
1ceb0 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
1cec0 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72  pExpr->pLeft, &r
1ced0 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20  egFree1);.      
1cee0 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
1cef0 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 61  e1==0 );.      a
1cf00 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
1cf10 65 41 64 64 4f 70 31 28 76 2c 20 6f 70 2c 20 72  eAddOp1(v, op, r
1cf20 31 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  1);.      VdbeCo
1cf30 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
1cf40 54 4b 5f 49 53 4e 55 4c 4c 29 3b 0a 20 20 20 20  TK_ISNULL);.    
1cf50 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
1cf60 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55  (v, op==TK_NOTNU
1cf70 4c 4c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  LL);.      sqlit
1cf80 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1cf90 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 74  OP_Integer, 0, t
1cfa0 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 73 71  arget);.      sq
1cfb0 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
1cfc0 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20  e(v, addr);.    
1cfd0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1cfe0 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46     case TK_AGG_F
1cff0 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20  UNCTION: {.     
1d000 20 41 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 20   AggInfo *pInfo 
1d010 3d 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66  = pExpr->pAggInf
1d020 6f 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e  o;.      if( pIn
1d030 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  fo==0 ){.       
1d040 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
1d050 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
1d060 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b   EP_IntValue) );
1d070 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1d080 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
1d090 20 22 6d 69 73 75 73 65 20 6f 66 20 61 67 67 72   "misuse of aggr
1d0a0 65 67 61 74 65 3a 20 25 73 28 29 22 2c 20 70 45  egate: %s()", pE
1d0b0 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a  xpr->u.zToken);.
1d0c0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1d0d0 20 20 20 20 20 69 6e 52 65 67 20 3d 20 70 49 6e       inReg = pIn
1d0e0 66 6f 2d 3e 61 46 75 6e 63 5b 70 45 78 70 72 2d  fo->aFunc[pExpr-
1d0f0 3e 69 41 67 67 5d 2e 69 4d 65 6d 3b 0a 20 20 20  >iAgg].iMem;.   
1d100 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
1d110 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1d120 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a   TK_FUNCTION: {.
1d130 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a        ExprList *
1d140 70 46 61 72 67 3b 20 20 20 20 20 20 20 2f 2a 20  pFarg;       /* 
1d150 4c 69 73 74 20 6f 66 20 66 75 6e 63 74 69 6f 6e  List of function
1d160 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
1d170 20 20 20 20 69 6e 74 20 6e 46 61 72 67 3b 20 20      int nFarg;  
1d180 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1d190 6d 62 65 72 20 6f 66 20 66 75 6e 63 74 69 6f 6e  mber of function
1d1a0 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
1d1b0 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65      FuncDef *pDe
1d1c0 66 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  f;         /* Th
1d1d0 65 20 66 75 6e 63 74 69 6f 6e 20 64 65 66 69 6e  e function defin
1d1e0 69 74 69 6f 6e 20 6f 62 6a 65 63 74 20 2a 2f 0a  ition object */.
1d1f0 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
1d200 20 2a 7a 49 64 3b 20 20 20 20 20 20 20 2f 2a 20   *zId;       /* 
1d210 54 68 65 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d  The function nam
1d220 65 20 2a 2f 0a 20 20 20 20 20 20 75 33 32 20 63  e */.      u32 c
1d230 6f 6e 73 74 4d 61 73 6b 20 3d 20 30 3b 20 20 20  onstMask = 0;   
1d240 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 66 75 6e    /* Mask of fun
1d250 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20  ction arguments 
1d260 74 68 61 74 20 61 72 65 20 63 6f 6e 73 74 61 6e  that are constan
1d270 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69  t */.      int i
1d280 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1d290 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
1d2a0 72 20 2a 2f 0a 20 20 20 20 20 20 75 38 20 65 6e  r */.      u8 en
1d2b0 63 20 3d 20 45 4e 43 28 64 62 29 3b 20 20 20 20  c = ENC(db);    
1d2c0 20 20 2f 2a 20 54 68 65 20 74 65 78 74 20 65 6e    /* The text en
1d2d0 63 6f 64 69 6e 67 20 75 73 65 64 20 62 79 20 74  coding used by t
1d2e0 68 69 73 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  his database */.
1d2f0 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
1d300 43 6f 6c 6c 20 3d 20 30 3b 20 20 20 20 2f 2a 20  Coll = 0;    /* 
1d310 41 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  A collating sequ
1d320 65 6e 63 65 20 2a 2f 0a 0a 20 20 20 20 20 20 61  ence */..      a
1d330 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
1d340 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
1d350 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a  P_xIsSelect) );.
1d360 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61        if( ExprHa
1d370 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
1d380 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29   EP_TokenOnly) )
1d390 7b 0a 20 20 20 20 20 20 20 20 70 46 61 72 67 20  {.        pFarg 
1d3a0 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 0;.      }else
1d3b0 7b 0a 20 20 20 20 20 20 20 20 70 46 61 72 67 20  {.        pFarg 
1d3c0 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  = pExpr->x.pList
1d3d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1d3e0 6e 46 61 72 67 20 3d 20 70 46 61 72 67 20 3f 20  nFarg = pFarg ? 
1d3f0 70 46 61 72 67 2d 3e 6e 45 78 70 72 20 3a 20 30  pFarg->nExpr : 0
1d400 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1d410 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
1d420 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61  (pExpr, EP_IntVa
1d430 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 7a 49  lue) );.      zI
1d440 64 20 3d 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  d = pExpr->u.zTo
1d450 6b 65 6e 3b 0a 20 20 20 20 20 20 70 44 65 66 20  ken;.      pDef 
1d460 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e  = sqlite3FindFun
1d470 63 74 69 6f 6e 28 64 62 2c 20 7a 49 64 2c 20 6e  ction(db, zId, n
1d480 46 61 72 67 2c 20 65 6e 63 2c 20 30 29 3b 0a 23  Farg, enc, 0);.#
1d490 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
1d4a0 42 4c 45 5f 55 4e 4b 4e 4f 57 4e 5f 53 51 4c 5f  BLE_UNKNOWN_SQL_
1d4b0 46 55 4e 43 54 49 4f 4e 0a 20 20 20 20 20 20 69  FUNCTION.      i
1d4c0 66 28 20 70 44 65 66 3d 3d 30 20 26 26 20 70 50  f( pDef==0 && pP
1d4d0 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b  arse->explain ){
1d4e0 0a 20 20 20 20 20 20 20 20 70 44 65 66 20 3d 20  .        pDef = 
1d4f0 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74  sqlite3FindFunct
1d500 69 6f 6e 28 64 62 2c 20 22 75 6e 6b 6e 6f 77 6e  ion(db, "unknown
1d510 22 2c 20 6e 46 61 72 67 2c 20 65 6e 63 2c 20 30  ", nFarg, enc, 0
1d520 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
1d530 66 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 66  f.      if( pDef
1d540 3d 3d 30 20 7c 7c 20 70 44 65 66 2d 3e 78 46 69  ==0 || pDef->xFi
1d550 6e 61 6c 69 7a 65 21 3d 30 20 29 7b 0a 20 20 20  nalize!=0 ){.   
1d560 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
1d570 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e  rMsg(pParse, "un
1d580 6b 6e 6f 77 6e 20 66 75 6e 63 74 69 6f 6e 3a 20  known function: 
1d590 25 73 28 29 22 2c 20 7a 49 64 29 3b 0a 20 20 20  %s()", zId);.   
1d5a0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1d5b0 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 41 74    }..      /* At
1d5c0 74 65 6d 70 74 20 61 20 64 69 72 65 63 74 20 69  tempt a direct i
1d5d0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
1d5e0 20 74 68 65 20 62 75 69 6c 74 2d 69 6e 20 43 4f   the built-in CO
1d5f0 41 4c 45 53 43 45 28 29 20 61 6e 64 0a 20 20 20  ALESCE() and.   
1d600 20 20 20 2a 2a 20 49 46 4e 55 4c 4c 28 29 20 66     ** IFNULL() f
1d610 75 6e 63 74 69 6f 6e 73 2e 20 20 54 68 69 73 20  unctions.  This 
1d620 61 76 6f 69 64 73 20 75 6e 6e 65 63 65 73 73 61  avoids unnecessa
1d630 72 79 20 65 76 61 6c 75 61 74 69 6f 6e 20 6f 66  ry evaluation of
1d640 0a 20 20 20 20 20 20 2a 2a 20 61 72 67 75 6d 65  .      ** argume
1d650 6e 74 73 20 70 61 73 74 20 74 68 65 20 66 69 72  nts past the fir
1d660 73 74 20 6e 6f 6e 2d 4e 55 4c 4c 20 61 72 67 75  st non-NULL argu
1d670 6d 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ment..      */. 
1d680 20 20 20 20 20 69 66 28 20 70 44 65 66 2d 3e 66       if( pDef->f
1d690 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54  uncFlags & SQLIT
1d6a0 45 5f 46 55 4e 43 5f 43 4f 41 4c 45 53 43 45 20  E_FUNC_COALESCE 
1d6b0 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 65  ){.        int e
1d6c0 6e 64 43 6f 61 6c 65 73 63 65 20 3d 20 73 71 6c  ndCoalesce = sql
1d6d0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
1d6e0 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20 61 73  l(v);.        as
1d6f0 73 65 72 74 28 20 6e 46 61 72 67 3e 3d 32 20 29  sert( nFarg>=2 )
1d700 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
1d710 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
1d720 2c 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45  , pFarg->a[0].pE
1d730 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  xpr, target);.  
1d740 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69        for(i=1; i
1d750 3c 6e 46 61 72 67 3b 20 69 2b 2b 29 7b 0a 20 20  <nFarg; i++){.  
1d760 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
1d770 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1d780 4e 6f 74 4e 75 6c 6c 2c 20 74 61 72 67 65 74 2c  NotNull, target,
1d790 20 65 6e 64 43 6f 61 6c 65 73 63 65 29 3b 0a 20   endCoalesce);. 
1d7a0 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76           VdbeCov
1d7b0 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
1d7c0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
1d7d0 61 63 68 65 52 65 6d 6f 76 65 28 70 50 61 72 73  acheRemove(pPars
1d7e0 65 2c 20 74 61 72 67 65 74 2c 20 31 29 3b 0a 20  e, target, 1);. 
1d7f0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1d800 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50  ExprCachePush(pP
1d810 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 20  arse);.         
1d820 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1d830 28 70 50 61 72 73 65 2c 20 70 46 61 72 67 2d 3e  (pParse, pFarg->
1d840 61 5b 69 5d 2e 70 45 78 70 72 2c 20 74 61 72 67  a[i].pExpr, targ
1d850 65 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  et);.          s
1d860 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
1d870 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  op(pParse);.    
1d880 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
1d890 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
1d8a0 4c 61 62 65 6c 28 76 2c 20 65 6e 64 43 6f 61 6c  Label(v, endCoal
1d8b0 65 73 63 65 29 3b 0a 20 20 20 20 20 20 20 20 62  esce);.        b
1d8c0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  reak;.      }.. 
1d8d0 20 20 20 20 20 2f 2a 20 54 68 65 20 55 4e 4c 49       /* The UNLI
1d8e0 4b 45 4c 59 28 29 20 66 75 6e 63 74 69 6f 6e 20  KELY() function 
1d8f0 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 54 68 65  is a no-op.  The
1d900 20 72 65 73 75 6c 74 20 69 73 20 74 68 65 20 76   result is the v
1d910 61 6c 75 65 0a 20 20 20 20 20 20 2a 2a 20 6f 66  alue.      ** of
1d920 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
1d930 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ent..      */.  
1d940 20 20 20 20 69 66 28 20 70 44 65 66 2d 3e 66 75      if( pDef->fu
1d950 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ncFlags & SQLITE
1d960 5f 46 55 4e 43 5f 55 4e 4c 49 4b 45 4c 59 20 29  _FUNC_UNLIKELY )
1d970 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
1d980 28 20 6e 46 61 72 67 3e 3d 31 20 29 3b 0a 20 20  ( nFarg>=1 );.  
1d990 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71        inReg = sq
1d9a0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72  lite3ExprCodeTar
1d9b0 67 65 74 28 70 50 61 72 73 65 2c 20 70 46 61 72  get(pParse, pFar
1d9c0 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20 74  g->a[0].pExpr, t
1d9d0 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20  arget);.        
1d9e0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a  break;.      }..
1d9f0 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
1da00 3c 6e 46 61 72 67 3b 20 69 2b 2b 29 7b 0a 20 20  <nFarg; i++){.  
1da10 20 20 20 20 20 20 69 66 28 20 69 3c 33 32 20 26        if( i<32 &
1da20 26 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43  & sqlite3ExprIsC
1da30 6f 6e 73 74 61 6e 74 28 70 46 61 72 67 2d 3e 61  onstant(pFarg->a
1da40 5b 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20  [i].pExpr) ){.  
1da50 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
1da60 28 20 69 3d 3d 33 31 20 29 3b 0a 20 20 20 20 20  ( i==31 );.     
1da70 20 20 20 20 20 63 6f 6e 73 74 4d 61 73 6b 20 7c       constMask |
1da80 3d 20 4d 41 53 4b 42 49 54 33 32 28 69 29 3b 0a  = MASKBIT32(i);.
1da90 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1daa0 20 20 69 66 28 20 28 70 44 65 66 2d 3e 66 75 6e    if( (pDef->fun
1dab0 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  cFlags & SQLITE_
1dac0 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 29 21 3d  FUNC_NEEDCOLL)!=
1dad0 30 20 26 26 20 21 70 43 6f 6c 6c 20 29 7b 0a 20  0 && !pColl ){. 
1dae0 20 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d           pColl =
1daf0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
1db00 53 65 71 28 70 50 61 72 73 65 2c 20 70 46 61 72  Seq(pParse, pFar
1db10 67 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a  g->a[i].pExpr);.
1db20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1db30 7d 0a 20 20 20 20 20 20 69 66 28 20 70 46 61 72  }.      if( pFar
1db40 67 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  g ){.        if(
1db50 20 63 6f 6e 73 74 4d 61 73 6b 20 29 7b 0a 20 20   constMask ){.  
1db60 20 20 20 20 20 20 20 20 72 31 20 3d 20 70 50 61          r1 = pPa
1db70 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20  rse->nMem+1;.   
1db80 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e         pParse->n
1db90 4d 65 6d 20 2b 3d 20 6e 46 61 72 67 3b 0a 20 20  Mem += nFarg;.  
1dba0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1dbb0 20 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69         r1 = sqli
1dbc0 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28  te3GetTempRange(
1dbd0 70 50 61 72 73 65 2c 20 6e 46 61 72 67 29 3b 0a  pParse, nFarg);.
1dbe0 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
1dbf0 20 20 20 2f 2a 20 46 6f 72 20 6c 65 6e 67 74 68     /* For length
1dc00 28 29 20 61 6e 64 20 74 79 70 65 6f 66 28 29 20  () and typeof() 
1dc10 66 75 6e 63 74 69 6f 6e 73 20 77 69 74 68 20 61  functions with a
1dc20 20 63 6f 6c 75 6d 6e 20 61 72 67 75 6d 65 6e 74   column argument
1dc30 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 65 74  ,.        ** set
1dc40 20 74 68 65 20 50 35 20 70 61 72 61 6d 65 74 65   the P5 paramete
1dc50 72 20 74 6f 20 74 68 65 20 4f 50 5f 43 6f 6c 75  r to the OP_Colu
1dc60 6d 6e 20 6f 70 63 6f 64 65 20 74 6f 20 4f 50 46  mn opcode to OPF
1dc70 4c 41 47 5f 4c 45 4e 47 54 48 41 52 47 0a 20 20  LAG_LENGTHARG.  
1dc80 20 20 20 20 20 20 2a 2a 20 6f 72 20 4f 50 46 4c        ** or OPFL
1dc90 41 47 5f 54 59 50 45 4f 46 41 52 47 20 72 65 73  AG_TYPEOFARG res
1dca0 70 65 63 74 69 76 65 6c 79 2c 20 74 6f 20 61 76  pectively, to av
1dcb0 6f 69 64 20 75 6e 6e 65 63 65 73 73 61 72 79 20  oid unnecessary 
1dcc0 64 61 74 61 0a 20 20 20 20 20 20 20 20 2a 2a 20  data.        ** 
1dcd0 6c 6f 61 64 69 6e 67 2e 0a 20 20 20 20 20 20 20  loading..       
1dce0 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
1dcf0 28 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73  (pDef->funcFlags
1dd00 20 26 20 28 53 51 4c 49 54 45 5f 46 55 4e 43 5f   & (SQLITE_FUNC_
1dd10 4c 45 4e 47 54 48 7c 53 51 4c 49 54 45 5f 46 55  LENGTH|SQLITE_FU
1dd20 4e 43 5f 54 59 50 45 4f 46 29 29 21 3d 30 20 29  NC_TYPEOF))!=0 )
1dd30 7b 0a 20 20 20 20 20 20 20 20 20 20 75 38 20 65  {.          u8 e
1dd40 78 70 72 4f 70 3b 0a 20 20 20 20 20 20 20 20 20  xprOp;.         
1dd50 20 61 73 73 65 72 74 28 20 6e 46 61 72 67 3d 3d   assert( nFarg==
1dd60 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61  1 );.          a
1dd70 73 73 65 72 74 28 20 70 46 61 72 67 2d 3e 61 5b  ssert( pFarg->a[
1dd80 30 5d 2e 70 45 78 70 72 21 3d 30 20 29 3b 0a 20  0].pExpr!=0 );. 
1dd90 20 20 20 20 20 20 20 20 20 65 78 70 72 4f 70 20           exprOp 
1dda0 3d 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45  = pFarg->a[0].pE
1ddb0 78 70 72 2d 3e 6f 70 3b 0a 20 20 20 20 20 20 20  xpr->op;.       
1ddc0 20 20 20 69 66 28 20 65 78 70 72 4f 70 3d 3d 54     if( exprOp==T
1ddd0 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 65 78 70 72  K_COLUMN || expr
1dde0 4f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  Op==TK_AGG_COLUM
1ddf0 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  N ){.           
1de00 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f   assert( SQLITE_
1de10 46 55 4e 43 5f 4c 45 4e 47 54 48 3d 3d 4f 50 46  FUNC_LENGTH==OPF
1de20 4c 41 47 5f 4c 45 4e 47 54 48 41 52 47 20 29 3b  LAG_LENGTHARG );
1de30 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73  .            ass
1de40 65 72 74 28 20 53 51 4c 49 54 45 5f 46 55 4e 43  ert( SQLITE_FUNC
1de50 5f 54 59 50 45 4f 46 3d 3d 4f 50 46 4c 41 47 5f  _TYPEOF==OPFLAG_
1de60 54 59 50 45 4f 46 41 52 47 20 29 3b 0a 20 20 20  TYPEOFARG );.   
1de70 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
1de80 65 28 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61  e( pDef->funcFla
1de90 67 73 20 26 20 4f 50 46 4c 41 47 5f 4c 45 4e 47  gs & OPFLAG_LENG
1dea0 54 48 41 52 47 20 29 3b 0a 20 20 20 20 20 20 20  THARG );.       
1deb0 20 20 20 20 20 70 46 61 72 67 2d 3e 61 5b 30 5d       pFarg->a[0]
1dec0 2e 70 45 78 70 72 2d 3e 6f 70 32 20 3d 20 0a 20  .pExpr->op2 = . 
1ded0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dee0 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73   pDef->funcFlags
1def0 20 26 20 28 4f 50 46 4c 41 47 5f 4c 45 4e 47 54   & (OPFLAG_LENGT
1df00 48 41 52 47 7c 4f 50 46 4c 41 47 5f 54 59 50 45  HARG|OPFLAG_TYPE
1df10 4f 46 41 52 47 29 3b 0a 20 20 20 20 20 20 20 20  OFARG);.        
1df20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20    }.        }.. 
1df30 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
1df40 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72  prCachePush(pPar
1df50 73 65 29 3b 20 20 20 20 20 2f 2a 20 54 69 63 6b  se);     /* Tick
1df60 65 74 20 32 65 61 32 34 32 35 64 33 34 62 65 20  et 2ea2425d34be 
1df70 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  */.        sqlit
1df80 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69  e3ExprCodeExprLi
1df90 73 74 28 70 50 61 72 73 65 2c 20 70 46 61 72 67  st(pParse, pFarg
1dfa0 2c 20 72 31 2c 20 30 2c 0a 20 20 20 20 20 20 20  , r1, 0,.       
1dfb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dfc0 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
1dfd0 45 43 45 4c 5f 44 55 50 7c 53 51 4c 49 54 45 5f  ECEL_DUP|SQLITE_
1dfe0 45 43 45 4c 5f 46 41 43 54 4f 52 29 3b 0a 20 20  ECEL_FACTOR);.  
1dff0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1e000 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65  rCachePop(pParse
1e010 29 3b 20 20 20 20 20 20 2f 2a 20 54 69 63 6b 65  );      /* Ticke
1e020 74 20 32 65 61 32 34 32 35 64 33 34 62 65 20 2a  t 2ea2425d34be *
1e030 2f 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  /.      }else{. 
1e040 20 20 20 20 20 20 20 72 31 20 3d 20 30 3b 0a 20         r1 = 0;. 
1e050 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53       }.#ifndef S
1e060 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
1e070 41 4c 54 41 42 4c 45 0a 20 20 20 20 20 20 2f 2a  ALTABLE.      /*
1e080 20 50 6f 73 73 69 62 6c 79 20 6f 76 65 72 6c 6f   Possibly overlo
1e090 61 64 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  ad the function 
1e0a0 69 66 20 74 68 65 20 66 69 72 73 74 20 61 72 67  if the first arg
1e0b0 75 6d 65 6e 74 20 69 73 0a 20 20 20 20 20 20 2a  ument is.      *
1e0c0 2a 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c  * a virtual tabl
1e0d0 65 20 63 6f 6c 75 6d 6e 2e 0a 20 20 20 20 20 20  e column..      
1e0e0 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72 20  **.      ** For 
1e0f0 69 6e 66 69 78 20 66 75 6e 63 74 69 6f 6e 73 20  infix functions 
1e100 28 4c 49 4b 45 2c 20 47 4c 4f 42 2c 20 52 45 47  (LIKE, GLOB, REG
1e110 45 58 50 2c 20 61 6e 64 20 4d 41 54 43 48 29 20  EXP, and MATCH) 
1e120 75 73 65 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  use the.      **
1e130 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
1e140 2c 20 6e 6f 74 20 74 68 65 20 66 69 72 73 74 2c  , not the first,
1e150 20 61 73 20 74 68 65 20 61 72 67 75 6d 65 6e 74   as the argument
1e160 20 74 6f 20 74 65 73 74 20 74 6f 0a 20 20 20 20   to test to.    
1e170 20 20 2a 2a 20 73 65 65 20 69 66 20 69 74 20 69    ** see if it i
1e180 73 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 61 20  s a column in a 
1e190 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20 20  virtual table.  
1e1a0 54 68 69 73 20 69 73 20 64 6f 6e 65 20 62 65 63  This is done bec
1e1b0 61 75 73 65 0a 20 20 20 20 20 20 2a 2a 20 74 68  ause.      ** th
1e1c0 65 20 6c 65 66 74 20 6f 70 65 72 61 6e 64 20 6f  e left operand o
1e1d0 66 20 69 6e 66 69 78 20 66 75 6e 63 74 69 6f 6e  f infix function
1e1e0 73 20 28 74 68 65 20 6f 70 65 72 61 6e 64 20 77  s (the operand w
1e1f0 65 20 77 61 6e 74 20 74 6f 0a 20 20 20 20 20 20  e want to.      
1e200 2a 2a 20 63 6f 6e 74 72 6f 6c 20 6f 76 65 72 6c  ** control overl
1e210 6f 61 64 69 6e 67 29 20 65 6e 64 73 20 75 70 20  oading) ends up 
1e220 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
1e230 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 0a 20 20  gument to the.  
1e240 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e      ** function.
1e250 20 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e    The expression
1e260 20 22 41 20 67 6c 6f 62 20 42 22 20 69 73 20 65   "A glob B" is e
1e270 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 0a 20 20  quivalent to .  
1e280 20 20 20 20 2a 2a 20 22 67 6c 6f 62 28 42 2c 41      ** "glob(B,A
1e290 29 2e 20 20 57 65 20 77 61 6e 74 20 74 6f 20 75  ).  We want to u
1e2a0 73 65 20 74 68 65 20 41 20 69 6e 20 22 41 20 67  se the A in "A g
1e2b0 6c 6f 62 20 42 22 20 74 6f 20 74 65 73 74 0a 20  lob B" to test. 
1e2c0 20 20 20 20 20 2a 2a 20 66 6f 72 20 66 75 6e 63       ** for func
1e2d0 74 69 6f 6e 20 6f 76 65 72 6c 6f 61 64 69 6e 67  tion overloading
1e2e0 2e 20 20 42 75 74 20 77 65 20 75 73 65 20 74 68  .  But we use th
1e2f0 65 20 42 20 74 65 72 6d 20 69 6e 20 22 67 6c 6f  e B term in "glo
1e300 62 28 42 2c 41 29 22 2e 0a 20 20 20 20 20 20 2a  b(B,A)"..      *
1e310 2f 0a 20 20 20 20 20 20 69 66 28 20 6e 46 61 72  /.      if( nFar
1e320 67 3e 3d 32 20 26 26 20 28 70 45 78 70 72 2d 3e  g>=2 && (pExpr->
1e330 66 6c 61 67 73 20 26 20 45 50 5f 49 6e 66 69 78  flags & EP_Infix
1e340 46 75 6e 63 29 20 29 7b 0a 20 20 20 20 20 20 20  Func) ){.       
1e350 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33 56   pDef = sqlite3V
1e360 74 61 62 4f 76 65 72 6c 6f 61 64 46 75 6e 63 74  tabOverloadFunct
1e370 69 6f 6e 28 64 62 2c 20 70 44 65 66 2c 20 6e 46  ion(db, pDef, nF
1e380 61 72 67 2c 20 70 46 61 72 67 2d 3e 61 5b 31 5d  arg, pFarg->a[1]
1e390 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d  .pExpr);.      }
1e3a0 65 6c 73 65 20 69 66 28 20 6e 46 61 72 67 3e 30  else if( nFarg>0
1e3b0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65 66   ){.        pDef
1e3c0 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62 4f 76   = sqlite3VtabOv
1e3d0 65 72 6c 6f 61 64 46 75 6e 63 74 69 6f 6e 28 64  erloadFunction(d
1e3e0 62 2c 20 70 44 65 66 2c 20 6e 46 61 72 67 2c 20  b, pDef, nFarg, 
1e3f0 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70  pFarg->a[0].pExp
1e400 72 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  r);.      }.#end
1e410 69 66 0a 20 20 20 20 20 20 69 66 28 20 70 44 65  if.      if( pDe
1e420 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53  f->funcFlags & S
1e430 51 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43  QLITE_FUNC_NEEDC
1e440 4f 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 69  OLL ){.        i
1e450 66 28 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c  f( !pColl ) pCol
1e460 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c  l = db->pDfltCol
1e470 6c 3b 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69  l; .        sqli
1e480 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
1e490 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20 30 2c 20   OP_CollSeq, 0, 
1e4a0 30 2c 20 30 2c 20 28 63 68 61 72 20 2a 29 70 43  0, 0, (char *)pC
1e4b0 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29  oll, P4_COLLSEQ)
1e4c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1e4d0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1e4e0 34 28 76 2c 20 4f 50 5f 46 75 6e 63 74 69 6f 6e  4(v, OP_Function
1e4f0 30 2c 20 63 6f 6e 73 74 4d 61 73 6b 2c 20 72 31  0, constMask, r1
1e500 2c 20 74 61 72 67 65 74 2c 0a 20 20 20 20 20 20  , target,.      
1e510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e520 20 20 28 63 68 61 72 2a 29 70 44 65 66 2c 20 50    (char*)pDef, P
1e530 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 20 20  4_FUNCDEF);.    
1e540 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
1e550 6e 67 65 50 35 28 76 2c 20 28 75 38 29 6e 46 61  ngeP5(v, (u8)nFa
1e560 72 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  rg);.      if( n
1e570 46 61 72 67 20 26 26 20 63 6f 6e 73 74 4d 61 73  Farg && constMas
1e580 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  k==0 ){.        
1e590 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
1e5a0 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
1e5b0 72 31 2c 20 6e 46 61 72 67 29 3b 0a 20 20 20 20  r1, nFarg);.    
1e5c0 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
1e5d0 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
1e5e0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
1e5f0 45 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ERY.    case TK_
1e600 45 58 49 53 54 53 3a 0a 20 20 20 20 63 61 73 65  EXISTS:.    case
1e610 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20   TK_SELECT: {.  
1e620 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20      int nCol;.  
1e630 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
1e640 3d 3d 54 4b 5f 45 58 49 53 54 53 20 29 3b 0a 20  ==TK_EXISTS );. 
1e650 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
1e660 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a  p==TK_SELECT );.
1e670 20 20 20 20 20 20 69 66 28 20 6f 70 3d 3d 54 4b        if( op==TK
1e680 5f 53 45 4c 45 43 54 20 26 26 20 28 6e 43 6f 6c  _SELECT && (nCol
1e690 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c   = pExpr->x.pSel
1e6a0 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  ect->pEList->nEx
1e6b0 70 72 29 21 3d 31 20 29 7b 0a 20 20 20 20 20 20  pr)!=1 ){.      
1e6c0 20 20 73 71 6c 69 74 65 33 53 75 62 73 65 6c 65    sqlite3Subsele
1e6d0 63 74 45 72 72 6f 72 28 70 50 61 72 73 65 2c 20  ctError(pParse, 
1e6e0 6e 43 6f 6c 2c 20 31 29 3b 0a 20 20 20 20 20 20  nCol, 1);.      
1e6f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
1e700 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33 43 6f  nReg = sqlite3Co
1e710 64 65 53 75 62 73 65 6c 65 63 74 28 70 50 61 72  deSubselect(pPar
1e720 73 65 2c 20 70 45 78 70 72 2c 20 30 2c 20 30 29  se, pExpr, 0, 0)
1e730 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1e740 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1e750 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 5f   case TK_SELECT_
1e760 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20  COLUMN: {.      
1e770 69 66 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  if( pExpr->pLeft
1e780 2d 3e 69 54 61 62 6c 65 3d 3d 30 20 29 7b 0a 20  ->iTable==0 ){. 
1e790 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 4c         pExpr->pL
1e7a0 65 66 74 2d 3e 69 54 61 62 6c 65 20 3d 20 73 71  eft->iTable = sq
1e7b0 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65  lite3CodeSubsele
1e7c0 63 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ct(pParse, pExpr
1e7d0 2d 3e 70 4c 65 66 74 2c 20 30 2c 20 30 29 3b 0a  ->pLeft, 0, 0);.
1e7e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 6e        }.      in
1e7f0 52 65 67 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65  Reg = pExpr->pLe
1e800 66 74 2d 3e 69 54 61 62 6c 65 20 2b 20 70 45 78  ft->iTable + pEx
1e810 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20  pr->iColumn;.   
1e820 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1e830 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20      case TK_IN: 
1e840 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 65 73 74  {.      int dest
1e850 49 66 46 61 6c 73 65 20 3d 20 73 71 6c 69 74 65  IfFalse = sqlite
1e860 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
1e870 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 64 65 73  );.      int des
1e880 74 49 66 4e 75 6c 6c 20 3d 20 73 71 6c 69 74 65  tIfNull = sqlite
1e890 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
1e8a0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1e8b0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1e8c0 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61 72 67 65 74  _Null, 0, target
1e8d0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1e8e0 45 78 70 72 43 6f 64 65 49 4e 28 70 50 61 72 73  ExprCodeIN(pPars
1e8f0 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74 49 66  e, pExpr, destIf
1e900 46 61 6c 73 65 2c 20 64 65 73 74 49 66 4e 75 6c  False, destIfNul
1e910 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  l);.      sqlite
1e920 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1e930 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 74 61  P_Integer, 1, ta
1e940 72 67 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  rget);.      sql
1e950 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
1e960 61 62 65 6c 28 76 2c 20 64 65 73 74 49 66 46 61  abel(v, destIfFa
1e970 6c 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  lse);.      sqli
1e980 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1e990 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 74 61 72 67   OP_AddImm, targ
1e9a0 65 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  et, 0);.      sq
1e9b0 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
1e9c0 4c 61 62 65 6c 28 76 2c 20 64 65 73 74 49 66 4e  Label(v, destIfN
1e9d0 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ull);.      brea
1e9e0 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20  k;.    }.#endif 
1e9f0 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  /* SQLITE_OMIT_S
1ea00 55 42 51 55 45 52 59 20 2a 2f 0a 0a 0a 20 20 20  UBQUERY */...   
1ea10 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 20 20 78 20   /*.    **    x 
1ea20 42 45 54 57 45 45 4e 20 79 20 41 4e 44 20 7a 0a  BETWEEN y AND z.
1ea30 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
1ea40 69 73 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74  is is equivalent
1ea50 20 74 6f 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a   to.    **.    *
1ea60 2a 20 20 20 20 78 3e 3d 79 20 41 4e 44 20 78 3c  *    x>=y AND x<
1ea70 3d 7a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  =z.    **.    **
1ea80 20 58 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20   X is stored in 
1ea90 70 45 78 70 72 2d 3e 70 4c 65 66 74 2e 0a 20 20  pExpr->pLeft..  
1eaa0 20 20 2a 2a 20 59 20 69 73 20 73 74 6f 72 65 64    ** Y is stored
1eab0 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 69 73 74   in pExpr->pList
1eac0 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2e 0a 20 20  ->a[0].pExpr..  
1ead0 20 20 2a 2a 20 5a 20 69 73 20 73 74 6f 72 65 64    ** Z is stored
1eae0 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 69 73 74   in pExpr->pList
1eaf0 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 2e 0a 20 20  ->a[1].pExpr..  
1eb00 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b    */.    case TK
1eb10 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20  _BETWEEN: {.    
1eb20 20 20 65 78 70 72 43 6f 64 65 42 65 74 77 65 65    exprCodeBetwee
1eb30 6e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  n(pParse, pExpr,
1eb40 20 74 61 72 67 65 74 2c 20 30 2c 20 30 29 3b 0a   target, 0, 0);.
1eb50 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1eb60 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53   }.    case TK_S
1eb70 50 41 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  PAN:.    case TK
1eb80 5f 43 4f 4c 4c 41 54 45 3a 20 0a 20 20 20 20 63  _COLLATE: .    c
1eb90 61 73 65 20 54 4b 5f 55 50 4c 55 53 3a 20 7b 0a  ase TK_UPLUS: {.
1eba0 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71        inReg = sq
1ebb0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72  lite3ExprCodeTar
1ebc0 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 78 70  get(pParse, pExp
1ebd0 72 2d 3e 70 4c 65 66 74 2c 20 74 61 72 67 65 74  r->pLeft, target
1ebe0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1ebf0 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20      }..    case 
1ec00 54 4b 5f 54 52 49 47 47 45 52 3a 20 7b 0a 20 20  TK_TRIGGER: {.  
1ec10 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 70      /* If the op
1ec20 63 6f 64 65 20 69 73 20 54 4b 5f 54 52 49 47 47  code is TK_TRIGG
1ec30 45 52 2c 20 74 68 65 6e 20 74 68 65 20 65 78 70  ER, then the exp
1ec40 72 65 73 73 69 6f 6e 20 69 73 20 61 20 72 65 66  ression is a ref
1ec50 65 72 65 6e 63 65 0a 20 20 20 20 20 20 2a 2a 20  erence.      ** 
1ec60 74 6f 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74  to a column in t
1ec70 68 65 20 6e 65 77 2e 2a 20 6f 72 20 6f 6c 64 2e  he new.* or old.
1ec80 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 73 20  * pseudo-tables 
1ec90 61 76 61 69 6c 61 62 6c 65 20 74 6f 0a 20 20 20  available to.   
1eca0 20 20 20 2a 2a 20 74 72 69 67 67 65 72 20 70 72     ** trigger pr
1ecb0 6f 67 72 61 6d 73 2e 20 49 6e 20 74 68 69 73 20  ograms. In this 
1ecc0 63 61 73 65 20 45 78 70 72 2e 69 54 61 62 6c 65  case Expr.iTable
1ecd0 20 69 73 20 73 65 74 20 74 6f 20 31 20 66 6f 72   is set to 1 for
1ece0 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6e 65   the.      ** ne
1ecf0 77 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65  w.* pseudo-table
1ed00 2c 20 6f 72 20 30 20 66 6f 72 20 74 68 65 20 6f  , or 0 for the o
1ed10 6c 64 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c  ld.* pseudo-tabl
1ed20 65 2e 20 45 78 70 72 2e 69 43 6f 6c 75 6d 6e 0a  e. Expr.iColumn.
1ed30 20 20 20 20 20 20 2a 2a 20 69 73 20 73 65 74 20        ** is set 
1ed40 74 6f 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6f 66  to the column of
1ed50 20 74 68 65 20 70 73 65 75 64 6f 2d 74 61 62 6c   the pseudo-tabl
1ed60 65 20 74 6f 20 72 65 61 64 2c 20 6f 72 20 74 6f  e to read, or to
1ed70 20 2d 31 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20   -1 to.      ** 
1ed80 72 65 61 64 20 74 68 65 20 72 6f 77 69 64 20 66  read the rowid f
1ed90 69 65 6c 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  ield..      **. 
1eda0 20 20 20 20 20 2a 2a 20 54 68 65 20 65 78 70 72       ** The expr
1edb0 65 73 73 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d  ession is implem
1edc0 65 6e 74 65 64 20 75 73 69 6e 67 20 61 6e 20 4f  ented using an O
1edd0 50 5f 50 61 72 61 6d 20 6f 70 63 6f 64 65 2e 20  P_Param opcode. 
1ede0 54 68 65 20 70 31 0a 20 20 20 20 20 20 2a 2a 20  The p1.      ** 
1edf0 70 61 72 61 6d 65 74 65 72 20 69 73 20 73 65 74  parameter is set
1ee00 20 74 6f 20 30 20 66 6f 72 20 61 6e 20 6f 6c 64   to 0 for an old
1ee10 2e 72 6f 77 69 64 20 72 65 66 65 72 65 6e 63 65  .rowid reference
1ee20 2c 20 6f 72 20 74 6f 20 28 69 2b 31 29 0a 20 20  , or to (i+1).  
1ee30 20 20 20 20 2a 2a 20 74 6f 20 72 65 66 65 72 65      ** to refere
1ee40 6e 63 65 20 61 6e 6f 74 68 65 72 20 63 6f 6c 75  nce another colu
1ee50 6d 6e 20 6f 66 20 74 68 65 20 6f 6c 64 2e 2a 20  mn of the old.* 
1ee60 70 73 65 75 64 6f 2d 74 61 62 6c 65 2c 20 77 68  pseudo-table, wh
1ee70 65 72 65 20 0a 20 20 20 20 20 20 2a 2a 20 69 20  ere .      ** i 
1ee80 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  is the index of 
1ee90 74 68 65 20 63 6f 6c 75 6d 6e 2e 20 46 6f 72 20  the column. For 
1eea0 61 20 6e 65 77 2e 72 6f 77 69 64 20 72 65 66 65  a new.rowid refe
1eeb0 72 65 6e 63 65 2c 20 70 31 20 69 73 0a 20 20 20  rence, p1 is.   
1eec0 20 20 20 2a 2a 20 73 65 74 20 74 6f 20 28 6e 2b     ** set to (n+
1eed0 31 29 2c 20 77 68 65 72 65 20 6e 20 69 73 20 74  1), where n is t
1eee0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  he number of col
1eef0 75 6d 6e 73 20 69 6e 20 65 61 63 68 20 70 73 65  umns in each pse
1ef00 75 64 6f 2d 74 61 62 6c 65 2e 0a 20 20 20 20 20  udo-table..     
1ef10 20 2a 2a 20 46 6f 72 20 61 20 72 65 66 65 72 65   ** For a refere
1ef20 6e 63 65 20 74 6f 20 61 6e 79 20 6f 74 68 65 72  nce to any other
1ef30 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 6e   column in the n
1ef40 65 77 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c  ew.* pseudo-tabl
1ef50 65 2c 20 70 31 0a 20 20 20 20 20 20 2a 2a 20 69  e, p1.      ** i
1ef60 73 20 73 65 74 20 74 6f 20 28 6e 2b 32 2b 69 29  s set to (n+2+i)
1ef70 2c 20 77 68 65 72 65 20 6e 20 61 6e 64 20 69 20  , where n and i 
1ef80 61 72 65 20 61 73 20 64 65 66 69 6e 65 64 20 70  are as defined p
1ef90 72 65 76 69 6f 75 73 6c 79 2e 20 46 6f 72 0a 20  reviously. For. 
1efa0 20 20 20 20 20 2a 2a 20 65 78 61 6d 70 6c 65 2c       ** example,
1efb0 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 6f 6e   if the table on
1efc0 20 77 68 69 63 68 20 74 72 69 67 67 65 72 73 20   which triggers 
1efd0 61 72 65 20 62 65 69 6e 67 20 66 69 72 65 64 20  are being fired 
1efe0 69 73 0a 20 20 20 20 20 20 2a 2a 20 64 65 63 6c  is.      ** decl
1eff0 61 72 65 64 20 61 73 3a 0a 20 20 20 20 20 20 2a  ared as:.      *
1f000 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 43 52 45  *.      **   CRE
1f010 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20  ATE TABLE t1(a, 
1f020 62 29 3b 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  b);.      **.   
1f030 20 20 20 2a 2a 20 54 68 65 6e 20 70 31 20 69 73     ** Then p1 is
1f040 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20   interpreted as 
1f050 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20 20 20 2a  follows:.      *
1f060 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 70 31 3d  *.      **   p1=
1f070 3d 30 20 20 20 2d 3e 20 20 20 20 6f 6c 64 2e 72  =0   ->    old.r
1f080 6f 77 69 64 20 20 20 20 20 70 31 3d 3d 33 20 20  owid     p1==3  
1f090 20 2d 3e 20 20 20 20 6e 65 77 2e 72 6f 77 69 64   ->    new.rowid
1f0a0 0a 20 20 20 20 20 20 2a 2a 20 20 20 70 31 3d 3d  .      **   p1==
1f0b0 31 20 20 20 2d 3e 20 20 20 20 6f 6c 64 2e 61 20  1   ->    old.a 
1f0c0 20 20 20 20 20 20 20 20 70 31 3d 3d 34 20 20 20          p1==4   
1f0d0 2d 3e 20 20 20 20 6e 65 77 2e 61 0a 20 20 20 20  ->    new.a.    
1f0e0 20 20 2a 2a 20 20 20 70 31 3d 3d 32 20 20 20 2d    **   p1==2   -
1f0f0 3e 20 20 20 20 6f 6c 64 2e 62 20 20 20 20 20 20  >    old.b      
1f100 20 20 20 70 31 3d 3d 35 20 20 20 2d 3e 20 20 20     p1==5   ->   
1f110 20 6e 65 77 2e 62 20 20 20 20 20 20 20 0a 20 20   new.b       .  
1f120 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 54 61 62      */.      Tab
1f130 6c 65 20 2a 70 54 61 62 20 3d 20 70 45 78 70 72  le *pTab = pExpr
1f140 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 69 6e  ->pTab;.      in
1f150 74 20 70 31 20 3d 20 70 45 78 70 72 2d 3e 69 54  t p1 = pExpr->iT
1f160 61 62 6c 65 20 2a 20 28 70 54 61 62 2d 3e 6e 43  able * (pTab->nC
1f170 6f 6c 2b 31 29 20 2b 20 31 20 2b 20 70 45 78 70  ol+1) + 1 + pExp
1f180 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 0a 20 20 20  r->iColumn;..   
1f190 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
1f1a0 2d 3e 69 54 61 62 6c 65 3d 3d 30 20 7c 7c 20 70  ->iTable==0 || p
1f1b0 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 31 20  Expr->iTable==1 
1f1c0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1f1d0 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e   pExpr->iColumn>
1f1e0 3d 2d 31 20 26 26 20 70 45 78 70 72 2d 3e 69 43  =-1 && pExpr->iC
1f1f0 6f 6c 75 6d 6e 3c 70 54 61 62 2d 3e 6e 43 6f 6c  olumn<pTab->nCol
1f200 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1f210 28 20 70 54 61 62 2d 3e 69 50 4b 65 79 3c 30 20  ( pTab->iPKey<0 
1f220 7c 7c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  || pExpr->iColum
1f230 6e 21 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20 29  n!=pTab->iPKey )
1f240 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1f250 70 31 3e 3d 30 20 26 26 20 70 31 3c 28 70 54 61  p1>=0 && p1<(pTa
1f260 62 2d 3e 6e 43 6f 6c 2a 32 2b 32 29 20 29 3b 0a  b->nCol*2+2) );.
1f270 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1f280 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 50  beAddOp2(v, OP_P
1f290 61 72 61 6d 2c 20 70 31 2c 20 74 61 72 67 65 74  aram, p1, target
1f2a0 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
1f2b0 6d 65 6e 74 28 28 76 2c 20 22 25 73 2e 25 73 20  ment((v, "%s.%s 
1f2c0 2d 3e 20 24 25 64 22 2c 0a 20 20 20 20 20 20 20  -> $%d",.       
1f2d0 20 28 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20   (pExpr->iTable 
1f2e0 3f 20 22 6e 65 77 22 20 3a 20 22 6f 6c 64 22 29  ? "new" : "old")
1f2f0 2c 0a 20 20 20 20 20 20 20 20 28 70 45 78 70 72  ,.        (pExpr
1f300 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 3f 20 22 72  ->iColumn<0 ? "r
1f310 6f 77 69 64 22 20 3a 20 70 45 78 70 72 2d 3e 70  owid" : pExpr->p
1f320 54 61 62 2d 3e 61 43 6f 6c 5b 70 45 78 70 72 2d  Tab->aCol[pExpr-
1f330 3e 69 43 6f 6c 75 6d 6e 5d 2e 7a 4e 61 6d 65 29  >iColumn].zName)
1f340 2c 0a 20 20 20 20 20 20 20 20 74 61 72 67 65 74  ,.        target
1f350 0a 20 20 20 20 20 20 29 29 3b 0a 0a 23 69 66 6e  .      ));..#ifn
1f360 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1f370 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20  FLOATING_POINT. 
1f380 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63       /* If the c
1f390 6f 6c 75 6d 6e 20 68 61 73 20 52 45 41 4c 20 61  olumn has REAL a
1f3a0 66 66 69 6e 69 74 79 2c 20 69 74 20 6d 61 79 20  ffinity, it may 
1f3b0 63 75 72 72 65 6e 74 6c 79 20 62 65 20 73 74 6f  currently be sto
1f3c0 72 65 64 20 61 73 20 61 6e 0a 20 20 20 20 20 20  red as an.      
1f3d0 2a 2a 20 69 6e 74 65 67 65 72 2e 20 55 73 65 20  ** integer. Use 
1f3e0 4f 50 5f 52 65 61 6c 41 66 66 69 6e 69 74 79 20  OP_RealAffinity 
1f3f0 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 69 74 20  to make sure it 
1f400 69 73 20 72 65 61 6c 6c 79 20 72 65 61 6c 2e 0a  is really real..
1f410 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
1f420 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
1f430 2d 36 30 39 38 35 2d 35 37 36 36 32 20 53 51 4c  -60985-57662 SQL
1f440 69 74 65 20 77 69 6c 6c 20 63 6f 6e 76 65 72 74  ite will convert
1f450 20 74 68 65 20 76 61 6c 75 65 20 62 61 63 6b 20   the value back 
1f460 74 6f 0a 20 20 20 20 20 20 2a 2a 20 66 6c 6f 61  to.      ** floa
1f470 74 69 6e 67 20 70 6f 69 6e 74 20 77 68 65 6e 20  ting point when 
1f480 65 78 74 72 61 63 74 69 6e 67 20 69 74 20 66 72  extracting it fr
1f490 6f 6d 20 74 68 65 20 72 65 63 6f 72 64 2e 20 20  om the record.  
1f4a0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 45 78  */.      if( pEx
1f4b0 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20 0a  pr->iColumn>=0 .
1f4c0 20 20 20 20 20 20 20 26 26 20 70 54 61 62 2d 3e         && pTab->
1f4d0 61 43 6f 6c 5b 70 45 78 70 72 2d 3e 69 43 6f 6c  aCol[pExpr->iCol
1f4e0 75 6d 6e 5d 2e 61 66 66 69 6e 69 74 79 3d 3d 53  umn].affinity==S
1f4f0 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 0a 20  QLITE_AFF_REAL. 
1f500 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
1f510 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1f520 31 28 76 2c 20 4f 50 5f 52 65 61 6c 41 66 66 69  1(v, OP_RealAffi
1f530 6e 69 74 79 2c 20 74 61 72 67 65 74 29 3b 0a 20  nity, target);. 
1f540 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
1f550 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1f560 0a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 56 45  ..    case TK_VE
1f570 43 54 4f 52 3a 20 7b 0a 20 20 20 20 20 20 73 71  CTOR: {.      sq
1f580 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
1f590 61 72 73 65 2c 20 22 69 6e 76 61 6c 69 64 20 75  arse, "invalid u
1f5a0 73 65 20 6f 66 20 72 6f 77 20 76 61 6c 75 65 22  se of row value"
1f5b0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1f5c0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20      }..    /*.  
1f5d0 20 20 2a 2a 20 46 6f 72 6d 20 41 3a 0a 20 20 20    ** Form A:.   
1f5e0 20 2a 2a 20 20 20 43 41 53 45 20 78 20 57 48 45   **   CASE x WHE
1f5f0 4e 20 65 31 20 54 48 45 4e 20 72 31 20 57 48 45  N e1 THEN r1 WHE
1f600 4e 20 65 32 20 54 48 45 4e 20 72 32 20 2e 2e 2e  N e2 THEN r2 ...
1f610 20 57 48 45 4e 20 65 4e 20 54 48 45 4e 20 72 4e   WHEN eN THEN rN
1f620 20 45 4c 53 45 20 79 20 45 4e 44 0a 20 20 20 20   ELSE y END.    
1f630 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 6d 20 42  **.    ** Form B
1f640 3a 0a 20 20 20 20 2a 2a 20 20 20 43 41 53 45 20  :.    **   CASE 
1f650 57 48 45 4e 20 65 31 20 54 48 45 4e 20 72 31 20  WHEN e1 THEN r1 
1f660 57 48 45 4e 20 65 32 20 54 48 45 4e 20 72 32 20  WHEN e2 THEN r2 
1f670 2e 2e 2e 20 57 48 45 4e 20 65 4e 20 54 48 45 4e  ... WHEN eN THEN
1f680 20 72 4e 20 45 4c 53 45 20 79 20 45 4e 44 0a 20   rN ELSE y END. 
1f690 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 72     **.    ** For
1f6a0 6d 20 41 20 69 73 20 63 61 6e 20 62 65 20 74 72  m A is can be tr
1f6b0 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74 6f 20 74  ansformed into t
1f6c0 68 65 20 65 71 75 69 76 61 6c 65 6e 74 20 66 6f  he equivalent fo
1f6d0 72 6d 20 42 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  rm B as follows:
1f6e0 0a 20 20 20 20 2a 2a 20 20 20 43 41 53 45 20 57  .    **   CASE W
1f6f0 48 45 4e 20 78 3d 65 31 20 54 48 45 4e 20 72 31  HEN x=e1 THEN r1
1f700 20 57 48 45 4e 20 78 3d 65 32 20 54 48 45 4e 20   WHEN x=e2 THEN 
1f710 72 32 20 2e 2e 2e 0a 20 20 20 20 2a 2a 20 20 20  r2 ....    **   
1f720 20 20 20 20 20 57 48 45 4e 20 78 3d 65 4e 20 54       WHEN x=eN T
1f730 48 45 4e 20 72 4e 20 45 4c 53 45 20 79 20 45 4e  HEN rN ELSE y EN
1f740 44 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  D.    **.    ** 
1f750 58 20 28 69 66 20 69 74 20 65 78 69 73 74 73 29  X (if it exists)
1f760 20 69 73 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c   is in pExpr->pL
1f770 65 66 74 2e 0a 20 20 20 20 2a 2a 20 59 20 69 73  eft..    ** Y is
1f780 20 69 6e 20 74 68 65 20 6c 61 73 74 20 65 6c 65   in the last ele
1f790 6d 65 6e 74 20 6f 66 20 70 45 78 70 72 2d 3e 78  ment of pExpr->x
1f7a0 2e 70 4c 69 73 74 20 69 66 20 70 45 78 70 72 2d  .pList if pExpr-
1f7b0 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20  >x.pList->nExpr 
1f7c0 69 73 0a 20 20 20 20 2a 2a 20 6f 64 64 2e 20 20  is.    ** odd.  
1f7d0 54 68 65 20 59 20 69 73 20 61 6c 73 6f 20 6f 70  The Y is also op
1f7e0 74 69 6f 6e 61 6c 2e 20 20 49 66 20 74 68 65 20  tional.  If the 
1f7f0 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e  number of elemen
1f800 74 73 20 69 6e 20 78 2e 70 4c 69 73 74 0a 20 20  ts in x.pList.  
1f810 20 20 2a 2a 20 69 73 20 65 76 65 6e 2c 20 74 68    ** is even, th
1f820 65 6e 20 59 20 69 73 20 6f 6d 69 74 74 65 64 20  en Y is omitted 
1f830 61 6e 64 20 74 68 65 20 22 6f 74 68 65 72 77 69  and the "otherwi
1f840 73 65 22 20 72 65 73 75 6c 74 20 69 73 20 4e 55  se" result is NU
1f850 4c 4c 2e 0a 20 20 20 20 2a 2a 20 45 69 20 69 73  LL..    ** Ei is
1f860 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 69 73 74   in pExpr->pList
1f870 2d 3e 61 5b 69 2a 32 5d 20 61 6e 64 20 52 69 20  ->a[i*2] and Ri 
1f880 69 73 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d  is pExpr->pList-
1f890 3e 61 5b 69 2a 32 2b 31 5d 2e 0a 20 20 20 20 2a  >a[i*2+1]..    *
1f8a0 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 65 73  *.    ** The res
1f8b0 75 6c 74 20 6f 66 20 74 68 65 20 65 78 70 72 65  ult of the expre
1f8c0 73 73 69 6f 6e 20 69 73 20 74 68 65 20 52 69 20  ssion is the Ri 
1f8d0 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 6d 61  for the first ma
1f8e0 74 63 68 69 6e 67 20 45 69 2c 0a 20 20 20 20 2a  tching Ei,.    *
1f8f0 2a 20 6f 72 20 69 66 20 74 68 65 72 65 20 69 73  * or if there is
1f900 20 6e 6f 20 6d 61 74 63 68 69 6e 67 20 45 69 2c   no matching Ei,
1f910 20 74 68 65 20 45 4c 53 45 20 74 65 72 6d 20 59   the ELSE term Y
1f920 2c 20 6f 72 20 69 66 20 74 68 65 72 65 20 69 73  , or if there is
1f930 0a 20 20 20 20 2a 2a 20 6e 6f 20 45 4c 53 45 20  .    ** no ELSE 
1f940 74 65 72 6d 2c 20 4e 55 4c 4c 2e 0a 20 20 20 20  term, NULL..    
1f950 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20  */.    default: 
1f960 61 73 73 65 72 74 28 20 6f 70 3d 3d 54 4b 5f 43  assert( op==TK_C
1f970 41 53 45 20 29 3b 20 7b 0a 20 20 20 20 20 20 69  ASE ); {.      i
1f980 6e 74 20 65 6e 64 4c 61 62 65 6c 3b 20 20 20 20  nt endLabel;    
1f990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f9a0 20 2f 2a 20 47 4f 54 4f 20 6c 61 62 65 6c 20 66   /* GOTO label f
1f9b0 6f 72 20 65 6e 64 20 6f 66 20 43 41 53 45 20 73  or end of CASE s
1f9c0 74 6d 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  tmt */.      int
1f9d0 20 6e 65 78 74 43 61 73 65 3b 20 20 20 20 20 20   nextCase;      
1f9e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1f9f0 2a 20 47 4f 54 4f 20 6c 61 62 65 6c 20 66 6f 72  * GOTO label for
1fa00 20 6e 65 78 74 20 57 48 45 4e 20 63 6c 61 75 73   next WHEN claus
1fa10 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e  e */.      int n
1fa20 45 78 70 72 3b 20 20 20 20 20 20 20 20 20 20 20  Expr;           
1fa30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1fa40 32 78 20 6e 75 6d 62 65 72 20 6f 66 20 57 48 45  2x number of WHE
1fa50 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20  N terms */.     
1fa60 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
1fa70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fa80 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
1fa90 65 72 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72  er */.      Expr
1faa0 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 20 20 20  List *pEList;   
1fab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1fac0 20 4c 69 73 74 20 6f 66 20 57 48 45 4e 20 74 65   List of WHEN te
1fad0 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20 73 74 72  rms */.      str
1fae0 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
1faf0 6d 20 2a 61 4c 69 73 74 65 6c 65 6d 3b 20 20 2f  m *aListelem;  /
1fb00 2a 20 41 72 72 61 79 20 6f 66 20 57 48 45 4e 20  * Array of WHEN 
1fb10 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20 45  terms */.      E
1fb20 78 70 72 20 6f 70 43 6f 6d 70 61 72 65 3b 20 20  xpr opCompare;  
1fb30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb40 20 2f 2a 20 54 68 65 20 58 3d 3d 45 69 20 65 78   /* The X==Ei ex
1fb50 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20  pression */.    
1fb60 20 20 45 78 70 72 20 2a 70 58 3b 20 20 20 20 20    Expr *pX;     
1fb70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb80 20 20 20 20 2f 2a 20 54 68 65 20 58 20 65 78 70      /* The X exp
1fb90 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  ression */.     
1fba0 20 45 78 70 72 20 2a 70 54 65 73 74 20 3d 20 30   Expr *pTest = 0
1fbb0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1fbc0 20 20 20 2f 2a 20 58 3d 3d 45 69 20 28 66 6f 72     /* X==Ei (for
1fbd0 6d 20 41 29 20 6f 72 20 6a 75 73 74 20 45 69 20  m A) or just Ei 
1fbe0 28 66 6f 72 6d 20 42 29 20 2a 2f 0a 20 20 20 20  (form B) */.    
1fbf0 20 20 56 56 41 5f 4f 4e 4c 59 28 20 69 6e 74 20    VVA_ONLY( int 
1fc00 69 43 61 63 68 65 4c 65 76 65 6c 20 3d 20 70 50  iCacheLevel = pP
1fc10 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65  arse->iCacheLeve
1fc20 6c 3b 20 29 0a 0a 20 20 20 20 20 20 61 73 73 65  l; )..      asse
1fc30 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
1fc40 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78  erty(pExpr, EP_x
1fc50 49 73 53 65 6c 65 63 74 29 20 26 26 20 70 45 78  IsSelect) && pEx
1fc60 70 72 2d 3e 78 2e 70 4c 69 73 74 20 29 3b 0a 20  pr->x.pList );. 
1fc70 20 20 20 20 20 61 73 73 65 72 74 28 70 45 78 70       assert(pExp
1fc80 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70  r->x.pList->nExp
1fc90 72 20 3e 20 30 29 3b 0a 20 20 20 20 20 20 70 45  r > 0);.      pE
1fca0 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e  List = pExpr->x.
1fcb0 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 61 4c 69  pList;.      aLi
1fcc0 73 74 65 6c 65 6d 20 3d 20 70 45 4c 69 73 74 2d  stelem = pEList-
1fcd0 3e 61 3b 0a 20 20 20 20 20 20 6e 45 78 70 72 20  >a;.      nExpr 
1fce0 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  = pEList->nExpr;
1fcf0 0a 20 20 20 20 20 20 65 6e 64 4c 61 62 65 6c 20  .      endLabel 
1fd00 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
1fd10 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
1fd20 20 69 66 28 20 28 70 58 20 3d 20 70 45 78 70 72   if( (pX = pExpr
1fd30 2d 3e 70 4c 65 66 74 29 21 3d 30 20 29 7b 0a 20  ->pLeft)!=0 ){. 
1fd40 20 20 20 20 20 20 20 74 65 6d 70 58 20 3d 20 2a         tempX = *
1fd50 70 58 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  pX;.        test
1fd60 63 61 73 65 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b  case( pX->op==TK
1fd70 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20  _COLUMN );.     
1fd80 20 20 20 65 78 70 72 54 6f 52 65 67 69 73 74 65     exprToRegiste
1fd90 72 28 26 74 65 6d 70 58 2c 20 73 71 6c 69 74 65  r(&tempX, sqlite
1fda0 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
1fdb0 61 72 73 65 2c 20 70 58 2c 20 26 72 65 67 46 72  arse, pX, &regFr
1fdc0 65 65 31 29 29 3b 0a 20 20 20 20 20 20 20 20 74  ee1));.        t
1fdd0 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
1fde0 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  1==0 );.        
1fdf0 6f 70 43 6f 6d 70 61 72 65 2e 6f 70 20 3d 20 54  opCompare.op = T
1fe00 4b 5f 45 51 3b 0a 20 20 20 20 20 20 20 20 6f 70  K_EQ;.        op
1fe10 43 6f 6d 70 61 72 65 2e 70 4c 65 66 74 20 3d 20  Compare.pLeft = 
1fe20 26 74 65 6d 70 58 3b 0a 20 20 20 20 20 20 20 20  &tempX;.        
1fe30 70 54 65 73 74 20 3d 20 26 6f 70 43 6f 6d 70 61  pTest = &opCompa
1fe40 72 65 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54  re;.        /* T
1fe50 69 63 6b 65 74 20 62 33 35 31 64 39 35 66 39 63  icket b351d95f9c
1fe60 64 35 65 66 31 37 65 39 64 39 64 62 61 65 31 38  d5ef17e9d9dbae18
1fe70 66 35 63 61 38 36 31 31 31 39 30 30 30 31 3a 0a  f5ca8611190001:.
1fe80 20 20 20 20 20 20 20 20 2a 2a 20 54 68 65 20 76          ** The v
1fe90 61 6c 75 65 20 69 6e 20 72 65 67 46 72 65 65 31  alue in regFree1
1fea0 20 6d 69 67 68 74 20 67 65 74 20 53 43 6f 70 79   might get SCopy
1feb0 2d 65 64 20 69 6e 74 6f 20 74 68 65 20 66 69 6c  -ed into the fil
1fec0 65 20 72 65 73 75 6c 74 2e 0a 20 20 20 20 20 20  e result..      
1fed0 20 20 2a 2a 20 53 6f 20 6d 61 6b 65 20 73 75 72    ** So make sur
1fee0 65 20 74 68 61 74 20 74 68 65 20 72 65 67 46 72  e that the regFr
1fef0 65 65 31 20 72 65 67 69 73 74 65 72 20 69 73 20  ee1 register is 
1ff00 6e 6f 74 20 72 65 75 73 65 64 20 66 6f 72 20 6f  not reused for o
1ff10 74 68 65 72 0a 20 20 20 20 20 20 20 20 2a 2a 20  ther.        ** 
1ff20 70 75 72 70 6f 73 65 73 20 61 6e 64 20 70 6f 73  purposes and pos
1ff30 73 69 62 6c 79 20 6f 76 65 72 77 72 69 74 74 65  sibly overwritte
1ff40 6e 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72  n.  */.        r
1ff50 65 67 46 72 65 65 31 20 3d 20 30 3b 0a 20 20 20  egFree1 = 0;.   
1ff60 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69     }.      for(i
1ff70 3d 30 3b 20 69 3c 6e 45 78 70 72 2d 31 3b 20 69  =0; i<nExpr-1; i
1ff80 3d 69 2b 32 29 7b 0a 20 20 20 20 20 20 20 20 73  =i+2){.        s
1ff90 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
1ffa0 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20  ush(pParse);.   
1ffb0 20 20 20 20 20 69 66 28 20 70 58 20 29 7b 0a 20       if( pX ){. 
1ffc0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
1ffd0 20 70 54 65 73 74 21 3d 30 20 29 3b 0a 20 20 20   pTest!=0 );.   
1ffe0 20 20 20 20 20 20 20 6f 70 43 6f 6d 70 61 72 65         opCompare
1fff0 2e 70 52 69 67 68 74 20 3d 20 61 4c 69 73 74 65  .pRight = aListe
20000 6c 65 6d 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  lem[i].pExpr;.  
20010 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
20020 20 20 20 20 20 20 20 70 54 65 73 74 20 3d 20 61         pTest = a
20030 4c 69 73 74 65 6c 65 6d 5b 69 5d 2e 70 45 78 70  Listelem[i].pExp
20040 72 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  r;.        }.   
20050 20 20 20 20 20 6e 65 78 74 43 61 73 65 20 3d 20       nextCase = 
20060 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
20070 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20  abel(v);.       
20080 20 74 65 73 74 63 61 73 65 28 20 70 54 65 73 74   testcase( pTest
20090 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
200a0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
200b0 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
200c0 61 72 73 65 2c 20 70 54 65 73 74 2c 20 6e 65 78  arse, pTest, nex
200d0 74 43 61 73 65 2c 20 53 51 4c 49 54 45 5f 4a 55  tCase, SQLITE_JU
200e0 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  MPIFNULL);.     
200f0 20 20 20 74 65 73 74 63 61 73 65 28 20 61 4c 69     testcase( aLi
20100 73 74 65 6c 65 6d 5b 69 2b 31 5d 2e 70 45 78 70  stelem[i+1].pExp
20110 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op==TK_COLUMN
20120 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
20130 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
20140 73 65 2c 20 61 4c 69 73 74 65 6c 65 6d 5b 69 2b  se, aListelem[i+
20150 31 5d 2e 70 45 78 70 72 2c 20 74 61 72 67 65 74  1].pExpr, target
20160 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
20170 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 65 6e  e3VdbeGoto(v, en
20180 64 4c 61 62 65 6c 29 3b 0a 20 20 20 20 20 20 20  dLabel);.       
20190 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
201a0 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20  ePop(pParse);.  
201b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
201c0 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
201d0 20 6e 65 78 74 43 61 73 65 29 3b 0a 20 20 20 20   nextCase);.    
201e0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28 6e    }.      if( (n
201f0 45 78 70 72 26 31 29 21 3d 30 20 29 7b 0a 20 20  Expr&1)!=0 ){.  
20200 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
20210 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73  rCachePush(pPars
20220 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  e);.        sqli
20230 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
20240 73 65 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 6e 45  se, pEList->a[nE
20250 78 70 72 2d 31 5d 2e 70 45 78 70 72 2c 20 74 61  xpr-1].pExpr, ta
20260 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 73  rget);.        s
20270 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
20280 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  op(pParse);.    
20290 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
202a0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
202b0 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  p2(v, OP_Null, 0
202c0 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
202d0 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
202e0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
202f0 64 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72  d || pParse->nEr
20300 72 3e 30 20 0a 20 20 20 20 20 20 20 20 20 20 20  r>0 .           
20310 7c 7c 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68  || pParse->iCach
20320 65 4c 65 76 65 6c 3d 3d 69 43 61 63 68 65 4c 65  eLevel==iCacheLe
20330 76 65 6c 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  vel );.      sql
20340 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
20350 61 62 65 6c 28 76 2c 20 65 6e 64 4c 61 62 65 6c  abel(v, endLabel
20360 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
20370 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
20380 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45  LITE_OMIT_TRIGGE
20390 52 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 41  R.    case TK_RA
203a0 49 53 45 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  ISE: {.      ass
203b0 65 72 74 28 20 70 45 78 70 72 2d 3e 61 66 66 69  ert( pExpr->affi
203c0 6e 69 74 79 3d 3d 4f 45 5f 52 6f 6c 6c 62 61 63  nity==OE_Rollbac
203d0 6b 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  k .           ||
203e0 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79   pExpr->affinity
203f0 3d 3d 4f 45 5f 41 62 6f 72 74 0a 20 20 20 20 20  ==OE_Abort.     
20400 20 20 20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e        || pExpr->
20410 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 46 61 69  affinity==OE_Fai
20420 6c 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  l.           || 
20430 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d  pExpr->affinity=
20440 3d 4f 45 5f 49 67 6e 6f 72 65 0a 20 20 20 20 20  =OE_Ignore.     
20450 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70   );.      if( !p
20460 50 61 72 73 65 2d 3e 70 54 72 69 67 67 65 72 54  Parse->pTriggerT
20470 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ab ){.        sq
20480 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
20490 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20  arse,.          
204a0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 52 41               "RA
204b0 49 53 45 28 29 20 6d 61 79 20 6f 6e 6c 79 20 62  ISE() may only b
204c0 65 20 75 73 65 64 20 77 69 74 68 69 6e 20 61 20  e used within a 
204d0 74 72 69 67 67 65 72 2d 70 72 6f 67 72 61 6d 22  trigger-program"
204e0 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
204f0 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 0;.      }.   
20500 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 61 66     if( pExpr->af
20510 66 69 6e 69 74 79 3d 3d 4f 45 5f 41 62 6f 72 74  finity==OE_Abort
20520 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
20530 74 65 33 4d 61 79 41 62 6f 72 74 28 70 50 61 72  te3MayAbort(pPar
20540 73 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  se);.      }.   
20550 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
20560 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
20570 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20  r, EP_IntValue) 
20580 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78  );.      if( pEx
20590 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45  pr->affinity==OE
205a0 5f 49 67 6e 6f 72 65 20 29 7b 0a 20 20 20 20 20  _Ignore ){.     
205b0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
205c0 64 4f 70 34 28 0a 20 20 20 20 20 20 20 20 20 20  dOp4(.          
205d0 20 20 76 2c 20 4f 50 5f 48 61 6c 74 2c 20 53 51    v, OP_Halt, SQ
205e0 4c 49 54 45 5f 4f 4b 2c 20 4f 45 5f 49 67 6e 6f  LITE_OK, OE_Igno
205f0 72 65 2c 20 30 2c 20 70 45 78 70 72 2d 3e 75 2e  re, 0, pExpr->u.
20600 7a 54 6f 6b 65 6e 2c 30 29 3b 0a 20 20 20 20 20  zToken,0);.     
20610 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
20620 76 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  v);.      }else{
20630 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
20640 48 61 6c 74 43 6f 6e 73 74 72 61 69 6e 74 28 70  HaltConstraint(p
20650 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 43 4f  Parse, SQLITE_CO
20660 4e 53 54 52 41 49 4e 54 5f 54 52 49 47 47 45 52  NSTRAINT_TRIGGER
20670 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
20680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20690 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 2c  pExpr->affinity,
206a0 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
206b0 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  , 0, 0);.      }
206c0 0a 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ..      break;. 
206d0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
206e0 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
206f0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
20700 72 65 67 46 72 65 65 31 29 3b 0a 20 20 73 71 6c  regFree1);.  sql
20710 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
20720 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72  eg(pParse, regFr
20730 65 65 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 69  ee2);.  return i
20740 6e 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  nReg;.}../*.** F
20750 61 63 74 6f 72 20 6f 75 74 20 74 68 65 20 63 6f  actor out the co
20760 64 65 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20  de of the given 
20770 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 69 6e  expression to in
20780 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 74 69 6d  itialization tim
20790 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
207a0 65 33 45 78 70 72 43 6f 64 65 41 74 49 6e 69 74  e3ExprCodeAtInit
207b0 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
207c0 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67  e,    /* Parsing
207d0 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
207e0 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20  pr *pExpr,      
207f0 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  /* The expressio
20800 6e 20 74 6f 20 63 6f 64 65 20 77 68 65 6e 20 74  n to code when t
20810 68 65 20 56 44 42 45 20 69 6e 69 74 69 61 6c 69  he VDBE initiali
20820 7a 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  zes */.  int reg
20830 44 65 73 74 2c 20 20 20 20 20 20 2f 2a 20 53 74  Dest,      /* St
20840 6f 72 65 20 74 68 65 20 76 61 6c 75 65 20 69 6e  ore the value in
20850 20 74 68 69 73 20 72 65 67 69 73 74 65 72 20 2a   this register *
20860 2f 0a 20 20 75 38 20 72 65 75 73 61 62 6c 65 20  /.  u8 reusable 
20870 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
20880 20 74 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e   this expression
20890 20 69 73 20 72 65 75 73 61 62 6c 65 20 2a 2f 0a   is reusable */.
208a0 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  ){.  ExprList *p
208b0 3b 0a 20 20 61 73 73 65 72 74 28 20 43 6f 6e 73  ;.  assert( Cons
208c0 74 46 61 63 74 6f 72 4f 6b 28 70 50 61 72 73 65  tFactorOk(pParse
208d0 29 20 29 3b 0a 20 20 70 20 3d 20 70 50 61 72 73  ) );.  p = pPars
208e0 65 2d 3e 70 43 6f 6e 73 74 45 78 70 72 3b 0a 20  e->pConstExpr;. 
208f0 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33   pExpr = sqlite3
20900 45 78 70 72 44 75 70 28 70 50 61 72 73 65 2d 3e  ExprDup(pParse->
20910 64 62 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20  db, pExpr, 0);. 
20920 20 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72   p = sqlite3Expr
20930 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73  ListAppend(pPars
20940 65 2c 20 70 2c 20 70 45 78 70 72 29 3b 0a 20 20  e, p, pExpr);.  
20950 69 66 28 20 70 20 29 7b 0a 20 20 20 20 20 73 74  if( p ){.     st
20960 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
20970 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 2d 3e  em *pItem = &p->
20980 61 5b 70 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20  a[p->nExpr-1];. 
20990 20 20 20 20 70 49 74 65 6d 2d 3e 75 2e 69 43 6f      pItem->u.iCo
209a0 6e 73 74 45 78 70 72 52 65 67 20 3d 20 72 65 67  nstExprReg = reg
209b0 44 65 73 74 3b 0a 20 20 20 20 20 70 49 74 65 6d  Dest;.     pItem
209c0 2d 3e 72 65 75 73 61 62 6c 65 20 3d 20 72 65 75  ->reusable = reu
209d0 73 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 70 50 61  sable;.  }.  pPa
209e0 72 73 65 2d 3e 70 43 6f 6e 73 74 45 78 70 72 20  rse->pConstExpr 
209f0 3d 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  = p;.}../*.** Ge
20a00 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 65  nerate code to e
20a10 76 61 6c 75 61 74 65 20 61 6e 20 65 78 70 72 65  valuate an expre
20a20 73 73 69 6f 6e 20 61 6e 64 20 73 74 6f 72 65 20  ssion and store 
20a30 74 68 65 20 72 65 73 75 6c 74 73 0a 2a 2a 20 69  the results.** i
20a40 6e 74 6f 20 61 20 72 65 67 69 73 74 65 72 2e 20  nto a register. 
20a50 20 52 65 74 75 72 6e 20 74 68 65 20 72 65 67 69   Return the regi
20a60 73 74 65 72 20 6e 75 6d 62 65 72 20 77 68 65 72  ster number wher
20a70 65 20 74 68 65 20 72 65 73 75 6c 74 73 0a 2a 2a  e the results.**
20a80 20 61 72 65 20 73 74 6f 72 65 64 2e 0a 2a 2a 0a   are stored..**.
20a90 2a 2a 20 49 66 20 74 68 65 20 72 65 67 69 73 74  ** If the regist
20aa0 65 72 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72  er is a temporar
20ab0 79 20 72 65 67 69 73 74 65 72 20 74 68 61 74 20  y register that 
20ac0 63 61 6e 20 62 65 20 64 65 61 6c 6c 6f 63 61 74  can be deallocat
20ad0 65 64 2c 0a 2a 2a 20 74 68 65 6e 20 77 72 69 74  ed,.** then writ
20ae0 65 20 69 74 73 20 6e 75 6d 62 65 72 20 69 6e 74  e its number int
20af0 6f 20 2a 70 52 65 67 2e 20 20 49 66 20 74 68 65  o *pReg.  If the
20b00 20 72 65 73 75 6c 74 20 72 65 67 69 73 74 65 72   result register
20b10 20 69 73 20 6e 6f 74 0a 2a 2a 20 61 20 74 65 6d   is not.** a tem
20b20 70 6f 72 61 72 79 2c 20 74 68 65 6e 20 73 65 74  porary, then set
20b30 20 2a 70 52 65 67 20 74 6f 20 7a 65 72 6f 2e 0a   *pReg to zero..
20b40 2a 2a 0a 2a 2a 20 49 66 20 70 45 78 70 72 20 69  **.** If pExpr i
20b50 73 20 61 20 63 6f 6e 73 74 61 6e 74 2c 20 74 68  s a constant, th
20b60 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
20b70 6d 69 67 68 74 20 67 65 6e 65 72 61 74 65 20 74  might generate t
20b80 68 69 73 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 66  his.** code to f
20b90 69 6c 6c 20 74 68 65 20 72 65 67 69 73 74 65 72  ill the register
20ba0 20 69 6e 20 74 68 65 20 69 6e 69 74 69 61 6c 69   in the initiali
20bb0 7a 61 74 69 6f 6e 20 73 65 63 74 69 6f 6e 20 6f  zation section o
20bc0 66 20 74 68 65 0a 2a 2a 20 56 44 42 45 20 70 72  f the.** VDBE pr
20bd0 6f 67 72 61 6d 2c 20 69 6e 20 6f 72 64 65 72 20  ogram, in order 
20be0 74 6f 20 66 61 63 74 6f 72 20 69 74 20 6f 75 74  to factor it out
20bf0 20 6f 66 20 74 68 65 20 65 76 61 6c 75 61 74 69   of the evaluati
20c00 6f 6e 20 6c 6f 6f 70 2e 0a 2a 2f 0a 69 6e 74 20  on loop..*/.int 
20c10 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
20c20 65 6d 70 28 50 61 72 73 65 20 2a 70 50 61 72 73  emp(Parse *pPars
20c30 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  e, Expr *pExpr, 
20c40 69 6e 74 20 2a 70 52 65 67 29 7b 0a 20 20 69 6e  int *pReg){.  in
20c50 74 20 72 32 3b 0a 20 20 70 45 78 70 72 20 3d 20  t r2;.  pExpr = 
20c60 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43  sqlite3ExprSkipC
20c70 6f 6c 6c 61 74 65 28 70 45 78 70 72 29 3b 0a 20  ollate(pExpr);. 
20c80 20 69 66 28 20 43 6f 6e 73 74 46 61 63 74 6f 72   if( ConstFactor
20c90 4f 6b 28 70 50 61 72 73 65 29 0a 20 20 20 26 26  Ok(pParse).   &&
20ca0 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 52   pExpr->op!=TK_R
20cb0 45 47 49 53 54 45 52 0a 20 20 20 26 26 20 73 71  EGISTER.   && sq
20cc0 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
20cd0 61 6e 74 4e 6f 74 4a 6f 69 6e 28 70 45 78 70 72  antNotJoin(pExpr
20ce0 29 0a 20 20 29 7b 0a 20 20 20 20 45 78 70 72 4c  ).  ){.    ExprL
20cf0 69 73 74 20 2a 70 20 3d 20 70 50 61 72 73 65 2d  ist *p = pParse-
20d00 3e 70 43 6f 6e 73 74 45 78 70 72 3b 0a 20 20 20  >pConstExpr;.   
20d10 20 69 6e 74 20 69 3b 0a 20 20 20 20 2a 70 52 65   int i;.    *pRe
20d20 67 20 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  g  = 0;.    if( 
20d30 70 20 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63  p ){.      struc
20d40 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
20d50 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 66 6f  *pItem;.      fo
20d60 72 28 70 49 74 65 6d 3d 70 2d 3e 61 2c 20 69 3d  r(pItem=p->a, i=
20d70 70 2d 3e 6e 45 78 70 72 3b 20 69 3e 30 3b 20 70  p->nExpr; i>0; p
20d80 49 74 65 6d 2b 2b 2c 20 69 2d 2d 29 7b 0a 20 20  Item++, i--){.  
20d90 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d        if( pItem-
20da0 3e 72 65 75 73 61 62 6c 65 20 26 26 20 73 71 6c  >reusable && sql
20db0 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28  ite3ExprCompare(
20dc0 70 49 74 65 6d 2d 3e 70 45 78 70 72 2c 70 45 78  pItem->pExpr,pEx
20dd0 70 72 2c 2d 31 29 3d 3d 30 20 29 7b 0a 20 20 20  pr,-1)==0 ){.   
20de0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 49         return pI
20df0 74 65 6d 2d 3e 75 2e 69 43 6f 6e 73 74 45 78 70  tem->u.iConstExp
20e00 72 52 65 67 3b 0a 20 20 20 20 20 20 20 20 7d 0a  rReg;.        }.
20e10 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
20e20 20 20 72 32 20 3d 20 2b 2b 70 50 61 72 73 65 2d    r2 = ++pParse-
20e30 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74  >nMem;.    sqlit
20e40 65 33 45 78 70 72 43 6f 64 65 41 74 49 6e 69 74  e3ExprCodeAtInit
20e50 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
20e60 72 32 2c 20 31 29 3b 0a 20 20 7d 65 6c 73 65 7b  r2, 1);.  }else{
20e70 0a 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71  .    int r1 = sq
20e80 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
20e90 70 50 61 72 73 65 29 3b 0a 20 20 20 20 72 32 20  pParse);.    r2 
20ea0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
20eb0 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20  eTarget(pParse, 
20ec0 70 45 78 70 72 2c 20 72 31 29 3b 0a 20 20 20 20  pExpr, r1);.    
20ed0 69 66 28 20 72 32 3d 3d 72 31 20 29 7b 0a 20 20  if( r2==r1 ){.  
20ee0 20 20 20 20 2a 70 52 65 67 20 3d 20 72 31 3b 0a      *pReg = r1;.
20ef0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
20f00 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
20f10 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
20f20 31 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 67 20  1);.      *pReg 
20f30 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  = 0;.    }.  }. 
20f40 20 72 65 74 75 72 6e 20 72 32 3b 0a 7d 0a 0a 2f   return r2;.}../
20f50 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
20f60 64 65 20 74 68 61 74 20 77 69 6c 6c 20 65 76 61  de that will eva
20f70 6c 75 61 74 65 20 65 78 70 72 65 73 73 69 6f 6e  luate expression
20f80 20 70 45 78 70 72 20 61 6e 64 20 73 74 6f 72 65   pExpr and store
20f90 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 73 20   the.** results 
20fa0 69 6e 20 72 65 67 69 73 74 65 72 20 74 61 72 67  in register targ
20fb0 65 74 2e 20 20 54 68 65 20 72 65 73 75 6c 74 73  et.  The results
20fc0 20 61 72 65 20 67 75 61 72 61 6e 74 65 65 64 20   are guaranteed 
20fd0 74 6f 20 61 70 70 65 61 72 0a 2a 2a 20 69 6e 20  to appear.** in 
20fe0 72 65 67 69 73 74 65 72 20 74 61 72 67 65 74 2e  register target.
20ff0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
21000 45 78 70 72 43 6f 64 65 28 50 61 72 73 65 20 2a  ExprCode(Parse *
21010 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
21020 78 70 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29  xpr, int target)
21030 7b 0a 20 20 69 6e 74 20 69 6e 52 65 67 3b 0a 0a  {.  int inReg;..
21040 20 20 61 73 73 65 72 74 28 20 74 61 72 67 65 74    assert( target
21050 3e 30 20 26 26 20 74 61 72 67 65 74 3c 3d 70 50  >0 && target<=pP
21060 61 72 73 65 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20  arse->nMem );.  
21070 69 66 28 20 70 45 78 70 72 20 26 26 20 70 45 78  if( pExpr && pEx
21080 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49 53  pr->op==TK_REGIS
21090 54 45 52 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  TER ){.    sqlit
210a0 65 33 56 64 62 65 41 64 64 4f 70 32 28 70 50 61  e3VdbeAddOp2(pPa
210b0 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 43  rse->pVdbe, OP_C
210c0 6f 70 79 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  opy, pExpr->iTab
210d0 6c 65 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 7d  le, target);.  }
210e0 65 6c 73 65 7b 0a 20 20 20 20 69 6e 52 65 67 20  else{.    inReg 
210f0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
21100 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20  eTarget(pParse, 
21110 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a  pExpr, target);.
21120 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
21130 73 65 2d 3e 70 56 64 62 65 21 3d 30 20 7c 7c 20  se->pVdbe!=0 || 
21140 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
21150 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
21160 69 66 28 20 69 6e 52 65 67 21 3d 74 61 72 67 65  if( inReg!=targe
21170 74 20 26 26 20 70 50 61 72 73 65 2d 3e 70 56 64  t && pParse->pVd
21180 62 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  be ){.      sqli
21190 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 70 50  te3VdbeAddOp2(pP
211a0 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f  arse->pVdbe, OP_
211b0 53 43 6f 70 79 2c 20 69 6e 52 65 67 2c 20 74 61  SCopy, inReg, ta
211c0 72 67 65 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  rget);.    }.  }
211d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61  .}../*.** Make a
211e0 20 74 72 61 6e 73 69 65 6e 74 20 63 6f 70 79 20   transient copy 
211f0 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45  of expression pE
21200 78 70 72 20 61 6e 64 20 74 68 65 6e 20 63 6f 64  xpr and then cod
21210 65 20 69 74 20 75 73 69 6e 67 0a 2a 2a 20 73 71  e it using.** sq
21220 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 29 2e  lite3ExprCode().
21230 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77    This routine w
21240 6f 72 6b 73 20 6a 75 73 74 20 6c 69 6b 65 20 73  orks just like s
21250 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 29  qlite3ExprCode()
21260 0a 2a 2a 20 65 78 63 65 70 74 20 74 68 61 74 20  .** except that 
21270 74 68 65 20 69 6e 70 75 74 20 65 78 70 72 65 73  the input expres
21280 73 69 6f 6e 20 69 73 20 67 75 61 72 61 6e 74 65  sion is guarante
21290 65 64 20 74 6f 20 62 65 20 75 6e 63 68 61 6e 67  ed to be unchang
212a0 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
212b0 74 65 33 45 78 70 72 43 6f 64 65 43 6f 70 79 28  te3ExprCodeCopy(
212c0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
212d0 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20  xpr *pExpr, int 
212e0 74 61 72 67 65 74 29 7b 0a 20 20 73 71 6c 69 74  target){.  sqlit
212f0 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
21300 3e 64 62 3b 0a 20 20 70 45 78 70 72 20 3d 20 73  >db;.  pExpr = s
21310 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
21320 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 69  , pExpr, 0);.  i
21330 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  f( !db->mallocFa
21340 69 6c 65 64 20 29 20 73 71 6c 69 74 65 33 45 78  iled ) sqlite3Ex
21350 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
21360 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20  Expr, target);. 
21370 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
21380 74 65 28 64 62 2c 20 70 45 78 70 72 29 3b 0a 7d  te(db, pExpr);.}
21390 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
213a0 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
213b0 65 76 61 6c 75 61 74 65 20 65 78 70 72 65 73 73  evaluate express
213c0 69 6f 6e 20 70 45 78 70 72 20 61 6e 64 20 73 74  ion pExpr and st
213d0 6f 72 65 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c  ore the.** resul
213e0 74 73 20 69 6e 20 72 65 67 69 73 74 65 72 20 74  ts in register t
213f0 61 72 67 65 74 2e 20 20 54 68 65 20 72 65 73 75  arget.  The resu
21400 6c 74 73 20 61 72 65 20 67 75 61 72 61 6e 74 65  lts are guarante
21410 65 64 20 74 6f 20 61 70 70 65 61 72 0a 2a 2a 20  ed to appear.** 
21420 69 6e 20 72 65 67 69 73 74 65 72 20 74 61 72 67  in register targ
21430 65 74 2e 20 20 49 66 20 74 68 65 20 65 78 70 72  et.  If the expr
21440 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61  ession is consta
21450 6e 74 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f  nt, then this ro
21460 75 74 69 6e 65 0a 2a 2a 20 6d 69 67 68 74 20 63  utine.** might c
21470 68 6f 6f 73 65 20 74 6f 20 63 6f 64 65 20 74 68  hoose to code th
21480 65 20 65 78 70 72 65 73 73 69 6f 6e 20 61 74 20  e expression at 
21490 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 74  initialization t
214a0 69 6d 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ime..*/.void sql
214b0 69 74 65 33 45 78 70 72 43 6f 64 65 46 61 63 74  ite3ExprCodeFact
214c0 6f 72 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50  orable(Parse *pP
214d0 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
214e0 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a  r, int target){.
214f0 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6f 6b    if( pParse->ok
21500 43 6f 6e 73 74 46 61 63 74 6f 72 20 26 26 20 73  ConstFactor && s
21510 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
21520 74 61 6e 74 28 70 45 78 70 72 29 20 29 7b 0a 20  tant(pExpr) ){. 
21530 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
21540 64 65 41 74 49 6e 69 74 28 70 50 61 72 73 65 2c  deAtInit(pParse,
21550 20 70 45 78 70 72 2c 20 74 61 72 67 65 74 2c 20   pExpr, target, 
21560 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  0);.  }else{.   
21570 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
21580 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
21590 74 61 72 67 65 74 29 3b 0a 20 20 7d 0a 7d 0a 0a  target);.  }.}..
215a0 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
215b0 6f 64 65 20 74 68 61 74 20 65 76 61 6c 75 61 74  ode that evaluat
215c0 65 73 20 74 68 65 20 67 69 76 65 6e 20 65 78 70  es the given exp
215d0 72 65 73 73 69 6f 6e 20 61 6e 64 20 70 75 74 73  ression and puts
215e0 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 69   the result.** i
215f0 6e 20 72 65 67 69 73 74 65 72 20 74 61 72 67 65  n register targe
21600 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 6d 61  t..**.** Also ma
21610 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  ke a copy of the
21620 20 65 78 70 72 65 73 73 69 6f 6e 20 72 65 73 75   expression resu
21630 6c 74 73 20 69 6e 74 6f 20 61 6e 6f 74 68 65 72  lts into another
21640 20 22 63 61 63 68 65 22 20 72 65 67 69 73 74 65   "cache" registe
21650 72 0a 2a 2a 20 61 6e 64 20 6d 6f 64 69 66 79 20  r.** and modify 
21660 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 73  the expression s
21670 6f 20 74 68 61 74 20 74 68 65 20 6e 65 78 74 20  o that the next 
21680 74 69 6d 65 20 69 74 20 69 73 20 65 76 61 6c 75  time it is evalu
21690 61 74 65 64 2c 0a 2a 2a 20 74 68 65 20 72 65 73  ated,.** the res
216a0 75 6c 74 20 69 73 20 61 20 63 6f 70 79 20 6f 66  ult is a copy of
216b0 20 74 68 65 20 63 61 63 68 65 20 72 65 67 69 73   the cache regis
216c0 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ter..**.** This 
216d0 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
216e0 66 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 73 20  for expressions 
216f0 74 68 61 74 20 61 72 65 20 75 73 65 64 20 6d 75  that are used mu
21700 6c 74 69 70 6c 65 20 0a 2a 2a 20 74 69 6d 65 73  ltiple .** times
21710 2e 20 20 54 68 65 79 20 61 72 65 20 65 76 61 6c  .  They are eval
21720 75 61 74 65 64 20 6f 6e 63 65 20 61 6e 64 20 74  uated once and t
21730 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68  he results of th
21740 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20  e expression.** 
21750 61 72 65 20 72 65 75 73 65 64 2e 0a 2a 2f 0a 76  are reused..*/.v
21760 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43  oid sqlite3ExprC
21770 6f 64 65 41 6e 64 43 61 63 68 65 28 50 61 72 73  odeAndCache(Pars
21780 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
21790 2a 70 45 78 70 72 2c 20 69 6e 74 20 74 61 72 67  *pExpr, int targ
217a0 65 74 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  et){.  Vdbe *v =
217b0 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
217c0 20 20 69 6e 74 20 69 4d 65 6d 3b 0a 0a 20 20 61    int iMem;..  a
217d0 73 73 65 72 74 28 20 74 61 72 67 65 74 3e 30 20  ssert( target>0 
217e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
217f0 70 72 2d 3e 6f 70 21 3d 54 4b 5f 52 45 47 49 53  pr->op!=TK_REGIS
21800 54 45 52 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  TER );.  sqlite3
21810 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
21820 20 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b   pExpr, target);
21830 0a 20 20 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72  .  iMem = ++pPar
21840 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69  se->nMem;.  sqli
21850 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
21860 20 4f 50 5f 43 6f 70 79 2c 20 74 61 72 67 65 74   OP_Copy, target
21870 2c 20 69 4d 65 6d 29 3b 0a 20 20 65 78 70 72 54  , iMem);.  exprT
21880 6f 52 65 67 69 73 74 65 72 28 70 45 78 70 72 2c  oRegister(pExpr,
21890 20 69 4d 65 6d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   iMem);.}../*.**
218a0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
218b0 68 61 74 20 70 75 73 68 65 73 20 74 68 65 20 76  hat pushes the v
218c0 61 6c 75 65 20 6f 66 20 65 76 65 72 79 20 65 6c  alue of every el
218d0 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 67 69 76  ement of the giv
218e0 65 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  en.** expression
218f0 20 6c 69 73 74 20 69 6e 74 6f 20 61 20 73 65 71   list into a seq
21900 75 65 6e 63 65 20 6f 66 20 72 65 67 69 73 74 65  uence of registe
21910 72 73 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20  rs beginning at 
21920 74 61 72 67 65 74 2e 0a 2a 2a 0a 2a 2a 20 52 65  target..**.** Re
21930 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
21940 6f 66 20 65 6c 65 6d 65 6e 74 73 20 65 76 61 6c  of elements eval
21950 75 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  uated..**.** The
21960 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50   SQLITE_ECEL_DUP
21970 20 66 6c 61 67 20 70 72 65 76 65 6e 74 73 20 74   flag prevents t
21980 68 65 20 61 72 67 75 6d 65 6e 74 73 20 66 72 6f  he arguments fro
21990 6d 20 62 65 69 6e 67 0a 2a 2a 20 66 69 6c 6c 65  m being.** fille
219a0 64 20 75 73 69 6e 67 20 4f 50 5f 53 43 6f 70 79  d using OP_SCopy
219b0 2e 20 20 4f 50 5f 43 6f 70 79 20 6d 75 73 74 20  .  OP_Copy must 
219c0 62 65 20 75 73 65 64 20 69 6e 73 74 65 61 64 2e  be used instead.
219d0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c 49 54  .**.** The SQLIT
219e0 45 5f 45 43 45 4c 5f 46 41 43 54 4f 52 20 61 72  E_ECEL_FACTOR ar
219f0 67 75 6d 65 6e 74 20 61 6c 6c 6f 77 73 20 63 6f  gument allows co
21a00 6e 73 74 61 6e 74 20 61 72 67 75 6d 65 6e 74 73  nstant arguments
21a10 20 74 6f 20 62 65 0a 2a 2a 20 66 61 63 74 6f 72   to be.** factor
21a20 65 64 20 6f 75 74 20 69 6e 74 6f 20 69 6e 69 74  ed out into init
21a30 69 61 6c 69 7a 61 74 69 6f 6e 20 63 6f 64 65 2e  ialization code.
21a40 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c 49 54  .**.** The SQLIT
21a50 45 5f 45 43 45 4c 5f 52 45 46 20 66 6c 61 67 20  E_ECEL_REF flag 
21a60 6d 65 61 6e 73 20 74 68 61 74 20 65 78 70 72 65  means that expre
21a70 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 6c 69  ssions in the li
21a80 73 74 20 77 69 74 68 0a 2a 2a 20 45 78 70 72 4c  st with.** ExprL
21a90 69 73 74 2e 61 5b 5d 2e 75 2e 78 2e 69 4f 72 64  ist.a[].u.x.iOrd
21aa0 65 72 42 79 43 6f 6c 3e 30 20 68 61 76 65 20 61  erByCol>0 have a
21ab0 6c 72 65 61 64 79 20 62 65 65 6e 20 65 76 61 6c  lready been eval
21ac0 75 61 74 65 64 20 61 6e 64 20 73 74 6f 72 65 64  uated and stored
21ad0 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74 65 72 73  .** in registers
21ae0 20 61 74 20 73 72 63 52 65 67 2c 20 61 6e 64 20   at srcReg, and 
21af0 73 6f 20 74 68 65 20 76 61 6c 75 65 20 63 61 6e  so the value can
21b00 20 62 65 20 63 6f 70 69 65 64 20 66 72 6f 6d 20   be copied from 
21b10 74 68 65 72 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  there..*/.int sq
21b20 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70  lite3ExprCodeExp
21b30 72 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20 2a  rList(.  Parse *
21b40 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 50  pParse,     /* P
21b50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
21b60 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  /.  ExprList *pL
21b70 69 73 74 2c 20 20 20 2f 2a 20 54 68 65 20 65 78  ist,   /* The ex
21b80 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 74 6f  pression list to
21b90 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69   be coded */.  i
21ba0 6e 74 20 74 61 72 67 65 74 2c 20 20 20 20 20 20  nt target,      
21bb0 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 77 72    /* Where to wr
21bc0 69 74 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20  ite results */. 
21bd0 20 69 6e 74 20 73 72 63 52 65 67 2c 20 20 20 20   int srcReg,    
21be0 20 20 20 20 2f 2a 20 53 6f 75 72 63 65 20 72 65      /* Source re
21bf0 67 69 73 74 65 72 73 20 69 66 20 53 51 4c 49 54  gisters if SQLIT
21c00 45 5f 45 43 45 4c 5f 52 45 46 20 2a 2f 0a 20 20  E_ECEL_REF */.  
21c10 75 38 20 66 6c 61 67 73 20 20 20 20 20 20 20 20  u8 flags        
21c20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 45 43 45     /* SQLITE_ECE
21c30 4c 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a  L_* flags */.){.
21c40 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
21c50 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
21c60 20 69 6e 74 20 69 2c 20 6a 2c 20 6e 3b 0a 20 20   int i, j, n;.  
21c70 75 38 20 63 6f 70 79 4f 70 20 3d 20 28 66 6c 61  u8 copyOp = (fla
21c80 67 73 20 26 20 53 51 4c 49 54 45 5f 45 43 45 4c  gs & SQLITE_ECEL
21c90 5f 44 55 50 29 20 3f 20 4f 50 5f 43 6f 70 79 20  _DUP) ? OP_Copy 
21ca0 3a 20 4f 50 5f 53 43 6f 70 79 3b 0a 20 20 56 64  : OP_SCopy;.  Vd
21cb0 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
21cc0 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72 74 28  pVdbe;.  assert(
21cd0 20 70 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 61   pList!=0 );.  a
21ce0 73 73 65 72 74 28 20 74 61 72 67 65 74 3e 30 20  ssert( target>0 
21cf0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
21d00 72 73 65 2d 3e 70 56 64 62 65 21 3d 30 20 29 3b  rse->pVdbe!=0 );
21d10 20 20 2f 2a 20 4e 65 76 65 72 20 67 65 74 73 20    /* Never gets 
21d20 74 68 69 73 20 66 61 72 20 6f 74 68 65 72 77 69  this far otherwi
21d30 73 65 20 2a 2f 0a 20 20 6e 20 3d 20 70 4c 69 73  se */.  n = pLis
21d40 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 69 66 28 20  t->nExpr;.  if( 
21d50 21 43 6f 6e 73 74 46 61 63 74 6f 72 4f 6b 28 70  !ConstFactorOk(p
21d60 50 61 72 73 65 29 20 29 20 66 6c 61 67 73 20 26  Parse) ) flags &
21d70 3d 20 7e 53 51 4c 49 54 45 5f 45 43 45 4c 5f 46  = ~SQLITE_ECEL_F
21d80 41 43 54 4f 52 3b 0a 20 20 66 6f 72 28 70 49 74  ACTOR;.  for(pIt
21d90 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30  em=pList->a, i=0
21da0 3b 20 69 3c 6e 3b 20 69 2b 2b 2c 20 70 49 74 65  ; i<n; i++, pIte
21db0 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  m++){.    Expr *
21dc0 70 45 78 70 72 20 3d 20 70 49 74 65 6d 2d 3e 70  pExpr = pItem->p
21dd0 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 28 66  Expr;.    if( (f
21de0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 45 43  lags & SQLITE_EC
21df0 45 4c 5f 52 45 46 29 21 3d 30 20 26 26 20 28 6a  EL_REF)!=0 && (j
21e00 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 75   = pList->a[i].u
21e10 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 29 3e  .x.iOrderByCol)>
21e20 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
21e30 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
21e40 63 6f 70 79 4f 70 2c 20 6a 2b 73 72 63 52 65 67  copyOp, j+srcReg
21e50 2d 31 2c 20 74 61 72 67 65 74 2b 69 29 3b 0a 20  -1, target+i);. 
21e60 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 66 6c     }else if( (fl
21e70 61 67 73 20 26 20 53 51 4c 49 54 45 5f 45 43 45  ags & SQLITE_ECE
21e80 4c 5f 46 41 43 54 4f 52 29 21 3d 30 20 26 26 20  L_FACTOR)!=0 && 
21e90 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
21ea0 73 74 61 6e 74 28 70 45 78 70 72 29 20 29 7b 0a  stant(pExpr) ){.
21eb0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
21ec0 72 43 6f 64 65 41 74 49 6e 69 74 28 70 50 61 72  rCodeAtInit(pPar
21ed0 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65  se, pExpr, targe
21ee0 74 2b 69 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c  t+i, 0);.    }el
21ef0 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 6e  se{.      int in
21f00 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Reg = sqlite3Exp
21f10 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72  rCodeTarget(pPar
21f20 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65  se, pExpr, targe
21f30 74 2b 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20  t+i);.      if( 
21f40 69 6e 52 65 67 21 3d 74 61 72 67 65 74 2b 69 20  inReg!=target+i 
21f50 29 7b 0a 20 20 20 20 20 20 20 20 56 64 62 65 4f  ){.        VdbeO
21f60 70 20 2a 70 4f 70 3b 0a 20 20 20 20 20 20 20 20  p *pOp;.        
21f70 69 66 28 20 63 6f 70 79 4f 70 3d 3d 4f 50 5f 43  if( copyOp==OP_C
21f80 6f 70 79 0a 20 20 20 20 20 20 20 20 20 26 26 20  opy.         && 
21f90 28 70 4f 70 3d 73 71 6c 69 74 65 33 56 64 62 65  (pOp=sqlite3Vdbe
21fa0 47 65 74 4f 70 28 76 2c 20 2d 31 29 29 2d 3e 6f  GetOp(v, -1))->o
21fb0 70 63 6f 64 65 3d 3d 4f 50 5f 43 6f 70 79 0a 20  pcode==OP_Copy. 
21fc0 20 20 20 20 20 20 20 20 26 26 20 70 4f 70 2d 3e          && pOp->
21fd0 70 31 2b 70 4f 70 2d 3e 70 33 2b 31 3d 3d 69 6e  p1+pOp->p3+1==in
21fe0 52 65 67 0a 20 20 20 20 20 20 20 20 20 26 26 20  Reg.         && 
21ff0 70 4f 70 2d 3e 70 32 2b 70 4f 70 2d 3e 70 33 2b  pOp->p2+pOp->p3+
22000 31 3d 3d 74 61 72 67 65 74 2b 69 0a 20 20 20 20  1==target+i.    
22010 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
22020 20 70 4f 70 2d 3e 70 33 2b 2b 3b 0a 20 20 20 20   pOp->p3++;.    
22030 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
22040 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
22050 41 64 64 4f 70 32 28 76 2c 20 63 6f 70 79 4f 70  AddOp2(v, copyOp
22060 2c 20 69 6e 52 65 67 2c 20 74 61 72 67 65 74 2b  , inReg, target+
22070 69 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  i);.        }.  
22080 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
22090 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f    return n;.}../
220a0 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
220b0 64 65 20 66 6f 72 20 61 20 42 45 54 57 45 45 4e  de for a BETWEEN
220c0 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a   operator..**.**
220d0 20 20 20 20 78 20 42 45 54 57 45 45 4e 20 79 20      x BETWEEN y 
220e0 41 4e 44 20 7a 0a 2a 2a 0a 2a 2a 20 54 68 65 20  AND z.**.** The 
220f0 61 62 6f 76 65 20 69 73 20 65 71 75 69 76 61 6c  above is equival
22100 65 6e 74 20 74 6f 20 0a 2a 2a 0a 2a 2a 20 20 20  ent to .**.**   
22110 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 0a 2a   x>=y AND x<=z.*
22120 2a 0a 2a 2a 20 43 6f 64 65 20 69 74 20 61 73 20  *.** Code it as 
22130 73 75 63 68 2c 20 74 61 6b 69 6e 67 20 63 61 72  such, taking car
22140 65 20 74 6f 20 64 6f 20 74 68 65 20 63 6f 6d 6d  e to do the comm
22150 6f 6e 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  on subexpression
22160 0a 2a 2a 20 65 6c 69 6d 69 6e 61 74 69 6f 6e 20  .** elimination 
22170 6f 66 20 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  of x..*/.static 
22180 76 6f 69 64 20 65 78 70 72 43 6f 64 65 42 65 74  void exprCodeBet
22190 77 65 65 6e 28 0a 20 20 50 61 72 73 65 20 2a 70  ween(.  Parse *p
221a0 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72  Parse,    /* Par
221b0 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65  sing and code ge
221c0 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74  nerating context
221d0 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70   */.  Expr *pExp
221e0 72 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 42  r,      /* The B
221f0 45 54 57 45 45 4e 20 65 78 70 72 65 73 73 69 6f  ETWEEN expressio
22200 6e 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 2c  n */.  int dest,
22210 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70           /* Jump
22220 20 68 65 72 65 20 69 66 20 74 68 65 20 6a 75 6d   here if the jum
22230 70 20 69 73 20 74 61 6b 65 6e 20 2a 2f 0a 20 20  p is taken */.  
22240 76 6f 69 64 20 28 2a 78 4a 75 6d 70 49 66 29 28  void (*xJumpIf)(
22250 50 61 72 73 65 2a 2c 45 78 70 72 2a 2c 69 6e 74  Parse*,Expr*,int
22260 2c 69 6e 74 29 2c 0a 20 20 69 6e 74 20 6a 75 6d  ,int),.  int jum
22270 70 49 66 4e 75 6c 6c 20 20 20 20 2f 2a 20 54 61  pIfNull    /* Ta
22280 6b 65 20 74 68 65 20 6a 75 6d 70 20 69 66 20 74  ke the jump if t
22290 68 65 20 42 45 54 57 45 45 4e 20 69 73 20 4e 55  he BETWEEN is NU
222a0 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20  LL */.){.  Expr 
222b0 65 78 70 72 41 6e 64 3b 20 20 20 20 20 2f 2a 20  exprAnd;     /* 
222c0 54 68 65 20 41 4e 44 20 6f 70 65 72 61 74 6f 72  The AND operator
222d0 20 69 6e 20 20 78 3e 3d 79 20 41 4e 44 20 78 3c   in  x>=y AND x<
222e0 3d 7a 20 20 2a 2f 0a 20 20 45 78 70 72 20 63 6f  =z  */.  Expr co
222f0 6d 70 4c 65 66 74 3b 20 20 20 20 2f 2a 20 54 68  mpLeft;    /* Th
22300 65 20 20 78 3e 3d 79 20 20 74 65 72 6d 20 2a 2f  e  x>=y  term */
22310 0a 20 20 45 78 70 72 20 63 6f 6d 70 52 69 67 68  .  Expr compRigh
22320 74 3b 20 20 20 2f 2a 20 54 68 65 20 20 78 3c 3d  t;   /* The  x<=
22330 7a 20 20 74 65 72 6d 20 2a 2f 0a 20 20 45 78 70  z  term */.  Exp
22340 72 20 65 78 70 72 58 3b 20 20 20 20 20 20 20 2f  r exprX;       /
22350 2a 20 54 68 65 20 20 78 20 20 73 75 62 65 78 70  * The  x  subexp
22360 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  ression */.  int
22370 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b 20 2f   regFree1 = 0; /
22380 2a 20 54 65 6d 70 6f 72 61 72 79 20 75 73 65 20  * Temporary use 
22390 72 65 67 69 73 74 65 72 20 2a 2f 0a 0a 20 20 6d  register */..  m
223a0 65 6d 73 65 74 28 26 63 6f 6d 70 4c 65 66 74 2c  emset(&compLeft,
223b0 20 30 2c 20 73 69 7a 65 6f 66 28 45 78 70 72 29   0, sizeof(Expr)
223c0 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 63 6f 6d  );.  memset(&com
223d0 70 52 69 67 68 74 2c 20 30 2c 20 73 69 7a 65 6f  pRight, 0, sizeo
223e0 66 28 45 78 70 72 29 29 3b 0a 20 20 6d 65 6d 73  f(Expr));.  mems
223f0 65 74 28 26 65 78 70 72 41 6e 64 2c 20 30 2c 20  et(&exprAnd, 0, 
22400 73 69 7a 65 6f 66 28 45 78 70 72 29 29 3b 0a 0a  sizeof(Expr));..
22410 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
22420 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
22430 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
22440 29 3b 0a 20 20 65 78 70 72 58 20 3d 20 2a 70 45  );.  exprX = *pE
22450 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 65 78  xpr->pLeft;.  ex
22460 70 72 41 6e 64 2e 6f 70 20 3d 20 54 4b 5f 41 4e  prAnd.op = TK_AN
22470 44 3b 0a 20 20 65 78 70 72 41 6e 64 2e 70 4c 65  D;.  exprAnd.pLe
22480 66 74 20 3d 20 26 63 6f 6d 70 4c 65 66 74 3b 0a  ft = &compLeft;.
22490 20 20 65 78 70 72 41 6e 64 2e 70 52 69 67 68 74    exprAnd.pRight
224a0 20 3d 20 26 63 6f 6d 70 52 69 67 68 74 3b 0a 20   = &compRight;. 
224b0 20 63 6f 6d 70 4c 65 66 74 2e 6f 70 20 3d 20 54   compLeft.op = T
224c0 4b 5f 47 45 3b 0a 20 20 63 6f 6d 70 4c 65 66 74  K_GE;.  compLeft
224d0 2e 70 4c 65 66 74 20 3d 20 26 65 78 70 72 58 3b  .pLeft = &exprX;
224e0 0a 20 20 63 6f 6d 70 4c 65 66 74 2e 70 52 69 67  .  compLeft.pRig
224f0 68 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c  ht = pExpr->x.pL
22500 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b  ist->a[0].pExpr;
22510 0a 20 20 63 6f 6d 70 52 69 67 68 74 2e 6f 70 20  .  compRight.op 
22520 3d 20 54 4b 5f 4c 45 3b 0a 20 20 63 6f 6d 70 52  = TK_LE;.  compR
22530 69 67 68 74 2e 70 4c 65 66 74 20 3d 20 26 65 78  ight.pLeft = &ex
22540 70 72 58 3b 0a 20 20 63 6f 6d 70 52 69 67 68 74  prX;.  compRight
22550 2e 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d  .pRight = pExpr-
22560 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70  >x.pList->a[1].p
22570 45 78 70 72 3b 0a 20 20 69 66 28 20 73 71 6c 69  Expr;.  if( sqli
22580 74 65 33 45 78 70 72 49 73 56 65 63 74 6f 72 28  te3ExprIsVector(
22590 26 65 78 70 72 58 29 3d 3d 30 20 29 7b 0a 20 20  &exprX)==0 ){.  
225a0 20 20 65 78 70 72 54 6f 52 65 67 69 73 74 65 72    exprToRegister
225b0 28 26 65 78 70 72 58 2c 20 73 71 6c 69 74 65 33  (&exprX, sqlite3
225c0 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
225d0 72 73 65 2c 20 26 65 78 70 72 58 2c 20 26 72 65  rse, &exprX, &re
225e0 67 46 72 65 65 31 29 29 3b 0a 20 20 7d 0a 20 20  gFree1));.  }.  
225f0 69 66 28 20 78 4a 75 6d 70 49 66 20 29 7b 0a 20  if( xJumpIf ){. 
22600 20 20 20 78 4a 75 6d 70 49 66 28 70 50 61 72 73     xJumpIf(pPars
22610 65 2c 20 26 65 78 70 72 41 6e 64 2c 20 64 65 73  e, &exprAnd, des
22620 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
22630 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 65 78 70    }else{.    exp
22640 72 58 2e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 46  rX.flags |= EP_F
22650 72 6f 6d 4a 6f 69 6e 3b 0a 20 20 20 20 73 71 6c  romJoin;.    sql
22660 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67  ite3ExprCodeTarg
22670 65 74 28 70 50 61 72 73 65 2c 20 26 65 78 70 72  et(pParse, &expr
22680 41 6e 64 2c 20 64 65 73 74 29 3b 0a 20 20 7d 0a  And, dest);.  }.
22690 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
226a0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
226b0 72 65 67 46 72 65 65 31 29 3b 0a 0a 20 20 2f 2a  regFree1);..  /*
226c0 20 45 6e 73 75 72 65 20 61 64 65 71 75 61 74 65   Ensure adequate
226d0 20 74 65 73 74 20 63 6f 76 65 72 61 67 65 20 2a   test coverage *
226e0 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20 6a 75  /.  testcase( ju
226f0 6d 70 49 66 54 72 75 65 3d 3d 30 20 26 26 20 6a  mpIfTrue==0 && j
22700 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26 20  umpIfNull==0 && 
22710 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
22720 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
22730 66 54 72 75 65 3d 3d 30 20 26 26 20 6a 75 6d 70  fTrue==0 && jump
22740 49 66 4e 75 6c 6c 3d 3d 30 20 26 26 20 72 65 67  IfNull==0 && reg
22750 46 72 65 65 31 21 3d 30 20 29 3b 0a 20 20 74 65  Free1!=0 );.  te
22760 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 54 72  stcase( jumpIfTr
22770 75 65 3d 3d 30 20 26 26 20 6a 75 6d 70 49 66 4e  ue==0 && jumpIfN
22780 75 6c 6c 21 3d 30 20 26 26 20 72 65 67 46 72 65  ull!=0 && regFre
22790 65 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74 63  e1==0 );.  testc
227a0 61 73 65 28 20 6a 75 6d 70 49 66 54 72 75 65 3d  ase( jumpIfTrue=
227b0 3d 30 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c  =0 && jumpIfNull
227c0 21 3d 30 20 26 26 20 72 65 67 46 72 65 65 31 21  !=0 && regFree1!
227d0 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =0 );.  testcase
227e0 28 20 6a 75 6d 70 49 66 54 72 75 65 21 3d 30 20  ( jumpIfTrue!=0 
227f0 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  && jumpIfNull==0
22800 20 26 26 20 72 65 67 46 72 65 65 31 3d 3d 30 20   && regFree1==0 
22810 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6a  );.  testcase( j
22820 75 6d 70 49 66 54 72 75 65 21 3d 30 20 26 26 20  umpIfTrue!=0 && 
22830 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26  jumpIfNull==0 &&
22840 20 72 65 67 46 72 65 65 31 21 3d 30 20 29 3b 0a   regFree1!=0 );.
22850 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
22860 49 66 54 72 75 65 21 3d 30 20 26 26 20 6a 75 6d  IfTrue!=0 && jum
22870 70 49 66 4e 75 6c 6c 21 3d 30 20 26 26 20 72 65  pIfNull!=0 && re
22880 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 74  gFree1==0 );.  t
22890 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 54  estcase( jumpIfT
228a0 72 75 65 21 3d 30 20 26 26 20 6a 75 6d 70 49 66  rue!=0 && jumpIf
228b0 4e 75 6c 6c 21 3d 30 20 26 26 20 72 65 67 46 72  Null!=0 && regFr
228c0 65 65 31 21 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a  ee1!=0 );.}../*.
228d0 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
228e0 20 66 6f 72 20 61 20 62 6f 6f 6c 65 61 6e 20 65   for a boolean e
228f0 78 70 72 65 73 73 69 6f 6e 20 73 75 63 68 20 74  xpression such t
22900 68 61 74 20 61 20 6a 75 6d 70 20 69 73 20 6d 61  hat a jump is ma
22910 64 65 0a 2a 2a 20 74 6f 20 74 68 65 20 6c 61 62  de.** to the lab
22920 65 6c 20 22 64 65 73 74 22 20 69 66 20 74 68 65  el "dest" if the
22930 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74   expression is t
22940 72 75 65 20 62 75 74 20 65 78 65 63 75 74 69 6f  rue but executio
22950 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 73 20 73  n.** continues s
22960 74 72 61 69 67 68 74 20 74 68 72 75 20 69 66 20  traight thru if 
22970 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
22980 73 20 66 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20 49  s false..**.** I
22990 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
229a0 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20 4e 55   evaluates to NU
229b0 4c 4c 20 28 6e 65 69 74 68 65 72 20 74 72 75 65  LL (neither true
229c0 20 6e 6f 72 20 66 61 6c 73 65 29 2c 20 74 68 65   nor false), the
229d0 6e 0a 2a 2a 20 74 61 6b 65 20 74 68 65 20 6a 75  n.** take the ju
229e0 6d 70 20 69 66 20 74 68 65 20 6a 75 6d 70 49 66  mp if the jumpIf
229f0 4e 75 6c 6c 20 66 6c 61 67 20 69 73 20 53 51 4c  Null flag is SQL
22a00 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 2e 0a  ITE_JUMPIFNULL..
22a10 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 6f 64 65 20  **.** This code 
22a20 64 65 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 66  depends on the f
22a30 61 63 74 20 74 68 61 74 20 63 65 72 74 61 69 6e  act that certain
22a40 20 74 6f 6b 65 6e 20 76 61 6c 75 65 73 20 28 65   token values (e
22a50 78 3a 20 54 4b 5f 45 51 29 0a 2a 2a 20 61 72 65  x: TK_EQ).** are
22a60 20 74 68 65 20 73 61 6d 65 20 61 73 20 6f 70 63   the same as opc
22a70 6f 64 65 20 76 61 6c 75 65 73 20 28 65 78 3a 20  ode values (ex: 
22a80 4f 50 5f 45 71 29 20 74 68 61 74 20 69 6d 70 6c  OP_Eq) that impl
22a90 65 6d 65 6e 74 20 74 68 65 20 63 6f 72 72 65 73  ement the corres
22aa0 70 6f 6e 64 69 6e 67 0a 2a 2a 20 6f 70 65 72 61  ponding.** opera
22ab0 74 69 6f 6e 2e 20 20 53 70 65 63 69 61 6c 20 63  tion.  Special c
22ac0 6f 6d 6d 65 6e 74 73 20 69 6e 20 76 64 62 65 2e  omments in vdbe.
22ad0 63 20 61 6e 64 20 74 68 65 20 6d 6b 6f 70 63 6f  c and the mkopco
22ae0 64 65 68 2e 61 77 6b 20 73 63 72 69 70 74 20 69  deh.awk script i
22af0 6e 0a 2a 2a 20 74 68 65 20 6d 61 6b 65 20 70 72  n.** the make pr
22b00 6f 63 65 73 73 20 63 61 75 73 65 20 74 68 65 73  ocess cause thes
22b10 65 20 76 61 6c 75 65 73 20 74 6f 20 61 6c 69 67  e values to alig
22b20 6e 2e 20 20 41 73 73 65 72 74 28 29 73 20 69 6e  n.  Assert()s in
22b30 20 74 68 65 20 63 6f 64 65 0a 2a 2a 20 62 65 6c   the code.** bel
22b40 6f 77 20 76 65 72 69 66 79 20 74 68 61 74 20 74  ow verify that t
22b50 68 65 20 6e 75 6d 62 65 72 73 20 61 72 65 20 61  he numbers are a
22b60 6c 69 67 6e 65 64 20 63 6f 72 72 65 63 74 6c 79  ligned correctly
22b70 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
22b80 33 45 78 70 72 49 66 54 72 75 65 28 50 61 72 73  3ExprIfTrue(Pars
22b90 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
22ba0 2a 70 45 78 70 72 2c 20 69 6e 74 20 64 65 73 74  *pExpr, int dest
22bb0 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c  , int jumpIfNull
22bc0 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
22bd0 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
22be0 69 6e 74 20 6f 70 20 3d 20 30 3b 0a 20 20 69 6e  int op = 0;.  in
22bf0 74 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b 0a  t regFree1 = 0;.
22c00 20 20 69 6e 74 20 72 65 67 46 72 65 65 32 20 3d    int regFree2 =
22c10 20 30 3b 0a 20 20 69 6e 74 20 72 31 2c 20 72 32   0;.  int r1, r2
22c20 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6a 75 6d  ;..  assert( jum
22c30 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f  pIfNull==SQLITE_
22c40 4a 55 4d 50 49 46 4e 55 4c 4c 20 7c 7c 20 6a 75  JUMPIFNULL || ju
22c50 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
22c60 20 69 66 28 20 4e 45 56 45 52 28 76 3d 3d 30 29   if( NEVER(v==0)
22c70 20 29 20 20 20 20 20 72 65 74 75 72 6e 3b 20 20   )     return;  
22c80 2f 2a 20 45 78 69 73 74 65 6e 63 65 20 6f 66 20  /* Existence of 
22c90 56 44 42 45 20 63 68 65 63 6b 65 64 20 62 79 20  VDBE checked by 
22ca0 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 69 66 28 20  caller */.  if( 
22cb0 4e 45 56 45 52 28 70 45 78 70 72 3d 3d 30 29 20  NEVER(pExpr==0) 
22cc0 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 4e 6f  ) return;  /* No
22cd0 20 77 61 79 20 74 68 69 73 20 63 61 6e 20 68 61   way this can ha
22ce0 70 70 65 6e 20 2a 2f 0a 20 20 6f 70 20 3d 20 70  ppen */.  op = p
22cf0 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 73 77 69 74  Expr->op;.  swit
22d00 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61  ch( op ){.    ca
22d10 73 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a 20 20 20  se TK_AND: {.   
22d20 20 20 20 69 6e 74 20 64 32 20 3d 20 73 71 6c 69     int d2 = sqli
22d30 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
22d40 28 76 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  (v);.      testc
22d50 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  ase( jumpIfNull=
22d60 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =0 );.      sqli
22d70 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
22d80 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
22d90 65 66 74 2c 20 64 32 2c 6a 75 6d 70 49 66 4e 75  eft, d2,jumpIfNu
22da0 6c 6c 5e 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46  ll^SQLITE_JUMPIF
22db0 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 71 6c  NULL);.      sql
22dc0 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73  ite3ExprCachePus
22dd0 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  h(pParse);.     
22de0 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72   sqlite3ExprIfTr
22df0 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ue(pParse, pExpr
22e00 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20  ->pRight, dest, 
22e10 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
22e20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
22e30 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 32  solveLabel(v, d2
22e40 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
22e50 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61  ExprCachePop(pPa
22e60 72 73 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61  rse);.      brea
22e70 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
22e80 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20 20  e TK_OR: {.     
22e90 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
22ea0 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  fNull==0 );.    
22eb0 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54    sqlite3ExprIfT
22ec0 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  rue(pParse, pExp
22ed0 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20  r->pLeft, dest, 
22ee0 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
22ef0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
22f00 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b  chePush(pParse);
22f10 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
22f20 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c  prIfTrue(pParse,
22f30 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
22f40 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
22f50 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
22f60 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61  ExprCachePop(pPa
22f70 72 73 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61  rse);.      brea
22f80 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
22f90 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20  e TK_NOT: {.    
22fa0 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
22fb0 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  IfNull==0 );.   
22fc0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
22fd0 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45  False(pParse, pE
22fe0 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74  xpr->pLeft, dest
22ff0 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
23000 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
23010 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53  }.    case TK_IS
23020 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53  :.    case TK_IS
23030 4e 4f 54 3a 0a 20 20 20 20 20 20 74 65 73 74 63  NOT:.      testc
23040 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 20 29  ase( op==TK_IS )
23050 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
23060 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29  ( op==TK_ISNOT )
23070 3b 0a 20 20 20 20 20 20 6f 70 20 3d 20 28 6f 70  ;.      op = (op
23080 3d 3d 54 4b 5f 49 53 29 20 3f 20 54 4b 5f 45 51  ==TK_IS) ? TK_EQ
23090 20 3a 20 54 4b 5f 4e 45 3b 0a 20 20 20 20 20 20   : TK_NE;.      
230a0 6a 75 6d 70 49 66 4e 75 6c 6c 20 3d 20 53 51 4c  jumpIfNull = SQL
230b0 49 54 45 5f 4e 55 4c 4c 45 51 3b 0a 20 20 20 20  ITE_NULLEQ;.    
230c0 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 75 20 2a    /* Fall thru *
230d0 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54  /.    case TK_LT
230e0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45  :.    case TK_LE
230f0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54  :.    case TK_GT
23100 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45  :.    case TK_GE
23110 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45  :.    case TK_NE
23120 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51  :.    case TK_EQ
23130 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71  : {.      if( sq
23140 6c 69 74 65 33 45 78 70 72 49 73 56 65 63 74 6f  lite3ExprIsVecto
23150 72 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 20  r(pExpr->pLeft) 
23160 29 20 67 6f 74 6f 20 64 65 66 61 75 6c 74 5f 65  ) goto default_e
23170 78 70 72 3b 0a 20 20 20 20 20 20 74 65 73 74 63  xpr;.      testc
23180 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  ase( jumpIfNull=
23190 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d  =0 );.      r1 =
231a0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
231b0 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
231c0 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46  pr->pLeft, &regF
231d0 72 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32 20  ree1);.      r2 
231e0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
231f0 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
23200 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65  xpr->pRight, &re
23210 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 63  gFree2);.      c
23220 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73  odeCompare(pPars
23230 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
23240 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
23250 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  op,.            
23260 20 20 20 20 20 20 72 31 2c 20 72 32 2c 20 64 65        r1, r2, de
23270 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
23280 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b  .      assert(TK
23290 5f 4c 54 3d 3d 4f 50 5f 4c 74 29 3b 20 74 65 73  _LT==OP_Lt); tes
232a0 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 74 29  tcase(op==OP_Lt)
232b0 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66  ; VdbeCoverageIf
232c0 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a 20  (v,op==OP_Lt);. 
232d0 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4c       assert(TK_L
232e0 45 3d 3d 4f 50 5f 4c 65 29 3b 20 74 65 73 74 63  E==OP_Le); testc
232f0 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 20  ase(op==OP_Le); 
23300 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
23310 2c 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 0a 20 20 20  ,op==OP_Le);.   
23320 20 20 20 61 73 73 65 72 74 28 54 4b 5f 47 54 3d     assert(TK_GT=
23330 3d 4f 50 5f 47 74 29 3b 20 74 65 73 74 63 61 73  =OP_Gt); testcas
23340 65 28 6f 70 3d 3d 4f 50 5f 47 74 29 3b 20 56 64  e(op==OP_Gt); Vd
23350 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f  beCoverageIf(v,o
23360 70 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20 20 20 20  p==OP_Gt);.     
23370 20 61 73 73 65 72 74 28 54 4b 5f 47 45 3d 3d 4f   assert(TK_GE==O
23380 50 5f 47 65 29 3b 20 74 65 73 74 63 61 73 65 28  P_Ge); testcase(
23390 6f 70 3d 3d 4f 50 5f 47 65 29 3b 20 56 64 62 65  op==OP_Ge); Vdbe
233a0 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d  CoverageIf(v,op=
233b0 3d 4f 50 5f 47 65 29 3b 0a 20 20 20 20 20 20 61  =OP_Ge);.      a
233c0 73 73 65 72 74 28 54 4b 5f 45 51 3d 3d 4f 50 5f  ssert(TK_EQ==OP_
233d0 45 71 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70  Eq); testcase(op
233e0 3d 3d 4f 50 5f 45 71 29 3b 0a 20 20 20 20 20 20  ==OP_Eq);.      
233f0 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
23400 2c 20 6f 70 3d 3d 4f 50 5f 45 71 20 26 26 20 6a  , op==OP_Eq && j
23410 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54  umpIfNull==SQLIT
23420 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20  E_NULLEQ);.     
23430 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
23440 76 2c 20 6f 70 3d 3d 4f 50 5f 45 71 20 26 26 20  v, op==OP_Eq && 
23450 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 53 51 4c 49  jumpIfNull!=SQLI
23460 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20  TE_NULLEQ);.    
23470 20 20 61 73 73 65 72 74 28 54 4b 5f 4e 45 3d 3d    assert(TK_NE==
23480 4f 50 5f 4e 65 29 3b 20 74 65 73 74 63 61 73 65  OP_Ne); testcase
23490 28 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 0a 20 20 20  (op==OP_Ne);.   
234a0 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
234b0 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 4e 65 20 26  f(v, op==OP_Ne &
234c0 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51  & jumpIfNull==SQ
234d0 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20  LITE_NULLEQ);.  
234e0 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
234f0 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 4e 65 20  If(v, op==OP_Ne 
23500 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 53  && jumpIfNull!=S
23510 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20  QLITE_NULLEQ);. 
23520 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
23530 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
23540 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
23550 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20  gFree2==0 );.   
23560 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
23570 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55      case TK_ISNU
23580 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  LL:.    case TK_
23590 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20  NOTNULL: {.     
235a0 20 61 73 73 65 72 74 28 20 54 4b 5f 49 53 4e 55   assert( TK_ISNU
235b0 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b  LL==OP_IsNull );
235c0 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
235d0 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20  =TK_ISNULL );.  
235e0 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e      assert( TK_N
235f0 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75  OTNULL==OP_NotNu
23600 6c 6c 20 29 3b 20 74 65 73 74 63 61 73 65 28 20  ll ); testcase( 
23610 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29  op==TK_NOTNULL )
23620 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  ;.      r1 = sql
23630 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
23640 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
23650 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31  pLeft, &regFree1
23660 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
23670 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 6f 70  VdbeAddOp2(v, op
23680 2c 20 72 31 2c 20 64 65 73 74 29 3b 0a 20 20 20  , r1, dest);.   
23690 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
236a0 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55  f(v, op==TK_ISNU
236b0 4c 4c 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  LL);.      VdbeC
236c0 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d  overageIf(v, op=
236d0 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a 20 20  =TK_NOTNULL);.  
236e0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
236f0 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20  gFree1==0 );.   
23700 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
23710 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54 57      case TK_BETW
23720 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 74 65 73  EEN: {.      tes
23730 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c  tcase( jumpIfNul
23740 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 65 78  l==0 );.      ex
23750 70 72 43 6f 64 65 42 65 74 77 65 65 6e 28 70 50  prCodeBetween(pP
23760 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64 65 73  arse, pExpr, des
23770 74 2c 20 73 71 6c 69 74 65 33 45 78 70 72 49 66  t, sqlite3ExprIf
23780 54 72 75 65 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  True, jumpIfNull
23790 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
237a0 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
237b0 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
237c0 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  RY.    case TK_I
237d0 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64  N: {.      int d
237e0 65 73 74 49 66 46 61 6c 73 65 20 3d 20 73 71 6c  estIfFalse = sql
237f0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
23800 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  l(v);.      int 
23810 64 65 73 74 49 66 4e 75 6c 6c 20 3d 20 6a 75 6d  destIfNull = jum
23820 70 49 66 4e 75 6c 6c 20 3f 20 64 65 73 74 20 3a  pIfNull ? dest :
23830 20 64 65 73 74 49 66 46 61 6c 73 65 3b 0a 20 20   destIfFalse;.  
23840 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
23850 6f 64 65 49 4e 28 70 50 61 72 73 65 2c 20 70 45  odeIN(pParse, pE
23860 78 70 72 2c 20 64 65 73 74 49 66 46 61 6c 73 65  xpr, destIfFalse
23870 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20  , destIfNull);. 
23880 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
23890 47 6f 74 6f 28 76 2c 20 64 65 73 74 29 3b 0a 20  Goto(v, dest);. 
238a0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
238b0 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
238c0 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 20 20  destIfFalse);.  
238d0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
238e0 0a 23 65 6e 64 69 66 0a 20 20 20 20 64 65 66 61  .#endif.    defa
238f0 75 6c 74 3a 20 7b 0a 20 20 20 20 64 65 66 61 75  ult: {.    defau
23900 6c 74 5f 65 78 70 72 3a 0a 20 20 20 20 20 20 69  lt_expr:.      i
23910 66 28 20 65 78 70 72 41 6c 77 61 79 73 54 72 75  f( exprAlwaysTru
23920 65 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20  e(pExpr) ){.    
23930 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47      sqlite3VdbeG
23940 6f 74 6f 28 76 2c 20 64 65 73 74 29 3b 0a 20 20  oto(v, dest);.  
23950 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 78      }else if( ex
23960 70 72 41 6c 77 61 79 73 46 61 6c 73 65 28 70 45  prAlwaysFalse(pE
23970 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  xpr) ){.        
23980 2f 2a 20 4e 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20  /* No-op */.    
23990 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
239a0 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r1 = sqlite3Exp
239b0 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
239c0 2c 20 70 45 78 70 72 2c 20 26 72 65 67 46 72 65  , pExpr, &regFre
239d0 65 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  e1);.        sql
239e0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
239f0 2c 20 4f 50 5f 49 66 2c 20 72 31 2c 20 64 65 73  , OP_If, r1, des
23a00 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30  t, jumpIfNull!=0
23a10 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43  );.        VdbeC
23a20 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
23a30 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
23a40 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20  gFree1==0 );.   
23a50 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
23a60 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
23a70 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
23a80 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
23a90 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
23aa0 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
23ab0 65 67 46 72 65 65 31 29 3b 0a 20 20 73 71 6c 69  egFree1);.  sqli
23ac0 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
23ad0 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65  g(pParse, regFre
23ae0 65 32 29 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  e2);  .}../*.** 
23af0 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
23b00 72 20 61 20 62 6f 6f 6c 65 61 6e 20 65 78 70 72  r a boolean expr
23b10 65 73 73 69 6f 6e 20 73 75 63 68 20 74 68 61 74  ession such that
23b20 20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 0a   a jump is made.
23b30 2a 2a 20 74 6f 20 74 68 65 20 6c 61 62 65 6c 20  ** to the label 
23b40 22 64 65 73 74 22 20 69 66 20 74 68 65 20 65 78  "dest" if the ex
23b50 70 72 65 73 73 69 6f 6e 20 69 73 20 66 61 6c 73  pression is fals
23b60 65 20 62 75 74 20 65 78 65 63 75 74 69 6f 6e 0a  e but execution.
23b70 2a 2a 20 63 6f 6e 74 69 6e 75 65 73 20 73 74 72  ** continues str
23b80 61 69 67 68 74 20 74 68 72 75 20 69 66 20 74 68  aight thru if th
23b90 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
23ba0 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  true..**.** If t
23bb0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 65 76  he expression ev
23bc0 61 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c 20  aluates to NULL 
23bd0 28 6e 65 69 74 68 65 72 20 74 72 75 65 20 6e 6f  (neither true no
23be0 72 20 66 61 6c 73 65 29 20 74 68 65 6e 0a 2a 2a  r false) then.**
23bf0 20 6a 75 6d 70 20 69 66 20 6a 75 6d 70 49 66 4e   jump if jumpIfN
23c00 75 6c 6c 20 69 73 20 53 51 4c 49 54 45 5f 4a 55  ull is SQLITE_JU
23c10 4d 50 49 46 4e 55 4c 4c 20 6f 72 20 66 61 6c 6c  MPIFNULL or fall
23c20 20 74 68 72 6f 75 67 68 20 69 66 20 6a 75 6d 70   through if jump
23c30 49 66 4e 75 6c 6c 0a 2a 2a 20 69 73 20 30 2e 0a  IfNull.** is 0..
23c40 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
23c50 78 70 72 49 66 46 61 6c 73 65 28 50 61 72 73 65  xprIfFalse(Parse
23c60 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
23c70 70 45 78 70 72 2c 20 69 6e 74 20 64 65 73 74 2c  pExpr, int dest,
23c80 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29   int jumpIfNull)
23c90 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
23ca0 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
23cb0 6e 74 20 6f 70 20 3d 20 30 3b 0a 20 20 69 6e 74  nt op = 0;.  int
23cc0 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b 0a 20   regFree1 = 0;. 
23cd0 20 69 6e 74 20 72 65 67 46 72 65 65 32 20 3d 20   int regFree2 = 
23ce0 30 3b 0a 20 20 69 6e 74 20 72 31 2c 20 72 32 3b  0;.  int r1, r2;
23cf0 0a 0a 20 20 61 73 73 65 72 74 28 20 6a 75 6d 70  ..  assert( jump
23d00 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4a  IfNull==SQLITE_J
23d10 55 4d 50 49 46 4e 55 4c 4c 20 7c 7c 20 6a 75 6d  UMPIFNULL || jum
23d20 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
23d30 69 66 28 20 4e 45 56 45 52 28 76 3d 3d 30 29 20  if( NEVER(v==0) 
23d40 29 20 72 65 74 75 72 6e 3b 20 2f 2a 20 45 78 69  ) return; /* Exi
23d50 73 74 65 6e 63 65 20 6f 66 20 56 44 42 45 20 63  stence of VDBE c
23d60 68 65 63 6b 65 64 20 62 79 20 63 61 6c 6c 65 72  hecked by caller
23d70 20 2a 2f 0a 20 20 69 66 28 20 70 45 78 70 72 3d   */.  if( pExpr=
23d80 3d 30 20 29 20 20 20 20 72 65 74 75 72 6e 3b 0a  =0 )    return;.
23d90 0a 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20  .  /* The value 
23da0 6f 66 20 70 45 78 70 72 2d 3e 6f 70 20 61 6e 64  of pExpr->op and
23db0 20 6f 70 20 61 72 65 20 72 65 6c 61 74 65 64 20   op are related 
23dc0 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a  as follows:.  **
23dd0 0a 20 20 2a 2a 20 20 20 20 20 20 20 70 45 78 70  .  **       pExp
23de0 72 2d 3e 6f 70 20 20 20 20 20 20 20 20 20 20 20  r->op           
23df0 20 6f 70 0a 20 20 2a 2a 20 20 20 20 20 20 20 2d   op.  **       -
23e00 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 20 20 20  --------        
23e10 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 20 2a    ----------.  *
23e20 2a 20 20 20 20 20 20 20 54 4b 5f 49 53 4e 55 4c  *       TK_ISNUL
23e30 4c 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4e 6f  L          OP_No
23e40 74 4e 75 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 20  tNull.  **      
23e50 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 20 20 20 20   TK_NOTNULL     
23e60 20 20 20 20 4f 50 5f 49 73 4e 75 6c 6c 0a 20 20      OP_IsNull.  
23e70 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4e 45 20 20  **       TK_NE  
23e80 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 45              OP_E
23e90 71 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f  q.  **       TK_
23ea0 45 51 20 20 20 20 20 20 20 20 20 20 20 20 20 20  EQ              
23eb0 4f 50 5f 4e 65 0a 20 20 2a 2a 20 20 20 20 20 20  OP_Ne.  **      
23ec0 20 54 4b 5f 47 54 20 20 20 20 20 20 20 20 20 20   TK_GT          
23ed0 20 20 20 20 4f 50 5f 4c 65 0a 20 20 2a 2a 20 20      OP_Le.  **  
23ee0 20 20 20 20 20 54 4b 5f 4c 45 20 20 20 20 20 20       TK_LE      
23ef0 20 20 20 20 20 20 20 20 4f 50 5f 47 74 0a 20 20          OP_Gt.  
23f00 2a 2a 20 20 20 20 20 20 20 54 4b 5f 47 45 20 20  **       TK_GE  
23f10 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4c              OP_L
23f20 74 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f  t.  **       TK_
23f30 4c 54 20 20 20 20 20 20 20 20 20 20 20 20 20 20  LT              
23f40 4f 50 5f 47 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20  OP_Ge.  **.  ** 
23f50 46 6f 72 20 6f 74 68 65 72 20 76 61 6c 75 65 73  For other values
23f60 20 6f 66 20 70 45 78 70 72 2d 3e 6f 70 2c 20 6f   of pExpr->op, o
23f70 70 20 69 73 20 75 6e 64 65 66 69 6e 65 64 20 61  p is undefined a
23f80 6e 64 20 75 6e 75 73 65 64 2e 0a 20 20 2a 2a 20  nd unused..  ** 
23f90 54 68 65 20 76 61 6c 75 65 20 6f 66 20 54 4b 5f  The value of TK_
23fa0 20 61 6e 64 20 4f 50 5f 20 63 6f 6e 73 74 61 6e   and OP_ constan
23fb0 74 73 20 61 72 65 20 61 72 72 61 6e 67 65 64 20  ts are arranged 
23fc0 73 75 63 68 20 74 68 61 74 20 77 65 0a 20 20 2a  such that we.  *
23fd0 2a 20 63 61 6e 20 63 6f 6d 70 75 74 65 20 74 68  * can compute th
23fe0 65 20 6d 61 70 70 69 6e 67 20 61 62 6f 76 65 20  e mapping above 
23ff0 75 73 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77  using the follow
24000 69 6e 67 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a  ing expression..
24010 20 20 2a 2a 20 41 73 73 65 72 74 28 29 73 20 76    ** Assert()s v
24020 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20 63  erify that the c
24030 6f 6d 70 75 74 61 74 69 6f 6e 20 69 73 20 63 6f  omputation is co
24040 72 72 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 6f 70  rrect..  */.  op
24050 20 3d 20 28 28 70 45 78 70 72 2d 3e 6f 70 2b 28   = ((pExpr->op+(
24060 54 4b 5f 49 53 4e 55 4c 4c 26 31 29 29 5e 31 29  TK_ISNULL&1))^1)
24070 2d 28 54 4b 5f 49 53 4e 55 4c 4c 26 31 29 3b 0a  -(TK_ISNULL&1);.
24080 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 63 6f 72  .  /* Verify cor
24090 72 65 63 74 20 61 6c 69 67 6e 6d 65 6e 74 20 6f  rect alignment o
240a0 66 20 54 4b 5f 20 61 6e 64 20 4f 50 5f 20 63 6f  f TK_ and OP_ co
240b0 6e 73 74 61 6e 74 73 0a 20 20 2a 2f 0a 20 20 61  nstants.  */.  a
240c0 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
240d0 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20 7c 7c 20 6f  !=TK_ISNULL || o
240e0 70 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b  p==OP_NotNull );
240f0 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
24100 2d 3e 6f 70 21 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c  ->op!=TK_NOTNULL
24110 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 49 73 4e 75 6c   || op==OP_IsNul
24120 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  l );.  assert( p
24130 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 45 20  Expr->op!=TK_NE 
24140 7c 7c 20 6f 70 3d 3d 4f 50 5f 45 71 20 29 3b 0a  || op==OP_Eq );.
24150 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
24160 3e 6f 70 21 3d 54 4b 5f 45 51 20 7c 7c 20 6f 70  >op!=TK_EQ || op
24170 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20 61 73 73  ==OP_Ne );.  ass
24180 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d  ert( pExpr->op!=
24190 54 4b 5f 4c 54 20 7c 7c 20 6f 70 3d 3d 4f 50 5f  TK_LT || op==OP_
241a0 47 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Ge );.  assert( 
241b0 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4c 45  pExpr->op!=TK_LE
241c0 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 74 20 29 3b   || op==OP_Gt );
241d0 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
241e0 2d 3e 6f 70 21 3d 54 4b 5f 47 54 20 7c 7c 20 6f  ->op!=TK_GT || o
241f0 70 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20 61 73  p==OP_Le );.  as
24200 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21  sert( pExpr->op!
24210 3d 54 4b 5f 47 45 20 7c 7c 20 6f 70 3d 3d 4f 50  =TK_GE || op==OP
24220 5f 4c 74 20 29 3b 0a 0a 20 20 73 77 69 74 63 68  _Lt );..  switch
24230 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20  ( pExpr->op ){. 
24240 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20     case TK_AND: 
24250 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
24260 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  ( jumpIfNull==0 
24270 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
24280 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
24290 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
242a0 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
242b0 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ll);.      sqlit
242c0 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28  e3ExprCachePush(
242d0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73  pParse);.      s
242e0 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
242f0 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
24300 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a  >pRight, dest, j
24310 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
24320 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
24330 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20  hePop(pParse);. 
24340 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
24350 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52  }.    case TK_OR
24360 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 32  : {.      int d2
24370 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
24380 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
24390 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
243a0 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  IfNull==0 );.   
243b0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
243c0 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78  True(pParse, pEx
243d0 70 72 2d 3e 70 4c 65 66 74 2c 20 64 32 2c 20 6a  pr->pLeft, d2, j
243e0 75 6d 70 49 66 4e 75 6c 6c 5e 53 51 4c 49 54 45  umpIfNull^SQLITE
243f0 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20  _JUMPIFNULL);.  
24400 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
24410 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29  achePush(pParse)
24420 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
24430 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
24440 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  e, pExpr->pRight
24450 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
24460 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ll);.      sqlit
24470 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
24480 65 6c 28 76 2c 20 64 32 29 3b 0a 20 20 20 20 20  el(v, d2);.     
24490 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
244a0 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20  ePop(pParse);.  
244b0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
244c0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54  .    case TK_NOT
244d0 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61  : {.      testca
244e0 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  se( jumpIfNull==
244f0 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 );.      sqlit
24500 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61  e3ExprIfTrue(pPa
24510 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
24520 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  t, dest, jumpIfN
24530 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ull);.      brea
24540 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
24550 65 20 54 4b 5f 49 53 3a 0a 20 20 20 20 63 61 73  e TK_IS:.    cas
24560 65 20 54 4b 5f 49 53 4e 4f 54 3a 0a 20 20 20 20  e TK_ISNOT:.    
24570 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
24580 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a  r->op==TK_IS );.
24590 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
245a0 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53  pExpr->op==TK_IS
245b0 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20 6f 70 20  NOT );.      op 
245c0 3d 20 28 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  = (pExpr->op==TK
245d0 5f 49 53 29 20 3f 20 54 4b 5f 4e 45 20 3a 20 54  _IS) ? TK_NE : T
245e0 4b 5f 45 51 3b 0a 20 20 20 20 20 20 6a 75 6d 70  K_EQ;.      jump
245f0 49 66 4e 75 6c 6c 20 3d 20 53 51 4c 49 54 45 5f  IfNull = SQLITE_
24600 4e 55 4c 4c 45 51 3b 0a 20 20 20 20 20 20 2f 2a  NULLEQ;.      /*
24610 20 46 61 6c 6c 20 74 68 72 75 20 2a 2f 0a 20 20   Fall thru */.  
24620 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20    case TK_LT:.  
24630 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20    case TK_LE:.  
24640 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20    case TK_GT:.  
24650 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20    case TK_GE:.  
24660 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20    case TK_NE:.  
24670 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a    case TK_EQ: {.
24680 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
24690 33 45 78 70 72 49 73 56 65 63 74 6f 72 28 70 45  3ExprIsVector(pE
246a0 78 70 72 2d 3e 70 4c 65 66 74 29 20 29 20 67 6f  xpr->pLeft) ) go
246b0 74 6f 20 64 65 66 61 75 6c 74 5f 65 78 70 72 3b  to default_expr;
246c0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
246d0 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
246e0 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  ;.      r1 = sql
246f0 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
24700 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
24710 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31  pLeft, &regFree1
24720 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71  );.      r2 = sq
24730 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
24740 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
24750 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46 72 65  >pRight, &regFre
24760 65 32 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43  e2);.      codeC
24770 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70  ompare(pParse, p
24780 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78  Expr->pLeft, pEx
24790 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a  pr->pRight, op,.
247a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
247b0 20 20 72 31 2c 20 72 32 2c 20 64 65 73 74 2c 20    r1, r2, dest, 
247c0 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
247d0 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4c 54 3d     assert(TK_LT=
247e0 3d 4f 50 5f 4c 74 29 3b 20 74 65 73 74 63 61 73  =OP_Lt); testcas
247f0 65 28 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 20 56 64  e(op==OP_Lt); Vd
24800 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f  beCoverageIf(v,o
24810 70 3d 3d 4f 50 5f 4c 74 29 3b 0a 20 20 20 20 20  p==OP_Lt);.     
24820 20 61 73 73 65 72 74 28 54 4b 5f 4c 45 3d 3d 4f   assert(TK_LE==O
24830 50 5f 4c 65 29 3b 20 74 65 73 74 63 61 73 65 28  P_Le); testcase(
24840 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 20 56 64 62 65  op==OP_Le); Vdbe
24850 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d  CoverageIf(v,op=
24860 3d 4f 50 5f 4c 65 29 3b 0a 20 20 20 20 20 20 61  =OP_Le);.      a
24870 73 73 65 72 74 28 54 4b 5f 47 54 3d 3d 4f 50 5f  ssert(TK_GT==OP_
24880 47 74 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70  Gt); testcase(op
24890 3d 3d 4f 50 5f 47 74 29 3b 20 56 64 62 65 43 6f  ==OP_Gt); VdbeCo
248a0 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f  verageIf(v,op==O
248b0 50 5f 47 74 29 3b 0a 20 20 20 20 20 20 61 73 73  P_Gt);.      ass
248c0 65 72 74 28 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65  ert(TK_GE==OP_Ge
248d0 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d  ); testcase(op==
248e0 4f 50 5f 47 65 29 3b 20 56 64 62 65 43 6f 76 65  OP_Ge); VdbeCove
248f0 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f  rageIf(v,op==OP_
24900 47 65 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Ge);.      asser
24910 74 28 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71 29 3b  t(TK_EQ==OP_Eq);
24920 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50   testcase(op==OP
24930 5f 45 71 29 3b 0a 20 20 20 20 20 20 56 64 62 65  _Eq);.      Vdbe
24940 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70  CoverageIf(v, op
24950 3d 3d 4f 50 5f 45 71 20 26 26 20 6a 75 6d 70 49  ==OP_Eq && jumpI
24960 66 4e 75 6c 6c 21 3d 53 51 4c 49 54 45 5f 4e 55  fNull!=SQLITE_NU
24970 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 56 64 62  LLEQ);.      Vdb
24980 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f  eCoverageIf(v, o
24990 70 3d 3d 4f 50 5f 45 71 20 26 26 20 6a 75 6d 70  p==OP_Eq && jump
249a0 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4e  IfNull==SQLITE_N
249b0 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 61 73  ULLEQ);.      as
249c0 73 65 72 74 28 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e  sert(TK_NE==OP_N
249d0 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d  e); testcase(op=
249e0 3d 4f 50 5f 4e 65 29 3b 0a 20 20 20 20 20 20 56  =OP_Ne);.      V
249f0 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
24a00 20 6f 70 3d 3d 4f 50 5f 4e 65 20 26 26 20 6a 75   op==OP_Ne && ju
24a10 6d 70 49 66 4e 75 6c 6c 21 3d 53 51 4c 49 54 45  mpIfNull!=SQLITE
24a20 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20  _NULLEQ);.      
24a30 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
24a40 2c 20 6f 70 3d 3d 4f 50 5f 4e 65 20 26 26 20 6a  , op==OP_Ne && j
24a50 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54  umpIfNull==SQLIT
24a60 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20  E_NULLEQ);.     
24a70 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
24a80 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee1==0 );.      
24a90 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
24aa0 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62  e2==0 );.      b
24ab0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
24ac0 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a  case TK_ISNULL:.
24ad0 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e      case TK_NOTN
24ae0 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 72 31 20  ULL: {.      r1 
24af0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
24b00 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
24b10 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67  xpr->pLeft, &reg
24b20 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 73 71  Free1);.      sq
24b30 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
24b40 76 2c 20 6f 70 2c 20 72 31 2c 20 64 65 73 74 29  v, op, r1, dest)
24b50 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
24b60 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20  ( op==TK_ISNULL 
24b70 29 3b 20 20 20 56 64 62 65 43 6f 76 65 72 61 67  );   VdbeCoverag
24b80 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 49 53  eIf(v, op==TK_IS
24b90 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 74 65 73  NULL);.      tes
24ba0 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f  tcase( op==TK_NO
24bb0 54 4e 55 4c 4c 20 29 3b 20 20 56 64 62 65 43 6f  TNULL );  VdbeCo
24bc0 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
24bd0 54 4b 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a 20 20 20  TK_NOTNULL);.   
24be0 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
24bf0 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
24c00 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
24c10 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45     case TK_BETWE
24c20 45 4e 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74  EN: {.      test
24c30 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  case( jumpIfNull
24c40 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 65 78 70  ==0 );.      exp
24c50 72 43 6f 64 65 42 65 74 77 65 65 6e 28 70 50 61  rCodeBetween(pPa
24c60 72 73 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74  rse, pExpr, dest
24c70 2c 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46  , sqlite3ExprIfF
24c80 61 6c 73 65 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  alse, jumpIfNull
24c90 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
24ca0 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
24cb0 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
24cc0 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  RY.    case TK_I
24cd0 4e 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 6a  N: {.      if( j
24ce0 75 6d 70 49 66 4e 75 6c 6c 20 29 7b 0a 20 20 20  umpIfNull ){.   
24cf0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
24d00 43 6f 64 65 49 4e 28 70 50 61 72 73 65 2c 20 70  CodeIN(pParse, p
24d10 45 78 70 72 2c 20 64 65 73 74 2c 20 64 65 73 74  Expr, dest, dest
24d20 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
24d30 20 20 20 20 20 20 20 20 69 6e 74 20 64 65 73 74          int dest
24d40 49 66 4e 75 6c 6c 20 3d 20 73 71 6c 69 74 65 33  IfNull = sqlite3
24d50 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
24d60 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
24d70 33 45 78 70 72 43 6f 64 65 49 4e 28 70 50 61 72  3ExprCodeIN(pPar
24d80 73 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74 2c  se, pExpr, dest,
24d90 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20   destIfNull);.  
24da0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
24db0 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
24dc0 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20   destIfNull);.  
24dd0 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
24de0 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
24df0 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
24e00 20 20 20 64 65 66 61 75 6c 74 5f 65 78 70 72 3a     default_expr:
24e10 20 0a 20 20 20 20 20 20 69 66 28 20 65 78 70 72   .      if( expr
24e20 41 6c 77 61 79 73 46 61 6c 73 65 28 70 45 78 70  AlwaysFalse(pExp
24e30 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  r) ){.        sq
24e40 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c  lite3VdbeGoto(v,
24e50 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 7d 65   dest);.      }e
24e60 6c 73 65 20 69 66 28 20 65 78 70 72 41 6c 77 61  lse if( exprAlwa
24e70 79 73 54 72 75 65 28 70 45 78 70 72 29 20 29 7b  ysTrue(pExpr) ){
24e80 0a 20 20 20 20 20 20 20 20 2f 2a 20 6e 6f 2d 6f  .        /* no-o
24e90 70 20 2a 2f 0a 20 20 20 20 20 20 7d 65 6c 73 65  p */.      }else
24ea0 7b 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20 73  {.        r1 = s
24eb0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
24ec0 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
24ed0 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20  , &regFree1);.  
24ee0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
24ef0 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66  eAddOp3(v, OP_If
24f00 4e 6f 74 2c 20 72 31 2c 20 64 65 73 74 2c 20 6a  Not, r1, dest, j
24f10 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 29 3b 0a 20  umpIfNull!=0);. 
24f20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
24f30 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
24f40 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
24f50 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  e1==0 );.       
24f60 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
24f70 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  fNull==0 );.    
24f80 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
24f90 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
24fa0 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
24fb0 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72  eg(pParse, regFr
24fc0 65 65 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 52  ee1);.  sqlite3R
24fd0 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
24fe0 61 72 73 65 2c 20 72 65 67 46 72 65 65 32 29 3b  arse, regFree2);
24ff0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 69 6b 65 20 73  .}../*.** Like s
25000 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
25010 65 28 29 20 65 78 63 65 70 74 20 74 68 61 74 20  e() except that 
25020 61 20 63 6f 70 79 20 69 73 20 6d 61 64 65 20 6f  a copy is made o
25030 66 20 70 45 78 70 72 20 62 65 66 6f 72 65 0a 2a  f pExpr before.*
25040 2a 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6f  * code generatio
25050 6e 2c 20 61 6e 64 20 74 68 61 74 20 63 6f 70 79  n, and that copy
25060 20 69 73 20 64 65 6c 65 74 65 64 20 61 66 74 65   is deleted afte
25070 72 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6f  r code generatio
25080 6e 2e 20 54 68 69 73 0a 2a 2a 20 65 6e 73 75 72  n. This.** ensur
25090 65 73 20 74 68 61 74 20 74 68 65 20 6f 72 69 67  es that the orig
250a0 69 6e 61 6c 20 70 45 78 70 72 20 69 73 20 75 6e  inal pExpr is un
250b0 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 76 6f 69 64  changed..*/.void
250c0 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
250d0 6c 73 65 44 75 70 28 50 61 72 73 65 20 2a 70 50  lseDup(Parse *pP
250e0 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
250f0 72 2c 20 69 6e 74 20 64 65 73 74 2c 69 6e 74 20  r, int dest,int 
25100 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 73  jumpIfNull){.  s
25110 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
25120 72 73 65 2d 3e 64 62 3b 0a 20 20 45 78 70 72 20  rse->db;.  Expr 
25130 2a 70 43 6f 70 79 20 3d 20 73 71 6c 69 74 65 33  *pCopy = sqlite3
25140 45 78 70 72 44 75 70 28 64 62 2c 20 70 45 78 70  ExprDup(db, pExp
25150 72 2c 20 30 29 3b 0a 20 20 69 66 28 20 64 62 2d  r, 0);.  if( db-
25160 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30  >mallocFailed==0
25170 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
25180 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
25190 65 2c 20 70 43 6f 70 79 2c 20 64 65 73 74 2c 20  e, pCopy, dest, 
251a0 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 7d  jumpIfNull);.  }
251b0 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  .  sqlite3ExprDe
251c0 6c 65 74 65 28 64 62 2c 20 70 43 6f 70 79 29 3b  lete(db, pCopy);
251d0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 61 20  .}.../*.** Do a 
251e0 64 65 65 70 20 63 6f 6d 70 61 72 69 73 6f 6e 20  deep comparison 
251f0 6f 66 20 74 77 6f 20 65 78 70 72 65 73 73 69 6f  of two expressio
25200 6e 20 74 72 65 65 73 2e 20 20 52 65 74 75 72 6e  n trees.  Return
25210 20 30 20 69 66 20 74 68 65 20 74 77 6f 0a 2a 2a   0 if the two.**
25220 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65   expressions are
25230 20 63 6f 6d 70 6c 65 74 65 6c 79 20 69 64 65 6e   completely iden
25240 74 69 63 61 6c 2e 20 20 52 65 74 75 72 6e 20 31  tical.  Return 1
25250 20 69 66 20 74 68 65 79 20 64 69 66 66 65 72 20   if they differ 
25260 6f 6e 6c 79 0a 2a 2a 20 62 79 20 61 20 43 4f 4c  only.** by a COL
25270 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 20 61 74  LATE operator at
25280 20 74 68 65 20 74 6f 70 20 6c 65 76 65 6c 2e 20   the top level. 
25290 20 52 65 74 75 72 6e 20 32 20 69 66 20 74 68 65   Return 2 if the
252a0 72 65 20 61 72 65 20 64 69 66 66 65 72 65 6e 63  re are differenc
252b0 65 73 0a 2a 2a 20 6f 74 68 65 72 20 74 68 61 6e  es.** other than
252c0 20 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c 20 43   the top-level C
252d0 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 2e  OLLATE operator.
252e0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 20 73 75  .**.** If any su
252f0 62 65 6c 65 6d 65 6e 74 20 6f 66 20 70 42 20 68  belement of pB h
25300 61 73 20 45 78 70 72 2e 69 54 61 62 6c 65 3d 3d  as Expr.iTable==
25310 28 2d 31 29 20 74 68 65 6e 20 69 74 20 69 73 20  (-1) then it is 
25320 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 63 6f  allowed.** to co
25330 6d 70 61 72 65 20 65 71 75 61 6c 20 74 6f 20 61  mpare equal to a
25340 6e 20 65 71 75 69 76 61 6c 65 6e 74 20 65 6c 65  n equivalent ele
25350 6d 65 6e 74 20 69 6e 20 70 41 20 77 69 74 68 20  ment in pA with 
25360 45 78 70 72 2e 69 54 61 62 6c 65 3d 3d 69 54 61  Expr.iTable==iTa
25370 62 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 41 20  b..**.** The pA 
25380 73 69 64 65 20 6d 69 67 68 74 20 62 65 20 75 73  side might be us
25390 69 6e 67 20 54 4b 5f 52 45 47 49 53 54 45 52 2e  ing TK_REGISTER.
253a0 20 20 49 66 20 74 68 61 74 20 69 73 20 74 68 65    If that is the
253b0 20 63 61 73 65 20 61 6e 64 20 70 42 20 69 73 0a   case and pB is.
253c0 2a 2a 20 6e 6f 74 20 75 73 69 6e 67 20 54 4b 5f  ** not using TK_
253d0 52 45 47 49 53 54 45 52 20 62 75 74 20 69 73 20  REGISTER but is 
253e0 6f 74 68 65 72 77 69 73 65 20 65 71 75 69 76 61  otherwise equiva
253f0 6c 65 6e 74 2c 20 74 68 65 6e 20 73 74 69 6c 6c  lent, then still
25400 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2a 0a 2a 2a   return 0..**.**
25410 20 53 6f 6d 65 74 69 6d 65 73 20 74 68 69 73 20   Sometimes this 
25420 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74  routine will ret
25430 75 72 6e 20 32 20 65 76 65 6e 20 69 66 20 74 68  urn 2 even if th
25440 65 20 74 77 6f 20 65 78 70 72 65 73 73 69 6f 6e  e two expression
25450 73 0a 2a 2a 20 72 65 61 6c 6c 79 20 61 72 65 20  s.** really are 
25460 65 71 75 69 76 61 6c 65 6e 74 2e 20 20 49 66 20  equivalent.  If 
25470 77 65 20 63 61 6e 6e 6f 74 20 70 72 6f 76 65 20  we cannot prove 
25480 74 68 61 74 20 74 68 65 20 65 78 70 72 65 73 73  that the express
25490 69 6f 6e 73 20 61 72 65 0a 2a 2a 20 69 64 65 6e  ions are.** iden
254a0 74 69 63 61 6c 2c 20 77 65 20 72 65 74 75 72 6e  tical, we return
254b0 20 32 20 6a 75 73 74 20 74 6f 20 62 65 20 73 61   2 just to be sa
254c0 66 65 2e 20 20 53 6f 20 69 66 20 74 68 69 73 20  fe.  So if this 
254d0 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72  routine.** retur
254e0 6e 73 20 32 2c 20 74 68 65 6e 20 79 6f 75 20 64  ns 2, then you d
254f0 6f 20 6e 6f 74 20 72 65 61 6c 6c 79 20 6b 6e 6f  o not really kno
25500 77 20 66 6f 72 20 63 65 72 74 61 69 6e 20 69 66  w for certain if
25510 20 74 68 65 20 74 77 6f 0a 2a 2a 20 65 78 70 72   the two.** expr
25520 65 73 73 69 6f 6e 73 20 61 72 65 20 74 68 65 20  essions are the 
25530 73 61 6d 65 2e 20 20 42 75 74 20 69 66 20 79 6f  same.  But if yo
25540 75 20 67 65 74 20 61 20 30 20 6f 72 20 31 20 72  u get a 0 or 1 r
25550 65 74 75 72 6e 2c 20 74 68 65 6e 20 79 6f 75 0a  eturn, then you.
25560 2a 2a 20 63 61 6e 20 62 65 20 73 75 72 65 20 74  ** can be sure t
25570 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61  he expressions a
25580 72 65 20 74 68 65 20 73 61 6d 65 2e 20 20 49 6e  re the same.  In
25590 20 74 68 65 20 70 6c 61 63 65 73 20 77 68 65 72   the places wher
255a0 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  e.** this routin
255b0 65 20 69 73 20 75 73 65 64 2c 20 69 74 20 64 6f  e is used, it do
255c0 65 73 20 6e 6f 74 20 68 75 72 74 20 74 6f 20 67  es not hurt to g
255d0 65 74 20 61 6e 20 65 78 74 72 61 20 32 20 2d 20  et an extra 2 - 
255e0 74 68 61 74 0a 2a 2a 20 6a 75 73 74 20 6d 69 67  that.** just mig
255f0 68 74 20 72 65 73 75 6c 74 20 69 6e 20 73 6f 6d  ht result in som
25600 65 20 73 6c 69 67 68 74 6c 79 20 73 6c 6f 77 65  e slightly slowe
25610 72 20 63 6f 64 65 2e 20 20 42 75 74 20 72 65 74  r code.  But ret
25620 75 72 6e 69 6e 67 0a 2a 2a 20 61 6e 20 69 6e 63  urning.** an inc
25630 6f 72 72 65 63 74 20 30 20 6f 72 20 31 20 63 6f  orrect 0 or 1 co
25640 75 6c 64 20 6c 65 61 64 20 74 6f 20 61 20 6d 61  uld lead to a ma
25650 6c 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e  lfunction..*/.in
25660 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  t sqlite3ExprCom
25670 70 61 72 65 28 45 78 70 72 20 2a 70 41 2c 20 45  pare(Expr *pA, E
25680 78 70 72 20 2a 70 42 2c 20 69 6e 74 20 69 54 61  xpr *pB, int iTa
25690 62 29 7b 0a 20 20 75 33 32 20 63 6f 6d 62 69 6e  b){.  u32 combin
256a0 65 64 46 6c 61 67 73 3b 0a 20 20 69 66 28 20 70  edFlags;.  if( p
256b0 41 3d 3d 30 20 7c 7c 20 70 42 3d 3d 30 20 29 7b  A==0 || pB==0 ){
256c0 0a 20 20 20 20 72 65 74 75 72 6e 20 70 42 3d 3d  .    return pB==
256d0 70 41 20 3f 20 30 20 3a 20 32 3b 0a 20 20 7d 0a  pA ? 0 : 2;.  }.
256e0 20 20 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20    combinedFlags 
256f0 3d 20 70 41 2d 3e 66 6c 61 67 73 20 7c 20 70 42  = pA->flags | pB
25700 2d 3e 66 6c 61 67 73 3b 0a 20 20 69 66 28 20 63  ->flags;.  if( c
25710 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20 26 20 45  ombinedFlags & E
25720 50 5f 49 6e 74 56 61 6c 75 65 20 29 7b 0a 20 20  P_IntValue ){.  
25730 20 20 69 66 28 20 28 70 41 2d 3e 66 6c 61 67 73    if( (pA->flags
25740 26 70 42 2d 3e 66 6c 61 67 73 26 45 50 5f 49 6e  &pB->flags&EP_In
25750 74 56 61 6c 75 65 29 21 3d 30 20 26 26 20 70 41  tValue)!=0 && pA
25760 2d 3e 75 2e 69 56 61 6c 75 65 3d 3d 70 42 2d 3e  ->u.iValue==pB->
25770 75 2e 69 56 61 6c 75 65 20 29 7b 0a 20 20 20 20  u.iValue ){.    
25780 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
25790 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a  }.    return 2;.
257a0 20 20 7d 0a 20 20 69 66 28 20 70 41 2d 3e 6f 70    }.  if( pA->op
257b0 21 3d 70 42 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  !=pB->op ){.    
257c0 69 66 28 20 70 41 2d 3e 6f 70 3d 3d 54 4b 5f 43  if( pA->op==TK_C
257d0 4f 4c 4c 41 54 45 20 26 26 20 73 71 6c 69 74 65  OLLATE && sqlite
257e0 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 41 2d  3ExprCompare(pA-
257f0 3e 70 4c 65 66 74 2c 20 70 42 2c 20 69 54 61 62  >pLeft, pB, iTab
25800 29 3c 32 20 29 7b 0a 20 20 20 20 20 20 72 65 74  )<2 ){.      ret
25810 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 1;.    }.   
25820 20 69 66 28 20 70 42 2d 3e 6f 70 3d 3d 54 4b 5f   if( pB->op==TK_
25830 43 4f 4c 4c 41 54 45 20 26 26 20 73 71 6c 69 74  COLLATE && sqlit
25840 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 41  e3ExprCompare(pA
25850 2c 20 70 42 2d 3e 70 4c 65 66 74 2c 20 69 54 61  , pB->pLeft, iTa
25860 62 29 3c 32 20 29 7b 0a 20 20 20 20 20 20 72 65  b)<2 ){.      re
25870 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
25880 20 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 7d 0a    return 2;.  }.
25890 20 20 69 66 28 20 70 41 2d 3e 6f 70 21 3d 54 4b    if( pA->op!=TK
258a0 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 41 2d 3e 6f  _COLUMN && pA->o
258b0 70 21 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  p!=TK_AGG_COLUMN
258c0 20 26 26 20 70 41 2d 3e 75 2e 7a 54 6f 6b 65 6e   && pA->u.zToken
258d0 20 29 7b 0a 20 20 20 20 69 66 28 20 70 41 2d 3e   ){.    if( pA->
258e0 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20  op==TK_FUNCTION 
258f0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  ){.      if( sql
25900 69 74 65 33 53 74 72 49 43 6d 70 28 70 41 2d 3e  ite3StrICmp(pA->
25910 75 2e 7a 54 6f 6b 65 6e 2c 70 42 2d 3e 75 2e 7a  u.zToken,pB->u.z
25920 54 6f 6b 65 6e 29 21 3d 30 20 29 20 72 65 74 75  Token)!=0 ) retu
25930 72 6e 20 32 3b 0a 20 20 20 20 7d 65 6c 73 65 20  rn 2;.    }else 
25940 69 66 28 20 73 74 72 63 6d 70 28 70 41 2d 3e 75  if( strcmp(pA->u
25950 2e 7a 54 6f 6b 65 6e 2c 70 42 2d 3e 75 2e 7a 54  .zToken,pB->u.zT
25960 6f 6b 65 6e 29 21 3d 30 20 29 7b 0a 20 20 20 20  oken)!=0 ){.    
25970 20 20 72 65 74 75 72 6e 20 70 41 2d 3e 6f 70 3d    return pA->op=
25980 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 3f 20 31 20  =TK_COLLATE ? 1 
25990 3a 20 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  : 2;.    }.  }. 
259a0 20 69 66 28 20 28 70 41 2d 3e 66 6c 61 67 73 20   if( (pA->flags 
259b0 26 20 45 50 5f 44 69 73 74 69 6e 63 74 29 21 3d  & EP_Distinct)!=
259c0 28 70 42 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  (pB->flags & EP_
259d0 44 69 73 74 69 6e 63 74 29 20 29 20 72 65 74 75  Distinct) ) retu
259e0 72 6e 20 32 3b 0a 20 20 69 66 28 20 41 4c 57 41  rn 2;.  if( ALWA
259f0 59 53 28 28 63 6f 6d 62 69 6e 65 64 46 6c 61 67  YS((combinedFlag
25a00 73 20 26 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  s & EP_TokenOnly
25a10 29 3d 3d 30 29 20 29 7b 0a 20 20 20 20 69 66 28  )==0) ){.    if(
25a20 20 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20 26   combinedFlags &
25a30 20 45 50 5f 78 49 73 53 65 6c 65 63 74 20 29 20   EP_xIsSelect ) 
25a40 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 69 66  return 2;.    if
25a50 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  ( sqlite3ExprCom
25a60 70 61 72 65 28 70 41 2d 3e 70 4c 65 66 74 2c 20  pare(pA->pLeft, 
25a70 70 42 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 29  pB->pLeft, iTab)
25a80 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20   ) return 2;.   
25a90 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
25aa0 43 6f 6d 70 61 72 65 28 70 41 2d 3e 70 52 69 67  Compare(pA->pRig
25ab0 68 74 2c 20 70 42 2d 3e 70 52 69 67 68 74 2c 20  ht, pB->pRight, 
25ac0 69 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 32  iTab) ) return 2
25ad0 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
25ae0 33 45 78 70 72 4c 69 73 74 43 6f 6d 70 61 72 65  3ExprListCompare
25af0 28 70 41 2d 3e 78 2e 70 4c 69 73 74 2c 20 70 42  (pA->x.pList, pB
25b00 2d 3e 78 2e 70 4c 69 73 74 2c 20 69 54 61 62 29  ->x.pList, iTab)
25b10 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20   ) return 2;.   
25b20 20 69 66 28 20 41 4c 57 41 59 53 28 28 63 6f 6d   if( ALWAYS((com
25b30 62 69 6e 65 64 46 6c 61 67 73 20 26 20 45 50 5f  binedFlags & EP_
25b40 52 65 64 75 63 65 64 29 3d 3d 30 29 20 26 26 20  Reduced)==0) && 
25b50 70 41 2d 3e 6f 70 21 3d 54 4b 5f 53 54 52 49 4e  pA->op!=TK_STRIN
25b60 47 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  G ){.      if( p
25b70 41 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70 42 2d 3e  A->iColumn!=pB->
25b80 69 43 6f 6c 75 6d 6e 20 29 20 72 65 74 75 72 6e  iColumn ) return
25b90 20 32 3b 0a 20 20 20 20 20 20 69 66 28 20 70 41   2;.      if( pA
25ba0 2d 3e 69 54 61 62 6c 65 21 3d 70 42 2d 3e 69 54  ->iTable!=pB->iT
25bb0 61 62 6c 65 20 0a 20 20 20 20 20 20 20 26 26 20  able .       && 
25bc0 28 70 41 2d 3e 69 54 61 62 6c 65 21 3d 69 54 61  (pA->iTable!=iTa
25bd0 62 20 7c 7c 20 4e 45 56 45 52 28 70 42 2d 3e 69  b || NEVER(pB->i
25be0 54 61 62 6c 65 3e 3d 30 29 29 20 29 20 72 65 74  Table>=0)) ) ret
25bf0 75 72 6e 20 32 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 2;.    }.  }
25c00 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
25c10 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 77  /*.** Compare tw
25c20 6f 20 45 78 70 72 4c 69 73 74 20 6f 62 6a 65 63  o ExprList objec
25c30 74 73 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66  ts.  Return 0 if
25c40 20 74 68 65 79 20 61 72 65 20 69 64 65 6e 74 69   they are identi
25c50 63 61 6c 20 61 6e 64 20 0a 2a 2a 20 6e 6f 6e 2d  cal and .** non-
25c60 7a 65 72 6f 20 69 66 20 74 68 65 79 20 64 69 66  zero if they dif
25c70 66 65 72 20 69 6e 20 61 6e 79 20 77 61 79 2e 0a  fer in any way..
25c80 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 20 73 75 62  **.** If any sub
25c90 65 6c 65 6d 65 6e 74 20 6f 66 20 70 42 20 68 61  element of pB ha
25ca0 73 20 45 78 70 72 2e 69 54 61 62 6c 65 3d 3d 28  s Expr.iTable==(
25cb0 2d 31 29 20 74 68 65 6e 20 69 74 20 69 73 20 61  -1) then it is a
25cc0 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 63 6f 6d  llowed.** to com
25cd0 70 61 72 65 20 65 71 75 61 6c 20 74 6f 20 61 6e  pare equal to an
25ce0 20 65 71 75 69 76 61 6c 65 6e 74 20 65 6c 65 6d   equivalent elem
25cf0 65 6e 74 20 69 6e 20 70 41 20 77 69 74 68 20 45  ent in pA with E
25d00 78 70 72 2e 69 54 61 62 6c 65 3d 3d 69 54 61 62  xpr.iTable==iTab
25d10 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
25d20 74 69 6e 65 20 6d 69 67 68 74 20 72 65 74 75 72  tine might retur
25d30 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 66 6f 72 20 65  n non-zero for e
25d40 71 75 69 76 61 6c 65 6e 74 20 45 78 70 72 4c 69  quivalent ExprLi
25d50 73 74 73 2e 20 20 54 68 65 0a 2a 2a 20 6f 6e 6c  sts.  The.** onl
25d60 79 20 63 6f 6e 73 65 71 75 65 6e 63 65 20 77 69  y consequence wi
25d70 6c 6c 20 62 65 20 64 69 73 61 62 6c 65 64 20 6f  ll be disabled o
25d80 70 74 69 6d 69 7a 61 74 69 6f 6e 73 2e 20 20 42  ptimizations.  B
25d90 75 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  ut this routine.
25da0 2a 2a 20 6d 75 73 74 20 6e 65 76 65 72 20 72 65  ** must never re
25db0 74 75 72 6e 20 30 20 69 66 20 74 68 65 20 74 77  turn 0 if the tw
25dc0 6f 20 45 78 70 72 4c 69 73 74 20 6f 62 6a 65 63  o ExprList objec
25dd0 74 73 20 61 72 65 20 64 69 66 66 65 72 65 6e 74  ts are different
25de0 2c 20 6f 72 0a 2a 2a 20 61 20 6d 61 6c 66 75 6e  , or.** a malfun
25df0 63 74 69 6f 6e 20 77 69 6c 6c 20 72 65 73 75 6c  ction will resul
25e00 74 2e 0a 2a 2a 0a 2a 2a 20 54 77 6f 20 4e 55 4c  t..**.** Two NUL
25e10 4c 20 70 6f 69 6e 74 65 72 73 20 61 72 65 20 63  L pointers are c
25e20 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65 20  onsidered to be 
25e30 74 68 65 20 73 61 6d 65 2e 20 20 42 75 74 20 61  the same.  But a
25e40 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 0a 2a 2a   NULL pointer.**
25e50 20 61 6c 77 61 79 73 20 64 69 66 66 65 72 73 20   always differs 
25e60 66 72 6f 6d 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20  from a non-NULL 
25e70 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20  pointer..*/.int 
25e80 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43  sqlite3ExprListC
25e90 6f 6d 70 61 72 65 28 45 78 70 72 4c 69 73 74 20  ompare(ExprList 
25ea0 2a 70 41 2c 20 45 78 70 72 4c 69 73 74 20 2a 70  *pA, ExprList *p
25eb0 42 2c 20 69 6e 74 20 69 54 61 62 29 7b 0a 20 20  B, int iTab){.  
25ec0 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 41 3d  int i;.  if( pA=
25ed0 3d 30 20 26 26 20 70 42 3d 3d 30 20 29 20 72 65  =0 && pB==0 ) re
25ee0 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 41  turn 0;.  if( pA
25ef0 3d 3d 30 20 7c 7c 20 70 42 3d 3d 30 20 29 20 72  ==0 || pB==0 ) r
25f00 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 70  eturn 1;.  if( p
25f10 41 2d 3e 6e 45 78 70 72 21 3d 70 42 2d 3e 6e 45  A->nExpr!=pB->nE
25f20 78 70 72 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  xpr ) return 1;.
25f30 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 2d    for(i=0; i<pA-
25f40 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
25f50 20 20 45 78 70 72 20 2a 70 45 78 70 72 41 20 3d    Expr *pExprA =
25f60 20 70 41 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b   pA->a[i].pExpr;
25f70 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72  .    Expr *pExpr
25f80 42 20 3d 20 70 42 2d 3e 61 5b 69 5d 2e 70 45 78  B = pB->a[i].pEx
25f90 70 72 3b 0a 20 20 20 20 69 66 28 20 70 41 2d 3e  pr;.    if( pA->
25fa0 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 21 3d  a[i].sortOrder!=
25fb0 70 42 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64  pB->a[i].sortOrd
25fc0 65 72 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  er ) return 1;. 
25fd0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
25fe0 70 72 43 6f 6d 70 61 72 65 28 70 45 78 70 72 41  prCompare(pExprA
25ff0 2c 20 70 45 78 70 72 42 2c 20 69 54 61 62 29 20  , pExprB, iTab) 
26000 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a  ) return 1;.  }.
26010 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
26020 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
26030 20 69 66 20 77 65 20 63 61 6e 20 70 72 6f 76 65   if we can prove
26040 20 74 68 65 20 70 45 32 20 77 69 6c 6c 20 61 6c   the pE2 will al
26050 77 61 79 73 20 62 65 20 74 72 75 65 20 69 66 20  ways be true if 
26060 70 45 31 20 69 73 0a 2a 2a 20 74 72 75 65 2e 20  pE1 is.** true. 
26070 20 52 65 74 75 72 6e 20 66 61 6c 73 65 20 69 66   Return false if
26080 20 77 65 20 63 61 6e 6e 6f 74 20 63 6f 6d 70 6c   we cannot compl
26090 65 74 65 20 74 68 65 20 70 72 6f 6f 66 20 6f 72  ete the proof or
260a0 20 69 66 20 70 45 32 20 6d 69 67 68 74 0a 2a 2a   if pE2 might.**
260b0 20 62 65 20 66 61 6c 73 65 2e 20 20 45 78 61 6d   be false.  Exam
260c0 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ples:.**.**     
260d0 70 45 31 3a 20 78 3d 3d 35 20 20 20 20 20 20 20  pE1: x==5       
260e0 70 45 32 3a 20 78 3d 3d 35 20 20 20 20 20 20 20  pE2: x==5       
260f0 20 20 20 20 20 20 52 65 73 75 6c 74 3a 20 74 72        Result: tr
26100 75 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78  ue.**     pE1: x
26110 3e 30 20 20 20 20 20 20 20 20 70 45 32 3a 20 78  >0        pE2: x
26120 3d 3d 35 20 20 20 20 20 20 20 20 20 20 20 20 20  ==5             
26130 52 65 73 75 6c 74 3a 20 66 61 6c 73 65 0a 2a 2a  Result: false.**
26140 20 20 20 20 20 70 45 31 3a 20 78 3d 32 31 20 20       pE1: x=21  
26150 20 20 20 20 20 70 45 32 3a 20 78 3d 32 31 20 4f       pE2: x=21 O
26160 52 20 79 3d 34 33 20 20 20 20 20 52 65 73 75 6c  R y=43     Resul
26170 74 3a 20 74 72 75 65 0a 2a 2a 20 20 20 20 20 70  t: true.**     p
26180 45 31 3a 20 78 21 3d 31 32 33 20 20 20 20 20 70  E1: x!=123     p
26190 45 32 3a 20 78 20 49 53 20 4e 4f 54 20 4e 55 4c  E2: x IS NOT NUL
261a0 4c 20 20 20 20 52 65 73 75 6c 74 3a 20 74 72 75  L    Result: tru
261b0 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78 21  e.**     pE1: x!
261c0 3d 3f 31 20 20 20 20 20 20 70 45 32 3a 20 78 20  =?1      pE2: x 
261d0 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 52  IS NOT NULL    R
261e0 65 73 75 6c 74 3a 20 74 72 75 65 0a 2a 2a 20 20  esult: true.**  
261f0 20 20 20 70 45 31 3a 20 78 20 49 53 20 4e 55 4c     pE1: x IS NUL
26200 4c 20 20 70 45 32 3a 20 78 20 49 53 20 4e 4f 54  L  pE2: x IS NOT
26210 20 4e 55 4c 4c 20 20 20 20 52 65 73 75 6c 74 3a   NULL    Result:
26220 20 66 61 6c 73 65 0a 2a 2a 20 20 20 20 20 70 45   false.**     pE
26230 31 3a 20 78 20 49 53 20 3f 32 20 20 20 20 70 45  1: x IS ?2    pE
26240 32 3a 20 78 20 49 53 20 4e 4f 54 20 4e 55 4c 4c  2: x IS NOT NULL
26250 20 20 20 20 52 65 75 73 6c 74 3a 20 66 61 6c 73      Reuslt: fals
26260 65 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 63 6f 6d  e.**.** When com
26270 70 61 72 69 6e 67 20 54 4b 5f 43 4f 4c 55 4d 4e  paring TK_COLUMN
26280 20 6e 6f 64 65 73 20 62 65 74 77 65 65 6e 20 70   nodes between p
26290 45 31 20 61 6e 64 20 70 45 32 2c 20 69 66 20 70  E1 and pE2, if p
262a0 45 32 20 68 61 73 0a 2a 2a 20 45 78 70 72 2e 69  E2 has.** Expr.i
262b0 54 61 62 6c 65 3c 30 20 74 68 65 6e 20 61 73 73  Table<0 then ass
262c0 75 6d 65 20 61 20 74 61 62 6c 65 20 6e 75 6d 62  ume a table numb
262d0 65 72 20 67 69 76 65 6e 20 62 79 20 69 54 61 62  er given by iTab
262e0 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 69 6e 20  ..**.** When in 
262f0 64 6f 75 62 74 2c 20 72 65 74 75 72 6e 20 66 61  doubt, return fa
26300 6c 73 65 2e 20 20 52 65 74 75 72 6e 69 6e 67 20  lse.  Returning 
26310 74 72 75 65 20 6d 69 67 68 74 20 67 69 76 65 20  true might give 
26320 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a 2a 2a  a performance.**
26330 20 69 6d 70 72 6f 76 65 6d 65 6e 74 2e 20 20 52   improvement.  R
26340 65 74 75 72 6e 69 6e 67 20 66 61 6c 73 65 20 6d  eturning false m
26350 69 67 68 74 20 63 61 75 73 65 20 61 20 70 65 72  ight cause a per
26360 66 6f 72 6d 61 6e 63 65 20 72 65 64 75 63 74 69  formance reducti
26370 6f 6e 2c 20 62 75 74 0a 2a 2a 20 69 74 20 77 69  on, but.** it wi
26380 6c 6c 20 61 6c 77 61 79 73 20 67 69 76 65 20 74  ll always give t
26390 68 65 20 63 6f 72 72 65 63 74 20 61 6e 73 77 65  he correct answe
263a0 72 20 61 6e 64 20 69 73 20 68 65 6e 63 65 20 61  r and is hence a
263b0 6c 77 61 79 73 20 73 61 66 65 2e 0a 2a 2f 0a 69  lways safe..*/.i
263c0 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 6d  nt sqlite3ExprIm
263d0 70 6c 69 65 73 45 78 70 72 28 45 78 70 72 20 2a  pliesExpr(Expr *
263e0 70 45 31 2c 20 45 78 70 72 20 2a 70 45 32 2c 20  pE1, Expr *pE2, 
263f0 69 6e 74 20 69 54 61 62 29 7b 0a 20 20 69 66 28  int iTab){.  if(
26400 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70   sqlite3ExprComp
26410 61 72 65 28 70 45 31 2c 20 70 45 32 2c 20 69 54  are(pE1, pE2, iT
26420 61 62 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  ab)==0 ){.    re
26430 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66  turn 1;.  }.  if
26440 28 20 70 45 32 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52  ( pE2->op==TK_OR
26450 0a 20 20 20 26 26 20 28 73 71 6c 69 74 65 33 45  .   && (sqlite3E
26460 78 70 72 49 6d 70 6c 69 65 73 45 78 70 72 28 70  xprImpliesExpr(p
26470 45 31 2c 20 70 45 32 2d 3e 70 4c 65 66 74 2c 20  E1, pE2->pLeft, 
26480 69 54 61 62 29 0a 20 20 20 20 20 20 20 20 20 20  iTab).          
26490 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 45 78 70     || sqlite3Exp
264a0 72 49 6d 70 6c 69 65 73 45 78 70 72 28 70 45 31  rImpliesExpr(pE1
264b0 2c 20 70 45 32 2d 3e 70 52 69 67 68 74 2c 20 69  , pE2->pRight, i
264c0 54 61 62 29 20 29 0a 20 20 29 7b 0a 20 20 20 20  Tab) ).  ){.    
264d0 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
264e0 69 66 28 20 70 45 32 2d 3e 6f 70 3d 3d 54 4b 5f  if( pE2->op==TK_
264f0 4e 4f 54 4e 55 4c 4c 0a 20 20 20 26 26 20 73 71  NOTNULL.   && sq
26500 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65  lite3ExprCompare
26510 28 70 45 31 2d 3e 70 4c 65 66 74 2c 20 70 45 32  (pE1->pLeft, pE2
26520 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 29 3d 3d  ->pLeft, iTab)==
26530 30 0a 20 20 20 26 26 20 28 70 45 31 2d 3e 6f 70  0.   && (pE1->op
26540 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20 26 26 20 70  !=TK_ISNULL && p
26550 45 31 2d 3e 6f 70 21 3d 54 4b 5f 49 53 29 0a 20  E1->op!=TK_IS). 
26560 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31   ){.    return 1
26570 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
26580 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e  ;.}../*.** An in
26590 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f  stance of the fo
265a0 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72  llowing structur
265b0 65 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65  e is used by the
265c0 20 74 72 65 65 20 77 61 6c 6b 65 72 0a 2a 2a 20   tree walker.** 
265d0 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20  to determine if 
265e0 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 63 61  an expression ca
265f0 6e 20 62 65 20 65 76 61 6c 75 61 74 65 64 20 62  n be evaluated b
26600 79 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74  y reference to t
26610 68 65 0a 2a 2a 20 69 6e 64 65 78 20 6f 6e 6c 79  he.** index only
26620 2c 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67  , without having
26630 20 74 6f 20 64 6f 20 61 20 73 65 61 72 63 68 20   to do a search 
26640 66 6f 72 20 74 68 65 20 63 6f 72 72 65 73 70 6f  for the correspo
26650 6e 64 69 6e 67 0a 2a 2a 20 74 61 62 6c 65 20 65  nding.** table e
26660 6e 74 72 79 2e 20 20 54 68 65 20 49 64 78 43 6f  ntry.  The IdxCo
26670 76 65 72 2e 70 49 64 78 20 66 69 65 6c 64 20 69  ver.pIdx field i
26680 73 20 74 68 65 20 69 6e 64 65 78 2e 20 20 49 64  s the index.  Id
26690 78 43 6f 76 65 72 2e 69 43 75 72 0a 2a 2a 20 69  xCover.iCur.** i
266a0 73 20 74 68 65 20 63 75 72 73 6f 72 20 66 6f 72  s the cursor for
266b0 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73   the table..*/.s
266c0 74 72 75 63 74 20 49 64 78 43 6f 76 65 72 20 7b  truct IdxCover {
266d0 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20  .  Index *pIdx; 
266e0 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78      /* The index
266f0 20 74 6f 20 62 65 20 74 65 73 74 65 64 20 66 6f   to be tested fo
26700 72 20 63 6f 76 65 72 61 67 65 20 2a 2f 0a 20 20  r coverage */.  
26710 69 6e 74 20 69 43 75 72 3b 20 20 20 20 20 20 20  int iCur;       
26720 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65   /* Cursor numbe
26730 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20  r for the table 
26740 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
26750 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 7d 3b   the index */.};
26760 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f  ../*.** Check to
26770 20 73 65 65 20 69 66 20 74 68 65 72 65 20 61 72   see if there ar
26780 65 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  e references to 
26790 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 61 62 6c 65  columns in table
267a0 20 0a 2a 2a 20 70 57 61 6c 6b 65 72 2d 3e 75 2e   .** pWalker->u.
267b0 70 49 64 78 43 6f 76 65 72 2d 3e 69 43 75 72 20  pIdxCover->iCur 
267c0 63 61 6e 20 62 65 20 73 61 74 69 73 66 69 65 64  can be satisfied
267d0 20 75 73 69 6e 67 20 74 68 65 20 69 6e 64 65 78   using the index
267e0 0a 2a 2a 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70  .** pWalker->u.p
267f0 49 64 78 43 6f 76 65 72 2d 3e 70 49 64 78 2e 0a  IdxCover->pIdx..
26800 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78  */.static int ex
26810 70 72 49 64 78 43 6f 76 65 72 28 57 61 6c 6b 65  prIdxCover(Walke
26820 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72  r *pWalker, Expr
26830 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 66 28 20   *pExpr){.  if( 
26840 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  pExpr->op==TK_CO
26850 4c 55 4d 4e 0a 20 20 20 26 26 20 70 45 78 70 72  LUMN.   && pExpr
26860 2d 3e 69 54 61 62 6c 65 3d 3d 70 57 61 6c 6b 65  ->iTable==pWalke
26870 72 2d 3e 75 2e 70 49 64 78 43 6f 76 65 72 2d 3e  r->u.pIdxCover->
26880 69 43 75 72 0a 20 20 20 26 26 20 73 71 6c 69 74  iCur.   && sqlit
26890 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78 28  e3ColumnOfIndex(
268a0 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 49 64 78 43  pWalker->u.pIdxC
268b0 6f 76 65 72 2d 3e 70 49 64 78 2c 20 70 45 78 70  over->pIdx, pExp
268c0 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3c 30 0a 20 20  r->iColumn)<0.  
268d0 29 7b 0a 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e  ){.    pWalker->
268e0 65 43 6f 64 65 20 3d 20 31 3b 0a 20 20 20 20 72  eCode = 1;.    r
268f0 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
26900 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 57 52  .  }.  return WR
26910 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f  C_Continue;.}../
26920 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 69  *.** Determine i
26930 66 20 61 6e 20 69 6e 64 65 78 20 70 49 64 78 20  f an index pIdx 
26940 6f 6e 20 74 61 62 6c 65 20 77 69 74 68 20 63 75  on table with cu
26950 72 73 6f 72 20 69 43 75 72 20 63 6f 6e 74 61 69  rsor iCur contai
26960 6e 73 20 77 69 6c 6c 0a 2a 2a 20 74 68 65 20 65  ns will.** the e
26970 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 2e  xpression pExpr.
26980 20 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66    Return true if
26990 20 74 68 65 20 69 6e 64 65 78 20 64 6f 65 73 20   the index does 
269a0 63 6f 76 65 72 20 74 68 65 0a 2a 2a 20 65 78 70  cover the.** exp
269b0 72 65 73 73 69 6f 6e 20 61 6e 64 20 66 61 6c 73  ression and fals
269c0 65 20 69 66 20 74 68 65 20 70 45 78 70 72 20 65  e if the pExpr e
269d0 78 70 72 65 73 73 69 6f 6e 20 72 65 66 65 72 65  xpression refere
269e0 6e 63 65 73 20 74 61 62 6c 65 20 63 6f 6c 75 6d  nces table colum
269f0 6e 73 0a 2a 2a 20 74 68 61 74 20 61 72 65 20 6e  ns.** that are n
26a00 6f 74 20 66 6f 75 6e 64 20 69 6e 20 74 68 65 20  ot found in the 
26a10 69 6e 64 65 78 20 70 49 64 78 2e 0a 2a 2a 0a 2a  index pIdx..**.*
26a20 2a 20 41 6e 20 69 6e 64 65 78 20 63 6f 76 65 72  * An index cover
26a30 69 6e 67 20 61 6e 20 65 78 70 72 65 73 73 69 6f  ing an expressio
26a40 6e 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  n means that the
26a50 20 65 78 70 72 65 73 73 69 6f 6e 20 63 61 6e 20   expression can 
26a60 62 65 0a 2a 2a 20 65 76 61 6c 75 61 74 65 64 20  be.** evaluated 
26a70 75 73 69 6e 67 20 6f 6e 6c 79 20 74 68 65 20 69  using only the i
26a80 6e 64 65 78 20 61 6e 64 20 77 69 74 68 6f 75 74  ndex and without
26a90 20 68 61 76 69 6e 67 20 74 6f 20 6c 6f 6f 6b 75   having to looku
26aa0 70 20 74 68 65 0a 2a 2a 20 63 6f 72 72 65 73 70  p the.** corresp
26ab0 6f 6e 64 69 6e 67 20 74 61 62 6c 65 20 65 6e 74  onding table ent
26ac0 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ry..*/.int sqlit
26ad0 65 33 45 78 70 72 43 6f 76 65 72 65 64 42 79 49  e3ExprCoveredByI
26ae0 6e 64 65 78 28 0a 20 20 45 78 70 72 20 2a 70 45  ndex(.  Expr *pE
26af0 78 70 72 2c 20 20 20 20 20 20 20 20 2f 2a 20 54  xpr,        /* T
26b00 68 65 20 69 6e 64 65 78 20 74 6f 20 62 65 20 74  he index to be t
26b10 65 73 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69  ested */.  int i
26b20 43 75 72 2c 20 20 20 20 20 20 20 20 20 20 20 2f  Cur,           /
26b30 2a 20 54 68 65 20 63 75 72 73 6f 72 20 6e 75 6d  * The cursor num
26b40 62 65 72 20 66 6f 72 20 74 68 65 20 63 6f 72 72  ber for the corr
26b50 65 73 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65 20  esponding table 
26b60 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  */.  Index *pIdx
26b70 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
26b80 69 6e 64 65 78 20 74 68 61 74 20 6d 69 67 68 74  index that might
26b90 20 62 65 20 75 73 65 64 20 66 6f 72 20 63 6f 76   be used for cov
26ba0 65 72 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 57 61  erage */.){.  Wa
26bb0 6c 6b 65 72 20 77 3b 0a 20 20 73 74 72 75 63 74  lker w;.  struct
26bc0 20 49 64 78 43 6f 76 65 72 20 78 63 6f 76 3b 0a   IdxCover xcov;.
26bd0 20 20 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c 20    memset(&w, 0, 
26be0 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20 78 63  sizeof(w));.  xc
26bf0 6f 76 2e 69 43 75 72 20 3d 20 69 43 75 72 3b 0a  ov.iCur = iCur;.
26c00 20 20 78 63 6f 76 2e 70 49 64 78 20 3d 20 70 49    xcov.pIdx = pI
26c10 64 78 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c  dx;.  w.xExprCal
26c20 6c 62 61 63 6b 20 3d 20 65 78 70 72 49 64 78 43  lback = exprIdxC
26c30 6f 76 65 72 3b 0a 20 20 77 2e 75 2e 70 49 64 78  over;.  w.u.pIdx
26c40 43 6f 76 65 72 20 3d 20 26 78 63 6f 76 3b 0a 20  Cover = &xcov;. 
26c50 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72   sqlite3WalkExpr
26c60 28 26 77 2c 20 70 45 78 70 72 29 3b 0a 20 20 72  (&w, pExpr);.  r
26c70 65 74 75 72 6e 20 21 77 2e 65 43 6f 64 65 3b 0a  eturn !w.eCode;.
26c80 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73  }.../*.** An ins
26c90 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c  tance of the fol
26ca0 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
26cb0 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20   is used by the 
26cc0 74 72 65 65 20 77 61 6c 6b 65 72 0a 2a 2a 20 74  tree walker.** t
26cd0 6f 20 63 6f 75 6e 74 20 72 65 66 65 72 65 6e 63  o count referenc
26ce0 65 73 20 74 6f 20 74 61 62 6c 65 20 63 6f 6c 75  es to table colu
26cf0 6d 6e 73 20 69 6e 20 74 68 65 20 61 72 67 75 6d  mns in the argum
26d00 65 6e 74 73 20 6f 66 20 61 6e 20 0a 2a 2a 20 61  ents of an .** a
26d10 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
26d20 6e 2c 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 69  n, in order to i
26d30 6d 70 6c 65 6d 65 6e 74 20 74 68 65 0a 2a 2a 20  mplement the.** 
26d40 73 71 6c 69 74 65 33 46 75 6e 63 74 69 6f 6e 54  sqlite3FunctionT
26d50 68 69 73 53 72 63 28 29 20 72 6f 75 74 69 6e 65  hisSrc() routine
26d60 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 53 72 63 43  ..*/.struct SrcC
26d70 6f 75 6e 74 20 7b 0a 20 20 53 72 63 4c 69 73 74  ount {.  SrcList
26d80 20 2a 70 53 72 63 3b 20 20 20 2f 2a 20 4f 6e 65   *pSrc;   /* One
26d90 20 70 61 72 74 69 63 75 6c 61 72 20 46 52 4f 4d   particular FROM
26da0 20 63 6c 61 75 73 65 20 69 6e 20 61 20 6e 65 73   clause in a nes
26db0 74 65 64 20 71 75 65 72 79 20 2a 2f 0a 20 20 69  ted query */.  i
26dc0 6e 74 20 6e 54 68 69 73 3b 20 20 20 20 20 20 20  nt nThis;       
26dd0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 66  /* Number of ref
26de0 65 72 65 6e 63 65 73 20 74 6f 20 63 6f 6c 75 6d  erences to colum
26df0 6e 73 20 69 6e 20 70 53 72 63 4c 69 73 74 20 2a  ns in pSrcList *
26e00 2f 0a 20 20 69 6e 74 20 6e 4f 74 68 65 72 3b 20  /.  int nOther; 
26e10 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
26e20 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  f references to 
26e30 63 6f 6c 75 6d 6e 73 20 69 6e 20 6f 74 68 65 72  columns in other
26e40 20 46 52 4f 4d 20 63 6c 61 75 73 65 73 20 2a 2f   FROM clauses */
26e50 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74  .};../*.** Count
26e60 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
26e70 65 66 65 72 65 6e 63 65 73 20 74 6f 20 63 6f 6c  eferences to col
26e80 75 6d 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  umns..*/.static 
26e90 69 6e 74 20 65 78 70 72 53 72 63 43 6f 75 6e 74  int exprSrcCount
26ea0 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72  (Walker *pWalker
26eb0 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  , Expr *pExpr){.
26ec0 20 20 2f 2a 20 54 68 65 20 4e 45 56 45 52 28 29    /* The NEVER()
26ed0 20 6f 6e 20 74 68 65 20 73 65 63 6f 6e 64 20 74   on the second t
26ee0 65 72 6d 20 69 73 20 62 65 63 61 75 73 65 20 73  erm is because s
26ef0 71 6c 69 74 65 33 46 75 6e 63 74 69 6f 6e 55 73  qlite3FunctionUs
26f00 65 73 54 68 69 73 53 72 63 28 29 0a 20 20 2a 2a  esThisSrc().  **
26f10 20 69 73 20 61 6c 77 61 79 73 20 63 61 6c 6c 65   is always calle
26f20 64 20 62 65 66 6f 72 65 20 73 71 6c 69 74 65 33  d before sqlite3
26f30 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65  ExprAnalyzeAggre
26f40 67 61 74 65 73 28 29 20 61 6e 64 20 73 6f 20 74  gates() and so t
26f50 68 65 0a 20 20 2a 2a 20 54 4b 5f 43 4f 4c 55 4d  he.  ** TK_COLUM
26f60 4e 73 20 68 61 76 65 20 6e 6f 74 20 79 65 74 20  Ns have not yet 
26f70 62 65 65 6e 20 63 6f 6e 76 65 72 74 65 64 20 69  been converted i
26f80 6e 74 6f 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  nto TK_AGG_COLUM
26f90 4e 2e 20 20 49 66 0a 20 20 2a 2a 20 73 71 6c 69  N.  If.  ** sqli
26fa0 74 65 33 46 75 6e 63 74 69 6f 6e 55 73 65 73 54  te3FunctionUsesT
26fb0 68 69 73 53 72 63 28 29 20 69 73 20 75 73 65 64  hisSrc() is used
26fc0 20 64 69 66 66 65 72 65 6e 74 6c 79 20 69 6e 20   differently in 
26fd0 74 68 65 20 66 75 74 75 72 65 2c 20 74 68 65 0a  the future, the.
26fe0 20 20 2a 2a 20 4e 45 56 45 52 28 29 20 77 69 6c    ** NEVER() wil
26ff0 6c 20 6e 65 65 64 20 74 6f 20 62 65 20 72 65 6d  l need to be rem
27000 6f 76 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20 70  oved. */.  if( p
27010 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  Expr->op==TK_COL
27020 55 4d 4e 20 7c 7c 20 4e 45 56 45 52 28 70 45 78  UMN || NEVER(pEx
27030 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43  pr->op==TK_AGG_C
27040 4f 4c 55 4d 4e 29 20 29 7b 0a 20 20 20 20 69 6e  OLUMN) ){.    in
27050 74 20 69 3b 0a 20 20 20 20 73 74 72 75 63 74 20  t i;.    struct 
27060 53 72 63 43 6f 75 6e 74 20 2a 70 20 3d 20 70 57  SrcCount *p = pW
27070 61 6c 6b 65 72 2d 3e 75 2e 70 53 72 63 43 6f 75  alker->u.pSrcCou
27080 6e 74 3b 0a 20 20 20 20 53 72 63 4c 69 73 74 20  nt;.    SrcList 
27090 2a 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b  *pSrc = p->pSrc;
270a0 0a 20 20 20 20 69 6e 74 20 6e 53 72 63 20 3d 20  .    int nSrc = 
270b0 70 53 72 63 20 3f 20 70 53 72 63 2d 3e 6e 53 72  pSrc ? pSrc->nSr
270c0 63 20 3a 20 30 3b 0a 20 20 20 20 66 6f 72 28 69  c : 0;.    for(i
270d0 3d 30 3b 20 69 3c 6e 53 72 63 3b 20 69 2b 2b 29  =0; i<nSrc; i++)
270e0 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  {.      if( pExp
270f0 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 53 72 63 2d  r->iTable==pSrc-
27100 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 20 29 20  >a[i].iCursor ) 
27110 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
27120 20 69 66 28 20 69 3c 6e 53 72 63 20 29 7b 0a 20   if( i<nSrc ){. 
27130 20 20 20 20 20 70 2d 3e 6e 54 68 69 73 2b 2b 3b       p->nThis++;
27140 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
27150 20 20 70 2d 3e 6e 4f 74 68 65 72 2b 2b 3b 0a 20    p->nOther++;. 
27160 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
27170 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
27180 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69  }../*.** Determi
27190 6e 65 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65  ne if any of the
271a0 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 74 68   arguments to th
271b0 65 20 70 45 78 70 72 20 46 75 6e 63 74 69 6f 6e  e pExpr Function
271c0 20 72 65 66 65 72 65 6e 63 65 0a 2a 2a 20 70 53   reference.** pS
271d0 72 63 4c 69 73 74 2e 20 20 52 65 74 75 72 6e 20  rcList.  Return 
271e0 74 72 75 65 20 69 66 20 74 68 65 79 20 64 6f 2e  true if they do.
271f0 20 20 41 6c 73 6f 20 72 65 74 75 72 6e 20 74 72    Also return tr
27200 75 65 20 69 66 20 74 68 65 20 66 75 6e 63 74 69  ue if the functi
27210 6f 6e 0a 2a 2a 20 68 61 73 20 6e 6f 20 61 72 67  on.** has no arg
27220 75 6d 65 6e 74 73 20 6f 72 20 68 61 73 20 6f 6e  uments or has on
27230 6c 79 20 63 6f 6e 73 74 61 6e 74 20 61 72 67 75  ly constant argu
27240 6d 65 6e 74 73 2e 20 20 52 65 74 75 72 6e 20 66  ments.  Return f
27250 61 6c 73 65 20 69 66 20 70 45 78 70 72 0a 2a 2a  alse if pExpr.**
27260 20 72 65 66 65 72 65 6e 63 65 73 20 63 6f 6c 75   references colu
27270 6d 6e 73 20 62 75 74 20 6e 6f 74 20 63 6f 6c 75  mns but not colu
27280 6d 6e 73 20 6f 66 20 74 61 62 6c 65 73 20 66 6f  mns of tables fo
27290 75 6e 64 20 69 6e 20 70 53 72 63 4c 69 73 74 2e  und in pSrcList.
272a0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  .*/.int sqlite3F
272b0 75 6e 63 74 69 6f 6e 55 73 65 73 54 68 69 73 53  unctionUsesThisS
272c0 72 63 28 45 78 70 72 20 2a 70 45 78 70 72 2c 20  rc(Expr *pExpr, 
272d0 53 72 63 4c 69 73 74 20 2a 70 53 72 63 4c 69 73  SrcList *pSrcLis
272e0 74 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a  t){.  Walker w;.
272f0 20 20 73 74 72 75 63 74 20 53 72 63 43 6f 75 6e    struct SrcCoun
27300 74 20 63 6e 74 3b 0a 20 20 61 73 73 65 72 74 28  t cnt;.  assert(
27310 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41   pExpr->op==TK_A
27320 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20  GG_FUNCTION );. 
27330 20 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c 20 73   memset(&w, 0, s
27340 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20 77 2e 78  izeof(w));.  w.x
27350 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65  ExprCallback = e
27360 78 70 72 53 72 63 43 6f 75 6e 74 3b 0a 20 20 77  xprSrcCount;.  w
27370 2e 75 2e 70 53 72 63 43 6f 75 6e 74 20 3d 20 26  .u.pSrcCount = &
27380 63 6e 74 3b 0a 20 20 63 6e 74 2e 70 53 72 63 20  cnt;.  cnt.pSrc 
27390 3d 20 70 53 72 63 4c 69 73 74 3b 0a 20 20 63 6e  = pSrcList;.  cn
273a0 74 2e 6e 54 68 69 73 20 3d 20 30 3b 0a 20 20 63  t.nThis = 0;.  c
273b0 6e 74 2e 6e 4f 74 68 65 72 20 3d 20 30 3b 0a 20  nt.nOther = 0;. 
273c0 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72   sqlite3WalkExpr
273d0 4c 69 73 74 28 26 77 2c 20 70 45 78 70 72 2d 3e  List(&w, pExpr->
273e0 78 2e 70 4c 69 73 74 29 3b 0a 20 20 72 65 74 75  x.pList);.  retu
273f0 72 6e 20 63 6e 74 2e 6e 54 68 69 73 3e 30 20 7c  rn cnt.nThis>0 |
27400 7c 20 63 6e 74 2e 6e 4f 74 68 65 72 3d 3d 30 3b  | cnt.nOther==0;
27410 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20  .}../*.** Add a 
27420 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74  new element to t
27430 68 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f  he pAggInfo->aCo
27440 6c 5b 5d 20 61 72 72 61 79 2e 20 20 52 65 74 75  l[] array.  Retu
27450 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66 0a  rn the index of.
27460 2a 2a 20 74 68 65 20 6e 65 77 20 65 6c 65 6d 65  ** the new eleme
27470 6e 74 2e 20 20 52 65 74 75 72 6e 20 61 20 6e 65  nt.  Return a ne
27480 67 61 74 69 76 65 20 6e 75 6d 62 65 72 20 69 66  gative number if
27490 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 2e 0a 2a   malloc fails..*
274a0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 64 64  /.static int add
274b0 41 67 67 49 6e 66 6f 43 6f 6c 75 6d 6e 28 73 71  AggInfoColumn(sq
274c0 6c 69 74 65 33 20 2a 64 62 2c 20 41 67 67 49 6e  lite3 *db, AggIn
274d0 66 6f 20 2a 70 49 6e 66 6f 29 7b 0a 20 20 69 6e  fo *pInfo){.  in
274e0 74 20 69 3b 0a 20 20 70 49 6e 66 6f 2d 3e 61 43  t i;.  pInfo->aC
274f0 6f 6c 20 3d 20 73 71 6c 69 74 65 33 41 72 72 61  ol = sqlite3Arra
27500 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20 20 20 20  yAllocate(.     
27510 20 20 64 62 2c 0a 20 20 20 20 20 20 20 70 49 6e    db,.       pIn
27520 66 6f 2d 3e 61 43 6f 6c 2c 0a 20 20 20 20 20 20  fo->aCol,.      
27530 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 61   sizeof(pInfo->a
27540 43 6f 6c 5b 30 5d 29 2c 0a 20 20 20 20 20 20 20  Col[0]),.       
27550 26 70 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 2c  &pInfo->nColumn,
27560 0a 20 20 20 20 20 20 20 26 69 0a 20 20 29 3b 0a  .       &i.  );.
27570 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 20 20 20    return i;.}   
27580 20 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e   ../*.** Add a n
27590 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68  ew element to th
275a0 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e  e pAggInfo->aFun
275b0 63 5b 5d 20 61 72 72 61 79 2e 20 20 52 65 74 75  c[] array.  Retu
275c0 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66 0a  rn the index of.
275d0 2a 2a 20 74 68 65 20 6e 65 77 20 65 6c 65 6d 65  ** the new eleme
275e0 6e 74 2e 20 20 52 65 74 75 72 6e 20 61 20 6e 65  nt.  Return a ne
275f0 67 61 74 69 76 65 20 6e 75 6d 62 65 72 20 69 66  gative number if
27600 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 2e 0a 2a   malloc fails..*
27610 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 64 64  /.static int add
27620 41 67 67 49 6e 66 6f 46 75 6e 63 28 73 71 6c 69  AggInfoFunc(sqli
27630 74 65 33 20 2a 64 62 2c 20 41 67 67 49 6e 66 6f  te3 *db, AggInfo
27640 20 2a 70 49 6e 66 6f 29 7b 0a 20 20 69 6e 74 20   *pInfo){.  int 
27650 69 3b 0a 20 20 70 49 6e 66 6f 2d 3e 61 46 75 6e  i;.  pInfo->aFun
27660 63 20 3d 20 73 71 6c 69 74 65 33 41 72 72 61 79  c = sqlite3Array
27670 41 6c 6c 6f 63 61 74 65 28 0a 20 20 20 20 20 20  Allocate(.      
27680 20 64 62 2c 20 0a 20 20 20 20 20 20 20 70 49 6e   db, .       pIn
27690 66 6f 2d 3e 61 46 75 6e 63 2c 0a 20 20 20 20 20  fo->aFunc,.     
276a0 20 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e    sizeof(pInfo->
276b0 61 46 75 6e 63 5b 30 5d 29 2c 0a 20 20 20 20 20  aFunc[0]),.     
276c0 20 20 26 70 49 6e 66 6f 2d 3e 6e 46 75 6e 63 2c    &pInfo->nFunc,
276d0 0a 20 20 20 20 20 20 20 26 69 0a 20 20 29 3b 0a  .       &i.  );.
276e0 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 20 20 20    return i;.}   
276f0 20 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73   ../*.** This is
27700 20 74 68 65 20 78 45 78 70 72 43 61 6c 6c 62 61   the xExprCallba
27710 63 6b 20 66 6f 72 20 61 20 74 72 65 65 20 77 61  ck for a tree wa
27720 6c 6b 65 72 2e 20 20 49 74 20 69 73 20 75 73 65  lker.  It is use
27730 64 20 74 6f 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e  d to.** implemen
27740 74 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61  t sqlite3ExprAna
27750 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 29  lyzeAggregates()
27760 2e 20 20 53 65 65 20 73 71 6c 69 74 65 33 45 78  .  See sqlite3Ex
27770 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  prAnalyzeAggrega
27780 74 65 73 0a 2a 2a 20 66 6f 72 20 61 64 64 69 74  tes.** for addit
27790 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
277a0 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
277b0 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74   analyzeAggregat
277c0 65 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65  e(Walker *pWalke
277d0 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  r, Expr *pExpr){
277e0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4e 61 6d 65  .  int i;.  Name
277f0 43 6f 6e 74 65 78 74 20 2a 70 4e 43 20 3d 20 70  Context *pNC = p
27800 57 61 6c 6b 65 72 2d 3e 75 2e 70 4e 43 3b 0a 20  Walker->u.pNC;. 
27810 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d   Parse *pParse =
27820 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20   pNC->pParse;.  
27830 53 72 63 4c 69 73 74 20 2a 70 53 72 63 4c 69 73  SrcList *pSrcLis
27840 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73  t = pNC->pSrcLis
27850 74 3b 0a 20 20 41 67 67 49 6e 66 6f 20 2a 70 41  t;.  AggInfo *pA
27860 67 67 49 6e 66 6f 20 3d 20 70 4e 43 2d 3e 70 41  ggInfo = pNC->pA
27870 67 67 49 6e 66 6f 3b 0a 0a 20 20 73 77 69 74 63  ggInfo;..  switc
27880 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a  h( pExpr->op ){.
27890 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f      case TK_AGG_
278a0 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65  COLUMN:.    case
278b0 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20   TK_COLUMN: {.  
278c0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
278d0 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f  xpr->op==TK_AGG_
278e0 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20  COLUMN );.      
278f0 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
27900 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29  >op==TK_COLUMN )
27910 3b 0a 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b  ;.      /* Check
27920 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 63   to see if the c
27930 6f 6c 75 6d 6e 20 69 73 20 69 6e 20 6f 6e 65 20  olumn is in one 
27940 6f 66 20 74 68 65 20 74 61 62 6c 65 73 20 69 6e  of the tables in
27950 20 74 68 65 20 46 52 4f 4d 0a 20 20 20 20 20 20   the FROM.      
27960 2a 2a 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  ** clause of the
27970 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72 79   aggregate query
27980 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 41 4c   */.      if( AL
27990 57 41 59 53 28 70 53 72 63 4c 69 73 74 21 3d 30  WAYS(pSrcList!=0
279a0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74 72  ) ){.        str
279b0 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
279c0 20 2a 70 49 74 65 6d 20 3d 20 70 53 72 63 4c 69   *pItem = pSrcLi
279d0 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20 20 20 66  st->a;.        f
279e0 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72 63 4c 69  or(i=0; i<pSrcLi
279f0 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70  st->nSrc; i++, p
27a00 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Item++){.       
27a10 20 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66     struct AggInf
27a20 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 3b 0a 20 20 20  o_col *pCol;.   
27a30 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
27a40 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
27a50 70 45 78 70 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f  pExpr, EP_TokenO
27a60 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64 29 20  nly|EP_Reduced) 
27a70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
27a80 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d   pExpr->iTable==
27a90 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 29  pItem->iCursor )
27aa0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  {.            /*
27ab0 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69   If we reach thi
27ac0 73 20 70 6f 69 6e 74 2c 20 69 74 20 6d 65 61 6e  s point, it mean
27ad0 73 20 74 68 61 74 20 70 45 78 70 72 20 72 65 66  s that pExpr ref
27ae0 65 72 73 20 74 6f 20 61 20 74 61 62 6c 65 0a 20  ers to a table. 
27af0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68             ** th
27b00 61 74 20 69 73 20 69 6e 20 74 68 65 20 46 52 4f  at is in the FRO
27b10 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
27b20 61 67 67 72 65 67 61 74 65 20 71 75 65 72 79 2e  aggregate query.
27b30 20 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a    .            *
27b40 2a 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  *.            **
27b50 20 4d 61 6b 65 20 61 6e 20 65 6e 74 72 79 20 66   Make an entry f
27b60 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 6e  or the column in
27b70 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b   pAggInfo->aCol[
27b80 5d 20 69 66 20 74 68 65 72 65 0a 20 20 20 20 20  ] if there.     
27b90 20 20 20 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74         ** is not
27ba0 20 61 6e 20 65 6e 74 72 79 20 74 68 65 72 65 20   an entry there 
27bb0 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 20 20 20  already..       
27bc0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
27bd0 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20      int k;.     
27be0 20 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 70 41         pCol = pA
27bf0 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 3b 0a 20 20  ggInfo->aCol;.  
27c00 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6b 3d            for(k=
27c10 30 3b 20 6b 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e  0; k<pAggInfo->n
27c20 43 6f 6c 75 6d 6e 3b 20 6b 2b 2b 2c 20 70 43 6f  Column; k++, pCo
27c30 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  l++){.          
27c40 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69 54      if( pCol->iT
27c50 61 62 6c 65 3d 3d 70 45 78 70 72 2d 3e 69 54 61  able==pExpr->iTa
27c60 62 6c 65 20 26 26 0a 20 20 20 20 20 20 20 20 20  ble &&.         
27c70 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69           pCol->i
27c80 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d 3e 69  Column==pExpr->i
27c90 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20  Column ){.      
27ca0 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
27cb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
27cc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
27cd0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28             if( (
27ce0 6b 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f  k>=pAggInfo->nCo
27cf0 6c 75 6d 6e 29 0a 20 20 20 20 20 20 20 20 20 20  lumn).          
27d00 20 20 20 26 26 20 28 6b 20 3d 20 61 64 64 41 67     && (k = addAg
27d10 67 49 6e 66 6f 43 6f 6c 75 6d 6e 28 70 50 61 72  gInfoColumn(pPar
27d20 73 65 2d 3e 64 62 2c 20 70 41 67 67 49 6e 66 6f  se->db, pAggInfo
27d30 29 29 3e 3d 30 20 0a 20 20 20 20 20 20 20 20 20  ))>=0 .         
27d40 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
27d50 20 20 20 20 70 43 6f 6c 20 3d 20 26 70 41 67 67      pCol = &pAgg
27d60 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 6b 5d 3b 0a 20  Info->aCol[k];. 
27d70 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
27d80 6c 2d 3e 70 54 61 62 20 3d 20 70 45 78 70 72 2d  l->pTab = pExpr-
27d90 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20  >pTab;.         
27da0 20 20 20 20 20 70 43 6f 6c 2d 3e 69 54 61 62 6c       pCol->iTabl
27db0 65 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  e = pExpr->iTabl
27dc0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e;.             
27dd0 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 20 3d   pCol->iColumn =
27de0 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b   pExpr->iColumn;
27df0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
27e00 43 6f 6c 2d 3e 69 4d 65 6d 20 3d 20 2b 2b 70 50  Col->iMem = ++pP
27e10 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
27e20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e            pCol->
27e30 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 20 3d 20  iSorterColumn = 
27e40 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  -1;.            
27e50 20 20 70 43 6f 6c 2d 3e 70 45 78 70 72 20 3d 20    pCol->pExpr = 
27e60 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20  pExpr;.         
27e70 20 20 20 20 20 69 66 28 20 70 41 67 67 49 6e 66       if( pAggInf
27e80 6f 2d 3e 70 47 72 6f 75 70 42 79 20 29 7b 0a 20  o->pGroupBy ){. 
27e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
27ea0 6e 74 20 6a 2c 20 6e 3b 0a 20 20 20 20 20 20 20  nt j, n;.       
27eb0 20 20 20 20 20 20 20 20 20 45 78 70 72 4c 69 73           ExprLis
27ec0 74 20 2a 70 47 42 20 3d 20 70 41 67 67 49 6e 66  t *pGB = pAggInf
27ed0 6f 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 20  o->pGroupBy;.   
27ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72               str
27ef0 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
27f00 6d 20 2a 70 54 65 72 6d 20 3d 20 70 47 42 2d 3e  m *pTerm = pGB->
27f10 61 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  a;.             
27f20 20 20 20 6e 20 3d 20 70 47 42 2d 3e 6e 45 78 70     n = pGB->nExp
27f30 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r;.             
27f40 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 3b     for(j=0; j<n;
27f50 20 6a 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a   j++, pTerm++){.
27f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27f70 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70 54 65    Expr *pE = pTe
27f80 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20  rm->pExpr;.     
27f90 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
27fa0 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55   pE->op==TK_COLU
27fb0 4d 4e 20 26 26 20 70 45 2d 3e 69 54 61 62 6c 65  MN && pE->iTable
27fc0 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20  ==pExpr->iTable 
27fd0 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  &&.             
27fe0 20 20 20 20 20 20 20 20 20 70 45 2d 3e 69 43 6f           pE->iCo
27ff0 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d 3e 69 43 6f  lumn==pExpr->iCo
28000 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  lumn ){.        
28010 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
28020 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 20  ->iSorterColumn 
28030 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = j;.           
28040 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
28050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28060 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
28070 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
28080 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
28090 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69 53      if( pCol->iS
280a0 6f 72 74 65 72 43 6f 6c 75 6d 6e 3c 30 20 29 7b  orterColumn<0 ){
280b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
280c0 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f   pCol->iSorterCo
280d0 6c 75 6d 6e 20 3d 20 70 41 67 67 49 6e 66 6f 2d  lumn = pAggInfo-
280e0 3e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 2b  >nSortingColumn+
280f0 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  +;.             
28100 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d   }.            }
28110 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
28120 54 68 65 72 65 20 69 73 20 6e 6f 77 20 61 6e 20  There is now an 
28130 65 6e 74 72 79 20 66 6f 72 20 70 45 78 70 72 20  entry for pExpr 
28140 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f  in pAggInfo->aCo
28150 6c 5b 5d 20 28 65 69 74 68 65 72 0a 20 20 20 20  l[] (either.    
28160 20 20 20 20 20 20 20 20 2a 2a 20 62 65 63 61 75          ** becau
28170 73 65 20 69 74 20 77 61 73 20 74 68 65 72 65 20  se it was there 
28180 62 65 66 6f 72 65 20 6f 72 20 62 65 63 61 75 73  before or becaus
28190 65 20 77 65 20 6a 75 73 74 20 63 72 65 61 74 65  e we just create
281a0 64 20 69 74 29 2e 0a 20 20 20 20 20 20 20 20 20  d it)..         
281b0 20 20 20 2a 2a 20 43 6f 6e 76 65 72 74 20 74 68     ** Convert th
281c0 65 20 70 45 78 70 72 20 74 6f 20 62 65 20 61 20  e pExpr to be a 
281d0 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 72 65  TK_AGG_COLUMN re
281e0 66 65 72 72 69 6e 67 20 74 6f 20 74 68 61 74 0a  ferring to that.
281f0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70              ** p
28200 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20  AggInfo->aCol[] 
28210 65 6e 74 72 79 2e 0a 20 20 20 20 20 20 20 20 20  entry..         
28220 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
28230 20 20 45 78 70 72 53 65 74 56 56 41 50 72 6f 70    ExprSetVVAProp
28240 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 4e  erty(pExpr, EP_N
28250 6f 52 65 64 75 63 65 29 3b 0a 20 20 20 20 20 20  oReduce);.      
28260 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 41 67        pExpr->pAg
28270 67 49 6e 66 6f 20 3d 20 70 41 67 67 49 6e 66 6f  gInfo = pAggInfo
28280 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45  ;.            pE
28290 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 41 47 47  xpr->op = TK_AGG
282a0 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20 20  _COLUMN;.       
282b0 20 20 20 20 20 70 45 78 70 72 2d 3e 69 41 67 67       pExpr->iAgg
282c0 20 3d 20 28 69 31 36 29 6b 3b 0a 20 20 20 20 20   = (i16)k;.     
282d0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
282e0 20 20 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64          } /* end
282f0 69 66 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  if pExpr->iTable
28300 3d 3d 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  ==pItem->iCursor
28310 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 20 2f 2a   */.        } /*
28320 20 65 6e 64 20 6c 6f 6f 70 20 6f 76 65 72 20 70   end loop over p
28330 53 72 63 4c 69 73 74 20 2a 2f 0a 20 20 20 20 20  SrcList */.     
28340 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
28350 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20 7d  WRC_Prune;.    }
28360 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47  .    case TK_AGG
28370 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20  _FUNCTION: {.   
28380 20 20 20 69 66 28 20 28 70 4e 43 2d 3e 6e 63 46     if( (pNC->ncF
28390 6c 61 67 73 20 26 20 4e 43 5f 49 6e 41 67 67 46  lags & NC_InAggF
283a0 75 6e 63 29 3d 3d 30 0a 20 20 20 20 20 20 20 26  unc)==0.       &
283b0 26 20 70 57 61 6c 6b 65 72 2d 3e 77 61 6c 6b 65  & pWalker->walke
283c0 72 44 65 70 74 68 3d 3d 70 45 78 70 72 2d 3e 6f  rDepth==pExpr->o
283d0 70 32 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  p2.      ){.    
283e0 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20      /* Check to 
283f0 73 65 65 20 69 66 20 70 45 78 70 72 20 69 73 20  see if pExpr is 
28400 61 20 64 75 70 6c 69 63 61 74 65 20 6f 66 20 61  a duplicate of a
28410 6e 6f 74 68 65 72 20 61 67 67 72 65 67 61 74 65  nother aggregate
28420 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6e   .        ** fun
28430 63 74 69 6f 6e 20 74 68 61 74 20 69 73 20 61 6c  ction that is al
28440 72 65 61 64 79 20 69 6e 20 74 68 65 20 70 41 67  ready in the pAg
28450 67 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 0a  gInfo structure.
28460 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
28470 20 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66     struct AggInf
28480 6f 5f 66 75 6e 63 20 2a 70 49 74 65 6d 20 3d 20  o_func *pItem = 
28490 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b  pAggInfo->aFunc;
284a0 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
284b0 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46  ; i<pAggInfo->nF
284c0 75 6e 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b  unc; i++, pItem+
284d0 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  +){.          if
284e0 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  ( sqlite3ExprCom
284f0 70 61 72 65 28 70 49 74 65 6d 2d 3e 70 45 78 70  pare(pItem->pExp
28500 72 2c 20 70 45 78 70 72 2c 20 2d 31 29 3d 3d 30  r, pExpr, -1)==0
28510 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
28520 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
28530 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
28540 20 20 20 20 20 69 66 28 20 69 3e 3d 70 41 67 67       if( i>=pAgg
28550 49 6e 66 6f 2d 3e 6e 46 75 6e 63 20 29 7b 0a 20  Info->nFunc ){. 
28560 20 20 20 20 20 20 20 20 20 2f 2a 20 70 45 78 70           /* pExp
28570 72 20 69 73 20 6f 72 69 67 69 6e 61 6c 2e 20 20  r is original.  
28580 4d 61 6b 65 20 61 20 6e 65 77 20 65 6e 74 72 79  Make a new entry
28590 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46   in pAggInfo->aF
285a0 75 6e 63 5b 5d 0a 20 20 20 20 20 20 20 20 20 20  unc[].          
285b0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 75 38 20  */.          u8 
285c0 65 6e 63 20 3d 20 45 4e 43 28 70 50 61 72 73 65  enc = ENC(pParse
285d0 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20  ->db);.         
285e0 20 69 20 3d 20 61 64 64 41 67 67 49 6e 66 6f 46   i = addAggInfoF
285f0 75 6e 63 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  unc(pParse->db, 
28600 70 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20  pAggInfo);.     
28610 20 20 20 20 20 69 66 28 20 69 3e 3d 30 20 29 7b       if( i>=0 ){
28620 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73  .            ass
28630 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
28640 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
28650 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20  xIsSelect) );.  
28660 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 20            pItem 
28670 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75  = &pAggInfo->aFu
28680 6e 63 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20  nc[i];.         
28690 20 20 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 20     pItem->pExpr 
286a0 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  = pExpr;.       
286b0 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 4d 65 6d       pItem->iMem
286c0 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
286d0 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  m;.            a
286e0 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
286f0 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
28700 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20  P_IntValue) );. 
28710 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d             pItem
28720 2d 3e 70 46 75 6e 63 20 3d 20 73 71 6c 69 74 65  ->pFunc = sqlite
28730 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 70 50  3FindFunction(pP
28740 61 72 73 65 2d 3e 64 62 2c 0a 20 20 20 20 20 20  arse->db,.      
28750 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
28760 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 0a 20  pr->u.zToken, . 
28770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28780 20 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74    pExpr->x.pList
28790 20 3f 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73   ? pExpr->x.pLis
287a0 74 2d 3e 6e 45 78 70 72 20 3a 20 30 2c 20 65 6e  t->nExpr : 0, en
287b0 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  c, 0);.         
287c0 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 66 6c     if( pExpr->fl
287d0 61 67 73 20 26 20 45 50 5f 44 69 73 74 69 6e 63  ags & EP_Distinc
287e0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t ){.           
287f0 20 20 20 70 49 74 65 6d 2d 3e 69 44 69 73 74 69     pItem->iDisti
28800 6e 63 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  nct = pParse->nT
28810 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  ab++;.          
28820 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
28830 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 44         pItem->iD
28840 69 73 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20  istinct = -1;.  
28850 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
28860 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
28870 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b  }.        /* Mak
28880 65 20 70 45 78 70 72 20 70 6f 69 6e 74 20 74 6f  e pExpr point to
28890 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
288a0 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63   pAggInfo->aFunc
288b0 5b 5d 20 65 6e 74 72 79 0a 20 20 20 20 20 20 20  [] entry.       
288c0 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65   */.        asse
288d0 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
288e0 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 54  erty(pExpr, EP_T
288f0 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75  okenOnly|EP_Redu
28900 63 65 64 29 20 29 3b 0a 20 20 20 20 20 20 20 20  ced) );.        
28910 45 78 70 72 53 65 74 56 56 41 50 72 6f 70 65 72  ExprSetVVAProper
28920 74 79 28 70 45 78 70 72 2c 20 45 50 5f 4e 6f 52  ty(pExpr, EP_NoR
28930 65 64 75 63 65 29 3b 0a 20 20 20 20 20 20 20 20  educe);.        
28940 70 45 78 70 72 2d 3e 69 41 67 67 20 3d 20 28 69  pExpr->iAgg = (i
28950 31 36 29 69 3b 0a 20 20 20 20 20 20 20 20 70 45  16)i;.        pE
28960 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f 20 3d 20  xpr->pAggInfo = 
28970 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20  pAggInfo;.      
28980 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75    return WRC_Pru
28990 6e 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ne;.      }else{
289a0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
289b0 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20  WRC_Continue;.  
289c0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
289d0 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e    return WRC_Con
289e0 74 69 6e 75 65 3b 0a 7d 0a 73 74 61 74 69 63 20  tinue;.}.static 
289f0 69 6e 74 20 61 6e 61 6c 79 7a 65 41 67 67 72 65  int analyzeAggre
28a00 67 61 74 65 73 49 6e 53 65 6c 65 63 74 28 57 61  gatesInSelect(Wa
28a10 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53  lker *pWalker, S
28a20 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b  elect *pSelect){
28a30 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
28a40 54 45 52 28 70 57 61 6c 6b 65 72 29 3b 0a 20 20  TER(pWalker);.  
28a50 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
28a60 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 72 65 74  (pSelect);.  ret
28a70 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
28a80 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79  ;.}../*.** Analy
28a90 7a 65 20 74 68 65 20 70 45 78 70 72 20 65 78 70  ze the pExpr exp
28aa0 72 65 73 73 69 6f 6e 20 6c 6f 6f 6b 69 6e 67 20  ression looking 
28ab0 66 6f 72 20 61 67 67 72 65 67 61 74 65 20 66 75  for aggregate fu
28ac0 6e 63 74 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66  nctions and.** f
28ad0 6f 72 20 76 61 72 69 61 62 6c 65 73 20 74 68 61  or variables tha
28ae0 74 20 6e 65 65 64 20 74 6f 20 62 65 20 61 64 64  t need to be add
28af0 65 64 20 74 6f 20 41 67 67 49 6e 66 6f 20 6f 62  ed to AggInfo ob
28b00 6a 65 63 74 20 74 68 61 74 20 70 4e 43 2d 3e 70  ject that pNC->p
28b10 41 67 67 49 6e 66 6f 0a 2a 2a 20 70 6f 69 6e 74  AggInfo.** point
28b20 73 20 74 6f 2e 20 20 41 64 64 69 74 69 6f 6e 61  s to.  Additiona
28b30 6c 20 65 6e 74 72 69 65 73 20 61 72 65 20 6d 61  l entries are ma
28b40 64 65 20 6f 6e 20 74 68 65 20 41 67 67 49 6e 66  de on the AggInf
28b50 6f 20 6f 62 6a 65 63 74 20 61 73 0a 2a 2a 20 6e  o object as.** n
28b60 65 63 65 73 73 61 72 79 2e 0a 2a 2a 0a 2a 2a 20  ecessary..**.** 
28b70 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f  This routine sho
28b80 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c  uld only be call
28b90 65 64 20 61 66 74 65 72 20 74 68 65 20 65 78 70  ed after the exp
28ba0 72 65 73 73 69 6f 6e 20 68 61 73 20 62 65 65 6e  ression has been
28bb0 0a 2a 2a 20 61 6e 61 6c 79 7a 65 64 20 62 79 20  .** analyzed by 
28bc0 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 45 78  sqlite3ResolveEx
28bd0 70 72 4e 61 6d 65 73 28 29 2e 0a 2a 2f 0a 76 6f  prNames()..*/.vo
28be0 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e  id sqlite3ExprAn
28bf0 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28  alyzeAggregates(
28c00 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43  NameContext *pNC
28c10 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  , Expr *pExpr){.
28c20 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 6d 65    Walker w;.  me
28c30 6d 73 65 74 28 26 77 2c 20 30 2c 20 73 69 7a 65  mset(&w, 0, size
28c40 6f 66 28 77 29 29 3b 0a 20 20 77 2e 78 45 78 70  of(w));.  w.xExp
28c50 72 43 61 6c 6c 62 61 63 6b 20 3d 20 61 6e 61 6c  rCallback = anal
28c60 79 7a 65 41 67 67 72 65 67 61 74 65 3b 0a 20 20  yzeAggregate;.  
28c70 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  w.xSelectCallbac
28c80 6b 20 3d 20 61 6e 61 6c 79 7a 65 41 67 67 72 65  k = analyzeAggre
28c90 67 61 74 65 73 49 6e 53 65 6c 65 63 74 3b 0a 20  gatesInSelect;. 
28ca0 20 77 2e 75 2e 70 4e 43 20 3d 20 70 4e 43 3b 0a   w.u.pNC = pNC;.
28cb0 20 20 61 73 73 65 72 74 28 20 70 4e 43 2d 3e 70    assert( pNC->p
28cc0 53 72 63 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20  SrcList!=0 );.  
28cd0 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28  sqlite3WalkExpr(
28ce0 26 77 2c 20 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f  &w, pExpr);.}../
28cf0 2a 0a 2a 2a 20 43 61 6c 6c 20 73 71 6c 69 74 65  *.** Call sqlite
28d00 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72  3ExprAnalyzeAggr
28d10 65 67 61 74 65 73 28 29 20 66 6f 72 20 65 76 65  egates() for eve
28d20 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e  ry expression in
28d30 20 61 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f   an.** expressio
28d40 6e 20 6c 69 73 74 2e 20 20 52 65 74 75 72 6e 20  n list.  Return 
28d50 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72  the number of er
28d60 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  rors..**.** If a
28d70 6e 20 65 72 72 6f 72 20 69 73 20 66 6f 75 6e 64  n error is found
28d80 2c 20 74 68 65 20 61 6e 61 6c 79 73 69 73 20 69  , the analysis i
28d90 73 20 63 75 74 20 73 68 6f 72 74 2e 0a 2a 2f 0a  s cut short..*/.
28da0 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
28db0 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 4e  AnalyzeAggList(N
28dc0 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c  ameContext *pNC,
28dd0 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
28de0 29 7b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72  ){.  struct Expr
28df0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
28e00 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  ;.  int i;.  if(
28e10 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 66 6f   pList ){.    fo
28e20 72 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61  r(pItem=pList->a
28e30 2c 20 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  , i=0; i<pList->
28e40 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65  nExpr; i++, pIte
28e50 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  m++){.      sqli
28e60 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
28e70 67 72 65 67 61 74 65 73 28 70 4e 43 2c 20 70 49  gregates(pNC, pI
28e80 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20  tem->pExpr);.   
28e90 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
28ea0 41 6c 6c 6f 63 61 74 65 20 61 20 73 69 6e 67 6c  Allocate a singl
28eb0 65 20 6e 65 77 20 72 65 67 69 73 74 65 72 20 66  e new register f
28ec0 6f 72 20 75 73 65 20 74 6f 20 68 6f 6c 64 20 73  or use to hold s
28ed0 6f 6d 65 20 69 6e 74 65 72 6d 65 64 69 61 74 65  ome intermediate
28ee0 20 72 65 73 75 6c 74 2e 0a 2a 2f 0a 69 6e 74 20   result..*/.int 
28ef0 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
28f00 67 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  g(Parse *pParse)
28f10 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  {.  if( pParse->
28f20 6e 54 65 6d 70 52 65 67 3d 3d 30 20 29 7b 0a 20  nTempReg==0 ){. 
28f30 20 20 20 72 65 74 75 72 6e 20 2b 2b 70 50 61 72     return ++pPar
28f40 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 7d 0a 20 20  se->nMem;.  }.  
28f50 72 65 74 75 72 6e 20 70 50 61 72 73 65 2d 3e 61  return pParse->a
28f60 54 65 6d 70 52 65 67 5b 2d 2d 70 50 61 72 73 65  TempReg[--pParse
28f70 2d 3e 6e 54 65 6d 70 52 65 67 5d 3b 0a 7d 0a 0a  ->nTempReg];.}..
28f80 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65  /*.** Deallocate
28f90 20 61 20 72 65 67 69 73 74 65 72 2c 20 6d 61 6b   a register, mak
28fa0 69 6e 67 20 61 76 61 69 6c 61 62 6c 65 20 66 6f  ing available fo
28fb0 72 20 72 65 75 73 65 20 66 6f 72 20 73 6f 6d 65  r reuse for some
28fc0 20 6f 74 68 65 72 0a 2a 2a 20 70 75 72 70 6f 73   other.** purpos
28fd0 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 72 65  e..**.** If a re
28fe0 67 69 73 74 65 72 20 69 73 20 63 75 72 72 65 6e  gister is curren
28ff0 74 6c 79 20 62 65 69 6e 67 20 75 73 65 64 20 62  tly being used b
29000 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63  y the column cac
29010 68 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20  he, then.** the 
29020 64 65 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20  deallocation is 
29030 64 65 66 65 72 72 65 64 20 75 6e 74 69 6c 20 74  deferred until t
29040 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20  he column cache 
29050 6c 69 6e 65 20 74 68 61 74 20 75 73 65 73 0a 2a  line that uses.*
29060 2a 20 74 68 65 20 72 65 67 69 73 74 65 72 20 62  * the register b
29070 65 63 6f 6d 65 73 20 73 74 61 6c 65 2e 0a 2a 2f  ecomes stale..*/
29080 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65 6c  .void sqlite3Rel
29090 65 61 73 65 54 65 6d 70 52 65 67 28 50 61 72 73  easeTempReg(Pars
290a0 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
290b0 52 65 67 29 7b 0a 20 20 69 66 28 20 69 52 65 67  Reg){.  if( iReg
290c0 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d   && pParse->nTem
290d0 70 52 65 67 3c 41 72 72 61 79 53 69 7a 65 28 70  pReg<ArraySize(p
290e0 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 29  Parse->aTempReg)
290f0 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
29100 20 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61     struct yColCa
29110 63 68 65 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28  che *p;.    for(
29120 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61  i=0, p=pParse->a
29130 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49  ColCache; i<SQLI
29140 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69  TE_N_COLCACHE; i
29150 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 20 20  ++, p++){.      
29160 69 66 28 20 70 2d 3e 69 52 65 67 3d 3d 69 52 65  if( p->iReg==iRe
29170 67 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  g ){.        p->
29180 74 65 6d 70 52 65 67 20 3d 20 31 3b 0a 20 20 20  tempReg = 1;.   
29190 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
291a0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
291b0 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b  Parse->aTempReg[
291c0 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67  pParse->nTempReg
291d0 2b 2b 5d 20 3d 20 69 52 65 67 3b 0a 20 20 7d 0a  ++] = iReg;.  }.
291e0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  }../*.** Allocat
291f0 65 20 6f 72 20 64 65 61 6c 6c 6f 63 61 74 65 20  e or deallocate 
29200 61 20 62 6c 6f 63 6b 20 6f 66 20 6e 52 65 67 20  a block of nReg 
29210 63 6f 6e 73 65 63 75 74 69 76 65 20 72 65 67 69  consecutive regi
29220 73 74 65 72 73 0a 2a 2f 0a 69 6e 74 20 73 71 6c  sters.*/.int sql
29230 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65  ite3GetTempRange
29240 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
29250 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20 69 6e 74  int nReg){.  int
29260 20 69 2c 20 6e 3b 0a 20 20 69 20 3d 20 70 50 61   i, n;.  i = pPa
29270 72 73 65 2d 3e 69 52 61 6e 67 65 52 65 67 3b 0a  rse->iRangeReg;.
29280 20 20 6e 20 3d 20 70 50 61 72 73 65 2d 3e 6e 52    n = pParse->nR
29290 61 6e 67 65 52 65 67 3b 0a 20 20 69 66 28 20 6e  angeReg;.  if( n
292a0 52 65 67 3c 3d 6e 20 29 7b 0a 20 20 20 20 61 73  Reg<=n ){.    as
292b0 73 65 72 74 28 20 21 75 73 65 64 41 73 43 6f 6c  sert( !usedAsCol
292c0 75 6d 6e 43 61 63 68 65 28 70 50 61 72 73 65 2c  umnCache(pParse,
292d0 20 69 2c 20 69 2b 6e 2d 31 29 20 29 3b 0a 20 20   i, i+n-1) );.  
292e0 20 20 70 50 61 72 73 65 2d 3e 69 52 61 6e 67 65    pParse->iRange
292f0 52 65 67 20 2b 3d 20 6e 52 65 67 3b 0a 20 20 20  Reg += nReg;.   
29300 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52   pParse->nRangeR
29310 65 67 20 2d 3d 20 6e 52 65 67 3b 0a 20 20 7d 65  eg -= nReg;.  }e
29320 6c 73 65 7b 0a 20 20 20 20 69 20 3d 20 70 50 61  lse{.    i = pPa
29330 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20  rse->nMem+1;.   
29340 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
29350 20 6e 52 65 67 3b 0a 20 20 7d 0a 20 20 72 65 74   nReg;.  }.  ret
29360 75 72 6e 20 69 3b 0a 7d 0a 76 6f 69 64 20 73 71  urn i;.}.void sq
29370 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
29380 52 61 6e 67 65 28 50 61 72 73 65 20 2a 70 50 61  Range(Parse *pPa
29390 72 73 65 2c 20 69 6e 74 20 69 52 65 67 2c 20 69  rse, int iReg, i
293a0 6e 74 20 6e 52 65 67 29 7b 0a 20 20 73 71 6c 69  nt nReg){.  sqli
293b0 74 65 33 45 78 70 72 43 61 63 68 65 52 65 6d 6f  te3ExprCacheRemo
293c0 76 65 28 70 50 61 72 73 65 2c 20 69 52 65 67 2c  ve(pParse, iReg,
293d0 20 6e 52 65 67 29 3b 0a 20 20 69 66 28 20 6e 52   nReg);.  if( nR
293e0 65 67 3e 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67  eg>pParse->nRang
293f0 65 52 65 67 20 29 7b 0a 20 20 20 20 70 50 61 72  eReg ){.    pPar
29400 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20 3d 20  se->nRangeReg = 
29410 6e 52 65 67 3b 0a 20 20 20 20 70 50 61 72 73 65  nReg;.    pParse
29420 2d 3e 69 52 61 6e 67 65 52 65 67 20 3d 20 69 52  ->iRangeReg = iR
29430 65 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  eg;.  }.}../*.**
29440 20 4d 61 72 6b 20 61 6c 6c 20 74 65 6d 70 6f 72   Mark all tempor
29450 61 72 79 20 72 65 67 69 73 74 65 72 73 20 61 73  ary registers as
29460 20 62 65 69 6e 67 20 75 6e 61 76 61 69 6c 61 62   being unavailab
29470 6c 65 20 66 6f 72 20 72 65 75 73 65 2e 0a 2a 2f  le for reuse..*/
29480 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6c 65  .void sqlite3Cle
29490 61 72 54 65 6d 70 52 65 67 43 61 63 68 65 28 50  arTempRegCache(P
294a0 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20  arse *pParse){. 
294b0 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65   pParse->nTempRe
294c0 67 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d  g = 0;.  pParse-
294d0 3e 6e 52 61 6e 67 65 52 65 67 20 3d 20 30 3b 0a  >nRangeReg = 0;.
294e0 7d 0a 0a 2f 2a 0a 2a 2a 20 56 61 6c 69 64 61 74  }../*.** Validat
294f0 65 20 74 68 61 74 20 6e 6f 20 74 65 6d 70 6f 72  e that no tempor
29500 61 72 79 20 72 65 67 69 73 74 65 72 20 66 61 6c  ary register fal
29510 6c 73 20 77 69 74 68 69 6e 20 74 68 65 20 72 61  ls within the ra
29520 6e 67 65 20 6f 66 0a 2a 2a 20 69 46 69 72 73 74  nge of.** iFirst
29530 2e 2e 69 4c 61 73 74 2c 20 69 6e 63 6c 75 73 69  ..iLast, inclusi
29540 76 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ve.  This routin
29550 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 20 66  e is only call f
29560 72 6f 6d 20 77 69 74 68 69 6e 20 61 73 73 65 72  rom within asser
29570 74 28 29 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74  t().** statement
29580 73 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  s..*/.#ifdef SQL
29590 49 54 45 5f 44 45 42 55 47 0a 69 6e 74 20 73 71  ITE_DEBUG.int sq
295a0 6c 69 74 65 33 4e 6f 54 65 6d 70 73 49 6e 52 61  lite3NoTempsInRa
295b0 6e 67 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  nge(Parse *pPars
295c0 65 2c 20 69 6e 74 20 69 46 69 72 73 74 2c 20 69  e, int iFirst, i
295d0 6e 74 20 69 4c 61 73 74 29 7b 0a 20 20 69 6e 74  nt iLast){.  int
295e0 20 69 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65   i;.  if( pParse
295f0 2d 3e 6e 52 61 6e 67 65 52 65 67 3e 30 0a 20 20  ->nRangeReg>0.  
29600 20 26 26 20 70 50 61 72 73 65 2d 3e 69 52 61 6e   && pParse->iRan
29610 67 65 52 65 67 2b 70 50 61 72 73 65 2d 3e 6e 52  geReg+pParse->nR
29620 61 6e 67 65 52 65 67 3c 69 4c 61 73 74 0a 20 20  angeReg<iLast.  
29630 20 26 26 20 70 50 61 72 73 65 2d 3e 69 52 61 6e   && pParse->iRan
29640 67 65 52 65 67 3e 3d 69 46 69 72 73 74 0a 20 20  geReg>=iFirst.  
29650 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30  ){.     return 0
29660 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b  ;.  }.  for(i=0;
29670 20 69 3c 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70   i<pParse->nTemp
29680 52 65 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  Reg; i++){.    i
29690 66 28 20 70 50 61 72 73 65 2d 3e 61 54 65 6d 70  f( pParse->aTemp
296a0 52 65 67 5b 69 5d 3e 3d 69 46 69 72 73 74 20 26  Reg[i]>=iFirst &
296b0 26 20 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52  & pParse->aTempR
296c0 65 67 5b 69 5d 3c 3d 69 4c 61 73 74 20 29 7b 0a  eg[i]<=iLast ){.
296d0 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
296e0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
296f0 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  rn 1;.}.#endif /
29700 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a  * SQLITE_DEBUG *
29710 2f 0a                                            /.