/ Hex Artifact Content
Login

Artifact bdc98d3301358bac9b19e23a22375f5220a77274:


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: 54 68 65 20 63 61 6c 6c 65 72 20 72 65 74 61 69  The caller retai
2f20: 6e 73 20 6f 77 6e 65 72 73 68 69 70 20 6f 66 20  ns ownership of 
2f30: 70 56 65 63 74 6f 72 20 61 6e 64 20 6d 75 73 74  pVector and must
2f40: 20 65 6e 73 75 72 65 20 74 68 61 74 20 70 56 65   ensure that pVe
2f50: 63 74 6f 72 0a 2a 2a 20 72 65 6d 61 69 6e 73 20  ctor.** remains 
2f60: 76 61 6c 69 64 20 61 73 20 6c 6f 6e 67 20 61 73  valid as long as
2f70: 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 76 61   the returned va
2f80: 6c 75 65 20 69 73 20 69 6e 20 75 73 65 2e 0a 2a  lue is in use..*
2f90: 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45  /.Expr *sqlite3E
2fa0: 78 70 72 46 6f 72 56 65 63 74 6f 72 46 69 65 6c  xprForVectorFiel
2fb0: 64 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  d(.  Parse *pPar
2fc0: 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72  se,       /* Par
2fd0: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
2fe0: 20 20 45 78 70 72 20 2a 70 56 65 63 74 6f 72 2c    Expr *pVector,
2ff0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76 65         /* The ve
3000: 63 74 6f 72 2e 20 20 4c 69 73 74 20 6f 66 20 65  ctor.  List of e
3010: 78 70 72 65 73 73 69 6f 6e 73 20 6f 72 20 61 20  xpressions or a 
3020: 73 75 62 2d 53 45 4c 45 43 54 20 2a 2f 0a 20 20  sub-SELECT */.  
3030: 69 6e 74 20 69 46 69 65 6c 64 20 20 20 20 20 20  int iField      
3040: 20 20 20 20 20 2f 2a 20 57 68 69 63 68 20 63 6f       /* Which co
3050: 6c 75 6d 6e 20 6f 66 20 74 68 65 20 76 65 63 74  lumn of the vect
3060: 6f 72 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a  or to return */.
3070: 29 7b 0a 20 20 45 78 70 72 20 2a 70 52 65 74 3b  ){.  Expr *pRet;
3080: 0a 20 20 69 66 28 20 70 56 65 63 74 6f 72 2d 3e  .  if( pVector->
3090: 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b  op==TK_SELECT ){
30a0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 56 65  .    assert( pVe
30b0: 63 74 6f 72 2d 3e 66 6c 61 67 73 20 26 20 45 50  ctor->flags & EP
30c0: 5f 78 49 73 53 65 6c 65 63 74 20 29 3b 0a 20 20  _xIsSelect );.  
30d0: 20 20 2f 2a 20 54 68 65 20 54 4b 5f 53 45 4c 45    /* The TK_SELE
30e0: 43 54 5f 43 4f 4c 55 4d 4e 20 45 78 70 72 20 6e  CT_COLUMN Expr n
30f0: 6f 64 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ode:.    **.    
3100: 2a 2a 20 70 4c 65 66 74 3a 20 20 20 20 20 20 20  ** pLeft:       
3110: 20 20 20 20 70 56 65 63 74 6f 72 20 63 6f 6e 74      pVector cont
3120: 61 69 6e 69 6e 67 20 54 4b 5f 53 45 4c 45 43 54  aining TK_SELECT
3130: 0a 20 20 20 20 2a 2a 20 70 52 69 67 68 74 3a 20  .    ** pRight: 
3140: 20 20 20 20 20 20 20 20 20 70 56 65 63 74 6f 72           pVector
3150: 20 69 66 20 6f 77 6e 65 72 73 68 69 70 20 74 61   if ownership ta
3160: 6b 65 6e 0a 20 20 20 20 2a 2a 20 69 43 6f 6c 75  ken.    ** iColu
3170: 6d 6e 3a 20 20 20 20 20 20 20 20 20 49 6e 64 65  mn:         Inde
3180: 78 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20 69 6e  x of a column in
3190: 20 70 56 65 63 74 6f 72 0a 20 20 20 20 2a 2a 20   pVector.    ** 
31a0: 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3a 20 20  pLeft->iTable:  
31b0: 20 46 69 72 73 74 20 69 6e 20 61 6e 20 61 72 72   First in an arr
31c0: 61 79 20 6f 66 20 72 65 67 69 73 74 65 72 20 68  ay of register h
31d0: 6f 6c 64 69 6e 67 20 72 65 73 75 6c 74 2c 20 6f  olding result, o
31e0: 72 20 30 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  r 0.    **      
31f0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 74              if t
3200: 68 65 20 72 65 73 75 6c 74 20 69 73 20 6e 6f 74  he result is not
3210: 20 79 65 74 20 63 6f 6d 70 75 74 65 64 2e 0a 20   yet computed.. 
3220: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 73 71 6c     **.    ** sql
3230: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 29  ite3ExprDelete()
3240: 20 73 70 65 63 69 66 69 63 61 6c 6c 79 20 73 6b   specifically sk
3250: 69 70 73 20 74 68 65 20 72 65 63 75 72 73 69 76  ips the recursiv
3260: 65 20 64 65 6c 65 74 65 20 6f 66 0a 20 20 20 20  e delete of.    
3270: 2a 2a 20 70 4c 65 66 74 20 6f 6e 20 54 4b 5f 53  ** pLeft on TK_S
3280: 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20 6e 6f 64  ELECT_COLUMN nod
3290: 65 73 2e 20 20 42 75 74 20 70 52 69 67 68 74 20  es.  But pRight 
32a0: 69 73 20 66 6f 6c 6c 6f 77 65 64 2c 20 73 6f 20  is followed, so 
32b0: 70 56 65 63 74 6f 72 0a 20 20 20 20 2a 2a 20 69  pVector.    ** i
32c0: 73 20 69 6e 63 6c 75 64 65 64 20 6f 6e 20 70 52  s included on pR
32d0: 69 67 68 74 20 69 66 20 6f 77 6e 65 72 73 68 69  ight if ownershi
32e0: 70 20 69 73 20 74 61 6b 65 6e 2e 20 20 54 79 70  p is taken.  Typ
32f0: 69 63 61 6c 6c 79 20 74 68 65 72 65 20 77 69 6c  ically there wil
3300: 6c 0a 20 20 20 20 2a 2a 20 62 65 20 6d 75 6c 74  l.    ** be mult
3310: 69 70 6c 65 20 54 4b 5f 53 45 4c 45 43 54 5f 43  iple TK_SELECT_C
3320: 4f 4c 55 4d 4e 20 6e 6f 64 65 73 20 77 69 74 68  OLUMN nodes with
3330: 20 74 68 65 20 73 61 6d 65 20 70 4c 65 66 74 20   the same pLeft 
3340: 70 6f 69 6e 74 65 72 20 74 6f 20 0a 20 20 20 20  pointer to .    
3350: 2a 2a 20 74 68 65 20 70 56 65 63 74 6f 72 2c 20  ** the pVector, 
3360: 62 75 74 20 6f 6e 6c 79 20 6f 6e 65 20 6f 66 20  but only one of 
3370: 74 68 65 6d 20 77 69 6c 6c 20 6f 77 6e 20 74 68  them will own th
3380: 65 20 70 56 65 63 74 6f 72 2e 0a 20 20 20 20 2a  e pVector..    *
3390: 2f 0a 20 20 20 20 70 52 65 74 20 3d 20 73 71 6c  /.    pRet = sql
33a0: 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
33b0: 2c 20 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55  , TK_SELECT_COLU
33c0: 4d 4e 2c 20 70 56 65 63 74 6f 72 2c 20 30 2c 20  MN, pVector, 0, 
33d0: 30 29 3b 0a 20 20 20 20 69 66 28 20 70 52 65 74  0);.    if( pRet
33e0: 20 29 20 70 52 65 74 2d 3e 69 43 6f 6c 75 6d 6e   ) pRet->iColumn
33f0: 20 3d 20 69 46 69 65 6c 64 3b 0a 20 20 20 20 61   = iField;.    a
3400: 73 73 65 72 74 28 20 70 52 65 74 3d 3d 30 20 7c  ssert( pRet==0 |
3410: 7c 20 70 52 65 74 2d 3e 69 54 61 62 6c 65 3d 3d  | pRet->iTable==
3420: 30 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  0 );.  }else{.  
3430: 20 20 69 66 28 20 70 56 65 63 74 6f 72 2d 3e 6f    if( pVector->o
3440: 70 3d 3d 54 4b 5f 56 45 43 54 4f 52 20 29 20 70  p==TK_VECTOR ) p
3450: 56 65 63 74 6f 72 20 3d 20 70 56 65 63 74 6f 72  Vector = pVector
3460: 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 46 69  ->x.pList->a[iFi
3470: 65 6c 64 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  eld].pExpr;.    
3480: 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33 45 78  pRet = sqlite3Ex
3490: 70 72 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62  prDup(pParse->db
34a0: 2c 20 70 56 65 63 74 6f 72 2c 20 30 29 3b 0a 20  , pVector, 0);. 
34b0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74   }.  return pRet
34c0: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64  ;.}.#endif /* !d
34d0: 65 66 69 6e 65 28 53 51 4c 49 54 45 5f 4f 4d 49  efine(SQLITE_OMI
34e0: 54 5f 53 55 42 51 55 45 52 59 29 20 2a 2f 0a 0a  T_SUBQUERY) */..
34f0: 2f 2a 0a 2a 2a 20 49 66 20 65 78 70 72 65 73 73  /*.** If express
3500: 69 6f 6e 20 70 45 78 70 72 20 69 73 20 6f 66 20  ion pExpr is of 
3510: 74 79 70 65 20 54 4b 5f 53 45 4c 45 43 54 2c 20  type TK_SELECT, 
3520: 67 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  generate code to
3530: 20 65 76 61 6c 75 61 74 65 0a 2a 2a 20 69 74 2e   evaluate.** it.
3540: 20 52 65 74 75 72 6e 20 74 68 65 20 72 65 67 69   Return the regi
3550: 73 74 65 72 20 69 6e 20 77 68 69 63 68 20 74 68  ster in which th
3560: 65 20 72 65 73 75 6c 74 20 69 73 20 73 74 6f 72  e result is stor
3570: 65 64 20 28 6f 72 2c 20 69 66 20 74 68 65 20 0a  ed (or, if the .
3580: 2a 2a 20 73 75 62 2d 73 65 6c 65 63 74 20 72 65  ** sub-select re
3590: 74 75 72 6e 73 20 6d 6f 72 65 20 74 68 61 6e 20  turns more than 
35a0: 6f 6e 65 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 20  one column, the 
35b0: 66 69 72 73 74 20 69 6e 20 61 6e 20 61 72 72 61  first in an arra
35c0: 79 0a 2a 2a 20 6f 66 20 72 65 67 69 73 74 65 72  y.** of register
35d0: 73 20 69 6e 20 77 68 69 63 68 20 74 68 65 20 72  s in which the r
35e0: 65 73 75 6c 74 20 69 73 20 73 74 6f 72 65 64 29  esult is stored)
35f0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78 70 72  ..**.** If pExpr
3600: 20 69 73 20 6e 6f 74 20 61 20 54 4b 5f 53 45 4c   is not a TK_SEL
3610: 45 43 54 20 65 78 70 72 65 73 73 69 6f 6e 2c 20  ECT expression, 
3620: 72 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61  return 0..*/.sta
3630: 74 69 63 20 69 6e 74 20 65 78 70 72 43 6f 64 65  tic int exprCode
3640: 53 75 62 73 65 6c 65 63 74 28 50 61 72 73 65 20  Subselect(Parse 
3650: 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
3660: 45 78 70 72 29 7b 0a 20 20 69 6e 74 20 72 65 67  Expr){.  int reg
3670: 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51   = 0;.#ifndef SQ
3680: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
3690: 52 59 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  RY.  if( pExpr->
36a0: 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b  op==TK_SELECT ){
36b0: 0a 20 20 20 20 72 65 67 20 3d 20 73 71 6c 69 74  .    reg = sqlit
36c0: 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28  e3CodeSubselect(
36d0: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 30  pParse, pExpr, 0
36e0: 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  , 0);.  }.#endif
36f0: 0a 20 20 72 65 74 75 72 6e 20 72 65 67 3b 0a 7d  .  return reg;.}
3700: 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74  ../*.** Argument
3710: 20 70 56 65 63 74 6f 72 20 70 6f 69 6e 74 73 20   pVector points 
3720: 74 6f 20 61 20 76 65 63 74 6f 72 20 65 78 70 72  to a vector expr
3730: 65 73 73 69 6f 6e 20 2d 20 65 69 74 68 65 72 20  ession - either 
3740: 61 20 54 4b 5f 56 45 43 54 4f 52 0a 2a 2a 20 6f  a TK_VECTOR.** o
3750: 72 20 54 4b 5f 53 45 4c 45 43 54 20 74 68 61 74  r TK_SELECT that
3760: 20 72 65 74 75 72 6e 73 20 6d 6f 72 65 20 74 68   returns more th
3770: 61 6e 20 6f 6e 65 20 63 6f 6c 75 6d 6e 2e 20 54  an one column. T
3780: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
3790: 75 72 6e 73 0a 2a 2a 20 74 68 65 20 72 65 67 69  urns.** the regi
37a0: 73 74 65 72 20 6e 75 6d 62 65 72 20 6f 66 20 61  ster number of a
37b0: 20 72 65 67 69 73 74 65 72 20 74 68 61 74 20 63   register that c
37c0: 6f 6e 74 61 69 6e 73 20 74 68 65 20 76 61 6c 75  ontains the valu
37d0: 65 20 6f 66 0a 2a 2a 20 65 6c 65 6d 65 6e 74 20  e of.** element 
37e0: 69 46 69 65 6c 64 20 6f 66 20 74 68 65 20 76 65  iField of the ve
37f0: 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  ctor..**.** If p
3800: 56 65 63 74 6f 72 20 69 73 20 61 20 54 4b 5f 53  Vector is a TK_S
3810: 45 4c 45 43 54 20 65 78 70 72 65 73 73 69 6f 6e  ELECT expression
3820: 2c 20 74 68 65 6e 20 63 6f 64 65 20 66 6f 72 20  , then code for 
3830: 69 74 20 6d 75 73 74 20 68 61 76 65 20 0a 2a 2a  it must have .**
3840: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 67 65   already been ge
3850: 6e 65 72 61 74 65 64 20 75 73 69 6e 67 20 74 68  nerated using th
3860: 65 20 65 78 70 72 43 6f 64 65 53 75 62 73 65 6c  e exprCodeSubsel
3870: 65 63 74 28 29 20 72 6f 75 74 69 6e 65 2e 20 49  ect() routine. I
3880: 6e 20 74 68 69 73 0a 2a 2a 20 63 61 73 65 20 70  n this.** case p
3890: 61 72 61 6d 65 74 65 72 20 72 65 67 53 65 6c 65  arameter regSele
38a0: 63 74 20 73 68 6f 75 6c 64 20 62 65 20 74 68 65  ct should be the
38b0: 20 66 69 72 73 74 20 69 6e 20 61 6e 20 61 72 72   first in an arr
38c0: 61 79 20 6f 66 20 72 65 67 69 73 74 65 72 73 0a  ay of registers.
38d0: 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ** containing th
38e0: 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65  e results of the
38f0: 20 73 75 62 2d 73 65 6c 65 63 74 2e 20 0a 2a 2a   sub-select. .**
3900: 0a 2a 2a 20 49 66 20 70 56 65 63 74 6f 72 20 69  .** If pVector i
3910: 73 20 6f 66 20 74 79 70 65 20 54 4b 5f 56 45 43  s of type TK_VEC
3920: 54 4f 52 2c 20 74 68 65 6e 20 63 6f 64 65 20 66  TOR, then code f
3930: 6f 72 20 74 68 65 20 72 65 71 75 65 73 74 65 64  or the requested
3940: 20 66 69 65 6c 64 0a 2a 2a 20 69 73 20 67 65 6e   field.** is gen
3950: 65 72 61 74 65 64 2e 20 49 6e 20 74 68 69 73 20  erated. In this 
3960: 63 61 73 65 20 28 2a 70 52 65 67 46 72 65 65 29  case (*pRegFree)
3970: 20 6d 61 79 20 62 65 20 73 65 74 20 74 6f 20 74   may be set to t
3980: 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  he number of.** 
3990: 61 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69  a temporary regi
39a0: 73 74 65 72 20 74 6f 20 62 65 20 66 72 65 65 64  ster to be freed
39b0: 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20 62   by the caller b
39c0: 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
39d0: 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 72 65  .**.** Before re
39e0: 74 75 72 6e 69 6e 67 2c 20 6f 75 74 70 75 74 20  turning, output 
39f0: 70 61 72 61 6d 65 74 65 72 20 28 2a 70 70 45 78  parameter (*ppEx
3a00: 70 72 29 20 69 73 20 73 65 74 20 74 6f 20 70 6f  pr) is set to po
3a10: 69 6e 74 20 74 6f 20 74 68 65 0a 2a 2a 20 45 78  int to the.** Ex
3a20: 70 72 20 6f 62 6a 65 63 74 20 63 6f 72 72 65 73  pr object corres
3a30: 70 6f 6e 64 69 6e 67 20 74 6f 20 65 6c 65 6d 65  ponding to eleme
3a40: 6e 74 20 69 45 6c 65 6d 20 6f 66 20 74 68 65 20  nt iElem of the 
3a50: 76 65 63 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69  vector..*/.stati
3a60: 63 20 69 6e 74 20 65 78 70 72 56 65 63 74 6f 72  c int exprVector
3a70: 52 65 67 69 73 74 65 72 28 0a 20 20 50 61 72 73  Register(.  Pars
3a80: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
3a90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
3aa0: 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  arse context */.
3ab0: 20 20 45 78 70 72 20 2a 70 56 65 63 74 6f 72 2c    Expr *pVector,
3ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ad0: 20 20 2f 2a 20 56 65 63 74 6f 72 20 74 6f 20 65    /* Vector to e
3ae0: 78 74 72 61 63 74 20 65 6c 65 6d 65 6e 74 20 66  xtract element f
3af0: 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 46 69  rom */.  int iFi
3b00: 65 6c 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  eld,            
3b10: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 65 6c           /* Fiel
3b20: 64 20 74 6f 20 65 78 74 72 61 63 74 20 66 72 6f  d to extract fro
3b30: 6d 20 70 56 65 63 74 6f 72 20 2a 2f 0a 20 20 69  m pVector */.  i
3b40: 6e 74 20 72 65 67 53 65 6c 65 63 74 2c 20 20 20  nt regSelect,   
3b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3b60: 2a 20 46 69 72 73 74 20 69 6e 20 61 72 72 61 79  * First in array
3b70: 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 2a 2f   of registers */
3b80: 0a 20 20 45 78 70 72 20 2a 2a 70 70 45 78 70 72  .  Expr **ppExpr
3b90: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
3ba0: 20 20 20 2f 2a 20 4f 55 54 3a 20 45 78 70 72 65     /* OUT: Expre
3bb0: 73 73 69 6f 6e 20 65 6c 65 6d 65 6e 74 20 2a 2f  ssion element */
3bc0: 0a 20 20 69 6e 74 20 2a 70 52 65 67 46 72 65 65  .  int *pRegFree
3bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3be0: 20 20 20 2f 2a 20 4f 55 54 3a 20 54 65 6d 70 20     /* OUT: Temp 
3bf0: 72 65 67 69 73 74 65 72 20 74 6f 20 66 72 65 65  register to free
3c00: 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28   */.){.  assert(
3c10: 20 70 56 65 63 74 6f 72 2d 3e 6f 70 3d 3d 54 4b   pVector->op==TK
3c20: 5f 56 45 43 54 4f 52 20 7c 7c 20 70 56 65 63 74  _VECTOR || pVect
3c30: 6f 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43  or->op==TK_SELEC
3c40: 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  T );.  assert( (
3c50: 70 56 65 63 74 6f 72 2d 3e 6f 70 3d 3d 54 4b 5f  pVector->op==TK_
3c60: 56 45 43 54 4f 52 29 3d 3d 28 72 65 67 53 65 6c  VECTOR)==(regSel
3c70: 65 63 74 3d 3d 30 29 20 29 3b 0a 20 20 69 66 28  ect==0) );.  if(
3c80: 20 72 65 67 53 65 6c 65 63 74 20 29 7b 0a 20 20   regSelect ){.  
3c90: 20 20 2a 70 70 45 78 70 72 20 3d 20 70 56 65 63    *ppExpr = pVec
3ca0: 74 6f 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e  tor->x.pSelect->
3cb0: 70 45 4c 69 73 74 2d 3e 61 5b 69 46 69 65 6c 64  pEList->a[iField
3cc0: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 72 65  ].pExpr;.     re
3cd0: 74 75 72 6e 20 72 65 67 53 65 6c 65 63 74 2b 69  turn regSelect+i
3ce0: 46 69 65 6c 64 3b 0a 20 20 7d 0a 20 20 2a 70 70  Field;.  }.  *pp
3cf0: 45 78 70 72 20 3d 20 70 56 65 63 74 6f 72 2d 3e  Expr = pVector->
3d00: 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 46 69 65 6c  x.pList->a[iFiel
3d10: 64 5d 2e 70 45 78 70 72 3b 0a 20 20 72 65 74 75  d].pExpr;.  retu
3d20: 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  rn sqlite3ExprCo
3d30: 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 2a  deTemp(pParse, *
3d40: 70 70 45 78 70 72 2c 20 70 52 65 67 46 72 65 65  ppExpr, pRegFree
3d50: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 70 72  );.}../*.** Expr
3d60: 65 73 73 69 6f 6e 20 70 45 78 70 72 20 69 73 20  ession pExpr is 
3d70: 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 62 65 74  a comparison bet
3d80: 77 65 65 6e 20 74 77 6f 20 76 65 63 74 6f 72 20  ween two vector 
3d90: 76 61 6c 75 65 73 2e 20 43 6f 6d 70 75 74 65 0a  values. Compute.
3da0: 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66  ** the result of
3db0: 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20   the comparison 
3dc0: 28 31 2c 20 30 2c 20 6f 72 20 4e 55 4c 4c 29 20  (1, 0, or NULL) 
3dd0: 61 6e 64 20 77 72 69 74 65 20 74 68 61 74 0a 2a  and write that.*
3de0: 2a 20 72 65 73 75 6c 74 20 69 6e 74 6f 20 72 65  * result into re
3df0: 67 69 73 74 65 72 20 64 65 73 74 2e 0a 2a 2a 0a  gister dest..**.
3e00: 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75  ** The caller mu
3e10: 73 74 20 73 61 74 69 73 66 79 20 74 68 65 20 66  st satisfy the f
3e20: 6f 6c 6c 6f 77 69 6e 67 20 70 72 65 63 6f 6e 64  ollowing precond
3e30: 69 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  itions:.**.**   
3e40: 20 69 66 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54   if pExpr->op==T
3e50: 4b 5f 49 53 3a 20 20 20 20 20 20 6f 70 3d 3d 54  K_IS:      op==T
3e60: 4b 5f 45 51 20 61 6e 64 20 70 35 3d 3d 53 51 4c  K_EQ and p5==SQL
3e70: 49 54 45 5f 4e 55 4c 4c 45 51 0a 2a 2a 20 20 20  ITE_NULLEQ.**   
3e80: 20 69 66 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54   if pExpr->op==T
3e90: 4b 5f 49 53 4e 4f 54 3a 20 20 20 6f 70 3d 3d 54  K_ISNOT:   op==T
3ea0: 4b 5f 4e 45 20 61 6e 64 20 70 35 3d 3d 53 51 4c  K_NE and p5==SQL
3eb0: 49 54 45 5f 4e 55 4c 4c 45 51 0a 2a 2a 20 20 20  ITE_NULLEQ.**   
3ec0: 20 6f 74 68 65 72 77 69 73 65 3a 20 20 20 20 20   otherwise:     
3ed0: 20 20 20 20 20 20 20 20 20 20 20 6f 70 3d 3d 70             op==p
3ee0: 45 78 70 72 2d 3e 6f 70 20 61 6e 64 20 70 35 3d  Expr->op and p5=
3ef0: 3d 30 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  =0.*/.static voi
3f00: 64 20 63 6f 64 65 56 65 63 74 6f 72 43 6f 6d 70  d codeVectorComp
3f10: 61 72 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50  are(.  Parse *pP
3f20: 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  arse,        /* 
3f30: 43 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20 63  Code generator c
3f40: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
3f50: 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20 20   *pExpr,        
3f60: 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 61 72 69    /* The compari
3f70: 73 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f  son operation */
3f80: 0a 20 20 69 6e 74 20 64 65 73 74 2c 20 20 20 20  .  int dest,    
3f90: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
3fa0: 65 20 72 65 73 75 6c 74 73 20 69 6e 74 6f 20 74  e results into t
3fb0: 68 69 73 20 72 65 67 69 73 74 65 72 20 2a 2f 0a  his register */.
3fc0: 20 20 75 38 20 6f 70 2c 20 20 20 20 20 20 20 20    u8 op,        
3fd0: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 61          /* Compa
3fe0: 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 20 2a  rison operator *
3ff0: 2f 0a 20 20 75 38 20 70 35 20 20 20 20 20 20 20  /.  u8 p5       
4000: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c            /* SQL
4010: 49 54 45 5f 4e 55 4c 4c 45 51 20 6f 72 20 7a 65  ITE_NULLEQ or ze
4020: 72 6f 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20  ro */.){.  Vdbe 
4030: 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
4040: 62 65 3b 0a 20 20 45 78 70 72 20 2a 70 4c 65 66  be;.  Expr *pLef
4050: 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  t = pExpr->pLeft
4060: 3b 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68 74  ;.  Expr *pRight
4070: 20 3d 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74   = pExpr->pRight
4080: 3b 0a 20 20 69 6e 74 20 6e 4c 65 66 74 20 3d 20  ;.  int nLeft = 
4090: 73 71 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f  sqlite3ExprVecto
40a0: 72 53 69 7a 65 28 70 4c 65 66 74 29 3b 0a 20 20  rSize(pLeft);.  
40b0: 69 6e 74 20 6e 52 69 67 68 74 20 3d 20 73 71 6c  int nRight = sql
40c0: 69 74 65 33 45 78 70 72 56 65 63 74 6f 72 53 69  ite3ExprVectorSi
40d0: 7a 65 28 70 52 69 67 68 74 29 3b 0a 0a 20 20 2f  ze(pRight);..  /
40e0: 2a 20 43 68 65 63 6b 20 74 68 61 74 20 62 6f 74  * Check that bot
40f0: 68 20 73 69 64 65 73 20 6f 66 20 74 68 65 20 63  h sides of the c
4100: 6f 6d 70 61 72 69 73 6f 6e 20 61 72 65 20 76 65  omparison are ve
4110: 63 74 6f 72 73 2c 20 61 6e 64 20 74 68 61 74 0a  ctors, and that.
4120: 20 20 2a 2a 20 62 6f 74 68 20 61 72 65 20 74 68    ** both are th
4130: 65 20 73 61 6d 65 20 6c 65 6e 67 74 68 2e 20 20  e same length.  
4140: 2a 2f 0a 20 20 69 66 28 20 6e 4c 65 66 74 21 3d  */.  if( nLeft!=
4150: 6e 52 69 67 68 74 20 29 7b 0a 20 20 20 20 73 71  nRight ){.    sq
4160: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
4170: 61 72 73 65 2c 20 22 69 6e 76 61 6c 69 64 20 75  arse, "invalid u
4180: 73 65 20 6f 66 20 72 6f 77 20 76 61 6c 75 65 22  se of row value"
4190: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
41a0: 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 72  int i;.    int r
41b0: 65 67 4c 65 66 74 20 3d 20 30 3b 0a 20 20 20 20  egLeft = 0;.    
41c0: 69 6e 74 20 72 65 67 52 69 67 68 74 20 3d 20 30  int regRight = 0
41d0: 3b 0a 20 20 20 20 75 38 20 6f 70 78 20 3d 20 6f  ;.    u8 opx = o
41e0: 70 3b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 44  p;.    int addrD
41f0: 6f 6e 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62  one = sqlite3Vdb
4200: 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a  eMakeLabel(v);..
4210: 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
4220: 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 20 7c 7c 20  r->op==TK_EQ || 
4230: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4e 45  pExpr->op==TK_NE
4240: 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 45   .         || pE
4250: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 7c  xpr->op==TK_IS |
4260: 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  | pExpr->op==TK_
4270: 49 53 4e 4f 54 20 0a 20 20 20 20 20 20 20 20 20  ISNOT .         
4280: 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  || pExpr->op==TK
4290: 5f 4c 54 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70  _LT || pExpr->op
42a0: 3d 3d 54 4b 5f 47 54 20 0a 20 20 20 20 20 20 20  ==TK_GT .       
42b0: 20 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d    || pExpr->op==
42c0: 54 4b 5f 4c 45 20 7c 7c 20 70 45 78 70 72 2d 3e  TK_LE || pExpr->
42d0: 6f 70 3d 3d 54 4b 5f 47 45 20 0a 20 20 20 20 29  op==TK_GE .    )
42e0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45  ;.    assert( pE
42f0: 78 70 72 2d 3e 6f 70 3d 3d 6f 70 20 7c 7c 20 28  xpr->op==op || (
4300: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53  pExpr->op==TK_IS
4310: 20 26 26 20 6f 70 3d 3d 54 4b 5f 45 51 29 0a 20   && op==TK_EQ). 
4320: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
4330: 28 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49  (pExpr->op==TK_I
4340: 53 4e 4f 54 20 26 26 20 6f 70 3d 3d 54 4b 5f 4e  SNOT && op==TK_N
4350: 45 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  E) );.    assert
4360: 28 20 70 35 3d 3d 30 20 7c 7c 20 70 45 78 70 72  ( p5==0 || pExpr
4370: 2d 3e 6f 70 21 3d 6f 70 20 29 3b 0a 20 20 20 20  ->op!=op );.    
4380: 61 73 73 65 72 74 28 20 70 35 3d 3d 53 51 4c 49  assert( p5==SQLI
4390: 54 45 5f 4e 55 4c 4c 45 51 20 7c 7c 20 70 45 78  TE_NULLEQ || pEx
43a0: 70 72 2d 3e 6f 70 3d 3d 6f 70 20 29 3b 0a 0a 20  pr->op==op );.. 
43b0: 20 20 20 70 35 20 7c 3d 20 53 51 4c 49 54 45 5f     p5 |= SQLITE_
43c0: 53 54 4f 52 45 50 32 3b 0a 20 20 20 20 69 66 28  STOREP2;.    if(
43d0: 20 6f 70 78 3d 3d 54 4b 5f 4c 45 20 29 20 6f 70   opx==TK_LE ) op
43e0: 78 20 3d 20 54 4b 5f 4c 54 3b 0a 20 20 20 20 69  x = TK_LT;.    i
43f0: 66 28 20 6f 70 78 3d 3d 54 4b 5f 47 45 20 29 20  f( opx==TK_GE ) 
4400: 6f 70 78 20 3d 20 54 4b 5f 47 54 3b 0a 0a 20 20  opx = TK_GT;..  
4410: 20 20 72 65 67 4c 65 66 74 20 3d 20 65 78 70 72    regLeft = expr
4420: 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70 50  CodeSubselect(pP
4430: 61 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a 20 20  arse, pLeft);.  
4440: 20 20 72 65 67 52 69 67 68 74 20 3d 20 65 78 70    regRight = exp
4450: 72 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70  rCodeSubselect(p
4460: 50 61 72 73 65 2c 20 70 52 69 67 68 74 29 3b 0a  Parse, pRight);.
4470: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
4480: 6e 4c 65 66 74 3b 20 69 2b 2b 29 7b 0a 20 20 20  nLeft; i++){.   
4490: 20 20 20 69 6e 74 20 72 65 67 46 72 65 65 31 20     int regFree1 
44a0: 3d 20 30 2c 20 72 65 67 46 72 65 65 32 20 3d 20  = 0, regFree2 = 
44b0: 30 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  0;.      Expr *p
44c0: 4c 2c 20 2a 70 52 3b 20 0a 20 20 20 20 20 20 69  L, *pR; .      i
44d0: 6e 74 20 72 31 2c 20 72 32 3b 0a 20 20 20 20 20  nt r1, r2;.     
44e0: 20 69 66 28 20 69 3e 30 20 29 20 73 71 6c 69 74   if( i>0 ) sqlit
44f0: 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28  e3ExprCachePush(
4500: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 72  pParse);.      r
4510: 31 20 3d 20 65 78 70 72 56 65 63 74 6f 72 52 65  1 = exprVectorRe
4520: 67 69 73 74 65 72 28 70 50 61 72 73 65 2c 20 70  gister(pParse, p
4530: 4c 65 66 74 2c 20 69 2c 20 72 65 67 4c 65 66 74  Left, i, regLeft
4540: 2c 20 26 70 4c 2c 20 26 72 65 67 46 72 65 65 31  , &pL, &regFree1
4550: 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 65 78  );.      r2 = ex
4560: 70 72 56 65 63 74 6f 72 52 65 67 69 73 74 65 72  prVectorRegister
4570: 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 2c  (pParse, pRight,
4580: 20 69 2c 20 72 65 67 52 69 67 68 74 2c 20 26 70   i, regRight, &p
4590: 52 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20  R, &regFree2);. 
45a0: 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65       codeCompare
45b0: 28 70 50 61 72 73 65 2c 20 70 4c 2c 20 70 52 2c  (pParse, pL, pR,
45c0: 20 6f 70 78 2c 20 72 31 2c 20 72 32 2c 20 64 65   opx, r1, r2, de
45d0: 73 74 2c 20 70 35 29 3b 0a 20 20 20 20 20 20 74  st, p5);.      t
45e0: 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c  estcase(op==OP_L
45f0: 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  t); VdbeCoverage
4600: 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 74 29 3b  If(v,op==OP_Lt);
4610: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
4620: 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 20 56 64 62 65  op==OP_Le); Vdbe
4630: 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d  CoverageIf(v,op=
4640: 3d 4f 50 5f 4c 65 29 3b 0a 20 20 20 20 20 20 74  =OP_Le);.      t
4650: 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47  estcase(op==OP_G
4660: 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  t); VdbeCoverage
4670: 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 74 29 3b  If(v,op==OP_Gt);
4680: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
4690: 6f 70 3d 3d 4f 50 5f 47 65 29 3b 20 56 64 62 65  op==OP_Ge); Vdbe
46a0: 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d  CoverageIf(v,op=
46b0: 3d 4f 50 5f 47 65 29 3b 0a 20 20 20 20 20 20 74  =OP_Ge);.      t
46c0: 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 45  estcase(op==OP_E
46d0: 71 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  q); VdbeCoverage
46e0: 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 45 71 29 3b  If(v,op==OP_Eq);
46f0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
4700: 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 20 56 64 62 65  op==OP_Ne); Vdbe
4710: 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d  CoverageIf(v,op=
4720: 3d 4f 50 5f 4e 65 29 3b 0a 20 20 20 20 20 20 73  =OP_Ne);.      s
4730: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
4740: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
4750: 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 73 71  Free1);.      sq
4760: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
4770: 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46  Reg(pParse, regF
4780: 72 65 65 32 29 3b 0a 20 20 20 20 20 20 69 66 28  ree2);.      if(
4790: 20 69 3e 30 20 29 20 73 71 6c 69 74 65 33 45 78   i>0 ) sqlite3Ex
47a0: 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73  prCachePop(pPars
47b0: 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 3d  e);.      if( i=
47c0: 3d 6e 4c 65 66 74 2d 31 20 29 7b 0a 20 20 20 20  =nLeft-1 ){.    
47d0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
47e0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6f 70 78   }.      if( opx
47f0: 3d 3d 54 4b 5f 45 51 20 29 7b 0a 20 20 20 20 20  ==TK_EQ ){.     
4800: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
4810: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 4e 6f 74  dOp2(v, OP_IfNot
4820: 2c 20 64 65 73 74 2c 20 61 64 64 72 44 6f 6e 65  , dest, addrDone
4830: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
4840: 76 29 3b 0a 20 20 20 20 20 20 20 20 70 35 20 7c  v);.        p5 |
4850: 3d 20 53 51 4c 49 54 45 5f 4b 45 45 50 4e 55 4c  = SQLITE_KEEPNUL
4860: 4c 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  L;.      }else i
4870: 66 28 20 6f 70 78 3d 3d 54 4b 5f 4e 45 20 29 7b  f( opx==TK_NE ){
4880: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
4890: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
48a0: 5f 49 66 2c 20 64 65 73 74 2c 20 61 64 64 72 44  _If, dest, addrD
48b0: 6f 6e 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61  one); VdbeCovera
48c0: 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 70  ge(v);.        p
48d0: 35 20 7c 3d 20 53 51 4c 49 54 45 5f 4b 45 45 50  5 |= SQLITE_KEEP
48e0: 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 7d 65 6c 73  NULL;.      }els
48f0: 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  e{.        asser
4900: 74 28 20 6f 70 3d 3d 54 4b 5f 4c 54 20 7c 7c 20  t( op==TK_LT || 
4910: 6f 70 3d 3d 54 4b 5f 47 54 20 7c 7c 20 6f 70 3d  op==TK_GT || op=
4920: 3d 54 4b 5f 4c 45 20 7c 7c 20 6f 70 3d 3d 54 4b  =TK_LE || op==TK
4930: 5f 47 45 20 29 3b 0a 20 20 20 20 20 20 20 20 73  _GE );.        s
4940: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
4950: 28 76 2c 20 4f 50 5f 45 6c 73 65 4e 6f 74 45 71  (v, OP_ElseNotEq
4960: 2c 20 30 2c 20 61 64 64 72 44 6f 6e 65 29 3b 0a  , 0, addrDone);.
4970: 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
4980: 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b  rageIf(v, op==TK
4990: 5f 4c 54 29 3b 0a 20 20 20 20 20 20 20 20 56 64  _LT);.        Vd
49a0: 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
49b0: 6f 70 3d 3d 54 4b 5f 47 54 29 3b 0a 20 20 20 20  op==TK_GT);.    
49c0: 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
49d0: 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4c 45 29  If(v, op==TK_LE)
49e0: 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
49f0: 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
4a00: 54 4b 5f 47 45 29 3b 0a 20 20 20 20 20 20 20 20  TK_GE);.        
4a10: 69 66 28 20 69 3d 3d 6e 4c 65 66 74 2d 32 20 29  if( i==nLeft-2 )
4a20: 20 6f 70 78 20 3d 20 6f 70 3b 0a 20 20 20 20 20   opx = op;.     
4a30: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
4a40: 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
4a50: 61 62 65 6c 28 76 2c 20 61 64 64 72 44 6f 6e 65  abel(v, addrDone
4a60: 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 53 51  );.  }.}..#if SQ
4a70: 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45  LITE_MAX_EXPR_DE
4a80: 50 54 48 3e 30 0a 2f 2a 0a 2a 2a 20 43 68 65 63  PTH>0./*.** Chec
4a90: 6b 20 74 68 61 74 20 61 72 67 75 6d 65 6e 74 20  k that argument 
4aa0: 6e 48 65 69 67 68 74 20 69 73 20 6c 65 73 73 20  nHeight is less 
4ab0: 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
4ac0: 20 74 68 65 20 6d 61 78 69 6d 75 6d 0a 2a 2a 20   the maximum.** 
4ad0: 65 78 70 72 65 73 73 69 6f 6e 20 64 65 70 74 68  expression depth
4ae0: 20 61 6c 6c 6f 77 65 64 2e 20 49 66 20 69 74 20   allowed. If it 
4af0: 69 73 20 6e 6f 74 2c 20 6c 65 61 76 65 20 61 6e  is not, leave an
4b00: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
4b10: 6e 0a 2a 2a 20 70 50 61 72 73 65 2e 0a 2a 2f 0a  n.** pParse..*/.
4b20: 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43  int sqlite3ExprC
4b30: 68 65 63 6b 48 65 69 67 68 74 28 50 61 72 73 65  heckHeight(Parse
4b40: 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 6e 48   *pParse, int nH
4b50: 65 69 67 68 74 29 7b 0a 20 20 69 6e 74 20 72 63  eight){.  int rc
4b60: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
4b70: 69 6e 74 20 6d 78 48 65 69 67 68 74 20 3d 20 70  int mxHeight = p
4b80: 50 61 72 73 65 2d 3e 64 62 2d 3e 61 4c 69 6d 69  Parse->db->aLimi
4b90: 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 45  t[SQLITE_LIMIT_E
4ba0: 58 50 52 5f 44 45 50 54 48 5d 3b 0a 20 20 69 66  XPR_DEPTH];.  if
4bb0: 28 20 6e 48 65 69 67 68 74 3e 6d 78 48 65 69 67  ( nHeight>mxHeig
4bc0: 68 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ht ){.    sqlite
4bd0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
4be0: 2c 20 0a 20 20 20 20 20 20 20 22 45 78 70 72 65  , .       "Expre
4bf0: 73 73 69 6f 6e 20 74 72 65 65 20 69 73 20 74 6f  ssion tree is to
4c00: 6f 20 6c 61 72 67 65 20 28 6d 61 78 69 6d 75 6d  o large (maximum
4c10: 20 64 65 70 74 68 20 25 64 29 22 2c 20 6d 78 48   depth %d)", mxH
4c20: 65 69 67 68 74 0a 20 20 20 20 29 3b 0a 20 20 20  eight.    );.   
4c30: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
4c40: 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  OR;.  }.  return
4c50: 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 66   rc;.}../* The f
4c60: 6f 6c 6c 6f 77 69 6e 67 20 74 68 72 65 65 20 66  ollowing three f
4c70: 75 6e 63 74 69 6f 6e 73 2c 20 68 65 69 67 68 74  unctions, height
4c80: 4f 66 45 78 70 72 28 29 2c 20 68 65 69 67 68 74  OfExpr(), height
4c90: 4f 66 45 78 70 72 4c 69 73 74 28 29 0a 2a 2a 20  OfExprList().** 
4ca0: 61 6e 64 20 68 65 69 67 68 74 4f 66 53 65 6c 65  and heightOfSele
4cb0: 63 74 28 29 2c 20 61 72 65 20 75 73 65 64 20 74  ct(), are used t
4cc0: 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20  o determine the 
4cd0: 6d 61 78 69 6d 75 6d 20 68 65 69 67 68 74 0a 2a  maximum height.*
4ce0: 2a 20 6f 66 20 61 6e 79 20 65 78 70 72 65 73 73  * of any express
4cf0: 69 6f 6e 20 74 72 65 65 20 72 65 66 65 72 65 6e  ion tree referen
4d00: 63 65 64 20 62 79 20 74 68 65 20 73 74 72 75 63  ced by the struc
4d10: 74 75 72 65 20 70 61 73 73 65 64 20 61 73 20 74  ture passed as t
4d20: 68 65 0a 2a 2a 20 66 69 72 73 74 20 61 72 67 75  he.** first argu
4d30: 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ment..**.** If t
4d40: 68 69 73 20 6d 61 78 69 6d 75 6d 20 68 65 69 67  his maximum heig
4d50: 68 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68  ht is greater th
4d60: 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 76  an the current v
4d70: 61 6c 75 65 20 70 6f 69 6e 74 65 64 0a 2a 2a 20  alue pointed.** 
4d80: 74 6f 20 62 79 20 70 6e 48 65 69 67 68 74 2c 20  to by pnHeight, 
4d90: 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d  the second param
4da0: 65 74 65 72 2c 20 74 68 65 6e 20 73 65 74 20 2a  eter, then set *
4db0: 70 6e 48 65 69 67 68 74 20 74 6f 20 74 68 61 74  pnHeight to that
4dc0: 0a 2a 2a 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74  .** value..*/.st
4dd0: 61 74 69 63 20 76 6f 69 64 20 68 65 69 67 68 74  atic void height
4de0: 4f 66 45 78 70 72 28 45 78 70 72 20 2a 70 2c 20  OfExpr(Expr *p, 
4df0: 69 6e 74 20 2a 70 6e 48 65 69 67 68 74 29 7b 0a  int *pnHeight){.
4e00: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69    if( p ){.    i
4e10: 66 28 20 70 2d 3e 6e 48 65 69 67 68 74 3e 2a 70  f( p->nHeight>*p
4e20: 6e 48 65 69 67 68 74 20 29 7b 0a 20 20 20 20 20  nHeight ){.     
4e30: 20 2a 70 6e 48 65 69 67 68 74 20 3d 20 70 2d 3e   *pnHeight = p->
4e40: 6e 48 65 69 67 68 74 3b 0a 20 20 20 20 7d 0a 20  nHeight;.    }. 
4e50: 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64   }.}.static void
4e60: 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73   heightOfExprLis
4e70: 74 28 45 78 70 72 4c 69 73 74 20 2a 70 2c 20 69  t(ExprList *p, i
4e80: 6e 74 20 2a 70 6e 48 65 69 67 68 74 29 7b 0a 20  nt *pnHeight){. 
4e90: 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69 6e   if( p ){.    in
4ea0: 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t i;.    for(i=0
4eb0: 3b 20 69 3c 70 2d 3e 6e 45 78 70 72 3b 20 69 2b  ; i<p->nExpr; i+
4ec0: 2b 29 7b 0a 20 20 20 20 20 20 68 65 69 67 68 74  +){.      height
4ed0: 4f 66 45 78 70 72 28 70 2d 3e 61 5b 69 5d 2e 70  OfExpr(p->a[i].p
4ee0: 45 78 70 72 2c 20 70 6e 48 65 69 67 68 74 29 3b  Expr, pnHeight);
4ef0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61  .    }.  }.}.sta
4f00: 74 69 63 20 76 6f 69 64 20 68 65 69 67 68 74 4f  tic void heightO
4f10: 66 53 65 6c 65 63 74 28 53 65 6c 65 63 74 20 2a  fSelect(Select *
4f20: 70 2c 20 69 6e 74 20 2a 70 6e 48 65 69 67 68 74  p, int *pnHeight
4f30: 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  ){.  if( p ){.  
4f40: 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 28 70    heightOfExpr(p
4f50: 2d 3e 70 57 68 65 72 65 2c 20 70 6e 48 65 69 67  ->pWhere, pnHeig
4f60: 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f  ht);.    heightO
4f70: 66 45 78 70 72 28 70 2d 3e 70 48 61 76 69 6e 67  fExpr(p->pHaving
4f80: 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20  , pnHeight);.   
4f90: 20 68 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d   heightOfExpr(p-
4fa0: 3e 70 4c 69 6d 69 74 2c 20 70 6e 48 65 69 67 68  >pLimit, pnHeigh
4fb0: 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66  t);.    heightOf
4fc0: 45 78 70 72 28 70 2d 3e 70 4f 66 66 73 65 74 2c  Expr(p->pOffset,
4fd0: 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20   pnHeight);.    
4fe0: 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74  heightOfExprList
4ff0: 28 70 2d 3e 70 45 4c 69 73 74 2c 20 70 6e 48 65  (p->pEList, pnHe
5000: 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68  ight);.    heigh
5010: 74 4f 66 45 78 70 72 4c 69 73 74 28 70 2d 3e 70  tOfExprList(p->p
5020: 47 72 6f 75 70 42 79 2c 20 70 6e 48 65 69 67 68  GroupBy, pnHeigh
5030: 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66  t);.    heightOf
5040: 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 4f 72 64  ExprList(p->pOrd
5050: 65 72 42 79 2c 20 70 6e 48 65 69 67 68 74 29 3b  erBy, pnHeight);
5060: 0a 20 20 20 20 68 65 69 67 68 74 4f 66 53 65 6c  .    heightOfSel
5070: 65 63 74 28 70 2d 3e 70 50 72 69 6f 72 2c 20 70  ect(p->pPrior, p
5080: 6e 48 65 69 67 68 74 29 3b 0a 20 20 7d 0a 7d 0a  nHeight);.  }.}.
5090: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 45  ./*.** Set the E
50a0: 78 70 72 2e 6e 48 65 69 67 68 74 20 76 61 72 69  xpr.nHeight vari
50b0: 61 62 6c 65 20 69 6e 20 74 68 65 20 73 74 72 75  able in the stru
50c0: 63 74 75 72 65 20 70 61 73 73 65 64 20 61 73 20  cture passed as 
50d0: 61 6e 20 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e  an .** argument.
50e0: 20 41 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 77   An expression w
50f0: 69 74 68 20 6e 6f 20 63 68 69 6c 64 72 65 6e 2c  ith no children,
5100: 20 45 78 70 72 2e 70 4c 69 73 74 20 6f 72 20 0a   Expr.pList or .
5110: 2a 2a 20 45 78 70 72 2e 70 53 65 6c 65 63 74 20  ** Expr.pSelect 
5120: 6d 65 6d 62 65 72 20 68 61 73 20 61 20 68 65 69  member has a hei
5130: 67 68 74 20 6f 66 20 31 2e 20 41 6e 79 20 6f 74  ght of 1. Any ot
5140: 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a  her expression.*
5150: 2a 20 68 61 73 20 61 20 68 65 69 67 68 74 20 65  * has a height e
5160: 71 75 61 6c 20 74 6f 20 74 68 65 20 6d 61 78 69  qual to the maxi
5170: 6d 75 6d 20 68 65 69 67 68 74 20 6f 66 20 61 6e  mum height of an
5180: 79 20 6f 74 68 65 72 20 0a 2a 2a 20 72 65 66 65  y other .** refe
5190: 72 65 6e 63 65 64 20 45 78 70 72 20 70 6c 75 73  renced Expr plus
51a0: 20 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f   one..**.** Also
51b0: 20 70 72 6f 70 61 67 61 74 65 20 45 50 5f 50 72   propagate EP_Pr
51c0: 6f 70 61 67 61 74 65 20 66 6c 61 67 73 20 75 70  opagate flags up
51d0: 20 66 72 6f 6d 20 45 78 70 72 2e 78 2e 70 4c 69   from Expr.x.pLi
51e0: 73 74 20 74 6f 20 45 78 70 72 2e 66 6c 61 67 73  st to Expr.flags
51f0: 2c 0a 2a 2a 20 69 66 20 61 70 70 72 6f 70 72 69  ,.** if appropri
5200: 61 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ate..*/.static v
5210: 6f 69 64 20 65 78 70 72 53 65 74 48 65 69 67 68  oid exprSetHeigh
5220: 74 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 6e  t(Expr *p){.  in
5230: 74 20 6e 48 65 69 67 68 74 20 3d 20 30 3b 0a 20  t nHeight = 0;. 
5240: 20 68 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d   heightOfExpr(p-
5250: 3e 70 4c 65 66 74 2c 20 26 6e 48 65 69 67 68 74  >pLeft, &nHeight
5260: 29 3b 0a 20 20 68 65 69 67 68 74 4f 66 45 78 70  );.  heightOfExp
5270: 72 28 70 2d 3e 70 52 69 67 68 74 2c 20 26 6e 48  r(p->pRight, &nH
5280: 65 69 67 68 74 29 3b 0a 20 20 69 66 28 20 45 78  eight);.  if( Ex
5290: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
52a0: 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
52b0: 7b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 53 65  {.    heightOfSe
52c0: 6c 65 63 74 28 70 2d 3e 78 2e 70 53 65 6c 65 63  lect(p->x.pSelec
52d0: 74 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a 20 20  t, &nHeight);.  
52e0: 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 78 2e 70  }else if( p->x.p
52f0: 4c 69 73 74 20 29 7b 0a 20 20 20 20 68 65 69 67  List ){.    heig
5300: 68 74 4f 66 45 78 70 72 4c 69 73 74 28 70 2d 3e  htOfExprList(p->
5310: 78 2e 70 4c 69 73 74 2c 20 26 6e 48 65 69 67 68  x.pList, &nHeigh
5320: 74 29 3b 0a 20 20 20 20 70 2d 3e 66 6c 61 67 73  t);.    p->flags
5330: 20 7c 3d 20 45 50 5f 50 72 6f 70 61 67 61 74 65   |= EP_Propagate
5340: 20 26 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   & sqlite3ExprLi
5350: 73 74 46 6c 61 67 73 28 70 2d 3e 78 2e 70 4c 69  stFlags(p->x.pLi
5360: 73 74 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6e 48  st);.  }.  p->nH
5370: 65 69 67 68 74 20 3d 20 6e 48 65 69 67 68 74 20  eight = nHeight 
5380: 2b 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  + 1;.}../*.** Se
5390: 74 20 74 68 65 20 45 78 70 72 2e 6e 48 65 69 67  t the Expr.nHeig
53a0: 68 74 20 76 61 72 69 61 62 6c 65 20 75 73 69 6e  ht variable usin
53b0: 67 20 74 68 65 20 65 78 70 72 53 65 74 48 65 69  g the exprSetHei
53c0: 67 68 74 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20  ght() function. 
53d0: 49 66 0a 2a 2a 20 74 68 65 20 68 65 69 67 68 74  If.** the height
53e0: 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
53f0: 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 61 6c 6c   the maximum all
5400: 6f 77 65 64 20 65 78 70 72 65 73 73 69 6f 6e 20  owed expression 
5410: 64 65 70 74 68 2c 0a 2a 2a 20 6c 65 61 76 65 20  depth,.** leave 
5420: 61 6e 20 65 72 72 6f 72 20 69 6e 20 70 50 61 72  an error in pPar
5430: 73 65 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 70  se..**.** Also p
5440: 72 6f 70 61 67 61 74 65 20 61 6c 6c 20 45 50 5f  ropagate all EP_
5450: 50 72 6f 70 61 67 61 74 65 20 66 6c 61 67 73 20  Propagate flags 
5460: 66 72 6f 6d 20 74 68 65 20 45 78 70 72 2e 78 2e  from the Expr.x.
5470: 70 4c 69 73 74 20 69 6e 74 6f 0a 2a 2a 20 45 78  pList into.** Ex
5480: 70 72 2e 66 6c 61 67 73 2e 20 0a 2a 2f 0a 76 6f  pr.flags. .*/.vo
5490: 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 53 65  id sqlite3ExprSe
54a0: 74 48 65 69 67 68 74 41 6e 64 46 6c 61 67 73 28  tHeightAndFlags(
54b0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
54c0: 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  xpr *p){.  if( p
54d0: 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 72 65  Parse->nErr ) re
54e0: 74 75 72 6e 3b 0a 20 20 65 78 70 72 53 65 74 48  turn;.  exprSetH
54f0: 65 69 67 68 74 28 70 29 3b 0a 20 20 73 71 6c 69  eight(p);.  sqli
5500: 74 65 33 45 78 70 72 43 68 65 63 6b 48 65 69 67  te3ExprCheckHeig
5510: 68 74 28 70 50 61 72 73 65 2c 20 70 2d 3e 6e 48  ht(pParse, p->nH
5520: 65 69 67 68 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  eight);.}../*.**
5530: 20 52 65 74 75 72 6e 20 74 68 65 20 6d 61 78 69   Return the maxi
5540: 6d 75 6d 20 68 65 69 67 68 74 20 6f 66 20 61 6e  mum height of an
5550: 79 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  y expression tre
5560: 65 20 72 65 66 65 72 65 6e 63 65 64 0a 2a 2a 20  e referenced.** 
5570: 62 79 20 74 68 65 20 73 65 6c 65 63 74 20 73 74  by the select st
5580: 61 74 65 6d 65 6e 74 20 70 61 73 73 65 64 20 61  atement passed a
5590: 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  s an argument..*
55a0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 65 6c  /.int sqlite3Sel
55b0: 65 63 74 45 78 70 72 48 65 69 67 68 74 28 53 65  ectExprHeight(Se
55c0: 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69 6e 74 20  lect *p){.  int 
55d0: 6e 48 65 69 67 68 74 20 3d 20 30 3b 0a 20 20 68  nHeight = 0;.  h
55e0: 65 69 67 68 74 4f 66 53 65 6c 65 63 74 28 70 2c  eightOfSelect(p,
55f0: 20 26 6e 48 65 69 67 68 74 29 3b 0a 20 20 72 65   &nHeight);.  re
5600: 74 75 72 6e 20 6e 48 65 69 67 68 74 3b 0a 7d 0a  turn nHeight;.}.
5610: 23 65 6c 73 65 20 2f 2a 20 41 42 4f 56 45 3a 20  #else /* ABOVE: 
5620: 20 48 65 69 67 68 74 20 65 6e 66 6f 72 63 65 6d   Height enforcem
5630: 65 6e 74 20 65 6e 61 62 6c 65 64 2e 20 20 42 45  ent enabled.  BE
5640: 4c 4f 57 3a 20 48 65 69 67 68 74 20 65 6e 66 6f  LOW: Height enfo
5650: 72 63 65 6d 65 6e 74 20 6f 66 66 20 2a 2f 0a 2f  rcement off */./
5660: 2a 0a 2a 2a 20 50 72 6f 70 61 67 61 74 65 20 61  *.** Propagate a
5670: 6c 6c 20 45 50 5f 50 72 6f 70 61 67 61 74 65 20  ll EP_Propagate 
5680: 66 6c 61 67 73 20 66 72 6f 6d 20 74 68 65 20 45  flags from the E
5690: 78 70 72 2e 78 2e 70 4c 69 73 74 20 69 6e 74 6f  xpr.x.pList into
56a0: 0a 2a 2a 20 45 78 70 72 2e 66 6c 61 67 73 2e 20  .** Expr.flags. 
56b0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
56c0: 45 78 70 72 53 65 74 48 65 69 67 68 74 41 6e 64  ExprSetHeightAnd
56d0: 46 6c 61 67 73 28 50 61 72 73 65 20 2a 70 50 61  Flags(Parse *pPa
56e0: 72 73 65 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20  rse, Expr *p){. 
56f0: 20 69 66 28 20 70 20 26 26 20 70 2d 3e 78 2e 70   if( p && p->x.p
5700: 4c 69 73 74 20 26 26 20 21 45 78 70 72 48 61 73  List && !ExprHas
5710: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 78  Property(p, EP_x
5720: 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20  IsSelect) ){.   
5730: 20 70 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f   p->flags |= EP_
5740: 50 72 6f 70 61 67 61 74 65 20 26 20 73 71 6c 69  Propagate & sqli
5750: 74 65 33 45 78 70 72 4c 69 73 74 46 6c 61 67 73  te3ExprListFlags
5760: 28 70 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20  (p->x.pList);.  
5770: 7d 0a 7d 0a 23 64 65 66 69 6e 65 20 65 78 70 72  }.}.#define expr
5780: 53 65 74 48 65 69 67 68 74 28 79 29 0a 23 65 6e  SetHeight(y).#en
5790: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 41  dif /* SQLITE_MA
57a0: 58 5f 45 58 50 52 5f 44 45 50 54 48 3e 30 20 2a  X_EXPR_DEPTH>0 *
57b0: 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  /../*.** This ro
57c0: 75 74 69 6e 65 20 69 73 20 74 68 65 20 63 6f 72  utine is the cor
57d0: 65 20 61 6c 6c 6f 63 61 74 6f 72 20 66 6f 72 20  e allocator for 
57e0: 45 78 70 72 20 6e 6f 64 65 73 2e 0a 2a 2a 0a 2a  Expr nodes..**.*
57f0: 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20 6e 65  * Construct a ne
5800: 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64  w expression nod
5810: 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70  e and return a p
5820: 6f 69 6e 74 65 72 20 74 6f 20 69 74 2e 20 20 4d  ointer to it.  M
5830: 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72 20 74 68 69  emory.** for thi
5840: 73 20 6e 6f 64 65 20 61 6e 64 20 66 6f 72 20 74  s node and for t
5850: 68 65 20 70 54 6f 6b 65 6e 20 61 72 67 75 6d 65  he pToken argume
5860: 6e 74 20 69 73 20 61 20 73 69 6e 67 6c 65 20 61  nt is a single a
5870: 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 6f 62 74  llocation.** obt
5880: 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
5890: 65 33 44 62 4d 61 6c 6c 6f 63 28 29 2e 20 20 54  e3DbMalloc().  T
58a0: 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  he calling funct
58b0: 69 6f 6e 0a 2a 2a 20 69 73 20 72 65 73 70 6f 6e  ion.** is respon
58c0: 73 69 62 6c 65 20 66 6f 72 20 6d 61 6b 69 6e 67  sible for making
58d0: 20 73 75 72 65 20 74 68 65 20 6e 6f 64 65 20 65   sure the node e
58e0: 76 65 6e 74 75 61 6c 6c 79 20 67 65 74 73 20 66  ventually gets f
58f0: 72 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64  reed..**.** If d
5900: 65 71 75 6f 74 65 20 69 73 20 74 72 75 65 2c 20  equote is true, 
5910: 74 68 65 6e 20 74 68 65 20 74 6f 6b 65 6e 20 28  then the token (
5920: 69 66 20 69 74 20 65 78 69 73 74 73 29 20 69 73  if it exists) is
5930: 20 64 65 71 75 6f 74 65 64 2e 0a 2a 2a 20 49 66   dequoted..** If
5940: 20 64 65 71 75 6f 74 65 20 69 73 20 66 61 6c 73   dequote is fals
5950: 65 2c 20 6e 6f 20 64 65 71 75 6f 74 69 6e 67 20  e, no dequoting 
5960: 69 73 20 70 65 72 66 6f 72 6d 65 64 2e 20 20 54  is performed.  T
5970: 68 65 20 64 65 51 75 6f 74 65 0a 2a 2a 20 70 61  he deQuote.** pa
5980: 72 61 6d 65 74 65 72 20 69 73 20 69 67 6e 6f 72  rameter is ignor
5990: 65 64 20 69 66 20 70 54 6f 6b 65 6e 20 69 73 20  ed if pToken is 
59a0: 4e 55 4c 4c 20 6f 72 20 69 66 20 74 68 65 20 74  NULL or if the t
59b0: 6f 6b 65 6e 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a  oken does not.**
59c0: 20 61 70 70 65 61 72 20 74 6f 20 62 65 20 71 75   appear to be qu
59d0: 6f 74 65 64 2e 20 20 49 66 20 74 68 65 20 71 75  oted.  If the qu
59e0: 6f 74 65 73 20 77 65 72 65 20 6f 66 20 74 68 65  otes were of the
59f0: 20 66 6f 72 6d 20 22 2e 2e 2e 22 20 28 64 6f 75   form "..." (dou
5a00: 62 6c 65 2d 71 75 6f 74 65 73 29 0a 2a 2a 20 74  ble-quotes).** t
5a10: 68 65 6e 20 74 68 65 20 45 50 5f 44 62 6c 51 75  hen the EP_DblQu
5a20: 6f 74 65 64 20 66 6c 61 67 20 69 73 20 73 65 74  oted flag is set
5a30: 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73 69   on the expressi
5a40: 6f 6e 20 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 53  on node..**.** S
5a50: 70 65 63 69 61 6c 20 63 61 73 65 3a 20 20 49 66  pecial case:  If
5a60: 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47 45 52 20   op==TK_INTEGER 
5a70: 61 6e 64 20 70 54 6f 6b 65 6e 20 70 6f 69 6e 74  and pToken point
5a80: 73 20 74 6f 20 61 20 73 74 72 69 6e 67 20 74 68  s to a string th
5a90: 61 74 0a 2a 2a 20 63 61 6e 20 62 65 20 74 72 61  at.** can be tra
5aa0: 6e 73 6c 61 74 65 64 20 69 6e 74 6f 20 61 20 33  nslated into a 3
5ab0: 32 2d 62 69 74 20 69 6e 74 65 67 65 72 2c 20 74  2-bit integer, t
5ac0: 68 65 6e 20 74 68 65 20 74 6f 6b 65 6e 20 69 73  hen the token is
5ad0: 20 6e 6f 74 0a 2a 2a 20 73 74 6f 72 65 64 20 69   not.** stored i
5ae0: 6e 20 75 2e 7a 54 6f 6b 65 6e 2e 20 20 49 6e 73  n u.zToken.  Ins
5af0: 74 65 61 64 2c 20 74 68 65 20 69 6e 74 65 67 65  tead, the intege
5b00: 72 20 76 61 6c 75 65 73 20 69 73 20 77 72 69 74  r values is writ
5b10: 74 65 6e 0a 2a 2a 20 69 6e 74 6f 20 75 2e 69 56  ten.** into u.iV
5b20: 61 6c 75 65 20 61 6e 64 20 74 68 65 20 45 50 5f  alue and the EP_
5b30: 49 6e 74 56 61 6c 75 65 20 66 6c 61 67 20 69 73  IntValue flag is
5b40: 20 73 65 74 2e 20 20 4e 6f 20 65 78 74 72 61 20   set.  No extra 
5b50: 73 74 6f 72 61 67 65 0a 2a 2a 20 69 73 20 61 6c  storage.** is al
5b60: 6c 6f 63 61 74 65 64 20 74 6f 20 68 6f 6c 64 20  located to hold 
5b70: 74 68 65 20 69 6e 74 65 67 65 72 20 74 65 78 74  the integer text
5b80: 20 61 6e 64 20 74 68 65 20 64 65 71 75 6f 74 65   and the dequote
5b90: 20 66 6c 61 67 20 69 73 20 69 67 6e 6f 72 65 64   flag is ignored
5ba0: 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74  ..*/.Expr *sqlit
5bb0: 65 33 45 78 70 72 41 6c 6c 6f 63 28 0a 20 20 73  e3ExprAlloc(.  s
5bc0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
5bd0: 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65         /* Handle
5be0: 20 66 6f 72 20 73 71 6c 69 74 65 33 44 62 4d 61   for sqlite3DbMa
5bf0: 6c 6c 6f 63 5a 65 72 6f 28 29 20 28 6d 61 79 20  llocZero() (may 
5c00: 62 65 20 6e 75 6c 6c 29 20 2a 2f 0a 20 20 69 6e  be null) */.  in
5c10: 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20  t op,           
5c20: 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73        /* Express
5c30: 69 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20  ion opcode */.  
5c40: 63 6f 6e 73 74 20 54 6f 6b 65 6e 20 2a 70 54 6f  const Token *pTo
5c50: 6b 65 6e 2c 20 20 20 20 2f 2a 20 54 6f 6b 65 6e  ken,    /* Token
5c60: 20 61 72 67 75 6d 65 6e 74 2e 20 20 4d 69 67 68   argument.  Migh
5c70: 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69  t be NULL */.  i
5c80: 6e 74 20 64 65 71 75 6f 74 65 20 20 20 20 20 20  nt dequote      
5c90: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74         /* True t
5ca0: 6f 20 64 65 71 75 6f 74 65 20 2a 2f 0a 29 7b 0a  o dequote */.){.
5cb0: 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20    Expr *pNew;.  
5cc0: 69 6e 74 20 6e 45 78 74 72 61 20 3d 20 30 3b 0a  int nExtra = 0;.
5cd0: 20 20 69 6e 74 20 69 56 61 6c 75 65 20 3d 20 30    int iValue = 0
5ce0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62 21  ;..  assert( db!
5cf0: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 54 6f 6b  =0 );.  if( pTok
5d00: 65 6e 20 29 7b 0a 20 20 20 20 69 66 28 20 6f 70  en ){.    if( op
5d10: 21 3d 54 4b 5f 49 4e 54 45 47 45 52 20 7c 7c 20  !=TK_INTEGER || 
5d20: 70 54 6f 6b 65 6e 2d 3e 7a 3d 3d 30 0a 20 20 20  pToken->z==0.   
5d30: 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65         || sqlite
5d40: 33 47 65 74 49 6e 74 33 32 28 70 54 6f 6b 65 6e  3GetInt32(pToken
5d50: 2d 3e 7a 2c 20 26 69 56 61 6c 75 65 29 3d 3d 30  ->z, &iValue)==0
5d60: 20 29 7b 0a 20 20 20 20 20 20 6e 45 78 74 72 61   ){.      nExtra
5d70: 20 3d 20 70 54 6f 6b 65 6e 2d 3e 6e 2b 31 3b 0a   = pToken->n+1;.
5d80: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 56        assert( iV
5d90: 61 6c 75 65 3e 3d 30 20 29 3b 0a 20 20 20 20 7d  alue>=0 );.    }
5da0: 0a 20 20 7d 0a 20 20 70 4e 65 77 20 3d 20 73 71  .  }.  pNew = sq
5db0: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
5dc0: 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 45 78  NN(db, sizeof(Ex
5dd0: 70 72 29 2b 6e 45 78 74 72 61 29 3b 0a 20 20 69  pr)+nExtra);.  i
5de0: 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 6d  f( pNew ){.    m
5df0: 65 6d 73 65 74 28 70 4e 65 77 2c 20 30 2c 20 73  emset(pNew, 0, s
5e00: 69 7a 65 6f 66 28 45 78 70 72 29 29 3b 0a 20 20  izeof(Expr));.  
5e10: 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 28 75 38    pNew->op = (u8
5e20: 29 6f 70 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69  )op;.    pNew->i
5e30: 41 67 67 20 3d 20 2d 31 3b 0a 20 20 20 20 69 66  Agg = -1;.    if
5e40: 28 20 70 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20  ( pToken ){.    
5e50: 20 20 69 66 28 20 6e 45 78 74 72 61 3d 3d 30 20    if( nExtra==0 
5e60: 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  ){.        pNew-
5e70: 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 49 6e 74  >flags |= EP_Int
5e80: 56 61 6c 75 65 3b 0a 20 20 20 20 20 20 20 20 70  Value;.        p
5e90: 4e 65 77 2d 3e 75 2e 69 56 61 6c 75 65 20 3d 20  New->u.iValue = 
5ea0: 69 56 61 6c 75 65 3b 0a 20 20 20 20 20 20 7d 65  iValue;.      }e
5eb0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 4e 65  lse{.        pNe
5ec0: 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 3d 20 28 63  w->u.zToken = (c
5ed0: 68 61 72 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a 20  har*)&pNew[1];. 
5ee0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
5ef0: 54 6f 6b 65 6e 2d 3e 7a 21 3d 30 20 7c 7c 20 70  Token->z!=0 || p
5f00: 54 6f 6b 65 6e 2d 3e 6e 3d 3d 30 20 29 3b 0a 20  Token->n==0 );. 
5f10: 20 20 20 20 20 20 20 69 66 28 20 70 54 6f 6b 65         if( pToke
5f20: 6e 2d 3e 6e 20 29 20 6d 65 6d 63 70 79 28 70 4e  n->n ) memcpy(pN
5f30: 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 70 54  ew->u.zToken, pT
5f40: 6f 6b 65 6e 2d 3e 7a 2c 20 70 54 6f 6b 65 6e 2d  oken->z, pToken-
5f50: 3e 6e 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  >n);.        pNe
5f60: 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 70 54 6f 6b  w->u.zToken[pTok
5f70: 65 6e 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 20 20  en->n] = 0;.    
5f80: 20 20 20 20 69 66 28 20 64 65 71 75 6f 74 65 20      if( dequote 
5f90: 26 26 20 73 71 6c 69 74 65 33 49 73 71 75 6f 74  && sqlite3Isquot
5fa0: 65 28 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e  e(pNew->u.zToken
5fb0: 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  [0]) ){.        
5fc0: 20 20 69 66 28 20 70 4e 65 77 2d 3e 75 2e 7a 54    if( pNew->u.zT
5fd0: 6f 6b 65 6e 5b 30 5d 3d 3d 27 22 27 20 29 20 70  oken[0]=='"' ) p
5fe0: 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50  New->flags |= EP
5ff0: 5f 44 62 6c 51 75 6f 74 65 64 3b 0a 20 20 20 20  _DblQuoted;.    
6000: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 71        sqlite3Deq
6010: 75 6f 74 65 28 70 4e 65 77 2d 3e 75 2e 7a 54 6f  uote(pNew->u.zTo
6020: 6b 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ken);.        }.
6030: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69        }.    }.#i
6040: 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50  f SQLITE_MAX_EXP
6050: 52 5f 44 45 50 54 48 3e 30 0a 20 20 20 20 70 4e  R_DEPTH>0.    pN
6060: 65 77 2d 3e 6e 48 65 69 67 68 74 20 3d 20 31 3b  ew->nHeight = 1;
6070: 0a 23 65 6e 64 69 66 20 20 0a 20 20 7d 0a 20 20  .#endif  .  }.  
6080: 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a  return pNew;.}..
6090: 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61  /*.** Allocate a
60a0: 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20   new expression 
60b0: 6e 6f 64 65 20 66 72 6f 6d 20 61 20 7a 65 72 6f  node from a zero
60c0: 2d 74 65 72 6d 69 6e 61 74 65 64 20 74 6f 6b 65  -terminated toke
60d0: 6e 20 74 68 61 74 20 68 61 73 0a 2a 2a 20 61 6c  n that has.** al
60e0: 72 65 61 64 79 20 62 65 65 6e 20 64 65 71 75 6f  ready been dequo
60f0: 74 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71  ted..*/.Expr *sq
6100: 6c 69 74 65 33 45 78 70 72 28 0a 20 20 73 71 6c  lite3Expr(.  sql
6110: 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
6120: 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 66       /* Handle f
6130: 6f 72 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c  or sqlite3DbMall
6140: 6f 63 5a 65 72 6f 28 29 20 28 6d 61 79 20 62 65  ocZero() (may be
6150: 20 6e 75 6c 6c 29 20 2a 2f 0a 20 20 69 6e 74 20   null) */.  int 
6160: 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  op,             
6170: 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
6180: 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 63 6f  n opcode */.  co
6190: 6e 73 74 20 63 68 61 72 20 2a 7a 54 6f 6b 65 6e  nst char *zToken
61a0: 20 20 20 20 20 20 2f 2a 20 54 6f 6b 65 6e 20 61        /* Token a
61b0: 72 67 75 6d 65 6e 74 2e 20 20 4d 69 67 68 74 20  rgument.  Might 
61c0: 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20  be NULL */.){.  
61d0: 54 6f 6b 65 6e 20 78 3b 0a 20 20 78 2e 7a 20 3d  Token x;.  x.z =
61e0: 20 7a 54 6f 6b 65 6e 3b 0a 20 20 78 2e 6e 20 3d   zToken;.  x.n =
61f0: 20 7a 54 6f 6b 65 6e 20 3f 20 73 71 6c 69 74 65   zToken ? sqlite
6200: 33 53 74 72 6c 65 6e 33 30 28 7a 54 6f 6b 65 6e  3Strlen30(zToken
6210: 29 20 3a 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  ) : 0;.  return 
6220: 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63  sqlite3ExprAlloc
6230: 28 64 62 2c 20 6f 70 2c 20 26 78 2c 20 30 29 3b  (db, op, &x, 0);
6240: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 61 63 68  .}../*.** Attach
6250: 20 73 75 62 74 72 65 65 73 20 70 4c 65 66 74 20   subtrees pLeft 
6260: 61 6e 64 20 70 52 69 67 68 74 20 74 6f 20 74 68  and pRight to th
6270: 65 20 45 78 70 72 20 6e 6f 64 65 20 70 52 6f 6f  e Expr node pRoo
6280: 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 52 6f 6f  t..**.** If pRoo
6290: 74 3d 3d 4e 55 4c 4c 20 74 68 61 74 20 6d 65 61  t==NULL that mea
62a0: 6e 73 20 74 68 61 74 20 61 20 6d 65 6d 6f 72 79  ns that a memory
62b0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f   allocation erro
62c0: 72 20 68 61 73 20 6f 63 63 75 72 72 65 64 2e 0a  r has occurred..
62d0: 2a 2a 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c  ** In that case,
62e0: 20 64 65 6c 65 74 65 20 74 68 65 20 73 75 62 74   delete the subt
62f0: 72 65 65 73 20 70 4c 65 66 74 20 61 6e 64 20 70  rees pLeft and p
6300: 52 69 67 68 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  Right..*/.void s
6310: 71 6c 69 74 65 33 45 78 70 72 41 74 74 61 63 68  qlite3ExprAttach
6320: 53 75 62 74 72 65 65 73 28 0a 20 20 73 71 6c 69  Subtrees(.  sqli
6330: 74 65 33 20 2a 64 62 2c 0a 20 20 45 78 70 72 20  te3 *db,.  Expr 
6340: 2a 70 52 6f 6f 74 2c 0a 20 20 45 78 70 72 20 2a  *pRoot,.  Expr *
6350: 70 4c 65 66 74 2c 0a 20 20 45 78 70 72 20 2a 70  pLeft,.  Expr *p
6360: 52 69 67 68 74 0a 29 7b 0a 20 20 69 66 28 20 70  Right.){.  if( p
6370: 52 6f 6f 74 3d 3d 30 20 29 7b 0a 20 20 20 20 61  Root==0 ){.    a
6380: 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f  ssert( db->mallo
6390: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 73  cFailed );.    s
63a0: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
63b0: 28 64 62 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20  (db, pLeft);.   
63c0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
63d0: 74 65 28 64 62 2c 20 70 52 69 67 68 74 29 3b 0a  te(db, pRight);.
63e0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28    }else{.    if(
63f0: 20 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20   pRight ){.     
6400: 20 70 52 6f 6f 74 2d 3e 70 52 69 67 68 74 20 3d   pRoot->pRight =
6410: 20 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 70   pRight;.      p
6420: 52 6f 6f 74 2d 3e 66 6c 61 67 73 20 7c 3d 20 45  Root->flags |= E
6430: 50 5f 50 72 6f 70 61 67 61 74 65 20 26 20 70 52  P_Propagate & pR
6440: 69 67 68 74 2d 3e 66 6c 61 67 73 3b 0a 20 20 20  ight->flags;.   
6450: 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 65 66 74   }.    if( pLeft
6460: 20 29 7b 0a 20 20 20 20 20 20 70 52 6f 6f 74 2d   ){.      pRoot-
6470: 3e 70 4c 65 66 74 20 3d 20 70 4c 65 66 74 3b 0a  >pLeft = pLeft;.
6480: 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e 66 6c 61        pRoot->fla
6490: 67 73 20 7c 3d 20 45 50 5f 50 72 6f 70 61 67 61  gs |= EP_Propaga
64a0: 74 65 20 26 20 70 4c 65 66 74 2d 3e 66 6c 61 67  te & pLeft->flag
64b0: 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 78 70  s;.    }.    exp
64c0: 72 53 65 74 48 65 69 67 68 74 28 70 52 6f 6f 74  rSetHeight(pRoot
64d0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
64e0: 41 6c 6c 6f 63 61 74 65 20 61 6e 20 45 78 70 72  Allocate an Expr
64f0: 20 6e 6f 64 65 20 77 68 69 63 68 20 6a 6f 69 6e   node which join
6500: 73 20 61 73 20 6d 61 6e 79 20 61 73 20 74 77 6f  s as many as two
6510: 20 73 75 62 74 72 65 65 73 2e 0a 2a 2a 0a 2a 2a   subtrees..**.**
6520: 20 4f 6e 65 20 6f 72 20 62 6f 74 68 20 6f 66 20   One or both of 
6530: 74 68 65 20 73 75 62 74 72 65 65 73 20 63 61 6e  the subtrees can
6540: 20 62 65 20 4e 55 4c 4c 2e 20 20 52 65 74 75 72   be NULL.  Retur
6550: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
6560: 68 65 20 6e 65 77 0a 2a 2a 20 45 78 70 72 20 6e  he new.** Expr n
6570: 6f 64 65 2e 20 20 4f 72 2c 20 69 66 20 61 6e 20  ode.  Or, if an 
6580: 4f 4f 4d 20 65 72 72 6f 72 20 6f 63 63 75 72 73  OOM error occurs
6590: 2c 20 73 65 74 20 70 50 61 72 73 65 2d 3e 64 62  , set pParse->db
65a0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 2c 0a  ->mallocFailed,.
65b0: 2a 2a 20 66 72 65 65 20 74 68 65 20 73 75 62 74  ** free the subt
65c0: 72 65 65 73 20 61 6e 64 20 72 65 74 75 72 6e 20  rees and return 
65d0: 4e 55 4c 4c 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73  NULL..*/.Expr *s
65e0: 71 6c 69 74 65 33 50 45 78 70 72 28 0a 20 20 50  qlite3PExpr(.  P
65f0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
6600: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
6610: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69  g context */.  i
6620: 6e 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20  nt op,          
6630: 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73         /* Expres
6640: 73 69 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20  sion opcode */. 
6650: 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 20 20   Expr *pLeft,   
6660: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 66 74           /* Left
6670: 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 45 78   operand */.  Ex
6680: 70 72 20 2a 70 52 69 67 68 74 2c 20 20 20 20 20  pr *pRight,     
6690: 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20 6f        /* Right o
66a0: 70 65 72 61 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73  perand */.  cons
66b0: 74 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 20  t Token *pToken 
66c0: 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20      /* Argument 
66d0: 74 6f 6b 65 6e 20 2a 2f 0a 29 7b 0a 20 20 45 78  token */.){.  Ex
66e0: 70 72 20 2a 70 3b 0a 20 20 69 66 28 20 6f 70 3d  pr *p;.  if( op=
66f0: 3d 54 4b 5f 41 4e 44 20 26 26 20 70 50 61 72 73  =TK_AND && pPars
6700: 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a 20 20  e->nErr==0 ){.  
6710: 20 20 2f 2a 20 54 61 6b 65 20 61 64 76 61 6e 74    /* Take advant
6720: 61 67 65 20 6f 66 20 73 68 6f 72 74 2d 63 69 72  age of short-cir
6730: 63 75 69 74 20 66 61 6c 73 65 20 6f 70 74 69 6d  cuit false optim
6740: 69 7a 61 74 69 6f 6e 20 66 6f 72 20 41 4e 44 20  ization for AND 
6750: 2a 2f 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74  */.    p = sqlit
6760: 65 33 45 78 70 72 41 6e 64 28 70 50 61 72 73 65  e3ExprAnd(pParse
6770: 2d 3e 64 62 2c 20 70 4c 65 66 74 2c 20 70 52 69  ->db, pLeft, pRi
6780: 67 68 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ght);.  }else{. 
6790: 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 45 78     p = sqlite3Ex
67a0: 70 72 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e  prAlloc(pParse->
67b0: 64 62 2c 20 6f 70 20 26 20 54 4b 46 4c 47 5f 4d  db, op & TKFLG_M
67c0: 41 53 4b 2c 20 70 54 6f 6b 65 6e 2c 20 31 29 3b  ASK, pToken, 1);
67d0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
67e0: 41 74 74 61 63 68 53 75 62 74 72 65 65 73 28 70  AttachSubtrees(p
67f0: 50 61 72 73 65 2d 3e 64 62 2c 20 70 2c 20 70 4c  Parse->db, p, pL
6800: 65 66 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20  eft, pRight);.  
6810: 7d 0a 20 20 69 66 28 20 70 20 29 20 7b 0a 20 20  }.  if( p ) {.  
6820: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 68 65    sqlite3ExprChe
6830: 63 6b 48 65 69 67 68 74 28 70 50 61 72 73 65 2c  ckHeight(pParse,
6840: 20 70 2d 3e 6e 48 65 69 67 68 74 29 3b 0a 20 20   p->nHeight);.  
6850: 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a  }.  return p;.}.
6860: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 70 53 65 6c 65  ./*.** Add pSele
6870: 63 74 20 74 6f 20 74 68 65 20 45 78 70 72 2e 78  ct to the Expr.x
6880: 2e 70 53 65 6c 65 63 74 20 66 69 65 6c 64 2e 20  .pSelect field. 
6890: 20 4f 72 2c 20 69 66 20 70 45 78 70 72 20 69 73   Or, if pExpr is
68a0: 20 4e 55 4c 4c 20 28 64 75 65 0a 2a 2a 20 64 6f   NULL (due.** do
68b0: 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61   a memory alloca
68c0: 74 69 6f 6e 20 66 61 69 6c 75 72 65 29 20 74 68  tion failure) th
68d0: 65 6e 20 64 65 6c 65 74 65 20 74 68 65 20 70 53  en delete the pS
68e0: 65 6c 65 63 74 20 6f 62 6a 65 63 74 2e 0a 2a 2f  elect object..*/
68f0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 45 78  .void sqlite3PEx
6900: 70 72 41 64 64 53 65 6c 65 63 74 28 50 61 72 73  prAddSelect(Pars
6910: 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
6920: 2a 70 45 78 70 72 2c 20 53 65 6c 65 63 74 20 2a  *pExpr, Select *
6930: 70 53 65 6c 65 63 74 29 7b 0a 20 20 69 66 28 20  pSelect){.  if( 
6940: 70 45 78 70 72 20 29 7b 0a 20 20 20 20 70 45 78  pExpr ){.    pEx
6950: 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 20 3d 20  pr->x.pSelect = 
6960: 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 45 78 70  pSelect;.    Exp
6970: 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 45 78  rSetProperty(pEx
6980: 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
6990: 7c 45 50 5f 53 75 62 71 75 65 72 79 29 3b 0a 20  |EP_Subquery);. 
69a0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 53 65     sqlite3ExprSe
69b0: 74 48 65 69 67 68 74 41 6e 64 46 6c 61 67 73 28  tHeightAndFlags(
69c0: 70 50 61 72 73 65 2c 20 70 45 78 70 72 29 3b 0a  pParse, pExpr);.
69d0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
69e0: 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64 62 2d  ert( pParse->db-
69f0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
6a00: 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65  .    sqlite3Sele
6a10: 63 74 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d  ctDelete(pParse-
6a20: 3e 64 62 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20  >db, pSelect);. 
6a30: 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20   }.}.../*.** If 
6a40: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
6a50: 73 20 61 6c 77 61 79 73 20 65 69 74 68 65 72 20  s always either 
6a60: 54 52 55 45 20 6f 72 20 46 41 4c 53 45 20 28 72  TRUE or FALSE (r
6a70: 65 73 70 65 63 74 69 76 65 6c 79 29 2c 0a 2a 2a  espectively),.**
6a80: 20 74 68 65 6e 20 72 65 74 75 72 6e 20 31 2e 20   then return 1. 
6a90: 20 49 66 20 6f 6e 65 20 63 61 6e 6e 6f 74 20 64   If one cannot d
6aa0: 65 74 65 72 6d 69 6e 65 20 74 68 65 20 74 72 75  etermine the tru
6ab0: 74 68 20 76 61 6c 75 65 20 6f 66 20 74 68 65 0a  th value of the.
6ac0: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 61 74  ** expression at
6ad0: 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 72 65   compile-time re
6ae0: 74 75 72 6e 20 30 2e 0a 2a 2a 0a 2a 2a 20 54 68  turn 0..**.** Th
6af0: 69 73 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a  is is an optimiz
6b00: 61 74 69 6f 6e 2e 20 20 49 66 20 69 73 20 4f 4b  ation.  If is OK
6b10: 20 74 6f 20 72 65 74 75 72 6e 20 30 20 68 65 72   to return 0 her
6b20: 65 20 65 76 65 6e 20 69 66 0a 2a 2a 20 74 68 65  e even if.** the
6b30: 20 65 78 70 72 65 73 73 69 6f 6e 20 72 65 61 6c   expression real
6b40: 6c 79 20 69 73 20 61 6c 77 61 79 73 20 66 61 6c  ly is always fal
6b50: 73 65 20 6f 72 20 66 61 6c 73 65 20 28 61 20 66  se or false (a f
6b60: 61 6c 73 65 20 6e 65 67 61 74 69 76 65 29 2e 0a  alse negative)..
6b70: 2a 2a 20 42 75 74 20 69 74 20 69 73 20 61 20 62  ** But it is a b
6b80: 75 67 20 74 6f 20 72 65 74 75 72 6e 20 31 20 69  ug to return 1 i
6b90: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
6ba0: 20 6d 69 67 68 74 20 68 61 76 65 20 64 69 66 66   might have diff
6bb0: 65 72 65 6e 74 0a 2a 2a 20 62 6f 6f 6c 65 61 6e  erent.** boolean
6bc0: 20 76 61 6c 75 65 73 20 69 6e 20 64 69 66 66 65   values in diffe
6bd0: 72 65 6e 74 20 63 69 72 63 75 6d 73 74 61 6e 63  rent circumstanc
6be0: 65 73 20 28 61 20 66 61 6c 73 65 20 70 6f 73 69  es (a false posi
6bf0: 74 69 76 65 2e 29 0a 2a 2a 0a 2a 2a 20 4e 6f 74  tive.).**.** Not
6c00: 65 20 74 68 61 74 20 69 66 20 74 68 65 20 65 78  e that if the ex
6c10: 70 72 65 73 73 69 6f 6e 20 69 73 20 70 61 72 74  pression is part
6c20: 20 6f 66 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20   of conditional 
6c30: 66 6f 72 20 61 0a 2a 2a 20 4c 45 46 54 20 4a 4f  for a.** LEFT JO
6c40: 49 4e 2c 20 74 68 65 6e 20 77 65 20 63 61 6e 6e  IN, then we cann
6c50: 6f 74 20 64 65 74 65 72 6d 69 6e 65 20 61 74 20  ot determine at 
6c60: 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 77 68 65  compile-time whe
6c70: 74 68 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20 69  ther or not.** i
6c80: 73 20 69 74 20 74 72 75 65 20 6f 72 20 66 61 6c  s it true or fal
6c90: 73 65 2c 20 73 6f 20 61 6c 77 61 79 73 20 72 65  se, so always re
6ca0: 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74 69  turn 0..*/.stati
6cb0: 63 20 69 6e 74 20 65 78 70 72 41 6c 77 61 79 73  c int exprAlways
6cc0: 54 72 75 65 28 45 78 70 72 20 2a 70 29 7b 0a 20  True(Expr *p){. 
6cd0: 20 69 6e 74 20 76 20 3d 20 30 3b 0a 20 20 69 66   int v = 0;.  if
6ce0: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
6cf0: 79 28 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  y(p, EP_FromJoin
6d00: 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
6d10: 69 66 28 20 21 73 71 6c 69 74 65 33 45 78 70 72  if( !sqlite3Expr
6d20: 49 73 49 6e 74 65 67 65 72 28 70 2c 20 26 76 29  IsInteger(p, &v)
6d30: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72   ) return 0;.  r
6d40: 65 74 75 72 6e 20 76 21 3d 30 3b 0a 7d 0a 73 74  eturn v!=0;.}.st
6d50: 61 74 69 63 20 69 6e 74 20 65 78 70 72 41 6c 77  atic int exprAlw
6d60: 61 79 73 46 61 6c 73 65 28 45 78 70 72 20 2a 70  aysFalse(Expr *p
6d70: 29 7b 0a 20 20 69 6e 74 20 76 20 3d 20 30 3b 0a  ){.  int v = 0;.
6d80: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
6d90: 70 65 72 74 79 28 70 2c 20 45 50 5f 46 72 6f 6d  perty(p, EP_From
6da0: 4a 6f 69 6e 29 20 29 20 72 65 74 75 72 6e 20 30  Join) ) return 0
6db0: 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  ;.  if( !sqlite3
6dc0: 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 2c  ExprIsInteger(p,
6dd0: 20 26 76 29 20 29 20 72 65 74 75 72 6e 20 30 3b   &v) ) return 0;
6de0: 0a 20 20 72 65 74 75 72 6e 20 76 3d 3d 30 3b 0a  .  return v==0;.
6df0: 7d 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 69 6e 20 74 77  }../*.** Join tw
6e00: 6f 20 65 78 70 72 65 73 73 69 6f 6e 73 20 75 73  o expressions us
6e10: 69 6e 67 20 61 6e 20 41 4e 44 20 6f 70 65 72 61  ing an AND opera
6e20: 74 6f 72 2e 20 20 49 66 20 65 69 74 68 65 72 20  tor.  If either 
6e30: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 0a 2a 2a  expression is.**
6e40: 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 6a 75 73 74   NULL, then just
6e50: 20 72 65 74 75 72 6e 20 74 68 65 20 6f 74 68 65   return the othe
6e60: 72 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a  r expression..**
6e70: 0a 2a 2a 20 49 66 20 6f 6e 65 20 73 69 64 65 20  .** If one side 
6e80: 6f 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20  or the other of 
6e90: 74 68 65 20 41 4e 44 20 69 73 20 6b 6e 6f 77 6e  the AND is known
6ea0: 20 74 6f 20 62 65 20 66 61 6c 73 65 2c 20 74 68   to be false, th
6eb0: 65 6e 20 69 6e 73 74 65 61 64 0a 2a 2a 20 6f 66  en instead.** of
6ec0: 20 72 65 74 75 72 6e 69 6e 67 20 61 6e 20 41 4e   returning an AN
6ed0: 44 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 6a 75  D expression, ju
6ee0: 73 74 20 72 65 74 75 72 6e 20 61 20 63 6f 6e 73  st return a cons
6ef0: 74 61 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 20  tant expression 
6f00: 77 69 74 68 0a 2a 2a 20 61 20 76 61 6c 75 65 20  with.** a value 
6f10: 6f 66 20 66 61 6c 73 65 2e 0a 2a 2f 0a 45 78 70  of false..*/.Exp
6f20: 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 41 6e  r *sqlite3ExprAn
6f30: 64 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45  d(sqlite3 *db, E
6f40: 78 70 72 20 2a 70 4c 65 66 74 2c 20 45 78 70 72  xpr *pLeft, Expr
6f50: 20 2a 70 52 69 67 68 74 29 7b 0a 20 20 69 66 28   *pRight){.  if(
6f60: 20 70 4c 65 66 74 3d 3d 30 20 29 7b 0a 20 20 20   pLeft==0 ){.   
6f70: 20 72 65 74 75 72 6e 20 70 52 69 67 68 74 3b 0a   return pRight;.
6f80: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 52 69 67    }else if( pRig
6f90: 68 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ht==0 ){.    ret
6fa0: 75 72 6e 20 70 4c 65 66 74 3b 0a 20 20 7d 65 6c  urn pLeft;.  }el
6fb0: 73 65 20 69 66 28 20 65 78 70 72 41 6c 77 61 79  se if( exprAlway
6fc0: 73 46 61 6c 73 65 28 70 4c 65 66 74 29 20 7c 7c  sFalse(pLeft) ||
6fd0: 20 65 78 70 72 41 6c 77 61 79 73 46 61 6c 73 65   exprAlwaysFalse
6fe0: 28 70 52 69 67 68 74 29 20 29 7b 0a 20 20 20 20  (pRight) ){.    
6ff0: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
7000: 65 28 64 62 2c 20 70 4c 65 66 74 29 3b 0a 20 20  e(db, pLeft);.  
7010: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
7020: 65 74 65 28 64 62 2c 20 70 52 69 67 68 74 29 3b  ete(db, pRight);
7030: 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69  .    return sqli
7040: 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c  te3ExprAlloc(db,
7050: 20 54 4b 5f 49 4e 54 45 47 45 52 2c 20 26 73 71   TK_INTEGER, &sq
7060: 6c 69 74 65 33 49 6e 74 54 6f 6b 65 6e 73 5b 30  lite3IntTokens[0
7070: 5d 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ], 0);.  }else{.
7080: 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 20 3d      Expr *pNew =
7090: 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f   sqlite3ExprAllo
70a0: 63 28 64 62 2c 20 54 4b 5f 41 4e 44 2c 20 30 2c  c(db, TK_AND, 0,
70b0: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
70c0: 45 78 70 72 41 74 74 61 63 68 53 75 62 74 72 65  ExprAttachSubtre
70d0: 65 73 28 64 62 2c 20 70 4e 65 77 2c 20 70 4c 65  es(db, pNew, pLe
70e0: 66 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20  ft, pRight);.   
70f0: 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 20 20   return pNew;.  
7100: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74  }.}../*.** Const
7110: 72 75 63 74 20 61 20 6e 65 77 20 65 78 70 72 65  ruct a new expre
7120: 73 73 69 6f 6e 20 6e 6f 64 65 20 66 6f 72 20 61  ssion node for a
7130: 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 6d   function with m
7140: 75 6c 74 69 70 6c 65 0a 2a 2a 20 61 72 67 75 6d  ultiple.** argum
7150: 65 6e 74 73 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73  ents..*/.Expr *s
7160: 71 6c 69 74 65 33 45 78 70 72 46 75 6e 63 74 69  qlite3ExprFuncti
7170: 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  on(Parse *pParse
7180: 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73  , ExprList *pLis
7190: 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e  t, Token *pToken
71a0: 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65 77 3b  ){.  Expr *pNew;
71b0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
71c0: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 61   pParse->db;.  a
71d0: 73 73 65 72 74 28 20 70 54 6f 6b 65 6e 20 29 3b  ssert( pToken );
71e0: 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  .  pNew = sqlite
71f0: 33 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54  3ExprAlloc(db, T
7200: 4b 5f 46 55 4e 43 54 49 4f 4e 2c 20 70 54 6f 6b  K_FUNCTION, pTok
7210: 65 6e 2c 20 31 29 3b 0a 20 20 69 66 28 20 70 4e  en, 1);.  if( pN
7220: 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ew==0 ){.    sql
7230: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
7240: 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 20 2f  te(db, pList); /
7250: 2a 20 41 76 6f 69 64 20 6d 65 6d 6f 72 79 20 6c  * Avoid memory l
7260: 65 61 6b 20 77 68 65 6e 20 6d 61 6c 6c 6f 63 20  eak when malloc 
7270: 66 61 69 6c 73 20 2a 2f 0a 20 20 20 20 72 65 74  fails */.    ret
7280: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4e 65  urn 0;.  }.  pNe
7290: 77 2d 3e 78 2e 70 4c 69 73 74 20 3d 20 70 4c 69  w->x.pList = pLi
72a0: 73 74 3b 0a 20 20 61 73 73 65 72 74 28 20 21 45  st;.  assert( !E
72b0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
72c0: 4e 65 77 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  New, EP_xIsSelec
72d0: 74 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  t) );.  sqlite3E
72e0: 78 70 72 53 65 74 48 65 69 67 68 74 41 6e 64 46  xprSetHeightAndF
72f0: 6c 61 67 73 28 70 50 61 72 73 65 2c 20 70 4e 65  lags(pParse, pNe
7300: 77 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65  w);.  return pNe
7310: 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69  w;.}../*.** Assi
7320: 67 6e 20 61 20 76 61 72 69 61 62 6c 65 20 6e 75  gn a variable nu
7330: 6d 62 65 72 20 74 6f 20 61 6e 20 65 78 70 72 65  mber to an expre
7340: 73 73 69 6f 6e 20 74 68 61 74 20 65 6e 63 6f 64  ssion that encod
7350: 65 73 20 61 20 77 69 6c 64 63 61 72 64 0a 2a 2a  es a wildcard.**
7360: 20 69 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   in the original
7370: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20   SQL statement. 
7380: 20 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72 64   .**.** Wildcard
7390: 73 20 63 6f 6e 73 69 73 74 69 6e 67 20 6f 66 20  s consisting of 
73a0: 61 20 73 69 6e 67 6c 65 20 22 3f 22 20 61 72 65  a single "?" are
73b0: 20 61 73 73 69 67 6e 65 64 20 74 68 65 20 6e 65   assigned the ne
73c0: 78 74 20 73 65 71 75 65 6e 74 69 61 6c 0a 2a 2a  xt sequential.**
73d0: 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72   variable number
73e0: 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72 64  ..**.** Wildcard
73f0: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3f  s of the form "?
7400: 6e 6e 6e 22 20 61 72 65 20 61 73 73 69 67 6e 65  nnn" are assigne
7410: 64 20 74 68 65 20 6e 75 6d 62 65 72 20 22 6e 6e  d the number "nn
7420: 6e 22 2e 20 20 57 65 20 6d 61 6b 65 0a 2a 2a 20  n".  We make.** 
7430: 73 75 72 65 20 22 6e 6e 6e 22 20 69 73 20 6e 6f  sure "nnn" is no
7440: 74 20 74 6f 6f 20 62 65 20 74 6f 20 61 76 6f 69  t too be to avoi
7450: 64 20 61 20 64 65 6e 69 61 6c 20 6f 66 20 73 65  d a denial of se
7460: 72 76 69 63 65 20 61 74 74 61 63 6b 20 77 68 65  rvice attack whe
7470: 6e 0a 2a 2a 20 74 68 65 20 53 51 4c 20 73 74 61  n.** the SQL sta
7480: 74 65 6d 65 6e 74 20 63 6f 6d 65 73 20 66 72 6f  tement comes fro
7490: 6d 20 61 6e 20 65 78 74 65 72 6e 61 6c 20 73 6f  m an external so
74a0: 75 72 63 65 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c 64  urce..**.** Wild
74b0: 63 61 72 64 73 20 6f 66 20 74 68 65 20 66 6f 72  cards of the for
74c0: 6d 20 22 3a 61 61 61 22 2c 20 22 40 61 61 61 22  m ":aaa", "@aaa"
74d0: 2c 20 6f 72 20 22 24 61 61 61 22 20 61 72 65 20  , or "$aaa" are 
74e0: 61 73 73 69 67 6e 65 64 20 74 68 65 20 73 61 6d  assigned the sam
74f0: 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 61 73 20 74  e number.** as t
7500: 68 65 20 70 72 65 76 69 6f 75 73 20 69 6e 73 74  he previous inst
7510: 61 6e 63 65 20 6f 66 20 74 68 65 20 73 61 6d 65  ance of the same
7520: 20 77 69 6c 64 63 61 72 64 2e 20 20 4f 72 20 69   wildcard.  Or i
7530: 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69  f this is the fi
7540: 72 73 74 0a 2a 2a 20 69 6e 73 74 61 6e 63 65 20  rst.** instance 
7550: 6f 66 20 74 68 65 20 77 69 6c 64 63 61 72 64 2c  of the wildcard,
7560: 20 74 68 65 20 6e 65 78 74 20 73 65 71 75 65 6e   the next sequen
7570: 74 69 61 6c 20 76 61 72 69 61 62 6c 65 20 6e 75  tial variable nu
7580: 6d 62 65 72 20 69 73 0a 2a 2a 20 61 73 73 69 67  mber is.** assig
7590: 6e 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ned..*/.void sql
75a0: 69 74 65 33 45 78 70 72 41 73 73 69 67 6e 56 61  ite3ExprAssignVa
75b0: 72 4e 75 6d 62 65 72 28 50 61 72 73 65 20 2a 70  rNumber(Parse *p
75c0: 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
75d0: 70 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  pr){.  sqlite3 *
75e0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
75f0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
7600: 3b 0a 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d  ;..  if( pExpr==
7610: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73  0 ) return;.  as
7620: 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
7630: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
7640: 5f 49 6e 74 56 61 6c 75 65 7c 45 50 5f 52 65 64  _IntValue|EP_Red
7650: 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  uced|EP_TokenOnl
7660: 79 29 20 29 3b 0a 20 20 7a 20 3d 20 70 45 78 70  y) );.  z = pExp
7670: 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 61  r->u.zToken;.  a
7680: 73 73 65 72 74 28 20 7a 21 3d 30 20 29 3b 0a 20  ssert( z!=0 );. 
7690: 20 61 73 73 65 72 74 28 20 7a 5b 30 5d 21 3d 30   assert( z[0]!=0
76a0: 20 29 3b 0a 20 20 69 66 28 20 7a 5b 31 5d 3d 3d   );.  if( z[1]==
76b0: 30 20 29 7b 0a 20 20 20 20 2f 2a 20 57 69 6c 64  0 ){.    /* Wild
76c0: 63 61 72 64 20 6f 66 20 74 68 65 20 66 6f 72 6d  card of the form
76d0: 20 22 3f 22 2e 20 20 41 73 73 69 67 6e 20 74 68   "?".  Assign th
76e0: 65 20 6e 65 78 74 20 76 61 72 69 61 62 6c 65 20  e next variable 
76f0: 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20 61 73  number */.    as
7700: 73 65 72 74 28 20 7a 5b 30 5d 3d 3d 27 3f 27 20  sert( z[0]=='?' 
7710: 29 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 69 43  );.    pExpr->iC
7720: 6f 6c 75 6d 6e 20 3d 20 28 79 6e 56 61 72 29 28  olumn = (ynVar)(
7730: 2b 2b 70 50 61 72 73 65 2d 3e 6e 56 61 72 29 3b  ++pParse->nVar);
7740: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 79 6e  .  }else{.    yn
7750: 56 61 72 20 78 20 3d 20 30 3b 0a 20 20 20 20 75  Var x = 0;.    u
7760: 33 32 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74  32 n = sqlite3St
7770: 72 6c 65 6e 33 30 28 7a 29 3b 0a 20 20 20 20 69  rlen30(z);.    i
7780: 66 28 20 7a 5b 30 5d 3d 3d 27 3f 27 20 29 7b 0a  f( z[0]=='?' ){.
7790: 20 20 20 20 20 20 2f 2a 20 57 69 6c 64 63 61 72        /* Wildcar
77a0: 64 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3f  d of the form "?
77b0: 6e 6e 6e 22 2e 20 20 43 6f 6e 76 65 72 74 20 22  nnn".  Convert "
77c0: 6e 6e 6e 22 20 74 6f 20 61 6e 20 69 6e 74 65 67  nnn" to an integ
77d0: 65 72 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20  er and.      ** 
77e0: 75 73 65 20 69 74 20 61 73 20 74 68 65 20 76 61  use it as the va
77f0: 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 2a 2f  riable number */
7800: 0a 20 20 20 20 20 20 69 36 34 20 69 3b 0a 20 20  .      i64 i;.  
7810: 20 20 20 20 69 6e 74 20 62 4f 6b 20 3d 20 30 3d      int bOk = 0=
7820: 3d 73 71 6c 69 74 65 33 41 74 6f 69 36 34 28 26  =sqlite3Atoi64(&
7830: 7a 5b 31 5d 2c 20 26 69 2c 20 6e 2d 31 2c 20 53  z[1], &i, n-1, S
7840: 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 20  QLITE_UTF8);.   
7850: 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d     pExpr->iColum
7860: 6e 20 3d 20 78 20 3d 20 28 79 6e 56 61 72 29 69  n = x = (ynVar)i
7870: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
7880: 28 20 69 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ( i==0 );.      
7890: 74 65 73 74 63 61 73 65 28 20 69 3d 3d 31 20 29  testcase( i==1 )
78a0: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
78b0: 28 20 69 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74 5b  ( i==db->aLimit[
78c0: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52  SQLITE_LIMIT_VAR
78d0: 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 2d 31 20  IABLE_NUMBER]-1 
78e0: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
78f0: 65 28 20 69 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74  e( i==db->aLimit
7900: 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41  [SQLITE_LIMIT_VA
7910: 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 20 29  RIABLE_NUMBER] )
7920: 3b 0a 20 20 20 20 20 20 69 66 28 20 62 4f 6b 3d  ;.      if( bOk=
7930: 3d 30 20 7c 7c 20 69 3c 31 20 7c 7c 20 69 3e 64  =0 || i<1 || i>d
7940: 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45  b->aLimit[SQLITE
7950: 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f  _LIMIT_VARIABLE_
7960: 4e 55 4d 42 45 52 5d 20 29 7b 0a 20 20 20 20 20  NUMBER] ){.     
7970: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
7980: 73 67 28 70 50 61 72 73 65 2c 20 22 76 61 72 69  sg(pParse, "vari
7990: 61 62 6c 65 20 6e 75 6d 62 65 72 20 6d 75 73 74  able number must
79a0: 20 62 65 20 62 65 74 77 65 65 6e 20 3f 31 20 61   be between ?1 a
79b0: 6e 64 20 3f 25 64 22 2c 0a 20 20 20 20 20 20 20  nd ?%d",.       
79c0: 20 20 20 20 20 64 62 2d 3e 61 4c 69 6d 69 74 5b       db->aLimit[
79d0: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52  SQLITE_LIMIT_VAR
79e0: 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 29 3b 0a  IABLE_NUMBER]);.
79f0: 20 20 20 20 20 20 20 20 78 20 3d 20 30 3b 0a 20          x = 0;. 
7a00: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
7a10: 20 69 3e 70 50 61 72 73 65 2d 3e 6e 56 61 72 20   i>pParse->nVar 
7a20: 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  ){.        pPars
7a30: 65 2d 3e 6e 56 61 72 20 3d 20 28 69 6e 74 29 69  e->nVar = (int)i
7a40: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
7a50: 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 57 69  lse{.      /* Wi
7a60: 6c 64 63 61 72 64 73 20 6c 69 6b 65 20 22 3a 61  ldcards like ":a
7a70: 61 61 22 2c 20 22 24 61 61 61 22 20 6f 72 20 22  aa", "$aaa" or "
7a80: 40 61 61 61 22 2e 20 20 52 65 75 73 65 20 74 68  @aaa".  Reuse th
7a90: 65 20 73 61 6d 65 20 76 61 72 69 61 62 6c 65 0a  e same variable.
7aa0: 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20        ** number 
7ab0: 61 73 20 74 68 65 20 70 72 69 6f 72 20 61 70 70  as the prior app
7ac0: 65 61 72 61 6e 63 65 20 6f 66 20 74 68 65 20 73  earance of the s
7ad0: 61 6d 65 20 6e 61 6d 65 2c 20 6f 72 20 69 66 20  ame name, or if 
7ae0: 74 68 65 20 6e 61 6d 65 0a 20 20 20 20 20 20 2a  the name.      *
7af0: 2a 20 68 61 73 20 6e 65 76 65 72 20 61 70 70 65  * has never appe
7b00: 61 72 65 64 20 62 65 66 6f 72 65 2c 20 72 65 75  ared before, reu
7b10: 73 65 20 74 68 65 20 73 61 6d 65 20 76 61 72 69  se the same vari
7b20: 61 62 6c 65 20 6e 75 6d 62 65 72 0a 20 20 20 20  able number.    
7b30: 20 20 2a 2f 0a 20 20 20 20 20 20 79 6e 56 61 72    */.      ynVar
7b40: 20 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   i;.      for(i=
7b50: 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 7a 56  0; i<pParse->nzV
7b60: 61 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ar; i++){.      
7b70: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 61 7a    if( pParse->az
7b80: 56 61 72 5b 69 5d 20 26 26 20 73 74 72 63 6d 70  Var[i] && strcmp
7b90: 28 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 5b 69  (pParse->azVar[i
7ba0: 5d 2c 7a 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ],z)==0 ){.     
7bb0: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c       pExpr->iCol
7bc0: 75 6d 6e 20 3d 20 78 20 3d 20 28 79 6e 56 61 72  umn = x = (ynVar
7bd0: 29 69 2b 31 3b 0a 20 20 20 20 20 20 20 20 20 20  )i+1;.          
7be0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
7bf0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
7c00: 66 28 20 78 3d 3d 30 20 29 20 78 20 3d 20 70 45  f( x==0 ) x = pE
7c10: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 28  xpr->iColumn = (
7c20: 79 6e 56 61 72 29 28 2b 2b 70 50 61 72 73 65 2d  ynVar)(++pParse-
7c30: 3e 6e 56 61 72 29 3b 0a 20 20 20 20 7d 0a 20 20  >nVar);.    }.  
7c40: 20 20 69 66 28 20 78 3e 30 20 29 7b 0a 20 20 20    if( x>0 ){.   
7c50: 20 20 20 69 66 28 20 78 3e 70 50 61 72 73 65 2d     if( x>pParse-
7c60: 3e 6e 7a 56 61 72 20 29 7b 0a 20 20 20 20 20 20  >nzVar ){.      
7c70: 20 20 63 68 61 72 20 2a 2a 61 3b 0a 20 20 20 20    char **a;.    
7c80: 20 20 20 20 61 20 3d 20 73 71 6c 69 74 65 33 44      a = sqlite3D
7c90: 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70 50 61  bRealloc(db, pPa
7ca0: 72 73 65 2d 3e 61 7a 56 61 72 2c 20 78 2a 73 69  rse->azVar, x*si
7cb0: 7a 65 6f 66 28 61 5b 30 5d 29 29 3b 0a 20 20 20  zeof(a[0]));.   
7cc0: 20 20 20 20 20 69 66 28 20 61 3d 3d 30 20 29 7b       if( a==0 ){
7cd0: 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
7ce0: 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  t( db->mallocFai
7cf0: 6c 65 64 20 29 3b 20 2f 2a 20 45 72 72 6f 72 20  led ); /* Error 
7d00: 72 65 70 6f 72 74 65 64 20 74 68 72 6f 75 67 68  reported through
7d10: 20 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 2a 2f   mallocFailed */
7d20: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
7d30: 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  n;.        }.   
7d40: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61 7a 56       pParse->azV
7d50: 61 72 20 3d 20 61 3b 0a 20 20 20 20 20 20 20 20  ar = a;.        
7d60: 6d 65 6d 73 65 74 28 26 61 5b 70 50 61 72 73 65  memset(&a[pParse
7d70: 2d 3e 6e 7a 56 61 72 5d 2c 20 30 2c 20 28 78 2d  ->nzVar], 0, (x-
7d80: 70 50 61 72 73 65 2d 3e 6e 7a 56 61 72 29 2a 73  pParse->nzVar)*s
7d90: 69 7a 65 6f 66 28 61 5b 30 5d 29 29 3b 0a 20 20  izeof(a[0]));.  
7da0: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 7a        pParse->nz
7db0: 56 61 72 20 3d 20 78 3b 0a 20 20 20 20 20 20 7d  Var = x;.      }
7dc0: 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 30 5d 21  .      if( z[0]!
7dd0: 3d 27 3f 27 20 7c 7c 20 70 50 61 72 73 65 2d 3e  ='?' || pParse->
7de0: 61 7a 56 61 72 5b 78 2d 31 5d 3d 3d 30 20 29 7b  azVar[x-1]==0 ){
7df0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
7e00: 44 62 46 72 65 65 28 64 62 2c 20 70 50 61 72 73  DbFree(db, pPars
7e10: 65 2d 3e 61 7a 56 61 72 5b 78 2d 31 5d 29 3b 0a  e->azVar[x-1]);.
7e20: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
7e30: 61 7a 56 61 72 5b 78 2d 31 5d 20 3d 20 73 71 6c  azVar[x-1] = sql
7e40: 69 74 65 33 44 62 53 74 72 4e 44 75 70 28 64 62  ite3DbStrNDup(db
7e50: 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d  , z, n);.      }
7e60: 0a 20 20 20 20 7d 0a 20 20 7d 20 0a 20 20 69 66  .    }.  } .  if
7e70: 28 20 21 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  ( !pParse->nErr 
7e80: 26 26 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 3e  && pParse->nVar>
7e90: 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54  db->aLimit[SQLIT
7ea0: 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45  E_LIMIT_VARIABLE
7eb0: 5f 4e 55 4d 42 45 52 5d 20 29 7b 0a 20 20 20 20  _NUMBER] ){.    
7ec0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
7ed0: 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e  pParse, "too man
7ee0: 79 20 53 51 4c 20 76 61 72 69 61 62 6c 65 73 22  y SQL variables"
7ef0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
7f00: 52 65 63 75 72 73 69 76 65 6c 79 20 64 65 6c 65  Recursively dele
7f10: 74 65 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  te an expression
7f20: 20 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   tree..*/.static
7f30: 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45   SQLITE_NOINLINE
7f40: 20 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70   void sqlite3Exp
7f50: 72 44 65 6c 65 74 65 4e 4e 28 73 71 6c 69 74 65  rDeleteNN(sqlite
7f60: 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 29 7b  3 *db, Expr *p){
7f70: 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20  .  assert( p!=0 
7f80: 29 3b 0a 20 20 2f 2a 20 53 61 6e 69 74 79 20 63  );.  /* Sanity c
7f90: 68 65 63 6b 3a 20 41 73 73 65 72 74 20 74 68 61  heck: Assert tha
7fa0: 74 20 74 68 65 20 49 6e 74 56 61 6c 75 65 20 69  t the IntValue i
7fb0: 73 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 20 69  s non-negative i
7fc0: 66 20 69 74 20 65 78 69 73 74 73 20 2a 2f 0a 20  f it exists */. 
7fd0: 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
7fe0: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
7ff0: 49 6e 74 56 61 6c 75 65 29 20 7c 7c 20 70 2d 3e  IntValue) || p->
8000: 75 2e 69 56 61 6c 75 65 3e 3d 30 20 29 3b 0a 20  u.iValue>=0 );. 
8010: 20 69 66 28 20 21 45 78 70 72 48 61 73 50 72 6f   if( !ExprHasPro
8020: 70 65 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65  perty(p, EP_Toke
8030: 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 2f 2a  nOnly) ){.    /*
8040: 20 54 68 65 20 45 78 70 72 2e 78 20 75 6e 69 6f   The Expr.x unio
8050: 6e 20 69 73 20 6e 65 76 65 72 20 75 73 65 64 20  n is never used 
8060: 61 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65  at the same time
8070: 20 61 73 20 45 78 70 72 2e 70 52 69 67 68 74 20   as Expr.pRight 
8080: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
8090: 2d 3e 78 2e 70 4c 69 73 74 3d 3d 30 20 7c 7c 20  ->x.pList==0 || 
80a0: 70 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a  p->pRight==0 );.
80b0: 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 21 3d 54      if( p->op!=T
80c0: 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55 4d 4e 20  K_SELECT_COLUMN 
80d0: 29 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c  ) sqlite3ExprDel
80e0: 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c 65 66 74  ete(db, p->pLeft
80f0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
8100: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  prDelete(db, p->
8110: 70 52 69 67 68 74 29 3b 0a 20 20 20 20 69 66 28  pRight);.    if(
8120: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
8130: 28 70 2c 20 45 50 5f 4d 65 6d 54 6f 6b 65 6e 29  (p, EP_MemToken)
8140: 20 29 20 73 71 6c 69 74 65 33 44 62 46 72 65 65   ) sqlite3DbFree
8150: 28 64 62 2c 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e  (db, p->u.zToken
8160: 29 3b 0a 20 20 20 20 69 66 28 20 45 78 70 72 48  );.    if( ExprH
8170: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
8180: 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20  _xIsSelect) ){. 
8190: 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65       sqlite3Sele
81a0: 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  ctDelete(db, p->
81b0: 78 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  x.pSelect);.    
81c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
81d0: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
81e0: 74 65 28 64 62 2c 20 70 2d 3e 78 2e 70 4c 69 73  te(db, p->x.pLis
81f0: 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  t);.    }.  }.  
8200: 69 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  if( !ExprHasProp
8210: 65 72 74 79 28 70 2c 20 45 50 5f 53 74 61 74 69  erty(p, EP_Stati
8220: 63 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  c) ){.    sqlite
8230: 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a  3DbFree(db, p);.
8240: 20 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74    }.}.void sqlit
8250: 65 33 45 78 70 72 44 65 6c 65 74 65 28 73 71 6c  e3ExprDelete(sql
8260: 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a  ite3 *db, Expr *
8270: 70 29 7b 0a 20 20 69 66 28 20 70 20 29 20 73 71  p){.  if( p ) sq
8280: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 4e  lite3ExprDeleteN
8290: 4e 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a  N(db, p);.}../*.
82a0: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
82b0: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 61 6c  mber of bytes al
82c0: 6c 6f 63 61 74 65 64 20 66 6f 72 20 74 68 65 20  located for the 
82d0: 65 78 70 72 65 73 73 69 6f 6e 20 73 74 72 75 63  expression struc
82e0: 74 75 72 65 20 0a 2a 2a 20 70 61 73 73 65 64 20  ture .** passed 
82f0: 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67  as the first arg
8300: 75 6d 65 6e 74 2e 20 54 68 69 73 20 69 73 20 61  ument. This is a
8310: 6c 77 61 79 73 20 6f 6e 65 20 6f 66 20 45 58 50  lways one of EXP
8320: 52 5f 46 55 4c 4c 53 49 5a 45 2c 0a 2a 2a 20 45  R_FULLSIZE,.** E
8330: 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45 20  XPR_REDUCEDSIZE 
8340: 6f 72 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c  or EXPR_TOKENONL
8350: 59 53 49 5a 45 2e 0a 2a 2f 0a 73 74 61 74 69 63  YSIZE..*/.static
8360: 20 69 6e 74 20 65 78 70 72 53 74 72 75 63 74 53   int exprStructS
8370: 69 7a 65 28 45 78 70 72 20 2a 70 29 7b 0a 20 20  ize(Expr *p){.  
8380: 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
8390: 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f  rty(p, EP_TokenO
83a0: 6e 6c 79 29 20 29 20 72 65 74 75 72 6e 20 45 58  nly) ) return EX
83b0: 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45  PR_TOKENONLYSIZE
83c0: 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50  ;.  if( ExprHasP
83d0: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 52 65  roperty(p, EP_Re
83e0: 64 75 63 65 64 29 20 29 20 72 65 74 75 72 6e 20  duced) ) return 
83f0: 45 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45  EXPR_REDUCEDSIZE
8400: 3b 0a 20 20 72 65 74 75 72 6e 20 45 58 50 52 5f  ;.  return EXPR_
8410: 46 55 4c 4c 53 49 5a 45 3b 0a 7d 0a 0a 2f 2a 0a  FULLSIZE;.}../*.
8420: 2a 2a 20 54 68 65 20 64 75 70 65 64 45 78 70 72  ** The dupedExpr
8430: 2a 53 69 7a 65 28 29 20 72 6f 75 74 69 6e 65 73  *Size() routines
8440: 20 65 61 63 68 20 72 65 74 75 72 6e 20 74 68 65   each return the
8450: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
8460: 20 72 65 71 75 69 72 65 64 0a 2a 2a 20 74 6f 20   required.** to 
8470: 73 74 6f 72 65 20 61 20 63 6f 70 79 20 6f 66 20  store a copy of 
8480: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 72  an expression or
8490: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
84a0: 2e 20 20 54 68 65 79 20 64 69 66 66 65 72 20 69  .  They differ i
84b0: 6e 0a 2a 2a 20 68 6f 77 20 6d 75 63 68 20 6f 66  n.** how much of
84c0: 20 74 68 65 20 74 72 65 65 20 69 73 20 6d 65 61   the tree is mea
84d0: 73 75 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  sured..**.**    
84e0: 20 64 75 70 65 64 45 78 70 72 53 74 72 75 63 74   dupedExprStruct
84f0: 53 69 7a 65 28 29 20 20 20 20 20 53 69 7a 65 20  Size()     Size 
8500: 6f 66 20 6f 6e 6c 79 20 74 68 65 20 45 78 70 72  of only the Expr
8510: 20 73 74 72 75 63 74 75 72 65 20 0a 2a 2a 20 20   structure .**  
8520: 20 20 20 64 75 70 65 64 45 78 70 72 4e 6f 64 65     dupedExprNode
8530: 53 69 7a 65 28 29 20 20 20 20 20 20 20 53 69 7a  Size()       Siz
8540: 65 20 6f 66 20 45 78 70 72 20 2b 20 73 70 61 63  e of Expr + spac
8550: 65 20 66 6f 72 20 74 6f 6b 65 6e 0a 2a 2a 20 20  e for token.**  
8560: 20 20 20 64 75 70 65 64 45 78 70 72 53 69 7a 65     dupedExprSize
8570: 28 29 20 20 20 20 20 20 20 20 20 20 20 45 78 70  ()           Exp
8580: 72 20 2b 20 74 6f 6b 65 6e 20 2b 20 73 75 62 74  r + token + subt
8590: 72 65 65 20 63 6f 6d 70 6f 6e 65 6e 74 73 0a 2a  ree components.*
85a0: 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
85b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
85c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
85d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
85e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
85f0: 0a 2a 2a 20 54 68 65 20 64 75 70 65 64 45 78 70  .** The dupedExp
8600: 72 53 74 72 75 63 74 53 69 7a 65 28 29 20 66 75  rStructSize() fu
8610: 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74  nction returns t
8620: 77 6f 20 76 61 6c 75 65 73 20 4f 52 2d 65 64 20  wo values OR-ed 
8630: 74 6f 67 65 74 68 65 72 3a 20 20 0a 2a 2a 20 28  together:  .** (
8640: 31 29 20 74 68 65 20 73 70 61 63 65 20 72 65 71  1) the space req
8650: 75 69 72 65 64 20 66 6f 72 20 61 20 63 6f 70 79  uired for a copy
8660: 20 6f 66 20 74 68 65 20 45 78 70 72 20 73 74 72   of the Expr str
8670: 75 63 74 75 72 65 20 6f 6e 6c 79 20 61 6e 64 20  ucture only and 
8680: 0a 2a 2a 20 28 32 29 20 74 68 65 20 45 50 5f 78  .** (2) the EP_x
8690: 78 78 20 66 6c 61 67 73 20 74 68 61 74 20 69 6e  xx flags that in
86a0: 64 69 63 61 74 65 20 77 68 61 74 20 74 68 65 20  dicate what the 
86b0: 73 74 72 75 63 74 75 72 65 20 73 69 7a 65 20 73  structure size s
86c0: 68 6f 75 6c 64 20 62 65 2e 0a 2a 2a 20 54 68 65  hould be..** The
86d0: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 73 20 69   return values i
86e0: 73 20 61 6c 77 61 79 73 20 6f 6e 65 20 6f 66 3a  s always one of:
86f0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 45 58 50 52  .**.**      EXPR
8700: 5f 46 55 4c 4c 53 49 5a 45 0a 2a 2a 20 20 20 20  _FULLSIZE.**    
8710: 20 20 45 58 50 52 5f 52 45 44 55 43 45 44 53 49    EXPR_REDUCEDSI
8720: 5a 45 20 20 20 7c 20 45 50 5f 52 65 64 75 63 65  ZE   | EP_Reduce
8730: 64 0a 2a 2a 20 20 20 20 20 20 45 58 50 52 5f 54  d.**      EXPR_T
8740: 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 20 7c 20 45  OKENONLYSIZE | E
8750: 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 0a 2a 2a 0a 2a  P_TokenOnly.**.*
8760: 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68  * The size of th
8770: 65 20 73 74 72 75 63 74 75 72 65 20 63 61 6e 20  e structure can 
8780: 62 65 20 66 6f 75 6e 64 20 62 79 20 6d 61 73 6b  be found by mask
8790: 69 6e 67 20 74 68 65 20 72 65 74 75 72 6e 20 76  ing the return v
87a0: 61 6c 75 65 0a 2a 2a 20 6f 66 20 74 68 69 73 20  alue.** of this 
87b0: 72 6f 75 74 69 6e 65 20 77 69 74 68 20 30 78 66  routine with 0xf
87c0: 66 66 2e 20 20 54 68 65 20 66 6c 61 67 73 20 63  ff.  The flags c
87d0: 61 6e 20 62 65 20 66 6f 75 6e 64 20 62 79 20 6d  an be found by m
87e0: 61 73 6b 69 6e 67 20 74 68 65 0a 2a 2a 20 72 65  asking the.** re
87f0: 74 75 72 6e 20 76 61 6c 75 65 20 77 69 74 68 20  turn value with 
8800: 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f  EP_Reduced|EP_To
8810: 6b 65 6e 4f 6e 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4e  kenOnly..**.** N
8820: 6f 74 65 20 74 68 61 74 20 77 69 74 68 20 66 6c  ote that with fl
8830: 61 67 73 3d 3d 45 58 50 52 44 55 50 5f 52 45 44  ags==EXPRDUP_RED
8840: 55 43 45 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  UCE, this routin
8850: 65 73 20 77 6f 72 6b 73 20 6f 6e 20 66 75 6c 6c  es works on full
8860: 2d 73 69 7a 65 0a 2a 2a 20 28 75 6e 72 65 64 75  -size.** (unredu
8870: 63 65 64 29 20 45 78 70 72 20 6f 62 6a 65 63 74  ced) Expr object
8880: 73 20 61 73 20 74 68 65 79 20 6f 72 20 6f 72 69  s as they or ori
8890: 67 69 6e 61 6c 6c 79 20 63 6f 6e 73 74 72 75 63  ginally construc
88a0: 74 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65  ted by the parse
88b0: 72 2e 0a 2a 2a 20 44 75 72 69 6e 67 20 65 78 70  r..** During exp
88c0: 72 65 73 73 69 6f 6e 20 61 6e 61 6c 79 73 69 73  ression analysis
88d0: 2c 20 65 78 74 72 61 20 69 6e 66 6f 72 6d 61 74  , extra informat
88e0: 69 6f 6e 20 69 73 20 63 6f 6d 70 75 74 65 64 20  ion is computed 
88f0: 61 6e 64 20 6d 6f 76 65 64 20 69 6e 74 6f 0a 2a  and moved into.*
8900: 2a 20 6c 61 74 65 72 20 70 61 72 74 73 20 6f 66  * later parts of
8910: 20 74 65 68 20 45 78 70 72 20 6f 62 6a 65 63 74   teh Expr object
8920: 20 61 6e 64 20 74 68 61 74 20 65 78 74 72 61 20   and that extra 
8930: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6d 69 67 68  information migh
8940: 74 20 67 65 74 20 63 68 6f 70 70 65 64 0a 2a 2a  t get chopped.**
8950: 20 6f 66 66 20 69 66 20 74 68 65 20 65 78 70 72   off if the expr
8960: 65 73 73 69 6f 6e 20 69 73 20 72 65 64 75 63 65  ession is reduce
8970: 64 2e 20 20 4e 6f 74 65 20 61 6c 73 6f 20 74 68  d.  Note also th
8980: 61 74 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 77  at it does not w
8990: 6f 72 6b 20 74 6f 0a 2a 2a 20 6d 61 6b 65 20 61  ork to.** make a
89a0: 6e 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 45  n EXPRDUP_REDUCE
89b0: 20 63 6f 70 79 20 6f 66 20 61 20 72 65 64 75 63   copy of a reduc
89c0: 65 64 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20  ed expression.  
89d0: 49 74 20 69 73 20 6f 6e 6c 79 20 6c 65 67 61 6c  It is only legal
89e0: 0a 2a 2a 20 74 6f 20 72 65 64 75 63 65 20 61 20  .** to reduce a 
89f0: 70 72 69 73 74 69 6e 65 20 65 78 70 72 65 73 73  pristine express
8a00: 69 6f 6e 20 74 72 65 65 20 66 72 6f 6d 20 74 68  ion tree from th
8a10: 65 20 70 61 72 73 65 72 2e 20 20 54 68 65 20 69  e parser.  The i
8a20: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 0a 2a 2a  mplementation.**
8a30: 20 6f 66 20 64 75 70 65 64 45 78 70 72 53 74 72   of dupedExprStr
8a40: 75 63 74 53 69 7a 65 28 29 20 63 6f 6e 74 61 69  uctSize() contai
8a50: 6e 20 6d 75 6c 74 69 70 6c 65 20 61 73 73 65 72  n multiple asser
8a60: 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 74  t() statements t
8a70: 68 61 74 20 61 74 74 65 6d 70 74 0a 2a 2a 20 74  hat attempt.** t
8a80: 6f 20 65 6e 66 6f 72 63 65 20 74 68 69 73 20 63  o enforce this c
8a90: 6f 6e 73 74 72 61 69 6e 74 2e 0a 2a 2f 0a 73 74  onstraint..*/.st
8aa0: 61 74 69 63 20 69 6e 74 20 64 75 70 65 64 45 78  atic int dupedEx
8ab0: 70 72 53 74 72 75 63 74 53 69 7a 65 28 45 78 70  prStructSize(Exp
8ac0: 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29  r *p, int flags)
8ad0: 7b 0a 20 20 69 6e 74 20 6e 53 69 7a 65 3b 0a 20  {.  int nSize;. 
8ae0: 20 61 73 73 65 72 74 28 20 66 6c 61 67 73 3d 3d   assert( flags==
8af0: 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 20 7c  EXPRDUP_REDUCE |
8b00: 7c 20 66 6c 61 67 73 3d 3d 30 20 29 3b 20 2f 2a  | flags==0 ); /*
8b10: 20 4f 6e 6c 79 20 6f 6e 65 20 66 6c 61 67 20 76   Only one flag v
8b20: 61 6c 75 65 20 61 6c 6c 6f 77 65 64 20 2a 2f 0a  alue allowed */.
8b30: 20 20 61 73 73 65 72 74 28 20 45 58 50 52 5f 46    assert( EXPR_F
8b40: 55 4c 4c 53 49 5a 45 3c 3d 30 78 66 66 66 20 29  ULLSIZE<=0xfff )
8b50: 3b 0a 20 20 61 73 73 65 72 74 28 20 28 30 78 66  ;.  assert( (0xf
8b60: 66 66 20 26 20 28 45 50 5f 52 65 64 75 63 65 64  ff & (EP_Reduced
8b70: 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 29 3d  |EP_TokenOnly))=
8b80: 3d 30 20 29 3b 0a 20 20 69 66 28 20 30 3d 3d 66  =0 );.  if( 0==f
8b90: 6c 61 67 73 20 29 7b 0a 20 20 20 20 6e 53 69 7a  lags ){.    nSiz
8ba0: 65 20 3d 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a  e = EXPR_FULLSIZ
8bb0: 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  E;.  }else{.    
8bc0: 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
8bd0: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 54  Property(p, EP_T
8be0: 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75  okenOnly|EP_Redu
8bf0: 63 65 64 29 20 29 3b 0a 20 20 20 20 61 73 73 65  ced) );.    asse
8c00: 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
8c10: 65 72 74 79 28 70 2c 20 45 50 5f 46 72 6f 6d 4a  erty(p, EP_FromJ
8c20: 6f 69 6e 29 20 29 3b 20 0a 20 20 20 20 61 73 73  oin) ); .    ass
8c30: 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
8c40: 70 65 72 74 79 28 70 2c 20 45 50 5f 4d 65 6d 54  perty(p, EP_MemT
8c50: 6f 6b 65 6e 29 20 29 3b 0a 20 20 20 20 61 73 73  oken) );.    ass
8c60: 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
8c70: 70 65 72 74 79 28 70 2c 20 45 50 5f 4e 6f 52 65  perty(p, EP_NoRe
8c80: 64 75 63 65 29 20 29 3b 0a 20 20 20 20 69 66 28  duce) );.    if(
8c90: 20 70 2d 3e 70 4c 65 66 74 20 7c 7c 20 70 2d 3e   p->pLeft || p->
8ca0: 78 2e 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20  x.pList ){.     
8cb0: 20 6e 53 69 7a 65 20 3d 20 45 58 50 52 5f 52 45   nSize = EXPR_RE
8cc0: 44 55 43 45 44 53 49 5a 45 20 7c 20 45 50 5f 52  DUCEDSIZE | EP_R
8cd0: 65 64 75 63 65 64 3b 0a 20 20 20 20 7d 65 6c 73  educed;.    }els
8ce0: 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
8cf0: 20 70 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b   p->pRight==0 );
8d00: 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 45  .      nSize = E
8d10: 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a  XPR_TOKENONLYSIZ
8d20: 45 20 7c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  E | EP_TokenOnly
8d30: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
8d40: 74 75 72 6e 20 6e 53 69 7a 65 3b 0a 7d 0a 0a 2f  turn nSize;.}../
8d50: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
8d60: 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20 73  on returns the s
8d70: 70 61 63 65 20 69 6e 20 62 79 74 65 73 20 72 65  pace in bytes re
8d80: 71 75 69 72 65 64 20 74 6f 20 73 74 6f 72 65 20  quired to store 
8d90: 74 68 65 20 63 6f 70 79 20 0a 2a 2a 20 6f 66 20  the copy .** of 
8da0: 74 68 65 20 45 78 70 72 20 73 74 72 75 63 74 75  the Expr structu
8db0: 72 65 20 61 6e 64 20 61 20 63 6f 70 79 20 6f 66  re and a copy of
8dc0: 20 74 68 65 20 45 78 70 72 2e 75 2e 7a 54 6f 6b   the Expr.u.zTok
8dd0: 65 6e 20 73 74 72 69 6e 67 20 28 69 66 20 74 68  en string (if th
8de0: 61 74 0a 2a 2a 20 73 74 72 69 6e 67 20 69 73 20  at.** string is 
8df0: 64 65 66 69 6e 65 64 2e 29 0a 2a 2f 0a 73 74 61  defined.).*/.sta
8e00: 74 69 63 20 69 6e 74 20 64 75 70 65 64 45 78 70  tic int dupedExp
8e10: 72 4e 6f 64 65 53 69 7a 65 28 45 78 70 72 20 2a  rNodeSize(Expr *
8e20: 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  p, int flags){. 
8e30: 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 64 75 70   int nByte = dup
8e40: 65 64 45 78 70 72 53 74 72 75 63 74 53 69 7a 65  edExprStructSize
8e50: 28 70 2c 20 66 6c 61 67 73 29 20 26 20 30 78 66  (p, flags) & 0xf
8e60: 66 66 3b 0a 20 20 69 66 28 20 21 45 78 70 72 48  ff;.  if( !ExprH
8e70: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
8e80: 5f 49 6e 74 56 61 6c 75 65 29 20 26 26 20 70 2d  _IntValue) && p-
8e90: 3e 75 2e 7a 54 6f 6b 65 6e 20 29 7b 0a 20 20 20  >u.zToken ){.   
8ea0: 20 6e 42 79 74 65 20 2b 3d 20 73 71 6c 69 74 65   nByte += sqlite
8eb0: 33 53 74 72 6c 65 6e 33 30 28 70 2d 3e 75 2e 7a  3Strlen30(p->u.z
8ec0: 54 6f 6b 65 6e 29 2b 31 3b 0a 20 20 7d 0a 20 20  Token)+1;.  }.  
8ed0: 72 65 74 75 72 6e 20 52 4f 55 4e 44 38 28 6e 42  return ROUND8(nB
8ee0: 79 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  yte);.}../*.** R
8ef0: 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
8f00: 20 6f 66 20 62 79 74 65 73 20 72 65 71 75 69 72   of bytes requir
8f10: 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 20 64  ed to create a d
8f20: 75 70 6c 69 63 61 74 65 20 6f 66 20 74 68 65 20  uplicate of the 
8f30: 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 70  .** expression p
8f40: 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72  assed as the fir
8f50: 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 65  st argument. The
8f60: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
8f70: 20 69 73 20 61 0a 2a 2a 20 6d 61 73 6b 20 63 6f   is a.** mask co
8f80: 6e 74 61 69 6e 69 6e 67 20 45 58 50 52 44 55 50  ntaining EXPRDUP
8f90: 5f 58 58 58 20 66 6c 61 67 73 2e 0a 2a 2a 0a 2a  _XXX flags..**.*
8fa0: 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75  * The value retu
8fb0: 72 6e 65 64 20 69 6e 63 6c 75 64 65 73 20 73 70  rned includes sp
8fc0: 61 63 65 20 74 6f 20 63 72 65 61 74 65 20 61 20  ace to create a 
8fd0: 63 6f 70 79 20 6f 66 20 74 68 65 20 45 78 70 72  copy of the Expr
8fe0: 20 73 74 72 75 63 74 0a 2a 2a 20 69 74 73 65 6c   struct.** itsel
8ff0: 66 20 61 6e 64 20 74 68 65 20 62 75 66 66 65 72  f and the buffer
9000: 20 72 65 66 65 72 72 65 64 20 74 6f 20 62 79 20   referred to by 
9010: 45 78 70 72 2e 75 2e 7a 54 6f 6b 65 6e 2c 20 69  Expr.u.zToken, i
9020: 66 20 61 6e 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  f any..**.** If 
9030: 74 68 65 20 45 58 50 52 44 55 50 5f 52 45 44 55  the EXPRDUP_REDU
9040: 43 45 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20  CE flag is set, 
9050: 74 68 65 6e 20 74 68 65 20 72 65 74 75 72 6e 20  then the return 
9060: 76 61 6c 75 65 20 69 6e 63 6c 75 64 65 73 20 0a  value includes .
9070: 2a 2a 20 73 70 61 63 65 20 74 6f 20 64 75 70 6c  ** space to dupl
9080: 69 63 61 74 65 20 61 6c 6c 20 45 78 70 72 20 6e  icate all Expr n
9090: 6f 64 65 73 20 69 6e 20 74 68 65 20 74 72 65 65  odes in the tree
90a0: 20 66 6f 72 6d 65 64 20 62 79 20 45 78 70 72 2e   formed by Expr.
90b0: 70 4c 65 66 74 20 0a 2a 2a 20 61 6e 64 20 45 78  pLeft .** and Ex
90c0: 70 72 2e 70 52 69 67 68 74 20 76 61 72 69 61 62  pr.pRight variab
90d0: 6c 65 73 20 28 62 75 74 20 6e 6f 74 20 66 6f 72  les (but not for
90e0: 20 61 6e 79 20 73 74 72 75 63 74 75 72 65 73 20   any structures 
90f0: 70 6f 69 6e 74 65 64 20 74 6f 20 6f 72 20 0a 2a  pointed to or .*
9100: 2a 20 64 65 73 63 65 6e 64 65 64 20 66 72 6f 6d  * descended from
9110: 20 74 68 65 20 45 78 70 72 2e 78 2e 70 4c 69 73   the Expr.x.pLis
9120: 74 20 6f 72 20 45 78 70 72 2e 78 2e 70 53 65 6c  t or Expr.x.pSel
9130: 65 63 74 20 76 61 72 69 61 62 6c 65 73 29 2e 0a  ect variables)..
9140: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 75  */.static int du
9150: 70 65 64 45 78 70 72 53 69 7a 65 28 45 78 70 72  pedExprSize(Expr
9160: 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b   *p, int flags){
9170: 0a 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 30  .  int nByte = 0
9180: 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  ;.  if( p ){.   
9190: 20 6e 42 79 74 65 20 3d 20 64 75 70 65 64 45 78   nByte = dupedEx
91a0: 70 72 4e 6f 64 65 53 69 7a 65 28 70 2c 20 66 6c  prNodeSize(p, fl
91b0: 61 67 73 29 3b 0a 20 20 20 20 69 66 28 20 66 6c  ags);.    if( fl
91c0: 61 67 73 26 45 58 50 52 44 55 50 5f 52 45 44 55  ags&EXPRDUP_REDU
91d0: 43 45 20 29 7b 0a 20 20 20 20 20 20 6e 42 79 74  CE ){.      nByt
91e0: 65 20 2b 3d 20 64 75 70 65 64 45 78 70 72 53 69  e += dupedExprSi
91f0: 7a 65 28 70 2d 3e 70 4c 65 66 74 2c 20 66 6c 61  ze(p->pLeft, fla
9200: 67 73 29 20 2b 20 64 75 70 65 64 45 78 70 72 53  gs) + dupedExprS
9210: 69 7a 65 28 70 2d 3e 70 52 69 67 68 74 2c 20 66  ize(p->pRight, f
9220: 6c 61 67 73 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  lags);.    }.  }
9230: 0a 20 20 72 65 74 75 72 6e 20 6e 42 79 74 65 3b  .  return nByte;
9240: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
9250: 75 6e 63 74 69 6f 6e 20 69 73 20 73 69 6d 69 6c  unction is simil
9260: 61 72 20 74 6f 20 73 71 6c 69 74 65 33 45 78 70  ar to sqlite3Exp
9270: 72 44 75 70 28 29 2c 20 65 78 63 65 70 74 20 74  rDup(), except t
9280: 68 61 74 20 69 66 20 70 7a 42 75 66 66 65 72 20  hat if pzBuffer 
9290: 0a 2a 2a 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20  .** is not NULL 
92a0: 74 68 65 6e 20 2a 70 7a 42 75 66 66 65 72 20 69  then *pzBuffer i
92b0: 73 20 61 73 73 75 6d 65 64 20 74 6f 20 70 6f 69  s assumed to poi
92c0: 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72 20 6c  nt to a buffer l
92d0: 61 72 67 65 20 65 6e 6f 75 67 68 20 0a 2a 2a 20  arge enough .** 
92e0: 74 6f 20 73 74 6f 72 65 20 74 68 65 20 63 6f 70  to store the cop
92f0: 79 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 20  y of expression 
9300: 70 2c 20 74 68 65 20 63 6f 70 69 65 73 20 6f 66  p, the copies of
9310: 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 0a 2a 2a 20   p->u.zToken.** 
9320: 28 69 66 20 61 70 70 6c 69 63 61 62 6c 65 29 2c  (if applicable),
9330: 20 61 6e 64 20 74 68 65 20 63 6f 70 69 65 73 20   and the copies 
9340: 6f 66 20 74 68 65 20 70 2d 3e 70 4c 65 66 74 20  of the p->pLeft 
9350: 61 6e 64 20 70 2d 3e 70 52 69 67 68 74 20 65 78  and p->pRight ex
9360: 70 72 65 73 73 69 6f 6e 73 2c 0a 2a 2a 20 69 66  pressions,.** if
9370: 20 61 6e 79 2e 20 42 65 66 6f 72 65 20 72 65 74   any. Before ret
9380: 75 72 6e 69 6e 67 2c 20 2a 70 7a 42 75 66 66 65  urning, *pzBuffe
9390: 72 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  r is set to the 
93a0: 66 69 72 73 74 20 62 79 74 65 20 70 61 73 74 20  first byte past 
93b0: 74 68 65 0a 2a 2a 20 70 6f 72 74 69 6f 6e 20 6f  the.** portion o
93c0: 66 20 74 68 65 20 62 75 66 66 65 72 20 63 6f 70  f the buffer cop
93d0: 69 65 64 20 69 6e 74 6f 20 62 79 20 74 68 69 73  ied into by this
93e0: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74   function..*/.st
93f0: 61 74 69 63 20 45 78 70 72 20 2a 65 78 70 72 44  atic Expr *exprD
9400: 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  up(sqlite3 *db, 
9410: 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 64 75 70  Expr *p, int dup
9420: 46 6c 61 67 73 2c 20 75 38 20 2a 2a 70 7a 42 75  Flags, u8 **pzBu
9430: 66 66 65 72 29 7b 0a 20 20 45 78 70 72 20 2a 70  ffer){.  Expr *p
9440: 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 2f  New;           /
9450: 2a 20 56 61 6c 75 65 20 74 6f 20 72 65 74 75 72  * Value to retur
9460: 6e 20 2a 2f 0a 20 20 75 38 20 2a 7a 41 6c 6c 6f  n */.  u8 *zAllo
9470: 63 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  c;           /* 
9480: 4d 65 6d 6f 72 79 20 73 70 61 63 65 20 66 72 6f  Memory space fro
9490: 6d 20 77 68 69 63 68 20 74 6f 20 62 75 69 6c 64  m which to build
94a0: 20 45 78 70 72 20 6f 62 6a 65 63 74 20 2a 2f 0a   Expr object */.
94b0: 20 20 75 33 32 20 73 74 61 74 69 63 46 6c 61 67    u32 staticFlag
94c0: 3b 20 20 20 20 20 20 20 2f 2a 20 45 50 5f 53 74  ;       /* EP_St
94d0: 61 74 69 63 20 69 66 20 73 70 61 63 65 20 6e 6f  atic if space no
94e0: 74 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  t obtained from 
94f0: 6d 61 6c 6c 6f 63 20 2a 2f 0a 0a 20 20 61 73 73  malloc */..  ass
9500: 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20  ert( db!=0 );.  
9510: 61 73 73 65 72 74 28 20 70 20 29 3b 0a 20 20 61  assert( p );.  a
9520: 73 73 65 72 74 28 20 64 75 70 46 6c 61 67 73 3d  ssert( dupFlags=
9530: 3d 30 20 7c 7c 20 64 75 70 46 6c 61 67 73 3d 3d  =0 || dupFlags==
9540: 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 20 29  EXPRDUP_REDUCE )
9550: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 7a 42 75  ;.  assert( pzBu
9560: 66 66 65 72 3d 3d 30 20 7c 7c 20 64 75 70 46 6c  ffer==0 || dupFl
9570: 61 67 73 3d 3d 45 58 50 52 44 55 50 5f 52 45 44  ags==EXPRDUP_RED
9580: 55 43 45 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 67  UCE );..  /* Fig
9590: 75 72 65 20 6f 75 74 20 77 68 65 72 65 20 74 6f  ure out where to
95a0: 20 77 72 69 74 65 20 74 68 65 20 6e 65 77 20 45   write the new E
95b0: 78 70 72 20 73 74 72 75 63 74 75 72 65 2e 20 2a  xpr structure. *
95c0: 2f 0a 20 20 69 66 28 20 70 7a 42 75 66 66 65 72  /.  if( pzBuffer
95d0: 20 29 7b 0a 20 20 20 20 7a 41 6c 6c 6f 63 20 3d   ){.    zAlloc =
95e0: 20 2a 70 7a 42 75 66 66 65 72 3b 0a 20 20 20 20   *pzBuffer;.    
95f0: 73 74 61 74 69 63 46 6c 61 67 20 3d 20 45 50 5f  staticFlag = EP_
9600: 53 74 61 74 69 63 3b 0a 20 20 7d 65 6c 73 65 7b  Static;.  }else{
9610: 0a 20 20 20 20 7a 41 6c 6c 6f 63 20 3d 20 73 71  .    zAlloc = sq
9620: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
9630: 4e 4e 28 64 62 2c 20 64 75 70 65 64 45 78 70 72  NN(db, dupedExpr
9640: 53 69 7a 65 28 70 2c 20 64 75 70 46 6c 61 67 73  Size(p, dupFlags
9650: 29 29 3b 0a 20 20 20 20 73 74 61 74 69 63 46 6c  ));.    staticFl
9660: 61 67 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 4e  ag = 0;.  }.  pN
9670: 65 77 20 3d 20 28 45 78 70 72 20 2a 29 7a 41 6c  ew = (Expr *)zAl
9680: 6c 6f 63 3b 0a 0a 20 20 69 66 28 20 70 4e 65 77  loc;..  if( pNew
9690: 20 29 7b 0a 20 20 20 20 2f 2a 20 53 65 74 20 6e   ){.    /* Set n
96a0: 4e 65 77 53 69 7a 65 20 74 6f 20 74 68 65 20 73  NewSize to the s
96b0: 69 7a 65 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f  ize allocated fo
96c0: 72 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20  r the structure 
96d0: 70 6f 69 6e 74 65 64 20 74 6f 0a 20 20 20 20 2a  pointed to.    *
96e0: 2a 20 62 79 20 70 4e 65 77 2e 20 54 68 69 73 20  * by pNew. This 
96f0: 69 73 20 65 69 74 68 65 72 20 45 58 50 52 5f 46  is either EXPR_F
9700: 55 4c 4c 53 49 5a 45 2c 20 45 58 50 52 5f 52 45  ULLSIZE, EXPR_RE
9710: 44 55 43 45 44 53 49 5a 45 20 6f 72 0a 20 20 20  DUCEDSIZE or.   
9720: 20 2a 2a 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e   ** EXPR_TOKENON
9730: 4c 59 53 49 5a 45 2e 20 6e 54 6f 6b 65 6e 20 69  LYSIZE. nToken i
9740: 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d  s set to the num
9750: 62 65 72 20 6f 66 20 62 79 74 65 73 20 63 6f 6e  ber of bytes con
9760: 73 75 6d 65 64 0a 20 20 20 20 2a 2a 20 62 79 20  sumed.    ** by 
9770: 74 68 65 20 63 6f 70 79 20 6f 66 20 74 68 65 20  the copy of the 
9780: 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 73 74 72 69  p->u.zToken stri
9790: 6e 67 20 28 69 66 20 61 6e 79 29 2e 0a 20 20 20  ng (if any)..   
97a0: 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e   */.    const un
97b0: 73 69 67 6e 65 64 20 6e 53 74 72 75 63 74 53 69  signed nStructSi
97c0: 7a 65 20 3d 20 64 75 70 65 64 45 78 70 72 53 74  ze = dupedExprSt
97d0: 72 75 63 74 53 69 7a 65 28 70 2c 20 64 75 70 46  ructSize(p, dupF
97e0: 6c 61 67 73 29 3b 0a 20 20 20 20 63 6f 6e 73 74  lags);.    const
97f0: 20 69 6e 74 20 6e 4e 65 77 53 69 7a 65 20 3d 20   int nNewSize = 
9800: 6e 53 74 72 75 63 74 53 69 7a 65 20 26 20 30 78  nStructSize & 0x
9810: 66 66 66 3b 0a 20 20 20 20 69 6e 74 20 6e 54 6f  fff;.    int nTo
9820: 6b 65 6e 3b 0a 20 20 20 20 69 66 28 20 21 45 78  ken;.    if( !Ex
9830: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
9840: 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 26 26   EP_IntValue) &&
9850: 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 29 7b 0a   p->u.zToken ){.
9860: 20 20 20 20 20 20 6e 54 6f 6b 65 6e 20 3d 20 73        nToken = s
9870: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70  qlite3Strlen30(p
9880: 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 20 2b 20 31 3b  ->u.zToken) + 1;
9890: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
98a0: 20 20 6e 54 6f 6b 65 6e 20 3d 20 30 3b 0a 20 20    nToken = 0;.  
98b0: 20 20 7d 0a 20 20 20 20 69 66 28 20 64 75 70 46    }.    if( dupF
98c0: 6c 61 67 73 20 29 7b 0a 20 20 20 20 20 20 61 73  lags ){.      as
98d0: 73 65 72 74 28 20 45 78 70 72 48 61 73 50 72 6f  sert( ExprHasPro
98e0: 70 65 72 74 79 28 70 2c 20 45 50 5f 52 65 64 75  perty(p, EP_Redu
98f0: 63 65 64 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ced)==0 );.     
9900: 20 6d 65 6d 63 70 79 28 7a 41 6c 6c 6f 63 2c 20   memcpy(zAlloc, 
9910: 70 2c 20 6e 4e 65 77 53 69 7a 65 29 3b 0a 20 20  p, nNewSize);.  
9920: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75    }else{.      u
9930: 33 32 20 6e 53 69 7a 65 20 3d 20 28 75 33 32 29  32 nSize = (u32)
9940: 65 78 70 72 53 74 72 75 63 74 53 69 7a 65 28 70  exprStructSize(p
9950: 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  );.      memcpy(
9960: 7a 41 6c 6c 6f 63 2c 20 70 2c 20 6e 53 69 7a 65  zAlloc, p, nSize
9970: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 53 69  );.      if( nSi
9980: 7a 65 3c 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45  ze<EXPR_FULLSIZE
9990: 20 29 7b 20 0a 20 20 20 20 20 20 20 20 6d 65 6d   ){ .        mem
99a0: 73 65 74 28 26 7a 41 6c 6c 6f 63 5b 6e 53 69 7a  set(&zAlloc[nSiz
99b0: 65 5d 2c 20 30 2c 20 45 58 50 52 5f 46 55 4c 4c  e], 0, EXPR_FULL
99c0: 53 49 5a 45 2d 6e 53 69 7a 65 29 3b 0a 20 20 20  SIZE-nSize);.   
99d0: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
99e0: 2f 2a 20 53 65 74 20 74 68 65 20 45 50 5f 52 65  /* Set the EP_Re
99f0: 64 75 63 65 64 2c 20 45 50 5f 54 6f 6b 65 6e 4f  duced, EP_TokenO
9a00: 6e 6c 79 2c 20 61 6e 64 20 45 50 5f 53 74 61 74  nly, and EP_Stat
9a10: 69 63 20 66 6c 61 67 73 20 61 70 70 72 6f 70 72  ic flags appropr
9a20: 69 61 74 65 6c 79 2e 20 2a 2f 0a 20 20 20 20 70  iately. */.    p
9a30: 4e 65 77 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 28  New->flags &= ~(
9a40: 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f  EP_Reduced|EP_To
9a50: 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 53 74 61 74 69  kenOnly|EP_Stati
9a60: 63 7c 45 50 5f 4d 65 6d 54 6f 6b 65 6e 29 3b 0a  c|EP_MemToken);.
9a70: 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20      pNew->flags 
9a80: 7c 3d 20 6e 53 74 72 75 63 74 53 69 7a 65 20 26  |= nStructSize &
9a90: 20 28 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f   (EP_Reduced|EP_
9aa0: 54 6f 6b 65 6e 4f 6e 6c 79 29 3b 0a 20 20 20 20  TokenOnly);.    
9ab0: 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 73  pNew->flags |= s
9ac0: 74 61 74 69 63 46 6c 61 67 3b 0a 0a 20 20 20 20  taticFlag;..    
9ad0: 2f 2a 20 43 6f 70 79 20 74 68 65 20 70 2d 3e 75  /* Copy the p->u
9ae0: 2e 7a 54 6f 6b 65 6e 20 73 74 72 69 6e 67 2c 20  .zToken string, 
9af0: 69 66 20 61 6e 79 2e 20 2a 2f 0a 20 20 20 20 69  if any. */.    i
9b00: 66 28 20 6e 54 6f 6b 65 6e 20 29 7b 0a 20 20 20  f( nToken ){.   
9b10: 20 20 20 63 68 61 72 20 2a 7a 54 6f 6b 65 6e 20     char *zToken 
9b20: 3d 20 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e  = pNew->u.zToken
9b30: 20 3d 20 28 63 68 61 72 2a 29 26 7a 41 6c 6c 6f   = (char*)&zAllo
9b40: 63 5b 6e 4e 65 77 53 69 7a 65 5d 3b 0a 20 20 20  c[nNewSize];.   
9b50: 20 20 20 6d 65 6d 63 70 79 28 7a 54 6f 6b 65 6e     memcpy(zToken
9b60: 2c 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 6e  , p->u.zToken, n
9b70: 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 7d 0a 0a 20  Token);.    }.. 
9b80: 20 20 20 69 66 28 20 30 3d 3d 28 28 70 2d 3e 66     if( 0==((p->f
9b90: 6c 61 67 73 7c 70 4e 65 77 2d 3e 66 6c 61 67 73  lags|pNew->flags
9ba0: 29 20 26 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  ) & EP_TokenOnly
9bb0: 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46 69  ) ){.      /* Fi
9bc0: 6c 6c 20 69 6e 20 74 68 65 20 70 4e 65 77 2d 3e  ll in the pNew->
9bd0: 78 2e 70 53 65 6c 65 63 74 20 6f 72 20 70 4e 65  x.pSelect or pNe
9be0: 77 2d 3e 78 2e 70 4c 69 73 74 20 6d 65 6d 62 65  w->x.pList membe
9bf0: 72 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  r. */.      if( 
9c00: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
9c10: 70 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  p, EP_xIsSelect)
9c20: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77   ){.        pNew
9c30: 2d 3e 78 2e 70 53 65 6c 65 63 74 20 3d 20 73 71  ->x.pSelect = sq
9c40: 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64  lite3SelectDup(d
9c50: 62 2c 20 70 2d 3e 78 2e 70 53 65 6c 65 63 74 2c  b, p->x.pSelect,
9c60: 20 64 75 70 46 6c 61 67 73 29 3b 0a 20 20 20 20   dupFlags);.    
9c70: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
9c80: 20 70 4e 65 77 2d 3e 78 2e 70 4c 69 73 74 20 3d   pNew->x.pList =
9c90: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
9ca0: 44 75 70 28 64 62 2c 20 70 2d 3e 78 2e 70 4c 69  Dup(db, p->x.pLi
9cb0: 73 74 2c 20 64 75 70 46 6c 61 67 73 29 3b 0a 20  st, dupFlags);. 
9cc0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
9cd0: 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 70 4e 65    /* Fill in pNe
9ce0: 77 2d 3e 70 4c 65 66 74 20 61 6e 64 20 70 4e 65  w->pLeft and pNe
9cf0: 77 2d 3e 70 52 69 67 68 74 2e 20 2a 2f 0a 20 20  w->pRight. */.  
9d00: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
9d10: 70 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 52  perty(pNew, EP_R
9d20: 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f  educed|EP_TokenO
9d30: 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 7a 41  nly) ){.      zA
9d40: 6c 6c 6f 63 20 2b 3d 20 64 75 70 65 64 45 78 70  lloc += dupedExp
9d50: 72 4e 6f 64 65 53 69 7a 65 28 70 2c 20 64 75 70  rNodeSize(p, dup
9d60: 46 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 69 66  Flags);.      if
9d70: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
9d80: 79 28 70 4e 65 77 2c 20 45 50 5f 52 65 64 75 63  y(pNew, EP_Reduc
9d90: 65 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ed) ){.        p
9da0: 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20 70 2d 3e  New->pLeft = p->
9db0: 70 4c 65 66 74 20 3f 0a 20 20 20 20 20 20 20 20  pLeft ?.        
9dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65 78                ex
9dd0: 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 4c 65  prDup(db, p->pLe
9de0: 66 74 2c 20 45 58 50 52 44 55 50 5f 52 45 44 55  ft, EXPRDUP_REDU
9df0: 43 45 2c 20 26 7a 41 6c 6c 6f 63 29 20 3a 20 30  CE, &zAlloc) : 0
9e00: 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
9e10: 70 52 69 67 68 74 20 3d 20 70 2d 3e 70 52 69 67  pRight = p->pRig
9e20: 68 74 20 3f 0a 20 20 20 20 20 20 20 20 20 20 20  ht ?.           
9e30: 20 20 20 20 20 20 20 20 20 20 20 20 65 78 70 72              expr
9e40: 44 75 70 28 64 62 2c 20 70 2d 3e 70 52 69 67 68  Dup(db, p->pRigh
9e50: 74 2c 20 45 58 50 52 44 55 50 5f 52 45 44 55 43  t, EXPRDUP_REDUC
9e60: 45 2c 20 26 7a 41 6c 6c 6f 63 29 20 3a 20 30 3b  E, &zAlloc) : 0;
9e70: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
9e80: 66 28 20 70 7a 42 75 66 66 65 72 20 29 7b 0a 20  f( pzBuffer ){. 
9e90: 20 20 20 20 20 20 20 2a 70 7a 42 75 66 66 65 72         *pzBuffer
9ea0: 20 3d 20 7a 41 6c 6c 6f 63 3b 0a 20 20 20 20 20   = zAlloc;.     
9eb0: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
9ec0: 20 20 20 20 69 66 28 20 21 45 78 70 72 48 61 73      if( !ExprHas
9ed0: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 54  Property(p, EP_T
9ee0: 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20 20  okenOnly) ){.   
9ef0: 20 20 20 20 20 70 4e 65 77 2d 3e 70 4c 65 66 74       pNew->pLeft
9f00: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
9f10: 70 28 64 62 2c 20 70 2d 3e 70 4c 65 66 74 2c 20  p(db, p->pLeft, 
9f20: 30 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  0);.        pNew
9f30: 2d 3e 70 52 69 67 68 74 20 3d 20 73 71 6c 69 74  ->pRight = sqlit
9f40: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d  e3ExprDup(db, p-
9f50: 3e 70 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 20  >pRight, 0);.   
9f60: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
9f70: 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a   return pNew;.}.
9f80: 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 6e  ./*.** Create an
9f90: 64 20 72 65 74 75 72 6e 20 61 20 64 65 65 70 20  d return a deep 
9fa0: 63 6f 70 79 20 6f 66 20 74 68 65 20 6f 62 6a 65  copy of the obje
9fb0: 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ct passed as the
9fc0: 20 73 65 63 6f 6e 64 20 0a 2a 2a 20 61 72 67 75   second .** argu
9fd0: 6d 65 6e 74 2e 20 49 66 20 61 6e 20 4f 4f 4d 20  ment. If an OOM 
9fe0: 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20 65 6e 63  condition is enc
9ff0: 6f 75 6e 74 65 72 65 64 2c 20 4e 55 4c 4c 20 69  ountered, NULL i
a000: 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61 6e  s returned.** an
a010: 64 20 74 68 65 20 64 62 2d 3e 6d 61 6c 6c 6f 63  d the db->malloc
a020: 46 61 69 6c 65 64 20 66 6c 61 67 20 73 65 74 2e  Failed flag set.
a030: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
a040: 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 73 74 61 74  TE_OMIT_CTE.stat
a050: 69 63 20 57 69 74 68 20 2a 77 69 74 68 44 75 70  ic With *withDup
a060: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 69  (sqlite3 *db, Wi
a070: 74 68 20 2a 70 29 7b 0a 20 20 57 69 74 68 20 2a  th *p){.  With *
a080: 70 52 65 74 20 3d 20 30 3b 0a 20 20 69 66 28 20  pRet = 0;.  if( 
a090: 70 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 42 79  p ){.    int nBy
a0a0: 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70 29 20  te = sizeof(*p) 
a0b0: 2b 20 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d  + sizeof(p->a[0]
a0c0: 29 20 2a 20 28 70 2d 3e 6e 43 74 65 2d 31 29 3b  ) * (p->nCte-1);
a0d0: 0a 20 20 20 20 70 52 65 74 20 3d 20 73 71 6c 69  .    pRet = sqli
a0e0: 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
a0f0: 64 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20  db, nByte);.    
a100: 69 66 28 20 70 52 65 74 20 29 7b 0a 20 20 20 20  if( pRet ){.    
a110: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 70    int i;.      p
a120: 52 65 74 2d 3e 6e 43 74 65 20 3d 20 70 2d 3e 6e  Ret->nCte = p->n
a130: 43 74 65 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  Cte;.      for(i
a140: 3d 30 3b 20 69 3c 70 2d 3e 6e 43 74 65 3b 20 69  =0; i<p->nCte; i
a150: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 52 65  ++){.        pRe
a160: 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74 20  t->a[i].pSelect 
a170: 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  = sqlite3SelectD
a180: 75 70 28 64 62 2c 20 70 2d 3e 61 5b 69 5d 2e 70  up(db, p->a[i].p
a190: 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 20 20  Select, 0);.    
a1a0: 20 20 20 20 70 52 65 74 2d 3e 61 5b 69 5d 2e 70      pRet->a[i].p
a1b0: 43 6f 6c 73 20 3d 20 73 71 6c 69 74 65 33 45 78  Cols = sqlite3Ex
a1c0: 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d  prListDup(db, p-
a1d0: 3e 61 5b 69 5d 2e 70 43 6f 6c 73 2c 20 30 29 3b  >a[i].pCols, 0);
a1e0: 0a 20 20 20 20 20 20 20 20 70 52 65 74 2d 3e 61  .        pRet->a
a1f0: 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  [i].zName = sqli
a200: 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
a210: 70 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a  p->a[i].zName);.
a220: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
a230: 7d 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b  }.  return pRet;
a240: 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  .}.#else.# defin
a250: 65 20 77 69 74 68 44 75 70 28 78 2c 79 29 20 30  e withDup(x,y) 0
a260: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
a270: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 72 6f  he following gro
a280: 75 70 20 6f 66 20 72 6f 75 74 69 6e 65 73 20 6d  up of routines m
a290: 61 6b 65 20 64 65 65 70 20 63 6f 70 69 65 73 20  ake deep copies 
a2a0: 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 0a  of expressions,.
a2b0: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  ** expression li
a2c0: 73 74 73 2c 20 49 44 20 6c 69 73 74 73 2c 20 61  sts, ID lists, a
a2d0: 6e 64 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d  nd select statem
a2e0: 65 6e 74 73 2e 20 20 54 68 65 20 63 6f 70 69 65  ents.  The copie
a2f0: 73 20 63 61 6e 0a 2a 2a 20 62 65 20 64 65 6c 65  s can.** be dele
a300: 74 65 64 20 28 62 79 20 62 65 69 6e 67 20 70 61  ted (by being pa
a310: 73 73 65 64 20 74 6f 20 74 68 65 69 72 20 72 65  ssed to their re
a320: 73 70 65 63 74 69 76 65 20 2e 2e 2e 44 65 6c 65  spective ...Dele
a330: 74 65 28 29 20 72 6f 75 74 69 6e 65 73 29 0a 2a  te() routines).*
a340: 2a 20 77 69 74 68 6f 75 74 20 65 66 66 65 63 74  * without effect
a350: 69 6e 67 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  ing the original
a360: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 78 70  s..**.** The exp
a370: 72 65 73 73 69 6f 6e 20 6c 69 73 74 2c 20 49 44  ression list, ID
a380: 2c 20 61 6e 64 20 73 6f 75 72 63 65 20 6c 69 73  , and source lis
a390: 74 73 20 72 65 74 75 72 6e 20 62 79 20 73 71 6c  ts return by sql
a3a0: 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
a3b0: 29 2c 0a 2a 2a 20 73 71 6c 69 74 65 33 49 64 4c  ),.** sqlite3IdL
a3c0: 69 73 74 44 75 70 28 29 2c 20 61 6e 64 20 73 71  istDup(), and sq
a3d0: 6c 69 74 65 33 53 72 63 4c 69 73 74 44 75 70 28  lite3SrcListDup(
a3e0: 29 20 63 61 6e 20 6e 6f 74 20 62 65 20 66 75 72  ) can not be fur
a3f0: 74 68 65 72 20 65 78 70 61 6e 64 65 64 20 0a 2a  ther expanded .*
a400: 2a 20 62 79 20 73 75 62 73 65 71 75 65 6e 74 20  * by subsequent 
a410: 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 2a  calls to sqlite*
a420: 4c 69 73 74 41 70 70 65 6e 64 28 29 20 72 6f 75  ListAppend() rou
a430: 74 69 6e 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79  tines..**.** Any
a440: 20 74 61 62 6c 65 73 20 74 68 61 74 20 74 68 65   tables that the
a450: 20 53 72 63 4c 69 73 74 20 6d 69 67 68 74 20 70   SrcList might p
a460: 6f 69 6e 74 20 74 6f 20 61 72 65 20 6e 6f 74 20  oint to are not 
a470: 64 75 70 6c 69 63 61 74 65 64 2e 0a 2a 2a 0a 2a  duplicated..**.*
a480: 2a 20 54 68 65 20 66 6c 61 67 73 20 70 61 72 61  * The flags para
a490: 6d 65 74 65 72 20 63 6f 6e 74 61 69 6e 73 20 61  meter contains a
a4a0: 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20   combination of 
a4b0: 74 68 65 20 45 58 50 52 44 55 50 5f 58 58 58 20  the EXPRDUP_XXX 
a4c0: 66 6c 61 67 73 2e 0a 2a 2a 20 49 66 20 74 68 65  flags..** If the
a4d0: 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 20   EXPRDUP_REDUCE 
a4e0: 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68 65  flag is set, the
a4f0: 6e 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20  n the structure 
a500: 72 65 74 75 72 6e 65 64 20 69 73 20 61 0a 2a 2a  returned is a.**
a510: 20 74 72 75 6e 63 61 74 65 64 20 76 65 72 73 69   truncated versi
a520: 6f 6e 20 6f 66 20 74 68 65 20 75 73 75 61 6c 20  on of the usual 
a530: 45 78 70 72 20 73 74 72 75 63 74 75 72 65 20 74  Expr structure t
a540: 68 61 74 20 77 69 6c 6c 20 62 65 20 73 74 6f 72  hat will be stor
a550: 65 64 20 61 73 0a 2a 2a 20 70 61 72 74 20 6f 66  ed as.** part of
a560: 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72   the in-memory r
a570: 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66  epresentation of
a580: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
a590: 68 65 6d 61 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73  hema..*/.Expr *s
a5a0: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 73 71  qlite3ExprDup(sq
a5b0: 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72 20  lite3 *db, Expr 
a5c0: 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a  *p, int flags){.
a5d0: 20 20 61 73 73 65 72 74 28 20 66 6c 61 67 73 3d    assert( flags=
a5e0: 3d 30 20 7c 7c 20 66 6c 61 67 73 3d 3d 45 58 50  =0 || flags==EXP
a5f0: 52 44 55 50 5f 52 45 44 55 43 45 20 29 3b 0a 20  RDUP_REDUCE );. 
a600: 20 72 65 74 75 72 6e 20 70 20 3f 20 65 78 70 72   return p ? expr
a610: 44 75 70 28 64 62 2c 20 70 2c 20 66 6c 61 67 73  Dup(db, p, flags
a620: 2c 20 30 29 20 3a 20 30 3b 0a 7d 0a 45 78 70 72  , 0) : 0;.}.Expr
a630: 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 45 78 70  List *sqlite3Exp
a640: 72 4c 69 73 74 44 75 70 28 73 71 6c 69 74 65 33  rListDup(sqlite3
a650: 20 2a 64 62 2c 20 45 78 70 72 4c 69 73 74 20 2a   *db, ExprList *
a660: 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  p, int flags){. 
a670: 20 45 78 70 72 4c 69 73 74 20 2a 70 4e 65 77 3b   ExprList *pNew;
a680: 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69  .  struct ExprLi
a690: 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 2c 20  st_item *pItem, 
a6a0: 2a 70 4f 6c 64 49 74 65 6d 3b 0a 20 20 69 6e 74  *pOldItem;.  int
a6b0: 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62   i;.  assert( db
a6c0: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d  !=0 );.  if( p==
a6d0: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
a6e0: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62  pNew = sqlite3Db
a6f0: 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20  MallocRawNN(db, 
a700: 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b  sizeof(*pNew) );
a710: 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29  .  if( pNew==0 )
a720: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65   return 0;.  pNe
a730: 77 2d 3e 6e 45 78 70 72 20 3d 20 69 20 3d 20 70  w->nExpr = i = p
a740: 2d 3e 6e 45 78 70 72 3b 0a 20 20 69 66 28 20 28  ->nExpr;.  if( (
a750: 66 6c 61 67 73 20 26 20 45 58 50 52 44 55 50 5f  flags & EXPRDUP_
a760: 52 45 44 55 43 45 29 3d 3d 30 20 29 20 66 6f 72  REDUCE)==0 ) for
a770: 28 69 3d 31 3b 20 69 3c 70 2d 3e 6e 45 78 70 72  (i=1; i<p->nExpr
a780: 3b 20 69 2b 3d 69 29 7b 7d 0a 20 20 70 4e 65 77  ; i+=i){}.  pNew
a790: 2d 3e 61 20 3d 20 70 49 74 65 6d 20 3d 20 73 71  ->a = pItem = sq
a7a0: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
a7b0: 4e 4e 28 64 62 2c 20 20 69 2a 73 69 7a 65 6f 66  NN(db,  i*sizeof
a7c0: 28 70 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 69  (p->a[0]) );.  i
a7d0: 66 28 20 70 49 74 65 6d 3d 3d 30 20 29 7b 0a 20  f( pItem==0 ){. 
a7e0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
a7f0: 28 64 62 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20  (db, pNew);.    
a800: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 20 0a 20  return 0;.  } . 
a810: 20 70 4f 6c 64 49 74 65 6d 20 3d 20 70 2d 3e 61   pOldItem = p->a
a820: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
a830: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49  ->nExpr; i++, pI
a840: 74 65 6d 2b 2b 2c 20 70 4f 6c 64 49 74 65 6d 2b  tem++, pOldItem+
a850: 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 4f  +){.    Expr *pO
a860: 6c 64 45 78 70 72 20 3d 20 70 4f 6c 64 49 74 65  ldExpr = pOldIte
a870: 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 70 49  m->pExpr;.    pI
a880: 74 65 6d 2d 3e 70 45 78 70 72 20 3d 20 73 71 6c  tem->pExpr = sql
a890: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
a8a0: 70 4f 6c 64 45 78 70 72 2c 20 66 6c 61 67 73 29  pOldExpr, flags)
a8b0: 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 4e 61  ;.    pItem->zNa
a8c0: 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  me = sqlite3DbSt
a8d0: 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65  rDup(db, pOldIte
a8e0: 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70  m->zName);.    p
a8f0: 49 74 65 6d 2d 3e 7a 53 70 61 6e 20 3d 20 73 71  Item->zSpan = sq
a900: 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
a910: 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 53 70 61  , pOldItem->zSpa
a920: 6e 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 73  n);.    pItem->s
a930: 6f 72 74 4f 72 64 65 72 20 3d 20 70 4f 6c 64 49  ortOrder = pOldI
a940: 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3b 0a  tem->sortOrder;.
a950: 20 20 20 20 70 49 74 65 6d 2d 3e 64 6f 6e 65 20      pItem->done 
a960: 3d 20 30 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e  = 0;.    pItem->
a970: 62 53 70 61 6e 49 73 54 61 62 20 3d 20 70 4f 6c  bSpanIsTab = pOl
a980: 64 49 74 65 6d 2d 3e 62 53 70 61 6e 49 73 54 61  dItem->bSpanIsTa
a990: 62 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 75 20  b;.    pItem->u 
a9a0: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 75 3b 0a 20  = pOldItem->u;. 
a9b0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77   }.  return pNew
a9c0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 63 75  ;.}../*.** If cu
a9d0: 72 73 6f 72 73 2c 20 74 72 69 67 67 65 72 73 2c  rsors, triggers,
a9e0: 20 76 69 65 77 73 20 61 6e 64 20 73 75 62 71 75   views and subqu
a9f0: 65 72 69 65 73 20 61 72 65 20 61 6c 6c 20 6f 6d  eries are all om
aa00: 69 74 74 65 64 20 66 72 6f 6d 0a 2a 2a 20 74 68  itted from.** th
aa10: 65 20 62 75 69 6c 64 2c 20 74 68 65 6e 20 6e 6f  e build, then no
aa20: 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ne of the follow
aa30: 69 6e 67 20 72 6f 75 74 69 6e 65 73 2c 20 65 78  ing routines, ex
aa40: 63 65 70 74 20 66 6f 72 20 0a 2a 2a 20 73 71 6c  cept for .** sql
aa50: 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 29 2c  ite3SelectDup(),
aa60: 20 63 61 6e 20 62 65 20 63 61 6c 6c 65 64 2e 20   can be called. 
aa70: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70  sqlite3SelectDup
aa80: 28 29 20 69 73 20 73 6f 6d 65 74 69 6d 65 73 0a  () is sometimes.
aa90: 2a 2a 20 63 61 6c 6c 65 64 20 77 69 74 68 20 61  ** called with a
aaa0: 20 4e 55 4c 4c 20 61 72 67 75 6d 65 6e 74 2e 0a   NULL argument..
aab0: 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
aac0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
aad0: 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
aae0: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45  LITE_OMIT_TRIGGE
aaf0: 52 29 20 5c 0a 20 7c 7c 20 21 64 65 66 69 6e 65  R) \. || !define
ab00: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  d(SQLITE_OMIT_SU
ab10: 42 51 55 45 52 59 29 0a 53 72 63 4c 69 73 74 20  BQUERY).SrcList 
ab20: 2a 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44  *sqlite3SrcListD
ab30: 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  up(sqlite3 *db, 
ab40: 53 72 63 4c 69 73 74 20 2a 70 2c 20 69 6e 74 20  SrcList *p, int 
ab50: 66 6c 61 67 73 29 7b 0a 20 20 53 72 63 4c 69 73  flags){.  SrcLis
ab60: 74 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 69  t *pNew;.  int i
ab70: 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20  ;.  int nByte;. 
ab80: 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29   assert( db!=0 )
ab90: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
aba0: 65 74 75 72 6e 20 30 3b 0a 20 20 6e 42 79 74 65  eturn 0;.  nByte
abb0: 20 3d 20 73 69 7a 65 6f 66 28 2a 70 29 20 2b 20   = sizeof(*p) + 
abc0: 28 70 2d 3e 6e 53 72 63 3e 30 20 3f 20 73 69 7a  (p->nSrc>0 ? siz
abd0: 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 2a 20 28  eof(p->a[0]) * (
abe0: 70 2d 3e 6e 53 72 63 2d 31 29 20 3a 20 30 29 3b  p->nSrc-1) : 0);
abf0: 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  .  pNew = sqlite
ac00: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64  3DbMallocRawNN(d
ac10: 62 2c 20 6e 42 79 74 65 20 29 3b 0a 20 20 69 66  b, nByte );.  if
ac20: 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75  ( pNew==0 ) retu
ac30: 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e 53  rn 0;.  pNew->nS
ac40: 72 63 20 3d 20 70 4e 65 77 2d 3e 6e 41 6c 6c 6f  rc = pNew->nAllo
ac50: 63 20 3d 20 70 2d 3e 6e 53 72 63 3b 0a 20 20 66  c = p->nSrc;.  f
ac60: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 53 72  or(i=0; i<p->nSr
ac70: 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72  c; i++){.    str
ac80: 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
ac90: 20 2a 70 4e 65 77 49 74 65 6d 20 3d 20 26 70 4e   *pNewItem = &pN
aca0: 65 77 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 73 74  ew->a[i];.    st
acb0: 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
acc0: 6d 20 2a 70 4f 6c 64 49 74 65 6d 20 3d 20 26 70  m *pOldItem = &p
acd0: 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 54 61 62 6c  ->a[i];.    Tabl
ace0: 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 70 4e 65  e *pTab;.    pNe
acf0: 77 49 74 65 6d 2d 3e 70 53 63 68 65 6d 61 20 3d  wItem->pSchema =
ad00: 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 53 63 68 65   pOldItem->pSche
ad10: 6d 61 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  ma;.    pNewItem
ad20: 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d 20 73 71  ->zDatabase = sq
ad30: 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
ad40: 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 44 61 74  , pOldItem->zDat
ad50: 61 62 61 73 65 29 3b 0a 20 20 20 20 70 4e 65 77  abase);.    pNew
ad60: 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71  Item->zName = sq
ad70: 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
ad80: 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d  , pOldItem->zNam
ad90: 65 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  e);.    pNewItem
ada0: 2d 3e 7a 41 6c 69 61 73 20 3d 20 73 71 6c 69 74  ->zAlias = sqlit
adb0: 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70  e3DbStrDup(db, p
adc0: 4f 6c 64 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29  OldItem->zAlias)
add0: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
ade0: 66 67 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 66  fg = pOldItem->f
adf0: 67 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  g;.    pNewItem-
ae00: 3e 69 43 75 72 73 6f 72 20 3d 20 70 4f 6c 64 49  >iCursor = pOldI
ae10: 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20  tem->iCursor;.  
ae20: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 61 64 64 72    pNewItem->addr
ae30: 46 69 6c 6c 53 75 62 20 3d 20 70 4f 6c 64 49 74  FillSub = pOldIt
ae40: 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 3b  em->addrFillSub;
ae50: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 72  .    pNewItem->r
ae60: 65 67 52 65 74 75 72 6e 20 3d 20 70 4f 6c 64 49  egReturn = pOldI
ae70: 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 3b 0a  tem->regReturn;.
ae80: 20 20 20 20 69 66 28 20 70 4e 65 77 49 74 65 6d      if( pNewItem
ae90: 2d 3e 66 67 2e 69 73 49 6e 64 65 78 65 64 42 79  ->fg.isIndexedBy
aea0: 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 49 74   ){.      pNewIt
aeb0: 65 6d 2d 3e 75 31 2e 7a 49 6e 64 65 78 65 64 42  em->u1.zIndexedB
aec0: 79 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  y = sqlite3DbStr
aed0: 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d  Dup(db, pOldItem
aee0: 2d 3e 75 31 2e 7a 49 6e 64 65 78 65 64 42 79 29  ->u1.zIndexedBy)
aef0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e 65 77  ;.    }.    pNew
af00: 49 74 65 6d 2d 3e 70 49 42 49 6e 64 65 78 20 3d  Item->pIBIndex =
af10: 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 49 42 49 6e   pOldItem->pIBIn
af20: 64 65 78 3b 0a 20 20 20 20 69 66 28 20 70 4e 65  dex;.    if( pNe
af30: 77 49 74 65 6d 2d 3e 66 67 2e 69 73 54 61 62 46  wItem->fg.isTabF
af40: 75 6e 63 20 29 7b 0a 20 20 20 20 20 20 70 4e 65  unc ){.      pNe
af50: 77 49 74 65 6d 2d 3e 75 31 2e 70 46 75 6e 63 41  wItem->u1.pFuncA
af60: 72 67 20 3d 20 0a 20 20 20 20 20 20 20 20 20 20  rg = .          
af70: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
af80: 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d  up(db, pOldItem-
af90: 3e 75 31 2e 70 46 75 6e 63 41 72 67 2c 20 66 6c  >u1.pFuncArg, fl
afa0: 61 67 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ags);.    }.    
afb0: 70 54 61 62 20 3d 20 70 4e 65 77 49 74 65 6d 2d  pTab = pNewItem-
afc0: 3e 70 54 61 62 20 3d 20 70 4f 6c 64 49 74 65 6d  >pTab = pOldItem
afd0: 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69 66 28 20  ->pTab;.    if( 
afe0: 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20 70 54  pTab ){.      pT
aff0: 61 62 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20  ab->nRef++;.    
b000: 7d 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  }.    pNewItem->
b010: 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65  pSelect = sqlite
b020: 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70  3SelectDup(db, p
b030: 4f 6c 64 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74  OldItem->pSelect
b040: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e  , flags);.    pN
b050: 65 77 49 74 65 6d 2d 3e 70 4f 6e 20 3d 20 73 71  ewItem->pOn = sq
b060: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
b070: 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 4f 6e 2c 20   pOldItem->pOn, 
b080: 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e 65 77  flags);.    pNew
b090: 49 74 65 6d 2d 3e 70 55 73 69 6e 67 20 3d 20 73  Item->pUsing = s
b0a0: 71 6c 69 74 65 33 49 64 4c 69 73 74 44 75 70 28  qlite3IdListDup(
b0b0: 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 55  db, pOldItem->pU
b0c0: 73 69 6e 67 29 3b 0a 20 20 20 20 70 4e 65 77 49  sing);.    pNewI
b0d0: 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 20 3d 20 70  tem->colUsed = p
b0e0: 4f 6c 64 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64  OldItem->colUsed
b0f0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
b100: 4e 65 77 3b 0a 7d 0a 49 64 4c 69 73 74 20 2a 73  New;.}.IdList *s
b110: 71 6c 69 74 65 33 49 64 4c 69 73 74 44 75 70 28  qlite3IdListDup(
b120: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 49 64 4c  sqlite3 *db, IdL
b130: 69 73 74 20 2a 70 29 7b 0a 20 20 49 64 4c 69 73  ist *p){.  IdLis
b140: 74 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 69  t *pNew;.  int i
b150: 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d  ;.  assert( db!=
b160: 30 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  0 );.  if( p==0 
b170: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e  ) return 0;.  pN
b180: 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ew = sqlite3DbMa
b190: 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69  llocRawNN(db, si
b1a0: 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20  zeof(*pNew) );. 
b1b0: 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72   if( pNew==0 ) r
b1c0: 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d  eturn 0;.  pNew-
b1d0: 3e 6e 49 64 20 3d 20 70 2d 3e 6e 49 64 3b 0a 20  >nId = p->nId;. 
b1e0: 20 70 4e 65 77 2d 3e 61 20 3d 20 73 71 6c 69 74   pNew->a = sqlit
b1f0: 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28  e3DbMallocRawNN(
b200: 64 62 2c 20 70 2d 3e 6e 49 64 2a 73 69 7a 65 6f  db, p->nId*sizeo
b210: 66 28 70 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20  f(p->a[0]) );.  
b220: 69 66 28 20 70 4e 65 77 2d 3e 61 3d 3d 30 20 29  if( pNew->a==0 )
b230: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  {.    sqlite3DbF
b240: 72 65 65 28 64 62 2c 20 70 4e 65 77 29 3b 0a 20  ree(db, pNew);. 
b250: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
b260: 0a 20 20 2f 2a 20 4e 6f 74 65 20 74 68 61 74 20  .  /* Note that 
b270: 62 65 63 61 75 73 65 20 74 68 65 20 73 69 7a 65  because the size
b280: 20 6f 66 20 74 68 65 20 61 6c 6c 6f 63 61 74 69   of the allocati
b290: 6f 6e 20 66 6f 72 20 70 2d 3e 61 5b 5d 20 69 73  on for p->a[] is
b2a0: 20 6e 6f 74 0a 20 20 2a 2a 20 6e 65 63 65 73 73   not.  ** necess
b2b0: 61 72 69 6c 79 20 61 20 70 6f 77 65 72 20 6f 66  arily a power of
b2c0: 20 74 77 6f 2c 20 73 71 6c 69 74 65 33 49 64 4c   two, sqlite3IdL
b2d0: 69 73 74 41 70 70 65 6e 64 28 29 20 6d 61 79 20  istAppend() may 
b2e0: 6e 6f 74 20 62 65 20 63 61 6c 6c 65 64 0a 20 20  not be called.  
b2f0: 2a 2a 20 6f 6e 20 74 68 65 20 64 75 70 6c 69 63  ** on the duplic
b300: 61 74 65 20 63 72 65 61 74 65 64 20 62 79 20 74  ate created by t
b310: 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 2a 2f  his function. */
b320: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d  .  for(i=0; i<p-
b330: 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nId; i++){.    
b340: 73 74 72 75 63 74 20 49 64 4c 69 73 74 5f 69 74  struct IdList_it
b350: 65 6d 20 2a 70 4e 65 77 49 74 65 6d 20 3d 20 26  em *pNewItem = &
b360: 70 4e 65 77 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20  pNew->a[i];.    
b370: 73 74 72 75 63 74 20 49 64 4c 69 73 74 5f 69 74  struct IdList_it
b380: 65 6d 20 2a 70 4f 6c 64 49 74 65 6d 20 3d 20 26  em *pOldItem = &
b390: 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 70 4e 65  p->a[i];.    pNe
b3a0: 77 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73  wItem->zName = s
b3b0: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
b3c0: 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61  b, pOldItem->zNa
b3d0: 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  me);.    pNewIte
b3e0: 6d 2d 3e 69 64 78 20 3d 20 70 4f 6c 64 49 74 65  m->idx = pOldIte
b3f0: 6d 2d 3e 69 64 78 3b 0a 20 20 7d 0a 20 20 72 65  m->idx;.  }.  re
b400: 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 53 65 6c  turn pNew;.}.Sel
b410: 65 63 74 20 2a 73 71 6c 69 74 65 33 53 65 6c 65  ect *sqlite3Sele
b420: 63 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64  ctDup(sqlite3 *d
b430: 62 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e  b, Select *p, in
b440: 74 20 66 6c 61 67 73 29 7b 0a 20 20 53 65 6c 65  t flags){.  Sele
b450: 63 74 20 2a 70 4e 65 77 2c 20 2a 70 50 72 69 6f  ct *pNew, *pPrio
b460: 72 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 21  r;.  assert( db!
b470: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30  =0 );.  if( p==0
b480: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
b490: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  New = sqlite3DbM
b4a0: 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73  allocRawNN(db, s
b4b0: 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69  izeof(*p) );.  i
b4c0: 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74  f( pNew==0 ) ret
b4d0: 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70  urn 0;.  pNew->p
b4e0: 45 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45  EList = sqlite3E
b4f0: 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70  xprListDup(db, p
b500: 2d 3e 70 45 4c 69 73 74 2c 20 66 6c 61 67 73 29  ->pEList, flags)
b510: 3b 0a 20 20 70 4e 65 77 2d 3e 70 53 72 63 20 3d  ;.  pNew->pSrc =
b520: 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44   sqlite3SrcListD
b530: 75 70 28 64 62 2c 20 70 2d 3e 70 53 72 63 2c 20  up(db, p->pSrc, 
b540: 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e  flags);.  pNew->
b550: 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33  pWhere = sqlite3
b560: 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70  ExprDup(db, p->p
b570: 57 68 65 72 65 2c 20 66 6c 61 67 73 29 3b 0a 20  Where, flags);. 
b580: 20 70 4e 65 77 2d 3e 70 47 72 6f 75 70 42 79 20   pNew->pGroupBy 
b590: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
b5a0: 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 47 72 6f  tDup(db, p->pGro
b5b0: 75 70 42 79 2c 20 66 6c 61 67 73 29 3b 0a 20 20  upBy, flags);.  
b5c0: 70 4e 65 77 2d 3e 70 48 61 76 69 6e 67 20 3d 20  pNew->pHaving = 
b5d0: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
b5e0: 62 2c 20 70 2d 3e 70 48 61 76 69 6e 67 2c 20 66  b, p->pHaving, f
b5f0: 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 70  lags);.  pNew->p
b600: 4f 72 64 65 72 42 79 20 3d 20 73 71 6c 69 74 65  OrderBy = sqlite
b610: 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c  3ExprListDup(db,
b620: 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 66 6c   p->pOrderBy, fl
b630: 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 6f 70  ags);.  pNew->op
b640: 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 70 4e 65 77   = p->op;.  pNew
b650: 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f  ->pPrior = pPrio
b660: 72 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  r = sqlite3Selec
b670: 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 50 72 69  tDup(db, p->pPri
b680: 6f 72 2c 20 66 6c 61 67 73 29 3b 0a 20 20 69 66  or, flags);.  if
b690: 28 20 70 50 72 69 6f 72 20 29 20 70 50 72 69 6f  ( pPrior ) pPrio
b6a0: 72 2d 3e 70 4e 65 78 74 20 3d 20 70 4e 65 77 3b  r->pNext = pNew;
b6b0: 0a 20 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20 3d  .  pNew->pNext =
b6c0: 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69 6d   0;.  pNew->pLim
b6d0: 69 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  it = sqlite3Expr
b6e0: 44 75 70 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69  Dup(db, p->pLimi
b6f0: 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65  t, flags);.  pNe
b700: 77 2d 3e 70 4f 66 66 73 65 74 20 3d 20 73 71 6c  w->pOffset = sql
b710: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
b720: 70 2d 3e 70 4f 66 66 73 65 74 2c 20 66 6c 61 67  p->pOffset, flag
b730: 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 69 4c 69 6d  s);.  pNew->iLim
b740: 69 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  it = 0;.  pNew->
b750: 69 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 70  iOffset = 0;.  p
b760: 4e 65 77 2d 3e 73 65 6c 46 6c 61 67 73 20 3d 20  New->selFlags = 
b770: 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 7e 53  p->selFlags & ~S
b780: 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61 6c 3b  F_UsesEphemeral;
b790: 0a 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65  .  pNew->addrOpe
b7a0: 6e 45 70 68 6d 5b 30 5d 20 3d 20 2d 31 3b 0a 20  nEphm[0] = -1;. 
b7b0: 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45   pNew->addrOpenE
b7c0: 70 68 6d 5b 31 5d 20 3d 20 2d 31 3b 0a 20 20 70  phm[1] = -1;.  p
b7d0: 4e 65 77 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20  New->nSelectRow 
b7e0: 3d 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b  = p->nSelectRow;
b7f0: 0a 20 20 70 4e 65 77 2d 3e 70 57 69 74 68 20 3d  .  pNew->pWith =
b800: 20 77 69 74 68 44 75 70 28 64 62 2c 20 70 2d 3e   withDup(db, p->
b810: 70 57 69 74 68 29 3b 0a 20 20 73 71 6c 69 74 65  pWith);.  sqlite
b820: 33 53 65 6c 65 63 74 53 65 74 4e 61 6d 65 28 70  3SelectSetName(p
b830: 4e 65 77 2c 20 70 2d 3e 7a 53 65 6c 4e 61 6d 65  New, p->zSelName
b840: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77  );.  return pNew
b850: 3b 0a 7d 0a 23 65 6c 73 65 0a 53 65 6c 65 63 74  ;.}.#else.Select
b860: 20 2a 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44   *sqlite3SelectD
b870: 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  up(sqlite3 *db, 
b880: 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 66  Select *p, int f
b890: 6c 61 67 73 29 7b 0a 20 20 61 73 73 65 72 74 28  lags){.  assert(
b8a0: 20 70 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72   p==0 );.  retur
b8b0: 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a  n 0;.}.#endif...
b8c0: 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20  /*.** Add a new 
b8d0: 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 65  element to the e
b8e0: 6e 64 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73  nd of an express
b8f0: 69 6f 6e 20 6c 69 73 74 2e 20 20 49 66 20 70 4c  ion list.  If pL
b900: 69 73 74 20 69 73 0a 2a 2a 20 69 6e 69 74 69 61  ist is.** initia
b910: 6c 6c 79 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 63  lly NULL, then c
b920: 72 65 61 74 65 20 61 20 6e 65 77 20 65 78 70 72  reate a new expr
b930: 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a  ession list..**.
b940: 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61  ** If a memory a
b950: 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20  llocation error 
b960: 6f 63 63 75 72 73 2c 20 74 68 65 20 65 6e 74 69  occurs, the enti
b970: 72 65 20 6c 69 73 74 20 69 73 20 66 72 65 65 64  re list is freed
b980: 20 61 6e 64 0a 2a 2a 20 4e 55 4c 4c 20 69 73 20   and.** NULL is 
b990: 72 65 74 75 72 6e 65 64 2e 20 20 49 66 20 6e 6f  returned.  If no
b9a0: 6e 2d 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e  n-NULL is return
b9b0: 65 64 2c 20 74 68 65 6e 20 69 74 20 69 73 20 67  ed, then it is g
b9c0: 75 61 72 61 6e 74 65 65 64 0a 2a 2a 20 74 68 61  uaranteed.** tha
b9d0: 74 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20  t the new entry 
b9e0: 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79  was successfully
b9f0: 20 61 70 70 65 6e 64 65 64 2e 0a 2a 2f 0a 45 78   appended..*/.Ex
ba00: 70 72 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 45  prList *sqlite3E
ba10: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 0a 20  xprListAppend(. 
ba20: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
ba30: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
ba40: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
ba50: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
ba60: 2c 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74  ,        /* List
ba70: 20 74 6f 20 77 68 69 63 68 20 74 6f 20 61 70 70   to which to app
ba80: 65 6e 64 2e 20 4d 69 67 68 74 20 62 65 20 4e 55  end. Might be NU
ba90: 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45  LL */.  Expr *pE
baa0: 78 70 72 20 20 20 20 20 20 20 20 20 20 20 20 20  xpr             
bab0: 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 74 6f  /* Expression to
bac0: 20 62 65 20 61 70 70 65 6e 64 65 64 2e 20 4d 69   be appended. Mi
bad0: 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29  ght be NULL */.)
bae0: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
baf0: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
bb00: 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b  assert( db!=0 );
bb10: 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
bb20: 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73  ){.    pList = s
bb30: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
bb40: 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 45  wNN(db, sizeof(E
bb50: 78 70 72 4c 69 73 74 29 20 29 3b 0a 20 20 20 20  xprList) );.    
bb60: 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a  if( pList==0 ){.
bb70: 20 20 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65        goto no_me
bb80: 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 69  m;.    }.    pLi
bb90: 73 74 2d 3e 6e 45 78 70 72 20 3d 20 30 3b 0a 20  st->nExpr = 0;. 
bba0: 20 20 20 70 4c 69 73 74 2d 3e 61 20 3d 20 73 71     pList->a = sq
bbb0: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
bbc0: 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 70 4c  NN(db, sizeof(pL
bbd0: 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 20  ist->a[0]));.   
bbe0: 20 69 66 28 20 70 4c 69 73 74 2d 3e 61 3d 3d 30   if( pList->a==0
bbf0: 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a   ) goto no_mem;.
bc00: 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 4c 69    }else if( (pLi
bc10: 73 74 2d 3e 6e 45 78 70 72 20 26 20 28 70 4c 69  st->nExpr & (pLi
bc20: 73 74 2d 3e 6e 45 78 70 72 2d 31 29 29 3d 3d 30  st->nExpr-1))==0
bc30: 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45   ){.    struct E
bc40: 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 3b  xprList_item *a;
bc50: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69  .    assert( pLi
bc60: 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20  st->nExpr>0 );. 
bc70: 20 20 20 61 20 3d 20 73 71 6c 69 74 65 33 44 62     a = sqlite3Db
bc80: 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70 4c 69 73  Realloc(db, pLis
bc90: 74 2d 3e 61 2c 20 70 4c 69 73 74 2d 3e 6e 45 78  t->a, pList->nEx
bca0: 70 72 2a 32 2a 73 69 7a 65 6f 66 28 70 4c 69 73  pr*2*sizeof(pLis
bcb0: 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 20 20 69  t->a[0]));.    i
bcc0: 66 28 20 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( a==0 ){.     
bcd0: 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20   goto no_mem;.  
bce0: 20 20 7d 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61    }.    pList->a
bcf0: 20 3d 20 61 3b 0a 20 20 7d 0a 20 20 61 73 73 65   = a;.  }.  asse
bd00: 72 74 28 20 70 4c 69 73 74 2d 3e 61 21 3d 30 20  rt( pList->a!=0 
bd10: 29 3b 0a 20 20 69 66 28 20 31 20 29 7b 0a 20 20  );.  if( 1 ){.  
bd20: 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
bd30: 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20  t_item *pItem = 
bd40: 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d  &pList->a[pList-
bd50: 3e 6e 45 78 70 72 2b 2b 5d 3b 0a 20 20 20 20 6d  >nExpr++];.    m
bd60: 65 6d 73 65 74 28 70 49 74 65 6d 2c 20 30 2c 20  emset(pItem, 0, 
bd70: 73 69 7a 65 6f 66 28 2a 70 49 74 65 6d 29 29 3b  sizeof(*pItem));
bd80: 0a 20 20 20 20 70 49 74 65 6d 2d 3e 70 45 78 70  .    pItem->pExp
bd90: 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 7d 0a 20  r = pExpr;.  }. 
bda0: 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 0a   return pList;..
bdb0: 6e 6f 5f 6d 65 6d 3a 20 20 20 20 20 0a 20 20 2f  no_mem:     .  /
bdc0: 2a 20 41 76 6f 69 64 20 6c 65 61 6b 69 6e 67 20  * Avoid leaking 
bdd0: 6d 65 6d 6f 72 79 20 69 66 20 6d 61 6c 6c 6f 63  memory if malloc
bde0: 20 68 61 73 20 66 61 69 6c 65 64 2e 20 2a 2f 0a   has failed. */.
bdf0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
be00: 65 74 65 28 64 62 2c 20 70 45 78 70 72 29 3b 0a  ete(db, pExpr);.
be10: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
be20: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69 73  tDelete(db, pLis
be30: 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a  t);.  return 0;.
be40: 7d 0a 0a 2f 2a 0a 2a 2a 20 70 43 6f 6c 75 6d 6e  }../*.** pColumn
be50: 73 20 61 6e 64 20 70 45 78 70 72 20 66 6f 72 20  s and pExpr for 
be60: 61 20 76 65 63 74 6f 72 20 61 73 73 69 67 6e 6d  a vector assignm
be70: 65 6e 74 2c 20 6c 69 6b 65 20 74 68 69 73 3a 0a  ent, like this:.
be80: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 28 61 2c  **.**        (a,
be90: 62 2c 63 29 20 3d 20 28 65 78 70 72 31 2c 65 78  b,c) = (expr1,ex
bea0: 70 72 32 2c 65 78 70 72 33 29 0a 2a 2a 20 4f 72  pr2,expr3).** Or
beb0: 3a 20 20 20 20 28 61 2c 62 2c 63 29 20 3d 20 28  :    (a,b,c) = (
bec0: 53 45 4c 45 43 54 20 78 2c 79 2c 7a 20 46 52 4f  SELECT x,y,z FRO
bed0: 4d 20 2e 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 46 6f  M ....).**.** Fo
bee0: 72 20 65 61 63 68 20 74 65 72 6d 20 6f 66 20 74  r each term of t
bef0: 68 65 20 76 65 63 74 6f 72 20 61 73 73 69 67 6e  he vector assign
bf00: 6d 65 6e 74 2c 20 61 70 70 65 6e 64 20 6e 65 77  ment, append new
bf10: 20 65 6e 74 72 69 65 73 20 74 6f 20 74 68 65 0a   entries to the.
bf20: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  ** expression li
bf30: 73 74 2e 20 20 49 6e 20 74 68 65 20 63 61 73 65  st.  In the case
bf40: 20 6f 66 20 61 20 73 75 62 71 75 65 72 79 20 6f   of a subquery o
bf50: 6e 20 74 68 65 20 4c 48 53 2c 20 61 70 70 65 6e  n the LHS, appen
bf60: 64 0a 2a 2a 20 54 4b 5f 53 45 4c 45 43 54 5f 43  d.** TK_SELECT_C
bf70: 4f 4c 55 4d 4e 20 65 78 70 72 65 73 73 69 6f 6e  OLUMN expression
bf80: 73 2e 0a 2a 2f 0a 45 78 70 72 4c 69 73 74 20 2a  s..*/.ExprList *
bf90: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
bfa0: 70 70 65 6e 64 56 65 63 74 6f 72 28 0a 20 20 50  ppendVector(.  P
bfb0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
bfc0: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
bfd0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
bfe0: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20  prList *pList,  
bff0: 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20       /* List to 
c000: 77 68 69 63 68 20 74 6f 20 61 70 70 65 6e 64 2e  which to append.
c010: 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a   Might be NULL *
c020: 2f 0a 20 20 49 64 4c 69 73 74 20 2a 70 43 6f 6c  /.  IdList *pCol
c030: 75 6d 6e 73 2c 20 20 20 20 20 20 2f 2a 20 4c 69  umns,      /* Li
c040: 73 74 20 6f 66 20 6e 61 6d 65 73 20 6f 66 20 4c  st of names of L
c050: 48 53 20 6f 66 20 74 68 65 20 61 73 73 69 67 6e  HS of the assign
c060: 6d 65 6e 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a  ment */.  Expr *
c070: 70 45 78 70 72 20 20 20 20 20 20 20 20 20 20 20  pExpr           
c080: 20 2f 2a 20 56 65 63 74 6f 72 20 65 78 70 72 65   /* Vector expre
c090: 73 73 69 6f 6e 20 74 6f 20 62 65 20 61 70 70 65  ssion to be appe
c0a0: 6e 64 65 64 2e 20 4d 69 67 68 74 20 62 65 20 4e  nded. Might be N
c0b0: 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  ULL */.){.  sqli
c0c0: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
c0d0: 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20  ->db;.  int n;. 
c0e0: 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 43   int i;.  if( pC
c0f0: 6f 6c 75 6d 6e 73 3d 3d 30 20 29 20 67 6f 74 6f  olumns==0 ) goto
c100: 20 76 65 63 74 6f 72 5f 61 70 70 65 6e 64 5f 65   vector_append_e
c110: 72 72 6f 72 3b 0a 20 20 69 66 28 20 70 45 78 70  rror;.  if( pExp
c120: 72 3d 3d 30 20 29 20 67 6f 74 6f 20 76 65 63 74  r==0 ) goto vect
c130: 6f 72 5f 61 70 70 65 6e 64 5f 65 72 72 6f 72 3b  or_append_error;
c140: 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 45 78  .  n = sqlite3Ex
c150: 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70 45 78  prVectorSize(pEx
c160: 70 72 29 3b 0a 20 20 69 66 28 20 70 43 6f 6c 75  pr);.  if( pColu
c170: 6d 6e 73 2d 3e 6e 49 64 21 3d 6e 20 29 7b 0a 20  mns->nId!=n ){. 
c180: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
c190: 73 67 28 70 50 61 72 73 65 2c 20 22 25 64 20 63  sg(pParse, "%d c
c1a0: 6f 6c 75 6d 6e 73 20 61 73 73 69 67 6e 65 64 20  olumns assigned 
c1b0: 25 64 20 76 61 6c 75 65 73 22 2c 0a 20 20 20 20  %d values",.    
c1c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c1d0: 70 43 6f 6c 75 6d 6e 73 2d 3e 6e 49 64 2c 20 6e  pColumns->nId, n
c1e0: 29 3b 0a 20 20 20 20 67 6f 74 6f 20 76 65 63 74  );.    goto vect
c1f0: 6f 72 5f 61 70 70 65 6e 64 5f 65 72 72 6f 72 3b  or_append_error;
c200: 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20  .  }.  for(i=0; 
c210: 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45  i<n; i++){.    E
c220: 78 70 72 20 2a 70 53 75 62 45 78 70 72 20 3d 20  xpr *pSubExpr = 
c230: 73 71 6c 69 74 65 33 45 78 70 72 46 6f 72 56 65  sqlite3ExprForVe
c240: 63 74 6f 72 46 69 65 6c 64 28 70 50 61 72 73 65  ctorField(pParse
c250: 2c 20 70 45 78 70 72 2c 20 69 29 3b 0a 20 20 20  , pExpr, i);.   
c260: 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33   pList = sqlite3
c270: 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
c280: 50 61 72 73 65 2c 20 70 4c 69 73 74 2c 20 70 53  Parse, pList, pS
c290: 75 62 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28  ubExpr);.    if(
c2a0: 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20   pList ){.      
c2b0: 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e  pList->a[pList->
c2c0: 6e 45 78 70 72 2d 31 5d 2e 7a 4e 61 6d 65 20 3d  nExpr-1].zName =
c2d0: 20 70 43 6f 6c 75 6d 6e 73 2d 3e 61 5b 69 5d 2e   pColumns->a[i].
c2e0: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 70 43 6f  zName;.      pCo
c2f0: 6c 75 6d 6e 73 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  lumns->a[i].zNam
c300: 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  e = 0;.    }.  }
c310: 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70  .  if( pExpr->op
c320: 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a 20  ==TK_SELECT ){. 
c330: 20 20 20 69 66 28 20 70 4c 69 73 74 20 26 26 20     if( pList && 
c340: 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  pList->a[0].pExp
c350: 72 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  r ){.      asser
c360: 74 28 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  t( pList->a[0].p
c370: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c  Expr->op==TK_SEL
c380: 45 43 54 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20  ECT_COLUMN );.  
c390: 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e      pList->a[0].
c3a0: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20 3d 20  pExpr->pRight = 
c3b0: 70 45 78 70 72 3b 0a 20 20 20 20 20 20 70 45 78  pExpr;.      pEx
c3c0: 70 72 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  pr = 0;.    }.  
c3d0: 7d 0a 0a 76 65 63 74 6f 72 5f 61 70 70 65 6e 64  }..vector_append
c3e0: 5f 65 72 72 6f 72 3a 0a 20 20 73 71 6c 69 74 65  _error:.  sqlite
c3f0: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
c400: 70 45 78 70 72 29 3b 0a 20 20 73 71 6c 69 74 65  pExpr);.  sqlite
c410: 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 64 62  3IdListDelete(db
c420: 2c 20 70 43 6f 6c 75 6d 6e 73 29 3b 0a 20 20 72  , pColumns);.  r
c430: 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a  eturn pList;.}..
c440: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 73 6f  /*.** Set the so
c450: 72 74 20 6f 72 64 65 72 20 66 6f 72 20 74 68 65  rt order for the
c460: 20 6c 61 73 74 20 65 6c 65 6d 65 6e 74 20 6f 6e   last element on
c470: 20 74 68 65 20 67 69 76 65 6e 20 45 78 70 72 4c   the given ExprL
c480: 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ist..*/.void sql
c490: 69 74 65 33 45 78 70 72 4c 69 73 74 53 65 74 53  ite3ExprListSetS
c4a0: 6f 72 74 4f 72 64 65 72 28 45 78 70 72 4c 69 73  ortOrder(ExprLis
c4b0: 74 20 2a 70 2c 20 69 6e 74 20 69 53 6f 72 74 4f  t *p, int iSortO
c4c0: 72 64 65 72 29 7b 0a 20 20 69 66 28 20 70 3d 3d  rder){.  if( p==
c4d0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73  0 ) return;.  as
c4e0: 73 65 72 74 28 20 53 51 4c 49 54 45 5f 53 4f 5f  sert( SQLITE_SO_
c4f0: 55 4e 44 45 46 49 4e 45 44 3c 30 20 26 26 20 53  UNDEFINED<0 && S
c500: 51 4c 49 54 45 5f 53 4f 5f 41 53 43 3e 3d 30 20  QLITE_SO_ASC>=0 
c510: 26 26 20 53 51 4c 49 54 45 5f 53 4f 5f 44 45 53  && SQLITE_SO_DES
c520: 43 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  C>0 );.  assert(
c530: 20 70 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20   p->nExpr>0 );. 
c540: 20 69 66 28 20 69 53 6f 72 74 4f 72 64 65 72 3c   if( iSortOrder<
c550: 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
c560: 20 70 2d 3e 61 5b 70 2d 3e 6e 45 78 70 72 2d 31   p->a[p->nExpr-1
c570: 5d 2e 73 6f 72 74 4f 72 64 65 72 3d 3d 53 51 4c  ].sortOrder==SQL
c580: 49 54 45 5f 53 4f 5f 41 53 43 20 29 3b 0a 20 20  ITE_SO_ASC );.  
c590: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
c5a0: 70 2d 3e 61 5b 70 2d 3e 6e 45 78 70 72 2d 31 5d  p->a[p->nExpr-1]
c5b0: 2e 73 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38  .sortOrder = (u8
c5c0: 29 69 53 6f 72 74 4f 72 64 65 72 3b 0a 7d 0a 0a  )iSortOrder;.}..
c5d0: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 45 78  /*.** Set the Ex
c5e0: 70 72 4c 69 73 74 2e 61 5b 5d 2e 7a 4e 61 6d 65  prList.a[].zName
c5f0: 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20   element of the 
c600: 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64  most recently ad
c610: 64 65 64 20 69 74 65 6d 0a 2a 2a 20 6f 6e 20 74  ded item.** on t
c620: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  he expression li
c630: 73 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20  st..**.** pList 
c640: 6d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 66 6f  might be NULL fo
c650: 6c 6c 6f 77 69 6e 67 20 61 6e 20 4f 4f 4d 20 65  llowing an OOM e
c660: 72 72 6f 72 2e 20 20 42 75 74 20 70 4e 61 6d 65  rror.  But pName
c670: 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 62 65   should never be
c680: 0a 2a 2a 20 4e 55 4c 4c 2e 20 20 49 66 20 61 20  .** NULL.  If a 
c690: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
c6a0: 6e 20 66 61 69 6c 73 2c 20 74 68 65 20 70 50 61  n fails, the pPa
c6b0: 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
c6c0: 61 69 6c 65 64 20 66 6c 61 67 0a 2a 2a 20 69 73  ailed flag.** is
c6d0: 20 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71   set..*/.void sq
c6e0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 53 65 74  lite3ExprListSet
c6f0: 4e 61 6d 65 28 0a 20 20 50 61 72 73 65 20 2a 70  Name(.  Parse *p
c700: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
c710: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
c720: 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  xt */.  ExprList
c730: 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20   *pList,        
c740: 2f 2a 20 4c 69 73 74 20 74 6f 20 77 68 69 63 68  /* List to which
c750: 20 74 6f 20 61 64 64 20 74 68 65 20 73 70 61 6e   to add the span
c760: 2e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  . */.  Token *pN
c770: 61 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ame,           /
c780: 2a 20 4e 61 6d 65 20 74 6f 20 62 65 20 61 64 64  * Name to be add
c790: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 64 65 71 75  ed */.  int dequ
c7a0: 6f 74 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ote             
c7b0: 2f 2a 20 54 72 75 65 20 74 6f 20 63 61 75 73 65  /* True to cause
c7c0: 20 74 68 65 20 6e 61 6d 65 20 74 6f 20 62 65 20   the name to be 
c7d0: 64 65 71 75 6f 74 65 64 20 2a 2f 0a 29 7b 0a 20  dequoted */.){. 
c7e0: 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d   assert( pList!=
c7f0: 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d  0 || pParse->db-
c800: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 21 3d 30  >mallocFailed!=0
c810: 20 29 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20   );.  if( pList 
c820: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45 78  ){.    struct Ex
c830: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
c840: 65 6d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  em;.    assert( 
c850: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29  pList->nExpr>0 )
c860: 3b 0a 20 20 20 20 70 49 74 65 6d 20 3d 20 26 70  ;.    pItem = &p
c870: 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e  List->a[pList->n
c880: 45 78 70 72 2d 31 5d 3b 0a 20 20 20 20 61 73 73  Expr-1];.    ass
c890: 65 72 74 28 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d  ert( pItem->zNam
c8a0: 65 3d 3d 30 20 29 3b 0a 20 20 20 20 70 49 74 65  e==0 );.    pIte
c8b0: 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  m->zName = sqlit
c8c0: 65 33 44 62 53 74 72 4e 44 75 70 28 70 50 61 72  e3DbStrNDup(pPar
c8d0: 73 65 2d 3e 64 62 2c 20 70 4e 61 6d 65 2d 3e 7a  se->db, pName->z
c8e0: 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20 20  , pName->n);.   
c8f0: 20 69 66 28 20 64 65 71 75 6f 74 65 20 29 20 73   if( dequote ) s
c900: 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28 70 49  qlite3Dequote(pI
c910: 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7d  tem->zName);.  }
c920: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
c930: 65 20 45 78 70 72 4c 69 73 74 2e 61 5b 5d 2e 7a  e ExprList.a[].z
c940: 53 70 61 6e 20 65 6c 65 6d 65 6e 74 20 6f 66 20  Span element of 
c950: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  the most recentl
c960: 79 20 61 64 64 65 64 20 69 74 65 6d 0a 2a 2a 20  y added item.** 
c970: 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  on the expressio
c980: 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c  n list..**.** pL
c990: 69 73 74 20 6d 69 67 68 74 20 62 65 20 4e 55 4c  ist might be NUL
c9a0: 4c 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 6e 20 4f  L following an O
c9b0: 4f 4d 20 65 72 72 6f 72 2e 20 20 42 75 74 20 70  OM error.  But p
c9c0: 53 70 61 6e 20 73 68 6f 75 6c 64 20 6e 65 76 65  Span should neve
c9d0: 72 20 62 65 0a 2a 2a 20 4e 55 4c 4c 2e 20 20 49  r be.** NULL.  I
c9e0: 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  f a memory alloc
c9f0: 61 74 69 6f 6e 20 66 61 69 6c 73 2c 20 74 68 65  ation fails, the
ca00: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
ca10: 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 0a 2a  locFailed flag.*
ca20: 2a 20 69 73 20 73 65 74 2e 0a 2a 2f 0a 76 6f 69  * is set..*/.voi
ca30: 64 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  d sqlite3ExprLis
ca40: 74 53 65 74 53 70 61 6e 28 0a 20 20 50 61 72 73  tSetSpan(.  Pars
ca50: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
ca60: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
ca70: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
ca80: 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20  List *pList,    
ca90: 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 77      /* List to w
caa0: 68 69 63 68 20 74 6f 20 61 64 64 20 74 68 65 20  hich to add the 
cab0: 73 70 61 6e 2e 20 2a 2f 0a 20 20 45 78 70 72 53  span. */.  ExprS
cac0: 70 61 6e 20 2a 70 53 70 61 6e 20 20 20 20 20 20  pan *pSpan      
cad0: 20 20 20 2f 2a 20 54 68 65 20 73 70 61 6e 20 74     /* The span t
cae0: 6f 20 62 65 20 61 64 64 65 64 20 2a 2f 0a 29 7b  o be added */.){
caf0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
cb00: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 61   pParse->db;.  a
cb10: 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30 20  ssert( pList!=0 
cb20: 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
cb30: 6c 65 64 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  led!=0 );.  if( 
cb40: 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 73 74 72  pList ){.    str
cb50: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
cb60: 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 4c 69 73  m *pItem = &pLis
cb70: 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45 78 70  t->a[pList->nExp
cb80: 72 2d 31 5d 3b 0a 20 20 20 20 61 73 73 65 72 74  r-1];.    assert
cb90: 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30  ( pList->nExpr>0
cba0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
cbb0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
cbc0: 20 7c 7c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72   || pItem->pExpr
cbd0: 3d 3d 70 53 70 61 6e 2d 3e 70 45 78 70 72 20 29  ==pSpan->pExpr )
cbe0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
cbf0: 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a  ree(db, pItem->z
cc00: 53 70 61 6e 29 3b 0a 20 20 20 20 70 49 74 65 6d  Span);.    pItem
cc10: 2d 3e 7a 53 70 61 6e 20 3d 20 73 71 6c 69 74 65  ->zSpan = sqlite
cc20: 33 44 62 53 74 72 4e 44 75 70 28 64 62 2c 20 28  3DbStrNDup(db, (
cc30: 63 68 61 72 2a 29 70 53 70 61 6e 2d 3e 7a 53 74  char*)pSpan->zSt
cc40: 61 72 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  art,.           
cc50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cc60: 20 20 20 20 20 20 20 20 20 28 69 6e 74 29 28 70           (int)(p
cc70: 53 70 61 6e 2d 3e 7a 45 6e 64 20 2d 20 70 53 70  Span->zEnd - pSp
cc80: 61 6e 2d 3e 7a 53 74 61 72 74 29 29 3b 0a 20 20  an->zStart));.  
cc90: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  }.}../*.** If th
cca0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  e expression lis
ccb0: 74 20 70 45 4c 69 73 74 20 63 6f 6e 74 61 69 6e  t pEList contain
ccc0: 73 20 6d 6f 72 65 20 74 68 61 6e 20 69 4c 69 6d  s more than iLim
ccd0: 69 74 20 65 6c 65 6d 65 6e 74 73 2c 0a 2a 2a 20  it elements,.** 
cce0: 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d  leave an error m
ccf0: 65 73 73 61 67 65 20 69 6e 20 70 50 61 72 73 65  essage in pParse
cd00: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
cd10: 33 45 78 70 72 4c 69 73 74 43 68 65 63 6b 4c 65  3ExprListCheckLe
cd20: 6e 67 74 68 28 0a 20 20 50 61 72 73 65 20 2a 70  ngth(.  Parse *p
cd30: 50 61 72 73 65 2c 0a 20 20 45 78 70 72 4c 69 73  Parse,.  ExprLis
cd40: 74 20 2a 70 45 4c 69 73 74 2c 0a 20 20 63 6f 6e  t *pEList,.  con
cd50: 73 74 20 63 68 61 72 20 2a 7a 4f 62 6a 65 63 74  st char *zObject
cd60: 0a 29 7b 0a 20 20 69 6e 74 20 6d 78 20 3d 20 70  .){.  int mx = p
cd70: 50 61 72 73 65 2d 3e 64 62 2d 3e 61 4c 69 6d 69  Parse->db->aLimi
cd80: 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43  t[SQLITE_LIMIT_C
cd90: 4f 4c 55 4d 4e 5d 3b 0a 20 20 74 65 73 74 63 61  OLUMN];.  testca
cda0: 73 65 28 20 70 45 4c 69 73 74 20 26 26 20 70 45  se( pEList && pE
cdb0: 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 6d 78 20  List->nExpr==mx 
cdc0: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  );.  testcase( p
cdd0: 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d  EList && pEList-
cde0: 3e 6e 45 78 70 72 3d 3d 6d 78 2b 31 20 29 3b 0a  >nExpr==mx+1 );.
cdf0: 20 20 69 66 28 20 70 45 4c 69 73 74 20 26 26 20    if( pEList && 
ce00: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 6d 78  pEList->nExpr>mx
ce10: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
ce20: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
ce30: 22 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e  "too many column
ce40: 73 20 69 6e 20 25 73 22 2c 20 7a 4f 62 6a 65 63  s in %s", zObjec
ce50: 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  t);.  }.}../*.**
ce60: 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72   Delete an entir
ce70: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  e expression lis
ce80: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c  t..*/.static SQL
ce90: 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69  ITE_NOINLINE voi
cea0: 64 20 65 78 70 72 4c 69 73 74 44 65 6c 65 74 65  d exprListDelete
ceb0: 4e 4e 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  NN(sqlite3 *db, 
cec0: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29  ExprList *pList)
ced0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72  {.  int i;.  str
cee0: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
cef0: 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 61 73 73 65  m *pItem;.  asse
cf00: 72 74 28 20 70 4c 69 73 74 2d 3e 61 21 3d 30 20  rt( pList->a!=0 
cf10: 7c 7c 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3d  || pList->nExpr=
cf20: 3d 30 20 29 3b 0a 20 20 66 6f 72 28 70 49 74 65  =0 );.  for(pIte
cf30: 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b  m=pList->a, i=0;
cf40: 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   i<pList->nExpr;
cf50: 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i++, pItem++){.
cf60: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
cf70: 65 6c 65 74 65 28 64 62 2c 20 70 49 74 65 6d 2d  elete(db, pItem-
cf80: 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 73 71 6c  >pExpr);.    sql
cf90: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
cfa0: 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Item->zName);.  
cfb0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
cfc0: 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e  db, pItem->zSpan
cfd0: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
cfe0: 44 62 46 72 65 65 28 64 62 2c 20 70 4c 69 73 74  DbFree(db, pList
cff0: 2d 3e 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  ->a);.  sqlite3D
d000: 62 46 72 65 65 28 64 62 2c 20 70 4c 69 73 74 29  bFree(db, pList)
d010: 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  ;.}.void sqlite3
d020: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 73  ExprListDelete(s
d030: 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72  qlite3 *db, Expr
d040: 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20  List *pList){.  
d050: 69 66 28 20 70 4c 69 73 74 20 29 20 65 78 70 72  if( pList ) expr
d060: 4c 69 73 74 44 65 6c 65 74 65 4e 4e 28 64 62 2c  ListDeleteNN(db,
d070: 20 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   pList);.}../*.*
d080: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 62 69 74  * Return the bit
d090: 77 69 73 65 2d 4f 52 20 6f 66 20 61 6c 6c 20 45  wise-OR of all E
d0a0: 78 70 72 2e 66 6c 61 67 73 20 66 69 65 6c 64 73  xpr.flags fields
d0b0: 20 69 6e 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a   in the given.**
d0c0: 20 45 78 70 72 4c 69 73 74 2e 0a 2a 2f 0a 75 33   ExprList..*/.u3
d0d0: 32 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  2 sqlite3ExprLis
d0e0: 74 46 6c 61 67 73 28 63 6f 6e 73 74 20 45 78 70  tFlags(const Exp
d0f0: 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20  rList *pList){. 
d100: 20 69 6e 74 20 69 3b 0a 20 20 75 33 32 20 6d 20   int i;.  u32 m 
d110: 3d 20 30 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  = 0;.  if( pList
d120: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
d130: 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   i<pList->nExpr;
d140: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 45 78   i++){.       Ex
d150: 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4c 69 73  pr *pExpr = pLis
d160: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  t->a[i].pExpr;. 
d170: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
d180: 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  xpr!=0 );.      
d190: 20 6d 20 7c 3d 20 70 45 78 70 72 2d 3e 66 6c 61   m |= pExpr->fla
d1a0: 67 73 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  gs;.    }.  }.  
d1b0: 72 65 74 75 72 6e 20 6d 3b 0a 7d 0a 0a 2f 2a 0a  return m;.}../*.
d1c0: 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65  ** These routine
d1d0: 73 20 61 72 65 20 57 61 6c 6b 65 72 20 63 61 6c  s are Walker cal
d1e0: 6c 62 61 63 6b 73 20 75 73 65 64 20 74 6f 20 63  lbacks used to c
d1f0: 68 65 63 6b 20 65 78 70 72 65 73 73 69 6f 6e 73  heck expressions
d200: 20 74 6f 0a 2a 2a 20 73 65 65 20 69 66 20 74 68   to.** see if th
d210: 65 79 20 61 72 65 20 22 63 6f 6e 73 74 61 6e 74  ey are "constant
d220: 22 20 66 6f 72 20 73 6f 6d 65 20 64 65 66 69 6e  " for some defin
d230: 69 74 69 6f 6e 20 6f 66 20 63 6f 6e 73 74 61 6e  ition of constan
d240: 74 2e 20 20 54 68 65 0a 2a 2a 20 57 61 6c 6b 65  t.  The.** Walke
d250: 72 2e 65 43 6f 64 65 20 76 61 6c 75 65 20 64 65  r.eCode value de
d260: 74 65 72 6d 69 6e 65 73 20 74 68 65 20 74 79 70  termines the typ
d270: 65 20 6f 66 20 22 63 6f 6e 73 74 61 6e 74 22 20  e of "constant" 
d280: 77 65 20 61 72 65 20 6c 6f 6f 6b 69 6e 67 0a 2a  we are looking.*
d290: 2a 20 66 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  * for..**.** The
d2a0: 73 65 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74  se callback rout
d2b0: 69 6e 65 73 20 61 72 65 20 75 73 65 64 20 74 6f  ines are used to
d2c0: 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 66   implement the f
d2d0: 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20  ollowing:.**.** 
d2e0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
d2f0: 73 43 6f 6e 73 74 61 6e 74 28 29 20 20 20 20 20  sConstant()     
d300: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 57 61               pWa
d310: 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 31 0a 2a  lker->eCode==1.*
d320: 2a 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  *     sqlite3Exp
d330: 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f  rIsConstantNotJo
d340: 69 6e 28 29 20 20 20 20 20 20 20 20 20 20 20 70  in()           p
d350: 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 32  Walker->eCode==2
d360: 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33 45  .**     sqlite3E
d370: 78 70 72 49 73 54 61 62 6c 65 43 6f 6e 73 74 61  xprIsTableConsta
d380: 6e 74 28 29 20 20 20 20 20 20 20 20 20 20 20 20  nt()            
d390: 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d   pWalker->eCode=
d3a0: 3d 33 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65  =3.**     sqlite
d3b0: 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f  3ExprIsConstantO
d3c0: 72 46 75 6e 63 74 69 6f 6e 28 29 20 20 20 20 20  rFunction()     
d3d0: 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64     pWalker->eCod
d3e0: 65 3d 3d 34 20 6f 72 20 35 0a 2a 2a 0a 2a 2a 20  e==4 or 5.**.** 
d3f0: 49 6e 20 61 6c 6c 20 63 61 73 65 73 2c 20 74 68  In all cases, th
d400: 65 20 63 61 6c 6c 62 61 63 6b 73 20 73 65 74 20  e callbacks set 
d410: 57 61 6c 6b 65 72 2e 65 43 6f 64 65 3d 30 20 61  Walker.eCode=0 a
d420: 6e 64 20 61 62 6f 72 74 20 69 66 20 74 68 65 20  nd abort if the 
d430: 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 73  expression.** is
d440: 20 66 6f 75 6e 64 20 74 6f 20 6e 6f 74 20 62 65   found to not be
d450: 20 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2a 0a   a constant..**.
d460: 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33 45 78  ** The sqlite3Ex
d470: 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75  prIsConstantOrFu
d480: 6e 63 74 69 6f 6e 28 29 20 69 73 20 75 73 65 64  nction() is used
d490: 20 66 6f 72 20 65 76 61 6c 75 61 74 69 6e 67 20   for evaluating 
d4a0: 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 69  expressions.** i
d4b0: 6e 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  n a CREATE TABLE
d4c0: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65   statement.  The
d4d0: 20 57 61 6c 6b 65 72 2e 65 43 6f 64 65 20 76 61   Walker.eCode va
d4e0: 6c 75 65 20 69 73 20 35 20 77 68 65 6e 20 70 61  lue is 5 when pa
d4f0: 72 73 69 6e 67 0a 2a 2a 20 61 6e 20 65 78 69 73  rsing.** an exis
d500: 74 69 6e 67 20 73 63 68 65 6d 61 20 61 6e 64 20  ting schema and 
d510: 34 20 77 68 65 6e 20 70 72 6f 63 65 73 73 69 6e  4 when processin
d520: 67 20 61 20 6e 65 77 20 73 74 61 74 65 6d 65 6e  g a new statemen
d530: 74 2e 20 20 41 20 62 6f 75 6e 64 0a 2a 2a 20 70  t.  A bound.** p
d540: 61 72 61 6d 65 74 65 72 20 72 61 69 73 65 73 20  arameter raises 
d550: 61 6e 20 65 72 72 6f 72 20 66 6f 72 20 6e 65 77  an error for new
d560: 20 73 74 61 74 65 6d 65 6e 74 73 2c 20 62 75 74   statements, but
d570: 20 69 73 20 73 69 6c 65 6e 74 6c 79 20 63 6f 6e   is silently con
d580: 76 65 72 74 65 64 0a 2a 2a 20 74 6f 20 4e 55 4c  verted.** to NUL
d590: 4c 20 66 6f 72 20 65 78 69 73 74 69 6e 67 20 73  L for existing s
d5a0: 63 68 65 6d 61 73 2e 20 20 54 68 69 73 20 61 6c  chemas.  This al
d5b0: 6c 6f 77 73 20 73 71 6c 69 74 65 5f 6d 61 73 74  lows sqlite_mast
d5c0: 65 72 20 74 61 62 6c 65 73 20 74 68 61 74 20 0a  er tables that .
d5d0: 2a 2a 20 63 6f 6e 74 61 69 6e 20 61 20 62 6f 75  ** contain a bou
d5e0: 6e 64 20 70 61 72 61 6d 65 74 65 72 20 62 65 63  nd parameter bec
d5f0: 61 75 73 65 20 74 68 65 79 20 77 65 72 65 20 67  ause they were g
d600: 65 6e 65 72 61 74 65 64 20 62 79 20 6f 6c 64 65  enerated by olde
d610: 72 20 76 65 72 73 69 6f 6e 73 0a 2a 2a 20 6f 66  r versions.** of
d620: 20 53 51 4c 69 74 65 20 74 6f 20 62 65 20 70 61   SQLite to be pa
d630: 72 73 65 64 20 62 79 20 6e 65 77 65 72 20 76 65  rsed by newer ve
d640: 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65  rsions of SQLite
d650: 20 77 69 74 68 6f 75 74 20 72 61 69 73 69 6e 67   without raising
d660: 20 61 0a 2a 2a 20 6d 61 6c 66 6f 72 6d 65 64 20   a.** malformed 
d670: 73 63 68 65 6d 61 20 65 72 72 6f 72 2e 0a 2a 2f  schema error..*/
d680: 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72  .static int expr
d690: 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 28 57  NodeIsConstant(W
d6a0: 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20  alker *pWalker, 
d6b0: 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 0a 20  Expr *pExpr){.. 
d6c0: 20 2f 2a 20 49 66 20 70 57 61 6c 6b 65 72 2d 3e   /* If pWalker->
d6d0: 65 43 6f 64 65 20 69 73 20 32 20 74 68 65 6e 20  eCode is 2 then 
d6e0: 61 6e 79 20 74 65 72 6d 20 6f 66 20 74 68 65 20  any term of the 
d6f0: 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20  expression that 
d700: 63 6f 6d 65 73 20 66 72 6f 6d 0a 20 20 2a 2a 20  comes from.  ** 
d710: 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20  the ON or USING 
d720: 63 6c 61 75 73 65 73 20 6f 66 20 61 20 6c 65 66  clauses of a lef
d730: 74 20 6a 6f 69 6e 20 64 69 73 71 75 61 6c 69 66  t join disqualif
d740: 69 65 73 20 74 68 65 20 65 78 70 72 65 73 73 69  ies the expressi
d750: 6f 6e 0a 20 20 2a 2a 20 66 72 6f 6d 20 62 65 69  on.  ** from bei
d760: 6e 67 20 63 6f 6e 73 69 64 65 72 65 64 20 63 6f  ng considered co
d770: 6e 73 74 61 6e 74 2e 20 2a 2f 0a 20 20 69 66 28  nstant. */.  if(
d780: 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d   pWalker->eCode=
d790: 3d 32 20 26 26 20 45 78 70 72 48 61 73 50 72 6f  =2 && ExprHasPro
d7a0: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
d7b0: 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20  FromJoin) ){.   
d7c0: 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20   pWalker->eCode 
d7d0: 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 0;.    return 
d7e0: 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 0a  WRC_Abort;.  }..
d7f0: 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d    switch( pExpr-
d800: 3e 6f 70 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f  >op ){.    /* Co
d810: 6e 73 69 64 65 72 20 66 75 6e 63 74 69 6f 6e 73  nsider functions
d820: 20 74 6f 20 62 65 20 63 6f 6e 73 74 61 6e 74 20   to be constant 
d830: 69 66 20 61 6c 6c 20 74 68 65 69 72 20 61 72 67  if all their arg
d840: 75 6d 65 6e 74 73 20 61 72 65 20 63 6f 6e 73 74  uments are const
d850: 61 6e 74 0a 20 20 20 20 2a 2a 20 61 6e 64 20 65  ant.    ** and e
d860: 69 74 68 65 72 20 70 57 61 6c 6b 65 72 2d 3e 65  ither pWalker->e
d870: 43 6f 64 65 3d 3d 34 20 6f 72 20 35 20 6f 72 20  Code==4 or 5 or 
d880: 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 68 61 73  the function has
d890: 20 74 68 65 0a 20 20 20 20 2a 2a 20 53 51 4c 49   the.    ** SQLI
d8a0: 54 45 5f 46 55 4e 43 5f 43 4f 4e 53 54 20 66 6c  TE_FUNC_CONST fl
d8b0: 61 67 2e 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  ag. */.    case 
d8c0: 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20  TK_FUNCTION:.   
d8d0: 20 20 20 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e     if( pWalker->
d8e0: 65 43 6f 64 65 3e 3d 34 20 7c 7c 20 45 78 70 72  eCode>=4 || Expr
d8f0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
d900: 72 2c 45 50 5f 43 6f 6e 73 74 46 75 6e 63 29 20  r,EP_ConstFunc) 
d910: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
d920: 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
d930: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
d940: 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43       pWalker->eC
d950: 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ode = 0;.       
d960: 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
d970: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 63  t;.      }.    c
d980: 61 73 65 20 54 4b 5f 49 44 3a 0a 20 20 20 20 63  ase TK_ID:.    c
d990: 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20  ase TK_COLUMN:. 
d9a0: 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46     case TK_AGG_F
d9b0: 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 63 61 73  UNCTION:.    cas
d9c0: 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a  e TK_AGG_COLUMN:
d9d0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
d9e0: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49   pExpr->op==TK_I
d9f0: 44 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  D );.      testc
da00: 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
da10: 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20  TK_COLUMN );.   
da20: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
da30: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46  pr->op==TK_AGG_F
da40: 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 20 20 20  UNCTION );.     
da50: 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
da60: 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c  ->op==TK_AGG_COL
da70: 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 69 66 28  UMN );.      if(
da80: 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d   pWalker->eCode=
da90: 3d 33 20 26 26 20 70 45 78 70 72 2d 3e 69 54 61  =3 && pExpr->iTa
daa0: 62 6c 65 3d 3d 70 57 61 6c 6b 65 72 2d 3e 75 2e  ble==pWalker->u.
dab0: 69 43 75 72 20 29 7b 0a 20 20 20 20 20 20 20 20  iCur ){.        
dac0: 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
dad0: 6e 75 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  nue;.      }else
dae0: 7b 0a 20 20 20 20 20 20 20 20 70 57 61 6c 6b 65  {.        pWalke
daf0: 72 2d 3e 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20  r->eCode = 0;.  
db00: 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
db10: 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 7d 0a  _Abort;.      }.
db20: 20 20 20 20 63 61 73 65 20 54 4b 5f 56 41 52 49      case TK_VARI
db30: 41 42 4c 45 3a 0a 20 20 20 20 20 20 69 66 28 20  ABLE:.      if( 
db40: 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d  pWalker->eCode==
db50: 35 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  5 ){.        /* 
db60: 53 69 6c 65 6e 74 6c 79 20 63 6f 6e 76 65 72 74  Silently convert
db70: 20 62 6f 75 6e 64 20 70 61 72 61 6d 65 74 65 72   bound parameter
db80: 73 20 74 68 61 74 20 61 70 70 65 61 72 20 69 6e  s that appear in
db90: 73 69 64 65 20 6f 66 20 43 52 45 41 54 45 0a 20  side of CREATE. 
dba0: 20 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d         ** statem
dbb0: 65 6e 74 73 20 69 6e 74 6f 20 61 20 4e 55 4c 4c  ents into a NULL
dbc0: 20 77 68 65 6e 20 70 61 72 73 69 6e 67 20 74 68   when parsing th
dbd0: 65 20 43 52 45 41 54 45 20 73 74 61 74 65 6d 65  e CREATE stateme
dbe0: 6e 74 20 74 65 78 74 20 6f 75 74 0a 20 20 20 20  nt text out.    
dbf0: 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 71      ** of the sq
dc00: 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
dc10: 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 45 78  e */.        pEx
dc20: 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c  pr->op = TK_NULL
dc30: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
dc40: 28 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65  ( pWalker->eCode
dc50: 3d 3d 34 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ==4 ){.        /
dc60: 2a 20 41 20 62 6f 75 6e 64 20 70 61 72 61 6d 65  * A bound parame
dc70: 74 65 72 20 69 6e 20 61 20 43 52 45 41 54 45 20  ter in a CREATE 
dc80: 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 6f  statement that o
dc90: 72 69 67 69 6e 61 74 65 73 20 66 72 6f 6d 0a 20  riginates from. 
dca0: 20 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65         ** sqlite
dcb0: 33 5f 70 72 65 70 61 72 65 28 29 20 63 61 75 73  3_prepare() caus
dcc0: 65 73 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 20  es an error */. 
dcd0: 20 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e         pWalker->
dce0: 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 20  eCode = 0;.     
dcf0: 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62     return WRC_Ab
dd00: 6f 72 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ort;.      }.   
dd10: 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75     /* Fall throu
dd20: 67 68 20 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c  gh */.    defaul
dd30: 74 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  t:.      testcas
dd40: 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
dd50: 5f 53 45 4c 45 43 54 20 29 3b 20 2f 2a 20 73 65  _SELECT ); /* se
dd60: 6c 65 63 74 4e 6f 64 65 49 73 43 6f 6e 73 74 61  lectNodeIsConsta
dd70: 6e 74 20 77 69 6c 6c 20 64 69 73 61 6c 6c 6f 77  nt will disallow
dd80: 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61   */.      testca
dd90: 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
dda0: 4b 5f 45 58 49 53 54 53 20 29 3b 20 2f 2a 20 73  K_EXISTS ); /* s
ddb0: 65 6c 65 63 74 4e 6f 64 65 49 73 43 6f 6e 73 74  electNodeIsConst
ddc0: 61 6e 74 20 77 69 6c 6c 20 64 69 73 61 6c 6c 6f  ant will disallo
ddd0: 77 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72  w */.      retur
dde0: 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
ddf0: 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74    }.}.static int
de00: 20 73 65 6c 65 63 74 4e 6f 64 65 49 73 43 6f 6e   selectNodeIsCon
de10: 73 74 61 6e 74 28 57 61 6c 6b 65 72 20 2a 70 57  stant(Walker *pW
de20: 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 4e  alker, Select *N
de30: 6f 74 55 73 65 64 29 7b 0a 20 20 55 4e 55 53 45  otUsed){.  UNUSE
de40: 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
de50: 73 65 64 29 3b 0a 20 20 70 57 61 6c 6b 65 72 2d  sed);.  pWalker-
de60: 3e 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20 72 65  >eCode = 0;.  re
de70: 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
de80: 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70  }.static int exp
de90: 72 49 73 43 6f 6e 73 74 28 45 78 70 72 20 2a 70  rIsConst(Expr *p
dea0: 2c 20 69 6e 74 20 69 6e 69 74 46 6c 61 67 2c 20  , int initFlag, 
deb0: 69 6e 74 20 69 43 75 72 29 7b 0a 20 20 57 61 6c  int iCur){.  Wal
dec0: 6b 65 72 20 77 3b 0a 20 20 6d 65 6d 73 65 74 28  ker w;.  memset(
ded0: 26 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 29  &w, 0, sizeof(w)
dee0: 29 3b 0a 20 20 77 2e 65 43 6f 64 65 20 3d 20 69  );.  w.eCode = i
def0: 6e 69 74 46 6c 61 67 3b 0a 20 20 77 2e 78 45 78  nitFlag;.  w.xEx
df00: 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70  prCallback = exp
df10: 72 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 3b  rNodeIsConstant;
df20: 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c  .  w.xSelectCall
df30: 62 61 63 6b 20 3d 20 73 65 6c 65 63 74 4e 6f 64  back = selectNod
df40: 65 49 73 43 6f 6e 73 74 61 6e 74 3b 0a 20 20 77  eIsConstant;.  w
df50: 2e 75 2e 69 43 75 72 20 3d 20 69 43 75 72 3b 0a  .u.iCur = iCur;.
df60: 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70    sqlite3WalkExp
df70: 72 28 26 77 2c 20 70 29 3b 0a 20 20 72 65 74 75  r(&w, p);.  retu
df80: 72 6e 20 77 2e 65 43 6f 64 65 3b 0a 7d 0a 0a 2f  rn w.eCode;.}../
df90: 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70  *.** Walk an exp
dfa0: 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52  ression tree.  R
dfb0: 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69  eturn non-zero i
dfc0: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
dfd0: 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20   is constant.** 
dfe0: 61 6e 64 20 30 20 69 66 20 69 74 20 69 6e 76 6f  and 0 if it invo
dff0: 6c 76 65 73 20 76 61 72 69 61 62 6c 65 73 20 6f  lves variables o
e000: 72 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 73  r function calls
e010: 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20  ..**.** For the 
e020: 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68 69 73  purposes of this
e030: 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20 64 6f 75   function, a dou
e040: 62 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e  ble-quoted strin
e050: 67 20 28 65 78 3a 20 22 61 62 63 22 29 0a 2a 2a  g (ex: "abc").**
e060: 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61   is considered a
e070: 20 76 61 72 69 61 62 6c 65 20 62 75 74 20 61 20   variable but a 
e080: 73 69 6e 67 6c 65 2d 71 75 6f 74 65 64 20 73 74  single-quoted st
e090: 72 69 6e 67 20 28 65 78 3a 20 27 61 62 63 27 29  ring (ex: 'abc')
e0a0: 20 69 73 0a 2a 2a 20 61 20 63 6f 6e 73 74 61 6e   is.** a constan
e0b0: 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
e0c0: 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28  3ExprIsConstant(
e0d0: 45 78 70 72 20 2a 70 29 7b 0a 20 20 72 65 74 75  Expr *p){.  retu
e0e0: 72 6e 20 65 78 70 72 49 73 43 6f 6e 73 74 28 70  rn exprIsConst(p
e0f0: 2c 20 31 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  , 1, 0);.}../*.*
e100: 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73  * Walk an expres
e110: 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75  sion tree.  Retu
e120: 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74  rn non-zero if t
e130: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
e140: 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 74 68 61   constant.** tha
e150: 74 20 64 6f 65 73 20 6e 6f 20 6f 72 69 67 69 6e  t does no origin
e160: 61 74 65 20 66 72 6f 6d 20 74 68 65 20 4f 4e 20  ate from the ON 
e170: 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73  or USING clauses
e180: 20 6f 66 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 20 52   of a join..** R
e190: 65 74 75 72 6e 20 30 20 69 66 20 69 74 20 69 6e  eturn 0 if it in
e1a0: 76 6f 6c 76 65 73 20 76 61 72 69 61 62 6c 65 73  volves variables
e1b0: 20 6f 72 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c   or function cal
e1c0: 6c 73 20 6f 72 20 74 65 72 6d 73 20 66 72 6f 6d  ls or terms from
e1d0: 0a 2a 2a 20 61 6e 20 4f 4e 20 6f 72 20 55 53 49  .** an ON or USI
e1e0: 4e 47 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 69 6e  NG clause..*/.in
e1f0: 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43  t sqlite3ExprIsC
e200: 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 45  onstantNotJoin(E
e210: 78 70 72 20 2a 70 29 7b 0a 20 20 72 65 74 75 72  xpr *p){.  retur
e220: 6e 20 65 78 70 72 49 73 43 6f 6e 73 74 28 70 2c  n exprIsConst(p,
e230: 20 32 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   2, 0);.}../*.**
e240: 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73   Walk an express
e250: 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72  ion tree.  Retur
e260: 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68  n non-zero if th
e270: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
e280: 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 66 6f 72 20  constant.** for 
e290: 61 6e 79 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f  any single row o
e2a0: 66 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68  f the table with
e2b0: 20 63 75 72 73 6f 72 20 69 43 75 72 2e 20 20 49   cursor iCur.  I
e2c0: 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74  n other words, t
e2d0: 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  he.** expression
e2e0: 20 6d 75 73 74 20 6e 6f 74 20 72 65 66 65 72 20   must not refer 
e2f0: 74 6f 20 61 6e 79 20 6e 6f 6e 2d 64 65 74 65 72  to any non-deter
e300: 6d 69 6e 69 73 74 69 63 20 66 75 6e 63 74 69 6f  ministic functio
e310: 6e 20 6e 6f 72 20 61 6e 79 0a 2a 2a 20 74 61 62  n nor any.** tab
e320: 6c 65 20 6f 74 68 65 72 20 74 68 61 6e 20 69 43  le other than iC
e330: 75 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ur..*/.int sqlit
e340: 65 33 45 78 70 72 49 73 54 61 62 6c 65 43 6f 6e  e3ExprIsTableCon
e350: 73 74 61 6e 74 28 45 78 70 72 20 2a 70 2c 20 69  stant(Expr *p, i
e360: 6e 74 20 69 43 75 72 29 7b 0a 20 20 72 65 74 75  nt iCur){.  retu
e370: 72 6e 20 65 78 70 72 49 73 43 6f 6e 73 74 28 70  rn exprIsConst(p
e380: 2c 20 33 2c 20 69 43 75 72 29 3b 0a 7d 0a 0a 2f  , 3, iCur);.}../
e390: 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70  *.** Walk an exp
e3a0: 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52  ression tree.  R
e3b0: 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69  eturn non-zero i
e3c0: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
e3d0: 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20   is constant.** 
e3e0: 6f 72 20 61 20 66 75 6e 63 74 69 6f 6e 20 63 61  or a function ca
e3f0: 6c 6c 20 77 69 74 68 20 63 6f 6e 73 74 61 6e 74  ll with constant
e400: 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 52 65 74   arguments.  Ret
e410: 75 72 6e 20 61 6e 64 20 30 20 69 66 20 74 68 65  urn and 0 if the
e420: 72 65 0a 2a 2a 20 61 72 65 20 61 6e 79 20 76 61  re.** are any va
e430: 72 69 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 46  riables..**.** F
e440: 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65 73 20  or the purposes 
e450: 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
e460: 2c 20 61 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65  , a double-quote
e470: 64 20 73 74 72 69 6e 67 20 28 65 78 3a 20 22 61  d string (ex: "a
e480: 62 63 22 29 0a 2a 2a 20 69 73 20 63 6f 6e 73 69  bc").** is consi
e490: 64 65 72 65 64 20 61 20 76 61 72 69 61 62 6c 65  dered a variable
e4a0: 20 62 75 74 20 61 20 73 69 6e 67 6c 65 2d 71 75   but a single-qu
e4b0: 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65 78 3a  oted string (ex:
e4c0: 20 27 61 62 63 27 29 20 69 73 0a 2a 2a 20 61 20   'abc') is.** a 
e4d0: 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a 69 6e 74  constant..*/.int
e4e0: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
e4f0: 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f 6e  nstantOrFunction
e500: 28 45 78 70 72 20 2a 70 2c 20 75 38 20 69 73 49  (Expr *p, u8 isI
e510: 6e 69 74 29 7b 0a 20 20 61 73 73 65 72 74 28 20  nit){.  assert( 
e520: 69 73 49 6e 69 74 3d 3d 30 20 7c 7c 20 69 73 49  isInit==0 || isI
e530: 6e 69 74 3d 3d 31 20 29 3b 0a 20 20 72 65 74 75  nit==1 );.  retu
e540: 72 6e 20 65 78 70 72 49 73 43 6f 6e 73 74 28 70  rn exprIsConst(p
e550: 2c 20 34 2b 69 73 49 6e 69 74 2c 20 30 29 3b 0a  , 4+isInit, 0);.
e560: 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
e570: 5f 45 4e 41 42 4c 45 5f 43 55 52 53 4f 52 5f 48  _ENABLE_CURSOR_H
e580: 49 4e 54 53 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20  INTS./*.** Walk 
e590: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  an expression tr
e5a0: 65 65 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66  ee.  Return 1 if
e5b0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
e5c0: 63 6f 6e 74 61 69 6e 73 20 61 0a 2a 2a 20 73 75  contains a.** su
e5d0: 62 71 75 65 72 79 20 6f 66 20 73 6f 6d 65 20 6b  bquery of some k
e5e0: 69 6e 64 2e 20 20 52 65 74 75 72 6e 20 30 20 69  ind.  Return 0 i
e5f0: 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 73  f there are no s
e600: 75 62 71 75 65 72 69 65 73 2e 0a 2a 2f 0a 69 6e  ubqueries..*/.in
e610: 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6e  t sqlite3ExprCon
e620: 74 61 69 6e 73 53 75 62 71 75 65 72 79 28 45 78  tainsSubquery(Ex
e630: 70 72 20 2a 70 29 7b 0a 20 20 57 61 6c 6b 65 72  pr *p){.  Walker
e640: 20 77 3b 0a 20 20 6d 65 6d 73 65 74 28 26 77 2c   w;.  memset(&w,
e650: 20 30 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a   0, sizeof(w));.
e660: 20 20 77 2e 65 43 6f 64 65 20 3d 20 31 3b 0a 20    w.eCode = 1;. 
e670: 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b   w.xExprCallback
e680: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 57 61   = sqlite3ExprWa
e690: 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 78 53 65 6c  lkNoop;.  w.xSel
e6a0: 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 73 65  ectCallback = se
e6b0: 6c 65 63 74 4e 6f 64 65 49 73 43 6f 6e 73 74 61  lectNodeIsConsta
e6c0: 6e 74 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c  nt;.  sqlite3Wal
e6d0: 6b 45 78 70 72 28 26 77 2c 20 70 29 3b 0a 20 20  kExpr(&w, p);.  
e6e0: 72 65 74 75 72 6e 20 77 2e 65 43 6f 64 65 3d 3d  return w.eCode==
e6f0: 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  0;.}.#endif../*.
e700: 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73  ** If the expres
e710: 73 69 6f 6e 20 70 20 63 6f 64 65 73 20 61 20 63  sion p codes a c
e720: 6f 6e 73 74 61 6e 74 20 69 6e 74 65 67 65 72 20  onstant integer 
e730: 74 68 61 74 20 69 73 20 73 6d 61 6c 6c 20 65 6e  that is small en
e740: 6f 75 67 68 0a 2a 2a 20 74 6f 20 66 69 74 20 69  ough.** to fit i
e750: 6e 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67  n a 32-bit integ
e760: 65 72 2c 20 72 65 74 75 72 6e 20 31 20 61 6e 64  er, return 1 and
e770: 20 70 75 74 20 74 68 65 20 76 61 6c 75 65 20 6f   put the value o
e780: 66 20 74 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a  f the integer.**
e790: 20 69 6e 20 2a 70 56 61 6c 75 65 2e 20 20 49 66   in *pValue.  If
e7a0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
e7b0: 69 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65  is not an intege
e7c0: 72 20 6f 72 20 69 66 20 69 74 20 69 73 20 74 6f  r or if it is to
e7d0: 6f 20 62 69 67 0a 2a 2a 20 74 6f 20 66 69 74 20  o big.** to fit 
e7e0: 69 6e 20 61 20 73 69 67 6e 65 64 20 33 32 2d 62  in a signed 32-b
e7f0: 69 74 20 69 6e 74 65 67 65 72 2c 20 72 65 74 75  it integer, retu
e800: 72 6e 20 30 20 61 6e 64 20 6c 65 61 76 65 20 2a  rn 0 and leave *
e810: 70 56 61 6c 75 65 20 75 6e 63 68 61 6e 67 65 64  pValue unchanged
e820: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
e830: 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 45 78  ExprIsInteger(Ex
e840: 70 72 20 2a 70 2c 20 69 6e 74 20 2a 70 56 61 6c  pr *p, int *pVal
e850: 75 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ue){.  int rc = 
e860: 30 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65  0;..  /* If an e
e870: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 6e 20  xpression is an 
e880: 69 6e 74 65 67 65 72 20 6c 69 74 65 72 61 6c 20  integer literal 
e890: 74 68 61 74 20 66 69 74 73 20 69 6e 20 61 20 73  that fits in a s
e8a0: 69 67 6e 65 64 20 33 32 2d 62 69 74 0a 20 20 2a  igned 32-bit.  *
e8b0: 2a 20 69 6e 74 65 67 65 72 2c 20 74 68 65 6e 20  * integer, then 
e8c0: 74 68 65 20 45 50 5f 49 6e 74 56 61 6c 75 65 20  the EP_IntValue 
e8d0: 66 6c 61 67 20 77 69 6c 6c 20 68 61 76 65 20 61  flag will have a
e8e0: 6c 72 65 61 64 79 20 62 65 65 6e 20 73 65 74 20  lready been set 
e8f0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  */.  assert( p->
e900: 6f 70 21 3d 54 4b 5f 49 4e 54 45 47 45 52 20 7c  op!=TK_INTEGER |
e910: 7c 20 28 70 2d 3e 66 6c 61 67 73 20 26 20 45 50  | (p->flags & EP
e920: 5f 49 6e 74 56 61 6c 75 65 29 21 3d 30 0a 20 20  _IntValue)!=0.  
e930: 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69           || sqli
e940: 74 65 33 47 65 74 49 6e 74 33 32 28 70 2d 3e 75  te3GetInt32(p->u
e950: 2e 7a 54 6f 6b 65 6e 2c 20 26 72 63 29 3d 3d 30  .zToken, &rc)==0
e960: 20 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 66 6c   );..  if( p->fl
e970: 61 67 73 20 26 20 45 50 5f 49 6e 74 56 61 6c 75  ags & EP_IntValu
e980: 65 20 29 7b 0a 20 20 20 20 2a 70 56 61 6c 75 65  e ){.    *pValue
e990: 20 3d 20 70 2d 3e 75 2e 69 56 61 6c 75 65 3b 0a   = p->u.iValue;.
e9a0: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
e9b0: 7d 0a 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f  }.  switch( p->o
e9c0: 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
e9d0: 5f 55 50 4c 55 53 3a 20 7b 0a 20 20 20 20 20 20  _UPLUS: {.      
e9e0: 72 63 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  rc = sqlite3Expr
e9f0: 49 73 49 6e 74 65 67 65 72 28 70 2d 3e 70 4c 65  IsInteger(p->pLe
ea00: 66 74 2c 20 70 56 61 6c 75 65 29 3b 0a 20 20 20  ft, pValue);.   
ea10: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
ea20: 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e      case TK_UMIN
ea30: 55 53 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  US: {.      int 
ea40: 76 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  v;.      if( sql
ea50: 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65  ite3ExprIsIntege
ea60: 72 28 70 2d 3e 70 4c 65 66 74 2c 20 26 76 29 20  r(p->pLeft, &v) 
ea70: 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
ea80: 74 28 20 76 21 3d 28 2d 32 31 34 37 34 38 33 36  t( v!=(-21474836
ea90: 34 37 2d 31 29 20 29 3b 0a 20 20 20 20 20 20 20  47-1) );.       
eaa0: 20 2a 70 56 61 6c 75 65 20 3d 20 2d 76 3b 0a 20   *pValue = -v;. 
eab0: 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20         rc = 1;. 
eac0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
ead0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65  ak;.    }.    de
eae0: 66 61 75 6c 74 3a 20 62 72 65 61 6b 3b 0a 20 20  fault: break;.  
eaf0: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
eb00: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 46  ../*.** Return F
eb10: 41 4c 53 45 20 69 66 20 74 68 65 72 65 20 69 73  ALSE if there is
eb20: 20 6e 6f 20 63 68 61 6e 63 65 20 74 68 61 74 20   no chance that 
eb30: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 63  the expression c
eb40: 61 6e 20 62 65 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  an be NULL..**.*
eb50: 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73  * If the express
eb60: 69 6f 6e 20 6d 69 67 68 74 20 62 65 20 4e 55 4c  ion might be NUL
eb70: 4c 20 6f 72 20 69 66 20 74 68 65 20 65 78 70 72  L or if the expr
eb80: 65 73 73 69 6f 6e 20 69 73 20 74 6f 6f 20 63 6f  ession is too co
eb90: 6d 70 6c 65 78 0a 2a 2a 20 74 6f 20 74 65 6c 6c  mplex.** to tell
eba0: 20 72 65 74 75 72 6e 20 54 52 55 45 2e 20 20 0a   return TRUE.  .
ebb0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
ebc0: 6e 65 20 69 73 20 75 73 65 64 20 61 73 20 61 6e  ne is used as an
ebd0: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 74   optimization, t
ebe0: 6f 20 73 6b 69 70 20 4f 50 5f 49 73 4e 75 6c 6c  o skip OP_IsNull
ebf0: 20 6f 70 63 6f 64 65 73 0a 2a 2a 20 77 68 65 6e   opcodes.** when
ec00: 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 61 20   we know that a 
ec10: 76 61 6c 75 65 20 63 61 6e 6e 6f 74 20 62 65 20  value cannot be 
ec20: 4e 55 4c 4c 2e 20 20 48 65 6e 63 65 2c 20 61 20  NULL.  Hence, a 
ec30: 66 61 6c 73 65 20 70 6f 73 69 74 69 76 65 0a 2a  false positive.*
ec40: 2a 20 28 72 65 74 75 72 6e 69 6e 67 20 54 52 55  * (returning TRU
ec50: 45 20 77 68 65 6e 20 69 6e 20 66 61 63 74 20 74  E when in fact t
ec60: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 63 61  he expression ca
ec70: 6e 20 6e 65 76 65 72 20 62 65 20 4e 55 4c 4c 29  n never be NULL)
ec80: 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20 61 20 73   might.** be a s
ec90: 6d 61 6c 6c 20 70 65 72 66 6f 72 6d 61 6e 63 65  mall performance
eca0: 20 68 69 74 20 62 75 74 20 69 73 20 6f 74 68 65   hit but is othe
ecb0: 72 77 69 73 65 20 68 61 72 6d 6c 65 73 73 2e 20  rwise harmless. 
ecc0: 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 0a 2a 2a   On the other.**
ecd0: 20 68 61 6e 64 2c 20 61 20 66 61 6c 73 65 20 6e   hand, a false n
ece0: 65 67 61 74 69 76 65 20 28 72 65 74 75 72 6e 69  egative (returni
ecf0: 6e 67 20 46 41 4c 53 45 20 77 68 65 6e 20 74 68  ng FALSE when th
ed00: 65 20 72 65 73 75 6c 74 20 63 6f 75 6c 64 20 62  e result could b
ed10: 65 20 4e 55 4c 4c 29 0a 2a 2a 20 77 69 6c 6c 20  e NULL).** will 
ed20: 6c 69 6b 65 6c 79 20 72 65 73 75 6c 74 20 69 6e  likely result in
ed30: 20 61 6e 20 69 6e 63 6f 72 72 65 63 74 20 61 6e   an incorrect an
ed40: 73 77 65 72 2e 20 20 53 6f 20 77 68 65 6e 20 69  swer.  So when i
ed50: 6e 20 64 6f 75 62 74 2c 20 72 65 74 75 72 6e 0a  n doubt, return.
ed60: 2a 2a 20 54 52 55 45 2e 0a 2a 2f 0a 69 6e 74 20  ** TRUE..*/.int 
ed70: 73 71 6c 69 74 65 33 45 78 70 72 43 61 6e 42 65  sqlite3ExprCanBe
ed80: 4e 75 6c 6c 28 63 6f 6e 73 74 20 45 78 70 72 20  Null(const Expr 
ed90: 2a 70 29 7b 0a 20 20 75 38 20 6f 70 3b 0a 20 20  *p){.  u8 op;.  
eda0: 77 68 69 6c 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b  while( p->op==TK
edb0: 5f 55 50 4c 55 53 20 7c 7c 20 70 2d 3e 6f 70 3d  _UPLUS || p->op=
edc0: 3d 54 4b 5f 55 4d 49 4e 55 53 20 29 7b 20 70 20  =TK_UMINUS ){ p 
edd0: 3d 20 70 2d 3e 70 4c 65 66 74 3b 20 7d 0a 20 20  = p->pLeft; }.  
ede0: 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 69 66  op = p->op;.  if
edf0: 28 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45  ( op==TK_REGISTE
ee00: 52 20 29 20 6f 70 20 3d 20 70 2d 3e 6f 70 32 3b  R ) op = p->op2;
ee10: 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b  .  switch( op ){
ee20: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54  .    case TK_INT
ee30: 45 47 45 52 3a 0a 20 20 20 20 63 61 73 65 20 54  EGER:.    case T
ee40: 4b 5f 53 54 52 49 4e 47 3a 0a 20 20 20 20 63 61  K_STRING:.    ca
ee50: 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 0a 20 20 20  se TK_FLOAT:.   
ee60: 20 63 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 0a 20   case TK_BLOB:. 
ee70: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
ee80: 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d     case TK_COLUM
ee90: 4e 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  N:.      assert(
eea0: 20 70 2d 3e 70 54 61 62 21 3d 30 20 29 3b 0a 20   p->pTab!=0 );. 
eeb0: 20 20 20 20 20 72 65 74 75 72 6e 20 45 78 70 72       return Expr
eec0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
eed0: 50 5f 43 61 6e 42 65 4e 75 6c 6c 29 20 7c 7c 0a  P_CanBeNull) ||.
eee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 70 2d               (p-
eef0: 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20 26 26 20 70  >iColumn>=0 && p
ef00: 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 2d 3e  ->pTab->aCol[p->
ef10: 69 43 6f 6c 75 6d 6e 5d 2e 6e 6f 74 4e 75 6c 6c  iColumn].notNull
ef20: 3d 3d 30 29 3b 0a 20 20 20 20 64 65 66 61 75 6c  ==0);.    defaul
ef30: 74 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  t:.      return 
ef40: 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  1;.  }.}../*.** 
ef50: 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
ef60: 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73 73  he given express
ef70: 69 6f 6e 20 69 73 20 61 20 63 6f 6e 73 74 61 6e  ion is a constan
ef80: 74 20 77 68 69 63 68 20 77 6f 75 6c 64 20 62 65  t which would be
ef90: 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 20 62 79  .** unchanged by
efa0: 20 4f 50 5f 41 66 66 69 6e 69 74 79 20 77 69 74   OP_Affinity wit
efb0: 68 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 67  h the affinity g
efc0: 69 76 65 6e 20 69 6e 20 74 68 65 20 73 65 63 6f  iven in the seco
efd0: 6e 64 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a  nd.** argument..
efe0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
eff0: 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20 64 65  ne is used to de
f000: 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20 4f  termine if the O
f010: 50 5f 41 66 66 69 6e 69 74 79 20 6f 70 65 72 61  P_Affinity opera
f020: 74 69 6f 6e 0a 2a 2a 20 63 61 6e 20 62 65 20 6f  tion.** can be o
f030: 6d 69 74 74 65 64 2e 20 20 57 68 65 6e 20 69 6e  mitted.  When in
f040: 20 64 6f 75 62 74 20 72 65 74 75 72 6e 20 46 41   doubt return FA
f050: 4c 53 45 2e 20 20 41 20 66 61 6c 73 65 20 6e 65  LSE.  A false ne
f060: 67 61 74 69 76 65 0a 2a 2a 20 69 73 20 68 61 72  gative.** is har
f070: 6d 6c 65 73 73 2e 20 20 41 20 66 61 6c 73 65 20  mless.  A false 
f080: 70 6f 73 69 74 69 76 65 2c 20 68 6f 77 65 76 65  positive, howeve
f090: 72 2c 20 63 61 6e 20 72 65 73 75 6c 74 20 69 6e  r, can result in
f0a0: 20 74 68 65 20 77 72 6f 6e 67 0a 2a 2a 20 61 6e   the wrong.** an
f0b0: 73 77 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  swer..*/.int sql
f0c0: 69 74 65 33 45 78 70 72 4e 65 65 64 73 4e 6f 41  ite3ExprNeedsNoA
f0d0: 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 63 6f  ffinityChange(co
f0e0: 6e 73 74 20 45 78 70 72 20 2a 70 2c 20 63 68 61  nst Expr *p, cha
f0f0: 72 20 61 66 66 29 7b 0a 20 20 75 38 20 6f 70 3b  r aff){.  u8 op;
f100: 0a 20 20 69 66 28 20 61 66 66 3d 3d 53 51 4c 49  .  if( aff==SQLI
f110: 54 45 5f 41 46 46 5f 42 4c 4f 42 20 29 20 72 65  TE_AFF_BLOB ) re
f120: 74 75 72 6e 20 31 3b 0a 20 20 77 68 69 6c 65 28  turn 1;.  while(
f130: 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 50 4c 55 53   p->op==TK_UPLUS
f140: 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4d   || p->op==TK_UM
f150: 49 4e 55 53 20 29 7b 20 70 20 3d 20 70 2d 3e 70  INUS ){ p = p->p
f160: 4c 65 66 74 3b 20 7d 0a 20 20 6f 70 20 3d 20 70  Left; }.  op = p
f170: 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d  ->op;.  if( op==
f180: 54 4b 5f 52 45 47 49 53 54 45 52 20 29 20 6f 70  TK_REGISTER ) op
f190: 20 3d 20 70 2d 3e 6f 70 32 3b 0a 20 20 73 77 69   = p->op2;.  swi
f1a0: 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63  tch( op ){.    c
f1b0: 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 20  ase TK_INTEGER: 
f1c0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 61  {.      return a
f1d0: 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 49  ff==SQLITE_AFF_I
f1e0: 4e 54 45 47 45 52 20 7c 7c 20 61 66 66 3d 3d 53  NTEGER || aff==S
f1f0: 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
f200: 43 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  C;.    }.    cas
f210: 65 20 54 4b 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20  e TK_FLOAT: {.  
f220: 20 20 20 20 72 65 74 75 72 6e 20 61 66 66 3d 3d      return aff==
f230: 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 20  SQLITE_AFF_REAL 
f240: 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41  || aff==SQLITE_A
f250: 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 20 20  FF_NUMERIC;.    
f260: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54  }.    case TK_ST
f270: 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20 72 65  RING: {.      re
f280: 74 75 72 6e 20 61 66 66 3d 3d 53 51 4c 49 54 45  turn aff==SQLITE
f290: 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20 20 20 7d  _AFF_TEXT;.    }
f2a0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 4c 4f  .    case TK_BLO
f2b0: 42 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72  B: {.      retur
f2c0: 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  n 1;.    }.    c
f2d0: 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b  ase TK_COLUMN: {
f2e0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
f2f0: 2d 3e 69 54 61 62 6c 65 3e 3d 30 20 29 3b 20 20  ->iTable>=0 );  
f300: 2f 2a 20 70 20 63 61 6e 6e 6f 74 20 62 65 20 70  /* p cannot be p
f310: 61 72 74 20 6f 66 20 61 20 43 48 45 43 4b 20 63  art of a CHECK c
f320: 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 20  onstraint */.   
f330: 20 20 20 72 65 74 75 72 6e 20 70 2d 3e 69 43 6f     return p->iCo
f340: 6c 75 6d 6e 3c 30 0a 20 20 20 20 20 20 20 20 20  lumn<0.         
f350: 20 26 26 20 28 61 66 66 3d 3d 53 51 4c 49 54 45   && (aff==SQLITE
f360: 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 7c 7c 20  _AFF_INTEGER || 
f370: 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
f380: 4e 55 4d 45 52 49 43 29 3b 0a 20 20 20 20 7d 0a  NUMERIC);.    }.
f390: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
f3a0: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
f3b0: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
f3c0: 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
f3d0: 20 74 68 65 20 67 69 76 65 6e 20 73 74 72 69 6e   the given strin
f3e0: 67 20 69 73 20 61 20 72 6f 77 2d 69 64 20 63 6f  g is a row-id co
f3f0: 6c 75 6d 6e 20 6e 61 6d 65 2e 0a 2a 2f 0a 69 6e  lumn name..*/.in
f400: 74 20 73 71 6c 69 74 65 33 49 73 52 6f 77 69 64  t sqlite3IsRowid
f410: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b  (const char *z){
f420: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74  .  if( sqlite3St
f430: 72 49 43 6d 70 28 7a 2c 20 22 5f 52 4f 57 49 44  rICmp(z, "_ROWID
f440: 5f 22 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  _")==0 ) return 
f450: 31 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  1;.  if( sqlite3
f460: 53 74 72 49 43 6d 70 28 7a 2c 20 22 52 4f 57 49  StrICmp(z, "ROWI
f470: 44 22 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  D")==0 ) return 
f480: 31 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  1;.  if( sqlite3
f490: 53 74 72 49 43 6d 70 28 7a 2c 20 22 4f 49 44 22  StrICmp(z, "OID"
f4a0: 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b  )==0 ) return 1;
f4b0: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
f4c0: 2f 2a 0a 2a 2a 20 70 58 20 69 73 20 74 68 65 20  /*.** pX is the 
f4d0: 52 48 53 20 6f 66 20 61 6e 20 49 4e 20 6f 70 65  RHS of an IN ope
f4e0: 72 61 74 6f 72 2e 20 20 49 66 20 70 58 20 69 73  rator.  If pX is
f4f0: 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
f500: 65 6e 74 20 0a 2a 2a 20 74 68 61 74 20 63 61 6e  ent .** that can
f510: 20 62 65 20 73 69 6d 70 6c 69 66 69 65 64 20 74   be simplified t
f520: 6f 20 61 20 64 69 72 65 63 74 20 74 61 62 6c 65  o a direct table
f530: 20 61 63 63 65 73 73 2c 20 74 68 65 6e 20 72 65   access, then re
f540: 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74 65  turn.** a pointe
f550: 72 20 74 6f 20 74 68 65 20 53 45 4c 45 43 54 20  r to the SELECT 
f560: 73 74 61 74 65 6d 65 6e 74 2e 20 20 49 66 20 70  statement.  If p
f570: 58 20 69 73 20 6e 6f 74 20 61 20 53 45 4c 45 43  X is not a SELEC
f580: 54 20 73 74 61 74 65 6d 65 6e 74 2c 0a 2a 2a 20  T statement,.** 
f590: 6f 72 20 69 66 20 74 68 65 20 53 45 4c 45 43 54  or if the SELECT
f5a0: 20 73 74 61 74 65 6d 65 6e 74 20 6e 65 65 64 73   statement needs
f5b0: 20 74 6f 20 62 65 20 6d 61 6e 69 66 65 73 74 65   to be manifeste
f5c0: 64 20 69 6e 74 6f 20 61 20 74 72 61 6e 73 69 65  d into a transie
f5d0: 6e 74 0a 2a 2a 20 74 61 62 6c 65 2c 20 74 68 65  nt.** table, the
f5e0: 6e 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a  n return NULL..*
f5f0: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
f600: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 73  _OMIT_SUBQUERY.s
f610: 74 61 74 69 63 20 53 65 6c 65 63 74 20 2a 69 73  tatic Select *is
f620: 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70  CandidateForInOp
f630: 74 28 45 78 70 72 20 2a 70 58 29 7b 0a 20 20 53  t(Expr *pX){.  S
f640: 65 6c 65 63 74 20 2a 70 3b 0a 20 20 53 72 63 4c  elect *p;.  SrcL
f650: 69 73 74 20 2a 70 53 72 63 3b 0a 20 20 45 78 70  ist *pSrc;.  Exp
f660: 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20  rList *pEList;. 
f670: 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
f680: 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 21 45 78  int i;.  if( !Ex
f690: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 58  prHasProperty(pX
f6a0: 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
f6b0: 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20  ) return 0;  /* 
f6c0: 4e 6f 74 20 61 20 73 75 62 71 75 65 72 79 20 2a  Not a subquery *
f6d0: 2f 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50  /.  if( ExprHasP
f6e0: 72 6f 70 65 72 74 79 28 70 58 2c 20 45 50 5f 56  roperty(pX, EP_V
f6f0: 61 72 53 65 6c 65 63 74 29 20 20 29 20 72 65 74  arSelect)  ) ret
f700: 75 72 6e 20 30 3b 20 20 2f 2a 20 43 6f 72 72 65  urn 0;  /* Corre
f710: 6c 61 74 65 64 20 73 75 62 71 20 2a 2f 0a 20 20  lated subq */.  
f720: 70 20 3d 20 70 58 2d 3e 78 2e 70 53 65 6c 65 63  p = pX->x.pSelec
f730: 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69  t;.  if( p->pPri
f740: 6f 72 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  or ) return 0;  
f750: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
f760: 6f 74 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45  ot a compound SE
f770: 4c 45 43 54 20 2a 2f 0a 20 20 69 66 28 20 70 2d  LECT */.  if( p-
f780: 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f  >selFlags & (SF_
f790: 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72  Distinct|SF_Aggr
f7a0: 65 67 61 74 65 29 20 29 7b 0a 20 20 20 20 74 65  egate) ){.    te
f7b0: 73 74 63 61 73 65 28 20 28 70 2d 3e 73 65 6c 46  stcase( (p->selF
f7c0: 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74 69  lags & (SF_Disti
f7d0: 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65  nct|SF_Aggregate
f7e0: 29 29 3d 3d 53 46 5f 44 69 73 74 69 6e 63 74 20  ))==SF_Distinct 
f7f0: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
f800: 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
f810: 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f  (SF_Distinct|SF_
f820: 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f  Aggregate))==SF_
f830: 41 67 67 72 65 67 61 74 65 20 29 3b 0a 20 20 20  Aggregate );.   
f840: 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 4e 6f   return 0; /* No
f850: 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72   DISTINCT keywor
f860: 64 20 61 6e 64 20 6e 6f 20 61 67 67 72 65 67 61  d and no aggrega
f870: 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a  te functions */.
f880: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d    }.  assert( p-
f890: 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b 20  >pGroupBy==0 ); 
f8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f8b0: 48 61 73 20 6e 6f 20 47 52 4f 55 50 20 42 59 20  Has no GROUP BY 
f8c0: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 66 28 20  clause */.  if( 
f8d0: 70 2d 3e 70 4c 69 6d 69 74 20 29 20 72 65 74 75  p->pLimit ) retu
f8e0: 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
f8f0: 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20 4c 49 4d     /* Has no LIM
f900: 49 54 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 61  IT clause */.  a
f910: 73 73 65 72 74 28 20 70 2d 3e 70 4f 66 66 73 65  ssert( p->pOffse
f920: 74 3d 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20  t==0 );         
f930: 20 20 20 20 20 20 2f 2a 20 4e 6f 20 4c 49 4d 49        /* No LIMI
f940: 54 20 6d 65 61 6e 73 20 6e 6f 20 4f 46 46 53 45  T means no OFFSE
f950: 54 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 57  T */.  if( p->pW
f960: 68 65 72 65 20 29 20 72 65 74 75 72 6e 20 30 3b  here ) return 0;
f970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f980: 20 48 61 73 20 6e 6f 20 57 48 45 52 45 20 63 6c   Has no WHERE cl
f990: 61 75 73 65 20 2a 2f 0a 20 20 70 53 72 63 20 3d  ause */.  pSrc =
f9a0: 20 70 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65   p->pSrc;.  asse
f9b0: 72 74 28 20 70 53 72 63 21 3d 30 20 29 3b 0a 20  rt( pSrc!=0 );. 
f9c0: 20 69 66 28 20 70 53 72 63 2d 3e 6e 53 72 63 21   if( pSrc->nSrc!
f9d0: 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  =1 ) return 0;  
f9e0: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 6e 67 6c          /* Singl
f9f0: 65 20 74 65 72 6d 20 69 6e 20 46 52 4f 4d 20 63  e term in FROM c
fa00: 6c 61 75 73 65 20 2a 2f 0a 20 20 69 66 28 20 70  lause */.  if( p
fa10: 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63  Src->a[0].pSelec
fa20: 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  t ) return 0;   
fa30: 20 20 2f 2a 20 46 52 4f 4d 20 69 73 20 6e 6f 74    /* FROM is not
fa40: 20 61 20 73 75 62 71 75 65 72 79 20 6f 72 20 76   a subquery or v
fa50: 69 65 77 20 2a 2f 0a 20 20 70 54 61 62 20 3d 20  iew */.  pTab = 
fa60: 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b  pSrc->a[0].pTab;
fa70: 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62 21  .  assert( pTab!
fa80: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
fa90: 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 3d 3d 30  pTab->pSelect==0
faa0: 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   );            /
fab0: 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73  * FROM clause is
fac0: 20 6e 6f 74 20 61 20 76 69 65 77 20 2a 2f 0a 20   not a view */. 
fad0: 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70   if( IsVirtual(p
fae0: 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 30 3b  Tab) ) return 0;
faf0: 20 20 20 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20          /* FROM 
fb00: 63 6c 61 75 73 65 20 6e 6f 74 20 61 20 76 69 72  clause not a vir
fb10: 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20  tual table */.  
fb20: 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69  pEList = p->pELi
fb30: 73 74 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 20 53 45  st;..  /* All SE
fb40: 4c 45 43 54 20 72 65 73 75 6c 74 73 20 6d 75 73  LECT results mus
fb50: 74 20 62 65 20 63 6f 6c 75 6d 6e 73 2e 20 2a 2f  t be columns. */
fb60: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45  .  for(i=0; i<pE
fb70: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
fb80: 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 52 65  ){.    Expr *pRe
fb90: 73 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  s = pEList->a[i]
fba0: 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20  .pExpr;.    if( 
fbb0: 70 52 65 73 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c  pRes->op!=TK_COL
fbc0: 55 4d 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  UMN ) return 0;.
fbd0: 20 20 20 20 61 73 73 65 72 74 28 20 70 52 65 73      assert( pRes
fbe0: 2d 3e 69 54 61 62 6c 65 3d 3d 70 53 72 63 2d 3e  ->iTable==pSrc->
fbf0: 61 5b 30 5d 2e 69 43 75 72 73 6f 72 20 29 3b 20  a[0].iCursor ); 
fc00: 20 2f 2a 20 4e 6f 74 20 61 20 63 6f 72 72 65 6c   /* Not a correl
fc10: 61 74 65 64 20 73 75 62 71 75 65 72 79 20 2a 2f  ated subquery */
fc20: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b  .  }.  return p;
fc30: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
fc40: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
fc50: 59 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65  Y */../*.** Code
fc60: 20 61 6e 20 4f 50 5f 4f 6e 63 65 20 69 6e 73 74   an OP_Once inst
fc70: 72 75 63 74 69 6f 6e 20 61 6e 64 20 61 6c 6c 6f  ruction and allo
fc80: 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 69  cate space for i
fc90: 74 73 20 66 6c 61 67 2e 20 52 65 74 75 72 6e 20  ts flag. Return 
fca0: 74 68 65 20 0a 2a 2a 20 61 64 64 72 65 73 73 20  the .** address 
fcb0: 6f 66 20 74 68 65 20 6e 65 77 20 69 6e 73 74 72  of the new instr
fcc0: 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73  uction..*/.int s
fcd0: 71 6c 69 74 65 33 43 6f 64 65 4f 6e 63 65 28 50  qlite3CodeOnce(P
fce0: 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20  arse *pParse){. 
fcf0: 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74   Vdbe *v = sqlit
fd00: 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
fd10: 29 3b 20 20 20 20 20 20 2f 2a 20 56 69 72 74 75  );      /* Virtu
fd20: 61 6c 20 6d 61 63 68 69 6e 65 20 62 65 69 6e 67  al machine being
fd30: 20 63 6f 64 65 64 20 2a 2f 0a 20 20 72 65 74 75   coded */.  retu
fd40: 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  rn sqlite3VdbeAd
fd50: 64 4f 70 31 28 76 2c 20 4f 50 5f 4f 6e 63 65 2c  dOp1(v, OP_Once,
fd60: 20 70 50 61 72 73 65 2d 3e 6e 4f 6e 63 65 2b 2b   pParse->nOnce++
fd70: 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  );.}..#ifndef SQ
fd80: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
fd90: 52 59 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  RY./*.** Generat
fda0: 65 20 63 6f 64 65 20 74 68 61 74 20 63 68 65 63  e code that chec
fdb0: 6b 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74  ks the left-most
fdc0: 20 63 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78   column of index
fdd0: 20 74 61 62 6c 65 20 69 43 75 72 20 74 6f 20 73   table iCur to s
fde0: 65 65 20 69 66 0a 2a 2a 20 69 74 20 63 6f 6e 74  ee if.** it cont
fdf0: 61 69 6e 73 20 61 6e 79 20 4e 55 4c 4c 20 65 6e  ains any NULL en
fe00: 74 72 69 65 73 2e 20 20 43 61 75 73 65 20 74 68  tries.  Cause th
fe10: 65 20 72 65 67 69 73 74 65 72 20 61 74 20 72 65  e register at re
fe20: 67 48 61 73 4e 75 6c 6c 20 74 6f 20 62 65 20 73  gHasNull to be s
fe30: 65 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 4e  et.** to a non-N
fe40: 55 4c 4c 20 76 61 6c 75 65 20 69 66 20 69 43 75  ULL value if iCu
fe50: 72 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 4e 55  r contains no NU
fe60: 4c 4c 73 2e 20 20 43 61 75 73 65 20 72 65 67 69  LLs.  Cause regi
fe70: 73 74 65 72 20 72 65 67 48 61 73 4e 75 6c 6c 0a  ster regHasNull.
fe80: 2a 2a 20 74 6f 20 62 65 20 73 65 74 20 74 6f 20  ** to be set to 
fe90: 4e 55 4c 4c 20 69 66 20 69 43 75 72 20 63 6f 6e  NULL if iCur con
fea0: 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72  tains one or mor
feb0: 65 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2e 0a 2a  e NULL values..*
fec0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71  /.static void sq
fed0: 6c 69 74 65 33 53 65 74 48 61 73 4e 75 6c 6c 46  lite3SetHasNullF
fee0: 6c 61 67 28 56 64 62 65 20 2a 76 2c 20 69 6e 74  lag(Vdbe *v, int
fef0: 20 69 43 75 72 2c 20 69 6e 74 20 72 65 67 48 61   iCur, int regHa
ff00: 73 4e 75 6c 6c 29 7b 0a 20 20 69 6e 74 20 61 64  sNull){.  int ad
ff10: 64 72 31 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  dr1;.  sqlite3Vd
ff20: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
ff30: 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67 48 61  nteger, 0, regHa
ff40: 73 4e 75 6c 6c 29 3b 0a 20 20 61 64 64 72 31 20  sNull);.  addr1 
ff50: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
ff60: 4f 70 31 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64  Op1(v, OP_Rewind
ff70: 2c 20 69 43 75 72 29 3b 20 56 64 62 65 43 6f 76  , iCur); VdbeCov
ff80: 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69  erage(v);.  sqli
ff90: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
ffa0: 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 43 75 72   OP_Column, iCur
ffb0: 2c 20 30 2c 20 72 65 67 48 61 73 4e 75 6c 6c 29  , 0, regHasNull)
ffc0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  ;.  sqlite3VdbeC
ffd0: 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41  hangeP5(v, OPFLA
ffe0: 47 5f 54 59 50 45 4f 46 41 52 47 29 3b 0a 20 20  G_TYPEOFARG);.  
fff0: 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
10000 22 66 69 72 73 74 5f 65 6e 74 72 79 5f 69 6e 28  "first_entry_in(
10010 25 64 29 22 2c 20 69 43 75 72 29 29 3b 0a 20 20  %d)", iCur));.  
10020 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
10030 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 7d  ere(v, addr1);.}
10040 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66 6e 64 65  .#endif...#ifnde
10050 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
10060 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 54 68 65  BQUERY./*.** The
10070 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 6e 20   argument is an 
10080 49 4e 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68  IN operator with
10090 20 61 20 6c 69 73 74 20 28 6e 6f 74 20 61 20 73   a list (not a s
100a0 75 62 71 75 65 72 79 29 20 6f 6e 20 74 68 65 20  ubquery) on the 
100b0 0a 2a 2a 20 72 69 67 68 74 2d 68 61 6e 64 20 73  .** right-hand s
100c0 69 64 65 2e 20 20 52 65 74 75 72 6e 20 54 52 55  ide.  Return TRU
100d0 45 20 69 66 20 74 68 61 74 20 6c 69 73 74 20 69  E if that list i
100e0 73 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a 73  s constant..*/.s
100f0 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65  tatic int sqlite
10100 33 49 6e 52 68 73 49 73 43 6f 6e 73 74 61 6e 74  3InRhsIsConstant
10110 28 45 78 70 72 20 2a 70 49 6e 29 7b 0a 20 20 45  (Expr *pIn){.  E
10120 78 70 72 20 2a 70 4c 48 53 3b 0a 20 20 69 6e 74  xpr *pLHS;.  int
10130 20 72 65 73 3b 0a 20 20 61 73 73 65 72 74 28 20   res;.  assert( 
10140 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
10150 28 70 49 6e 2c 20 45 50 5f 78 49 73 53 65 6c 65  (pIn, EP_xIsSele
10160 63 74 29 20 29 3b 0a 20 20 70 4c 48 53 20 3d 20  ct) );.  pLHS = 
10170 70 49 6e 2d 3e 70 4c 65 66 74 3b 0a 20 20 70 49  pIn->pLeft;.  pI
10180 6e 2d 3e 70 4c 65 66 74 20 3d 20 30 3b 0a 20 20  n->pLeft = 0;.  
10190 72 65 73 20 3d 20 73 71 6c 69 74 65 33 45 78 70  res = sqlite3Exp
101a0 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 49 6e 29  rIsConstant(pIn)
101b0 3b 0a 20 20 70 49 6e 2d 3e 70 4c 65 66 74 20 3d  ;.  pIn->pLeft =
101c0 20 70 4c 48 53 3b 0a 20 20 72 65 74 75 72 6e 20   pLHS;.  return 
101d0 72 65 73 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  res;.}.#endif../
101e0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
101f0 6f 6e 20 69 73 20 75 73 65 64 20 62 79 20 74 68  on is used by th
10200 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
10210 20 6f 66 20 74 68 65 20 49 4e 20 28 2e 2e 2e 29   of the IN (...)
10220 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 20 54 68   operator..** Th
10230 65 20 70 58 20 70 61 72 61 6d 65 74 65 72 20 69  e pX parameter i
10240 73 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  s the expression
10250 20 6f 6e 20 74 68 65 20 52 48 53 20 6f 66 20 74   on the RHS of t
10260 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 2c 20  he IN operator, 
10270 77 68 69 63 68 0a 2a 2a 20 6d 69 67 68 74 20 62  which.** might b
10280 65 20 65 69 74 68 65 72 20 61 20 6c 69 73 74 20  e either a list 
10290 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6f  of expressions o
102a0 72 20 61 20 73 75 62 71 75 65 72 79 2e 0a 2a 2a  r a subquery..**
102b0 0a 2a 2a 20 54 68 65 20 6a 6f 62 20 6f 66 20 74  .** The job of t
102c0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74  his routine is t
102d0 6f 20 66 69 6e 64 20 6f 72 20 63 72 65 61 74 65  o find or create
102e0 20 61 20 62 2d 74 72 65 65 20 6f 62 6a 65 63 74   a b-tree object
102f0 20 74 68 61 74 20 63 61 6e 0a 2a 2a 20 62 65 20   that can.** be 
10300 75 73 65 64 20 65 69 74 68 65 72 20 74 6f 20 74  used either to t
10310 65 73 74 20 66 6f 72 20 6d 65 6d 62 65 72 73 68  est for membersh
10320 69 70 20 69 6e 20 74 68 65 20 52 48 53 20 73 65  ip in the RHS se
10330 74 20 6f 72 20 74 6f 20 69 74 65 72 61 74 65 20  t or to iterate 
10340 74 68 72 6f 75 67 68 0a 2a 2a 20 61 6c 6c 20 6d  through.** all m
10350 65 6d 62 65 72 73 20 6f 66 20 74 68 65 20 52 48  embers of the RH
10360 53 20 73 65 74 2c 20 73 6b 69 70 70 69 6e 67 20  S set, skipping 
10370 64 75 70 6c 69 63 61 74 65 73 2e 0a 2a 2a 0a 2a  duplicates..**.*
10380 2a 20 41 20 63 75 72 73 6f 72 20 69 73 20 6f 70  * A cursor is op
10390 65 6e 65 64 20 6f 6e 20 74 68 65 20 62 2d 74 72  ened on the b-tr
103a0 65 65 20 6f 62 6a 65 63 74 20 74 68 61 74 20 69  ee object that i
103b0 73 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 65  s the RHS of the
103c0 20 49 4e 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20   IN operator.** 
103d0 61 6e 64 20 70 58 2d 3e 69 54 61 62 6c 65 20 69  and pX->iTable i
103e0 73 20 73 65 74 20 74 6f 20 74 68 65 20 69 6e 64  s set to the ind
103f0 65 78 20 6f 66 20 74 68 61 74 20 63 75 72 73 6f  ex of that curso
10400 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74  r..**.** The ret
10410 75 72 6e 65 64 20 76 61 6c 75 65 20 6f 66 20 74  urned value of t
10420 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 6e 64  his function ind
10430 69 63 61 74 65 73 20 74 68 65 20 62 2d 74 72 65  icates the b-tre
10440 65 20 74 79 70 65 2c 20 61 73 20 66 6f 6c 6c 6f  e type, as follo
10450 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 49 4e 5f 49  ws:.**.**   IN_I
10460 4e 44 45 58 5f 52 4f 57 49 44 20 20 20 20 20 20  NDEX_ROWID      
10470 2d 20 54 68 65 20 63 75 72 73 6f 72 20 77 61 73  - The cursor was
10480 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 64 61 74   opened on a dat
10490 61 62 61 73 65 20 74 61 62 6c 65 2e 0a 2a 2a 20  abase table..** 
104a0 20 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58    IN_INDEX_INDEX
104b0 5f 41 53 43 20 20 2d 20 54 68 65 20 63 75 72 73  _ASC  - The curs
104c0 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e  or was opened on
104d0 20 61 6e 20 61 73 63 65 6e 64 69 6e 67 20 69 6e   an ascending in
104e0 64 65 78 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44  dex..**   IN_IND
104f0 45 58 5f 49 4e 44 45 58 5f 44 45 53 43 20 2d 20  EX_INDEX_DESC - 
10500 54 68 65 20 63 75 72 73 6f 72 20 77 61 73 20 6f  The cursor was o
10510 70 65 6e 65 64 20 6f 6e 20 61 20 64 65 73 63 65  pened on a desce
10520 6e 64 69 6e 67 20 69 6e 64 65 78 2e 0a 2a 2a 20  nding index..** 
10530 20 20 49 4e 5f 49 4e 44 45 58 5f 45 50 48 20 20    IN_INDEX_EPH  
10540 20 20 20 20 20 20 2d 20 54 68 65 20 63 75 72 73        - The curs
10550 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e  or was opened on
10560 20 61 20 73 70 65 63 69 61 6c 6c 79 20 63 72 65   a specially cre
10570 61 74 65 64 20 61 6e 64 0a 2a 2a 20 20 20 20 20  ated and.**     
10580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10590 20 20 20 20 70 6f 70 75 6c 61 74 65 64 20 65 70      populated ep
105a0 68 65 72 65 6d 61 6c 20 74 61 62 6c 65 2e 0a 2a  heremal table..*
105b0 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f  *   IN_INDEX_NOO
105c0 50 20 20 20 20 20 20 20 2d 20 4e 6f 20 63 75 72  P       - No cur
105d0 73 6f 72 20 77 61 73 20 61 6c 6c 6f 63 61 74 65  sor was allocate
105e0 64 2e 20 20 54 68 65 20 49 4e 20 6f 70 65 72 61  d.  The IN opera
105f0 74 6f 72 20 6d 75 73 74 20 62 65 0a 2a 2a 20 20  tor must be.**  
10600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10610 20 20 20 20 20 20 20 69 6d 70 6c 65 6d 65 6e 74         implement
10620 65 64 20 61 73 20 61 20 73 65 71 75 65 6e 63 65  ed as a sequence
10630 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e 73 2e   of comparisons.
10640 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78 69 73 74 69  .**.** An existi
10650 6e 67 20 62 2d 74 72 65 65 20 6d 69 67 68 74 20  ng b-tree might 
10660 62 65 20 75 73 65 64 20 69 66 20 74 68 65 20 52  be used if the R
10670 48 53 20 65 78 70 72 65 73 73 69 6f 6e 20 70 58  HS expression pX
10680 20 69 73 20 61 20 73 69 6d 70 6c 65 0a 2a 2a 20   is a simple.** 
10690 73 75 62 71 75 65 72 79 20 73 75 63 68 20 61 73  subquery such as
106a0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45  :.**.**     SELE
106b0 43 54 20 3c 63 6f 6c 75 6d 6e 31 3e 2c 20 3c 63  CT <column1>, <c
106c0 6f 6c 75 6d 6e 32 3e 2e 2e 2e 20 46 52 4f 4d 20  olumn2>... FROM 
106d0 3c 74 61 62 6c 65 3e 0a 2a 2a 0a 2a 2a 20 49 66  <table>.**.** If
106e0 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 65 20   the RHS of the 
106f0 49 4e 20 6f 70 65 72 61 74 6f 72 20 69 73 20 61  IN operator is a
10700 20 6c 69 73 74 20 6f 72 20 61 20 6d 6f 72 65 20   list or a more 
10710 63 6f 6d 70 6c 65 78 20 73 75 62 71 75 65 72 79  complex subquery
10720 2c 20 74 68 65 6e 0a 2a 2a 20 61 6e 20 65 70 68  , then.** an eph
10730 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 6d 69 67  emeral table mig
10740 68 74 20 6e 65 65 64 20 74 6f 20 62 65 20 67 65  ht need to be ge
10750 6e 65 72 61 74 65 64 20 66 72 6f 6d 20 74 68 65  nerated from the
10760 20 52 48 53 20 61 6e 64 20 74 68 65 6e 0a 2a 2a   RHS and then.**
10770 20 70 58 2d 3e 69 54 61 62 6c 65 20 6d 61 64 65   pX->iTable made
10780 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   to point to the
10790 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65   ephemeral table
107a0 20 69 6e 73 74 65 61 64 20 6f 66 20 61 6e 0a 2a   instead of an.*
107b0 2a 20 65 78 69 73 74 69 6e 67 20 74 61 62 6c 65  * existing table
107c0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 46 6c  ..**.** The inFl
107d0 61 67 73 20 70 61 72 61 6d 65 74 65 72 20 6d 75  ags parameter mu
107e0 73 74 20 63 6f 6e 74 61 69 6e 20 65 78 61 63 74  st contain exact
107f0 6c 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 62 69  ly one of the bi
10800 74 73 0a 2a 2a 20 49 4e 5f 49 4e 44 45 58 5f 4d  ts.** IN_INDEX_M
10810 45 4d 42 45 52 53 48 49 50 20 6f 72 20 49 4e 5f  EMBERSHIP or IN_
10820 49 4e 44 45 58 5f 4c 4f 4f 50 2e 20 20 49 66 20  INDEX_LOOP.  If 
10830 69 6e 46 6c 61 67 73 20 63 6f 6e 74 61 69 6e 73  inFlags contains
10840 0a 2a 2a 20 49 4e 5f 49 4e 44 45 58 5f 4d 45 4d  .** IN_INDEX_MEM
10850 42 45 52 53 48 49 50 2c 20 74 68 65 6e 20 74 68  BERSHIP, then th
10860 65 20 67 65 6e 65 72 61 74 65 64 20 74 61 62 6c  e generated tabl
10870 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 66  e will be used f
10880 6f 72 20 61 0a 2a 2a 20 66 61 73 74 20 6d 65 6d  or a.** fast mem
10890 62 65 72 73 68 69 70 20 74 65 73 74 2e 20 20 57  bership test.  W
108a0 68 65 6e 20 74 68 65 20 49 4e 5f 49 4e 44 45 58  hen the IN_INDEX
108b0 5f 4c 4f 4f 50 20 62 69 74 20 69 73 20 73 65 74  _LOOP bit is set
108c0 2c 20 74 68 65 0a 2a 2a 20 49 4e 20 69 6e 64 65  , the.** IN inde
108d0 78 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74  x will be used t
108e0 6f 20 6c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20  o loop over all 
108f0 76 61 6c 75 65 73 20 6f 66 20 74 68 65 20 52 48  values of the RH
10900 53 20 6f 66 20 74 68 65 0a 2a 2a 20 49 4e 20 6f  S of the.** IN o
10910 70 65 72 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 57  perator..**.** W
10920 68 65 6e 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f  hen IN_INDEX_LOO
10930 50 20 69 73 20 75 73 65 64 20 28 61 6e 64 20 74  P is used (and t
10940 68 65 20 62 2d 74 72 65 65 20 77 69 6c 6c 20 62  he b-tree will b
10950 65 20 75 73 65 64 20 74 6f 20 69 74 65 72 61 74  e used to iterat
10960 65 0a 2a 2a 20 74 68 72 6f 75 67 68 20 74 68 65  e.** through the
10970 20 73 65 74 20 6d 65 6d 62 65 72 73 29 20 74 68   set members) th
10980 65 6e 20 74 68 65 20 62 2d 74 72 65 65 20 6d 75  en the b-tree mu
10990 73 74 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 64  st not contain d
109a0 75 70 6c 69 63 61 74 65 73 2e 0a 2a 2a 20 41 6e  uplicates..** An
109b0 20 65 70 68 65 72 65 6d 61 6c 20 74 61 62 6c 65   epheremal table
109c0 20 6d 75 73 74 20 62 65 20 75 73 65 64 20 75 6e   must be used un
109d0 6c 65 73 73 20 74 68 65 20 73 65 6c 65 63 74 65  less the selecte
109e0 64 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 67 75  d columns are gu
109f0 61 72 61 6e 74 65 65 64 0a 2a 2a 20 74 6f 20 62  aranteed.** to b
10a00 65 20 75 6e 69 71 75 65 20 2d 20 65 69 74 68 65  e unique - eithe
10a10 72 20 62 65 63 61 75 73 65 20 69 74 20 69 73 20  r because it is 
10a20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  an INTEGER PRIMA
10a30 52 59 20 4b 45 59 20 6f 72 20 64 75 65 20 74 6f  RY KEY or due to
10a40 0a 2a 2a 20 61 20 55 4e 49 51 55 45 20 63 6f 6e  .** a UNIQUE con
10a50 73 74 72 61 69 6e 74 20 6f 72 20 69 6e 64 65 78  straint or index
10a60 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 49 4e 5f  ..**.** When IN_
10a70 49 4e 44 45 58 5f 4d 45 4d 42 45 52 53 48 49 50  INDEX_MEMBERSHIP
10a80 20 69 73 20 75 73 65 64 20 28 61 6e 64 20 74 68   is used (and th
10a90 65 20 62 2d 74 72 65 65 20 77 69 6c 6c 20 62 65  e b-tree will be
10aa0 20 75 73 65 64 20 0a 2a 2a 20 66 6f 72 20 66 61   used .** for fa
10ab0 73 74 20 73 65 74 20 6d 65 6d 62 65 72 73 68 69  st set membershi
10ac0 70 20 74 65 73 74 73 29 20 74 68 65 6e 20 61 6e  p tests) then an
10ad0 20 65 70 68 65 72 65 6d 61 6c 20 74 61 62 6c 65   epheremal table
10ae0 20 6d 75 73 74 20 0a 2a 2a 20 62 65 20 75 73 65   must .** be use
10af0 64 20 75 6e 6c 65 73 73 20 3c 63 6f 6c 75 6d 6e  d unless <column
10b00 73 3e 20 69 73 20 61 20 73 69 6e 67 6c 65 20 49  s> is a single I
10b10 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
10b20 45 59 20 63 6f 6c 75 6d 6e 20 6f 72 20 61 6e 20  EY column or an 
10b30 0a 2a 2a 20 69 6e 64 65 78 20 63 61 6e 20 62 65  .** index can be
10b40 20 66 6f 75 6e 64 20 77 69 74 68 20 74 68 65 20   found with the 
10b50 73 70 65 63 69 66 69 65 64 20 3c 63 6f 6c 75 6d  specified <colum
10b60 6e 73 3e 20 61 73 20 69 74 73 20 6c 65 66 74 2d  ns> as its left-
10b70 6d 6f 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  most..**.** If t
10b80 68 65 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50  he IN_INDEX_NOOP
10b90 5f 4f 4b 20 61 6e 64 20 49 4e 5f 49 4e 44 45 58  _OK and IN_INDEX
10ba0 5f 4d 45 4d 42 45 52 53 48 49 50 20 61 72 65 20  _MEMBERSHIP are 
10bb0 62 6f 74 68 20 73 65 74 20 61 6e 64 0a 2a 2a 20  both set and.** 
10bc0 69 66 20 74 68 65 20 52 48 53 20 6f 66 20 74 68  if the RHS of th
10bd0 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 69 73  e IN operator is
10be0 20 61 20 6c 69 73 74 20 28 6e 6f 74 20 61 20 73   a list (not a s
10bf0 75 62 71 75 65 72 79 29 20 74 68 65 6e 20 74 68  ubquery) then th
10c00 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 6d 69  is.** routine mi
10c10 67 68 74 20 64 65 63 69 64 65 20 74 68 61 74 20  ght decide that 
10c20 63 72 65 61 74 69 6e 67 20 61 6e 20 65 70 68 65  creating an ephe
10c30 6d 65 72 61 6c 20 62 2d 74 72 65 65 20 66 6f 72  meral b-tree for
10c40 20 6d 65 6d 62 65 72 73 68 69 70 0a 2a 2a 20 74   membership.** t
10c50 65 73 74 69 6e 67 20 69 73 20 74 6f 6f 20 65 78  esting is too ex
10c60 70 65 6e 73 69 76 65 20 61 6e 64 20 72 65 74 75  pensive and retu
10c70 72 6e 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50  rn IN_INDEX_NOOP
10c80 2e 20 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c  .  In that case,
10c90 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20   the.** calling 
10ca0 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 69  routine should i
10cb0 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 49 4e 20  mplement the IN 
10cc0 6f 70 65 72 61 74 6f 72 20 75 73 69 6e 67 20 61  operator using a
10cd0 20 73 65 71 75 65 6e 63 65 0a 2a 2a 20 6f 66 20   sequence.** of 
10ce0 45 71 20 6f 72 20 4e 65 20 63 6f 6d 70 61 72 69  Eq or Ne compari
10cf0 73 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 73 2e 0a  son operations..
10d00 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 65 20 62  **.** When the b
10d10 2d 74 72 65 65 20 69 73 20 62 65 69 6e 67 20 75  -tree is being u
10d20 73 65 64 20 66 6f 72 20 6d 65 6d 62 65 72 73 68  sed for membersh
10d30 69 70 20 74 65 73 74 73 2c 20 74 68 65 20 63 61  ip tests, the ca
10d40 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a 2a  lling function.*
10d50 2a 20 6d 69 67 68 74 20 6e 65 65 64 20 74 6f 20  * might need to 
10d60 6b 6e 6f 77 20 77 68 65 74 68 65 72 20 6f 72 20  know whether or 
10d70 6e 6f 74 20 74 68 65 20 52 48 53 20 73 69 64 65  not the RHS side
10d80 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61   of the IN opera
10d90 74 6f 72 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20  tor.** contains 
10da0 61 20 4e 55 4c 4c 2e 20 20 49 66 20 70 72 52 68  a NULL.  If prRh
10db0 73 48 61 73 4e 75 6c 6c 20 69 73 20 6e 6f 74 20  sHasNull is not 
10dc0 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20 61  a NULL pointer a
10dd0 6e 64 20 0a 2a 2a 20 69 66 20 74 68 65 72 65 20  nd .** if there 
10de0 69 73 20 61 6e 79 20 63 68 61 6e 63 65 20 74 68  is any chance th
10df0 61 74 20 74 68 65 20 28 2e 2e 2e 29 20 6d 69 67  at the (...) mig
10e00 68 74 20 63 6f 6e 74 61 69 6e 20 61 20 4e 55 4c  ht contain a NUL
10e10 4c 20 76 61 6c 75 65 20 61 74 0a 2a 2a 20 72 75  L value at.** ru
10e20 6e 74 69 6d 65 2c 20 74 68 65 6e 20 61 20 72 65  ntime, then a re
10e30 67 69 73 74 65 72 20 69 73 20 61 6c 6c 6f 63 61  gister is alloca
10e40 74 65 64 20 61 6e 64 20 74 68 65 20 72 65 67 69  ted and the regi
10e50 73 74 65 72 20 6e 75 6d 62 65 72 20 77 72 69 74  ster number writ
10e60 74 65 6e 0a 2a 2a 20 74 6f 20 2a 70 72 52 68 73  ten.** to *prRhs
10e70 48 61 73 4e 75 6c 6c 2e 20 49 66 20 74 68 65 72  HasNull. If ther
10e80 65 20 69 73 20 6e 6f 20 63 68 61 6e 63 65 20 74  e is no chance t
10e90 68 61 74 20 74 68 65 20 28 2e 2e 2e 29 20 63 6f  hat the (...) co
10ea0 6e 74 61 69 6e 73 20 61 0a 2a 2a 20 4e 55 4c 4c  ntains a.** NULL
10eb0 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 2a 70 72   value, then *pr
10ec0 52 68 73 48 61 73 4e 75 6c 6c 20 69 73 20 6c 65  RhsHasNull is le
10ed0 66 74 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a  ft unchanged..**
10ee0 0a 2a 2a 20 49 66 20 61 20 72 65 67 69 73 74 65  .** If a registe
10ef0 72 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61  r is allocated a
10f00 6e 64 20 69 74 73 20 6c 6f 63 61 74 69 6f 6e 20  nd its location 
10f10 73 74 6f 72 65 64 20 69 6e 20 2a 70 72 52 68 73  stored in *prRhs
10f20 48 61 73 4e 75 6c 6c 2c 20 74 68 65 6e 0a 2a 2a  HasNull, then.**
10f30 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 74 68   the value in th
10f40 61 74 20 72 65 67 69 73 74 65 72 20 77 69 6c 6c  at register will
10f50 20 62 65 20 4e 55 4c 4c 20 69 66 20 74 68 65 20   be NULL if the 
10f60 62 2d 74 72 65 65 20 63 6f 6e 74 61 69 6e 73 20  b-tree contains 
10f70 6f 6e 65 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 4e  one or more.** N
10f80 55 4c 4c 20 76 61 6c 75 65 73 2c 20 61 6e 64 20  ULL values, and 
10f90 69 74 20 77 69 6c 6c 20 62 65 20 73 6f 6d 65 20  it will be some 
10fa0 6e 6f 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65 20 69  non-NULL value i
10fb0 66 20 74 68 65 20 62 2d 74 72 65 65 20 63 6f 6e  f the b-tree con
10fc0 74 61 69 6e 73 20 6e 6f 0a 2a 2a 20 4e 55 4c 4c  tains no.** NULL
10fd0 20 76 61 6c 75 65 73 2e 0a 2a 2a 0a 2a 2a 20 49   values..**.** I
10fe0 66 20 74 68 65 20 61 69 4d 61 70 20 70 61 72 61  f the aiMap para
10ff0 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 4e 55 4c  meter is not NUL
11000 4c 2c 20 69 74 20 6d 75 73 74 20 70 6f 69 6e 74  L, it must point
11010 20 74 6f 20 61 6e 20 61 72 72 61 79 20 63 6f 6e   to an array con
11020 74 61 69 6e 69 6e 67 0a 2a 2a 20 6f 6e 65 20 65  taining.** one e
11030 6c 65 6d 65 6e 74 20 66 6f 72 20 65 61 63 68 20  lement for each 
11040 63 6f 6c 75 6d 6e 20 72 65 74 75 72 6e 65 64 20  column returned 
11050 62 79 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  by the SELECT st
11060 61 74 65 6d 65 6e 74 20 6f 6e 20 74 68 65 20 52  atement on the R
11070 48 53 0a 2a 2a 20 6f 66 20 74 68 65 20 49 4e 28  HS.** of the IN(
11080 2e 2e 2e 29 20 6f 70 65 72 61 74 6f 72 2e 20 54  ...) operator. T
11090 68 65 20 69 27 74 68 20 65 6e 74 72 79 20 6f 66  he i'th entry of
110a0 20 74 68 65 20 61 72 72 61 79 20 69 73 20 70 6f   the array is po
110b0 70 75 6c 61 74 65 64 20 77 69 74 68 20 74 68 65  pulated with the
110c0 0a 2a 2a 20 6f 66 66 73 65 74 20 6f 66 20 74 68  .** offset of th
110d0 65 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 74  e index column t
110e0 68 61 74 20 6d 61 74 63 68 65 73 20 74 68 65 20  hat matches the 
110f0 69 27 74 68 20 63 6f 6c 75 6d 6e 20 72 65 74 75  i'th column retu
11100 72 6e 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 53  rned by the.** S
11110 45 4c 45 43 54 2e 20 46 6f 72 20 65 78 61 6d 70  ELECT. For examp
11120 6c 65 2c 20 69 66 20 74 68 65 20 65 78 70 72 65  le, if the expre
11130 73 73 69 6f 6e 20 61 6e 64 20 73 65 6c 65 63 74  ssion and select
11140 65 64 20 69 6e 64 65 78 20 61 72 65 3a 0a 2a 2a  ed index are:.**
11150 0a 2a 2a 20 20 20 28 3f 2c 3f 2c 3f 29 20 49 4e  .**   (?,?,?) IN
11160 20 28 53 45 4c 45 43 54 20 61 2c 20 62 2c 20 63   (SELECT a, b, c
11170 20 46 52 4f 4d 20 74 31 29 0a 2a 2a 20 20 20 43   FROM t1).**   C
11180 52 45 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f  REATE INDEX i1 O
11190 4e 20 74 31 28 62 2c 20 63 2c 20 61 29 3b 0a 2a  N t1(b, c, a);.*
111a0 2a 0a 2a 2a 20 74 68 65 6e 20 61 69 4d 61 70 5b  *.** then aiMap[
111b0 5d 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77  ] is populated w
111c0 69 74 68 20 7b 32 2c 20 30 2c 20 31 7d 2e 0a 2a  ith {2, 0, 1}..*
111d0 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
111e0 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 69  _OMIT_SUBQUERY.i
111f0 6e 74 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e  nt sqlite3FindIn
11200 49 6e 64 65 78 28 0a 20 20 50 61 72 73 65 20 2a  Index(.  Parse *
11210 70 50 61 72 73 65 2c 20 0a 20 20 45 78 70 72 20  pParse, .  Expr 
11220 2a 70 58 2c 20 0a 20 20 75 33 32 20 69 6e 46 6c  *pX, .  u32 inFl
11230 61 67 73 2c 20 0a 20 20 69 6e 74 20 2a 70 72 52  ags, .  int *prR
11240 68 73 48 61 73 4e 75 6c 6c 2c 0a 20 20 69 6e 74  hsHasNull,.  int
11250 20 2a 61 69 4d 61 70 0a 29 7b 0a 20 20 53 65 6c   *aiMap.){.  Sel
11260 65 63 74 20 2a 70 3b 20 20 20 20 20 20 20 20 20  ect *p;         
11270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11280 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 74 6f 20     /* SELECT to 
11290 74 68 65 20 72 69 67 68 74 20 6f 66 20 49 4e 20  the right of IN 
112a0 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e  operator */.  in
112b0 74 20 65 54 79 70 65 20 3d 20 30 3b 20 20 20 20  t eType = 0;    
112c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
112d0 20 20 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 52      /* Type of R
112e0 48 53 20 74 61 62 6c 65 2e 20 49 4e 5f 49 4e 44  HS table. IN_IND
112f0 45 58 5f 2a 20 2a 2f 0a 20 20 69 6e 74 20 69 54  EX_* */.  int iT
11300 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  ab = pParse->nTa
11310 62 2b 2b 3b 20 20 20 20 20 20 20 20 20 20 20 20  b++;            
11320 2f 2a 20 43 75 72 73 6f 72 20 6f 66 20 74 68 65  /* Cursor of the
11330 20 52 48 53 20 74 61 62 6c 65 20 2a 2f 0a 20 20   RHS table */.  
11340 69 6e 74 20 6d 75 73 74 42 65 55 6e 69 71 75 65  int mustBeUnique
11350 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
11360 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
11370 20 52 48 53 20 6d 75 73 74 20 62 65 20 75 6e 69   RHS must be uni
11380 71 75 65 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  que */.  Vdbe *v
11390 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
113a0 65 28 70 50 61 72 73 65 29 3b 20 20 20 20 20 2f  e(pParse);     /
113b0 2a 20 56 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  * Virtual machin
113c0 65 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f  e being coded */
113d0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 58 2d 3e  ..  assert( pX->
113e0 6f 70 3d 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20 6d  op==TK_IN );.  m
113f0 75 73 74 42 65 55 6e 69 71 75 65 20 3d 20 28 69  ustBeUnique = (i
11400 6e 46 6c 61 67 73 20 26 20 49 4e 5f 49 4e 44 45  nFlags & IN_INDE
11410 58 5f 4c 4f 4f 50 29 21 3d 30 3b 0a 0a 20 20 2f  X_LOOP)!=0;..  /
11420 2a 20 49 66 20 74 68 65 20 52 48 53 20 6f 66 20  * If the RHS of 
11430 74 68 69 73 20 49 4e 28 2e 2e 2e 29 20 6f 70 65  this IN(...) ope
11440 72 61 74 6f 72 20 69 73 20 61 20 53 45 4c 45 43  rator is a SELEC
11450 54 2c 20 61 6e 64 20 69 66 20 69 74 20 6d 61 74  T, and if it mat
11460 74 65 72 73 20 0a 20 20 2a 2a 20 77 68 65 74 68  ters .  ** wheth
11470 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 53 45  er or not the SE
11480 4c 45 43 54 20 72 65 73 75 6c 74 20 63 6f 6e 74  LECT result cont
11490 61 69 6e 73 20 4e 55 4c 4c 20 76 61 6c 75 65 73  ains NULL values
114a0 2c 20 63 68 65 63 6b 20 77 68 65 74 68 65 72 0a  , check whether.
114b0 20 20 2a 2a 20 6f 72 20 6e 6f 74 20 4e 55 4c 4c    ** or not NULL
114c0 20 69 73 20 61 63 74 75 61 6c 6c 79 20 70 6f 73   is actually pos
114d0 73 69 62 6c 65 20 28 69 74 20 6d 61 79 20 6e 6f  sible (it may no
114e0 74 20 62 65 2c 20 66 6f 72 20 65 78 61 6d 70 6c  t be, for exampl
114f0 65 2c 20 64 75 65 20 0a 20 20 2a 2a 20 74 6f 20  e, due .  ** to 
11500 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61  NOT NULL constra
11510 69 6e 74 73 20 69 6e 20 74 68 65 20 73 63 68 65  ints in the sche
11520 6d 61 29 2e 20 49 66 20 6e 6f 20 4e 55 4c 4c 20  ma). If no NULL 
11530 76 61 6c 75 65 73 20 61 72 65 20 70 6f 73 73 69  values are possi
11540 62 6c 65 2c 0a 20 20 2a 2a 20 73 65 74 20 70 72  ble,.  ** set pr
11550 52 68 73 48 61 73 4e 75 6c 6c 20 74 6f 20 30 20  RhsHasNull to 0 
11560 62 65 66 6f 72 65 20 63 6f 6e 74 69 6e 75 69 6e  before continuin
11570 67 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 72 52  g.  */.  if( prR
11580 68 73 48 61 73 4e 75 6c 6c 20 26 26 20 28 70 58  hsHasNull && (pX
11590 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 78 49 73  ->flags & EP_xIs
115a0 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 69  Select) ){.    i
115b0 6e 74 20 69 3b 0a 20 20 20 20 45 78 70 72 4c 69  nt i;.    ExprLi
115c0 73 74 20 2a 70 45 4c 69 73 74 20 3d 20 70 58 2d  st *pEList = pX-
115d0 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69  >x.pSelect->pELi
115e0 73 74 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  st;.    for(i=0;
115f0 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   i<pEList->nExpr
11600 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
11610 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 6e  ( sqlite3ExprCan
11620 42 65 4e 75 6c 6c 28 70 45 4c 69 73 74 2d 3e 61  BeNull(pEList->a
11630 5b 69 5d 2e 70 45 78 70 72 29 20 29 20 62 72 65  [i].pExpr) ) bre
11640 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ak;.    }.    if
11650 28 20 69 3d 3d 70 45 4c 69 73 74 2d 3e 6e 45 78  ( i==pEList->nEx
11660 70 72 20 29 7b 0a 20 20 20 20 20 20 70 72 52 68  pr ){.      prRh
11670 73 48 61 73 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20  sHasNull = 0;.  
11680 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68    }.  }..  /* Ch
11690 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 61 6e  eck to see if an
116a0 20 65 78 69 73 74 69 6e 67 20 74 61 62 6c 65 20   existing table 
116b0 6f 72 20 69 6e 64 65 78 20 63 61 6e 20 62 65 20  or index can be 
116c0 75 73 65 64 20 74 6f 0a 20 20 2a 2a 20 73 61 74  used to.  ** sat
116d0 69 73 66 79 20 74 68 65 20 71 75 65 72 79 2e 20  isfy the query. 
116e0 20 54 68 69 73 20 69 73 20 70 72 65 66 65 72 61   This is prefera
116f0 62 6c 65 20 74 6f 20 67 65 6e 65 72 61 74 69 6e  ble to generatin
11700 67 20 61 20 6e 65 77 20 0a 20 20 2a 2a 20 65 70  g a new .  ** ep
11710 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 2e 20 20  hemeral table.  
11720 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  */.  if( pParse-
11730 3e 6e 45 72 72 3d 3d 30 20 26 26 20 28 70 20 3d  >nErr==0 && (p =
11740 20 69 73 43 61 6e 64 69 64 61 74 65 46 6f 72 49   isCandidateForI
11750 6e 4f 70 74 28 70 58 29 29 21 3d 30 20 29 7b 0a  nOpt(pX))!=0 ){.
11760 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20      sqlite3 *db 
11770 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20  = pParse->db;   
11780 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
11790 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
117a0 6e 20 2a 2f 0a 20 20 20 20 54 61 62 6c 65 20 2a  n */.    Table *
117b0 70 54 61 62 3b 20 20 20 20 20 20 20 20 20 20 20  pTab;           
117c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
117d0 2f 2a 20 54 61 62 6c 65 20 3c 74 61 62 6c 65 3e  /* Table <table>
117e0 2e 20 2a 2f 0a 20 20 20 20 69 31 36 20 69 44 62  . */.    i16 iDb
117f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
11800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11810 2f 2a 20 44 61 74 61 62 61 73 65 20 69 64 78 20  /* Database idx 
11820 66 6f 72 20 70 54 61 62 20 2a 2f 0a 20 20 20 20  for pTab */.    
11830 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
11840 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20   = p->pEList;.  
11850 20 20 69 6e 74 20 6e 45 78 70 72 20 3d 20 70 45    int nExpr = pE
11860 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 0a 20 20  List->nExpr;..  
11870 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c    assert( p->pEL
11880 69 73 74 21 3d 30 20 29 3b 20 20 20 20 20 20 20  ist!=0 );       
11890 20 20 20 20 20 20 2f 2a 20 42 65 63 61 75 73 65        /* Because
118a0 20 6f 66 20 69 73 43 61 6e 64 69 64 61 74 65 46   of isCandidateF
118b0 6f 72 49 6e 4f 70 74 28 70 29 20 2a 2f 0a 20 20  orInOpt(p) */.  
118c0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c    assert( p->pEL
118d0 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 21  ist->a[0].pExpr!
118e0 3d 30 20 29 3b 20 2f 2a 20 42 65 63 61 75 73 65  =0 ); /* Because
118f0 20 6f 66 20 69 73 43 61 6e 64 69 64 61 74 65 46   of isCandidateF
11900 6f 72 49 6e 4f 70 74 28 70 29 20 2a 2f 0a 20 20  orInOpt(p) */.  
11910 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 53 72    assert( p->pSr
11920 63 21 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20  c!=0 );         
11930 20 20 20 20 20 20 2f 2a 20 42 65 63 61 75 73 65        /* Because
11940 20 6f 66 20 69 73 43 61 6e 64 69 64 61 74 65 46   of isCandidateF
11950 6f 72 49 6e 4f 70 74 28 70 29 20 2a 2f 0a 20 20  orInOpt(p) */.  
11960 20 20 70 54 61 62 20 3d 20 70 2d 3e 70 53 72 63    pTab = p->pSrc
11970 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 0a 20 20  ->a[0].pTab;..  
11980 20 20 2f 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f    /* Code an OP_
11990 54 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20  Transaction and 
119a0 4f 50 5f 54 61 62 6c 65 4c 6f 63 6b 20 66 6f 72  OP_TableLock for
119b0 20 3c 74 61 62 6c 65 3e 2e 20 2a 2f 0a 20 20 20   <table>. */.   
119c0 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
119d0 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20  hemaToIndex(db, 
119e0 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  pTab->pSchema);.
119f0 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56      sqlite3CodeV
11a00 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72  erifySchema(pPar
11a10 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71  se, iDb);.    sq
11a20 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70  lite3TableLock(p
11a30 50 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62  Parse, iDb, pTab
11a40 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d  ->tnum, 0, pTab-
11a50 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20 20 20 2f 2a  >zName);..    /*
11a60 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
11a70 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 66 72  s only called fr
11a80 6f 6d 20 74 77 6f 20 70 6c 61 63 65 73 2e 20 49  om two places. I
11a90 6e 20 62 6f 74 68 20 63 61 73 65 73 20 74 68 65  n both cases the
11aa0 20 76 64 62 65 0a 20 20 20 20 2a 2a 20 68 61 73   vdbe.    ** has
11ab0 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c   already been al
11ac0 6c 6f 63 61 74 65 64 2e 20 53 6f 20 61 73 73 75  located. So assu
11ad0 6d 65 20 73 71 6c 69 74 65 33 47 65 74 56 64 62  me sqlite3GetVdb
11ae0 65 28 29 20 69 73 20 61 6c 77 61 79 73 0a 20 20  e() is always.  
11af0 20 20 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20    ** successful 
11b00 68 65 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  here..    */.   
11b10 20 61 73 73 65 72 74 28 76 29 3b 0a 20 20 20 20   assert(v);.    
11b20 69 66 28 20 6e 45 78 70 72 3d 3d 31 20 26 26 20  if( nExpr==1 && 
11b30 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  pEList->a[0].pEx
11b40 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b  pr->iColumn<0 ){
11b50 0a 20 20 20 20 20 20 69 6e 74 20 69 41 64 64 72  .      int iAddr
11b60 20 3d 20 73 71 6c 69 74 65 33 43 6f 64 65 4f 6e   = sqlite3CodeOn
11b70 63 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  ce(pParse);.    
11b80 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
11b90 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65  );..      sqlite
11ba0 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73  3OpenTable(pPars
11bb0 65 2c 20 69 54 61 62 2c 20 69 44 62 2c 20 70 54  e, iTab, iDb, pT
11bc0 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 29  ab, OP_OpenRead)
11bd0 3b 0a 20 20 20 20 20 20 65 54 79 70 65 20 3d 20  ;.      eType = 
11be0 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 3b 0a  IN_INDEX_ROWID;.
11bf0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
11c00 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 69 41  beJumpHere(v, iA
11c10 64 64 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ddr);.    }else{
11c20 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49  .      Index *pI
11c30 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dx;             
11c40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
11c50 74 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c 65  terator variable
11c60 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 66   */.      int af
11c70 66 69 6e 69 74 79 5f 6f 6b 20 3d 20 31 3b 0a 20  finity_ok = 1;. 
11c80 20 20 20 20 20 69 6e 74 20 69 3b 0a 0a 20 20 20       int i;..   
11c90 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74     /* Check that
11ca0 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 74 68   the affinity th
11cb0 61 74 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20  at will be used 
11cc0 74 6f 20 70 65 72 66 6f 72 6d 20 65 61 63 68 20  to perform each 
11cd0 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6d 70 61 72  .      ** compar
11ce0 69 73 6f 6e 20 69 73 20 74 68 65 20 73 61 6d 65  ison is the same
11cf0 20 61 73 20 74 68 65 20 61 66 66 69 6e 69 74 79   as the affinity
11d00 20 6f 66 20 65 61 63 68 20 63 6f 6c 75 6d 6e 2e   of each column.
11d10 20 49 66 0a 20 20 20 20 20 20 2a 2a 20 69 74 20   If.      ** it 
11d20 6e 6f 74 2c 20 69 74 20 69 73 20 6e 6f 74 20 70  not, it is not p
11d30 6f 73 73 69 62 6c 65 20 74 6f 20 75 73 65 20 61  ossible to use a
11d40 6e 79 20 69 6e 64 65 78 2e 20 20 2a 2f 0a 20 20  ny index.  */.  
11d50 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
11d60 45 78 70 72 20 26 26 20 61 66 66 69 6e 69 74 79  Expr && affinity
11d70 5f 6f 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  _ok; i++){.     
11d80 20 20 20 45 78 70 72 20 2a 70 4c 68 73 20 3d 20     Expr *pLhs = 
11d90 73 71 6c 69 74 65 33 56 65 63 74 6f 72 46 69 65  sqlite3VectorFie
11da0 6c 64 53 75 62 65 78 70 72 28 70 58 2d 3e 70 4c  ldSubexpr(pX->pL
11db0 65 66 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20  eft, i);.       
11dc0 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 45 4c 69   int iCol = pELi
11dd0 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2d 3e  st->a[i].pExpr->
11de0 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20  iColumn;.       
11df0 20 63 68 61 72 20 69 64 78 61 66 66 20 3d 20 70   char idxaff = p
11e00 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
11e10 61 66 66 69 6e 69 74 79 3b 0a 20 20 20 20 20 20  affinity;.      
11e20 20 20 63 68 61 72 20 63 6d 70 61 66 66 20 3d 20    char cmpaff = 
11e30 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66  sqlite3CompareAf
11e40 66 69 6e 69 74 79 28 70 4c 68 73 2c 20 69 64 78  finity(pLhs, idx
11e50 61 66 66 29 3b 0a 20 20 20 20 20 20 20 20 73 77  aff);.        sw
11e60 69 74 63 68 28 20 63 6d 70 61 66 66 20 29 7b 0a  itch( cmpaff ){.
11e70 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20 53            case S
11e80 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3a 0a  QLITE_AFF_BLOB:.
11e90 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
11ea0 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 63 61 73  k;.          cas
11eb0 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  e SQLITE_AFF_TEX
11ec0 54 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  T:.            a
11ed0 66 66 69 6e 69 74 79 5f 6f 6b 20 3d 20 28 69 64  ffinity_ok = (id
11ee0 78 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46  xaff==SQLITE_AFF
11ef0 5f 54 45 58 54 29 3b 0a 20 20 20 20 20 20 20 20  _TEXT);.        
11f00 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
11f10 20 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20       default:.  
11f20 20 20 20 20 20 20 20 20 20 20 61 66 66 69 6e 69            affini
11f30 74 79 5f 6f 6b 20 3d 20 73 71 6c 69 74 65 33 49  ty_ok = sqlite3I
11f40 73 4e 75 6d 65 72 69 63 41 66 66 69 6e 69 74 79  sNumericAffinity
11f50 28 69 64 78 61 66 66 29 3b 0a 20 20 20 20 20 20  (idxaff);.      
11f60 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20    }.      }..   
11f70 20 20 20 2f 2a 20 54 68 65 20 63 6f 6c 6c 61 74     /* The collat
11f80 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 75 73 65  ion sequence use
11f90 64 20 62 79 20 74 68 65 20 63 6f 6d 70 61 72 69  d by the compari
11fa0 73 6f 6e 2e 20 49 66 20 61 6e 20 69 6e 64 65 78  son. If an index
11fb0 20 69 73 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20   is to.      ** 
11fc0 62 65 20 75 73 65 64 20 69 6e 20 70 6c 61 63 65  be used in place
11fd0 20 6f 66 20 61 20 74 65 6d 70 2d 74 61 62 6c 65   of a temp-table
11fe0 2c 20 69 74 20 6d 75 73 74 20 62 65 20 6f 72 64  , it must be ord
11ff0 65 72 65 64 20 61 63 63 6f 72 64 69 6e 67 0a 20  ered according. 
12000 20 20 20 20 20 2a 2a 20 74 6f 20 74 68 69 73 20       ** to this 
12010 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
12020 63 65 2e 20 20 2a 2f 0a 0a 20 20 20 20 20 20 66  ce.  */..      f
12030 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49  or(pIdx=pTab->pI
12040 6e 64 65 78 3b 20 70 49 64 78 20 26 26 20 65 54  ndex; pIdx && eT
12050 79 70 65 3d 3d 30 20 26 26 20 61 66 66 69 6e 69  ype==0 && affini
12060 74 79 5f 6f 6b 3b 20 70 49 64 78 3d 70 49 64 78  ty_ok; pIdx=pIdx
12070 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
12080 20 20 69 66 28 20 70 49 64 78 2d 3e 6e 4b 65 79    if( pIdx->nKey
12090 43 6f 6c 3c 6e 45 78 70 72 20 29 20 63 6f 6e 74  Col<nExpr ) cont
120a0 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66  inue;.        if
120b0 28 20 6d 75 73 74 42 65 55 6e 69 71 75 65 20 26  ( mustBeUnique &
120c0 26 20 28 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c  & (pIdx->nKeyCol
120d0 21 3d 6e 45 78 70 72 20 7c 7c 20 21 49 73 55 6e  !=nExpr || !IsUn
120e0 69 71 75 65 49 6e 64 65 78 28 70 49 64 78 29 29  iqueIndex(pIdx))
120f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f   ){.          co
12100 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
12110 7d 0a 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  }..        for(i
12120 3d 30 3b 20 69 3c 6e 45 78 70 72 3b 20 69 2b 2b  =0; i<nExpr; i++
12130 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45 78 70  ){.          Exp
12140 72 20 2a 70 4c 68 73 20 3d 20 73 71 6c 69 74 65  r *pLhs = sqlite
12150 33 56 65 63 74 6f 72 46 69 65 6c 64 53 75 62 65  3VectorFieldSube
12160 78 70 72 28 70 58 2d 3e 70 4c 65 66 74 2c 20 69  xpr(pX->pLeft, i
12170 29 3b 0a 20 20 20 20 20 20 20 20 20 20 45 78 70  );.          Exp
12180 72 20 2a 70 52 68 73 20 3d 20 70 45 4c 69 73 74  r *pRhs = pEList
12190 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
121a0 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20          CollSeq 
121b0 2a 70 52 65 71 20 3d 20 73 71 6c 69 74 65 33 42  *pReq = sqlite3B
121c0 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c  inaryCompareColl
121d0 53 65 71 28 70 50 61 72 73 65 2c 20 70 4c 68 73  Seq(pParse, pLhs
121e0 2c 20 70 52 68 73 29 3b 0a 20 20 20 20 20 20 20  , pRhs);.       
121f0 20 20 20 69 6e 74 20 6a 3b 0a 0a 20 20 20 20 20     int j;..     
12200 20 20 20 20 20 61 73 73 65 72 74 28 20 70 52 65       assert( pRe
12210 71 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72  q || pParse->nEr
12220 72 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  r );.          i
12230 66 28 20 70 52 65 71 3d 3d 30 20 29 20 62 72 65  f( pReq==0 ) bre
12240 61 6b 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 66  ak;..          f
12250 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 45 78 70 72 3b  or(j=0; j<nExpr;
12260 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   j++){.         
12270 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61 69 43     if( pIdx->aiC
12280 6f 6c 75 6d 6e 5b 6a 5d 21 3d 70 52 68 73 2d 3e  olumn[j]!=pRhs->
12290 69 43 6f 6c 75 6d 6e 20 29 20 63 6f 6e 74 69 6e  iColumn ) contin
122a0 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue;.            
122b0 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 61 7a  assert( pIdx->az
122c0 43 6f 6c 6c 5b 6a 5d 20 29 3b 0a 20 20 20 20 20  Coll[j] );.     
122d0 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
122e0 65 33 53 74 72 49 43 6d 70 28 70 52 65 71 2d 3e  e3StrICmp(pReq->
122f0 7a 4e 61 6d 65 2c 20 70 49 64 78 2d 3e 61 7a 43  zName, pIdx->azC
12300 6f 6c 6c 5b 6a 5d 29 21 3d 30 20 29 20 63 6f 6e  oll[j])!=0 ) con
12310 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
12320 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
12330 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
12340 69 66 28 20 6a 3d 3d 6e 45 78 70 72 20 29 20 62  if( j==nExpr ) b
12350 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
12360 69 66 28 20 61 69 4d 61 70 20 29 20 61 69 4d 61  if( aiMap ) aiMa
12370 70 5b 69 5d 20 3d 20 6a 3b 0a 20 20 20 20 20 20  p[i] = j;.      
12380 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 66 28    }..        if(
12390 20 69 3d 3d 6e 45 78 70 72 20 29 7b 0a 20 20 20   i==nExpr ){.   
123a0 20 20 20 20 20 20 20 69 6e 74 20 69 41 64 64 72         int iAddr
123b0 20 3d 20 73 71 6c 69 74 65 33 43 6f 64 65 4f 6e   = sqlite3CodeOn
123c0 63 65 28 70 50 61 72 73 65 29 3b 20 56 64 62 65  ce(pParse); Vdbe
123d0 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
123e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
123f0 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f  beAddOp3(v, OP_O
12400 70 65 6e 52 65 61 64 2c 20 69 54 61 62 2c 20 70  penRead, iTab, p
12410 49 64 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b  Idx->tnum, iDb);
12420 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
12430 65 33 56 64 62 65 53 65 74 50 34 4b 65 79 49 6e  e3VdbeSetP4KeyIn
12440 66 6f 28 70 50 61 72 73 65 2c 20 70 49 64 78 29  fo(pParse, pIdx)
12450 3b 0a 20 20 20 20 20 20 20 20 20 20 56 64 62 65  ;.          Vdbe
12460 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22  Comment((v, "%s"
12470 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 29 3b  , pIdx->zName));
12480 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
12490 74 28 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45  t( IN_INDEX_INDE
124a0 58 5f 44 45 53 43 20 3d 3d 20 49 4e 5f 49 4e 44  X_DESC == IN_IND
124b0 45 58 5f 49 4e 44 45 58 5f 41 53 43 2b 31 20 29  EX_INDEX_ASC+1 )
124c0 3b 0a 20 20 20 20 20 20 20 20 20 20 65 54 79 70  ;.          eTyp
124d0 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44  e = IN_INDEX_IND
124e0 45 58 5f 41 53 43 20 2b 20 70 49 64 78 2d 3e 61  EX_ASC + pIdx->a
124f0 53 6f 72 74 4f 72 64 65 72 5b 30 5d 3b 0a 0a 20  SortOrder[0];.. 
12500 20 20 20 20 20 20 20 20 20 69 66 28 20 70 72 52           if( prR
12510 68 73 48 61 73 4e 75 6c 6c 20 29 7b 0a 20 20 20  hsHasNull ){.   
12520 20 20 20 20 20 20 20 20 20 2a 70 72 52 68 73 48           *prRhsH
12530 61 73 4e 75 6c 6c 20 3d 20 2b 2b 70 50 61 72 73  asNull = ++pPars
12540 65 2d 3e 6e 4d 65 6d 3b 0a 23 69 66 64 65 66 20  e->nMem;.#ifdef 
12550 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f  SQLITE_ENABLE_CO
12560 4c 55 4d 4e 5f 55 53 45 44 5f 4d 41 53 4b 0a 20  LUMN_USED_MASK. 
12570 20 20 20 20 20 20 20 20 20 20 20 69 36 34 20 6d             i64 m
12580 61 73 6b 20 3d 20 28 31 3c 3c 6e 45 78 70 72 29  ask = (1<<nExpr)
12590 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  -1;.            
125a0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
125b0 34 44 75 70 38 28 76 2c 20 4f 50 5f 43 6f 6c 75  4Dup8(v, OP_Colu
125c0 6d 6e 73 55 73 65 64 2c 20 0a 20 20 20 20 20 20  mnsUsed, .      
125d0 20 20 20 20 20 20 20 20 20 20 69 54 61 62 2c 20            iTab, 
125e0 30 2c 20 30 2c 20 28 75 38 2a 29 26 6d 61 73 6b  0, 0, (u8*)&mask
125f0 2c 20 50 34 5f 49 4e 54 36 34 29 3b 0a 23 65 6e  , P4_INT64);.#en
12600 64 69 66 0a 20 20 20 20 20 20 20 20 20 20 20 20  dif.            
12610 69 66 28 20 6e 45 78 70 72 3d 3d 31 20 29 7b 0a  if( nExpr==1 ){.
12620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
12630 6c 69 74 65 33 53 65 74 48 61 73 4e 75 6c 6c 46  lite3SetHasNullF
12640 6c 61 67 28 76 2c 20 69 54 61 62 2c 20 2a 70 72  lag(v, iTab, *pr
12650 52 68 73 48 61 73 4e 75 6c 6c 29 3b 0a 20 20 20  RhsHasNull);.   
12660 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
12670 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
12680 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
12690 48 65 72 65 28 76 2c 20 69 41 64 64 72 29 3b 0a  Here(v, iAddr);.
126a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
126b0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
126c0 2a 20 49 66 20 6e 6f 20 70 72 65 65 78 69 73 74  * If no preexist
126d0 69 6e 67 20 69 6e 64 65 78 20 69 73 20 61 76 61  ing index is ava
126e0 69 6c 61 62 6c 65 20 66 6f 72 20 74 68 65 20 49  ilable for the I
126f0 4e 20 63 6c 61 75 73 65 0a 20 20 2a 2a 20 61 6e  N clause.  ** an
12700 64 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 20  d IN_INDEX_NOOP 
12710 69 73 20 61 6e 20 61 6c 6c 6f 77 65 64 20 72 65  is an allowed re
12720 70 6c 79 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65  ply.  ** and the
12730 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f   RHS of the IN o
12740 70 65 72 61 74 6f 72 20 69 73 20 61 20 6c 69 73  perator is a lis
12750 74 2c 20 6e 6f 74 20 61 20 73 75 62 71 75 65 72  t, not a subquer
12760 79 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 52  y.  ** and the R
12770 48 53 20 69 73 20 6e 6f 74 20 63 6f 6e 73 74 61  HS is not consta
12780 6e 74 20 6f 72 20 68 61 73 20 74 77 6f 20 6f 72  nt or has two or
12790 20 66 65 77 65 72 20 74 65 72 6d 73 2c 0a 20 20   fewer terms,.  
127a0 2a 2a 20 74 68 65 6e 20 69 74 20 69 73 20 6e 6f  ** then it is no
127b0 74 20 77 6f 72 74 68 20 63 72 65 61 74 69 6e 67  t worth creating
127c0 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 74 61   an ephemeral ta
127d0 62 6c 65 20 74 6f 20 65 76 61 6c 75 61 74 65 0a  ble to evaluate.
127e0 20 20 2a 2a 20 74 68 65 20 49 4e 20 6f 70 65 72    ** the IN oper
127f0 61 74 6f 72 20 73 6f 20 72 65 74 75 72 6e 20 49  ator so return I
12800 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 2e 0a 20 20  N_INDEX_NOOP..  
12810 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d  */.  if( eType==
12820 30 0a 20 20 20 26 26 20 28 69 6e 46 6c 61 67 73  0.   && (inFlags
12830 20 26 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50   & IN_INDEX_NOOP
12840 5f 4f 4b 29 0a 20 20 20 26 26 20 21 45 78 70 72  _OK).   && !Expr
12850 48 61 73 50 72 6f 70 65 72 74 79 28 70 58 2c 20  HasProperty(pX, 
12860 45 50 5f 78 49 73 53 65 6c 65 63 74 29 0a 20 20  EP_xIsSelect).  
12870 20 26 26 20 28 21 73 71 6c 69 74 65 33 49 6e 52   && (!sqlite3InR
12880 68 73 49 73 43 6f 6e 73 74 61 6e 74 28 70 58 29  hsIsConstant(pX)
12890 20 7c 7c 20 70 58 2d 3e 78 2e 70 4c 69 73 74 2d   || pX->x.pList-
128a0 3e 6e 45 78 70 72 3c 3d 32 29 0a 20 20 29 7b 0a  >nExpr<=2).  ){.
128b0 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f 49      eType = IN_I
128c0 4e 44 45 58 5f 4e 4f 4f 50 3b 0a 20 20 7d 0a 0a  NDEX_NOOP;.  }..
128d0 20 20 69 66 28 20 65 54 79 70 65 3d 3d 30 20 29    if( eType==0 )
128e0 7b 0a 20 20 20 20 2f 2a 20 43 6f 75 6c 64 20 6e  {.    /* Could n
128f0 6f 74 20 66 69 6e 64 20 61 6e 20 65 78 69 73 74  ot find an exist
12900 69 6e 67 20 74 61 62 6c 65 20 6f 72 20 69 6e 64  ing table or ind
12910 65 78 20 74 6f 20 75 73 65 20 61 73 20 74 68 65  ex to use as the
12920 20 52 48 53 20 62 2d 74 72 65 65 2e 0a 20 20 20   RHS b-tree..   
12930 20 2a 2a 20 57 65 20 77 69 6c 6c 20 68 61 76 65   ** We will have
12940 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61 6e 20   to generate an 
12950 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20  ephemeral table 
12960 74 6f 20 64 6f 20 74 68 65 20 6a 6f 62 2e 0a 20  to do the job.. 
12970 20 20 20 2a 2f 0a 20 20 20 20 75 33 32 20 73 61     */.    u32 sa
12980 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70 20 3d 20  vedNQueryLoop = 
12990 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f  pParse->nQueryLo
129a0 6f 70 3b 0a 20 20 20 20 69 6e 74 20 72 4d 61 79  op;.    int rMay
129b0 48 61 76 65 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20  HaveNull = 0;.  
129c0 20 20 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44    eType = IN_IND
129d0 45 58 5f 45 50 48 3b 0a 20 20 20 20 69 66 28 20  EX_EPH;.    if( 
129e0 69 6e 46 6c 61 67 73 20 26 20 49 4e 5f 49 4e 44  inFlags & IN_IND
129f0 45 58 5f 4c 4f 4f 50 20 29 7b 0a 20 20 20 20 20  EX_LOOP ){.     
12a00 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c   pParse->nQueryL
12a10 6f 6f 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  oop = 0;.      i
12a20 66 28 20 70 58 2d 3e 70 4c 65 66 74 2d 3e 69 43  f( pX->pLeft->iC
12a30 6f 6c 75 6d 6e 3c 30 20 26 26 20 21 45 78 70 72  olumn<0 && !Expr
12a40 48 61 73 50 72 6f 70 65 72 74 79 28 70 58 2c 20  HasProperty(pX, 
12a50 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b  EP_xIsSelect) ){
12a60 0a 20 20 20 20 20 20 20 20 65 54 79 70 65 20 3d  .        eType =
12a70 20 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 3b   IN_INDEX_ROWID;
12a80 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
12a90 73 65 20 69 66 28 20 70 72 52 68 73 48 61 73 4e  se if( prRhsHasN
12aa0 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 2a 70 72  ull ){.      *pr
12ab0 52 68 73 48 61 73 4e 75 6c 6c 20 3d 20 72 4d 61  RhsHasNull = rMa
12ac0 79 48 61 76 65 4e 75 6c 6c 20 3d 20 2b 2b 70 50  yHaveNull = ++pP
12ad0 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
12ae0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64  }.    sqlite3Cod
12af0 65 53 75 62 73 65 6c 65 63 74 28 70 50 61 72 73  eSubselect(pPars
12b00 65 2c 20 70 58 2c 20 72 4d 61 79 48 61 76 65 4e  e, pX, rMayHaveN
12b10 75 6c 6c 2c 20 65 54 79 70 65 3d 3d 49 4e 5f 49  ull, eType==IN_I
12b20 4e 44 45 58 5f 52 4f 57 49 44 29 3b 0a 20 20 20  NDEX_ROWID);.   
12b30 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c   pParse->nQueryL
12b40 6f 6f 70 20 3d 20 73 61 76 65 64 4e 51 75 65 72  oop = savedNQuer
12b50 79 4c 6f 6f 70 3b 0a 20 20 7d 65 6c 73 65 7b 0a  yLoop;.  }else{.
12b60 20 20 20 20 70 58 2d 3e 69 54 61 62 6c 65 20 3d      pX->iTable =
12b70 20 69 54 61 62 3b 0a 20 20 7d 0a 0a 20 20 69 66   iTab;.  }..  if
12b80 28 20 61 69 4d 61 70 20 26 26 20 65 54 79 70 65  ( aiMap && eType
12b90 21 3d 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58  !=IN_INDEX_INDEX
12ba0 5f 41 53 43 20 26 26 20 65 54 79 70 65 21 3d 49  _ASC && eType!=I
12bb0 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 44 45  N_INDEX_INDEX_DE
12bc0 53 43 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 2c  SC ){.    int i,
12bd0 20 6e 3b 0a 20 20 20 20 6e 20 3d 20 73 71 6c 69   n;.    n = sqli
12be0 74 65 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a  te3ExprVectorSiz
12bf0 65 28 70 58 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  e(pX->pLeft);.  
12c00 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20    for(i=0; i<n; 
12c10 69 2b 2b 29 20 61 69 4d 61 70 5b 69 5d 20 3d 20  i++) aiMap[i] = 
12c20 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  i;.  }.  return 
12c30 65 54 79 70 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a  eType;.}.#endif.
12c40 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
12c50 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a  OMIT_SUBQUERY./*
12c60 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 45 78  .** Argument pEx
12c70 70 72 20 69 73 20 61 6e 20 28 3f 2c 20 3f 2e 2e  pr is an (?, ?..
12c80 2e 29 20 49 4e 28 2e 2e 2e 29 20 65 78 70 72 65  .) IN(...) expre
12c90 73 73 69 6f 6e 2e 20 54 68 69 73 20 0a 2a 2a 20  ssion. This .** 
12ca0 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74  function allocat
12cb0 65 73 20 61 6e 64 20 72 65 74 75 72 6e 73 20 61  es and returns a
12cc0 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20   nul-terminated 
12cd0 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e  string containin
12ce0 67 20 0a 2a 2a 20 74 68 65 20 61 66 66 69 6e 69  g .** the affini
12cf0 74 69 65 73 20 74 6f 20 62 65 20 75 73 65 64 20  ties to be used 
12d00 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20  for each column 
12d10 6f 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  of the compariso
12d20 6e 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 74  n..**.** It is t
12d30 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74  he responsibilit
12d40 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20  y of the caller 
12d50 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20 74  to ensure that t
12d60 68 65 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 73  he returned.** s
12d70 74 72 69 6e 67 20 69 73 20 65 76 65 6e 74 75 61  tring is eventua
12d80 6c 6c 79 20 66 72 65 65 64 20 75 73 69 6e 67 20  lly freed using 
12d90 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 29 2e  sqlite3DbFree().
12da0 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
12db0 2a 65 78 70 72 49 4e 41 66 66 69 6e 69 74 79 28  *exprINAffinity(
12dc0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
12dd0 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 45  xpr *pExpr){.  E
12de0 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78  xpr *pLeft = pEx
12df0 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 69 6e 74  pr->pLeft;.  int
12e00 20 6e 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 45   nVal = sqlite3E
12e10 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70 4c  xprVectorSize(pL
12e20 65 66 74 29 3b 0a 20 20 53 65 6c 65 63 74 20 2a  eft);.  Select *
12e30 70 53 65 6c 65 63 74 20 3d 20 28 70 45 78 70 72  pSelect = (pExpr
12e40 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 78 49 73  ->flags & EP_xIs
12e50 53 65 6c 65 63 74 29 20 3f 20 70 45 78 70 72 2d  Select) ? pExpr-
12e60 3e 78 2e 70 53 65 6c 65 63 74 20 3a 20 30 3b 0a  >x.pSelect : 0;.
12e70 20 20 63 68 61 72 20 2a 7a 52 65 74 3b 0a 0a 20    char *zRet;.. 
12e80 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
12e90 6f 70 3d 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20 7a  op==TK_IN );.  z
12ea0 52 65 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  Ret = sqlite3DbM
12eb0 61 6c 6c 6f 63 5a 65 72 6f 28 70 50 61 72 73 65  allocZero(pParse
12ec0 2d 3e 64 62 2c 20 6e 56 61 6c 2b 31 29 3b 0a 20  ->db, nVal+1);. 
12ed0 20 69 66 28 20 7a 52 65 74 20 29 7b 0a 20 20 20   if( zRet ){.   
12ee0 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
12ef0 69 3d 30 3b 20 69 3c 6e 56 61 6c 3b 20 69 2b 2b  i=0; i<nVal; i++
12f00 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  ){.      Expr *p
12f10 41 20 3d 20 73 71 6c 69 74 65 33 56 65 63 74 6f  A = sqlite3Vecto
12f20 72 46 69 65 6c 64 53 75 62 65 78 70 72 28 70 4c  rFieldSubexpr(pL
12f30 65 66 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 63  eft, i);.      c
12f40 68 61 72 20 61 20 3d 20 73 71 6c 69 74 65 33 45  har a = sqlite3E
12f50 78 70 72 41 66 66 69 6e 69 74 79 28 70 41 29 3b  xprAffinity(pA);
12f60 0a 20 20 20 20 20 20 69 66 28 20 70 53 65 6c 65  .      if( pSele
12f70 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 52  ct ){.        zR
12f80 65 74 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33 43  et[i] = sqlite3C
12f90 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 70  ompareAffinity(p
12fa0 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e  Select->pEList->
12fb0 61 5b 69 5d 2e 70 45 78 70 72 2c 20 61 29 3b 0a  a[i].pExpr, a);.
12fc0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
12fd0 20 20 20 20 20 7a 52 65 74 5b 69 5d 20 3d 20 61       zRet[i] = a
12fe0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
12ff0 20 20 20 20 7a 52 65 74 5b 6e 56 61 6c 5d 20 3d      zRet[nVal] =
13000 20 27 5c 30 27 3b 0a 20 20 7d 0a 20 20 72 65 74   '\0';.  }.  ret
13010 75 72 6e 20 7a 52 65 74 3b 0a 7d 0a 23 65 6e 64  urn zRet;.}.#end
13020 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
13030 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
13040 0a 2f 2a 0a 2a 2a 20 4c 6f 61 64 20 74 68 65 20  ./*.** Load the 
13050 50 61 72 73 65 20 6f 62 6a 65 63 74 20 70 61 73  Parse object pas
13060 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74  sed as the first
13070 20 61 72 67 75 6d 65 6e 74 20 77 69 74 68 20 61   argument with a
13080 6e 20 65 72 72 6f 72 20 0a 2a 2a 20 6d 65 73 73  n error .** mess
13090 61 67 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a  age of the form:
130a0 0a 2a 2a 0a 2a 2a 20 20 20 22 73 75 62 2d 73 65  .**.**   "sub-se
130b0 6c 65 63 74 20 72 65 74 75 72 6e 73 20 4e 20 63  lect returns N c
130c0 6f 6c 75 6d 6e 73 20 2d 20 65 78 70 65 63 74 65  olumns - expecte
130d0 64 20 4d 22 0a 2a 2f 20 20 20 0a 76 6f 69 64 20  d M".*/   .void 
130e0 73 71 6c 69 74 65 33 53 75 62 73 65 6c 65 63 74  sqlite3Subselect
130f0 45 72 72 6f 72 28 50 61 72 73 65 20 2a 70 50 61  Error(Parse *pPa
13100 72 73 65 2c 20 69 6e 74 20 6e 41 63 74 75 61 6c  rse, int nActual
13110 2c 20 69 6e 74 20 6e 45 78 70 65 63 74 29 7b 0a  , int nExpect){.
13120 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
13130 6d 74 20 3d 20 22 73 75 62 2d 73 65 6c 65 63 74  mt = "sub-select
13140 20 72 65 74 75 72 6e 73 20 25 64 20 63 6f 6c 75   returns %d colu
13150 6d 6e 73 20 2d 20 65 78 70 65 63 74 65 64 20 25  mns - expected %
13160 64 22 3b 0a 20 20 73 71 6c 69 74 65 33 45 72 72  d";.  sqlite3Err
13170 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 7a 46  orMsg(pParse, zF
13180 6d 74 2c 20 6e 41 63 74 75 61 6c 2c 20 6e 45 78  mt, nActual, nEx
13190 70 65 63 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  pect);.}.#endif.
131a0 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
131b0 63 6f 64 65 20 66 6f 72 20 73 63 61 6c 61 72 20  code for scalar 
131c0 73 75 62 71 75 65 72 69 65 73 20 75 73 65 64 20  subqueries used 
131d0 61 73 20 61 20 73 75 62 71 75 65 72 79 20 65 78  as a subquery ex
131e0 70 72 65 73 73 69 6f 6e 2c 20 45 58 49 53 54 53  pression, EXISTS
131f0 2c 0a 2a 2a 20 6f 72 20 49 4e 20 6f 70 65 72 61  ,.** or IN opera
13200 74 6f 72 73 2e 20 20 45 78 61 6d 70 6c 65 73 3a  tors.  Examples:
13210 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 53 45 4c 45  .**.**     (SELE
13220 43 54 20 61 20 46 52 4f 4d 20 62 29 20 20 20 20  CT a FROM b)    
13230 20 20 20 20 20 20 2d 2d 20 73 75 62 71 75 65 72        -- subquer
13240 79 0a 2a 2a 20 20 20 20 20 45 58 49 53 54 53 20  y.**     EXISTS 
13250 28 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 62  (SELECT a FROM b
13260 29 20 20 20 2d 2d 20 45 58 49 53 54 53 20 73 75  )   -- EXISTS su
13270 62 71 75 65 72 79 0a 2a 2a 20 20 20 20 20 78 20  bquery.**     x 
13280 49 4e 20 28 34 2c 35 2c 31 31 29 20 20 20 20 20  IN (4,5,11)     
13290 20 20 20 20 20 20 20 20 20 2d 2d 20 49 4e 20 6f           -- IN o
132a0 70 65 72 61 74 6f 72 20 77 69 74 68 20 6c 69 73  perator with lis
132b0 74 20 6f 6e 20 72 69 67 68 74 2d 68 61 6e 64 20  t on right-hand 
132c0 73 69 64 65 0a 2a 2a 20 20 20 20 20 78 20 49 4e  side.**     x IN
132d0 20 28 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20   (SELECT a FROM 
132e0 62 29 20 20 20 20 20 2d 2d 20 49 4e 20 6f 70 65  b)     -- IN ope
132f0 72 61 74 6f 72 20 77 69 74 68 20 73 75 62 71 75  rator with subqu
13300 65 72 79 20 6f 6e 20 74 68 65 20 72 69 67 68 74  ery on the right
13310 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 45 78 70 72  .**.** The pExpr
13320 20 70 61 72 61 6d 65 74 65 72 20 64 65 73 63 72   parameter descr
13330 69 62 65 73 20 74 68 65 20 65 78 70 72 65 73 73  ibes the express
13340 69 6f 6e 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  ion that contain
13350 73 20 74 68 65 20 49 4e 0a 2a 2a 20 6f 70 65 72  s the IN.** oper
13360 61 74 6f 72 20 6f 72 20 73 75 62 71 75 65 72 79  ator or subquery
13370 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d  ..**.** If param
13380 65 74 65 72 20 69 73 52 6f 77 69 64 20 69 73 20  eter isRowid is 
13390 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 65  non-zero, then e
133a0 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20  xpression pExpr 
133b0 69 73 20 67 75 61 72 61 6e 74 65 65 64 0a 2a 2a  is guaranteed.**
133c0 20 74 6f 20 62 65 20 6f 66 20 74 68 65 20 66 6f   to be of the fo
133d0 72 6d 20 22 3c 72 6f 77 69 64 3e 20 49 4e 20 28  rm "<rowid> IN (
133e0 3f 2c 20 3f 2c 20 3f 29 22 2c 20 77 68 65 72 65  ?, ?, ?)", where
133f0 20 3c 72 6f 77 69 64 3e 20 69 73 20 61 20 72 65   <rowid> is a re
13400 66 65 72 65 6e 63 65 0a 2a 2a 20 74 6f 20 73 6f  ference.** to so
13410 6d 65 20 69 6e 74 65 67 65 72 20 6b 65 79 20 63  me integer key c
13420 6f 6c 75 6d 6e 20 6f 66 20 61 20 74 61 62 6c 65  olumn of a table
13430 20 42 2d 54 72 65 65 2e 20 49 6e 20 74 68 69 73   B-Tree. In this
13440 20 63 61 73 65 2c 20 75 73 65 20 61 6e 0a 2a 2a   case, use an.**
13450 20 69 6e 74 6b 65 79 20 42 2d 54 72 65 65 20 74   intkey B-Tree t
13460 6f 20 73 74 6f 72 65 20 74 68 65 20 73 65 74 20  o store the set 
13470 6f 66 20 49 4e 28 2e 2e 2e 29 20 76 61 6c 75 65  of IN(...) value
13480 73 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65  s instead of the
13490 20 75 73 75 61 6c 0a 2a 2a 20 28 73 6c 6f 77 65   usual.** (slowe
134a0 72 29 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67  r) variable leng
134b0 74 68 20 6b 65 79 73 20 42 2d 54 72 65 65 2e 0a  th keys B-Tree..
134c0 2a 2a 0a 2a 2a 20 49 66 20 72 4d 61 79 48 61 76  **.** If rMayHav
134d0 65 4e 75 6c 6c 20 69 73 20 6e 6f 6e 2d 7a 65 72  eNull is non-zer
134e0 6f 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68  o, that means th
134f0 61 74 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e  at the operation
13500 20 69 73 20 61 6e 20 49 4e 0a 2a 2a 20 28 6e 6f   is an IN.** (no
13510 74 20 61 20 53 45 4c 45 43 54 20 6f 72 20 45 58  t a SELECT or EX
13520 49 53 54 53 29 20 61 6e 64 20 74 68 61 74 20 74  ISTS) and that t
13530 68 65 20 52 48 53 20 6d 69 67 68 74 20 63 6f 6e  he RHS might con
13540 74 61 69 6e 73 20 4e 55 4c 4c 73 2e 0a 2a 2a 20  tains NULLs..** 
13550 41 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  All this routine
13560 20 64 6f 65 73 20 69 73 20 69 6e 69 74 69 61 6c   does is initial
13570 69 7a 65 20 74 68 65 20 72 65 67 69 73 74 65 72  ize the register
13580 20 67 69 76 65 6e 20 62 79 20 72 4d 61 79 48 61   given by rMayHa
13590 76 65 4e 75 6c 6c 0a 2a 2a 20 74 6f 20 4e 55 4c  veNull.** to NUL
135a0 4c 2e 20 20 43 61 6c 6c 69 6e 67 20 72 6f 75 74  L.  Calling rout
135b0 69 6e 65 73 20 77 69 6c 6c 20 74 61 6b 65 20 63  ines will take c
135c0 61 72 65 20 6f 66 20 63 68 61 6e 67 69 6e 67 20  are of changing 
135d0 74 68 69 73 20 72 65 67 69 73 74 65 72 0a 2a 2a  this register.**
135e0 20 76 61 6c 75 65 20 74 6f 20 6e 6f 6e 2d 4e 55   value to non-NU
135f0 4c 4c 20 69 66 20 74 68 65 20 52 48 53 20 69 73  LL if the RHS is
13600 20 4e 55 4c 4c 2d 66 72 65 65 2e 0a 2a 2a 0a 2a   NULL-free..**.*
13610 2a 20 46 6f 72 20 61 20 53 45 4c 45 43 54 20 6f  * For a SELECT o
13620 72 20 45 58 49 53 54 53 20 6f 70 65 72 61 74 6f  r EXISTS operato
13630 72 2c 20 72 65 74 75 72 6e 20 74 68 65 20 72 65  r, return the re
13640 67 69 73 74 65 72 20 74 68 61 74 20 68 6f 6c 64  gister that hold
13650 73 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 2e  s the.** result.
13660 20 20 46 6f 72 20 61 20 6d 75 6c 74 69 2d 63 6f    For a multi-co
13670 6c 75 6d 6e 20 53 45 4c 45 43 54 2c 20 74 68 65  lumn SELECT, the
13680 20 72 65 73 75 6c 74 20 69 73 20 73 74 6f 72 65   result is store
13690 64 20 69 6e 20 61 20 63 6f 6e 74 69 67 75 6f 75  d in a contiguou
136a0 73 0a 2a 2a 20 61 72 72 61 79 20 6f 66 20 72 65  s.** array of re
136b0 67 69 73 74 65 72 73 20 61 6e 64 20 74 68 65 20  gisters and the 
136c0 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20  return value is 
136d0 74 68 65 20 72 65 67 69 73 74 65 72 20 6f 66 20  the register of 
136e0 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 0a 2a 2a  the left-most.**
136f0 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 2e 20   result column. 
13700 20 52 65 74 75 72 6e 20 30 20 66 6f 72 20 49 4e   Return 0 for IN
13710 20 6f 70 65 72 61 74 6f 72 73 20 6f 72 20 69 66   operators or if
13720 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
13730 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
13740 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
13750 59 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 6f 64  Y.int sqlite3Cod
13760 65 53 75 62 73 65 6c 65 63 74 28 0a 20 20 50 61  eSubselect(.  Pa
13770 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
13780 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
13790 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
137a0 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20  pr *pExpr,      
137b0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 49 4e 2c        /* The IN,
137c0 20 53 45 4c 45 43 54 2c 20 6f 72 20 45 58 49 53   SELECT, or EXIS
137d0 54 53 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  TS operator */. 
137e0 20 69 6e 74 20 72 48 61 73 4e 75 6c 6c 46 6c 61   int rHasNullFla
137f0 67 2c 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69  g,       /* Regi
13800 73 74 65 72 20 74 68 61 74 20 72 65 63 6f 72 64  ster that record
13810 73 20 77 68 65 74 68 65 72 20 4e 55 4c 4c 73 20  s whether NULLs 
13820 65 78 69 73 74 20 69 6e 20 52 48 53 20 2a 2f 0a  exist in RHS */.
13830 20 20 69 6e 74 20 69 73 52 6f 77 69 64 20 20 20    int isRowid   
13840 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
13850 74 72 75 65 2c 20 4c 48 53 20 6f 66 20 49 4e 20  true, LHS of IN 
13860 6f 70 65 72 61 74 6f 72 20 69 73 20 61 20 72 6f  operator is a ro
13870 77 69 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  wid */.){.  int 
13880 6a 6d 70 49 66 44 79 6e 61 6d 69 63 20 3d 20 2d  jmpIfDynamic = -
13890 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1;              
138a0 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 2d 74          /* One-t
138b0 69 6d 65 20 74 65 73 74 20 61 64 64 72 65 73 73  ime test address
138c0 20 2a 2f 0a 20 20 69 6e 74 20 72 52 65 67 20 3d   */.  int rReg =
138d0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
138e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
138f0 20 52 65 67 69 73 74 65 72 20 73 74 6f 72 69 6e   Register storin
13900 67 20 72 65 73 75 6c 74 69 6e 67 20 2a 2f 0a 20  g resulting */. 
13910 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74   Vdbe *v = sqlit
13920 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
13930 29 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 76  );.  if( NEVER(v
13940 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 20 30 3b  ==0) ) return 0;
13950 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  .  sqlite3ExprCa
13960 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b  chePush(pParse);
13970 0a 0a 20 20 2f 2a 20 54 68 65 20 65 76 61 6c 75  ..  /* The evalu
13980 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 49 4e 2f  ation of the IN/
13990 45 58 49 53 54 53 2f 53 45 4c 45 43 54 20 6d 75  EXISTS/SELECT mu
139a0 73 74 20 62 65 20 72 65 70 65 61 74 65 64 20 65  st be repeated e
139b0 76 65 72 79 20 74 69 6d 65 20 69 74 0a 20 20 2a  very time it.  *
139c0 2a 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  * is encountered
139d0 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20 66   if any of the f
139e0 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 74 72 75 65  ollowing is true
139f0 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 2a  :.  **.  **    *
13a00 20 20 54 68 65 20 72 69 67 68 74 2d 68 61 6e 64    The right-hand
13a10 20 73 69 64 65 20 69 73 20 61 20 63 6f 72 72 65   side is a corre
13a20 6c 61 74 65 64 20 73 75 62 71 75 65 72 79 0a 20  lated subquery. 
13a30 20 2a 2a 20 20 20 20 2a 20 20 54 68 65 20 72 69   **    *  The ri
13a40 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 69 73  ght-hand side is
13a50 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c   an expression l
13a60 69 73 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 76  ist containing v
13a70 61 72 69 61 62 6c 65 73 0a 20 20 2a 2a 20 20 20  ariables.  **   
13a80 20 2a 20 20 57 65 20 61 72 65 20 69 6e 73 69 64   *  We are insid
13a90 65 20 61 20 74 72 69 67 67 65 72 0a 20 20 2a 2a  e a trigger.  **
13aa0 0a 20 20 2a 2a 20 49 66 20 61 6c 6c 20 6f 66 20  .  ** If all of 
13ab0 74 68 65 20 61 62 6f 76 65 20 61 72 65 20 66 61  the above are fa
13ac0 6c 73 65 2c 20 74 68 65 6e 20 77 65 20 63 61 6e  lse, then we can
13ad0 20 72 75 6e 20 74 68 69 73 20 63 6f 64 65 20 6a   run this code j
13ae0 75 73 74 20 6f 6e 63 65 0a 20 20 2a 2a 20 73 61  ust once.  ** sa
13af0 76 65 20 74 68 65 20 72 65 73 75 6c 74 73 2c 20  ve the results, 
13b00 61 6e 64 20 72 65 75 73 65 20 74 68 65 20 73 61  and reuse the sa
13b10 6d 65 20 72 65 73 75 6c 74 20 6f 6e 20 73 75 62  me result on sub
13b20 73 65 71 75 65 6e 74 20 69 6e 76 6f 63 61 74 69  sequent invocati
13b30 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ons..  */.  if( 
13b40 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
13b50 28 70 45 78 70 72 2c 20 45 50 5f 56 61 72 53 65  (pExpr, EP_VarSe
13b60 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 6a 6d 70  lect) ){.    jmp
13b70 49 66 44 79 6e 61 6d 69 63 20 3d 20 73 71 6c 69  IfDynamic = sqli
13b80 74 65 33 43 6f 64 65 4f 6e 63 65 28 70 50 61 72  te3CodeOnce(pPar
13b90 73 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  se); VdbeCoverag
13ba0 65 28 76 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64  e(v);.  }..#ifnd
13bb0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  ef SQLITE_OMIT_E
13bc0 58 50 4c 41 49 4e 0a 20 20 69 66 28 20 70 50 61  XPLAIN.  if( pPa
13bd0 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20  rse->explain==2 
13be0 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 73  ){.    char *zMs
13bf0 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  g = sqlite3MPrin
13c00 74 66 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 22  tf(pParse->db, "
13c10 45 58 45 43 55 54 45 20 25 73 25 73 20 53 55 42  EXECUTE %s%s SUB
13c20 51 55 45 52 59 20 25 64 22 2c 0a 20 20 20 20 20  QUERY %d",.     
13c30 20 20 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63 3e     jmpIfDynamic>
13c40 3d 30 3f 22 22 3a 22 43 4f 52 52 45 4c 41 54 45  =0?"":"CORRELATE
13c50 44 20 22 2c 0a 20 20 20 20 20 20 20 20 70 45 78  D ",.        pEx
13c60 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 3f 22 4c  pr->op==TK_IN?"L
13c70 49 53 54 22 3a 22 53 43 41 4c 41 52 22 2c 0a 20  IST":"SCALAR",. 
13c80 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 69         pParse->i
13c90 4e 65 78 74 53 65 6c 65 63 74 49 64 0a 20 20 20  NextSelectId.   
13ca0 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   );.    sqlite3V
13cb0 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
13cc0 45 78 70 6c 61 69 6e 2c 20 70 50 61 72 73 65 2d  Explain, pParse-
13cd0 3e 69 53 65 6c 65 63 74 49 64 2c 20 30 2c 20 30  >iSelectId, 0, 0
13ce0 2c 20 7a 4d 73 67 2c 20 50 34 5f 44 59 4e 41 4d  , zMsg, P4_DYNAM
13cf0 49 43 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  IC);.  }.#endif.
13d00 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72  .  switch( pExpr
13d10 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ->op ){.    case
13d20 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20   TK_IN: {.      
13d30 69 6e 74 20 61 64 64 72 3b 20 20 20 20 20 20 20  int addr;       
13d40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
13d50 64 64 72 65 73 73 20 6f 66 20 4f 50 5f 4f 70 65  ddress of OP_Ope
13d60 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e 73 74 72  nEphemeral instr
13d70 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  uction */.      
13d80 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45  Expr *pLeft = pE
13d90 78 70 72 2d 3e 70 4c 65 66 74 3b 20 2f 2a 20 74  xpr->pLeft; /* t
13da0 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20 49 4e  he LHS of the IN
13db0 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20   operator */.   
13dc0 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79     KeyInfo *pKey
13dd0 49 6e 66 6f 20 3d 20 30 3b 20 20 20 20 20 20 2f  Info = 0;      /
13de0 2a 20 4b 65 79 20 69 6e 66 6f 72 6d 61 74 69 6f  * Key informatio
13df0 6e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e  n */.      int n
13e00 56 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Val;            
13e10 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
13e20 66 20 76 65 63 74 6f 72 20 70 4c 65 66 74 20 2a  f vector pLeft *
13e30 2f 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20 6e  /.      .      n
13e40 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Val = sqlite3Exp
13e50 72 56 65 63 74 6f 72 53 69 7a 65 28 70 4c 65 66  rVectorSize(pLef
13e60 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  t);.      assert
13e70 28 20 21 69 73 52 6f 77 69 64 20 7c 7c 20 6e 56  ( !isRowid || nV
13e80 61 6c 3d 3d 31 20 29 3b 0a 0a 20 20 20 20 20 20  al==1 );..      
13e90 2f 2a 20 57 68 65 74 68 65 72 20 74 68 69 73 20  /* Whether this 
13ea0 69 73 20 61 6e 20 27 78 20 49 4e 28 53 45 4c 45  is an 'x IN(SELE
13eb0 43 54 2e 2e 2e 29 27 20 6f 72 20 61 6e 20 27 78  CT...)' or an 'x
13ec0 20 49 4e 28 3c 65 78 70 72 6c 69 73 74 3e 29 27   IN(<exprlist>)'
13ed0 0a 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65 73  .      ** expres
13ee0 73 69 6f 6e 20 69 74 20 69 73 20 68 61 6e 64 6c  sion it is handl
13ef0 65 64 20 74 68 65 20 73 61 6d 65 20 77 61 79 2e  ed the same way.
13f00 20 20 41 6e 20 65 70 68 65 6d 65 72 61 6c 20 74    An ephemeral t
13f10 61 62 6c 65 20 69 73 20 0a 20 20 20 20 20 20 2a  able is .      *
13f20 2a 20 66 69 6c 6c 65 64 20 77 69 74 68 20 69 6e  * filled with in
13f30 64 65 78 20 6b 65 79 73 20 72 65 70 72 65 73 65  dex keys represe
13f40 6e 74 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74  nting the result
13f50 73 20 66 72 6f 6d 20 74 68 65 20 0a 20 20 20 20  s from the .    
13f60 20 20 2a 2a 20 53 45 4c 45 43 54 20 6f 72 20 74    ** SELECT or t
13f70 68 65 20 3c 65 78 70 72 6c 69 73 74 3e 2e 0a 20  he <exprlist>.. 
13f80 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
13f90 20 49 66 20 74 68 65 20 27 78 27 20 65 78 70 72   If the 'x' expr
13fa0 65 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75  ession is a colu
13fb0 6d 6e 20 76 61 6c 75 65 2c 20 6f 72 20 74 68 65  mn value, or the
13fc0 20 53 45 4c 45 43 54 2e 2e 2e 0a 20 20 20 20 20   SELECT....     
13fd0 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 72 65   ** statement re
13fe0 74 75 72 6e 73 20 61 20 63 6f 6c 75 6d 6e 20 76  turns a column v
13ff0 61 6c 75 65 2c 20 74 68 65 6e 20 74 68 65 20 61  alue, then the a
14000 66 66 69 6e 69 74 79 20 6f 66 20 74 68 61 74 0a  ffinity of that.
14010 20 20 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20        ** column 
14020 69 73 20 75 73 65 64 20 74 6f 20 62 75 69 6c 64  is used to build
14030 20 74 68 65 20 69 6e 64 65 78 20 6b 65 79 73 2e   the index keys.
14040 20 49 66 20 62 6f 74 68 20 27 78 27 20 61 6e 64   If both 'x' and
14050 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 53 45   the.      ** SE
14060 4c 45 43 54 2e 2e 2e 20 73 74 61 74 65 6d 65 6e  LECT... statemen
14070 74 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2c 20 74  t are columns, t
14080 68 65 6e 20 6e 75 6d 65 72 69 63 20 61 66 66 69  hen numeric affi
14090 6e 69 74 79 20 69 73 20 75 73 65 64 0a 20 20 20  nity is used.   
140a0 20 20 20 2a 2a 20 69 66 20 65 69 74 68 65 72 20     ** if either 
140b0 63 6f 6c 75 6d 6e 20 68 61 73 20 4e 55 4d 45 52  column has NUMER
140c0 49 43 20 6f 72 20 49 4e 54 45 47 45 52 20 61 66  IC or INTEGER af
140d0 66 69 6e 69 74 79 2e 20 49 66 20 6e 65 69 74 68  finity. If neith
140e0 65 72 0a 20 20 20 20 20 20 2a 2a 20 27 78 27 20  er.      ** 'x' 
140f0 6e 6f 72 20 74 68 65 20 53 45 4c 45 43 54 2e 2e  nor the SELECT..
14100 2e 20 73 74 61 74 65 6d 65 6e 74 20 61 72 65 20  . statement are 
14110 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 6e 75  columns, then nu
14120 6d 65 72 69 63 20 61 66 66 69 6e 69 74 79 0a 20  meric affinity. 
14130 20 20 20 20 20 2a 2a 20 69 73 20 75 73 65 64 2e       ** is used.
14140 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
14150 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20  pExpr->iTable = 
14160 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
14170 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c        addr = sql
14180 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
14190 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
141a0 61 6c 2c 20 0a 20 20 20 20 20 20 20 20 20 20 70  al, .          p
141b0 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 28 69  Expr->iTable, (i
141c0 73 52 6f 77 69 64 3f 30 3a 6e 56 61 6c 29 29 3b  sRowid?0:nVal));
141d0 0a 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 20  .      pKeyInfo 
141e0 3d 20 69 73 52 6f 77 69 64 20 3f 20 30 20 3a 20  = isRowid ? 0 : 
141f0 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c  sqlite3KeyInfoAl
14200 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  loc(pParse->db, 
14210 6e 56 61 6c 2c 20 31 29 3b 0a 0a 20 20 20 20 20  nVal, 1);..     
14220 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
14230 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78  erty(pExpr, EP_x
14240 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20  IsSelect) ){.   
14250 20 20 20 20 20 2f 2a 20 43 61 73 65 20 31 3a 20       /* Case 1: 
14260 20 20 20 20 65 78 70 72 20 49 4e 20 28 53 45 4c      expr IN (SEL
14270 45 43 54 20 2e 2e 2e 29 0a 20 20 20 20 20 20 20  ECT ...).       
14280 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 47   **.        ** G
14290 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
142a0 77 72 69 74 65 20 74 68 65 20 72 65 73 75 6c 74  write the result
142b0 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 20  s of the select 
142c0 69 6e 74 6f 20 74 68 65 20 74 65 6d 70 6f 72 61  into the tempora
142d0 72 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 61  ry.        ** ta
142e0 62 6c 65 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e  ble allocated an
142f0 64 20 6f 70 65 6e 65 64 20 61 62 6f 76 65 2e 0a  d opened above..
14300 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
14310 20 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65     Select *pSele
14320 63 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 53  ct = pExpr->x.pS
14330 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 20 20 45  elect;.        E
14340 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20  xprList *pEList 
14350 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73  = pSelect->pELis
14360 74 3b 0a 0a 20 20 20 20 20 20 20 20 61 73 73 65  t;..        asse
14370 72 74 28 20 21 69 73 52 6f 77 69 64 20 29 3b 0a  rt( !isRowid );.
14380 20 20 20 20 20 20 20 20 69 66 28 20 70 45 4c 69          if( pELi
14390 73 74 2d 3e 6e 45 78 70 72 21 3d 6e 56 61 6c 20  st->nExpr!=nVal 
143a0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
143b0 69 74 65 33 53 75 62 73 65 6c 65 63 74 45 72 72  ite3SubselectErr
143c0 6f 72 28 70 50 61 72 73 65 2c 20 70 45 4c 69 73  or(pParse, pELis
143d0 74 2d 3e 6e 45 78 70 72 2c 20 6e 56 61 6c 29 3b  t->nExpr, nVal);
143e0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
143f0 20 20 20 20 20 20 20 20 20 20 53 65 6c 65 63 74            Select
14400 44 65 73 74 20 64 65 73 74 3b 0a 20 20 20 20 20  Dest dest;.     
14410 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
14420 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
14430 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73  ectDestInit(&des
14440 74 2c 20 53 52 54 5f 53 65 74 2c 20 70 45 78 70  t, SRT_Set, pExp
14450 72 2d 3e 69 54 61 62 6c 65 29 3b 0a 20 20 20 20  r->iTable);.    
14460 20 20 20 20 20 20 64 65 73 74 2e 7a 41 66 66 53        dest.zAffS
14470 64 73 74 20 3d 20 65 78 70 72 49 4e 41 66 66 69  dst = exprINAffi
14480 6e 69 74 79 28 70 50 61 72 73 65 2c 20 70 45 78  nity(pParse, pEx
14490 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61  pr);.          a
144a0 73 73 65 72 74 28 20 28 70 45 78 70 72 2d 3e 69  ssert( (pExpr->i
144b0 54 61 62 6c 65 26 30 78 30 30 30 30 46 46 46 46  Table&0x0000FFFF
144c0 29 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  )==pExpr->iTable
144d0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53   );.          pS
144e0 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 20 3d 20  elect->iLimit = 
144f0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73  0;.          tes
14500 74 63 61 73 65 28 20 70 53 65 6c 65 63 74 2d 3e  tcase( pSelect->
14510 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69  selFlags & SF_Di
14520 73 74 69 6e 63 74 20 29 3b 0a 20 20 20 20 20 20  stinct );.      
14530 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4b      testcase( pK
14540 65 79 49 6e 66 6f 3d 3d 30 20 29 3b 20 2f 2a 20  eyInfo==0 ); /* 
14550 43 61 75 73 65 64 20 62 79 20 4f 4f 4d 20 69 6e  Caused by OOM in
14560 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41   sqlite3KeyInfoA
14570 6c 6c 6f 63 28 29 20 2a 2f 0a 20 20 20 20 20 20  lloc() */.      
14580 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
14590 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53  elect(pParse, pS
145a0 65 6c 65 63 74 2c 20 26 64 65 73 74 29 20 29 7b  elect, &dest) ){
145b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
145c0 69 74 65 33 44 62 46 72 65 65 28 70 50 61 72 73  ite3DbFree(pPars
145d0 65 2d 3e 64 62 2c 20 64 65 73 74 2e 7a 41 66 66  e->db, dest.zAff
145e0 53 64 73 74 29 3b 0a 20 20 20 20 20 20 20 20 20  Sdst);.         
145f0 20 20 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66     sqlite3KeyInf
14600 6f 55 6e 72 65 66 28 70 4b 65 79 49 6e 66 6f 29  oUnref(pKeyInfo)
14610 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  ;.            re
14620 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 20 20  turn 0;.        
14630 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71    }.          sq
14640 6c 69 74 65 33 44 62 46 72 65 65 28 70 50 61 72  lite3DbFree(pPar
14650 73 65 2d 3e 64 62 2c 20 64 65 73 74 2e 7a 41 66  se->db, dest.zAf
14660 66 53 64 73 74 29 3b 0a 20 20 20 20 20 20 20 20  fSdst);.        
14670 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e    assert( pKeyIn
14680 66 6f 21 3d 30 20 29 3b 20 2f 2a 20 4f 4f 4d 20  fo!=0 ); /* OOM 
14690 77 69 6c 6c 20 63 61 75 73 65 20 65 78 69 74 20  will cause exit 
146a0 61 66 74 65 72 20 73 71 6c 69 74 65 33 53 65 6c  after sqlite3Sel
146b0 65 63 74 28 29 20 2a 2f 0a 20 20 20 20 20 20 20  ect() */.       
146c0 20 20 20 61 73 73 65 72 74 28 20 70 45 4c 69 73     assert( pELis
146d0 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  t!=0 );.        
146e0 20 20 61 73 73 65 72 74 28 20 70 45 4c 69 73 74    assert( pEList
146f0 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20 20  ->nExpr>0 );.   
14700 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73         assert( s
14710 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49 73 57  qlite3KeyInfoIsW
14720 72 69 74 65 61 62 6c 65 28 70 4b 65 79 49 6e 66  riteable(pKeyInf
14730 6f 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  o) );.          
14740 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 61 6c 3b  for(i=0; i<nVal;
14750 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
14760 20 20 20 45 78 70 72 20 2a 70 20 3d 20 28 6e 56     Expr *p = (nV
14770 61 6c 3e 31 29 20 3f 20 73 71 6c 69 74 65 33 56  al>1) ? sqlite3V
14780 65 63 74 6f 72 46 69 65 6c 64 53 75 62 65 78 70  ectorFieldSubexp
14790 72 28 70 4c 65 66 74 2c 20 69 29 20 3a 20 70 4c  r(pLeft, i) : pL
147a0 65 66 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20  eft;.           
147b0 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c   pKeyInfo->aColl
147c0 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33 42 69 6e  [i] = sqlite3Bin
147d0 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65  aryCompareCollSe
147e0 71 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  q(.             
147f0 20 20 20 70 50 61 72 73 65 2c 20 70 2c 20 70 45     pParse, p, pE
14800 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
14810 0a 20 20 20 20 20 20 20 20 20 20 20 20 29 3b 0a  .            );.
14820 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
14830 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
14840 65 20 69 66 28 20 41 4c 57 41 59 53 28 70 45 78  e if( ALWAYS(pEx
14850 70 72 2d 3e 78 2e 70 4c 69 73 74 21 3d 30 29 20  pr->x.pList!=0) 
14860 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 61  ){.        /* Ca
14870 73 65 20 32 3a 20 20 20 20 20 65 78 70 72 20 49  se 2:     expr I
14880 4e 20 28 65 78 70 72 6c 69 73 74 29 0a 20 20 20  N (exprlist).   
14890 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
148a0 2a 2a 20 46 6f 72 20 65 61 63 68 20 65 78 70 72  ** For each expr
148b0 65 73 73 69 6f 6e 2c 20 62 75 69 6c 64 20 61 6e  ession, build an
148c0 20 69 6e 64 65 78 20 6b 65 79 20 66 72 6f 6d 20   index key from 
148d0 74 68 65 20 65 76 61 6c 75 61 74 69 6f 6e 20 61  the evaluation a
148e0 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 74  nd.        ** st
148f0 6f 72 65 20 69 74 20 69 6e 20 74 68 65 20 74 65  ore it in the te
14900 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2e 20 49  mporary table. I
14910 66 20 3c 65 78 70 72 3e 20 69 73 20 61 20 63 6f  f <expr> is a co
14920 6c 75 6d 6e 2c 20 74 68 65 6e 20 75 73 65 0a 20  lumn, then use. 
14930 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 63         ** that c
14940 6f 6c 75 6d 6e 73 20 61 66 66 69 6e 69 74 79 20  olumns affinity 
14950 77 68 65 6e 20 62 75 69 6c 64 69 6e 67 20 69 6e  when building in
14960 64 65 78 20 6b 65 79 73 2e 20 49 66 20 3c 65 78  dex keys. If <ex
14970 70 72 3e 20 69 73 20 6e 6f 74 0a 20 20 20 20 20  pr> is not.     
14980 20 20 20 2a 2a 20 61 20 63 6f 6c 75 6d 6e 2c 20     ** a column, 
14990 75 73 65 20 6e 75 6d 65 72 69 63 20 61 66 66 69  use numeric affi
149a0 6e 69 74 79 2e 0a 20 20 20 20 20 20 20 20 2a 2f  nity..        */
149b0 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 61 66  .        char af
149c0 66 69 6e 69 74 79 3b 20 20 20 20 20 20 20 20 20  finity;         
149d0 20 20 20 2f 2a 20 41 66 66 69 6e 69 74 79 20 6f     /* Affinity o
149e0 66 20 74 68 65 20 4c 48 53 20 6f 66 20 74 68 65  f the LHS of the
149f0 20 49 4e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69   IN */.        i
14a00 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20 45 78  nt i;.        Ex
14a10 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20  prList *pList = 
14a20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a  pExpr->x.pList;.
14a30 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 45          struct E
14a40 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
14a50 74 65 6d 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  tem;.        int
14a60 20 72 31 2c 20 72 32 2c 20 72 33 3b 0a 0a 20 20   r1, r2, r3;..  
14a70 20 20 20 20 20 20 61 66 66 69 6e 69 74 79 20 3d        affinity =
14a80 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69   sqlite3ExprAffi
14a90 6e 69 74 79 28 70 4c 65 66 74 29 3b 0a 20 20 20  nity(pLeft);.   
14aa0 20 20 20 20 20 69 66 28 20 21 61 66 66 69 6e 69       if( !affini
14ab0 74 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ty ){.          
14ac0 61 66 66 69 6e 69 74 79 20 3d 20 53 51 4c 49 54  affinity = SQLIT
14ad0 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 20 20  E_AFF_BLOB;.    
14ae0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
14af0 28 20 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20  ( pKeyInfo ){.  
14b00 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
14b10 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49 73  sqlite3KeyInfoIs
14b20 57 72 69 74 65 61 62 6c 65 28 70 4b 65 79 49 6e  Writeable(pKeyIn
14b30 66 6f 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20  fo) );.         
14b40 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c   pKeyInfo->aColl
14b50 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 45 78 70  [0] = sqlite3Exp
14b60 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
14b70 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a   pExpr->pLeft);.
14b80 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
14b90 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75     /* Loop throu
14ba0 67 68 20 65 61 63 68 20 65 78 70 72 65 73 73 69  gh each expressi
14bb0 6f 6e 20 69 6e 20 3c 65 78 70 72 6c 69 73 74 3e  on in <exprlist>
14bc0 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 31 20  . */.        r1 
14bd0 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
14be0 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
14bf0 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65       r2 = sqlite
14c00 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
14c10 73 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  se);.        if(
14c20 20 69 73 52 6f 77 69 64 20 29 20 73 71 6c 69 74   isRowid ) sqlit
14c30 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
14c40 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 32 29 3b  OP_Null, 0, r2);
14c50 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 70  .        for(i=p
14c60 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70 49 74  List->nExpr, pIt
14c70 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3e 30  em=pList->a; i>0
14c80 3b 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i--, pItem++){
14c90 0a 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20  .          Expr 
14ca0 2a 70 45 32 20 3d 20 70 49 74 65 6d 2d 3e 70 45  *pE2 = pItem->pE
14cb0 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 69  xpr;.          i
14cc0 6e 74 20 69 56 61 6c 54 6f 49 6e 73 3b 0a 0a 20  nt iValToIns;.. 
14cd0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74           /* If t
14ce0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
14cf0 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 20 74 68   not constant th
14d00 65 6e 20 77 65 20 77 69 6c 6c 20 6e 65 65 64 20  en we will need 
14d10 74 6f 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  to.          ** 
14d20 64 69 73 61 62 6c 65 20 74 68 65 20 74 65 73 74  disable the test
14d30 20 74 68 61 74 20 77 61 73 20 67 65 6e 65 72 61   that was genera
14d40 74 65 64 20 61 62 6f 76 65 20 74 68 61 74 20 6d  ted above that m
14d50 61 6b 65 73 20 73 75 72 65 0a 20 20 20 20 20 20  akes sure.      
14d60 20 20 20 20 2a 2a 20 74 68 69 73 20 63 6f 64 65      ** this code
14d70 20 6f 6e 6c 79 20 65 78 65 63 75 74 65 73 20 6f   only executes o
14d80 6e 63 65 2e 20 20 42 65 63 61 75 73 65 20 66 6f  nce.  Because fo
14d90 72 20 61 20 6e 6f 6e 2d 63 6f 6e 73 74 61 6e 74  r a non-constant
14da0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 65 78  .          ** ex
14db0 70 72 65 73 73 69 6f 6e 20 77 65 20 6e 65 65 64  pression we need
14dc0 20 74 6f 20 72 65 72 75 6e 20 74 68 69 73 20 63   to rerun this c
14dd0 6f 64 65 20 65 61 63 68 20 74 69 6d 65 2e 0a 20  ode each time.. 
14de0 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
14df0 20 20 20 20 20 20 69 66 28 20 6a 6d 70 49 66 44        if( jmpIfD
14e00 79 6e 61 6d 69 63 3e 3d 30 20 26 26 20 21 73 71  ynamic>=0 && !sq
14e10 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
14e20 61 6e 74 28 70 45 32 29 20 29 7b 0a 20 20 20 20  ant(pE2) ){.    
14e30 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
14e40 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28  dbeChangeToNoop(
14e50 76 2c 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63 29  v, jmpIfDynamic)
14e60 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a 6d  ;.            jm
14e70 70 49 66 44 79 6e 61 6d 69 63 20 3d 20 2d 31 3b  pIfDynamic = -1;
14e80 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  .          }..  
14e90 20 20 20 20 20 20 20 20 2f 2a 20 45 76 61 6c 75          /* Evalu
14ea0 61 74 65 20 74 68 65 20 65 78 70 72 65 73 73 69  ate the expressi
14eb0 6f 6e 20 61 6e 64 20 69 6e 73 65 72 74 20 69 74  on and insert it
14ec0 20 69 6e 74 6f 20 74 68 65 20 74 65 6d 70 20 74   into the temp t
14ed0 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  able */.        
14ee0 20 20 69 66 28 20 69 73 52 6f 77 69 64 20 26 26    if( isRowid &&
14ef0 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e   sqlite3ExprIsIn
14f00 74 65 67 65 72 28 70 45 32 2c 20 26 69 56 61 6c  teger(pE2, &iVal
14f10 54 6f 49 6e 73 29 20 29 7b 0a 20 20 20 20 20 20  ToIns) ){.      
14f20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
14f30 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e  eAddOp3(v, OP_In
14f40 73 65 72 74 49 6e 74 2c 20 70 45 78 70 72 2d 3e  sertInt, pExpr->
14f50 69 54 61 62 6c 65 2c 20 72 32 2c 20 69 56 61 6c  iTable, r2, iVal
14f60 54 6f 49 6e 73 29 3b 0a 20 20 20 20 20 20 20 20  ToIns);.        
14f70 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
14f80 20 20 20 20 20 72 33 20 3d 20 73 71 6c 69 74 65       r3 = sqlite
14f90 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28  3ExprCodeTarget(
14fa0 70 50 61 72 73 65 2c 20 70 45 32 2c 20 72 31 29  pParse, pE2, r1)
14fb0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
14fc0 28 20 69 73 52 6f 77 69 64 20 29 7b 0a 20 20 20  ( isRowid ){.   
14fd0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
14fe0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
14ff0 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 72 33  OP_MustBeInt, r3
15000 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
15010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15020 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72    sqlite3VdbeCur
15030 72 65 6e 74 41 64 64 72 28 76 29 2b 32 29 3b 0a  rentAddr(v)+2);.
15040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 56 64                Vd
15050 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
15060 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
15070 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
15080 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 70 45 78  , OP_Insert, pEx
15090 70 72 2d 3e 69 54 61 62 6c 65 2c 20 72 32 2c 20  pr->iTable, r2, 
150a0 72 33 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  r3);.           
150b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
150c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
150d0 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61  eAddOp4(v, OP_Ma
150e0 6b 65 52 65 63 6f 72 64 2c 20 72 33 2c 20 31 2c  keRecord, r3, 1,
150f0 20 72 32 2c 20 26 61 66 66 69 6e 69 74 79 2c 20   r2, &affinity, 
15100 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  1);.            
15110 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
15120 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  heAffinityChange
15130 28 70 50 61 72 73 65 2c 20 72 33 2c 20 31 29 3b  (pParse, r3, 1);
15140 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
15150 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
15160 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74  (v, OP_IdxInsert
15170 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
15180 20 72 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20   r2);.          
15190 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
151a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
151b0 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
151c0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
151d0 72 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  r1);.        sql
151e0 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
151f0 65 67 28 70 50 61 72 73 65 2c 20 72 32 29 3b 0a  eg(pParse, r2);.
15200 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
15210 28 20 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20  ( pKeyInfo ){.  
15220 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
15230 65 43 68 61 6e 67 65 50 34 28 76 2c 20 61 64 64  eChangeP4(v, add
15240 72 2c 20 28 76 6f 69 64 20 2a 29 70 4b 65 79 49  r, (void *)pKeyI
15250 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29  nfo, P4_KEYINFO)
15260 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
15270 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
15280 20 20 63 61 73 65 20 54 4b 5f 45 58 49 53 54 53    case TK_EXISTS
15290 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45  :.    case TK_SE
152a0 4c 45 43 54 3a 0a 20 20 20 20 64 65 66 61 75 6c  LECT:.    defaul
152b0 74 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 43 61  t: {.      /* Ca
152c0 73 65 20 33 3a 20 20 20 20 28 53 45 4c 45 43 54  se 3:    (SELECT
152d0 20 2e 2e 2e 20 46 52 4f 4d 20 2e 2e 2e 29 0a 20   ... FROM ...). 
152e0 20 20 20 20 20 2a 2a 20 20 20 20 20 6f 72 3a 20       **     or: 
152f0 20 20 20 45 58 49 53 54 53 28 53 45 4c 45 43 54     EXISTS(SELECT
15300 20 2e 2e 2e 20 46 52 4f 4d 20 2e 2e 2e 29 0a 20   ... FROM ...). 
15310 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
15320 20 46 6f 72 20 61 20 53 45 4c 45 43 54 2c 20 67   For a SELECT, g
15330 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
15340 70 75 74 20 74 68 65 20 76 61 6c 75 65 73 20 66  put the values f
15350 6f 72 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 6f  or all columns o
15360 66 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 66  f.      ** the f
15370 69 72 73 74 20 72 6f 77 20 69 6e 74 6f 20 61 6e  irst row into an
15380 20 61 72 72 61 79 20 6f 66 20 72 65 67 69 73 74   array of regist
15390 65 72 73 20 61 6e 64 20 72 65 74 75 72 6e 20 74  ers and return t
153a0 68 65 20 69 6e 64 65 78 20 6f 66 0a 20 20 20 20  he index of.    
153b0 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74 20 72    ** the first r
153c0 65 67 69 73 74 65 72 2e 0a 20 20 20 20 20 20 2a  egister..      *
153d0 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68  *.      ** If th
153e0 69 73 20 69 73 20 61 6e 20 45 58 49 53 54 53 2c  is is an EXISTS,
153f0 20 77 72 69 74 65 20 61 6e 20 69 6e 74 65 67 65   write an intege
15400 72 20 30 20 28 6e 6f 74 20 65 78 69 73 74 73 29  r 0 (not exists)
15410 20 6f 72 20 31 20 28 65 78 69 73 74 73 29 0a 20   or 1 (exists). 
15420 20 20 20 20 20 2a 2a 20 69 6e 74 6f 20 61 20 72       ** into a r
15430 65 67 69 73 74 65 72 20 61 6e 64 20 72 65 74 75  egister and retu
15440 72 6e 20 74 68 61 74 20 72 65 67 69 73 74 65 72  rn that register
15450 20 6e 75 6d 62 65 72 2e 0a 20 20 20 20 20 20 2a   number..      *
15460 2a 0a 20 20 20 20 20 20 2a 2a 20 49 6e 20 62 6f  *.      ** In bo
15470 74 68 20 63 61 73 65 73 2c 20 74 68 65 20 71 75  th cases, the qu
15480 65 72 79 20 69 73 20 61 75 67 6d 65 6e 74 65 64  ery is augmented
15490 20 77 69 74 68 20 22 4c 49 4d 49 54 20 31 22 2e   with "LIMIT 1".
154a0 20 20 41 6e 79 20 0a 20 20 20 20 20 20 2a 2a 20    Any .      ** 
154b0 70 72 65 65 78 69 73 74 69 6e 67 20 6c 69 6d 69  preexisting limi
154c0 74 20 69 73 20 64 69 73 63 61 72 64 65 64 20 69  t is discarded i
154d0 6e 20 70 6c 61 63 65 20 6f 66 20 74 68 65 20 6e  n place of the n
154e0 65 77 20 4c 49 4d 49 54 20 31 2e 0a 20 20 20 20  ew LIMIT 1..    
154f0 20 20 2a 2f 0a 20 20 20 20 20 20 53 65 6c 65 63    */.      Selec
15500 74 20 2a 70 53 65 6c 3b 20 20 20 20 20 20 20 20  t *pSel;        
15510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15520 20 2f 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65   /* SELECT state
15530 6d 65 6e 74 20 74 6f 20 65 6e 63 6f 64 65 20 2a  ment to encode *
15540 2f 0a 20 20 20 20 20 20 53 65 6c 65 63 74 44 65  /.      SelectDe
15550 73 74 20 64 65 73 74 3b 20 20 20 20 20 20 20 20  st dest;        
15560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15570 20 48 6f 77 20 74 6f 20 64 65 61 6c 20 77 69 74   How to deal wit
15580 68 20 53 45 4c 45 43 54 20 72 65 73 75 6c 74 20  h SELECT result 
15590 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 52 65  */.      int nRe
155a0 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g;              
155b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
155c0 2a 20 52 65 67 69 73 74 65 72 73 20 74 6f 20 61  * Registers to a
155d0 6c 6c 6f 63 61 74 65 20 2a 2f 0a 0a 20 20 20 20  llocate */..    
155e0 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
155f0 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53 54 53  r->op==TK_EXISTS
15600 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
15610 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
15620 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 20 20 20 20  K_SELECT );.    
15630 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
15640 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53 54 53 20 7c  >op==TK_EXISTS |
15650 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  | pExpr->op==TK_
15660 53 45 4c 45 43 54 20 29 3b 0a 20 20 20 20 20 20  SELECT );.      
15670 61 73 73 65 72 74 28 20 45 78 70 72 48 61 73 50  assert( ExprHasP
15680 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
15690 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a  P_xIsSelect) );.
156a0 0a 20 20 20 20 20 20 70 53 65 6c 20 3d 20 70 45  .      pSel = pE
156b0 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 3b 0a  xpr->x.pSelect;.
156c0 20 20 20 20 20 20 6e 52 65 67 20 3d 20 70 45 78        nReg = pEx
156d0 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43  pr->op==TK_SELEC
156e0 54 20 3f 20 70 53 65 6c 2d 3e 70 45 4c 69 73 74  T ? pSel->pEList
156f0 2d 3e 6e 45 78 70 72 20 3a 20 31 3b 0a 20 20 20  ->nExpr : 1;.   
15700 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
15710 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20  DestInit(&dest, 
15720 30 2c 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b  0, pParse->nMem+
15730 31 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  1);.      pParse
15740 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 67 3b 0a  ->nMem += nReg;.
15750 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
15760 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29  >op==TK_SELECT )
15770 7b 0a 20 20 20 20 20 20 20 20 64 65 73 74 2e 65  {.        dest.e
15780 44 65 73 74 20 3d 20 53 52 54 5f 4d 65 6d 3b 0a  Dest = SRT_Mem;.
15790 20 20 20 20 20 20 20 20 64 65 73 74 2e 69 53 64          dest.iSd
157a0 73 74 20 3d 20 64 65 73 74 2e 69 53 44 50 61 72  st = dest.iSDPar
157b0 6d 3b 0a 20 20 20 20 20 20 20 20 64 65 73 74 2e  m;.        dest.
157c0 6e 53 64 73 74 20 3d 20 6e 52 65 67 3b 0a 20 20  nSdst = nReg;.  
157d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
157e0 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 75  eAddOp3(v, OP_Nu
157f0 6c 6c 2c 20 30 2c 20 64 65 73 74 2e 69 53 44 50  ll, 0, dest.iSDP
15800 61 72 6d 2c 20 64 65 73 74 2e 69 53 44 50 61 72  arm, dest.iSDPar
15810 6d 2b 6e 52 65 67 2d 31 29 3b 0a 20 20 20 20 20  m+nReg-1);.     
15820 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
15830 76 2c 20 22 49 6e 69 74 20 73 75 62 71 75 65 72  v, "Init subquer
15840 79 20 72 65 73 75 6c 74 22 29 29 3b 0a 20 20 20  y result"));.   
15850 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
15860 20 20 64 65 73 74 2e 65 44 65 73 74 20 3d 20 53    dest.eDest = S
15870 52 54 5f 45 78 69 73 74 73 3b 0a 20 20 20 20 20  RT_Exists;.     
15880 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
15890 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
158a0 65 72 2c 20 30 2c 20 64 65 73 74 2e 69 53 44 50  er, 0, dest.iSDP
158b0 61 72 6d 29 3b 0a 20 20 20 20 20 20 20 20 56 64  arm);.        Vd
158c0 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 49  beComment((v, "I
158d0 6e 69 74 20 45 58 49 53 54 53 20 72 65 73 75 6c  nit EXISTS resul
158e0 74 22 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  t"));.      }.  
158f0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
15900 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62  elete(pParse->db
15910 2c 20 70 53 65 6c 2d 3e 70 4c 69 6d 69 74 29 3b  , pSel->pLimit);
15920 0a 20 20 20 20 20 20 70 53 65 6c 2d 3e 70 4c 69  .      pSel->pLi
15930 6d 69 74 20 3d 20 73 71 6c 69 74 65 33 50 45 78  mit = sqlite3PEx
15940 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 49 4e  pr(pParse, TK_IN
15950 54 45 47 45 52 2c 20 30 2c 20 30 2c 0a 20 20 20  TEGER, 0, 0,.   
15960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
15980 73 71 6c 69 74 65 33 49 6e 74 54 6f 6b 65 6e 73  sqlite3IntTokens
15990 5b 31 5d 29 3b 0a 20 20 20 20 20 20 70 53 65 6c  [1]);.      pSel
159a0 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20  ->iLimit = 0;.  
159b0 20 20 20 20 70 53 65 6c 2d 3e 73 65 6c 46 6c 61      pSel->selFla
159c0 67 73 20 26 3d 20 7e 53 46 5f 4d 75 6c 74 69 56  gs &= ~SF_MultiV
159d0 61 6c 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20  alue;.      if( 
159e0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
159f0 61 72 73 65 2c 20 70 53 65 6c 2c 20 26 64 65 73  arse, pSel, &des
15a00 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  t) ){.        re
15a10 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a  turn 0;.      }.
15a20 20 20 20 20 20 20 72 52 65 67 20 3d 20 64 65 73        rReg = des
15a30 74 2e 69 53 44 50 61 72 6d 3b 0a 20 20 20 20 20  t.iSDParm;.     
15a40 20 45 78 70 72 53 65 74 56 56 41 50 72 6f 70 65   ExprSetVVAPrope
15a50 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 4e 6f  rty(pExpr, EP_No
15a60 52 65 64 75 63 65 29 3b 0a 20 20 20 20 20 20 62  Reduce);.      b
15a70 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
15a80 0a 20 20 69 66 28 20 72 48 61 73 4e 75 6c 6c 46  .  if( rHasNullF
15a90 6c 61 67 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  lag ){.    sqlit
15aa0 65 33 53 65 74 48 61 73 4e 75 6c 6c 46 6c 61 67  e3SetHasNullFlag
15ab0 28 76 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  (v, pExpr->iTabl
15ac0 65 2c 20 72 48 61 73 4e 75 6c 6c 46 6c 61 67 29  e, rHasNullFlag)
15ad0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6a 6d 70  ;.  }..  if( jmp
15ae0 49 66 44 79 6e 61 6d 69 63 3e 3d 30 20 29 7b 0a  IfDynamic>=0 ){.
15af0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
15b00 75 6d 70 48 65 72 65 28 76 2c 20 6a 6d 70 49 66  umpHere(v, jmpIf
15b10 44 79 6e 61 6d 69 63 29 3b 0a 20 20 7d 0a 20 20  Dynamic);.  }.  
15b20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
15b30 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 0a 20 20  Pop(pParse);..  
15b40 72 65 74 75 72 6e 20 72 52 65 67 3b 0a 7d 0a 23  return rReg;.}.#
15b50 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
15b60 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f  OMIT_SUBQUERY */
15b70 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
15b80 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f  _OMIT_SUBQUERY./
15b90 2a 0a 2a 2a 20 45 78 70 72 20 70 49 6e 20 69 73  *.** Expr pIn is
15ba0 20 61 6e 20 49 4e 28 2e 2e 2e 29 20 65 78 70 72   an IN(...) expr
15bb0 65 73 73 69 6f 6e 2e 20 54 68 69 73 20 66 75 6e  ession. This fun
15bc0 63 74 69 6f 6e 20 63 68 65 63 6b 73 20 74 68 61  ction checks tha
15bd0 74 20 74 68 65 20 0a 2a 2a 20 73 75 62 2d 73 65  t the .** sub-se
15be0 6c 65 63 74 20 6f 6e 20 74 68 65 20 52 48 53 20  lect on the RHS 
15bf0 6f 66 20 74 68 65 20 49 4e 28 29 20 6f 70 65 72  of the IN() oper
15c00 61 74 6f 72 20 68 61 73 20 74 68 65 20 73 61 6d  ator has the sam
15c10 65 20 6e 75 6d 62 65 72 20 6f 66 20 0a 2a 2a 20  e number of .** 
15c20 63 6f 6c 75 6d 6e 73 20 61 73 20 74 68 65 20 76  columns as the v
15c30 65 63 74 6f 72 20 6f 6e 20 74 68 65 20 4c 48 53  ector on the LHS
15c40 2e 20 4f 72 2c 20 69 66 20 74 68 65 20 52 48 53  . Or, if the RHS
15c50 20 6f 66 20 74 68 65 20 49 4e 28 29 20 69 73 20   of the IN() is 
15c60 6e 6f 74 20 0a 2a 2a 20 61 20 73 75 62 2d 71 75  not .** a sub-qu
15c70 65 72 79 2c 20 74 68 61 74 20 74 68 65 20 4c 48  ery, that the LH
15c80 53 20 69 73 20 61 20 76 65 63 74 6f 72 20 6f 66  S is a vector of
15c90 20 73 69 7a 65 20 31 2e 0a 2a 2f 0a 69 6e 74 20   size 1..*/.int 
15ca0 73 71 6c 69 74 65 33 45 78 70 72 43 68 65 63 6b  sqlite3ExprCheck
15cb0 49 4e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  IN(Parse *pParse
15cc0 2c 20 45 78 70 72 20 2a 70 49 6e 29 7b 0a 20 20  , Expr *pIn){.  
15cd0 69 6e 74 20 6e 56 65 63 74 6f 72 20 3d 20 73 71  int nVector = sq
15ce0 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f 72 53  lite3ExprVectorS
15cf0 69 7a 65 28 70 49 6e 2d 3e 70 4c 65 66 74 29 3b  ize(pIn->pLeft);
15d00 0a 20 20 69 66 28 20 28 70 49 6e 2d 3e 66 6c 61  .  if( (pIn->fla
15d10 67 73 20 26 20 45 50 5f 78 49 73 53 65 6c 65 63  gs & EP_xIsSelec
15d20 74 29 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 56  t) ){.    if( nV
15d30 65 63 74 6f 72 21 3d 70 49 6e 2d 3e 78 2e 70 53  ector!=pIn->x.pS
15d40 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e  elect->pEList->n
15d50 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 73 71  Expr ){.      sq
15d60 6c 69 74 65 33 53 75 62 73 65 6c 65 63 74 45 72  lite3SubselectEr
15d70 72 6f 72 28 70 50 61 72 73 65 2c 20 70 49 6e 2d  ror(pParse, pIn-
15d80 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69  >x.pSelect->pELi
15d90 73 74 2d 3e 6e 45 78 70 72 2c 20 6e 56 65 63 74  st->nExpr, nVect
15da0 6f 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  or);.      retur
15db0 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  n 1;.    }.  }el
15dc0 73 65 20 69 66 28 20 6e 56 65 63 74 6f 72 21 3d  se if( nVector!=
15dd0 31 20 29 7b 0a 20 20 20 20 69 66 28 20 28 70 49  1 ){.    if( (pI
15de0 6e 2d 3e 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20  n->pLeft->flags 
15df0 26 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  & EP_xIsSelect) 
15e00 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
15e10 53 75 62 73 65 6c 65 63 74 45 72 72 6f 72 28 70  SubselectError(p
15e20 50 61 72 73 65 2c 20 6e 56 65 63 74 6f 72 2c 20  Parse, nVector, 
15e30 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  1);.    }else{. 
15e40 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
15e50 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 69 6e  rMsg(pParse, "in
15e60 76 61 6c 69 64 20 75 73 65 20 6f 66 20 72 6f 77  valid use of row
15e70 20 76 61 6c 75 65 22 29 3b 0a 20 20 20 20 7d 0a   value");.    }.
15e80 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
15e90 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
15ea0 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
15eb0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
15ec0 55 45 52 59 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  UERY./*.** Gener
15ed0 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 6e 20  ate code for an 
15ee0 49 4e 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a  IN expression..*
15ef0 2a 0a 2a 2a 20 20 20 20 20 20 78 20 49 4e 20 28  *.**      x IN (
15f00 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 2a 2a 20 20  SELECT ...).**  
15f10 20 20 20 20 78 20 49 4e 20 28 76 61 6c 75 65 2c      x IN (value,
15f20 20 76 61 6c 75 65 2c 20 2e 2e 2e 29 0a 2a 2a 0a   value, ...).**.
15f30 2a 2a 20 54 68 65 20 6c 65 66 74 2d 68 61 6e 64  ** The left-hand
15f40 20 73 69 64 65 20 28 4c 48 53 29 20 69 73 20 61   side (LHS) is a
15f50 20 73 63 61 6c 61 72 20 65 78 70 72 65 73 73 69   scalar expressi
15f60 6f 6e 2e 20 20 54 68 65 20 72 69 67 68 74 2d 68  on.  The right-h
15f70 61 6e 64 20 73 69 64 65 20 28 52 48 53 29 0a 2a  and side (RHS).*
15f80 2a 20 69 73 20 61 6e 20 61 72 72 61 79 20 6f 66  * is an array of
15f90 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 76 61   zero or more va
15fa0 6c 75 65 73 2e 20 20 54 68 65 20 65 78 70 72 65  lues.  The expre
15fb0 73 73 69 6f 6e 20 69 73 20 74 72 75 65 20 69 66  ssion is true if
15fc0 20 74 68 65 20 4c 48 53 20 69 73 0a 2a 2a 20 63   the LHS is.** c
15fd0 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20  ontained within 
15fe0 74 68 65 20 52 48 53 2e 20 20 54 68 65 20 76 61  the RHS.  The va
15ff0 6c 75 65 20 6f 66 20 74 68 65 20 65 78 70 72 65  lue of the expre
16000 73 73 69 6f 6e 20 69 73 20 75 6e 6b 6e 6f 77 6e  ssion is unknown
16010 20 28 4e 55 4c 4c 29 0a 2a 2a 20 69 66 20 74 68   (NULL).** if th
16020 65 20 4c 48 53 20 69 73 20 4e 55 4c 4c 20 6f 72  e LHS is NULL or
16030 20 69 66 20 74 68 65 20 4c 48 53 20 69 73 20 6e   if the LHS is n
16040 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74  ot contained wit
16050 68 69 6e 20 74 68 65 20 52 48 53 20 61 6e 64 20  hin the RHS and 
16060 74 68 65 0a 2a 2a 20 52 48 53 20 63 6f 6e 74 61  the.** RHS conta
16070 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  ins one or more 
16080 4e 55 4c 4c 20 76 61 6c 75 65 73 2e 0a 2a 2a 0a  NULL values..**.
16090 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
160a0 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20 74  generates code t
160b0 68 61 74 20 6a 75 6d 70 73 20 74 6f 20 64 65 73  hat jumps to des
160c0 74 49 66 46 61 6c 73 65 20 69 66 20 74 68 65 20  tIfFalse if the 
160d0 4c 48 53 20 69 73 20 6e 6f 74 20 0a 2a 2a 20 63  LHS is not .** c
160e0 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20  ontained within 
160f0 74 68 65 20 52 48 53 2e 20 20 49 66 20 64 75 65  the RHS.  If due
16100 20 74 6f 20 4e 55 4c 4c 73 20 77 65 20 63 61 6e   to NULLs we can
16110 6e 6f 74 20 64 65 74 65 72 6d 69 6e 65 20 69 66  not determine if
16120 20 74 68 65 20 4c 48 53 0a 2a 2a 20 69 73 20 63   the LHS.** is c
16130 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20  ontained in the 
16140 52 48 53 20 74 68 65 6e 20 6a 75 6d 70 20 74 6f  RHS then jump to
16150 20 64 65 73 74 49 66 4e 75 6c 6c 2e 20 20 49 66   destIfNull.  If
16160 20 74 68 65 20 4c 48 53 20 69 73 20 63 6f 6e 74   the LHS is cont
16170 61 69 6e 65 64 0a 2a 2a 20 77 69 74 68 69 6e 20  ained.** within 
16180 74 68 65 20 52 48 53 20 74 68 65 6e 20 66 61 6c  the RHS then fal
16190 6c 20 74 68 72 6f 75 67 68 2e 0a 2a 2f 0a 73 74  l through..*/.st
161a0 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65  atic void sqlite
161b0 33 45 78 70 72 43 6f 64 65 49 4e 28 0a 20 20 50  3ExprCodeIN(.  P
161c0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
161d0 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
161e0 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74  and code generat
161f0 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
16200 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20   Expr *pExpr,   
16210 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 49 4e         /* The IN
16220 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20   expression */. 
16230 20 69 6e 74 20 64 65 73 74 49 66 46 61 6c 73 65   int destIfFalse
16240 2c 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68  ,      /* Jump h
16250 65 72 65 20 69 66 20 4c 48 53 20 69 73 20 6e 6f  ere if LHS is no
16260 74 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74  t contained in t
16270 68 65 20 52 48 53 20 2a 2f 0a 20 20 69 6e 74 20  he RHS */.  int 
16280 64 65 73 74 49 66 4e 75 6c 6c 20 20 20 20 20 20  destIfNull      
16290 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69    /* Jump here i
162a0 66 20 74 68 65 20 72 65 73 75 6c 74 73 20 61 72  f the results ar
162b0 65 20 75 6e 6b 6e 6f 77 6e 20 64 75 65 20 74 6f  e unknown due to
162c0 20 4e 55 4c 4c 73 20 2a 2f 0a 29 7b 0a 20 20 69   NULLs */.){.  i
162d0 6e 74 20 72 52 68 73 48 61 73 4e 75 6c 6c 20 3d  nt rRhsHasNull =
162e0 20 30 3b 20 20 2f 2a 20 52 65 67 69 73 74 65 72   0;  /* Register
162f0 20 74 68 61 74 20 69 73 20 74 72 75 65 20 69 66   that is true if
16300 20 52 48 53 20 63 6f 6e 74 61 69 6e 73 20 4e 55   RHS contains NU
16310 4c 4c 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 69  LL values */.  i
16320 6e 74 20 65 54 79 70 65 3b 20 20 20 20 20 20 20  nt eType;       
16330 20 20 20 20 20 2f 2a 20 54 79 70 65 20 6f 66 20       /* Type of 
16340 74 68 65 20 52 48 53 20 2a 2f 0a 20 20 69 6e 74  the RHS */.  int
16350 20 72 31 3b 20 20 20 20 20 20 20 20 20 20 20 20   r1;            
16360 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20     /* Temporary 
16370 75 73 65 20 72 65 67 69 73 74 65 72 20 2a 2f 0a  use register */.
16380 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20    Vdbe *v;      
16390 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74 65          /* State
163a0 6d 65 6e 74 20 75 6e 64 65 72 20 63 6f 6e 73 74  ment under const
163b0 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  ruction */.  int
163c0 20 2a 61 69 4d 61 70 20 3d 20 30 3b 20 20 20 20   *aiMap = 0;    
163d0 20 20 20 2f 2a 20 4d 61 70 20 66 72 6f 6d 20 76     /* Map from v
163e0 65 63 74 6f 72 20 66 69 65 6c 64 20 74 6f 20 69  ector field to i
163f0 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20  ndex column */. 
16400 20 63 68 61 72 20 2a 7a 41 66 66 20 3d 20 30 3b   char *zAff = 0;
16410 20 20 20 20 20 20 20 2f 2a 20 41 66 66 69 6e 69         /* Affini
16420 74 79 20 73 74 72 69 6e 67 20 66 6f 72 20 63 6f  ty string for co
16430 6d 70 61 72 69 73 6f 6e 73 20 2a 2f 0a 20 20 69  mparisons */.  i
16440 6e 74 20 6e 56 65 63 74 6f 72 3b 20 20 20 20 20  nt nVector;     
16450 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
16460 76 65 63 74 6f 72 73 20 66 6f 72 20 74 68 69 73  vectors for this
16470 20 49 4e 28 2e 2e 2e 29 20 6f 70 20 2a 2f 0a 20   IN(...) op */. 
16480 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70   Expr *pLeft = p
16490 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 69  Expr->pLeft;.  i
164a0 6e 74 20 69 3b 0a 0a 20 20 69 66 28 20 73 71 6c  nt i;..  if( sql
164b0 69 74 65 33 45 78 70 72 43 68 65 63 6b 49 4e 28  ite3ExprCheckIN(
164c0 70 50 61 72 73 65 2c 20 70 45 78 70 72 29 20 29  pParse, pExpr) )
164d0 20 72 65 74 75 72 6e 3b 0a 20 20 7a 41 66 66 20   return;.  zAff 
164e0 3d 20 65 78 70 72 49 4e 41 66 66 69 6e 69 74 79  = exprINAffinity
164f0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 29 3b  (pParse, pExpr);
16500 0a 20 20 69 66 28 20 7a 41 66 66 3d 3d 30 20 29  .  if( zAff==0 )
16510 20 72 65 74 75 72 6e 3b 0a 20 20 6e 56 65 63 74   return;.  nVect
16520 6f 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  or = sqlite3Expr
16530 56 65 63 74 6f 72 53 69 7a 65 28 70 45 78 70 72  VectorSize(pExpr
16540 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 61 69 4d 61  ->pLeft);.  aiMa
16550 70 20 3d 20 28 69 6e 74 2a 29 73 71 6c 69 74 65  p = (int*)sqlite
16560 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 0a 20  3DbMallocZero(. 
16570 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2c       pParse->db,
16580 20 6e 56 65 63 74 6f 72 2a 28 73 69 7a 65 6f 66   nVector*(sizeof
16590 28 69 6e 74 29 20 2b 20 73 69 7a 65 6f 66 28 63  (int) + sizeof(c
165a0 68 61 72 29 29 20 2b 20 31 0a 20 20 29 3b 0a 20  har)) + 1.  );. 
165b0 20 69 66 28 20 61 69 4d 61 70 3d 3d 30 20 29 7b   if( aiMap==0 ){
165c0 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
165d0 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a  ee(pParse->db, z
165e0 41 66 66 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  Aff);.    return
165f0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 74 74 65  ;.  }..  /* Atte
16600 6d 70 74 20 74 6f 20 63 6f 6d 70 75 74 65 20 74  mpt to compute t
16610 68 65 20 52 48 53 2e 20 41 66 74 65 72 20 74 68  he RHS. After th
16620 69 73 20 73 74 65 70 2c 20 69 66 20 61 6e 79 74  is step, if anyt
16630 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 0a  hing other than.
16640 20 20 2a 2a 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f    ** IN_INDEX_NO
16650 4f 50 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20  OP is returned, 
16660 74 68 65 20 74 61 62 6c 65 20 6f 70 65 6e 65 64  the table opened
16670 20 69 74 68 20 63 75 72 73 6f 72 20 70 45 78 70   ith cursor pExp
16680 72 2d 3e 69 54 61 62 6c 65 20 0a 20 20 2a 2a 20  r->iTable .  ** 
16690 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 76 61 6c  contains the val
166a0 75 65 73 20 74 68 61 74 20 6d 61 6b 65 20 75 70  ues that make up
166b0 20 74 68 65 20 52 48 53 2e 20 49 66 20 49 4e 5f   the RHS. If IN_
166c0 49 4e 44 45 58 5f 4e 4f 4f 50 20 69 73 20 72 65  INDEX_NOOP is re
166d0 74 75 72 6e 65 64 2c 0a 20 20 2a 2a 20 74 68 65  turned,.  ** the
166e0 20 52 48 53 20 68 61 73 20 6e 6f 74 20 79 65 74   RHS has not yet
166f0 20 62 65 65 6e 20 63 6f 64 65 64 2e 20 20 2a 2f   been coded.  */
16700 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  .  v = pParse->p
16710 56 64 62 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Vdbe;.  assert( 
16720 76 21 3d 30 20 29 3b 20 20 20 20 20 20 20 2f 2a  v!=0 );       /*
16730 20 4f 4f 4d 20 64 65 74 65 63 74 65 64 20 70 72   OOM detected pr
16740 69 6f 72 20 74 6f 20 74 68 69 73 20 72 6f 75 74  ior to this rout
16750 69 6e 65 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f  ine */.  VdbeNoo
16760 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 62 65  pComment((v, "be
16770 67 69 6e 20 49 4e 20 65 78 70 72 22 29 29 3b 0a  gin IN expr"));.
16780 20 20 65 54 79 70 65 20 3d 20 73 71 6c 69 74 65    eType = sqlite
16790 33 46 69 6e 64 49 6e 49 6e 64 65 78 28 70 50 61  3FindInIndex(pPa
167a0 72 73 65 2c 20 70 45 78 70 72 2c 0a 20 20 20 20  rse, pExpr,.    
167b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
167c0 20 20 20 20 20 20 20 20 20 49 4e 5f 49 4e 44 45           IN_INDE
167d0 58 5f 4d 45 4d 42 45 52 53 48 49 50 20 7c 20 49  X_MEMBERSHIP | I
167e0 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 5f 4f 4b 2c  N_INDEX_NOOP_OK,
167f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
16800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 65                de
16810 73 74 49 66 46 61 6c 73 65 3d 3d 64 65 73 74 49  stIfFalse==destI
16820 66 4e 75 6c 6c 20 3f 20 30 20 3a 20 26 72 52 68  fNull ? 0 : &rRh
16830 73 48 61 73 4e 75 6c 6c 2c 20 61 69 4d 61 70 29  sHasNull, aiMap)
16840 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ;..  assert( pPa
16850 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 6e 56 65  rse->nErr || nVe
16860 63 74 6f 72 3d 3d 31 20 7c 7c 20 65 54 79 70 65  ctor==1 || eType
16870 3d 3d 49 4e 5f 49 4e 44 45 58 5f 45 50 48 0a 20  ==IN_INDEX_EPH. 
16880 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d        || eType==
16890 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 41  IN_INDEX_INDEX_A
168a0 53 43 20 7c 7c 20 65 54 79 70 65 3d 3d 49 4e 5f  SC || eType==IN_
168b0 49 4e 44 45 58 5f 49 4e 44 45 58 5f 44 45 53 43  INDEX_INDEX_DESC
168c0 20 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 43 6f 64   .  );..  /* Cod
168d0 65 20 74 68 65 20 4c 48 53 2c 20 74 68 65 20 3c  e the LHS, the <
168e0 65 78 70 72 3e 20 66 72 6f 6d 20 22 3c 65 78 70  expr> from "<exp
168f0 72 3e 20 49 4e 20 28 2e 2e 2e 29 22 2e 20 49 66  r> IN (...)". If
16900 20 74 68 65 20 4c 48 53 20 69 73 20 61 20 0a 20   the LHS is a . 
16910 20 2a 2a 20 76 65 63 74 6f 72 2c 20 74 68 65 6e   ** vector, then
16920 20 69 74 20 69 73 20 73 74 6f 72 65 64 20 69 6e   it is stored in
16930 20 61 6e 20 61 72 72 61 79 20 6f 66 20 6e 56 65   an array of nVe
16940 63 74 6f 72 20 72 65 67 69 73 74 65 72 73 20 73  ctor registers s
16950 74 61 72 74 69 6e 67 20 0a 20 20 2a 2a 20 61 74  tarting .  ** at
16960 20 72 31 2e 0a 20 20 2a 2f 0a 20 20 72 31 20 3d   r1..  */.  r1 =
16970 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
16980 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 56 65  ange(pParse, nVe
16990 63 74 6f 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  ctor);.  sqlite3
169a0 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50  ExprCachePush(pP
169b0 61 72 73 65 29 3b 0a 20 20 69 66 28 20 6e 56 65  arse);.  if( nVe
169c0 63 74 6f 72 3e 31 20 26 26 20 28 70 4c 65 66 74  ctor>1 && (pLeft
169d0 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 78 49 73  ->flags & EP_xIs
169e0 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 69  Select) ){.    i
169f0 6e 74 20 72 65 67 53 65 6c 65 63 74 20 3d 20 73  nt regSelect = s
16a00 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c  qlite3CodeSubsel
16a10 65 63 74 28 70 50 61 72 73 65 2c 20 70 4c 65 66  ect(pParse, pLef
16a20 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 66 6f  t, 0, 0);.    fo
16a30 72 28 69 3d 30 3b 20 69 3c 6e 56 65 63 74 6f 72  r(i=0; i<nVector
16a40 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71  ; i++){.      sq
16a50 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
16a60 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 65 67 53  v, OP_Copy, regS
16a70 65 6c 65 63 74 2b 69 2c 20 72 31 2b 61 69 4d 61  elect+i, r1+aiMa
16a80 70 5b 69 5d 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  p[i], 0);.    }.
16a90 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72    }else{.    for
16aa0 28 69 3d 30 3b 20 69 3c 6e 56 65 63 74 6f 72 3b  (i=0; i<nVector;
16ab0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70   i++){.      Exp
16ac0 72 20 2a 70 4c 68 73 20 3d 20 73 71 6c 69 74 65  r *pLhs = sqlite
16ad0 33 56 65 63 74 6f 72 46 69 65 6c 64 53 75 62 65  3VectorFieldSube
16ae0 78 70 72 28 70 4c 65 66 74 2c 20 69 29 3b 0a 20  xpr(pLeft, i);. 
16af0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
16b00 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 4c 68  Code(pParse, pLh
16b10 73 2c 20 72 31 2b 61 69 4d 61 70 5b 69 5d 29 3b  s, r1+aiMap[i]);
16b20 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
16b30 20 49 66 20 73 71 6c 69 74 65 33 46 69 6e 64 49   If sqlite3FindI
16b40 6e 49 6e 64 65 78 28 29 20 64 69 64 20 6e 6f 74  nIndex() did not
16b50 20 66 69 6e 64 20 6f 72 20 63 72 65 61 74 65 20   find or create 
16b60 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20 69 73  an index that is
16b70 0a 20 20 2a 2a 20 73 75 69 74 61 62 6c 65 20 66  .  ** suitable f
16b80 6f 72 20 65 76 61 6c 75 61 74 69 6e 67 20 74 68  or evaluating th
16b90 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 2c 20 74  e IN operator, t
16ba0 68 65 6e 20 65 76 61 6c 75 61 74 65 20 75 73 69  hen evaluate usi
16bb0 6e 67 20 61 0a 20 20 2a 2a 20 73 65 71 75 65 6e  ng a.  ** sequen
16bc0 63 65 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e  ce of comparison
16bd0 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54  s..  */.  if( eT
16be0 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 4e 4f  ype==IN_INDEX_NO
16bf0 4f 50 20 29 7b 0a 20 20 20 20 45 78 70 72 4c 69  OP ){.    ExprLi
16c00 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 45 78 70  st *pList = pExp
16c10 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20  r->x.pList;.    
16c20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d  CollSeq *pColl =
16c30 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
16c40 53 65 71 28 70 50 61 72 73 65 2c 20 70 45 78 70  Seq(pParse, pExp
16c50 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 69  r->pLeft);.    i
16c60 6e 74 20 6c 61 62 65 6c 4f 6b 20 3d 20 73 71 6c  nt labelOk = sql
16c70 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
16c80 6c 28 76 29 3b 0a 20 20 20 20 69 6e 74 20 72 32  l(v);.    int r2
16c90 2c 20 72 65 67 54 6f 46 72 65 65 3b 0a 20 20 20  , regToFree;.   
16ca0 20 69 6e 74 20 72 65 67 43 6b 4e 75 6c 6c 20 3d   int regCkNull =
16cb0 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a   0;.    int ii;.
16cc0 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
16cd0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
16ce0 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
16cf0 29 20 29 3b 0a 20 20 20 20 69 66 28 20 64 65 73  ) );.    if( des
16d00 74 49 66 4e 75 6c 6c 21 3d 64 65 73 74 49 66 46  tIfNull!=destIfF
16d10 61 6c 73 65 20 29 7b 0a 20 20 20 20 20 20 72 65  alse ){.      re
16d20 67 43 6b 4e 75 6c 6c 20 3d 20 73 71 6c 69 74 65  gCkNull = sqlite
16d30 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
16d40 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  se);.      sqlit
16d50 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
16d60 4f 50 5f 42 69 74 41 6e 64 2c 20 72 31 2c 20 72  OP_BitAnd, r1, r
16d70 31 2c 20 72 65 67 43 6b 4e 75 6c 6c 29 3b 0a 20  1, regCkNull);. 
16d80 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 69 3d     }.    for(ii=
16d90 30 3b 20 69 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  0; ii<pList->nEx
16da0 70 72 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  pr; ii++){.     
16db0 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r2 = sqlite3Exp
16dc0 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
16dd0 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 69 5d 2e 70  , pList->a[ii].p
16de0 45 78 70 72 2c 20 26 72 65 67 54 6f 46 72 65 65  Expr, &regToFree
16df0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 65 67  );.      if( reg
16e00 43 6b 4e 75 6c 6c 20 26 26 20 73 71 6c 69 74 65  CkNull && sqlite
16e10 33 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28 70  3ExprCanBeNull(p
16e20 4c 69 73 74 2d 3e 61 5b 69 69 5d 2e 70 45 78 70  List->a[ii].pExp
16e30 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  r) ){.        sq
16e40 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
16e50 76 2c 20 4f 50 5f 42 69 74 41 6e 64 2c 20 72 65  v, OP_BitAnd, re
16e60 67 43 6b 4e 75 6c 6c 2c 20 72 32 2c 20 72 65 67  gCkNull, r2, reg
16e70 43 6b 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 7d  CkNull);.      }
16e80 0a 20 20 20 20 20 20 69 66 28 20 69 69 3c 70 4c  .      if( ii<pL
16e90 69 73 74 2d 3e 6e 45 78 70 72 2d 31 20 7c 7c 20  ist->nExpr-1 || 
16ea0 64 65 73 74 49 66 4e 75 6c 6c 21 3d 64 65 73 74  destIfNull!=dest
16eb0 49 66 46 61 6c 73 65 20 29 7b 0a 20 20 20 20 20  IfFalse ){.     
16ec0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
16ed0 64 4f 70 34 28 76 2c 20 4f 50 5f 45 71 2c 20 72  dOp4(v, OP_Eq, r
16ee0 31 2c 20 6c 61 62 65 6c 4f 6b 2c 20 72 32 2c 0a  1, labelOk, r2,.
16ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f00 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a            (void*
16f10 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53  )pColl, P4_COLLS
16f20 45 51 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62  EQ);.        Vdb
16f30 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 69  eCoverageIf(v, i
16f40 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31  i<pList->nExpr-1
16f50 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43  );.        VdbeC
16f60 6f 76 65 72 61 67 65 49 66 28 76 2c 20 69 69 3d  overageIf(v, ii=
16f70 3d 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 29  =pList->nExpr-1)
16f80 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
16f90 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
16fa0 20 7a 41 66 66 5b 30 5d 29 3b 0a 20 20 20 20 20   zAff[0]);.     
16fb0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
16fc0 61 73 73 65 72 74 28 20 64 65 73 74 49 66 4e 75  assert( destIfNu
16fd0 6c 6c 3d 3d 64 65 73 74 49 66 46 61 6c 73 65 20  ll==destIfFalse 
16fe0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
16ff0 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
17000 4f 50 5f 4e 65 2c 20 72 31 2c 20 64 65 73 74 49  OP_Ne, r1, destI
17010 66 46 61 6c 73 65 2c 20 72 32 2c 0a 20 20 20 20  fFalse, r2,.    
17020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17030 20 20 20 20 20 20 28 76 6f 69 64 2a 29 70 43 6f        (void*)pCo
17040 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b  ll, P4_COLLSEQ);
17050 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
17060 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
17070 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
17080 20 7a 41 66 66 5b 30 5d 20 7c 20 53 51 4c 49 54   zAff[0] | SQLIT
17090 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20  E_JUMPIFNULL);. 
170a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
170b0 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
170c0 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 54 6f  eg(pParse, regTo
170d0 46 72 65 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Free);.    }.   
170e0 20 69 66 28 20 72 65 67 43 6b 4e 75 6c 6c 20 29   if( regCkNull )
170f0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
17100 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
17110 49 73 4e 75 6c 6c 2c 20 72 65 67 43 6b 4e 75 6c  IsNull, regCkNul
17120 6c 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 20  l, destIfNull); 
17130 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
17140 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
17150 62 65 47 6f 74 6f 28 76 2c 20 64 65 73 74 49 66  beGoto(v, destIf
17160 46 61 6c 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20  False);.    }.  
17170 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
17180 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 61 62  olveLabel(v, lab
17190 65 6c 4f 6b 29 3b 0a 20 20 20 20 73 71 6c 69 74  elOk);.    sqlit
171a0 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
171b0 28 70 50 61 72 73 65 2c 20 72 65 67 43 6b 4e 75  (pParse, regCkNu
171c0 6c 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ll);.  }else{.  
171d0 0a 20 20 20 20 2f 2a 20 49 66 20 61 6e 79 20 76  .    /* If any v
171e0 61 6c 75 65 20 6f 6e 20 74 68 65 20 4c 48 53 20  alue on the LHS 
171f0 69 73 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65 73  is NULL, the res
17200 75 6c 74 20 6f 66 20 74 68 65 20 49 4e 28 2e 2e  ult of the IN(..
17210 2e 29 20 6f 70 65 72 61 74 6f 72 0a 20 20 20 20  .) operator.    
17220 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68 65  ** must be eithe
17230 72 20 66 61 6c 73 65 20 6f 72 20 4e 55 4c 4c 2e  r false or NULL.
17240 20 49 66 20 74 68 65 73 65 20 74 77 6f 20 61 72   If these two ar
17250 65 20 68 61 6e 64 6c 65 64 20 69 64 65 6e 74 69  e handled identi
17260 63 61 6c 6c 79 2c 0a 20 20 20 20 2a 2a 20 74 65  cally,.    ** te
17270 73 74 20 74 68 65 20 4c 48 53 20 66 6f 72 20 4e  st the LHS for N
17280 55 4c 4c 73 20 61 6e 64 20 6a 75 6d 70 20 64 69  ULLs and jump di
17290 72 65 63 74 6c 79 20 74 6f 20 64 65 73 74 49 66  rectly to destIf
172a0 4e 75 6c 6c 20 69 66 20 61 6e 79 20 61 72 65 0a  Null if any are.
172b0 20 20 20 20 2a 2a 20 66 6f 75 6e 64 2e 20 0a 20      ** found. . 
172c0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f 74 68     **.    ** Oth
172d0 65 72 77 69 73 65 2c 20 69 66 20 4e 55 4c 4c 20  erwise, if NULL 
172e0 61 6e 64 20 66 61 6c 73 65 20 61 72 65 20 68 61  and false are ha
172f0 6e 64 6c 65 64 20 64 69 66 66 65 72 65 6e 74 6c  ndled differentl
17300 79 2c 20 61 6e 64 20 74 68 65 0a 20 20 20 20 2a  y, and the.    *
17310 2a 20 49 4e 28 2e 2e 2e 29 20 6f 70 65 72 61 74  * IN(...) operat
17320 69 6f 6e 20 69 73 20 6e 6f 74 20 61 20 76 65 63  ion is not a vec
17330 74 6f 72 20 6f 70 65 72 61 74 69 6f 6e 2c 20 61  tor operation, a
17340 6e 64 20 74 68 65 20 4c 48 53 20 6f 66 20 74 68  nd the LHS of th
17350 65 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61 74 6f  e.    ** operato
17360 72 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20  r is NULL, then 
17370 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 66 61  the result is fa
17380 6c 73 65 20 69 66 20 74 68 65 20 69 6e 64 65 78  lse if the index
17390 20 69 73 20 0a 20 20 20 20 2a 2a 20 63 6f 6d 70   is .    ** comp
173a0 6c 65 74 65 6c 79 20 65 6d 70 74 79 2c 20 6f 72  letely empty, or
173b0 20 4e 55 4c 4c 20 6f 74 68 65 72 77 69 73 65 2e   NULL otherwise.
173c0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 64 65 73    */.    if( des
173d0 74 49 66 4e 75 6c 6c 3d 3d 64 65 73 74 49 66 46  tIfNull==destIfF
173e0 61 6c 73 65 20 29 7b 0a 20 20 20 20 20 20 66 6f  alse ){.      fo
173f0 72 28 69 3d 30 3b 20 69 3c 6e 56 65 63 74 6f 72  r(i=0; i<nVector
17400 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
17410 45 78 70 72 20 2a 70 20 3d 20 73 71 6c 69 74 65  Expr *p = sqlite
17420 33 56 65 63 74 6f 72 46 69 65 6c 64 53 75 62 65  3VectorFieldSube
17430 78 70 72 28 70 45 78 70 72 2d 3e 70 4c 65 66 74  xpr(pExpr->pLeft
17440 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , i);.        if
17450 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 6e  ( sqlite3ExprCan
17460 42 65 4e 75 6c 6c 28 70 29 20 29 7b 0a 20 20 20  BeNull(p) ){.   
17470 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
17480 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
17490 73 4e 75 6c 6c 2c 20 72 31 2b 61 69 4d 61 70 5b  sNull, r1+aiMap[
174a0 69 5d 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b  i], destIfNull);
174b0 0a 20 20 20 20 20 20 20 20 20 20 56 64 62 65 43  .          VdbeC
174c0 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
174d0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
174e0 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 56 65 63    }else if( nVec
174f0 74 6f 72 3d 3d 31 20 26 26 20 73 71 6c 69 74 65  tor==1 && sqlite
17500 33 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28 70  3ExprCanBeNull(p
17510 45 78 70 72 2d 3e 70 4c 65 66 74 29 20 29 7b 0a  Expr->pLeft) ){.
17520 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 31 20        int addr1 
17530 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
17540 4f 70 31 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c  Op1(v, OP_NotNul
17550 6c 2c 20 72 31 29 3b 20 56 64 62 65 43 6f 76 65  l, r1); VdbeCove
17560 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 73  rage(v);.      s
17570 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
17580 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 70  (v, OP_Rewind, p
17590 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 64 65  Expr->iTable, de
175a0 73 74 49 66 46 61 6c 73 65 29 3b 0a 20 20 20 20  stIfFalse);.    
175b0 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
175c0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
175d0 56 64 62 65 47 6f 74 6f 28 76 2c 20 64 65 73 74  VdbeGoto(v, dest
175e0 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73  IfNull);.      s
175f0 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
17600 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 20 20  re(v, addr1);.  
17610 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 65    }.  .    if( e
17620 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52  Type==IN_INDEX_R
17630 4f 57 49 44 20 29 7b 0a 20 20 20 20 20 20 2f 2a  OWID ){.      /*
17640 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 74   In this case, t
17650 68 65 20 52 48 53 20 69 73 20 74 68 65 20 52 4f  he RHS is the RO
17660 57 49 44 20 6f 66 20 74 61 62 6c 65 20 62 2d 74  WID of table b-t
17670 72 65 65 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  ree */.      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 53 65 65 6b 52 6f 77 69 64 2c 20  , OP_SeekRowid, 
176a0 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 64  pExpr->iTable, d
176b0 65 73 74 49 66 46 61 6c 73 65 2c 20 72 31 29 3b  estIfFalse, r1);
176c0 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
176d0 61 67 65 28 76 29 3b 0a 20 20 20 20 7d 65 6c 73  age(v);.    }els
176e0 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20 74  e{.      /* In t
176f0 68 69 73 20 63 61 73 65 2c 20 74 68 65 20 52 48  his case, the RH
17700 53 20 69 73 20 61 6e 20 69 6e 64 65 78 20 62 2d  S is an index b-
17710 74 72 65 65 2e 20 41 70 70 6c 79 20 74 68 65 20  tree. Apply the 
17720 63 6f 6d 70 61 72 69 73 6f 6e 0a 20 20 20 20 20  comparison.     
17730 20 2a 2a 20 61 66 66 69 6e 69 74 69 65 73 20 74   ** affinities t
17740 6f 20 65 61 63 68 20 76 61 6c 75 65 20 6f 6e 20  o each value on 
17750 74 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20 6f  the LHS of the o
17760 70 65 72 61 74 6f 72 2e 20 20 2a 2f 0a 20 20 20  perator.  */.   
17770 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
17780 64 4f 70 34 28 76 2c 20 4f 50 5f 41 66 66 69 6e  dOp4(v, OP_Affin
17790 69 74 79 2c 20 72 31 2c 20 6e 56 65 63 74 6f 72  ity, r1, nVector
177a0 2c 20 30 2c 20 7a 41 66 66 2c 20 6e 56 65 63 74  , 0, zAff, nVect
177b0 6f 72 29 3b 0a 20 20 20 20 20 20 0a 20 20 20 20  or);.      .    
177c0 20 20 69 66 28 20 6e 56 65 63 74 6f 72 3e 31 20    if( nVector>1 
177d0 26 26 20 64 65 73 74 49 66 4e 75 6c 6c 21 3d 64  && destIfNull!=d
177e0 65 73 74 49 66 46 61 6c 73 65 20 29 7b 0a 20 20  estIfFalse ){.  
177f0 20 20 20 20 20 20 69 6e 74 20 69 49 64 78 20 3d        int iIdx =
17800 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a   pExpr->iTable;.
17810 20 20 20 20 20 20 20 20 69 6e 74 20 61 64 64 72          int addr
17820 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 64  ;.        int ad
17830 64 72 4e 65 78 74 3b 0a 0a 20 20 20 20 20 20 20  drNext;..       
17840 20 2f 2a 20 53 65 61 72 63 68 20 74 68 65 20 69   /* Search the i
17850 6e 64 65 78 20 66 6f 72 20 74 68 65 20 6b 65 79  ndex for the key
17860 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 64 64  . */.        add
17870 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
17880 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46  ddOp4Int(v, OP_F
17890 6f 75 6e 64 2c 20 69 49 64 78 2c 20 30 2c 20 72  ound, iIdx, 0, r
178a0 31 2c 20 6e 56 65 63 74 6f 72 29 3b 0a 20 20 20  1, nVector);.   
178b0 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
178c0 65 28 76 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f  e(v);..        /
178d0 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20  * At this point 
178e0 74 68 65 20 73 70 65 63 69 66 69 65 64 20 6b 65  the specified ke
178f0 79 20 69 73 20 6e 6f 74 20 70 72 65 73 65 6e 74  y is not present
17900 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2c 20 0a   in the index, .
17910 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 20 74 68          ** so th
17920 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20  e result of the 
17930 49 4e 28 2e 2e 29 20 6f 70 65 72 61 74 6f 72 20  IN(..) operator 
17940 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e  must be either N
17950 55 4c 4c 20 6f 72 0a 20 20 20 20 20 20 20 20 2a  ULL or.        *
17960 2a 20 30 2e 20 54 68 65 20 76 64 62 65 20 63 6f  * 0. The vdbe co
17970 64 65 20 67 65 6e 65 72 61 74 65 64 20 62 65 6c  de generated bel
17980 6f 77 20 66 69 67 75 72 65 73 20 6f 75 74 20 77  ow figures out w
17990 68 69 63 68 2e 20 20 2a 2f 0a 20 20 20 20 20 20  hich.  */.      
179a0 20 20 61 64 64 72 4e 65 78 74 20 3d 20 31 2b 73    addrNext = 1+s
179b0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
179c0 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69  (v, OP_Rewind, i
179d0 49 64 78 2c 20 64 65 73 74 49 66 46 61 6c 73 65  Idx, destIfFalse
179e0 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43  );.        VdbeC
179f0 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a 20 20 20  overage(v);..   
17a00 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
17a10 6e 56 65 63 74 6f 72 3b 20 69 2b 2b 29 7b 0a 20  nVector; i++){. 
17a20 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70           Expr *p
17a30 3b 0a 20 20 20 20 20 20 20 20 20 20 43 6f 6c 6c  ;.          Coll
17a40 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20  Seq *pColl;.    
17a50 20 20 20 20 20 20 69 6e 74 20 72 32 20 3d 20 73        int r2 = s
17a60 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
17a70 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
17a80 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 56      p = sqlite3V
17a90 65 63 74 6f 72 46 69 65 6c 64 53 75 62 65 78 70  ectorFieldSubexp
17aa0 72 28 70 4c 65 66 74 2c 20 69 29 3b 0a 20 20 20  r(pLeft, i);.   
17ab0 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73         pColl = s
17ac0 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
17ad0 71 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 0a 20  q(pParse, p);.. 
17ae0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
17af0 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
17b00 5f 43 6f 6c 75 6d 6e 2c 20 69 49 64 78 2c 20 69  _Column, iIdx, i
17b10 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 20 20 20  , r2);.         
17b20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
17b30 70 34 28 76 2c 20 4f 50 5f 45 71 2c 20 72 31 2b  p4(v, OP_Eq, r1+
17b40 69 2c 20 30 2c 20 72 32 2c 20 28 76 6f 69 64 2a  i, 0, r2, (void*
17b50 29 70 43 6f 6c 6c 2c 50 34 5f 43 4f 4c 4c 53 45  )pColl,P4_COLLSE
17b60 51 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  Q);.          sq
17b70 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
17b80 35 28 76 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50  5(v, SQLITE_JUMP
17b90 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 20  IFNULL);.       
17ba0 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
17bb0 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  v);.          sq
17bc0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
17bd0 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 69 49 64 78  v, OP_Next, iIdx
17be0 2c 20 61 64 64 72 4e 65 78 74 29 3b 0a 20 20 20  , addrNext);.   
17bf0 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
17c00 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
17c10 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
17c20 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
17c30 30 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b  0, destIfFalse);
17c40 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
17c50 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
17c60 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  , sqlite3VdbeCur
17c70 72 65 6e 74 41 64 64 72 28 76 29 2d 33 29 3b 0a  rentAddr(v)-3);.
17c80 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
17c90 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
17ca0 70 50 61 72 73 65 2c 20 72 32 29 3b 0a 20 20 20  pParse, r2);.   
17cb0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
17cc0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
17cd0 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
17ce0 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 0a 20 20  destIfNull);..  
17cf0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6b 65 79        /* The key
17d00 20 77 61 73 20 66 6f 75 6e 64 20 69 6e 20 74 68   was found in th
17d10 65 20 69 6e 64 65 78 2e 20 49 66 20 69 74 20 63  e index. If it c
17d20 6f 6e 74 61 69 6e 73 20 61 6e 79 20 4e 55 4c 4c  ontains any NULL
17d30 20 76 61 6c 75 65 73 2c 0a 20 20 20 20 20 20 20   values,.       
17d40 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 72 65 73   ** then the res
17d50 75 6c 74 20 6f 66 20 74 68 65 20 49 4e 28 2e 2e  ult of the IN(..
17d60 2e 29 20 6f 70 65 72 61 74 6f 72 20 69 73 20 4e  .) operator is N
17d70 55 4c 4c 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ULL. Otherwise, 
17d80 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 72  the.        ** r
17d90 65 73 75 6c 74 20 69 73 20 31 2e 20 20 2a 2f 0a  esult is 1.  */.
17da0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
17db0 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
17dc0 64 64 72 29 3b 0a 20 20 20 20 20 20 20 20 66 6f  ddr);.        fo
17dd0 72 28 69 3d 30 3b 20 69 3c 6e 56 65 63 74 6f 72  r(i=0; i<nVector
17de0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
17df0 20 20 45 78 70 72 20 2a 70 20 3d 20 73 71 6c 69    Expr *p = sqli
17e00 74 65 33 56 65 63 74 6f 72 46 69 65 6c 64 53 75  te3VectorFieldSu
17e10 62 65 78 70 72 28 70 45 78 70 72 2d 3e 70 4c 65  bexpr(pExpr->pLe
17e20 66 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20  ft, i);.        
17e30 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
17e40 72 43 61 6e 42 65 4e 75 6c 6c 28 70 29 20 29 7b  rCanBeNull(p) ){
17e50 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
17e60 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
17e70 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 31 2b  , OP_IsNull, r1+
17e80 61 69 4d 61 70 5b 69 5d 2c 20 64 65 73 74 49 66  aiMap[i], destIf
17e90 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 20  Null);.         
17ea0 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
17eb0 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  v);.          }.
17ec0 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
17ed0 20 7d 65 6c 73 65 20 69 66 28 20 72 52 68 73 48   }else if( rRhsH
17ee0 61 73 4e 75 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20  asNull==0 ){.   
17ef0 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61       /* This bra
17f00 6e 63 68 20 72 75 6e 73 20 69 66 20 69 74 20 69  nch runs if it i
17f10 73 20 6b 6e 6f 77 6e 20 61 74 20 63 6f 6d 70 69  s known at compi
17f20 6c 65 20 74 69 6d 65 20 74 68 61 74 20 74 68 65  le time that the
17f30 20 52 48 53 0a 20 20 20 20 20 20 20 20 2a 2a 20   RHS.        ** 
17f40 63 61 6e 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 4e  cannot contain N
17f50 55 4c 4c 20 76 61 6c 75 65 73 2e 20 54 68 69 73  ULL values. This
17f60 20 68 61 70 70 65 6e 73 20 61 73 20 61 20 72 65   happens as a re
17f70 73 75 6c 74 0a 20 20 20 20 20 20 20 20 2a 2a 20  sult.        ** 
17f80 6f 66 20 22 4e 4f 54 20 4e 55 4c 4c 22 20 63 6f  of "NOT NULL" co
17f90 6e 73 74 72 61 69 6e 74 73 20 69 6e 20 74 68 65  nstraints in the
17fa0 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61   database schema
17fb0 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
17fc0 20 20 20 20 20 2a 2a 20 41 6c 73 6f 20 72 75 6e       ** Also run
17fd0 20 74 68 69 73 20 62 72 61 6e 63 68 20 69 66 20   this branch if 
17fe0 4e 55 4c 4c 20 69 73 20 65 71 75 69 76 61 6c 65  NULL is equivale
17ff0 6e 74 20 74 6f 20 46 41 4c 53 45 0a 20 20 20 20  nt to FALSE.    
18000 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 69 73 20      ** for this 
18010 70 61 72 74 69 63 75 6c 61 72 20 49 4e 20 6f 70  particular IN op
18020 65 72 61 74 6f 72 2e 20 20 2a 2f 0a 20 20 20 20  erator.  */.    
18030 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
18040 64 64 4f 70 34 49 6e 74 28 0a 20 20 20 20 20 20  ddOp4Int(.      
18050 20 20 20 20 20 20 76 2c 20 4f 50 5f 4e 6f 74 46        v, OP_NotF
18060 6f 75 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54 61  ound, pExpr->iTa
18070 62 6c 65 2c 20 64 65 73 74 49 66 46 61 6c 73 65  ble, destIfFalse
18080 2c 20 72 31 2c 20 6e 56 65 63 74 6f 72 0a 20 20  , r1, nVector.  
18090 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
180a0 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
180b0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
180c0 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 74 68 69         /* In thi
180d0 73 20 62 72 61 6e 63 68 2c 20 74 68 65 20 52 48  s branch, the RH
180e0 53 20 6f 66 20 74 68 65 20 49 4e 20 6d 69 67 68  S of the IN migh
180f0 74 20 63 6f 6e 74 61 69 6e 20 61 20 4e 55 4c 4c  t contain a NULL
18100 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20   and.        ** 
18110 74 68 65 20 70 72 65 73 65 6e 63 65 20 6f 66 20  the presence of 
18120 61 20 4e 55 4c 4c 20 6f 6e 20 74 68 65 20 52 48  a NULL on the RH
18130 53 20 6d 61 6b 65 73 20 61 20 64 69 66 66 65 72  S makes a differ
18140 65 6e 63 65 20 69 6e 20 74 68 65 0a 20 20 20 20  ence in the.    
18150 20 20 20 20 2a 2a 20 6f 75 74 63 6f 6d 65 2e 0a      ** outcome..
18160 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
18170 20 20 20 69 6e 74 20 61 64 64 72 31 3b 0a 0a 20     int addr1;.. 
18180 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
18190 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  check to see if 
181a0 74 68 65 20 4c 48 53 20 69 73 20 63 6f 6e 74 61  the LHS is conta
181b0 69 6e 65 64 20 69 6e 20 74 68 65 20 52 48 53 2e  ined in the RHS.
181c0 20 20 49 66 20 73 6f 2c 0a 20 20 20 20 20 20 20    If so,.       
181d0 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 61 6e 73   ** then the ans
181e0 77 65 72 20 69 73 20 54 52 55 45 20 74 68 65 20  wer is TRUE the 
181f0 70 72 65 73 65 6e 63 65 20 6f 66 20 4e 55 4c 4c  presence of NULL
18200 73 20 69 6e 20 74 68 65 20 52 48 53 20 64 6f 65  s in the RHS doe
18210 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f 74  s.        ** not
18220 20 6d 61 74 74 65 72 2e 20 20 49 66 20 74 68 65   matter.  If the
18230 20 4c 48 53 20 69 73 20 6e 6f 74 20 63 6f 6e 74   LHS is not cont
18240 61 69 6e 65 64 20 69 6e 20 74 68 65 20 52 48 53  ained in the RHS
18250 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 20 20 20  , then the.     
18260 20 20 20 2a 2a 20 61 6e 73 77 65 72 20 69 73 20     ** answer is 
18270 4e 55 4c 4c 20 69 66 20 74 68 65 20 52 48 53 20  NULL if the RHS 
18280 63 6f 6e 74 61 69 6e 73 20 4e 55 4c 4c 73 20 61  contains NULLs a
18290 6e 64 20 74 68 65 20 61 6e 73 77 65 72 20 69 73  nd the answer is
182a0 0a 20 20 20 20 20 20 20 20 2a 2a 20 46 41 4c 53  .        ** FALS
182b0 45 20 69 66 20 74 68 65 20 52 48 53 20 69 73 20  E if the RHS is 
182c0 4e 55 4c 4c 2d 66 72 65 65 2e 0a 20 20 20 20 20  NULL-free..     
182d0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 64     */.        ad
182e0 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62  dr1 = sqlite3Vdb
182f0 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
18300 5f 46 6f 75 6e 64 2c 20 70 45 78 70 72 2d 3e 69  _Found, pExpr->i
18310 54 61 62 6c 65 2c 20 30 2c 20 72 31 2c 20 31 29  Table, 0, r1, 1)
18320 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
18330 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
18340 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
18350 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c  dOp2(v, OP_IsNul
18360 6c 2c 20 72 52 68 73 48 61 73 4e 75 6c 6c 2c 20  l, rRhsHasNull, 
18370 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  destIfNull);.   
18380 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
18390 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71  e(v);.        sq
183a0 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c  lite3VdbeGoto(v,
183b0 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 20   destIfFalse);. 
183c0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
183d0 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
183e0 64 72 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  dr1);.      }.  
183f0 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
18400 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
18410 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 73  pParse, r1);.  s
18420 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
18430 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71  op(pParse);.  sq
18440 6c 69 74 65 33 44 62 46 72 65 65 28 70 50 61 72  lite3DbFree(pPar
18450 73 65 2d 3e 64 62 2c 20 61 69 4d 61 70 29 3b 0a  se->db, aiMap);.
18460 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
18470 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 41 66 66  pParse->db, zAff
18480 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  );.  VdbeComment
18490 28 28 76 2c 20 22 65 6e 64 20 49 4e 20 65 78 70  ((v, "end IN exp
184a0 72 22 29 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  r"));.}.#endif /
184b0 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  * SQLITE_OMIT_SU
184c0 42 51 55 45 52 59 20 2a 2f 0a 0a 23 69 66 6e 64  BQUERY */..#ifnd
184d0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ef SQLITE_OMIT_F
184e0 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 2f 2a  LOATING_POINT./*
184f0 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 6e 20  .** Generate an 
18500 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 61 74  instruction that
18510 20 77 69 6c 6c 20 70 75 74 20 74 68 65 20 66 6c   will put the fl
18520 6f 61 74 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20  oating point.** 
18530 76 61 6c 75 65 20 64 65 73 63 72 69 62 65 64 20  value described 
18540 62 79 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 69 6e 74  by z[0..n-1] int
18550 6f 20 72 65 67 69 73 74 65 72 20 69 4d 65 6d 2e  o register iMem.
18560 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 5b 5d 20 73  .**.** The z[] s
18570 74 72 69 6e 67 20 77 69 6c 6c 20 70 72 6f 62 61  tring will proba
18580 62 6c 79 20 6e 6f 74 20 62 65 20 7a 65 72 6f 2d  bly not be zero-
18590 74 65 72 6d 69 6e 61 74 65 64 2e 20 20 42 75 74  terminated.  But
185a0 20 74 68 65 20 0a 2a 2a 20 7a 5b 6e 5d 20 63 68   the .** z[n] ch
185b0 61 72 61 63 74 65 72 20 69 73 20 67 75 61 72 61  aracter is guara
185c0 6e 74 65 65 64 20 74 6f 20 62 65 20 73 6f 6d 65  nteed to be some
185d0 74 68 69 6e 67 20 74 68 61 74 20 64 6f 65 73 20  thing that does 
185e0 6e 6f 74 20 6c 6f 6f 6b 0a 2a 2a 20 6c 69 6b 65  not look.** like
185f0 20 74 68 65 20 63 6f 6e 74 69 6e 75 61 74 69 6f   the continuatio
18600 6e 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 2e  n of the number.
18610 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
18620 63 6f 64 65 52 65 61 6c 28 56 64 62 65 20 2a 76  codeReal(Vdbe *v
18630 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c  , const char *z,
18640 20 69 6e 74 20 6e 65 67 61 74 65 46 6c 61 67 2c   int negateFlag,
18650 20 69 6e 74 20 69 4d 65 6d 29 7b 0a 20 20 69 66   int iMem){.  if
18660 28 20 41 4c 57 41 59 53 28 7a 21 3d 30 29 20 29  ( ALWAYS(z!=0) )
18670 7b 0a 20 20 20 20 64 6f 75 62 6c 65 20 76 61 6c  {.    double val
18680 75 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 41  ue;.    sqlite3A
18690 74 6f 46 28 7a 2c 20 26 76 61 6c 75 65 2c 20 73  toF(z, &value, s
186a0 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
186b0 29 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3b  ), SQLITE_UTF8);
186c0 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 73 71  .    assert( !sq
186d0 6c 69 74 65 33 49 73 4e 61 4e 28 76 61 6c 75 65  lite3IsNaN(value
186e0 29 20 29 3b 20 2f 2a 20 54 68 65 20 6e 65 77 20  ) ); /* The new 
186f0 41 74 6f 46 20 6e 65 76 65 72 20 72 65 74 75 72  AtoF never retur
18700 6e 73 20 4e 61 4e 20 2a 2f 0a 20 20 20 20 69 66  ns NaN */.    if
18710 28 20 6e 65 67 61 74 65 46 6c 61 67 20 29 20 76  ( negateFlag ) v
18720 61 6c 75 65 20 3d 20 2d 76 61 6c 75 65 3b 0a 20  alue = -value;. 
18730 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
18740 64 4f 70 34 44 75 70 38 28 76 2c 20 4f 50 5f 52  dOp4Dup8(v, OP_R
18750 65 61 6c 2c 20 30 2c 20 69 4d 65 6d 2c 20 30 2c  eal, 0, iMem, 0,
18760 20 28 75 38 2a 29 26 76 61 6c 75 65 2c 20 50 34   (u8*)&value, P4
18770 5f 52 45 41 4c 29 3b 0a 20 20 7d 0a 7d 0a 23 65  _REAL);.  }.}.#e
18780 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  ndif.../*.** Gen
18790 65 72 61 74 65 20 61 6e 20 69 6e 73 74 72 75 63  erate an instruc
187a0 74 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20 70  tion that will p
187b0 75 74 20 74 68 65 20 69 6e 74 65 67 65 72 20 64  ut the integer d
187c0 65 73 63 72 69 62 65 20 62 79 0a 2a 2a 20 74 65  escribe by.** te
187d0 78 74 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 69 6e 74  xt z[0..n-1] int
187e0 6f 20 72 65 67 69 73 74 65 72 20 69 4d 65 6d 2e  o register iMem.
187f0 0a 2a 2a 0a 2a 2a 20 45 78 70 72 2e 75 2e 7a 54  .**.** Expr.u.zT
18800 6f 6b 65 6e 20 69 73 20 61 6c 77 61 79 73 20 55  oken is always U
18810 54 46 38 20 61 6e 64 20 7a 65 72 6f 2d 74 65 72  TF8 and zero-ter
18820 6d 69 6e 61 74 65 64 2e 0a 2a 2f 0a 73 74 61 74  minated..*/.stat
18830 69 63 20 76 6f 69 64 20 63 6f 64 65 49 6e 74 65  ic void codeInte
18840 67 65 72 28 50 61 72 73 65 20 2a 70 50 61 72 73  ger(Parse *pPars
18850 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  e, Expr *pExpr, 
18860 69 6e 74 20 6e 65 67 46 6c 61 67 2c 20 69 6e 74  int negFlag, int
18870 20 69 4d 65 6d 29 7b 0a 20 20 56 64 62 65 20 2a   iMem){.  Vdbe *
18880 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
18890 65 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  e;.  if( pExpr->
188a0 66 6c 61 67 73 20 26 20 45 50 5f 49 6e 74 56 61  flags & EP_IntVa
188b0 6c 75 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  lue ){.    int i
188c0 20 3d 20 70 45 78 70 72 2d 3e 75 2e 69 56 61 6c   = pExpr->u.iVal
188d0 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ue;.    assert( 
188e0 69 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  i>=0 );.    if( 
188f0 6e 65 67 46 6c 61 67 20 29 20 69 20 3d 20 2d 69  negFlag ) i = -i
18900 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
18910 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
18920 74 65 67 65 72 2c 20 69 2c 20 69 4d 65 6d 29 3b  teger, i, iMem);
18930 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
18940 74 20 63 3b 0a 20 20 20 20 69 36 34 20 76 61 6c  t c;.    i64 val
18950 75 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  ue;.    const ch
18960 61 72 20 2a 7a 20 3d 20 70 45 78 70 72 2d 3e 75  ar *z = pExpr->u
18970 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 61 73 73  .zToken;.    ass
18980 65 72 74 28 20 7a 21 3d 30 20 29 3b 0a 20 20 20  ert( z!=0 );.   
18990 20 63 20 3d 20 73 71 6c 69 74 65 33 44 65 63 4f   c = sqlite3DecO
189a0 72 48 65 78 54 6f 49 36 34 28 7a 2c 20 26 76 61  rHexToI64(z, &va
189b0 6c 75 65 29 3b 0a 20 20 20 20 69 66 28 20 63 3d  lue);.    if( c=
189c0 3d 30 20 7c 7c 20 28 63 3d 3d 32 20 26 26 20 6e  =0 || (c==2 && n
189d0 65 67 46 6c 61 67 29 20 29 7b 0a 20 20 20 20 20  egFlag) ){.     
189e0 20 69 66 28 20 6e 65 67 46 6c 61 67 20 29 7b 20   if( negFlag ){ 
189f0 76 61 6c 75 65 20 3d 20 63 3d 3d 32 20 3f 20 53  value = c==2 ? S
18a00 4d 41 4c 4c 45 53 54 5f 49 4e 54 36 34 20 3a 20  MALLEST_INT64 : 
18a10 2d 76 61 6c 75 65 3b 20 7d 0a 20 20 20 20 20 20  -value; }.      
18a20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
18a30 34 44 75 70 38 28 76 2c 20 4f 50 5f 49 6e 74 36  4Dup8(v, OP_Int6
18a40 34 2c 20 30 2c 20 69 4d 65 6d 2c 20 30 2c 20 28  4, 0, iMem, 0, (
18a50 75 38 2a 29 26 76 61 6c 75 65 2c 20 50 34 5f 49  u8*)&value, P4_I
18a60 4e 54 36 34 29 3b 0a 20 20 20 20 7d 65 6c 73 65  NT64);.    }else
18a70 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
18a80 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f  OMIT_FLOATING_PO
18a90 49 4e 54 0a 20 20 20 20 20 20 73 71 6c 69 74 65  INT.      sqlite
18aa0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
18ab0 2c 20 22 6f 76 65 72 73 69 7a 65 64 20 69 6e 74  , "oversized int
18ac0 65 67 65 72 3a 20 25 73 25 73 22 2c 20 6e 65 67  eger: %s%s", neg
18ad0 46 6c 61 67 20 3f 20 22 2d 22 20 3a 20 22 22 2c  Flag ? "-" : "",
18ae0 20 7a 29 3b 0a 23 65 6c 73 65 0a 23 69 66 6e 64   z);.#else.#ifnd
18af0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 48  ef SQLITE_OMIT_H
18b00 45 58 5f 49 4e 54 45 47 45 52 0a 20 20 20 20 20  EX_INTEGER.     
18b10 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72   if( sqlite3_str
18b20 6e 69 63 6d 70 28 7a 2c 22 30 78 22 2c 32 29 3d  nicmp(z,"0x",2)=
18b30 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
18b40 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
18b50 61 72 73 65 2c 20 22 68 65 78 20 6c 69 74 65 72  arse, "hex liter
18b60 61 6c 20 74 6f 6f 20 62 69 67 3a 20 25 73 22 2c  al too big: %s",
18b70 20 7a 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   z);.      }else
18b80 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7b 0a  .#endif.      {.
18b90 20 20 20 20 20 20 20 20 63 6f 64 65 52 65 61 6c          codeReal
18ba0 28 76 2c 20 7a 2c 20 6e 65 67 46 6c 61 67 2c 20  (v, z, negFlag, 
18bb0 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 23  iMem);.      }.#
18bc0 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a  endif.    }.  }.
18bd0 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  }..#if defined(S
18be0 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a  QLITE_DEBUG)./*.
18bf0 2a 2a 20 56 65 72 69 66 79 20 74 68 65 20 63 6f  ** Verify the co
18c00 6e 73 69 73 74 65 6e 63 79 20 6f 66 20 74 68 65  nsistency of the
18c10 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 0a 2a 2f   column cache.*/
18c20 0a 73 74 61 74 69 63 20 69 6e 74 20 63 61 63 68  .static int cach
18c30 65 49 73 56 61 6c 69 64 28 50 61 72 73 65 20 2a  eIsValid(Parse *
18c40 70 50 61 72 73 65 29 7b 0a 20 20 69 6e 74 20 69  pParse){.  int i
18c50 2c 20 6e 3b 0a 20 20 66 6f 72 28 69 3d 6e 3d 30  , n;.  for(i=n=0
18c60 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c  ; i<SQLITE_N_COL
18c70 43 41 43 48 45 3b 20 69 2b 2b 29 7b 0a 20 20 20  CACHE; i++){.   
18c80 20 69 66 28 20 70 50 61 72 73 65 2d 3e 61 43 6f   if( pParse->aCo
18c90 6c 43 61 63 68 65 5b 69 5d 2e 69 52 65 67 3e 30  lCache[i].iReg>0
18ca0 20 29 20 6e 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65   ) n++;.  }.  re
18cb0 74 75 72 6e 20 6e 3d 3d 70 50 61 72 73 65 2d 3e  turn n==pParse->
18cc0 6e 43 6f 6c 43 61 63 68 65 3b 0a 7d 0a 23 65 6e  nColCache;.}.#en
18cd0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72  dif../*.** Clear
18ce0 20 61 20 63 61 63 68 65 20 65 6e 74 72 79 2e 0a   a cache entry..
18cf0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
18d00 61 63 68 65 45 6e 74 72 79 43 6c 65 61 72 28 50  acheEntryClear(P
18d10 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 73 74  arse *pParse, st
18d20 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a  ruct yColCache *
18d30 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 74 65 6d  p){.  if( p->tem
18d40 70 52 65 67 20 29 7b 0a 20 20 20 20 69 66 28 20  pReg ){.    if( 
18d50 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67  pParse->nTempReg
18d60 3c 41 72 72 61 79 53 69 7a 65 28 70 50 61 72 73  <ArraySize(pPars
18d70 65 2d 3e 61 54 65 6d 70 52 65 67 29 20 29 7b 0a  e->aTempReg) ){.
18d80 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61 54        pParse->aT
18d90 65 6d 70 52 65 67 5b 70 50 61 72 73 65 2d 3e 6e  empReg[pParse->n
18da0 54 65 6d 70 52 65 67 2b 2b 5d 20 3d 20 70 2d 3e  TempReg++] = p->
18db0 69 52 65 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20  iReg;.    }.    
18dc0 70 2d 3e 74 65 6d 70 52 65 67 20 3d 20 30 3b 0a  p->tempReg = 0;.
18dd0 20 20 7d 0a 20 20 70 2d 3e 69 52 65 67 20 3d 20    }.  p->iReg = 
18de0 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 43 6f  0;.  pParse->nCo
18df0 6c 43 61 63 68 65 2d 2d 3b 0a 20 20 61 73 73 65  lCache--;.  asse
18e00 72 74 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  rt( pParse->db->
18e10 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20  mallocFailed || 
18e20 63 61 63 68 65 49 73 56 61 6c 69 64 28 70 50 61  cacheIsValid(pPa
18e30 72 73 65 29 20 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  rse) );.}.../*.*
18e40 2a 20 52 65 63 6f 72 64 20 69 6e 20 74 68 65 20  * Record in the 
18e50 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 74 68 61  column cache tha
18e60 74 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 63  t a particular c
18e70 6f 6c 75 6d 6e 20 66 72 6f 6d 20 61 0a 2a 2a 20  olumn from a.** 
18e80 70 61 72 74 69 63 75 6c 61 72 20 74 61 62 6c 65  particular table
18e90 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 61 20   is stored in a 
18ea0 70 61 72 74 69 63 75 6c 61 72 20 72 65 67 69 73  particular regis
18eb0 74 65 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ter..*/.void sql
18ec0 69 74 65 33 45 78 70 72 43 61 63 68 65 53 74 6f  ite3ExprCacheSto
18ed0 72 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  re(Parse *pParse
18ee0 2c 20 69 6e 74 20 69 54 61 62 2c 20 69 6e 74 20  , int iTab, int 
18ef0 69 43 6f 6c 2c 20 69 6e 74 20 69 52 65 67 29 7b  iCol, int iReg){
18f00 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
18f10 6d 69 6e 4c 72 75 3b 0a 20 20 69 6e 74 20 69 64  minLru;.  int id
18f20 78 4c 72 75 3b 0a 20 20 73 74 72 75 63 74 20 79  xLru;.  struct y
18f30 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 0a 20 20  ColCache *p;..  
18f40 2f 2a 20 55 6e 6c 65 73 73 20 61 6e 20 65 72 72  /* Unless an err
18f50 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65 64 2c  or has occurred,
18f60 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72   register number
18f70 73 20 61 72 65 20 61 6c 77 61 79 73 20 70 6f 73  s are always pos
18f80 69 74 69 76 65 2e 20 2a 2f 0a 20 20 61 73 73 65  itive. */.  asse
18f90 72 74 28 20 69 52 65 67 3e 30 20 7c 7c 20 70 50  rt( iReg>0 || pP
18fa0 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 70 50  arse->nErr || pP
18fb0 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
18fc0 46 61 69 6c 65 64 20 29 3b 0a 20 20 61 73 73 65  Failed );.  asse
18fd0 72 74 28 20 69 43 6f 6c 3e 3d 2d 31 20 26 26 20  rt( iCol>=-1 && 
18fe0 69 43 6f 6c 3c 33 32 37 36 38 20 29 3b 20 20 2f  iCol<32768 );  /
18ff0 2a 20 46 69 6e 69 74 65 20 63 6f 6c 75 6d 6e 20  * Finite column 
19000 6e 75 6d 62 65 72 73 20 2a 2f 0a 0a 20 20 2f 2a  numbers */..  /*
19010 20 54 68 65 20 53 51 4c 49 54 45 5f 43 6f 6c 75   The SQLITE_Colu
19020 6d 6e 43 61 63 68 65 20 66 6c 61 67 20 64 69 73  mnCache flag dis
19030 61 62 6c 65 73 20 74 68 65 20 63 6f 6c 75 6d 6e  ables the column
19040 20 63 61 63 68 65 2e 20 20 54 68 69 73 20 69 73   cache.  This is
19050 20 75 73 65 64 0a 20 20 2a 2a 20 66 6f 72 20 74   used.  ** for t
19060 65 73 74 69 6e 67 20 6f 6e 6c 79 20 2d 20 74 6f  esting only - to
19070 20 76 65 72 69 66 79 20 74 68 61 74 20 53 51 4c   verify that SQL
19080 69 74 65 20 61 6c 77 61 79 73 20 67 65 74 73 20  ite always gets 
19090 74 68 65 20 73 61 6d 65 20 61 6e 73 77 65 72 0a  the same answer.
190a0 20 20 2a 2a 20 77 69 74 68 20 61 6e 64 20 77 69    ** with and wi
190b0 74 68 6f 75 74 20 74 68 65 20 63 6f 6c 75 6d 6e  thout the column
190c0 20 63 61 63 68 65 2e 0a 20 20 2a 2f 0a 20 20 69   cache..  */.  i
190d0 66 28 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 44  f( OptimizationD
190e0 69 73 61 62 6c 65 64 28 70 50 61 72 73 65 2d 3e  isabled(pParse->
190f0 64 62 2c 20 53 51 4c 49 54 45 5f 43 6f 6c 75 6d  db, SQLITE_Colum
19100 6e 43 61 63 68 65 29 20 29 20 72 65 74 75 72 6e  nCache) ) return
19110 3b 0a 0a 20 20 2f 2a 20 46 69 72 73 74 20 72 65  ;..  /* First re
19120 70 6c 61 63 65 20 61 6e 79 20 65 78 69 73 74 69  place any existi
19130 6e 67 20 65 6e 74 72 79 2e 0a 20 20 2a 2a 0a 20  ng entry..  **. 
19140 20 2a 2a 20 41 63 74 75 61 6c 6c 79 2c 20 74 68   ** Actually, th
19150 65 20 77 61 79 20 74 68 65 20 63 6f 6c 75 6d 6e  e way the column
19160 20 63 61 63 68 65 20 69 73 20 63 75 72 72 65 6e   cache is curren
19170 74 6c 79 20 75 73 65 64 2c 20 77 65 20 61 72 65  tly used, we are
19180 20 67 75 61 72 61 6e 74 65 65 64 0a 20 20 2a 2a   guaranteed.  **
19190 20 74 68 61 74 20 74 68 65 20 6f 62 6a 65 63 74   that the object
191a0 20 77 69 6c 6c 20 6e 65 76 65 72 20 61 6c 72 65   will never alre
191b0 61 64 79 20 62 65 20 69 6e 20 63 61 63 68 65 2e  ady be in cache.
191c0 20 20 56 65 72 69 66 79 20 74 68 69 73 20 67 75    Verify this gu
191d0 61 72 61 6e 74 65 65 2e 0a 20 20 2a 2f 0a 23 69  arantee..  */.#i
191e0 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 66  fndef NDEBUG.  f
191f0 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65  or(i=0, p=pParse
19200 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53  ->aColCache; i<S
19210 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45  QLITE_N_COLCACHE
19220 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20  ; i++, p++){.   
19230 20 61 73 73 65 72 74 28 20 70 2d 3e 69 52 65 67   assert( p->iReg
19240 3d 3d 30 20 7c 7c 20 70 2d 3e 69 54 61 62 6c 65  ==0 || p->iTable
19250 21 3d 69 54 61 62 20 7c 7c 20 70 2d 3e 69 43 6f  !=iTab || p->iCo
19260 6c 75 6d 6e 21 3d 69 43 6f 6c 20 29 3b 0a 20 20  lumn!=iCol );.  
19270 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 46  }.#endif..  /* F
19280 69 6e 64 20 61 6e 20 65 6d 70 74 79 20 73 6c 6f  ind an empty slo
19290 74 20 61 6e 64 20 72 65 70 6c 61 63 65 20 69 74  t and replace it
192a0 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70   */.  for(i=0, p
192b0 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63  =pParse->aColCac
192c0 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43  he; i<SQLITE_N_C
192d0 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b  OLCACHE; i++, p+
192e0 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69  +){.    if( p->i
192f0 52 65 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Reg==0 ){.      
19300 70 2d 3e 69 4c 65 76 65 6c 20 3d 20 70 50 61 72  p->iLevel = pPar
19310 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 3b  se->iCacheLevel;
19320 0a 20 20 20 20 20 20 70 2d 3e 69 54 61 62 6c 65  .      p->iTable
19330 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 20 20 70   = iTab;.      p
19340 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69 43 6f 6c  ->iColumn = iCol
19350 3b 0a 20 20 20 20 20 20 70 2d 3e 69 52 65 67 20  ;.      p->iReg 
19360 3d 20 69 52 65 67 3b 0a 20 20 20 20 20 20 70 2d  = iReg;.      p-
19370 3e 74 65 6d 70 52 65 67 20 3d 20 30 3b 0a 20 20  >tempReg = 0;.  
19380 20 20 20 20 70 2d 3e 6c 72 75 20 3d 20 70 50 61      p->lru = pPa
19390 72 73 65 2d 3e 69 43 61 63 68 65 43 6e 74 2b 2b  rse->iCacheCnt++
193a0 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
193b0 6e 43 6f 6c 43 61 63 68 65 2b 2b 3b 0a 20 20 20  nColCache++;.   
193c0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73     assert( pPars
193d0 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
193e0 6c 65 64 20 7c 7c 20 63 61 63 68 65 49 73 56 61  led || cacheIsVa
193f0 6c 69 64 28 70 50 61 72 73 65 29 20 29 3b 0a 20  lid(pParse) );. 
19400 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
19410 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 70   }.  }..  /* Rep
19420 6c 61 63 65 20 74 68 65 20 6c 61 73 74 20 72 65  lace the last re
19430 63 65 6e 74 6c 79 20 75 73 65 64 20 2a 2f 0a 20  cently used */. 
19440 20 6d 69 6e 4c 72 75 20 3d 20 30 78 37 66 66 66   minLru = 0x7fff
19450 66 66 66 66 3b 0a 20 20 69 64 78 4c 72 75 20 3d  ffff;.  idxLru =
19460 20 2d 31 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20   -1;.  for(i=0, 
19470 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61  p=pParse->aColCa
19480 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f  che; i<SQLITE_N_
19490 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70  COLCACHE; i++, p
194a0 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  ++){.    if( p->
194b0 6c 72 75 3c 6d 69 6e 4c 72 75 20 29 7b 0a 20 20  lru<minLru ){.  
194c0 20 20 20 20 69 64 78 4c 72 75 20 3d 20 69 3b 0a      idxLru = i;.
194d0 20 20 20 20 20 20 6d 69 6e 4c 72 75 20 3d 20 70        minLru = p
194e0 2d 3e 6c 72 75 3b 0a 20 20 20 20 7d 0a 20 20 7d  ->lru;.    }.  }
194f0 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 69 64  .  if( ALWAYS(id
19500 78 4c 72 75 3e 3d 30 29 20 29 7b 0a 20 20 20 20  xLru>=0) ){.    
19510 70 20 3d 20 26 70 50 61 72 73 65 2d 3e 61 43 6f  p = &pParse->aCo
19520 6c 43 61 63 68 65 5b 69 64 78 4c 72 75 5d 3b 0a  lCache[idxLru];.
19530 20 20 20 20 70 2d 3e 69 4c 65 76 65 6c 20 3d 20      p->iLevel = 
19540 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65  pParse->iCacheLe
19550 76 65 6c 3b 0a 20 20 20 20 70 2d 3e 69 54 61 62  vel;.    p->iTab
19560 6c 65 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 70  le = iTab;.    p
19570 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69 43 6f 6c  ->iColumn = iCol
19580 3b 0a 20 20 20 20 70 2d 3e 69 52 65 67 20 3d 20  ;.    p->iReg = 
19590 69 52 65 67 3b 0a 20 20 20 20 70 2d 3e 74 65 6d  iReg;.    p->tem
195a0 70 52 65 67 20 3d 20 30 3b 0a 20 20 20 20 70 2d  pReg = 0;.    p-
195b0 3e 6c 72 75 20 3d 20 70 50 61 72 73 65 2d 3e 69  >lru = pParse->i
195c0 43 61 63 68 65 43 6e 74 2b 2b 3b 0a 20 20 20 20  CacheCnt++;.    
195d0 61 73 73 65 72 74 28 20 63 61 63 68 65 49 73 56  assert( cacheIsV
195e0 61 6c 69 64 28 70 50 61 72 73 65 29 20 29 3b 0a  alid(pParse) );.
195f0 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
19600 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64 69 63 61 74  }../*.** Indicat
19610 65 20 74 68 61 74 20 72 65 67 69 73 74 65 72 73  e that registers
19620 20 62 65 74 77 65 65 6e 20 69 52 65 67 2e 2e 69   between iReg..i
19630 52 65 67 2b 6e 52 65 67 2d 31 20 61 72 65 20 62  Reg+nReg-1 are b
19640 65 69 6e 67 20 6f 76 65 72 77 72 69 74 74 65 6e  eing overwritten
19650 2e 0a 2a 2a 20 50 75 72 67 65 20 74 68 65 20 72  ..** Purge the r
19660 61 6e 67 65 20 6f 66 20 72 65 67 69 73 74 65 72  ange of register
19670 73 20 66 72 6f 6d 20 74 68 65 20 63 6f 6c 75 6d  s from the colum
19680 6e 20 63 61 63 68 65 2e 0a 2a 2f 0a 76 6f 69 64  n cache..*/.void
19690 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
196a0 65 52 65 6d 6f 76 65 28 50 61 72 73 65 20 2a 70  eRemove(Parse *p
196b0 50 61 72 73 65 2c 20 69 6e 74 20 69 52 65 67 2c  Parse, int iReg,
196c0 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20 73 74   int nReg){.  st
196d0 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a  ruct yColCache *
196e0 70 3b 0a 20 20 69 66 28 20 69 52 65 67 3c 3d 30  p;.  if( iReg<=0
196f0 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 43 6f 6c   || pParse->nCol
19700 43 61 63 68 65 3d 3d 30 20 29 20 72 65 74 75 72  Cache==0 ) retur
19710 6e 3b 0a 20 20 70 20 3d 20 26 70 50 61 72 73 65  n;.  p = &pParse
19720 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 53 51 4c 49  ->aColCache[SQLI
19730 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 2d 31 5d  TE_N_COLCACHE-1]
19740 3b 0a 20 20 77 68 69 6c 65 28 31 29 7b 0a 20 20  ;.  while(1){.  
19750 20 20 69 66 28 20 70 2d 3e 69 52 65 67 20 3e 3d    if( p->iReg >=
19760 20 69 52 65 67 20 26 26 20 70 2d 3e 69 52 65 67   iReg && p->iReg
19770 20 3c 20 69 52 65 67 2b 6e 52 65 67 20 29 20 63   < iReg+nReg ) c
19780 61 63 68 65 45 6e 74 72 79 43 6c 65 61 72 28 70  acheEntryClear(p
19790 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 69  Parse, p);.    i
197a0 66 28 20 70 3d 3d 70 50 61 72 73 65 2d 3e 61 43  f( p==pParse->aC
197b0 6f 6c 43 61 63 68 65 20 29 20 62 72 65 61 6b 3b  olCache ) break;
197c0 0a 20 20 20 20 70 2d 2d 3b 0a 20 20 7d 0a 7d 0a  .    p--;.  }.}.
197d0 0a 2f 2a 0a 2a 2a 20 52 65 6d 65 6d 62 65 72 20  ./*.** Remember 
197e0 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6c 75  the current colu
197f0 6d 6e 20 63 61 63 68 65 20 63 6f 6e 74 65 78 74  mn cache context
19800 2e 20 20 41 6e 79 20 6e 65 77 20 65 6e 74 72 69  .  Any new entri
19810 65 73 20 61 64 64 65 64 0a 2a 2a 20 61 64 64 65  es added.** adde
19820 64 20 74 6f 20 74 68 65 20 63 6f 6c 75 6d 6e 20  d to the column 
19830 63 61 63 68 65 20 61 66 74 65 72 20 74 68 69 73  cache after this
19840 20 63 61 6c 6c 20 61 72 65 20 72 65 6d 6f 76 65   call are remove
19850 64 20 77 68 65 6e 20 74 68 65 0a 2a 2a 20 63 6f  d when the.** co
19860 72 72 65 73 70 6f 6e 64 69 6e 67 20 70 6f 70 20  rresponding pop 
19870 6f 63 63 75 72 73 2e 0a 2a 2f 0a 76 6f 69 64 20  occurs..*/.void 
19880 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
19890 50 75 73 68 28 50 61 72 73 65 20 2a 70 50 61 72  Push(Parse *pPar
198a0 73 65 29 7b 0a 20 20 70 50 61 72 73 65 2d 3e 69  se){.  pParse->i
198b0 43 61 63 68 65 4c 65 76 65 6c 2b 2b 3b 0a 23 69  CacheLevel++;.#i
198c0 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
198d0 47 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  G.  if( pParse->
198e0 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
198f0 54 45 5f 56 64 62 65 41 64 64 6f 70 54 72 61 63  TE_VdbeAddopTrac
19900 65 20 29 7b 0a 20 20 20 20 70 72 69 6e 74 66 28  e ){.    printf(
19910 22 50 55 53 48 20 74 6f 20 25 64 5c 6e 22 2c 20  "PUSH to %d\n", 
19920 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65  pParse->iCacheLe
19930 76 65 6c 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  vel);.  }.#endif
19940 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65  .}../*.** Remove
19950 20 66 72 6f 6d 20 74 68 65 20 63 6f 6c 75 6d 6e   from the column
19960 20 63 61 63 68 65 20 61 6e 79 20 65 6e 74 72 69   cache any entri
19970 65 73 20 74 68 61 74 20 77 65 72 65 20 61 64 64  es that were add
19980 65 64 20 73 69 6e 63 65 20 74 68 65 0a 2a 2a 20  ed since the.** 
19990 74 68 65 20 70 72 65 76 69 6f 75 73 20 73 71 6c  the previous sql
199a0 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73  ite3ExprCachePus
199b0 68 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 49 6e  h operation.  In
199c0 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 72 65   other words, re
199d0 73 74 6f 72 65 0a 2a 2a 20 74 68 65 20 63 61 63  store.** the cac
199e0 68 65 20 74 6f 20 74 68 65 20 73 74 61 74 65 20  he to the state 
199f0 69 74 20 77 61 73 20 69 6e 20 70 72 69 6f 72 20  it was in prior 
19a00 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20  the most recent 
19a10 50 75 73 68 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  Push..*/.void sq
19a20 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f  lite3ExprCachePo
19a30 70 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  p(Parse *pParse)
19a40 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72  {.  int i;.  str
19a50 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70  uct yColCache *p
19a60 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ;.  assert( pPar
19a70 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 3e  se->iCacheLevel>
19a80 3d 31 20 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e  =1 );.  pParse->
19a90 69 43 61 63 68 65 4c 65 76 65 6c 2d 2d 3b 0a 23  iCacheLevel--;.#
19aa0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
19ab0 55 47 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  UG.  if( pParse-
19ac0 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  >db->flags & SQL
19ad0 49 54 45 5f 56 64 62 65 41 64 64 6f 70 54 72 61  ITE_VdbeAddopTra
19ae0 63 65 20 29 7b 0a 20 20 20 20 70 72 69 6e 74 66  ce ){.    printf
19af0 28 22 50 4f 50 20 20 74 6f 20 25 64 5c 6e 22 2c  ("POP  to %d\n",
19b00 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c   pParse->iCacheL
19b10 65 76 65 6c 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  evel);.  }.#endi
19b20 66 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70  f.  for(i=0, p=p
19b30 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65  Parse->aColCache
19b40 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c  ; i<SQLITE_N_COL
19b50 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29  CACHE; i++, p++)
19b60 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 52 65  {.    if( p->iRe
19b70 67 20 26 26 20 70 2d 3e 69 4c 65 76 65 6c 3e 70  g && p->iLevel>p
19b80 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76  Parse->iCacheLev
19b90 65 6c 20 29 7b 0a 20 20 20 20 20 20 63 61 63 68  el ){.      cach
19ba0 65 45 6e 74 72 79 43 6c 65 61 72 28 70 50 61 72  eEntryClear(pPar
19bb0 73 65 2c 20 70 29 3b 0a 20 20 20 20 7d 0a 20 20  se, p);.    }.  
19bc0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20  }.}../*.** When 
19bd0 61 20 63 61 63 68 65 64 20 63 6f 6c 75 6d 6e 20  a cached column 
19be0 69 73 20 72 65 75 73 65 64 2c 20 6d 61 6b 65 20  is reused, make 
19bf0 73 75 72 65 20 74 68 61 74 20 69 74 73 20 72 65  sure that its re
19c00 67 69 73 74 65 72 20 69 73 0a 2a 2a 20 6e 6f 20  gister is.** no 
19c10 6c 6f 6e 67 65 72 20 61 76 61 69 6c 61 62 6c 65  longer available
19c20 20 61 73 20 61 20 74 65 6d 70 20 72 65 67 69 73   as a temp regis
19c30 74 65 72 2e 20 20 74 69 63 6b 65 74 20 23 33 38  ter.  ticket #38
19c40 37 39 3a 20 20 74 68 61 74 20 73 61 6d 65 0a 2a  79:  that same.*
19c50 2a 20 72 65 67 69 73 74 65 72 20 6d 69 67 68 74  * register might
19c60 20 62 65 20 69 6e 20 74 68 65 20 63 61 63 68 65   be in the cache
19c70 20 69 6e 20 6d 75 6c 74 69 70 6c 65 20 70 6c 61   in multiple pla
19c80 63 65 73 2c 20 73 6f 20 62 65 20 73 75 72 65 20  ces, so be sure 
19c90 74 6f 0a 2a 2a 20 67 65 74 20 74 68 65 6d 20 61  to.** get them a
19ca0 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ll..*/.static vo
19cb0 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  id sqlite3ExprCa
19cc0 63 68 65 50 69 6e 52 65 67 69 73 74 65 72 28 50  chePinRegister(P
19cd0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
19ce0 74 20 69 52 65 67 29 7b 0a 20 20 69 6e 74 20 69  t iReg){.  int i
19cf0 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43  ;.  struct yColC
19d00 61 63 68 65 20 2a 70 3b 0a 20 20 66 6f 72 28 69  ache *p;.  for(i
19d10 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43  =0, p=pParse->aC
19d20 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54  olCache; i<SQLIT
19d30 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b  E_N_COLCACHE; i+
19d40 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28  +, p++){.    if(
19d50 20 70 2d 3e 69 52 65 67 3d 3d 69 52 65 67 20 29   p->iReg==iReg )
19d60 7b 0a 20 20 20 20 20 20 70 2d 3e 74 65 6d 70 52  {.      p->tempR
19d70 65 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  eg = 0;.    }.  
19d80 7d 0a 7d 0a 0a 2f 2a 20 47 65 6e 65 72 61 74 65  }.}../* Generate
19d90 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
19da0 6c 6f 61 64 20 69 6e 74 6f 20 72 65 67 69 73 74  load into regist
19db0 65 72 20 72 65 67 4f 75 74 20 61 20 76 61 6c 75  er regOut a valu
19dc0 65 20 74 68 61 74 20 69 73 0a 2a 2a 20 61 70 70  e that is.** app
19dd0 72 6f 70 72 69 61 74 65 20 66 6f 72 20 74 68 65  ropriate for the
19de0 20 69 49 64 78 43 6f 6c 2d 74 68 20 63 6f 6c 75   iIdxCol-th colu
19df0 6d 6e 20 6f 66 20 69 6e 64 65 78 20 70 49 64 78  mn of index pIdx
19e00 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
19e10 33 45 78 70 72 43 6f 64 65 4c 6f 61 64 49 6e 64  3ExprCodeLoadInd
19e20 65 78 43 6f 6c 75 6d 6e 28 0a 20 20 50 61 72 73  exColumn(.  Pars
19e30 65 20 2a 70 50 61 72 73 65 2c 20 20 2f 2a 20 54  e *pParse,  /* T
19e40 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65  he parsing conte
19e50 78 74 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  xt */.  Index *p
19e60 49 64 78 2c 20 20 20 20 2f 2a 20 54 68 65 20 69  Idx,    /* The i
19e70 6e 64 65 78 20 77 68 6f 73 65 20 63 6f 6c 75 6d  ndex whose colum
19e80 6e 20 69 73 20 74 6f 20 62 65 20 6c 6f 61 64 65  n is to be loade
19e90 64 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 43  d */.  int iTabC
19ea0 75 72 2c 20 20 20 20 2f 2a 20 43 75 72 73 6f 72  ur,    /* Cursor
19eb0 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 74   pointing to a t
19ec0 61 62 6c 65 20 72 6f 77 20 2a 2f 0a 20 20 69 6e  able row */.  in
19ed0 74 20 69 49 64 78 43 6f 6c 2c 20 20 20 20 2f 2a  t iIdxCol,    /*
19ee0 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74   The column of t
19ef0 68 65 20 69 6e 64 65 78 20 74 6f 20 62 65 20 6c  he index to be l
19f00 6f 61 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 72  oaded */.  int r
19f10 65 67 4f 75 74 20 20 20 20 20 20 2f 2a 20 53 74  egOut      /* St
19f20 6f 72 65 20 74 68 65 20 69 6e 64 65 78 20 63 6f  ore the index co
19f30 6c 75 6d 6e 20 76 61 6c 75 65 20 69 6e 20 74 68  lumn value in th
19f40 69 73 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 29  is register */.)
19f50 7b 0a 20 20 69 31 36 20 69 54 61 62 43 6f 6c 20  {.  i16 iTabCol 
19f60 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  = pIdx->aiColumn
19f70 5b 69 49 64 78 43 6f 6c 5d 3b 0a 20 20 69 66 28  [iIdxCol];.  if(
19f80 20 69 54 61 62 43 6f 6c 3d 3d 58 4e 5f 45 58 50   iTabCol==XN_EXP
19f90 52 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  R ){.    assert(
19fa0 20 70 49 64 78 2d 3e 61 43 6f 6c 45 78 70 72 20   pIdx->aColExpr 
19fb0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
19fc0 49 64 78 2d 3e 61 43 6f 6c 45 78 70 72 2d 3e 6e  Idx->aColExpr->n
19fd0 45 78 70 72 3e 69 49 64 78 43 6f 6c 20 29 3b 0a  Expr>iIdxCol );.
19fe0 20 20 20 20 70 50 61 72 73 65 2d 3e 69 53 65 6c      pParse->iSel
19ff0 66 54 61 62 20 3d 20 69 54 61 62 43 75 72 3b 0a  fTab = iTabCur;.
1a000 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
1a010 6f 64 65 43 6f 70 79 28 70 50 61 72 73 65 2c 20  odeCopy(pParse, 
1a020 70 49 64 78 2d 3e 61 43 6f 6c 45 78 70 72 2d 3e  pIdx->aColExpr->
1a030 61 5b 69 49 64 78 43 6f 6c 5d 2e 70 45 78 70 72  a[iIdxCol].pExpr
1a040 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20 7d 65 6c  , regOut);.  }el
1a050 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  se{.    sqlite3E
1a060 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e  xprCodeGetColumn
1a070 4f 66 54 61 62 6c 65 28 70 50 61 72 73 65 2d 3e  OfTable(pParse->
1a080 70 56 64 62 65 2c 20 70 49 64 78 2d 3e 70 54 61  pVdbe, pIdx->pTa
1a090 62 6c 65 2c 20 69 54 61 62 43 75 72 2c 0a 20 20  ble, iTabCur,.  
1a0a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a0b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a0c0 20 20 69 54 61 62 43 6f 6c 2c 20 72 65 67 4f 75    iTabCol, regOu
1a0d0 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  t);.  }.}../*.**
1a0e0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
1a0f0 6f 20 65 78 74 72 61 63 74 20 74 68 65 20 76 61  o extract the va
1a100 6c 75 65 20 6f 66 20 74 68 65 20 69 43 6f 6c 2d  lue of the iCol-
1a110 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 20 74  th column of a t
1a120 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  able..*/.void sq
1a130 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74  lite3ExprCodeGet
1a140 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65 28 0a 20  ColumnOfTable(. 
1a150 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20 20 20   Vdbe *v,       
1a160 20 2f 2a 20 54 68 65 20 56 44 42 45 20 75 6e 64   /* The VDBE und
1a170 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20  er construction 
1a180 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  */.  Table *pTab
1a190 2c 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c  ,    /* The tabl
1a1a0 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  e containing the
1a1b0 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20   value */.  int 
1a1c0 69 54 61 62 43 75 72 2c 20 20 20 20 2f 2a 20 54  iTabCur,    /* T
1a1d0 68 65 20 74 61 62 6c 65 20 63 75 72 73 6f 72 2e  he table cursor.
1a1e0 20 20 4f 72 20 74 68 65 20 50 4b 20 63 75 72 73    Or the PK curs
1a1f0 6f 72 20 66 6f 72 20 57 49 54 48 4f 55 54 20 52  or for WITHOUT R
1a200 4f 57 49 44 20 2a 2f 0a 20 20 69 6e 74 20 69 43  OWID */.  int iC
1a210 6f 6c 2c 20 20 20 20 20 20 20 2f 2a 20 49 6e 64  ol,       /* Ind
1a220 65 78 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  ex of the column
1a230 20 74 6f 20 65 78 74 72 61 63 74 20 2a 2f 0a 20   to extract */. 
1a240 20 69 6e 74 20 72 65 67 4f 75 74 20 20 20 20 20   int regOut     
1a250 20 2f 2a 20 45 78 74 72 61 63 74 20 74 68 65 20   /* Extract the 
1a260 76 61 6c 75 65 20 69 6e 74 6f 20 74 68 69 73 20  value into this 
1a270 72 65 67 69 73 74 65 72 20 2a 2f 0a 29 7b 0a 20  register */.){. 
1a280 20 69 66 28 20 69 43 6f 6c 3c 30 20 7c 7c 20 69   if( iCol<0 || i
1a290 43 6f 6c 3d 3d 70 54 61 62 2d 3e 69 50 4b 65 79  Col==pTab->iPKey
1a2a0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
1a2b0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1a2c0 52 6f 77 69 64 2c 20 69 54 61 62 43 75 72 2c 20  Rowid, iTabCur, 
1a2d0 72 65 67 4f 75 74 29 3b 0a 20 20 7d 65 6c 73 65  regOut);.  }else
1a2e0 7b 0a 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 49  {.    int op = I
1a2f0 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 3f  sVirtual(pTab) ?
1a300 20 4f 50 5f 56 43 6f 6c 75 6d 6e 20 3a 20 4f 50   OP_VColumn : OP
1a310 5f 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 69 6e 74  _Column;.    int
1a320 20 78 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 69   x = iCol;.    i
1a330 66 28 20 21 48 61 73 52 6f 77 69 64 28 70 54 61  f( !HasRowid(pTa
1a340 62 29 20 26 26 20 21 49 73 56 69 72 74 75 61 6c  b) && !IsVirtual
1a350 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20  (pTab) ){.      
1a360 78 20 3d 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d  x = sqlite3Colum
1a370 6e 4f 66 49 6e 64 65 78 28 73 71 6c 69 74 65 33  nOfIndex(sqlite3
1a380 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28  PrimaryKeyIndex(
1a390 70 54 61 62 29 2c 20 69 43 6f 6c 29 3b 0a 20 20  pTab), iCol);.  
1a3a0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56    }.    sqlite3V
1a3b0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 6f 70 2c  dbeAddOp3(v, op,
1a3c0 20 69 54 61 62 43 75 72 2c 20 78 2c 20 72 65 67   iTabCur, x, reg
1a3d0 4f 75 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Out);.  }.  if( 
1a3e0 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20 20 20 20 73  iCol>=0 ){.    s
1a3f0 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 44 65 66 61  qlite3ColumnDefa
1a400 75 6c 74 28 76 2c 20 70 54 61 62 2c 20 69 43 6f  ult(v, pTab, iCo
1a410 6c 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20 7d 0a  l, regOut);.  }.
1a420 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
1a430 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
1a440 20 65 78 74 72 61 63 74 20 74 68 65 20 69 43 6f   extract the iCo
1a450 6c 75 6d 6e 2d 74 68 20 63 6f 6c 75 6d 6e 20 66  lumn-th column f
1a460 72 6f 6d 0a 2a 2a 20 74 61 62 6c 65 20 70 54 61  rom.** table pTa
1a470 62 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20  b and store the 
1a480 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69 6e 20  column value in 
1a490 61 20 72 65 67 69 73 74 65 72 2e 20 0a 2a 2a 0a  a register. .**.
1a4a0 2a 2a 20 41 6e 20 65 66 66 6f 72 74 20 69 73 20  ** An effort is 
1a4b0 6d 61 64 65 20 74 6f 20 73 74 6f 72 65 20 74 68  made to store th
1a4c0 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69  e column value i
1a4d0 6e 20 72 65 67 69 73 74 65 72 20 69 52 65 67 2e  n register iReg.
1a4e0 20 20 54 68 69 73 0a 2a 2a 20 69 73 20 6e 6f 74    This.** is not
1a4f0 20 67 61 72 61 6e 74 65 65 65 64 20 66 6f 72 20   garanteeed for 
1a500 47 65 74 43 6f 6c 75 6d 6e 28 29 20 2d 20 74 68  GetColumn() - th
1a510 65 20 72 65 73 75 6c 74 20 63 61 6e 20 62 65 20  e result can be 
1a520 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 61 6e 79  stored in.** any
1a530 20 72 65 67 69 73 74 65 72 2e 20 20 42 75 74 20   register.  But 
1a540 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 67 75  the result is gu
1a550 61 72 61 6e 74 65 65 64 20 74 6f 20 6c 61 6e 64  aranteed to land
1a560 20 69 6e 20 72 65 67 69 73 74 65 72 20 69 52 65   in register iRe
1a570 67 0a 2a 2a 20 66 6f 72 20 47 65 74 43 6f 6c 75  g.** for GetColu
1a580 6d 6e 54 6f 52 65 67 28 29 2e 0a 2a 2a 0a 2a 2a  mnToReg()..**.**
1a590 20 54 68 65 72 65 20 6d 75 73 74 20 62 65 20 61   There must be a
1a5a0 6e 20 6f 70 65 6e 20 63 75 72 73 6f 72 20 74 6f  n open cursor to
1a5b0 20 70 54 61 62 20 69 6e 20 69 54 61 62 6c 65 20   pTab in iTable 
1a5c0 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  when this routin
1a5d0 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 2e 20  e.** is called. 
1a5e0 20 49 66 20 69 43 6f 6c 75 6d 6e 3c 30 20 74 68   If iColumn<0 th
1a5f0 65 6e 20 63 6f 64 65 20 69 73 20 67 65 6e 65 72  en code is gener
1a600 61 74 65 64 20 74 68 61 74 20 65 78 74 72 61 63  ated that extrac
1a610 74 73 20 74 68 65 20 72 6f 77 69 64 2e 0a 2a 2f  ts the rowid..*/
1a620 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
1a630 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28 0a 20  CodeGetColumn(. 
1a640 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
1a650 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64    /* Parsing and
1a660 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67   code generating
1a670 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 61   context */.  Ta
1a680 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20 2f  ble *pTab,     /
1a690 2a 20 44 65 73 63 72 69 70 74 69 6f 6e 20 6f 66  * Description of
1a6a0 20 74 68 65 20 74 61 62 6c 65 20 77 65 20 61 72   the table we ar
1a6b0 65 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20 2a  e reading from *
1a6c0 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c  /.  int iColumn,
1a6d0 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
1a6e0 20 74 68 65 20 74 61 62 6c 65 20 63 6f 6c 75 6d   the table colum
1a6f0 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c  n */.  int iTabl
1a700 65 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63  e,      /* The c
1a710 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74  ursor pointing t
1a720 6f 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20  o the table */. 
1a730 20 69 6e 74 20 69 52 65 67 2c 20 20 20 20 20 20   int iReg,      
1a740 20 20 2f 2a 20 53 74 6f 72 65 20 72 65 73 75 6c    /* Store resul
1a750 74 73 20 68 65 72 65 20 2a 2f 0a 20 20 75 38 20  ts here */.  u8 
1a760 70 35 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p5            /*
1a770 20 50 35 20 76 61 6c 75 65 20 66 6f 72 20 4f 50   P5 value for OP
1a780 5f 43 6f 6c 75 6d 6e 20 2b 20 46 4c 41 47 53 20  _Column + FLAGS 
1a790 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  */.){.  Vdbe *v 
1a7a0 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
1a7b0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75  .  int i;.  stru
1a7c0 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b  ct yColCache *p;
1a7d0 0a 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70  ..  for(i=0, p=p
1a7e0 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65  Parse->aColCache
1a7f0 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c  ; i<SQLITE_N_COL
1a800 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29  CACHE; i++, p++)
1a810 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 52 65  {.    if( p->iRe
1a820 67 3e 30 20 26 26 20 70 2d 3e 69 54 61 62 6c 65  g>0 && p->iTable
1a830 3d 3d 69 54 61 62 6c 65 20 26 26 20 70 2d 3e 69  ==iTable && p->i
1a840 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e 20  Column==iColumn 
1a850 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6c 72 75 20  ){.      p->lru 
1a860 3d 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65  = pParse->iCache
1a870 43 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c  Cnt++;.      sql
1a880 69 74 65 33 45 78 70 72 43 61 63 68 65 50 69 6e  ite3ExprCachePin
1a890 52 65 67 69 73 74 65 72 28 70 50 61 72 73 65 2c  Register(pParse,
1a8a0 20 70 2d 3e 69 52 65 67 29 3b 0a 20 20 20 20 20   p->iReg);.     
1a8b0 20 72 65 74 75 72 6e 20 70 2d 3e 69 52 65 67 3b   return p->iReg;
1a8c0 0a 20 20 20 20 7d 0a 20 20 7d 20 20 0a 20 20 61  .    }.  }  .  a
1a8d0 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20  ssert( v!=0 );. 
1a8e0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1a8f0 47 65 74 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65  GetColumnOfTable
1a900 28 76 2c 20 70 54 61 62 2c 20 69 54 61 62 6c 65  (v, pTab, iTable
1a910 2c 20 69 43 6f 6c 75 6d 6e 2c 20 69 52 65 67 29  , iColumn, iReg)
1a920 3b 0a 20 20 69 66 28 20 70 35 20 29 7b 0a 20 20  ;.  if( p5 ){.  
1a930 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
1a940 6e 67 65 50 35 28 76 2c 20 70 35 29 3b 0a 20 20  ngeP5(v, p5);.  
1a950 7d 65 6c 73 65 7b 20 20 20 0a 20 20 20 20 73 71  }else{   .    sq
1a960 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 53 74  lite3ExprCacheSt
1a970 6f 72 65 28 70 50 61 72 73 65 2c 20 69 54 61 62  ore(pParse, iTab
1a980 6c 65 2c 20 69 43 6f 6c 75 6d 6e 2c 20 69 52 65  le, iColumn, iRe
1a990 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  g);.  }.  return
1a9a0 20 69 52 65 67 3b 0a 7d 0a 76 6f 69 64 20 73 71   iReg;.}.void sq
1a9b0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74  lite3ExprCodeGet
1a9c0 43 6f 6c 75 6d 6e 54 6f 52 65 67 28 0a 20 20 50  ColumnToReg(.  P
1a9d0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
1a9e0 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63  /* Parsing and c
1a9f0 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63  ode generating c
1aa00 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c  ontext */.  Tabl
1aa10 65 20 2a 70 54 61 62 2c 20 20 20 20 20 2f 2a 20  e *pTab,     /* 
1aa20 44 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74  Description of t
1aa30 68 65 20 74 61 62 6c 65 20 77 65 20 61 72 65 20  he table we are 
1aa40 72 65 61 64 69 6e 67 20 66 72 6f 6d 20 2a 2f 0a  reading from */.
1aa50 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20    int iColumn,  
1aa60 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74     /* Index of t
1aa70 68 65 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 20  he table column 
1aa80 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c  */.  int iTable,
1aa90 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72        /* The cur
1aaa0 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  sor pointing to 
1aab0 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  the table */.  i
1aac0 6e 74 20 69 52 65 67 20 20 20 20 20 20 20 20 20  nt iReg         
1aad0 2f 2a 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73  /* Store results
1aae0 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   here */.){.  in
1aaf0 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78  t r1 = sqlite3Ex
1ab00 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28  prCodeGetColumn(
1ab10 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 69 43  pParse, pTab, iC
1ab20 6f 6c 75 6d 6e 2c 20 69 54 61 62 6c 65 2c 20 69  olumn, iTable, i
1ab30 52 65 67 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  Reg, 0);.  if( r
1ab40 31 21 3d 69 52 65 67 20 29 20 73 71 6c 69 74 65  1!=iReg ) sqlite
1ab50 33 56 64 62 65 41 64 64 4f 70 32 28 70 50 61 72  3VdbeAddOp2(pPar
1ab60 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 53 43  se->pVdbe, OP_SC
1ab70 6f 70 79 2c 20 72 31 2c 20 69 52 65 67 29 3b 0a  opy, r1, iReg);.
1ab80 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20  }.../*.** Clear 
1ab90 61 6c 6c 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65  all column cache
1aba0 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 76 6f 69   entries..*/.voi
1abb0 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63  d sqlite3ExprCac
1abc0 68 65 43 6c 65 61 72 28 50 61 72 73 65 20 2a 70  heClear(Parse *p
1abd0 50 61 72 73 65 29 7b 0a 20 20 69 6e 74 20 69 3b  Parse){.  int i;
1abe0 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61  .  struct yColCa
1abf0 63 68 65 20 2a 70 3b 0a 0a 23 69 66 20 53 51 4c  che *p;..#if SQL
1ac00 49 54 45 5f 44 45 42 55 47 0a 20 20 69 66 28 20  ITE_DEBUG.  if( 
1ac10 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67  pParse->db->flag
1ac20 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65 41  s & SQLITE_VdbeA
1ac30 64 64 6f 70 54 72 61 63 65 20 29 7b 0a 20 20 20  ddopTrace ){.   
1ac40 20 70 72 69 6e 74 66 28 22 43 4c 45 41 52 5c 6e   printf("CLEAR\n
1ac50 22 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ");.  }.#endif. 
1ac60 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72   for(i=0, p=pPar
1ac70 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69  se->aColCache; i
1ac80 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43  <SQLITE_N_COLCAC
1ac90 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20  HE; i++, p++){. 
1aca0 20 20 20 69 66 28 20 70 2d 3e 69 52 65 67 20 29     if( p->iReg )
1acb0 7b 0a 20 20 20 20 20 20 63 61 63 68 65 45 6e 74  {.      cacheEnt
1acc0 72 79 43 6c 65 61 72 28 70 50 61 72 73 65 2c 20  ryClear(pParse, 
1acd0 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  p);.    }.  }.}.
1ace0 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 72 64 20 74 68  ./*.** Record th
1acf0 65 20 66 61 63 74 20 74 68 61 74 20 61 6e 20 61  e fact that an a
1ad00 66 66 69 6e 69 74 79 20 63 68 61 6e 67 65 20 68  ffinity change h
1ad10 61 73 20 6f 63 63 75 72 72 65 64 20 6f 6e 20 69  as occurred on i
1ad20 43 6f 75 6e 74 0a 2a 2a 20 72 65 67 69 73 74 65  Count.** registe
1ad30 72 73 20 73 74 61 72 74 69 6e 67 20 77 69 74 68  rs starting with
1ad40 20 69 53 74 61 72 74 2e 0a 2a 2f 0a 76 6f 69 64   iStart..*/.void
1ad50 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
1ad60 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  eAffinityChange(
1ad70 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
1ad80 6e 74 20 69 53 74 61 72 74 2c 20 69 6e 74 20 69  nt iStart, int i
1ad90 43 6f 75 6e 74 29 7b 0a 20 20 73 71 6c 69 74 65  Count){.  sqlite
1ada0 33 45 78 70 72 43 61 63 68 65 52 65 6d 6f 76 65  3ExprCacheRemove
1adb0 28 70 50 61 72 73 65 2c 20 69 53 74 61 72 74 2c  (pParse, iStart,
1adc0 20 69 43 6f 75 6e 74 29 3b 0a 7d 0a 0a 2f 2a 0a   iCount);.}../*.
1add0 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
1ade0 20 74 6f 20 6d 6f 76 65 20 63 6f 6e 74 65 6e 74   to move content
1adf0 20 66 72 6f 6d 20 72 65 67 69 73 74 65 72 73 20   from registers 
1ae00 69 46 72 6f 6d 2e 2e 2e 69 46 72 6f 6d 2b 6e 52  iFrom...iFrom+nR
1ae10 65 67 2d 31 0a 2a 2a 20 6f 76 65 72 20 74 6f 20  eg-1.** over to 
1ae20 69 54 6f 2e 2e 69 54 6f 2b 6e 52 65 67 2d 31 2e  iTo..iTo+nReg-1.
1ae30 20 4b 65 65 70 20 74 68 65 20 63 6f 6c 75 6d 6e   Keep the column
1ae40 20 63 61 63 68 65 20 75 70 2d 74 6f 2d 64 61 74   cache up-to-dat
1ae50 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
1ae60 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 50  e3ExprCodeMove(P
1ae70 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
1ae80 74 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69 54 6f  t iFrom, int iTo
1ae90 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20 61  , int nReg){.  a
1aea0 73 73 65 72 74 28 20 69 46 72 6f 6d 3e 3d 69 54  ssert( iFrom>=iT
1aeb0 6f 2b 6e 52 65 67 20 7c 7c 20 69 46 72 6f 6d 2b  o+nReg || iFrom+
1aec0 6e 52 65 67 3c 3d 69 54 6f 20 29 3b 0a 20 20 73  nReg<=iTo );.  s
1aed0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
1aee0 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20  (pParse->pVdbe, 
1aef0 4f 50 5f 4d 6f 76 65 2c 20 69 46 72 6f 6d 2c 20  OP_Move, iFrom, 
1af00 69 54 6f 2c 20 6e 52 65 67 29 3b 0a 20 20 73 71  iTo, nReg);.  sq
1af10 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 52 65  lite3ExprCacheRe
1af20 6d 6f 76 65 28 70 50 61 72 73 65 2c 20 69 46 72  move(pParse, iFr
1af30 6f 6d 2c 20 6e 52 65 67 29 3b 0a 7d 0a 0a 23 69  om, nReg);.}..#i
1af40 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
1af50 5f 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e  _DEBUG) || defin
1af60 65 64 28 53 51 4c 49 54 45 5f 43 4f 56 45 52 41  ed(SQLITE_COVERA
1af70 47 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52  GE_TEST)./*.** R
1af80 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 61 6e  eturn true if an
1af90 79 20 72 65 67 69 73 74 65 72 20 69 6e 20 74 68  y register in th
1afa0 65 20 72 61 6e 67 65 20 69 46 72 6f 6d 2e 2e 69  e range iFrom..i
1afb0 54 6f 20 28 69 6e 63 6c 75 73 69 76 65 29 0a 2a  To (inclusive).*
1afc0 2a 20 69 73 20 75 73 65 64 20 61 73 20 70 61 72  * is used as par
1afd0 74 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20  t of the column 
1afe0 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  cache..**.** Thi
1aff0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
1b000 64 20 77 69 74 68 69 6e 20 61 73 73 65 72 74 28  d within assert(
1b010 29 20 61 6e 64 20 74 65 73 74 63 61 73 65 28 29  ) and testcase()
1b020 20 6d 61 63 72 6f 73 20 6f 6e 6c 79 0a 2a 2a 20   macros only.** 
1b030 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 61 70 70  and does not app
1b040 65 61 72 20 69 6e 20 61 20 6e 6f 72 6d 61 6c 20  ear in a normal 
1b050 62 75 69 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  build..*/.static
1b060 20 69 6e 74 20 75 73 65 64 41 73 43 6f 6c 75 6d   int usedAsColum
1b070 6e 43 61 63 68 65 28 50 61 72 73 65 20 2a 70 50  nCache(Parse *pP
1b080 61 72 73 65 2c 20 69 6e 74 20 69 46 72 6f 6d 2c  arse, int iFrom,
1b090 20 69 6e 74 20 69 54 6f 29 7b 0a 20 20 69 6e 74   int iTo){.  int
1b0a0 20 69 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f   i;.  struct yCo
1b0b0 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20 66 6f 72  lCache *p;.  for
1b0c0 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e  (i=0, p=pParse->
1b0d0 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c  aColCache; i<SQL
1b0e0 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20  ITE_N_COLCACHE; 
1b0f0 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69  i++, p++){.    i
1b100 6e 74 20 72 20 3d 20 70 2d 3e 69 52 65 67 3b 0a  nt r = p->iReg;.
1b110 20 20 20 20 69 66 28 20 72 3e 3d 69 46 72 6f 6d      if( r>=iFrom
1b120 20 26 26 20 72 3c 3d 69 54 6f 20 29 20 72 65 74   && r<=iTo ) ret
1b130 75 72 6e 20 31 3b 20 20 20 20 2f 2a 4e 4f 5f 54  urn 1;    /*NO_T
1b140 45 53 54 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75  EST*/.  }.  retu
1b150 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  rn 0;.}.#endif /
1b160 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 7c  * SQLITE_DEBUG |
1b170 7c 20 53 51 4c 49 54 45 5f 43 4f 56 45 52 41 47  | SQLITE_COVERAG
1b180 45 5f 54 45 53 54 20 2a 2f 0a 0a 0a 2f 2a 0a 2a  E_TEST */.../*.*
1b190 2a 20 43 6f 6e 76 65 72 74 20 61 6e 20 65 78 70  * Convert an exp
1b1a0 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 74 6f 20  ression node to 
1b1b0 61 20 54 4b 5f 52 45 47 49 53 54 45 52 0a 2a 2f  a TK_REGISTER.*/
1b1c0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70  .static void exp
1b1d0 72 54 6f 52 65 67 69 73 74 65 72 28 45 78 70 72  rToRegister(Expr
1b1e0 20 2a 70 2c 20 69 6e 74 20 69 52 65 67 29 7b 0a   *p, int iReg){.
1b1f0 20 20 70 2d 3e 6f 70 32 20 3d 20 70 2d 3e 6f 70    p->op2 = p->op
1b200 3b 0a 20 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f 52  ;.  p->op = TK_R
1b210 45 47 49 53 54 45 52 3b 0a 20 20 70 2d 3e 69 54  EGISTER;.  p->iT
1b220 61 62 6c 65 20 3d 20 69 52 65 67 3b 0a 20 20 45  able = iReg;.  E
1b230 78 70 72 43 6c 65 61 72 50 72 6f 70 65 72 74 79  xprClearProperty
1b240 28 70 2c 20 45 50 5f 53 6b 69 70 29 3b 0a 7d 0a  (p, EP_Skip);.}.
1b250 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70  .static void exp
1b260 72 43 6f 64 65 42 65 74 77 65 65 6e 28 50 61 72  rCodeBetween(Par
1b270 73 65 2a 2c 45 78 70 72 2a 2c 69 6e 74 2c 76 6f  se*,Expr*,int,vo
1b280 69 64 28 2a 29 28 50 61 72 73 65 2a 2c 45 78 70  id(*)(Parse*,Exp
1b290 72 2a 2c 69 6e 74 2c 69 6e 74 29 2c 69 6e 74 29  r*,int,int),int)
1b2a0 3b 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  ;../*.** Generat
1b2b0 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 65 20  e code into the 
1b2c0 63 75 72 72 65 6e 74 20 56 64 62 65 20 74 6f 20  current Vdbe to 
1b2d0 65 76 61 6c 75 61 74 65 20 74 68 65 20 67 69 76  evaluate the giv
1b2e0 65 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  en.** expression
1b2f0 2e 20 20 41 74 74 65 6d 70 74 20 74 6f 20 73 74  .  Attempt to st
1b300 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20  ore the results 
1b310 69 6e 20 72 65 67 69 73 74 65 72 20 22 74 61 72  in register "tar
1b320 67 65 74 22 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  get"..** Return 
1b330 74 68 65 20 72 65 67 69 73 74 65 72 20 77 68 65  the register whe
1b340 72 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 73  re results are s
1b350 74 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 57 69 74  tored..**.** Wit
1b360 68 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 20  h this routine, 
1b370 74 68 65 72 65 20 69 73 20 6e 6f 20 67 75 61 72  there is no guar
1b380 61 6e 74 65 65 20 74 68 61 74 20 72 65 73 75 6c  antee that resul
1b390 74 73 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 73 74  ts will.** be st
1b3a0 6f 72 65 64 20 69 6e 20 74 61 72 67 65 74 2e 20  ored in target. 
1b3b0 20 54 68 65 20 72 65 73 75 6c 74 20 6d 69 67 68   The result migh
1b3c0 74 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 73  t be stored in s
1b3d0 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 72 65 67  ome other.** reg
1b3e0 69 73 74 65 72 20 69 66 20 69 74 20 69 73 20 63  ister if it is c
1b3f0 6f 6e 76 65 6e 69 65 6e 74 20 74 6f 20 64 6f 20  onvenient to do 
1b400 73 6f 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67  so.  The calling
1b410 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 75 73   function.** mus
1b420 74 20 63 68 65 63 6b 20 74 68 65 20 72 65 74 75  t check the retu
1b430 72 6e 20 63 6f 64 65 20 61 6e 64 20 6d 6f 76 65  rn code and move
1b440 20 74 68 65 20 72 65 73 75 6c 74 73 20 74 6f 20   the results to 
1b450 74 68 65 20 64 65 73 69 72 65 64 0a 2a 2a 20 72  the desired.** r
1b460 65 67 69 73 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20  egister..*/.int 
1b470 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
1b480 61 72 67 65 74 28 50 61 72 73 65 20 2a 70 50 61  arget(Parse *pPa
1b490 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
1b4a0 2c 20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a 20  , int target){. 
1b4b0 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
1b4c0 65 2d 3e 70 56 64 62 65 3b 20 20 2f 2a 20 54 68  e->pVdbe;  /* Th
1b4d0 65 20 56 4d 20 75 6e 64 65 72 20 63 6f 6e 73 74  e VM under const
1b4e0 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  ruction */.  int
1b4f0 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   op;            
1b500 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 70         /* The op
1b510 63 6f 64 65 20 62 65 69 6e 67 20 63 6f 64 65 64  code being coded
1b520 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 52 65 67 20   */.  int inReg 
1b530 3d 20 74 61 72 67 65 74 3b 20 20 20 20 20 20 20  = target;       
1b540 2f 2a 20 52 65 73 75 6c 74 73 20 73 74 6f 72 65  /* Results store
1b550 64 20 69 6e 20 72 65 67 69 73 74 65 72 20 69 6e  d in register in
1b560 52 65 67 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  Reg */.  int reg
1b570 46 72 65 65 31 20 3d 20 30 3b 20 20 20 20 20 20  Free1 = 0;      
1b580 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72     /* If non-zer
1b590 6f 20 66 72 65 65 20 74 68 69 73 20 74 65 6d 70  o free this temp
1b5a0 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 20 2a  orary register *
1b5b0 2f 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65 32  /.  int regFree2
1b5c0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a   = 0;         /*
1b5d0 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20 66 72 65   If non-zero fre
1b5e0 65 20 74 68 69 73 20 74 65 6d 70 6f 72 61 72 79  e this temporary
1b5f0 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 69   register */.  i
1b600 6e 74 20 72 31 2c 20 72 32 3b 20 20 20 20 20 20  nt r1, r2;      
1b610 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 72 69           /* Vari
1b620 6f 75 73 20 72 65 67 69 73 74 65 72 20 6e 75 6d  ous register num
1b630 62 65 72 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65  bers */.  sqlite
1b640 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
1b650 64 62 3b 20 2f 2a 20 54 68 65 20 64 61 74 61 62  db; /* The datab
1b660 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
1b670 2f 0a 20 20 45 78 70 72 20 74 65 6d 70 58 3b 20  /.  Expr tempX; 
1b680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b690 20 54 65 6d 70 6f 72 61 72 79 20 65 78 70 72 65   Temporary expre
1b6a0 73 73 69 6f 6e 20 6e 6f 64 65 20 2a 2f 0a 20 20  ssion node */.  
1b6b0 69 6e 74 20 70 35 20 3d 20 30 3b 0a 0a 20 20 61  int p5 = 0;..  a
1b6c0 73 73 65 72 74 28 20 74 61 72 67 65 74 3e 30 20  ssert( target>0 
1b6d0 26 26 20 74 61 72 67 65 74 3c 3d 70 50 61 72 73  && target<=pPars
1b6e0 65 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 69 66 28  e->nMem );.  if(
1b6f0 20 76 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73   v==0 ){.    ass
1b700 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64 62 2d  ert( pParse->db-
1b710 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
1b720 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
1b730 20 7d 0a 0a 20 20 69 66 28 20 70 45 78 70 72 3d   }..  if( pExpr=
1b740 3d 30 20 29 7b 0a 20 20 20 20 6f 70 20 3d 20 54  =0 ){.    op = T
1b750 4b 5f 4e 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b  K_NULL;.  }else{
1b760 0a 20 20 20 20 6f 70 20 3d 20 70 45 78 70 72 2d  .    op = pExpr-
1b770 3e 6f 70 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63  >op;.  }.  switc
1b780 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  h( op ){.    cas
1b790 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a  e TK_AGG_COLUMN:
1b7a0 20 7b 0a 20 20 20 20 20 20 41 67 67 49 6e 66 6f   {.      AggInfo
1b7b0 20 2a 70 41 67 67 49 6e 66 6f 20 3d 20 70 45 78   *pAggInfo = pEx
1b7c0 70 72 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a 20 20  pr->pAggInfo;.  
1b7d0 20 20 20 20 73 74 72 75 63 74 20 41 67 67 49 6e      struct AggIn
1b7e0 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 20 3d 20 26  fo_col *pCol = &
1b7f0 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 70  pAggInfo->aCol[p
1b800 45 78 70 72 2d 3e 69 41 67 67 5d 3b 0a 20 20 20  Expr->iAgg];.   
1b810 20 20 20 69 66 28 20 21 70 41 67 67 49 6e 66 6f     if( !pAggInfo
1b820 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20 29 7b 0a  ->directMode ){.
1b830 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1b840 70 43 6f 6c 2d 3e 69 4d 65 6d 3e 30 20 29 3b 0a  pCol->iMem>0 );.
1b850 20 20 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20          inReg = 
1b860 70 43 6f 6c 2d 3e 69 4d 65 6d 3b 0a 20 20 20 20  pCol->iMem;.    
1b870 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1b880 20 7d 65 6c 73 65 20 69 66 28 20 70 41 67 67 49   }else if( pAggI
1b890 6e 66 6f 2d 3e 75 73 65 53 6f 72 74 69 6e 67 49  nfo->useSortingI
1b8a0 64 78 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  dx ){.        sq
1b8b0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
1b8c0 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70 41  v, OP_Column, pA
1b8d0 67 67 49 6e 66 6f 2d 3e 73 6f 72 74 69 6e 67 49  ggInfo->sortingI
1b8e0 64 78 50 54 61 62 2c 0a 20 20 20 20 20 20 20 20  dxPTab,.        
1b8f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b900 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72        pCol->iSor
1b910 74 65 72 43 6f 6c 75 6d 6e 2c 20 74 61 72 67 65  terColumn, targe
1b920 74 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  t);.        brea
1b930 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
1b940 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 66   /* Otherwise, f
1b950 61 6c 6c 20 74 68 72 75 20 69 6e 74 6f 20 74 68  all thru into th
1b960 65 20 54 4b 5f 43 4f 4c 55 4d 4e 20 63 61 73 65  e TK_COLUMN case
1b970 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 63 61   */.    }.    ca
1b980 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a  se TK_COLUMN: {.
1b990 20 20 20 20 20 20 69 6e 74 20 69 54 61 62 20 3d        int iTab =
1b9a0 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a   pExpr->iTable;.
1b9b0 20 20 20 20 20 20 69 66 28 20 69 54 61 62 3c 30        if( iTab<0
1b9c0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
1b9d0 70 50 61 72 73 65 2d 3e 63 6b 42 61 73 65 3e 30  pParse->ckBase>0
1b9e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
1b9f0 20 47 65 6e 65 72 61 74 69 6e 67 20 43 48 45 43   Generating CHEC
1ba00 4b 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 72  K constraints or
1ba10 20 69 6e 73 65 72 74 69 6e 67 20 69 6e 74 6f 20   inserting into 
1ba20 70 61 72 74 69 61 6c 20 69 6e 64 65 78 20 2a 2f  partial index */
1ba30 0a 20 20 20 20 20 20 20 20 20 20 69 6e 52 65 67  .          inReg
1ba40 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d   = pExpr->iColum
1ba50 6e 20 2b 20 70 50 61 72 73 65 2d 3e 63 6b 42 61  n + pParse->ckBa
1ba60 73 65 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  se;.          br
1ba70 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  eak;.        }el
1ba80 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  se{.          /*
1ba90 20 43 6f 64 69 6e 67 20 61 6e 20 65 78 70 72 65   Coding an expre
1baa0 73 73 69 6f 6e 20 74 68 61 74 20 69 73 20 70 61  ssion that is pa
1bab0 72 74 20 6f 66 20 61 6e 20 69 6e 64 65 78 20 77  rt of an index w
1bac0 68 65 72 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  here column name
1bad0 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69  s.          ** i
1bae0 6e 20 74 68 65 20 69 6e 64 65 78 20 72 65 66 65  n the index refe
1baf0 72 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 74  r to the table t
1bb00 6f 20 77 68 69 63 68 20 74 68 65 20 69 6e 64 65  o which the inde
1bb10 78 20 62 65 6c 6f 6e 67 73 20 2a 2f 0a 20 20 20  x belongs */.   
1bb20 20 20 20 20 20 20 20 69 54 61 62 20 3d 20 70 50         iTab = pP
1bb30 61 72 73 65 2d 3e 69 53 65 6c 66 54 61 62 3b 0a  arse->iSelfTab;.
1bb40 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1bb50 7d 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20  }.      inReg = 
1bb60 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47  sqlite3ExprCodeG
1bb70 65 74 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c  etColumn(pParse,
1bb80 20 70 45 78 70 72 2d 3e 70 54 61 62 2c 0a 20 20   pExpr->pTab,.  
1bb90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bba0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
1bbb0 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 69 54 61  pr->iColumn, iTa
1bbc0 62 2c 20 74 61 72 67 65 74 2c 0a 20 20 20 20 20  b, target,.     
1bbd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bbe0 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
1bbf0 3e 6f 70 32 29 3b 0a 20 20 20 20 20 20 62 72 65  >op2);.      bre
1bc00 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
1bc10 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 20 7b  se TK_INTEGER: {
1bc20 0a 20 20 20 20 20 20 63 6f 64 65 49 6e 74 65 67  .      codeInteg
1bc30 65 72 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  er(pParse, pExpr
1bc40 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  , 0, target);.  
1bc50 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1bc60 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1bc70 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f  OMIT_FLOATING_PO
1bc80 49 4e 54 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  INT.    case TK_
1bc90 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20 61  FLOAT: {.      a
1bca0 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
1bcb0 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
1bcc0 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20  P_IntValue) );. 
1bcd0 20 20 20 20 20 63 6f 64 65 52 65 61 6c 28 76 2c       codeReal(v,
1bce0 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
1bcf0 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  , 0, target);.  
1bd00 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1bd10 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65  .#endif.    case
1bd20 20 54 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20   TK_STRING: {.  
1bd30 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
1bd40 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
1bd50 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  pr, EP_IntValue)
1bd60 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
1bd70 33 56 64 62 65 4c 6f 61 64 53 74 72 69 6e 67 28  3VdbeLoadString(
1bd80 76 2c 20 74 61 72 67 65 74 2c 20 70 45 78 70 72  v, target, pExpr
1bd90 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20  ->u.zToken);.   
1bda0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1bdb0 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 55 4c 4c      case TK_NULL
1bdc0 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
1bdd0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1bde0 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61 72 67 65  P_Null, 0, targe
1bdf0 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  t);.      break;
1be00 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
1be10 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 4c 4f 42 5f  QLITE_OMIT_BLOB_
1be20 4c 49 54 45 52 41 4c 0a 20 20 20 20 63 61 73 65  LITERAL.    case
1be30 20 54 4b 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20   TK_BLOB: {.    
1be40 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 63    int n;.      c
1be50 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20  onst char *z;.  
1be60 20 20 20 20 63 68 61 72 20 2a 7a 42 6c 6f 62 3b      char *zBlob;
1be70 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
1be80 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
1be90 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c  pExpr, EP_IntVal
1bea0 75 65 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ue) );.      ass
1beb0 65 72 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54  ert( pExpr->u.zT
1bec0 6f 6b 65 6e 5b 30 5d 3d 3d 27 78 27 20 7c 7c 20  oken[0]=='x' || 
1bed0 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b  pExpr->u.zToken[
1bee0 30 5d 3d 3d 27 58 27 20 29 3b 0a 20 20 20 20 20  0]=='X' );.     
1bef0 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
1bf00 75 2e 7a 54 6f 6b 65 6e 5b 31 5d 3d 3d 27 5c 27  u.zToken[1]=='\'
1bf10 27 20 29 3b 0a 20 20 20 20 20 20 7a 20 3d 20 26  ' );.      z = &
1bf20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b  pExpr->u.zToken[
1bf30 32 5d 3b 0a 20 20 20 20 20 20 6e 20 3d 20 73 71  2];.      n = sq
1bf40 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29  lite3Strlen30(z)
1bf50 20 2d 20 31 3b 0a 20 20 20 20 20 20 61 73 73 65   - 1;.      asse
1bf60 72 74 28 20 7a 5b 6e 5d 3d 3d 27 5c 27 27 20 29  rt( z[n]=='\'' )
1bf70 3b 0a 20 20 20 20 20 20 7a 42 6c 6f 62 20 3d 20  ;.      zBlob = 
1bf80 73 71 6c 69 74 65 33 48 65 78 54 6f 42 6c 6f 62  sqlite3HexToBlob
1bf90 28 73 71 6c 69 74 65 33 56 64 62 65 44 62 28 76  (sqlite3VdbeDb(v
1bfa0 29 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20  ), z, n);.      
1bfb0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1bfc0 34 28 76 2c 20 4f 50 5f 42 6c 6f 62 2c 20 6e 2f  4(v, OP_Blob, n/
1bfd0 32 2c 20 74 61 72 67 65 74 2c 20 30 2c 20 7a 42  2, target, 0, zB
1bfe0 6c 6f 62 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29  lob, P4_DYNAMIC)
1bff0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1c000 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
1c010 63 61 73 65 20 54 4b 5f 56 41 52 49 41 42 4c 45  case TK_VARIABLE
1c020 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
1c030 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
1c040 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74  ty(pExpr, EP_Int
1c050 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20  Value) );.      
1c060 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75  assert( pExpr->u
1c070 2e 7a 54 6f 6b 65 6e 21 3d 30 20 29 3b 0a 20 20  .zToken!=0 );.  
1c080 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
1c090 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 21 3d  r->u.zToken[0]!=
1c0a0 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 );.      sqlit
1c0b0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1c0c0 4f 50 5f 56 61 72 69 61 62 6c 65 2c 20 70 45 78  OP_Variable, pEx
1c0d0 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 74 61 72  pr->iColumn, tar
1c0e0 67 65 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  get);.      if( 
1c0f0 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b  pExpr->u.zToken[
1c100 31 5d 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  1]!=0 ){.       
1c110 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
1c120 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 3f 27  u.zToken[0]=='?'
1c130 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7c   .             |
1c140 7c 20 73 74 72 63 6d 70 28 70 45 78 70 72 2d 3e  | strcmp(pExpr->
1c150 75 2e 7a 54 6f 6b 65 6e 2c 20 70 50 61 72 73 65  u.zToken, pParse
1c160 2d 3e 61 7a 56 61 72 5b 70 45 78 70 72 2d 3e 69  ->azVar[pExpr->i
1c170 43 6f 6c 75 6d 6e 2d 31 5d 29 3d 3d 30 20 29 3b  Column-1])==0 );
1c180 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1c190 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20  VdbeChangeP4(v, 
1c1a0 2d 31 2c 20 70 50 61 72 73 65 2d 3e 61 7a 56 61  -1, pParse->azVa
1c1b0 72 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  r[pExpr->iColumn
1c1c0 2d 31 5d 2c 20 50 34 5f 53 54 41 54 49 43 29 3b  -1], P4_STATIC);
1c1d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
1c1e0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
1c1f0 63 61 73 65 20 54 4b 5f 52 45 47 49 53 54 45 52  case TK_REGISTER
1c200 3a 20 7b 0a 20 20 20 20 20 20 69 6e 52 65 67 20  : {.      inReg 
1c210 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b  = pExpr->iTable;
1c220 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1c230 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
1c240 54 45 5f 4f 4d 49 54 5f 43 41 53 54 0a 20 20 20  TE_OMIT_CAST.   
1c250 20 63 61 73 65 20 54 4b 5f 43 41 53 54 3a 20 7b   case TK_CAST: {
1c260 0a 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73  .      /* Expres
1c270 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 66 6f 72  sions of the for
1c280 6d 3a 20 20 20 43 41 53 54 28 70 4c 65 66 74 20  m:   CAST(pLeft 
1c290 41 53 20 74 6f 6b 65 6e 29 20 2a 2f 0a 20 20 20  AS token) */.   
1c2a0 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74     inReg = sqlit
1c2b0 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74  e3ExprCodeTarget
1c2c0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
1c2d0 70 4c 65 66 74 2c 20 74 61 72 67 65 74 29 3b 0a  pLeft, target);.
1c2e0 20 20 20 20 20 20 69 66 28 20 69 6e 52 65 67 21        if( inReg!
1c2f0 3d 74 61 72 67 65 74 20 29 7b 0a 20 20 20 20 20  =target ){.     
1c300 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1c310 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79  dOp2(v, OP_SCopy
1c320 2c 20 69 6e 52 65 67 2c 20 74 61 72 67 65 74 29  , inReg, target)
1c330 3b 0a 20 20 20 20 20 20 20 20 69 6e 52 65 67 20  ;.        inReg 
1c340 3d 20 74 61 72 67 65 74 3b 0a 20 20 20 20 20 20  = target;.      
1c350 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
1c360 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1c370 43 61 73 74 2c 20 74 61 72 67 65 74 2c 0a 20 20  Cast, target,.  
1c380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c390 20 20 20 20 20 20 73 71 6c 69 74 65 33 41 66 66        sqlite3Aff
1c3a0 69 6e 69 74 79 54 79 70 65 28 70 45 78 70 72 2d  inityType(pExpr-
1c3b0 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30 29 29 3b 0a  >u.zToken, 0));.
1c3c0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1c3d0 75 73 65 64 41 73 43 6f 6c 75 6d 6e 43 61 63 68  usedAsColumnCach
1c3e0 65 28 70 50 61 72 73 65 2c 20 69 6e 52 65 67 2c  e(pParse, inReg,
1c3f0 20 69 6e 52 65 67 29 20 29 3b 0a 20 20 20 20 20   inReg) );.     
1c400 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
1c410 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  eAffinityChange(
1c420 70 50 61 72 73 65 2c 20 69 6e 52 65 67 2c 20 31  pParse, inReg, 1
1c430 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1c440 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20      }.#endif /* 
1c450 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54  SQLITE_OMIT_CAST
1c460 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   */.    case TK_
1c470 49 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  IS:.    case TK_
1c480 49 53 4e 4f 54 3a 0a 20 20 20 20 20 20 6f 70 20  ISNOT:.      op 
1c490 3d 20 28 6f 70 3d 3d 54 4b 5f 49 53 29 20 3f 20  = (op==TK_IS) ? 
1c4a0 54 4b 5f 45 51 20 3a 20 54 4b 5f 4e 45 3b 0a 20  TK_EQ : TK_NE;. 
1c4b0 20 20 20 20 20 70 35 20 3d 20 53 51 4c 49 54 45       p5 = SQLITE
1c4c0 5f 4e 55 4c 4c 45 51 3b 0a 20 20 20 20 20 20 2f  _NULLEQ;.      /
1c4d0 2a 20 66 61 6c 6c 2d 74 68 72 6f 75 67 68 20 2a  * fall-through *
1c4e0 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54  /.    case TK_LT
1c4f0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45  :.    case TK_LE
1c500 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54  :.    case TK_GT
1c510 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45  :.    case TK_GE
1c520 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45  :.    case TK_NE
1c530 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51  :.    case TK_EQ
1c540 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  : {.      Expr *
1c550 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70  pLeft = pExpr->p
1c560 4c 65 66 74 3b 0a 20 20 20 20 20 20 69 66 28 20  Left;.      if( 
1c570 73 71 6c 69 74 65 33 45 78 70 72 49 73 56 65 63  sqlite3ExprIsVec
1c580 74 6f 72 28 70 4c 65 66 74 29 20 29 7b 0a 20 20  tor(pLeft) ){.  
1c590 20 20 20 20 20 20 63 6f 64 65 56 65 63 74 6f 72        codeVector
1c5a0 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20  Compare(pParse, 
1c5b0 70 45 78 70 72 2c 20 74 61 72 67 65 74 2c 20 6f  pExpr, target, o
1c5c0 70 2c 20 70 35 29 3b 0a 20 20 20 20 20 20 7d 65  p, p5);.      }e
1c5d0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 31 20  lse{.        r1 
1c5e0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
1c5f0 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 4c  eTemp(pParse, pL
1c600 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b  eft, &regFree1);
1c610 0a 20 20 20 20 20 20 20 20 72 32 20 3d 20 73 71  .        r2 = sq
1c620 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
1c630 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
1c640 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46 72 65  >pRight, &regFre
1c650 65 32 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 64  e2);.        cod
1c660 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c  eCompare(pParse,
1c670 20 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e 70   pLeft, pExpr->p
1c680 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20  Right, op,.     
1c690 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c 20 69         r1, r2, i
1c6a0 6e 52 65 67 2c 20 53 51 4c 49 54 45 5f 53 54 4f  nReg, SQLITE_STO
1c6b0 52 45 50 32 20 7c 20 70 35 29 3b 0a 20 20 20 20  REP2 | p5);.    
1c6c0 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4c 54      assert(TK_LT
1c6d0 3d 3d 4f 50 5f 4c 74 29 3b 20 74 65 73 74 63 61  ==OP_Lt); testca
1c6e0 73 65 28 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 20 56  se(op==OP_Lt); V
1c6f0 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
1c700 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a 20 20 20 20  op==OP_Lt);.    
1c710 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4c 45      assert(TK_LE
1c720 3d 3d 4f 50 5f 4c 65 29 3b 20 74 65 73 74 63 61  ==OP_Le); testca
1c730 73 65 28 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 20 56  se(op==OP_Le); V
1c740 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
1c750 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 0a 20 20 20 20  op==OP_Le);.    
1c760 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 47 54      assert(TK_GT
1c770 3d 3d 4f 50 5f 47 74 29 3b 20 74 65 73 74 63 61  ==OP_Gt); testca
1c780 73 65 28 6f 70 3d 3d 4f 50 5f 47 74 29 3b 20 56  se(op==OP_Gt); V
1c790 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
1c7a0 6f 70 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20 20 20  op==OP_Gt);.    
1c7b0 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 47 45      assert(TK_GE
1c7c0 3d 3d 4f 50 5f 47 65 29 3b 20 74 65 73 74 63 61  ==OP_Ge); testca
1c7d0 73 65 28 6f 70 3d 3d 4f 50 5f 47 65 29 3b 20 56  se(op==OP_Ge); V
1c7e0 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
1c7f0 6f 70 3d 3d 4f 50 5f 47 65 29 3b 0a 20 20 20 20  op==OP_Ge);.    
1c800 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 45 51      assert(TK_EQ
1c810 3d 3d 4f 50 5f 45 71 29 3b 20 74 65 73 74 63 61  ==OP_Eq); testca
1c820 73 65 28 6f 70 3d 3d 4f 50 5f 45 71 29 3b 20 56  se(op==OP_Eq); V
1c830 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
1c840 6f 70 3d 3d 4f 50 5f 45 71 29 3b 0a 20 20 20 20  op==OP_Eq);.    
1c850 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4e 45      assert(TK_NE
1c860 3d 3d 4f 50 5f 4e 65 29 3b 20 74 65 73 74 63 61  ==OP_Ne); testca
1c870 73 65 28 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 20 56  se(op==OP_Ne); V
1c880 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
1c890 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 0a 20 20 20 20  op==OP_Ne);.    
1c8a0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
1c8b0 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20  gFree1==0 );.   
1c8c0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
1c8d0 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20  egFree2==0 );.  
1c8e0 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
1c8f0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
1c900 65 20 54 4b 5f 41 4e 44 3a 0a 20 20 20 20 63 61  e TK_AND:.    ca
1c910 73 65 20 54 4b 5f 4f 52 3a 0a 20 20 20 20 63 61  se TK_OR:.    ca
1c920 73 65 20 54 4b 5f 50 4c 55 53 3a 0a 20 20 20 20  se TK_PLUS:.    
1c930 63 61 73 65 20 54 4b 5f 53 54 41 52 3a 0a 20 20  case TK_STAR:.  
1c940 20 20 63 61 73 65 20 54 4b 5f 4d 49 4e 55 53 3a    case TK_MINUS:
1c950 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45 4d  .    case TK_REM
1c960 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49  :.    case TK_BI
1c970 54 41 4e 44 3a 0a 20 20 20 20 63 61 73 65 20 54  TAND:.    case T
1c980 4b 5f 42 49 54 4f 52 3a 0a 20 20 20 20 63 61 73  K_BITOR:.    cas
1c990 65 20 54 4b 5f 53 4c 41 53 48 3a 0a 20 20 20 20  e TK_SLASH:.    
1c9a0 63 61 73 65 20 54 4b 5f 4c 53 48 49 46 54 3a 0a  case TK_LSHIFT:.
1c9b0 20 20 20 20 63 61 73 65 20 54 4b 5f 52 53 48 49      case TK_RSHI
1c9c0 46 54 3a 20 0a 20 20 20 20 63 61 73 65 20 54 4b  FT: .    case TK
1c9d0 5f 43 4f 4e 43 41 54 3a 20 7b 0a 20 20 20 20 20  _CONCAT: {.     
1c9e0 20 61 73 73 65 72 74 28 20 54 4b 5f 41 4e 44 3d   assert( TK_AND=
1c9f0 3d 4f 50 5f 41 6e 64 20 29 3b 20 20 20 20 20 20  =OP_And );      
1ca00 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1ca10 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 3b 0a 20 20  op==TK_AND );.  
1ca20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4f      assert( TK_O
1ca30 52 3d 3d 4f 50 5f 4f 72 20 29 3b 20 20 20 20 20  R==OP_Or );     
1ca40 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
1ca50 65 28 20 6f 70 3d 3d 54 4b 5f 4f 52 20 29 3b 0a  e( op==TK_OR );.
1ca60 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
1ca70 5f 50 4c 55 53 3d 3d 4f 50 5f 41 64 64 20 29 3b  _PLUS==OP_Add );
1ca80 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63             testc
1ca90 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 50 4c 55 53  ase( op==TK_PLUS
1caa0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1cab0 28 20 54 4b 5f 4d 49 4e 55 53 3d 3d 4f 50 5f 53  ( TK_MINUS==OP_S
1cac0 75 62 74 72 61 63 74 20 29 3b 20 20 20 20 20 74  ubtract );     t
1cad0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
1cae0 4d 49 4e 55 53 20 29 3b 0a 20 20 20 20 20 20 61  MINUS );.      a
1caf0 73 73 65 72 74 28 20 54 4b 5f 52 45 4d 3d 3d 4f  ssert( TK_REM==O
1cb00 50 5f 52 65 6d 61 69 6e 64 65 72 20 29 3b 20 20  P_Remainder );  
1cb10 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
1cb20 3d 3d 54 4b 5f 52 45 4d 20 29 3b 0a 20 20 20 20  ==TK_REM );.    
1cb30 20 20 61 73 73 65 72 74 28 20 54 4b 5f 42 49 54    assert( TK_BIT
1cb40 41 4e 44 3d 3d 4f 50 5f 42 69 74 41 6e 64 20 29  AND==OP_BitAnd )
1cb50 3b 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  ;      testcase(
1cb60 20 6f 70 3d 3d 54 4b 5f 42 49 54 41 4e 44 20 29   op==TK_BITAND )
1cb70 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1cb80 54 4b 5f 42 49 54 4f 52 3d 3d 4f 50 5f 42 69 74  TK_BITOR==OP_Bit
1cb90 4f 72 20 29 3b 20 20 20 20 20 20 20 20 74 65 73  Or );        tes
1cba0 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 42 49  tcase( op==TK_BI
1cbb0 54 4f 52 20 29 3b 0a 20 20 20 20 20 20 61 73 73  TOR );.      ass
1cbc0 65 72 74 28 20 54 4b 5f 53 4c 41 53 48 3d 3d 4f  ert( TK_SLASH==O
1cbd0 50 5f 44 69 76 69 64 65 20 29 3b 20 20 20 20 20  P_Divide );     
1cbe0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1cbf0 54 4b 5f 53 4c 41 53 48 20 29 3b 0a 20 20 20 20  TK_SLASH );.    
1cc00 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 53 48    assert( TK_LSH
1cc10 49 46 54 3d 3d 4f 50 5f 53 68 69 66 74 4c 65 66  IFT==OP_ShiftLef
1cc20 74 20 29 3b 20 20 20 74 65 73 74 63 61 73 65 28  t );   testcase(
1cc30 20 6f 70 3d 3d 54 4b 5f 4c 53 48 49 46 54 20 29   op==TK_LSHIFT )
1cc40 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1cc50 54 4b 5f 52 53 48 49 46 54 3d 3d 4f 50 5f 53 68  TK_RSHIFT==OP_Sh
1cc60 69 66 74 52 69 67 68 74 20 29 3b 20 20 74 65 73  iftRight );  tes
1cc70 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 52 53  tcase( op==TK_RS
1cc80 48 49 46 54 20 29 3b 0a 20 20 20 20 20 20 61 73  HIFT );.      as
1cc90 73 65 72 74 28 20 54 4b 5f 43 4f 4e 43 41 54 3d  sert( TK_CONCAT=
1cca0 3d 4f 50 5f 43 6f 6e 63 61 74 20 29 3b 20 20 20  =OP_Concat );   
1ccb0 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
1ccc0 3d 54 4b 5f 43 4f 4e 43 41 54 20 29 3b 0a 20 20  =TK_CONCAT );.  
1ccd0 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
1cce0 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
1ccf0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
1cd00 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20  t, &regFree1);. 
1cd10 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65       r2 = sqlite
1cd20 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
1cd30 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69  arse, pExpr->pRi
1cd40 67 68 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b  ght, &regFree2);
1cd50 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1cd60 62 65 41 64 64 4f 70 33 28 76 2c 20 6f 70 2c 20  beAddOp3(v, op, 
1cd70 72 32 2c 20 72 31 2c 20 74 61 72 67 65 74 29 3b  r2, r1, target);
1cd80 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1cd90 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
1cda0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1cdb0 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20  regFree2==0 );. 
1cdc0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1cdd0 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4d  }.    case TK_UM
1cde0 49 4e 55 53 3a 20 7b 0a 20 20 20 20 20 20 45 78  INUS: {.      Ex
1cdf0 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70  pr *pLeft = pExp
1ce00 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20  r->pLeft;.      
1ce10 61 73 73 65 72 74 28 20 70 4c 65 66 74 20 29 3b  assert( pLeft );
1ce20 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65 66 74  .      if( pLeft
1ce30 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47 45 52  ->op==TK_INTEGER
1ce40 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65   ){.        code
1ce50 49 6e 74 65 67 65 72 28 70 50 61 72 73 65 2c 20  Integer(pParse, 
1ce60 70 4c 65 66 74 2c 20 31 2c 20 74 61 72 67 65 74  pLeft, 1, target
1ce70 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
1ce80 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f  E_OMIT_FLOATING_
1ce90 50 4f 49 4e 54 0a 20 20 20 20 20 20 7d 65 6c 73  POINT.      }els
1cea0 65 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d  e if( pLeft->op=
1ceb0 3d 54 4b 5f 46 4c 4f 41 54 20 29 7b 0a 20 20 20  =TK_FLOAT ){.   
1cec0 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
1ced0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
1cee0 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  xpr, EP_IntValue
1cef0 29 20 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 64  ) );.        cod
1cf00 65 52 65 61 6c 28 76 2c 20 70 4c 65 66 74 2d 3e  eReal(v, pLeft->
1cf10 75 2e 7a 54 6f 6b 65 6e 2c 20 31 2c 20 74 61 72  u.zToken, 1, tar
1cf20 67 65 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  get);.#endif.   
1cf30 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1cf40 20 20 74 65 6d 70 58 2e 6f 70 20 3d 20 54 4b 5f    tempX.op = TK_
1cf50 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 20 20 20  INTEGER;.       
1cf60 20 74 65 6d 70 58 2e 66 6c 61 67 73 20 3d 20 45   tempX.flags = E
1cf70 50 5f 49 6e 74 56 61 6c 75 65 7c 45 50 5f 54 6f  P_IntValue|EP_To
1cf80 6b 65 6e 4f 6e 6c 79 3b 0a 20 20 20 20 20 20 20  kenOnly;.       
1cf90 20 74 65 6d 70 58 2e 75 2e 69 56 61 6c 75 65 20   tempX.u.iValue 
1cfa0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 31 20  = 0;.        r1 
1cfb0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
1cfc0 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 26 74  eTemp(pParse, &t
1cfd0 65 6d 70 58 2c 20 26 72 65 67 46 72 65 65 31 29  empX, &regFree1)
1cfe0 3b 0a 20 20 20 20 20 20 20 20 72 32 20 3d 20 73  ;.        r2 = s
1cff0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
1d000 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
1d010 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65  ->pLeft, &regFre
1d020 65 32 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  e2);.        sql
1d030 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
1d040 2c 20 4f 50 5f 53 75 62 74 72 61 63 74 2c 20 72  , OP_Subtract, r
1d050 32 2c 20 72 31 2c 20 74 61 72 67 65 74 29 3b 0a  2, r1, target);.
1d060 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
1d070 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b  ( regFree2==0 );
1d080 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1d090 6e 52 65 67 20 3d 20 74 61 72 67 65 74 3b 0a 20  nReg = target;. 
1d0a0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1d0b0 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49  }.    case TK_BI
1d0c0 54 4e 4f 54 3a 0a 20 20 20 20 63 61 73 65 20 54  TNOT:.    case T
1d0d0 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 61  K_NOT: {.      a
1d0e0 73 73 65 72 74 28 20 54 4b 5f 42 49 54 4e 4f 54  ssert( TK_BITNOT
1d0f0 3d 3d 4f 50 5f 42 69 74 4e 6f 74 20 29 3b 20 20  ==OP_BitNot );  
1d100 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
1d110 4b 5f 42 49 54 4e 4f 54 20 29 3b 0a 20 20 20 20  K_BITNOT );.    
1d120 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54    assert( TK_NOT
1d130 3d 3d 4f 50 5f 4e 6f 74 20 29 3b 20 20 20 20 20  ==OP_Not );     
1d140 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
1d150 3d 3d 54 4b 5f 4e 4f 54 20 29 3b 0a 20 20 20 20  ==TK_NOT );.    
1d160 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78    r1 = sqlite3Ex
1d170 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
1d180 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
1d190 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20   &regFree1);.   
1d1a0 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
1d1b0 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
1d1c0 20 20 69 6e 52 65 67 20 3d 20 74 61 72 67 65 74    inReg = target
1d1d0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1d1e0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c  dbeAddOp2(v, op,
1d1f0 20 72 31 2c 20 69 6e 52 65 67 29 3b 0a 20 20 20   r1, inReg);.   
1d200 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1d210 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55      case TK_ISNU
1d220 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  LL:.    case TK_
1d230 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20  NOTNULL: {.     
1d240 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20   int addr;.     
1d250 20 61 73 73 65 72 74 28 20 54 4b 5f 49 53 4e 55   assert( TK_ISNU
1d260 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b  LL==OP_IsNull );
1d270 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
1d280 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20  =TK_ISNULL );.  
1d290 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e      assert( TK_N
1d2a0 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75  OTNULL==OP_NotNu
1d2b0 6c 6c 20 29 3b 20 74 65 73 74 63 61 73 65 28 20  ll ); testcase( 
1d2c0 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29  op==TK_NOTNULL )
1d2d0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1d2e0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1d2f0 49 6e 74 65 67 65 72 2c 20 31 2c 20 74 61 72 67  Integer, 1, targ
1d300 65 74 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20  et);.      r1 = 
1d310 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
1d320 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
1d330 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72  r->pLeft, &regFr
1d340 65 65 31 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ee1);.      test
1d350 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d  case( regFree1==
1d360 30 20 29 3b 0a 20 20 20 20 20 20 61 64 64 72 20  0 );.      addr 
1d370 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
1d380 4f 70 31 28 76 2c 20 6f 70 2c 20 72 31 29 3b 0a  Op1(v, op, r1);.
1d390 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
1d3a0 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 49  geIf(v, op==TK_I
1d3b0 53 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 56 64  SNULL);.      Vd
1d3c0 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
1d3d0 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 29 3b  op==TK_NOTNULL);
1d3e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1d3f0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
1d400 6e 74 65 67 65 72 2c 20 30 2c 20 74 61 72 67 65  nteger, 0, targe
1d410 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
1d420 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
1d430 20 61 64 64 72 29 3b 0a 20 20 20 20 20 20 62 72   addr);.      br
1d440 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
1d450 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54  ase TK_AGG_FUNCT
1d460 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 41 67 67  ION: {.      Agg
1d470 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 3d 20 70 45  Info *pInfo = pE
1d480 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a 20  xpr->pAggInfo;. 
1d490 20 20 20 20 20 69 66 28 20 70 49 6e 66 6f 3d 3d       if( pInfo==
1d4a0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  0 ){.        ass
1d4b0 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
1d4c0 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
1d4d0 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20  IntValue) );.   
1d4e0 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
1d4f0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6d 69  rMsg(pParse, "mi
1d500 73 75 73 65 20 6f 66 20 61 67 67 72 65 67 61 74  suse of aggregat
1d510 65 3a 20 25 73 28 29 22 2c 20 70 45 78 70 72 2d  e: %s()", pExpr-
1d520 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20  >u.zToken);.    
1d530 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1d540 20 69 6e 52 65 67 20 3d 20 70 49 6e 66 6f 2d 3e   inReg = pInfo->
1d550 61 46 75 6e 63 5b 70 45 78 70 72 2d 3e 69 41 67  aFunc[pExpr->iAg
1d560 67 5d 2e 69 4d 65 6d 3b 0a 20 20 20 20 20 20 7d  g].iMem;.      }
1d570 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1d580 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
1d590 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20  FUNCTION: {.    
1d5a0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 46 61 72    ExprList *pFar
1d5b0 67 3b 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74  g;       /* List
1d5c0 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20 61 72 67   of function arg
1d5d0 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20  uments */.      
1d5e0 69 6e 74 20 6e 46 61 72 67 3b 20 20 20 20 20 20  int nFarg;      
1d5f0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1d600 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20 61 72 67   of function arg
1d610 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20  uments */.      
1d620 46 75 6e 63 44 65 66 20 2a 70 44 65 66 3b 20 20  FuncDef *pDef;  
1d630 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 75         /* The fu
1d640 6e 63 74 69 6f 6e 20 64 65 66 69 6e 69 74 69 6f  nction definitio
1d650 6e 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20  n object */.    
1d660 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49    const char *zI
1d670 64 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  d;       /* The 
1d680 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f  function name */
1d690 0a 20 20 20 20 20 20 75 33 32 20 63 6f 6e 73 74  .      u32 const
1d6a0 4d 61 73 6b 20 3d 20 30 3b 20 20 20 20 20 2f 2a  Mask = 0;     /*
1d6b0 20 4d 61 73 6b 20 6f 66 20 66 75 6e 63 74 69 6f   Mask of functio
1d6c0 6e 20 61 72 67 75 6d 65 6e 74 73 20 74 68 61 74  n arguments that
1d6d0 20 61 72 65 20 63 6f 6e 73 74 61 6e 74 20 2a 2f   are constant */
1d6e0 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 20 20 20  .      int i;   
1d6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d700 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
1d710 0a 20 20 20 20 20 20 75 38 20 65 6e 63 20 3d 20  .      u8 enc = 
1d720 45 4e 43 28 64 62 29 3b 20 20 20 20 20 20 2f 2a  ENC(db);      /*
1d730 20 54 68 65 20 74 65 78 74 20 65 6e 63 6f 64 69   The text encodi
1d740 6e 67 20 75 73 65 64 20 62 79 20 74 68 69 73 20  ng used by this 
1d750 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 20 20  database */.    
1d760 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
1d770 20 3d 20 30 3b 20 20 20 20 2f 2a 20 41 20 63 6f   = 0;    /* A co
1d780 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
1d790 20 2a 2f 0a 0a 20 20 20 20 20 20 61 73 73 65 72   */..      asser
1d7a0 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
1d7b0 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49  rty(pExpr, EP_xI
1d7c0 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20  sSelect) );.    
1d7d0 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
1d7e0 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
1d7f0 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20  TokenOnly) ){.  
1d800 20 20 20 20 20 20 70 46 61 72 67 20 3d 20 30 3b        pFarg = 0;
1d810 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1d820 20 20 20 20 20 20 70 46 61 72 67 20 3d 20 70 45        pFarg = pE
1d830 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20  xpr->x.pList;.  
1d840 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 46 61 72      }.      nFar
1d850 67 20 3d 20 70 46 61 72 67 20 3f 20 70 46 61 72  g = pFarg ? pFar
1d860 67 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 0a 20 20  g->nExpr : 0;.  
1d870 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
1d880 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
1d890 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  pr, EP_IntValue)
1d8a0 20 29 3b 0a 20 20 20 20 20 20 7a 49 64 20 3d 20   );.      zId = 
1d8b0 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b  pExpr->u.zToken;
1d8c0 0a 20 20 20 20 20 20 70 44 65 66 20 3d 20 73 71  .      pDef = sq
1d8d0 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f  lite3FindFunctio
1d8e0 6e 28 64 62 2c 20 7a 49 64 2c 20 6e 46 61 72 67  n(db, zId, nFarg
1d8f0 2c 20 65 6e 63 2c 20 30 29 3b 0a 23 69 66 64 65  , enc, 0);.#ifde
1d900 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
1d910 55 4e 4b 4e 4f 57 4e 5f 53 51 4c 5f 46 55 4e 43  UNKNOWN_SQL_FUNC
1d920 54 49 4f 4e 0a 20 20 20 20 20 20 69 66 28 20 70  TION.      if( p
1d930 44 65 66 3d 3d 30 20 26 26 20 70 50 61 72 73 65  Def==0 && pParse
1d940 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20  ->explain ){.   
1d950 20 20 20 20 20 70 44 65 66 20 3d 20 73 71 6c 69       pDef = sqli
1d960 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28  te3FindFunction(
1d970 64 62 2c 20 22 75 6e 6b 6e 6f 77 6e 22 2c 20 6e  db, "unknown", n
1d980 46 61 72 67 2c 20 65 6e 63 2c 20 30 29 3b 0a 20  Farg, enc, 0);. 
1d990 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
1d9a0 20 20 20 20 69 66 28 20 70 44 65 66 3d 3d 30 20      if( pDef==0 
1d9b0 7c 7c 20 70 44 65 66 2d 3e 78 46 69 6e 61 6c 69  || pDef->xFinali
1d9c0 7a 65 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ze!=0 ){.       
1d9d0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
1d9e0 28 70 50 61 72 73 65 2c 20 22 75 6e 6b 6e 6f 77  (pParse, "unknow
1d9f0 6e 20 66 75 6e 63 74 69 6f 6e 3a 20 25 73 28 29  n function: %s()
1da00 22 2c 20 7a 49 64 29 3b 0a 20 20 20 20 20 20 20  ", zId);.       
1da10 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
1da20 0a 20 20 20 20 20 20 2f 2a 20 41 74 74 65 6d 70  .      /* Attemp
1da30 74 20 61 20 64 69 72 65 63 74 20 69 6d 70 6c 65  t a direct imple
1da40 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
1da50 20 62 75 69 6c 74 2d 69 6e 20 43 4f 41 4c 45 53   built-in COALES
1da60 43 45 28 29 20 61 6e 64 0a 20 20 20 20 20 20 2a  CE() and.      *
1da70 2a 20 49 46 4e 55 4c 4c 28 29 20 66 75 6e 63 74  * IFNULL() funct
1da80 69 6f 6e 73 2e 20 20 54 68 69 73 20 61 76 6f 69  ions.  This avoi
1da90 64 73 20 75 6e 6e 65 63 65 73 73 61 72 79 20 65  ds unnecessary e
1daa0 76 61 6c 75 61 74 69 6f 6e 20 6f 66 0a 20 20 20  valuation of.   
1dab0 20 20 20 2a 2a 20 61 72 67 75 6d 65 6e 74 73 20     ** arguments 
1dac0 70 61 73 74 20 74 68 65 20 66 69 72 73 74 20 6e  past the first n
1dad0 6f 6e 2d 4e 55 4c 4c 20 61 72 67 75 6d 65 6e 74  on-NULL argument
1dae0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
1daf0 20 69 66 28 20 70 44 65 66 2d 3e 66 75 6e 63 46   if( pDef->funcF
1db00 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55  lags & SQLITE_FU
1db10 4e 43 5f 43 4f 41 4c 45 53 43 45 20 29 7b 0a 20  NC_COALESCE ){. 
1db20 20 20 20 20 20 20 20 69 6e 74 20 65 6e 64 43 6f         int endCo
1db30 61 6c 65 73 63 65 20 3d 20 73 71 6c 69 74 65 33  alesce = sqlite3
1db40 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
1db50 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
1db60 28 20 6e 46 61 72 67 3e 3d 32 20 29 3b 0a 20 20  ( nFarg>=2 );.  
1db70 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1db80 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 46  rCode(pParse, pF
1db90 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c  arg->a[0].pExpr,
1dba0 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
1dbb0 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 46 61    for(i=1; i<nFa
1dbc0 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rg; i++){.      
1dbd0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1dbe0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 6f 74 4e  ddOp2(v, OP_NotN
1dbf0 75 6c 6c 2c 20 74 61 72 67 65 74 2c 20 65 6e 64  ull, target, end
1dc00 43 6f 61 6c 65 73 63 65 29 3b 0a 20 20 20 20 20  Coalesce);.     
1dc10 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
1dc20 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(v);.          
1dc30 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
1dc40 52 65 6d 6f 76 65 28 70 50 61 72 73 65 2c 20 74  Remove(pParse, t
1dc50 61 72 67 65 74 2c 20 31 29 3b 0a 20 20 20 20 20  arget, 1);.     
1dc60 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1dc70 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65  CachePush(pParse
1dc80 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
1dc90 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
1dca0 72 73 65 2c 20 70 46 61 72 67 2d 3e 61 5b 69 5d  rse, pFarg->a[i]
1dcb0 2e 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b  .pExpr, target);
1dcc0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
1dcd0 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70  e3ExprCachePop(p
1dce0 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
1dcf0 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
1dd00 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
1dd10 6c 28 76 2c 20 65 6e 64 43 6f 61 6c 65 73 63 65  l(v, endCoalesce
1dd20 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
1dd30 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
1dd40 20 2f 2a 20 54 68 65 20 55 4e 4c 49 4b 45 4c 59   /* The UNLIKELY
1dd50 28 29 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  () function is a
1dd60 20 6e 6f 2d 6f 70 2e 20 20 54 68 65 20 72 65 73   no-op.  The res
1dd70 75 6c 74 20 69 73 20 74 68 65 20 76 61 6c 75 65  ult is the value
1dd80 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  .      ** of the
1dd90 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e   first argument.
1dda0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
1ddb0 69 66 28 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c  if( pDef->funcFl
1ddc0 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e  ags & SQLITE_FUN
1ddd0 43 5f 55 4e 4c 49 4b 45 4c 59 20 29 7b 0a 20 20  C_UNLIKELY ){.  
1dde0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 46        assert( nF
1ddf0 61 72 67 3e 3d 31 20 29 3b 0a 20 20 20 20 20 20  arg>=1 );.      
1de00 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65    inReg = sqlite
1de10 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28  3ExprCodeTarget(
1de20 70 50 61 72 73 65 2c 20 70 46 61 72 67 2d 3e 61  pParse, pFarg->a
1de30 5b 30 5d 2e 70 45 78 70 72 2c 20 74 61 72 67 65  [0].pExpr, targe
1de40 74 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  t);.        brea
1de50 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  k;.      }..    
1de60 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 46 61    for(i=0; i<nFa
1de70 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rg; i++){.      
1de80 20 20 69 66 28 20 69 3c 33 32 20 26 26 20 73 71    if( i<32 && sq
1de90 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
1dea0 61 6e 74 28 70 46 61 72 67 2d 3e 61 5b 69 5d 2e  ant(pFarg->a[i].
1deb0 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20  pExpr) ){.      
1dec0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 3d      testcase( i=
1ded0 3d 33 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20  =31 );.         
1dee0 20 63 6f 6e 73 74 4d 61 73 6b 20 7c 3d 20 4d 41   constMask |= MA
1def0 53 4b 42 49 54 33 32 28 69 29 3b 0a 20 20 20 20  SKBIT32(i);.    
1df00 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
1df10 28 20 28 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61  ( (pDef->funcFla
1df20 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43  gs & SQLITE_FUNC
1df30 5f 4e 45 45 44 43 4f 4c 4c 29 21 3d 30 20 26 26  _NEEDCOLL)!=0 &&
1df40 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20   !pColl ){.     
1df50 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c       pColl = sql
1df60 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
1df70 70 50 61 72 73 65 2c 20 70 46 61 72 67 2d 3e 61  pParse, pFarg->a
1df80 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [i].pExpr);.    
1df90 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1dfa0 20 20 20 20 69 66 28 20 70 46 61 72 67 20 29 7b      if( pFarg ){
1dfb0 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 6f 6e  .        if( con
1dfc0 73 74 4d 61 73 6b 20 29 7b 0a 20 20 20 20 20 20  stMask ){.      
1dfd0 20 20 20 20 72 31 20 3d 20 70 50 61 72 73 65 2d      r1 = pParse-
1dfe0 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 20 20 20  >nMem+1;.       
1dff0 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
1e000 2b 3d 20 6e 46 61 72 67 3b 0a 20 20 20 20 20 20  += nFarg;.      
1e010 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1e020 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47     r1 = sqlite3G
1e030 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  etTempRange(pPar
1e040 73 65 2c 20 6e 46 61 72 67 29 3b 0a 20 20 20 20  se, nFarg);.    
1e050 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f      }..        /
1e060 2a 20 46 6f 72 20 6c 65 6e 67 74 68 28 29 20 61  * For length() a
1e070 6e 64 20 74 79 70 65 6f 66 28 29 20 66 75 6e 63  nd typeof() func
1e080 74 69 6f 6e 73 20 77 69 74 68 20 61 20 63 6f 6c  tions with a col
1e090 75 6d 6e 20 61 72 67 75 6d 65 6e 74 2c 0a 20 20  umn argument,.  
1e0a0 20 20 20 20 20 20 2a 2a 20 73 65 74 20 74 68 65        ** set the
1e0b0 20 50 35 20 70 61 72 61 6d 65 74 65 72 20 74 6f   P5 parameter to
1e0c0 20 74 68 65 20 4f 50 5f 43 6f 6c 75 6d 6e 20 6f   the OP_Column o
1e0d0 70 63 6f 64 65 20 74 6f 20 4f 50 46 4c 41 47 5f  pcode to OPFLAG_
1e0e0 4c 45 4e 47 54 48 41 52 47 0a 20 20 20 20 20 20  LENGTHARG.      
1e0f0 20 20 2a 2a 20 6f 72 20 4f 50 46 4c 41 47 5f 54    ** or OPFLAG_T
1e100 59 50 45 4f 46 41 52 47 20 72 65 73 70 65 63 74  YPEOFARG respect
1e110 69 76 65 6c 79 2c 20 74 6f 20 61 76 6f 69 64 20  ively, to avoid 
1e120 75 6e 6e 65 63 65 73 73 61 72 79 20 64 61 74 61  unnecessary data
1e130 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c 6f 61 64  .        ** load
1e140 69 6e 67 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ing..        */.
1e150 20 20 20 20 20 20 20 20 69 66 28 20 28 70 44 65          if( (pDe
1e160 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 28  f->funcFlags & (
1e170 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4c 45 4e 47  SQLITE_FUNC_LENG
1e180 54 48 7c 53 51 4c 49 54 45 5f 46 55 4e 43 5f 54  TH|SQLITE_FUNC_T
1e190 59 50 45 4f 46 29 29 21 3d 30 20 29 7b 0a 20 20  YPEOF))!=0 ){.  
1e1a0 20 20 20 20 20 20 20 20 75 38 20 65 78 70 72 4f          u8 exprO
1e1b0 70 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  p;.          ass
1e1c0 65 72 74 28 20 6e 46 61 72 67 3d 3d 31 20 29 3b  ert( nFarg==1 );
1e1d0 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
1e1e0 74 28 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70  t( pFarg->a[0].p
1e1f0 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20 20  Expr!=0 );.     
1e200 20 20 20 20 20 65 78 70 72 4f 70 20 3d 20 70 46       exprOp = pF
1e210 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d  arg->a[0].pExpr-
1e220 3e 6f 70 3b 0a 20 20 20 20 20 20 20 20 20 20 69  >op;.          i
1e230 66 28 20 65 78 70 72 4f 70 3d 3d 54 4b 5f 43 4f  f( exprOp==TK_CO
1e240 4c 55 4d 4e 20 7c 7c 20 65 78 70 72 4f 70 3d 3d  LUMN || exprOp==
1e250 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 7b  TK_AGG_COLUMN ){
1e260 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73  .            ass
1e270 65 72 74 28 20 53 51 4c 49 54 45 5f 46 55 4e 43  ert( SQLITE_FUNC
1e280 5f 4c 45 4e 47 54 48 3d 3d 4f 50 46 4c 41 47 5f  _LENGTH==OPFLAG_
1e290 4c 45 4e 47 54 48 41 52 47 20 29 3b 0a 20 20 20  LENGTHARG );.   
1e2a0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
1e2b0 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 54 59 50   SQLITE_FUNC_TYP
1e2c0 45 4f 46 3d 3d 4f 50 46 4c 41 47 5f 54 59 50 45  EOF==OPFLAG_TYPE
1e2d0 4f 46 41 52 47 20 29 3b 0a 20 20 20 20 20 20 20  OFARG );.       
1e2e0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
1e2f0 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26  Def->funcFlags &
1e300 20 4f 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41 52   OPFLAG_LENGTHAR
1e310 47 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  G );.           
1e320 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78   pFarg->a[0].pEx
1e330 70 72 2d 3e 6f 70 32 20 3d 20 0a 20 20 20 20 20  pr->op2 = .     
1e340 20 20 20 20 20 20 20 20 20 20 20 20 20 70 44 65               pDe
1e350 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 28  f->funcFlags & (
1e360 4f 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41 52 47  OPFLAG_LENGTHARG
1e370 7c 4f 50 46 4c 41 47 5f 54 59 50 45 4f 46 41 52  |OPFLAG_TYPEOFAR
1e380 47 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  G);.          }.
1e390 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
1e3a0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
1e3b0 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b  chePush(pParse);
1e3c0 20 20 20 20 20 2f 2a 20 54 69 63 6b 65 74 20 32       /* Ticket 2
1e3d0 65 61 32 34 32 35 64 33 34 62 65 20 2a 2f 0a 20  ea2425d34be */. 
1e3e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
1e3f0 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70  prCodeExprList(p
1e400 50 61 72 73 65 2c 20 70 46 61 72 67 2c 20 72 31  Parse, pFarg, r1
1e410 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
1e420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e430 20 20 20 20 20 53 51 4c 49 54 45 5f 45 43 45 4c       SQLITE_ECEL
1e440 5f 44 55 50 7c 53 51 4c 49 54 45 5f 45 43 45 4c  _DUP|SQLITE_ECEL
1e450 5f 46 41 43 54 4f 52 29 3b 0a 20 20 20 20 20 20  _FACTOR);.      
1e460 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
1e470 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b 20 20  hePop(pParse);  
1e480 20 20 20 20 2f 2a 20 54 69 63 6b 65 74 20 32 65      /* Ticket 2e
1e490 61 32 34 32 35 64 33 34 62 65 20 2a 2f 0a 20 20  a2425d34be */.  
1e4a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1e4b0 20 20 20 72 31 20 3d 20 30 3b 0a 20 20 20 20 20     r1 = 0;.     
1e4c0 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
1e4d0 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
1e4e0 42 4c 45 0a 20 20 20 20 20 20 2f 2a 20 50 6f 73  BLE.      /* Pos
1e4f0 73 69 62 6c 79 20 6f 76 65 72 6c 6f 61 64 20 74  sibly overload t
1e500 68 65 20 66 75 6e 63 74 69 6f 6e 20 69 66 20 74  he function if t
1e510 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
1e520 74 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 20  t is.      ** a 
1e530 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 63 6f  virtual table co
1e540 6c 75 6d 6e 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  lumn..      **. 
1e550 20 20 20 20 20 2a 2a 20 46 6f 72 20 69 6e 66 69       ** For infi
1e560 78 20 66 75 6e 63 74 69 6f 6e 73 20 28 4c 49 4b  x functions (LIK
1e570 45 2c 20 47 4c 4f 42 2c 20 52 45 47 45 58 50 2c  E, GLOB, REGEXP,
1e580 20 61 6e 64 20 4d 41 54 43 48 29 20 75 73 65 20   and MATCH) use 
1e590 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 73 65 63  the.      ** sec
1e5a0 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 20 6e 6f  ond argument, no
1e5b0 74 20 74 68 65 20 66 69 72 73 74 2c 20 61 73 20  t the first, as 
1e5c0 74 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  the argument to 
1e5d0 74 65 73 74 20 74 6f 0a 20 20 20 20 20 20 2a 2a  test to.      **
1e5e0 20 73 65 65 20 69 66 20 69 74 20 69 73 20 61 20   see if it is a 
1e5f0 63 6f 6c 75 6d 6e 20 69 6e 20 61 20 76 69 72 74  column in a virt
1e600 75 61 6c 20 74 61 62 6c 65 2e 20 20 54 68 69 73  ual table.  This
1e610 20 69 73 20 64 6f 6e 65 20 62 65 63 61 75 73 65   is done because
1e620 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6c 65  .      ** the le
1e630 66 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 69 6e  ft operand of in
1e640 66 69 78 20 66 75 6e 63 74 69 6f 6e 73 20 28 74  fix functions (t
1e650 68 65 20 6f 70 65 72 61 6e 64 20 77 65 20 77 61  he operand we wa
1e660 6e 74 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 63  nt to.      ** c
1e670 6f 6e 74 72 6f 6c 20 6f 76 65 72 6c 6f 61 64 69  ontrol overloadi
1e680 6e 67 29 20 65 6e 64 73 20 75 70 20 61 73 20 74  ng) ends up as t
1e690 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
1e6a0 6e 74 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20  nt to the.      
1e6b0 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68  ** function.  Th
1e6c0 65 20 65 78 70 72 65 73 73 69 6f 6e 20 22 41 20  e expression "A 
1e6d0 67 6c 6f 62 20 42 22 20 69 73 20 65 71 75 69 76  glob B" is equiv
1e6e0 61 6c 65 6e 74 20 74 6f 20 0a 20 20 20 20 20 20  alent to .      
1e6f0 2a 2a 20 22 67 6c 6f 62 28 42 2c 41 29 2e 20 20  ** "glob(B,A).  
1e700 57 65 20 77 61 6e 74 20 74 6f 20 75 73 65 20 74  We want to use t
1e710 68 65 20 41 20 69 6e 20 22 41 20 67 6c 6f 62 20  he A in "A glob 
1e720 42 22 20 74 6f 20 74 65 73 74 0a 20 20 20 20 20  B" to test.     
1e730 20 2a 2a 20 66 6f 72 20 66 75 6e 63 74 69 6f 6e   ** for function
1e740 20 6f 76 65 72 6c 6f 61 64 69 6e 67 2e 20 20 42   overloading.  B
1e750 75 74 20 77 65 20 75 73 65 20 74 68 65 20 42 20  ut we use the B 
1e760 74 65 72 6d 20 69 6e 20 22 67 6c 6f 62 28 42 2c  term in "glob(B,
1e770 41 29 22 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  A)"..      */.  
1e780 20 20 20 20 69 66 28 20 6e 46 61 72 67 3e 3d 32      if( nFarg>=2
1e790 20 26 26 20 28 70 45 78 70 72 2d 3e 66 6c 61 67   && (pExpr->flag
1e7a0 73 20 26 20 45 50 5f 49 6e 66 69 78 46 75 6e 63  s & EP_InfixFunc
1e7b0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65  ) ){.        pDe
1e7c0 66 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62 4f  f = sqlite3VtabO
1e7d0 76 65 72 6c 6f 61 64 46 75 6e 63 74 69 6f 6e 28  verloadFunction(
1e7e0 64 62 2c 20 70 44 65 66 2c 20 6e 46 61 72 67 2c  db, pDef, nFarg,
1e7f0 20 70 46 61 72 67 2d 3e 61 5b 31 5d 2e 70 45 78   pFarg->a[1].pEx
1e800 70 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  pr);.      }else
1e810 20 69 66 28 20 6e 46 61 72 67 3e 30 20 29 7b 0a   if( nFarg>0 ){.
1e820 20 20 20 20 20 20 20 20 70 44 65 66 20 3d 20 73          pDef = s
1e830 71 6c 69 74 65 33 56 74 61 62 4f 76 65 72 6c 6f  qlite3VtabOverlo
1e840 61 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 70  adFunction(db, p
1e850 44 65 66 2c 20 6e 46 61 72 67 2c 20 70 46 61 72  Def, nFarg, pFar
1e860 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a  g->a[0].pExpr);.
1e870 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
1e880 20 20 20 20 20 69 66 28 20 70 44 65 66 2d 3e 66       if( pDef->f
1e890 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54  uncFlags & SQLIT
1e8a0 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 20  E_FUNC_NEEDCOLL 
1e8b0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  ){.        if( !
1e8c0 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20  pColl ) pColl = 
1e8d0 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 20 0a  db->pDfltColl; .
1e8e0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
1e8f0 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
1e900 43 6f 6c 6c 53 65 71 2c 20 30 2c 20 30 2c 20 30  CollSeq, 0, 0, 0
1e910 2c 20 28 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c  , (char *)pColl,
1e920 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20   P4_COLLSEQ);.  
1e930 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
1e940 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
1e950 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 30 2c 20 63   OP_Function0, c
1e960 6f 6e 73 74 4d 61 73 6b 2c 20 72 31 2c 20 74 61  onstMask, r1, ta
1e970 72 67 65 74 2c 0a 20 20 20 20 20 20 20 20 20 20  rget,.          
1e980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
1e990 68 61 72 2a 29 70 44 65 66 2c 20 50 34 5f 46 55  har*)pDef, P4_FU
1e9a0 4e 43 44 45 46 29 3b 0a 20 20 20 20 20 20 73 71  NCDEF);.      sq
1e9b0 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
1e9c0 35 28 76 2c 20 28 75 38 29 6e 46 61 72 67 29 3b  5(v, (u8)nFarg);
1e9d0 0a 20 20 20 20 20 20 69 66 28 20 6e 46 61 72 67  .      if( nFarg
1e9e0 20 26 26 20 63 6f 6e 73 74 4d 61 73 6b 3d 3d 30   && constMask==0
1e9f0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
1ea00 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61  te3ReleaseTempRa
1ea10 6e 67 65 28 70 50 61 72 73 65 2c 20 72 31 2c 20  nge(pParse, r1, 
1ea20 6e 46 61 72 67 29 3b 0a 20 20 20 20 20 20 7d 0a  nFarg);.      }.
1ea30 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1ea40 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
1ea50 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
1ea60 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 49 53      case TK_EXIS
1ea70 54 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  TS:.    case TK_
1ea80 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20 20 20  SELECT: {.      
1ea90 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 20 20 20 20  int nCol;.      
1eaa0 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
1eab0 5f 45 58 49 53 54 53 20 29 3b 0a 20 20 20 20 20  _EXISTS );.     
1eac0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
1ead0 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 20 20 20 20  K_SELECT );.    
1eae0 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 53 45 4c    if( op==TK_SEL
1eaf0 45 43 54 20 26 26 20 28 6e 43 6f 6c 20 3d 20 70  ECT && (nCol = p
1eb00 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2d  Expr->x.pSelect-
1eb10 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 21  >pEList->nExpr)!
1eb20 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =1 ){.        sq
1eb30 6c 69 74 65 33 53 75 62 73 65 6c 65 63 74 45 72  lite3SubselectEr
1eb40 72 6f 72 28 70 50 61 72 73 65 2c 20 6e 43 6f 6c  ror(pParse, nCol
1eb50 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  , 1);.      }els
1eb60 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 52 65 67  e{.        inReg
1eb70 20 3d 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75   = sqlite3CodeSu
1eb80 62 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  bselect(pParse, 
1eb90 70 45 78 70 72 2c 20 30 2c 20 30 29 3b 0a 20 20  pExpr, 0, 0);.  
1eba0 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
1ebb0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
1ebc0 65 20 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c 55  e TK_SELECT_COLU
1ebd0 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  MN: {.      if( 
1ebe0 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 69 54  pExpr->pLeft->iT
1ebf0 61 62 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  able==0 ){.     
1ec00 20 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d     pExpr->pLeft-
1ec10 3e 69 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65  >iTable = sqlite
1ec20 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70  3CodeSubselect(p
1ec30 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
1ec40 65 66 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  eft, 0, 0);.    
1ec50 20 20 7d 0a 20 20 20 20 20 20 69 6e 52 65 67 20    }.      inReg 
1ec60 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e  = pExpr->pLeft->
1ec70 69 54 61 62 6c 65 20 2b 20 70 45 78 70 72 2d 3e  iTable + pExpr->
1ec80 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 62  iColumn;.      b
1ec90 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
1eca0 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20  case TK_IN: {.  
1ecb0 20 20 20 20 69 6e 74 20 64 65 73 74 49 66 46 61      int destIfFa
1ecc0 6c 73 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62  lse = sqlite3Vdb
1ecd0 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
1ece0 20 20 20 20 20 69 6e 74 20 64 65 73 74 49 66 4e       int destIfN
1ecf0 75 6c 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ull = sqlite3Vdb
1ed00 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
1ed10 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1ed20 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp2(v, OP_Nul
1ed30 6c 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20  l, 0, target);. 
1ed40 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1ed50 43 6f 64 65 49 4e 28 70 50 61 72 73 65 2c 20 70  CodeIN(pParse, p
1ed60 45 78 70 72 2c 20 64 65 73 74 49 66 46 61 6c 73  Expr, destIfFals
1ed70 65 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a  e, destIfNull);.
1ed80 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1ed90 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
1eda0 74 65 67 65 72 2c 20 31 2c 20 74 61 72 67 65 74  teger, 1, target
1edb0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1edc0 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
1edd0 28 76 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29  (v, destIfFalse)
1ede0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1edf0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1ee00 41 64 64 49 6d 6d 2c 20 74 61 72 67 65 74 2c 20  AddImm, target, 
1ee10 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
1ee20 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
1ee30 6c 28 76 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29  l(v, destIfNull)
1ee40 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1ee50 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53     }.#endif /* S
1ee60 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
1ee70 45 52 59 20 2a 2f 0a 0a 0a 20 20 20 20 2f 2a 0a  ERY */...    /*.
1ee80 20 20 20 20 2a 2a 20 20 20 20 78 20 42 45 54 57      **    x BETW
1ee90 45 45 4e 20 79 20 41 4e 44 20 7a 0a 20 20 20 20  EEN y AND z.    
1eea0 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69  **.    ** This i
1eeb0 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 0a  s equivalent to.
1eec0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
1eed0 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 0a 20   x>=y AND x<=z. 
1eee0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 58 20 69     **.    ** X i
1eef0 73 20 73 74 6f 72 65 64 20 69 6e 20 70 45 78 70  s stored in pExp
1ef00 72 2d 3e 70 4c 65 66 74 2e 0a 20 20 20 20 2a 2a  r->pLeft..    **
1ef10 20 59 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20   Y is stored in 
1ef20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b  pExpr->pList->a[
1ef30 30 5d 2e 70 45 78 70 72 2e 0a 20 20 20 20 2a 2a  0].pExpr..    **
1ef40 20 5a 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20   Z is stored in 
1ef50 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b  pExpr->pList->a[
1ef60 31 5d 2e 70 45 78 70 72 2e 0a 20 20 20 20 2a 2f  1].pExpr..    */
1ef70 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54  .    case TK_BET
1ef80 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 65 78  WEEN: {.      ex
1ef90 70 72 43 6f 64 65 42 65 74 77 65 65 6e 28 70 50  prCodeBetween(pP
1efa0 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72  arse, pExpr, tar
1efb0 67 65 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  get, 0, 0);.    
1efc0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1efd0 20 20 20 63 61 73 65 20 54 4b 5f 53 50 41 4e 3a     case TK_SPAN:
1efe0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c  .    case TK_COL
1eff0 4c 41 54 45 3a 20 0a 20 20 20 20 63 61 73 65 20  LATE: .    case 
1f000 54 4b 5f 55 50 4c 55 53 3a 20 7b 0a 20 20 20 20  TK_UPLUS: {.    
1f010 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65    inReg = sqlite
1f020 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28  3ExprCodeTarget(
1f030 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
1f040 4c 65 66 74 2c 20 74 61 72 67 65 74 29 3b 0a 20  Left, target);. 
1f050 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1f060 7d 0a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 54  }..    case TK_T
1f070 52 49 47 47 45 52 3a 20 7b 0a 20 20 20 20 20 20  RIGGER: {.      
1f080 2f 2a 20 49 66 20 74 68 65 20 6f 70 63 6f 64 65  /* If the opcode
1f090 20 69 73 20 54 4b 5f 54 52 49 47 47 45 52 2c 20   is TK_TRIGGER, 
1f0a0 74 68 65 6e 20 74 68 65 20 65 78 70 72 65 73 73  then the express
1f0b0 69 6f 6e 20 69 73 20 61 20 72 65 66 65 72 65 6e  ion is a referen
1f0c0 63 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 61  ce.      ** to a
1f0d0 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 6e   column in the n
1f0e0 65 77 2e 2a 20 6f 72 20 6f 6c 64 2e 2a 20 70 73  ew.* or old.* ps
1f0f0 65 75 64 6f 2d 74 61 62 6c 65 73 20 61 76 61 69  eudo-tables avai
1f100 6c 61 62 6c 65 20 74 6f 0a 20 20 20 20 20 20 2a  lable to.      *
1f110 2a 20 74 72 69 67 67 65 72 20 70 72 6f 67 72 61  * trigger progra
1f120 6d 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ms. In this case
1f130 20 45 78 70 72 2e 69 54 61 62 6c 65 20 69 73 20   Expr.iTable is 
1f140 73 65 74 20 74 6f 20 31 20 66 6f 72 20 74 68 65  set to 1 for the
1f150 0a 20 20 20 20 20 20 2a 2a 20 6e 65 77 2e 2a 20  .      ** new.* 
1f160 70 73 65 75 64 6f 2d 74 61 62 6c 65 2c 20 6f 72  pseudo-table, or
1f170 20 30 20 66 6f 72 20 74 68 65 20 6f 6c 64 2e 2a   0 for the old.*
1f180 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2e 20 45   pseudo-table. E
1f190 78 70 72 2e 69 43 6f 6c 75 6d 6e 0a 20 20 20 20  xpr.iColumn.    
1f1a0 20 20 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 74    ** is set to t
1f1b0 68 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65  he column of the
1f1c0 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 20 74 6f   pseudo-table to
1f1d0 20 72 65 61 64 2c 20 6f 72 20 74 6f 20 2d 31 20   read, or to -1 
1f1e0 74 6f 0a 20 20 20 20 20 20 2a 2a 20 72 65 61 64  to.      ** read
1f1f0 20 74 68 65 20 72 6f 77 69 64 20 66 69 65 6c 64   the rowid field
1f200 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
1f210 20 2a 2a 20 54 68 65 20 65 78 70 72 65 73 73 69   ** The expressi
1f220 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65  on is implemente
1f230 64 20 75 73 69 6e 67 20 61 6e 20 4f 50 5f 50 61  d using an OP_Pa
1f240 72 61 6d 20 6f 70 63 6f 64 65 2e 20 54 68 65 20  ram opcode. The 
1f250 70 31 0a 20 20 20 20 20 20 2a 2a 20 70 61 72 61  p1.      ** para
1f260 6d 65 74 65 72 20 69 73 20 73 65 74 20 74 6f 20  meter is set to 
1f270 30 20 66 6f 72 20 61 6e 20 6f 6c 64 2e 72 6f 77  0 for an old.row
1f280 69 64 20 72 65 66 65 72 65 6e 63 65 2c 20 6f 72  id reference, or
1f290 20 74 6f 20 28 69 2b 31 29 0a 20 20 20 20 20 20   to (i+1).      
1f2a0 2a 2a 20 74 6f 20 72 65 66 65 72 65 6e 63 65 20  ** to reference 
1f2b0 61 6e 6f 74 68 65 72 20 63 6f 6c 75 6d 6e 20 6f  another column o
1f2c0 66 20 74 68 65 20 6f 6c 64 2e 2a 20 70 73 65 75  f the old.* pseu
1f2d0 64 6f 2d 74 61 62 6c 65 2c 20 77 68 65 72 65 20  do-table, where 
1f2e0 0a 20 20 20 20 20 20 2a 2a 20 69 20 69 73 20 74  .      ** i is t
1f2f0 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20  he index of the 
1f300 63 6f 6c 75 6d 6e 2e 20 46 6f 72 20 61 20 6e 65  column. For a ne
1f310 77 2e 72 6f 77 69 64 20 72 65 66 65 72 65 6e 63  w.rowid referenc
1f320 65 2c 20 70 31 20 69 73 0a 20 20 20 20 20 20 2a  e, p1 is.      *
1f330 2a 20 73 65 74 20 74 6f 20 28 6e 2b 31 29 2c 20  * set to (n+1), 
1f340 77 68 65 72 65 20 6e 20 69 73 20 74 68 65 20 6e  where n is the n
1f350 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
1f360 20 69 6e 20 65 61 63 68 20 70 73 65 75 64 6f 2d   in each pseudo-
1f370 74 61 62 6c 65 2e 0a 20 20 20 20 20 20 2a 2a 20  table..      ** 
1f380 46 6f 72 20 61 20 72 65 66 65 72 65 6e 63 65 20  For a reference 
1f390 74 6f 20 61 6e 79 20 6f 74 68 65 72 20 63 6f 6c  to any other col
1f3a0 75 6d 6e 20 69 6e 20 74 68 65 20 6e 65 77 2e 2a  umn in the new.*
1f3b0 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2c 20 70   pseudo-table, p
1f3c0 31 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73 65  1.      ** is se
1f3d0 74 20 74 6f 20 28 6e 2b 32 2b 69 29 2c 20 77 68  t to (n+2+i), wh
1f3e0 65 72 65 20 6e 20 61 6e 64 20 69 20 61 72 65 20  ere n and i are 
1f3f0 61 73 20 64 65 66 69 6e 65 64 20 70 72 65 76 69  as defined previ
1f400 6f 75 73 6c 79 2e 20 46 6f 72 0a 20 20 20 20 20  ously. For.     
1f410 20 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 69 66 20   ** example, if 
1f420 74 68 65 20 74 61 62 6c 65 20 6f 6e 20 77 68 69  the table on whi
1f430 63 68 20 74 72 69 67 67 65 72 73 20 61 72 65 20  ch triggers are 
1f440 62 65 69 6e 67 20 66 69 72 65 64 20 69 73 0a 20  being fired is. 
1f450 20 20 20 20 20 2a 2a 20 64 65 63 6c 61 72 65 64       ** declared
1f460 20 61 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20   as:.      **.  
1f470 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45 20      **   CREATE 
1f480 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a  TABLE t1(a, b);.
1f490 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
1f4a0 2a 20 54 68 65 6e 20 70 31 20 69 73 20 69 6e 74  * Then p1 is int
1f4b0 65 72 70 72 65 74 65 64 20 61 73 20 66 6f 6c 6c  erpreted as foll
1f4c0 6f 77 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ows:.      **.  
1f4d0 20 20 20 20 2a 2a 20 20 20 70 31 3d 3d 30 20 20      **   p1==0  
1f4e0 20 2d 3e 20 20 20 20 6f 6c 64 2e 72 6f 77 69 64   ->    old.rowid
1f4f0 20 20 20 20 20 70 31 3d 3d 33 20 20 20 2d 3e 20       p1==3   -> 
1f500 20 20 20 6e 65 77 2e 72 6f 77 69 64 0a 20 20 20     new.rowid.   
1f510 20 20 20 2a 2a 20 20 20 70 31 3d 3d 31 20 20 20     **   p1==1   
1f520 2d 3e 20 20 20 20 6f 6c 64 2e 61 20 20 20 20 20  ->    old.a     
1f530 20 20 20 20 70 31 3d 3d 34 20 20 20 2d 3e 20 20      p1==4   ->  
1f540 20 20 6e 65 77 2e 61 0a 20 20 20 20 20 20 2a 2a    new.a.      **
1f550 20 20 20 70 31 3d 3d 32 20 20 20 2d 3e 20 20 20     p1==2   ->   
1f560 20 6f 6c 64 2e 62 20 20 20 20 20 20 20 20 20 70   old.b         p
1f570 31 3d 3d 35 20 20 20 2d 3e 20 20 20 20 6e 65 77  1==5   ->    new
1f580 2e 62 20 20 20 20 20 20 20 0a 20 20 20 20 20 20  .b       .      
1f590 2a 2f 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a  */.      Table *
1f5a0 70 54 61 62 20 3d 20 70 45 78 70 72 2d 3e 70 54  pTab = pExpr->pT
1f5b0 61 62 3b 0a 20 20 20 20 20 20 69 6e 74 20 70 31  ab;.      int p1
1f5c0 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65   = pExpr->iTable
1f5d0 20 2a 20 28 70 54 61 62 2d 3e 6e 43 6f 6c 2b 31   * (pTab->nCol+1
1f5e0 29 20 2b 20 31 20 2b 20 70 45 78 70 72 2d 3e 69  ) + 1 + pExpr->i
1f5f0 43 6f 6c 75 6d 6e 3b 0a 0a 20 20 20 20 20 20 61  Column;..      a
1f600 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 69 54  ssert( pExpr->iT
1f610 61 62 6c 65 3d 3d 30 20 7c 7c 20 70 45 78 70 72  able==0 || pExpr
1f620 2d 3e 69 54 61 62 6c 65 3d 3d 31 20 29 3b 0a 20  ->iTable==1 );. 
1f630 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
1f640 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 2d 31 20  pr->iColumn>=-1 
1f650 26 26 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  && pExpr->iColum
1f660 6e 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a  n<pTab->nCol );.
1f670 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
1f680 61 62 2d 3e 69 50 4b 65 79 3c 30 20 7c 7c 20 70  ab->iPKey<0 || p
1f690 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70  Expr->iColumn!=p
1f6a0 54 61 62 2d 3e 69 50 4b 65 79 20 29 3b 0a 20 20  Tab->iPKey );.  
1f6b0 20 20 20 20 61 73 73 65 72 74 28 20 70 31 3e 3d      assert( p1>=
1f6c0 30 20 26 26 20 70 31 3c 28 70 54 61 62 2d 3e 6e  0 && p1<(pTab->n
1f6d0 43 6f 6c 2a 32 2b 32 29 20 29 3b 0a 0a 20 20 20  Col*2+2) );..   
1f6e0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1f6f0 64 4f 70 32 28 76 2c 20 4f 50 5f 50 61 72 61 6d  dOp2(v, OP_Param
1f700 2c 20 70 31 2c 20 74 61 72 67 65 74 29 3b 0a 20  , p1, target);. 
1f710 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
1f720 28 28 76 2c 20 22 25 73 2e 25 73 20 2d 3e 20 24  ((v, "%s.%s -> $
1f730 25 64 22 2c 0a 20 20 20 20 20 20 20 20 28 70 45  %d",.        (pE
1f740 78 70 72 2d 3e 69 54 61 62 6c 65 20 3f 20 22 6e  xpr->iTable ? "n
1f750 65 77 22 20 3a 20 22 6f 6c 64 22 29 2c 0a 20 20  ew" : "old"),.  
1f760 20 20 20 20 20 20 28 70 45 78 70 72 2d 3e 69 43        (pExpr->iC
1f770 6f 6c 75 6d 6e 3c 30 20 3f 20 22 72 6f 77 69 64  olumn<0 ? "rowid
1f780 22 20 3a 20 70 45 78 70 72 2d 3e 70 54 61 62 2d  " : pExpr->pTab-
1f790 3e 61 43 6f 6c 5b 70 45 78 70 72 2d 3e 69 43 6f  >aCol[pExpr->iCo
1f7a0 6c 75 6d 6e 5d 2e 7a 4e 61 6d 65 29 2c 0a 20 20  lumn].zName),.  
1f7b0 20 20 20 20 20 20 74 61 72 67 65 74 0a 20 20 20        target.   
1f7c0 20 20 20 29 29 3b 0a 0a 23 69 66 6e 64 65 66 20     ));..#ifndef 
1f7d0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41  SQLITE_OMIT_FLOA
1f7e0 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20 20  TING_POINT.     
1f7f0 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c 75 6d   /* If the colum
1f800 6e 20 68 61 73 20 52 45 41 4c 20 61 66 66 69 6e  n has REAL affin
1f810 69 74 79 2c 20 69 74 20 6d 61 79 20 63 75 72 72  ity, it may curr
1f820 65 6e 74 6c 79 20 62 65 20 73 74 6f 72 65 64 20  ently be stored 
1f830 61 73 20 61 6e 0a 20 20 20 20 20 20 2a 2a 20 69  as an.      ** i
1f840 6e 74 65 67 65 72 2e 20 55 73 65 20 4f 50 5f 52  nteger. Use OP_R
1f850 65 61 6c 41 66 66 69 6e 69 74 79 20 74 6f 20 6d  ealAffinity to m
1f860 61 6b 65 20 73 75 72 65 20 69 74 20 69 73 20 72  ake sure it is r
1f870 65 61 6c 6c 79 20 72 65 61 6c 2e 0a 20 20 20 20  eally real..    
1f880 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 45 56    **.      ** EV
1f890 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 36 30 39  IDENCE-OF: R-609
1f8a0 38 35 2d 35 37 36 36 32 20 53 51 4c 69 74 65 20  85-57662 SQLite 
1f8b0 77 69 6c 6c 20 63 6f 6e 76 65 72 74 20 74 68 65  will convert the
1f8c0 20 76 61 6c 75 65 20 62 61 63 6b 20 74 6f 0a 20   value back to. 
1f8d0 20 20 20 20 20 2a 2a 20 66 6c 6f 61 74 69 6e 67       ** floating
1f8e0 20 70 6f 69 6e 74 20 77 68 65 6e 20 65 78 74 72   point when extr
1f8f0 61 63 74 69 6e 67 20 69 74 20 66 72 6f 6d 20 74  acting it from t
1f900 68 65 20 72 65 63 6f 72 64 2e 20 20 2a 2f 0a 20  he record.  */. 
1f910 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
1f920 69 43 6f 6c 75 6d 6e 3e 3d 30 20 0a 20 20 20 20  iColumn>=0 .    
1f930 20 20 20 26 26 20 70 54 61 62 2d 3e 61 43 6f 6c     && pTab->aCol
1f940 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d  [pExpr->iColumn]
1f950 2e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54  .affinity==SQLIT
1f960 45 5f 41 46 46 5f 52 45 41 4c 0a 20 20 20 20 20  E_AFF_REAL.     
1f970 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
1f980 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
1f990 20 4f 50 5f 52 65 61 6c 41 66 66 69 6e 69 74 79   OP_RealAffinity
1f9a0 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
1f9b0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
1f9c0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
1f9d0 20 20 63 61 73 65 20 54 4b 5f 56 45 43 54 4f 52    case TK_VECTOR
1f9e0 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
1f9f0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
1fa00 2c 20 22 69 6e 76 61 6c 69 64 20 75 73 65 20 6f  , "invalid use o
1fa10 66 20 72 6f 77 20 76 61 6c 75 65 22 29 3b 0a 20  f row value");. 
1fa20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1fa30 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  }..    /*.    **
1fa40 20 46 6f 72 6d 20 41 3a 0a 20 20 20 20 2a 2a 20   Form A:.    ** 
1fa50 20 20 43 41 53 45 20 78 20 57 48 45 4e 20 65 31    CASE x WHEN e1
1fa60 20 54 48 45 4e 20 72 31 20 57 48 45 4e 20 65 32   THEN r1 WHEN e2
1fa70 20 54 48 45 4e 20 72 32 20 2e 2e 2e 20 57 48 45   THEN r2 ... WHE
1fa80 4e 20 65 4e 20 54 48 45 4e 20 72 4e 20 45 4c 53  N eN THEN rN ELS
1fa90 45 20 79 20 45 4e 44 0a 20 20 20 20 2a 2a 0a 20  E y END.    **. 
1faa0 20 20 20 2a 2a 20 46 6f 72 6d 20 42 3a 0a 20 20     ** Form B:.  
1fab0 20 20 2a 2a 20 20 20 43 41 53 45 20 57 48 45 4e    **   CASE WHEN
1fac0 20 65 31 20 54 48 45 4e 20 72 31 20 57 48 45 4e   e1 THEN r1 WHEN
1fad0 20 65 32 20 54 48 45 4e 20 72 32 20 2e 2e 2e 20   e2 THEN r2 ... 
1fae0 57 48 45 4e 20 65 4e 20 54 48 45 4e 20 72 4e 20  WHEN eN THEN rN 
1faf0 45 4c 53 45 20 79 20 45 4e 44 0a 20 20 20 20 2a  ELSE y END.    *
1fb00 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 6d 20 41 20  *.    ** Form A 
1fb10 69 73 20 63 61 6e 20 62 65 20 74 72 61 6e 73 66  is can be transf
1fb20 6f 72 6d 65 64 20 69 6e 74 6f 20 74 68 65 20 65  ormed into the e
1fb30 71 75 69 76 61 6c 65 6e 74 20 66 6f 72 6d 20 42  quivalent form B
1fb40 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20   as follows:.   
1fb50 20 2a 2a 20 20 20 43 41 53 45 20 57 48 45 4e 20   **   CASE WHEN 
1fb60 78 3d 65 31 20 54 48 45 4e 20 72 31 20 57 48 45  x=e1 THEN r1 WHE
1fb70 4e 20 78 3d 65 32 20 54 48 45 4e 20 72 32 20 2e  N x=e2 THEN r2 .
1fb80 2e 2e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  ...    **       
1fb90 20 57 48 45 4e 20 78 3d 65 4e 20 54 48 45 4e 20   WHEN x=eN THEN 
1fba0 72 4e 20 45 4c 53 45 20 79 20 45 4e 44 0a 20 20  rN ELSE y END.  
1fbb0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 58 20 28 69    **.    ** X (i
1fbc0 66 20 69 74 20 65 78 69 73 74 73 29 20 69 73 20  f it exists) is 
1fbd0 69 6e 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2e  in pExpr->pLeft.
1fbe0 0a 20 20 20 20 2a 2a 20 59 20 69 73 20 69 6e 20  .    ** Y is in 
1fbf0 74 68 65 20 6c 61 73 74 20 65 6c 65 6d 65 6e 74  the last element
1fc00 20 6f 66 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69   of pExpr->x.pLi
1fc10 73 74 20 69 66 20 70 45 78 70 72 2d 3e 78 2e 70  st if pExpr->x.p
1fc20 4c 69 73 74 2d 3e 6e 45 78 70 72 20 69 73 0a 20  List->nExpr is. 
1fc30 20 20 20 2a 2a 20 6f 64 64 2e 20 20 54 68 65 20     ** odd.  The 
1fc40 59 20 69 73 20 61 6c 73 6f 20 6f 70 74 69 6f 6e  Y is also option
1fc50 61 6c 2e 20 20 49 66 20 74 68 65 20 6e 75 6d 62  al.  If the numb
1fc60 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69  er of elements i
1fc70 6e 20 78 2e 70 4c 69 73 74 0a 20 20 20 20 2a 2a  n x.pList.    **
1fc80 20 69 73 20 65 76 65 6e 2c 20 74 68 65 6e 20 59   is even, then Y
1fc90 20 69 73 20 6f 6d 69 74 74 65 64 20 61 6e 64 20   is omitted and 
1fca0 74 68 65 20 22 6f 74 68 65 72 77 69 73 65 22 20  the "otherwise" 
1fcb0 72 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 0a  result is NULL..
1fcc0 20 20 20 20 2a 2a 20 45 69 20 69 73 20 69 6e 20      ** Ei is in 
1fcd0 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b  pExpr->pList->a[
1fce0 69 2a 32 5d 20 61 6e 64 20 52 69 20 69 73 20 70  i*2] and Ri is p
1fcf0 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69  Expr->pList->a[i
1fd00 2a 32 2b 31 5d 2e 0a 20 20 20 20 2a 2a 0a 20 20  *2+1]..    **.  
1fd10 20 20 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 20    ** The result 
1fd20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  of the expressio
1fd30 6e 20 69 73 20 74 68 65 20 52 69 20 66 6f 72 20  n is the Ri for 
1fd40 74 68 65 20 66 69 72 73 74 20 6d 61 74 63 68 69  the first matchi
1fd50 6e 67 20 45 69 2c 0a 20 20 20 20 2a 2a 20 6f 72  ng Ei,.    ** or
1fd60 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   if there is no 
1fd70 6d 61 74 63 68 69 6e 67 20 45 69 2c 20 74 68 65  matching Ei, the
1fd80 20 45 4c 53 45 20 74 65 72 6d 20 59 2c 20 6f 72   ELSE term Y, or
1fd90 20 69 66 20 74 68 65 72 65 20 69 73 0a 20 20 20   if there is.   
1fda0 20 2a 2a 20 6e 6f 20 45 4c 53 45 20 74 65 72 6d   ** no ELSE term
1fdb0 2c 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2f 0a 20  , NULL..    */. 
1fdc0 20 20 20 64 65 66 61 75 6c 74 3a 20 61 73 73 65     default: asse
1fdd0 72 74 28 20 6f 70 3d 3d 54 4b 5f 43 41 53 45 20  rt( op==TK_CASE 
1fde0 29 3b 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 65  ); {.      int e
1fdf0 6e 64 4c 61 62 65 6c 3b 20 20 20 20 20 20 20 20  ndLabel;        
1fe00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1fe10 47 4f 54 4f 20 6c 61 62 65 6c 20 66 6f 72 20 65  GOTO label for e
1fe20 6e 64 20 6f 66 20 43 41 53 45 20 73 74 6d 74 20  nd of CASE stmt 
1fe30 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 65 78  */.      int nex
1fe40 74 43 61 73 65 3b 20 20 20 20 20 20 20 20 20 20  tCase;          
1fe50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 4f             /* GO
1fe60 54 4f 20 6c 61 62 65 6c 20 66 6f 72 20 6e 65 78  TO label for nex
1fe70 74 20 57 48 45 4e 20 63 6c 61 75 73 65 20 2a 2f  t WHEN clause */
1fe80 0a 20 20 20 20 20 20 69 6e 74 20 6e 45 78 70 72  .      int nExpr
1fe90 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1fea0 20 20 20 20 20 20 20 20 20 2f 2a 20 32 78 20 6e           /* 2x n
1feb0 75 6d 62 65 72 20 6f 66 20 57 48 45 4e 20 74 65  umber of WHEN te
1fec0 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  rms */.      int
1fed0 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
1fee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1fef0 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
1ff00 2f 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74  /.      ExprList
1ff10 20 2a 70 45 4c 69 73 74 3b 20 20 20 20 20 20 20   *pEList;       
1ff20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73            /* Lis
1ff30 74 20 6f 66 20 57 48 45 4e 20 74 65 72 6d 73 20  t of WHEN terms 
1ff40 2a 2f 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  */.      struct 
1ff50 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61  ExprList_item *a
1ff60 4c 69 73 74 65 6c 65 6d 3b 20 20 2f 2a 20 41 72  Listelem;  /* Ar
1ff70 72 61 79 20 6f 66 20 57 48 45 4e 20 74 65 72 6d  ray of WHEN term
1ff80 73 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20  s */.      Expr 
1ff90 6f 70 43 6f 6d 70 61 72 65 3b 20 20 20 20 20 20  opCompare;      
1ffa0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ffb0 54 68 65 20 58 3d 3d 45 69 20 65 78 70 72 65 73  The X==Ei expres
1ffc0 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45 78  sion */.      Ex
1ffd0 70 72 20 2a 70 58 3b 20 20 20 20 20 20 20 20 20  pr *pX;         
1ffe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fff0 2f 2a 20 54 68 65 20 58 20 65 78 70 72 65 73 73  /* The X express
20000 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45 78 70  ion */.      Exp
20010 72 20 2a 70 54 65 73 74 20 3d 20 30 3b 20 20 20  r *pTest = 0;   
20020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20030 2a 20 58 3d 3d 45 69 20 28 66 6f 72 6d 20 41 29  * X==Ei (form A)
20040 20 6f 72 20 6a 75 73 74 20 45 69 20 28 66 6f 72   or just Ei (for
20050 6d 20 42 29 20 2a 2f 0a 20 20 20 20 20 20 56 56  m B) */.      VV
20060 41 5f 4f 4e 4c 59 28 20 69 6e 74 20 69 43 61 63  A_ONLY( int iCac
20070 68 65 4c 65 76 65 6c 20 3d 20 70 50 61 72 73 65  heLevel = pParse
20080 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 3b 20 29  ->iCacheLevel; )
20090 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ..      assert( 
200a0 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
200b0 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  (pExpr, EP_xIsSe
200c0 6c 65 63 74 29 20 26 26 20 70 45 78 70 72 2d 3e  lect) && pExpr->
200d0 78 2e 70 4c 69 73 74 20 29 3b 0a 20 20 20 20 20  x.pList );.     
200e0 20 61 73 73 65 72 74 28 70 45 78 70 72 2d 3e 78   assert(pExpr->x
200f0 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3e 20  .pList->nExpr > 
20100 30 29 3b 0a 20 20 20 20 20 20 70 45 4c 69 73 74  0);.      pEList
20110 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73   = pExpr->x.pLis
20120 74 3b 0a 20 20 20 20 20 20 61 4c 69 73 74 65 6c  t;.      aListel
20130 65 6d 20 3d 20 70 45 4c 69 73 74 2d 3e 61 3b 0a  em = pEList->a;.
20140 20 20 20 20 20 20 6e 45 78 70 72 20 3d 20 70 45        nExpr = pE
20150 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  List->nExpr;.   
20160 20 20 20 65 6e 64 4c 61 62 65 6c 20 3d 20 73 71     endLabel = sq
20170 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
20180 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 66 28  el(v);.      if(
20190 20 28 70 58 20 3d 20 70 45 78 70 72 2d 3e 70 4c   (pX = pExpr->pL
201a0 65 66 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  eft)!=0 ){.     
201b0 20 20 20 74 65 6d 70 58 20 3d 20 2a 70 58 3b 0a     tempX = *pX;.
201c0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
201d0 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  ( pX->op==TK_COL
201e0 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 65  UMN );.        e
201f0 78 70 72 54 6f 52 65 67 69 73 74 65 72 28 26 74  xprToRegister(&t
20200 65 6d 70 58 2c 20 73 71 6c 69 74 65 33 45 78 70  empX, sqlite3Exp
20210 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
20220 2c 20 70 58 2c 20 26 72 65 67 46 72 65 65 31 29  , pX, &regFree1)
20230 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
20240 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30  ase( regFree1==0
20250 20 29 3b 0a 20 20 20 20 20 20 20 20 6f 70 43 6f   );.        opCo
20260 6d 70 61 72 65 2e 6f 70 20 3d 20 54 4b 5f 45 51  mpare.op = TK_EQ
20270 3b 0a 20 20 20 20 20 20 20 20 6f 70 43 6f 6d 70  ;.        opComp
20280 61 72 65 2e 70 4c 65 66 74 20 3d 20 26 74 65 6d  are.pLeft = &tem
20290 70 58 3b 0a 20 20 20 20 20 20 20 20 70 54 65 73  pX;.        pTes
202a0 74 20 3d 20 26 6f 70 43 6f 6d 70 61 72 65 3b 0a  t = &opCompare;.
202b0 20 20 20 20 20 20 20 20 2f 2a 20 54 69 63 6b 65          /* Ticke
202c0 74 20 62 33 35 31 64 39 35 66 39 63 64 35 65 66  t b351d95f9cd5ef
202d0 31 37 65 39 64 39 64 62 61 65 31 38 66 35 63 61  17e9d9dbae18f5ca
202e0 38 36 31 31 31 39 30 30 30 31 3a 0a 20 20 20 20  8611190001:.    
202f0 20 20 20 20 2a 2a 20 54 68 65 20 76 61 6c 75 65      ** The value
20300 20 69 6e 20 72 65 67 46 72 65 65 31 20 6d 69 67   in regFree1 mig
20310 68 74 20 67 65 74 20 53 43 6f 70 79 2d 65 64 20  ht get SCopy-ed 
20320 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 20 72 65  into the file re
20330 73 75 6c 74 2e 0a 20 20 20 20 20 20 20 20 2a 2a  sult..        **
20340 20 53 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   So make sure th
20350 61 74 20 74 68 65 20 72 65 67 46 72 65 65 31 20  at the regFree1 
20360 72 65 67 69 73 74 65 72 20 69 73 20 6e 6f 74 20  register is not 
20370 72 65 75 73 65 64 20 66 6f 72 20 6f 74 68 65 72  reused for other
20380 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 75 72 70  .        ** purp
20390 6f 73 65 73 20 61 6e 64 20 70 6f 73 73 69 62 6c  oses and possibl
203a0 79 20 6f 76 65 72 77 72 69 74 74 65 6e 2e 20 20  y overwritten.  
203b0 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 67 46 72  */.        regFr
203c0 65 65 31 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ee1 = 0;.      }
203d0 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
203e0 69 3c 6e 45 78 70 72 2d 31 3b 20 69 3d 69 2b 32  i<nExpr-1; i=i+2
203f0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
20400 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28  e3ExprCachePush(
20410 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
20420 20 69 66 28 20 70 58 20 29 7b 0a 20 20 20 20 20   if( pX ){.     
20430 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65       assert( pTe
20440 73 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  st!=0 );.       
20450 20 20 20 6f 70 43 6f 6d 70 61 72 65 2e 70 52 69     opCompare.pRi
20460 67 68 74 20 3d 20 61 4c 69 73 74 65 6c 65 6d 5b  ght = aListelem[
20470 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  i].pExpr;.      
20480 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
20490 20 20 20 70 54 65 73 74 20 3d 20 61 4c 69 73 74     pTest = aList
204a0 65 6c 65 6d 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  elem[i].pExpr;. 
204b0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
204c0 20 6e 65 78 74 43 61 73 65 20 3d 20 73 71 6c 69   nextCase = sqli
204d0 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
204e0 28 76 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  (v);.        tes
204f0 74 63 61 73 65 28 20 70 54 65 73 74 2d 3e 6f 70  tcase( pTest->op
20500 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20  ==TK_COLUMN );. 
20510 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
20520 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
20530 2c 20 70 54 65 73 74 2c 20 6e 65 78 74 43 61 73  , pTest, nextCas
20540 65 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46  e, SQLITE_JUMPIF
20550 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 20 20 74  NULL);.        t
20560 65 73 74 63 61 73 65 28 20 61 4c 69 73 74 65 6c  estcase( aListel
20570 65 6d 5b 69 2b 31 5d 2e 70 45 78 70 72 2d 3e 6f  em[i+1].pExpr->o
20580 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a  p==TK_COLUMN );.
20590 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
205a0 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
205b0 61 4c 69 73 74 65 6c 65 6d 5b 69 2b 31 5d 2e 70  aListelem[i+1].p
205c0 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20  Expr, target);. 
205d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
205e0 62 65 47 6f 74 6f 28 76 2c 20 65 6e 64 4c 61 62  beGoto(v, endLab
205f0 65 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  el);.        sql
20600 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70  ite3ExprCachePop
20610 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
20620 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
20630 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6e 65 78  olveLabel(v, nex
20640 74 43 61 73 65 29 3b 0a 20 20 20 20 20 20 7d 0a  tCase);.      }.
20650 20 20 20 20 20 20 69 66 28 20 28 6e 45 78 70 72        if( (nExpr
20660 26 31 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  &1)!=0 ){.      
20670 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
20680 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a  hePush(pParse);.
20690 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
206a0 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
206b0 70 45 4c 69 73 74 2d 3e 61 5b 6e 45 78 70 72 2d  pEList->a[nExpr-
206c0 31 5d 2e 70 45 78 70 72 2c 20 74 61 72 67 65 74  1].pExpr, target
206d0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
206e0 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70  e3ExprCachePop(p
206f0 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 7d 65  Parse);.      }e
20700 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
20710 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
20720 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61  , OP_Null, 0, ta
20730 72 67 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  rget);.      }. 
20740 20 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d       assert( db-
20750 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c  >mallocFailed ||
20760 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20   pParse->nErr>0 
20770 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70  .           || p
20780 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76  Parse->iCacheLev
20790 65 6c 3d 3d 69 43 61 63 68 65 4c 65 76 65 6c 20  el==iCacheLevel 
207a0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
207b0 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
207c0 28 76 2c 20 65 6e 64 4c 61 62 65 6c 29 3b 0a 20  (v, endLabel);. 
207d0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
207e0 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
207f0 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a 20 20  _OMIT_TRIGGER.  
20800 20 20 63 61 73 65 20 54 4b 5f 52 41 49 53 45 3a    case TK_RAISE:
20810 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
20820 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79   pExpr->affinity
20830 3d 3d 4f 45 5f 52 6f 6c 6c 62 61 63 6b 20 0a 20  ==OE_Rollback . 
20840 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 45 78            || pEx
20850 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45  pr->affinity==OE
20860 5f 41 62 6f 72 74 0a 20 20 20 20 20 20 20 20 20  _Abort.         
20870 20 20 7c 7c 20 70 45 78 70 72 2d 3e 61 66 66 69    || pExpr->affi
20880 6e 69 74 79 3d 3d 4f 45 5f 46 61 69 6c 0a 20 20  nity==OE_Fail.  
20890 20 20 20 20 20 20 20 20 20 7c 7c 20 70 45 78 70           || pExp
208a0 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f  r->affinity==OE_
208b0 49 67 6e 6f 72 65 0a 20 20 20 20 20 20 29 3b 0a  Ignore.      );.
208c0 20 20 20 20 20 20 69 66 28 20 21 70 50 61 72 73        if( !pPars
208d0 65 2d 3e 70 54 72 69 67 67 65 72 54 61 62 20 29  e->pTriggerTab )
208e0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
208f0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
20900 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
20910 20 20 20 20 20 20 20 20 20 22 52 41 49 53 45 28           "RAISE(
20920 29 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 75 73  ) may only be us
20930 65 64 20 77 69 74 68 69 6e 20 61 20 74 72 69 67  ed within a trig
20940 67 65 72 2d 70 72 6f 67 72 61 6d 22 29 3b 0a 20  ger-program");. 
20950 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b         return 0;
20960 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
20970 66 28 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69  f( pExpr->affini
20980 74 79 3d 3d 4f 45 5f 41 62 6f 72 74 20 29 7b 0a  ty==OE_Abort ){.
20990 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d          sqlite3M
209a0 61 79 41 62 6f 72 74 28 70 50 61 72 73 65 29 3b  ayAbort(pParse);
209b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
209c0 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
209d0 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
209e0 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20  P_IntValue) );. 
209f0 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
20a00 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 49 67 6e  affinity==OE_Ign
20a10 6f 72 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ore ){.        s
20a20 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
20a30 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 76 2c  (.            v,
20a40 20 4f 50 5f 48 61 6c 74 2c 20 53 51 4c 49 54 45   OP_Halt, SQLITE
20a50 5f 4f 4b 2c 20 4f 45 5f 49 67 6e 6f 72 65 2c 20  _OK, OE_Ignore, 
20a60 30 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  0, pExpr->u.zTok
20a70 65 6e 2c 30 29 3b 0a 20 20 20 20 20 20 20 20 56  en,0);.        V
20a80 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
20a90 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
20aa0 20 20 20 20 20 73 71 6c 69 74 65 33 48 61 6c 74       sqlite3Halt
20ab0 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 72 73  Constraint(pPars
20ac0 65 2c 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  e, SQLITE_CONSTR
20ad0 41 49 4e 54 5f 54 52 49 47 47 45 52 2c 0a 20 20  AINT_TRIGGER,.  
20ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20af0 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
20b00 72 2d 3e 61 66 66 69 6e 69 74 79 2c 20 70 45 78  r->affinity, pEx
20b10 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30 2c  pr->u.zToken, 0,
20b20 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20   0);.      }..  
20b30 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
20b40 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 73 71  .#endif.  }.  sq
20b50 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
20b60 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46  Reg(pParse, regF
20b70 72 65 65 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  ree1);.  sqlite3
20b80 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
20b90 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 32 29  Parse, regFree2)
20ba0 3b 0a 20 20 72 65 74 75 72 6e 20 69 6e 52 65 67  ;.  return inReg
20bb0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 61 63 74 6f  ;.}../*.** Facto
20bc0 72 20 6f 75 74 20 74 68 65 20 63 6f 64 65 20 6f  r out the code o
20bd0 66 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72  f the given expr
20be0 65 73 73 69 6f 6e 20 74 6f 20 69 6e 69 74 69 61  ession to initia
20bf0 6c 69 7a 61 74 69 6f 6e 20 74 69 6d 65 2e 0a 2a  lization time..*
20c00 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
20c10 70 72 43 6f 64 65 41 74 49 6e 69 74 28 0a 20 20  prCodeAtInit(.  
20c20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
20c30 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
20c40 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a  text */.  Expr *
20c50 70 45 78 70 72 2c 20 20 20 20 20 20 2f 2a 20 54  pExpr,      /* T
20c60 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f  he expression to
20c70 20 63 6f 64 65 20 77 68 65 6e 20 74 68 65 20 56   code when the V
20c80 44 42 45 20 69 6e 69 74 69 61 6c 69 7a 65 73 20  DBE initializes 
20c90 2a 2f 0a 20 20 69 6e 74 20 72 65 67 44 65 73 74  */.  int regDest
20ca0 2c 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20  ,      /* Store 
20cb0 74 68 65 20 76 61 6c 75 65 20 69 6e 20 74 68 69  the value in thi
20cc0 73 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20  s register */.  
20cd0 75 38 20 72 65 75 73 61 62 6c 65 20 20 20 20 20  u8 reusable     
20ce0 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69    /* True if thi
20cf0 73 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  s expression is 
20d00 72 65 75 73 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20  reusable */.){. 
20d10 20 45 78 70 72 4c 69 73 74 20 2a 70 3b 0a 20 20   ExprList *p;.  
20d20 61 73 73 65 72 74 28 20 43 6f 6e 73 74 46 61 63  assert( ConstFac
20d30 74 6f 72 4f 6b 28 70 50 61 72 73 65 29 20 29 3b  torOk(pParse) );
20d40 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70  .  p = pParse->p
20d50 43 6f 6e 73 74 45 78 70 72 3b 0a 20 20 70 45 78  ConstExpr;.  pEx
20d60 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pr = sqlite3Expr
20d70 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  Dup(pParse->db, 
20d80 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 70 20 3d  pExpr, 0);.  p =
20d90 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
20da0 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70  Append(pParse, p
20db0 2c 20 70 45 78 70 72 29 3b 0a 20 20 69 66 28 20  , pExpr);.  if( 
20dc0 70 20 29 7b 0a 20 20 20 20 20 73 74 72 75 63 74  p ){.     struct
20dd0 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
20de0 70 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 70 2d  pItem = &p->a[p-
20df0 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20 20 20 20 20  >nExpr-1];.     
20e00 70 49 74 65 6d 2d 3e 75 2e 69 43 6f 6e 73 74 45  pItem->u.iConstE
20e10 78 70 72 52 65 67 20 3d 20 72 65 67 44 65 73 74  xprReg = regDest
20e20 3b 0a 20 20 20 20 20 70 49 74 65 6d 2d 3e 72 65  ;.     pItem->re
20e30 75 73 61 62 6c 65 20 3d 20 72 65 75 73 61 62 6c  usable = reusabl
20e40 65 3b 0a 20 20 7d 0a 20 20 70 50 61 72 73 65 2d  e;.  }.  pParse-
20e50 3e 70 43 6f 6e 73 74 45 78 70 72 20 3d 20 70 3b  >pConstExpr = p;
20e60 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
20e70 74 65 20 63 6f 64 65 20 74 6f 20 65 76 61 6c 75  te code to evalu
20e80 61 74 65 20 61 6e 20 65 78 70 72 65 73 73 69 6f  ate an expressio
20e90 6e 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20  n and store the 
20ea0 72 65 73 75 6c 74 73 0a 2a 2a 20 69 6e 74 6f 20  results.** into 
20eb0 61 20 72 65 67 69 73 74 65 72 2e 20 20 52 65 74  a register.  Ret
20ec0 75 72 6e 20 74 68 65 20 72 65 67 69 73 74 65 72  urn the register
20ed0 20 6e 75 6d 62 65 72 20 77 68 65 72 65 20 74 68   number where th
20ee0 65 20 72 65 73 75 6c 74 73 0a 2a 2a 20 61 72 65  e results.** are
20ef0 20 73 74 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49   stored..**.** I
20f00 66 20 74 68 65 20 72 65 67 69 73 74 65 72 20 69  f the register i
20f10 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 72 65  s a temporary re
20f20 67 69 73 74 65 72 20 74 68 61 74 20 63 61 6e 20  gister that can 
20f30 62 65 20 64 65 61 6c 6c 6f 63 61 74 65 64 2c 0a  be deallocated,.
20f40 2a 2a 20 74 68 65 6e 20 77 72 69 74 65 20 69 74  ** then write it
20f50 73 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20 2a 70  s number into *p
20f60 52 65 67 2e 20 20 49 66 20 74 68 65 20 72 65 73  Reg.  If the res
20f70 75 6c 74 20 72 65 67 69 73 74 65 72 20 69 73 20  ult register is 
20f80 6e 6f 74 0a 2a 2a 20 61 20 74 65 6d 70 6f 72 61  not.** a tempora
20f90 72 79 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 52  ry, then set *pR
20fa0 65 67 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a  eg to zero..**.*
20fb0 2a 20 49 66 20 70 45 78 70 72 20 69 73 20 61 20  * If pExpr is a 
20fc0 63 6f 6e 73 74 61 6e 74 2c 20 74 68 65 6e 20 74  constant, then t
20fd0 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68  his routine migh
20fe0 74 20 67 65 6e 65 72 61 74 65 20 74 68 69 73 0a  t generate this.
20ff0 2a 2a 20 63 6f 64 65 20 74 6f 20 66 69 6c 6c 20  ** code to fill 
21000 74 68 65 20 72 65 67 69 73 74 65 72 20 69 6e 20  the register in 
21010 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  the initializati
21020 6f 6e 20 73 65 63 74 69 6f 6e 20 6f 66 20 74 68  on section of th
21030 65 0a 2a 2a 20 56 44 42 45 20 70 72 6f 67 72 61  e.** VDBE progra
21040 6d 2c 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 66  m, in order to f
21050 61 63 74 6f 72 20 69 74 20 6f 75 74 20 6f 66 20  actor it out of 
21060 74 68 65 20 65 76 61 6c 75 61 74 69 6f 6e 20 6c  the evaluation l
21070 6f 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  oop..*/.int sqli
21080 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
21090 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
210a0 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20  xpr *pExpr, int 
210b0 2a 70 52 65 67 29 7b 0a 20 20 69 6e 74 20 72 32  *pReg){.  int r2
210c0 3b 0a 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69  ;.  pExpr = sqli
210d0 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61  te3ExprSkipColla
210e0 74 65 28 70 45 78 70 72 29 3b 0a 20 20 69 66 28  te(pExpr);.  if(
210f0 20 43 6f 6e 73 74 46 61 63 74 6f 72 4f 6b 28 70   ConstFactorOk(p
21100 50 61 72 73 65 29 0a 20 20 20 26 26 20 70 45 78  Parse).   && pEx
21110 70 72 2d 3e 6f 70 21 3d 54 4b 5f 52 45 47 49 53  pr->op!=TK_REGIS
21120 54 45 52 0a 20 20 20 26 26 20 73 71 6c 69 74 65  TER.   && sqlite
21130 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e  3ExprIsConstantN
21140 6f 74 4a 6f 69 6e 28 70 45 78 70 72 29 0a 20 20  otJoin(pExpr).  
21150 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20  ){.    ExprList 
21160 2a 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 43 6f  *p = pParse->pCo
21170 6e 73 74 45 78 70 72 3b 0a 20 20 20 20 69 6e 74  nstExpr;.    int
21180 20 69 3b 0a 20 20 20 20 2a 70 52 65 67 20 20 3d   i;.    *pReg  =
21190 20 30 3b 0a 20 20 20 20 69 66 28 20 70 20 29 7b   0;.    if( p ){
211a0 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78  .      struct Ex
211b0 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
211c0 65 6d 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 49  em;.      for(pI
211d0 74 65 6d 3d 70 2d 3e 61 2c 20 69 3d 70 2d 3e 6e  tem=p->a, i=p->n
211e0 45 78 70 72 3b 20 69 3e 30 3b 20 70 49 74 65 6d  Expr; i>0; pItem
211f0 2b 2b 2c 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20  ++, i--){.      
21200 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 72 65 75    if( pItem->reu
21210 73 61 62 6c 65 20 26 26 20 73 71 6c 69 74 65 33  sable && sqlite3
21220 45 78 70 72 43 6f 6d 70 61 72 65 28 70 49 74 65  ExprCompare(pIte
21230 6d 2d 3e 70 45 78 70 72 2c 70 45 78 70 72 2c 2d  m->pExpr,pExpr,-
21240 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  1)==0 ){.       
21250 20 20 20 72 65 74 75 72 6e 20 70 49 74 65 6d 2d     return pItem-
21260 3e 75 2e 69 43 6f 6e 73 74 45 78 70 72 52 65 67  >u.iConstExprReg
21270 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
21280 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 32    }.    }.    r2
21290 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
212a0 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  m;.    sqlite3Ex
212b0 70 72 43 6f 64 65 41 74 49 6e 69 74 28 70 50 61  prCodeAtInit(pPa
212c0 72 73 65 2c 20 70 45 78 70 72 2c 20 72 32 2c 20  rse, pExpr, r2, 
212d0 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  1);.  }else{.   
212e0 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65   int r1 = sqlite
212f0 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
21300 73 65 29 3b 0a 20 20 20 20 72 32 20 3d 20 73 71  se);.    r2 = sq
21310 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72  lite3ExprCodeTar
21320 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 78 70  get(pParse, pExp
21330 72 2c 20 72 31 29 3b 0a 20 20 20 20 69 66 28 20  r, r1);.    if( 
21340 72 32 3d 3d 72 31 20 29 7b 0a 20 20 20 20 20 20  r2==r1 ){.      
21350 2a 70 52 65 67 20 3d 20 72 31 3b 0a 20 20 20 20  *pReg = r1;.    
21360 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
21370 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
21380 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a  eg(pParse, r1);.
21390 20 20 20 20 20 20 2a 70 52 65 67 20 3d 20 30 3b        *pReg = 0;
213a0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
213b0 75 72 6e 20 72 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn r2;.}../*.**
213c0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
213d0 68 61 74 20 77 69 6c 6c 20 65 76 61 6c 75 61 74  hat will evaluat
213e0 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78  e expression pEx
213f0 70 72 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65  pr and store the
21400 0a 2a 2a 20 72 65 73 75 6c 74 73 20 69 6e 20 72  .** results in r
21410 65 67 69 73 74 65 72 20 74 61 72 67 65 74 2e 20  egister target. 
21420 20 54 68 65 20 72 65 73 75 6c 74 73 20 61 72 65   The results are
21430 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 61   guaranteed to a
21440 70 70 65 61 72 0a 2a 2a 20 69 6e 20 72 65 67 69  ppear.** in regi
21450 73 74 65 72 20 74 61 72 67 65 74 2e 0a 2a 2f 0a  ster target..*/.
21460 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
21470 43 6f 64 65 28 50 61 72 73 65 20 2a 70 50 61 72  Code(Parse *pPar
21480 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c  se, Expr *pExpr,
21490 20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a 20 20   int target){.  
214a0 69 6e 74 20 69 6e 52 65 67 3b 0a 0a 20 20 61 73  int inReg;..  as
214b0 73 65 72 74 28 20 74 61 72 67 65 74 3e 30 20 26  sert( target>0 &
214c0 26 20 74 61 72 67 65 74 3c 3d 70 50 61 72 73 65  & target<=pParse
214d0 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 69 66 28 20  ->nMem );.  if( 
214e0 70 45 78 70 72 20 26 26 20 70 45 78 70 72 2d 3e  pExpr && pExpr->
214f0 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20  op==TK_REGISTER 
21500 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
21510 62 65 41 64 64 4f 70 32 28 70 50 61 72 73 65 2d  beAddOp2(pParse-
21520 3e 70 56 64 62 65 2c 20 4f 50 5f 43 6f 70 79 2c  >pVdbe, OP_Copy,
21530 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
21540 74 61 72 67 65 74 29 3b 0a 20 20 7d 65 6c 73 65  target);.  }else
21550 7b 0a 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71  {.    inReg = sq
21560 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72  lite3ExprCodeTar
21570 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 78 70  get(pParse, pExp
21580 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  r, target);.    
21590 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
215a0 70 56 64 62 65 21 3d 30 20 7c 7c 20 70 50 61 72  pVdbe!=0 || pPar
215b0 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
215c0 69 6c 65 64 20 29 3b 0a 20 20 20 20 69 66 28 20  iled );.    if( 
215d0 69 6e 52 65 67 21 3d 74 61 72 67 65 74 20 26 26  inReg!=target &&
215e0 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 20 29   pParse->pVdbe )
215f0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
21600 64 62 65 41 64 64 4f 70 32 28 70 50 61 72 73 65  dbeAddOp2(pParse
21610 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 53 43 6f 70  ->pVdbe, OP_SCop
21620 79 2c 20 69 6e 52 65 67 2c 20 74 61 72 67 65 74  y, inReg, target
21630 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
21640 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 74 72 61  /*.** Make a tra
21650 6e 73 69 65 6e 74 20 63 6f 70 79 20 6f 66 20 65  nsient copy of e
21660 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20  xpression pExpr 
21670 61 6e 64 20 74 68 65 6e 20 63 6f 64 65 20 69 74  and then code it
21680 20 75 73 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65   using.** sqlite
21690 33 45 78 70 72 43 6f 64 65 28 29 2e 20 20 54 68  3ExprCode().  Th
216a0 69 73 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73  is routine works
216b0 20 6a 75 73 74 20 6c 69 6b 65 20 73 71 6c 69 74   just like sqlit
216c0 65 33 45 78 70 72 43 6f 64 65 28 29 0a 2a 2a 20  e3ExprCode().** 
216d0 65 78 63 65 70 74 20 74 68 61 74 20 74 68 65 20  except that the 
216e0 69 6e 70 75 74 20 65 78 70 72 65 73 73 69 6f 6e  input expression
216f0 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
21700 6f 20 62 65 20 75 6e 63 68 61 6e 67 65 64 2e 0a  o be unchanged..
21710 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
21720 78 70 72 43 6f 64 65 43 6f 70 79 28 50 61 72 73  xprCodeCopy(Pars
21730 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
21740 2a 70 45 78 70 72 2c 20 69 6e 74 20 74 61 72 67  *pExpr, int targ
21750 65 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  et){.  sqlite3 *
21760 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
21770 0a 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74  .  pExpr = sqlit
21780 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 45  e3ExprDup(db, pE
21790 78 70 72 2c 20 30 29 3b 0a 20 20 69 66 28 20 21  xpr, 0);.  if( !
217a0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
217b0 20 29 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   ) sqlite3ExprCo
217c0 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
217d0 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 73 71 6c  , target);.  sql
217e0 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
217f0 62 2c 20 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a  b, pExpr);.}../*
21800 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
21810 65 20 74 68 61 74 20 77 69 6c 6c 20 65 76 61 6c  e that will eval
21820 75 61 74 65 20 65 78 70 72 65 73 73 69 6f 6e 20  uate expression 
21830 70 45 78 70 72 20 61 6e 64 20 73 74 6f 72 65 20  pExpr and store 
21840 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 73 20 69  the.** results i
21850 6e 20 72 65 67 69 73 74 65 72 20 74 61 72 67 65  n register targe
21860 74 2e 20 20 54 68 65 20 72 65 73 75 6c 74 73 20  t.  The results 
21870 61 72 65 20 67 75 61 72 61 6e 74 65 65 64 20 74  are guaranteed t
21880 6f 20 61 70 70 65 61 72 0a 2a 2a 20 69 6e 20 72  o appear.** in r
21890 65 67 69 73 74 65 72 20 74 61 72 67 65 74 2e 20  egister target. 
218a0 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69   If the expressi
218b0 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74 2c 20  on is constant, 
218c0 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  then this routin
218d0 65 0a 2a 2a 20 6d 69 67 68 74 20 63 68 6f 6f 73  e.** might choos
218e0 65 20 74 6f 20 63 6f 64 65 20 74 68 65 20 65 78  e to code the ex
218f0 70 72 65 73 73 69 6f 6e 20 61 74 20 69 6e 69 74  pression at init
21900 69 61 6c 69 7a 61 74 69 6f 6e 20 74 69 6d 65 2e  ialization time.
21910 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
21920 45 78 70 72 43 6f 64 65 46 61 63 74 6f 72 61 62  ExprCodeFactorab
21930 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  le(Parse *pParse
21940 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69  , Expr *pExpr, i
21950 6e 74 20 74 61 72 67 65 74 29 7b 0a 20 20 69 66  nt target){.  if
21960 28 20 70 50 61 72 73 65 2d 3e 6f 6b 43 6f 6e 73  ( pParse->okCons
21970 74 46 61 63 74 6f 72 20 26 26 20 73 71 6c 69 74  tFactor && sqlit
21980 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
21990 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 73  (pExpr) ){.    s
219a0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 41 74  qlite3ExprCodeAt
219b0 49 6e 69 74 28 70 50 61 72 73 65 2c 20 70 45 78  Init(pParse, pEx
219c0 70 72 2c 20 74 61 72 67 65 74 2c 20 30 29 3b 0a  pr, target, 0);.
219d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
219e0 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
219f0 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67  rse, pExpr, targ
21a00 65 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  et);.  }.}../*.*
21a10 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
21a20 74 68 61 74 20 65 76 61 6c 75 61 74 65 73 20 74  that evaluates t
21a30 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73 73  he given express
21a40 69 6f 6e 20 61 6e 64 20 70 75 74 73 20 74 68 65  ion and puts the
21a50 20 72 65 73 75 6c 74 0a 2a 2a 20 69 6e 20 72 65   result.** in re
21a60 67 69 73 74 65 72 20 74 61 72 67 65 74 2e 0a 2a  gister target..*
21a70 2a 0a 2a 2a 20 41 6c 73 6f 20 6d 61 6b 65 20 61  *.** Also make a
21a80 20 63 6f 70 79 20 6f 66 20 74 68 65 20 65 78 70   copy of the exp
21a90 72 65 73 73 69 6f 6e 20 72 65 73 75 6c 74 73 20  ression results 
21aa0 69 6e 74 6f 20 61 6e 6f 74 68 65 72 20 22 63 61  into another "ca
21ab0 63 68 65 22 20 72 65 67 69 73 74 65 72 0a 2a 2a  che" register.**
21ac0 20 61 6e 64 20 6d 6f 64 69 66 79 20 74 68 65 20   and modify the 
21ad0 65 78 70 72 65 73 73 69 6f 6e 20 73 6f 20 74 68  expression so th
21ae0 61 74 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65  at the next time
21af0 20 69 74 20 69 73 20 65 76 61 6c 75 61 74 65 64   it is evaluated
21b00 2c 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20  ,.** the result 
21b10 69 73 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  is a copy of the
21b20 20 63 61 63 68 65 20 72 65 67 69 73 74 65 72 2e   cache register.
21b30 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
21b40 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 20  ine is used for 
21b50 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74  expressions that
21b60 20 61 72 65 20 75 73 65 64 20 6d 75 6c 74 69 70   are used multip
21b70 6c 65 20 0a 2a 2a 20 74 69 6d 65 73 2e 20 20 54  le .** times.  T
21b80 68 65 79 20 61 72 65 20 65 76 61 6c 75 61 74 65  hey are evaluate
21b90 64 20 6f 6e 63 65 20 61 6e 64 20 74 68 65 20 72  d once and the r
21ba0 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 65 78  esults of the ex
21bb0 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 61 72 65 20  pression.** are 
21bc0 72 65 75 73 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  reused..*/.void 
21bd0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 41  sqlite3ExprCodeA
21be0 6e 64 43 61 63 68 65 28 50 61 72 73 65 20 2a 70  ndCache(Parse *p
21bf0 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
21c00 70 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29 7b  pr, int target){
21c10 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
21c20 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
21c30 74 20 69 4d 65 6d 3b 0a 0a 20 20 61 73 73 65 72  t iMem;..  asser
21c40 74 28 20 74 61 72 67 65 74 3e 30 20 29 3b 0a 20  t( target>0 );. 
21c50 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
21c60 6f 70 21 3d 54 4b 5f 52 45 47 49 53 54 45 52 20  op!=TK_REGISTER 
21c70 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
21c80 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78  Code(pParse, pEx
21c90 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 69  pr, target);.  i
21ca0 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  Mem = ++pParse->
21cb0 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33 56  nMem;.  sqlite3V
21cc0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
21cd0 43 6f 70 79 2c 20 74 61 72 67 65 74 2c 20 69 4d  Copy, target, iM
21ce0 65 6d 29 3b 0a 20 20 65 78 70 72 54 6f 52 65 67  em);.  exprToReg
21cf0 69 73 74 65 72 28 70 45 78 70 72 2c 20 69 4d 65  ister(pExpr, iMe
21d00 6d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  m);.}../*.** Gen
21d10 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
21d20 70 75 73 68 65 73 20 74 68 65 20 76 61 6c 75 65  pushes the value
21d30 20 6f 66 20 65 76 65 72 79 20 65 6c 65 6d 65 6e   of every elemen
21d40 74 20 6f 66 20 74 68 65 20 67 69 76 65 6e 0a 2a  t of the given.*
21d50 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  * expression lis
21d60 74 20 69 6e 74 6f 20 61 20 73 65 71 75 65 6e 63  t into a sequenc
21d70 65 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 62  e of registers b
21d80 65 67 69 6e 6e 69 6e 67 20 61 74 20 74 61 72 67  eginning at targ
21d90 65 74 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  et..**.** Return
21da0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
21db0 6c 65 6d 65 6e 74 73 20 65 76 61 6c 75 61 74 65  lements evaluate
21dc0 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c  d..**.** The SQL
21dd0 49 54 45 5f 45 43 45 4c 5f 44 55 50 20 66 6c 61  ITE_ECEL_DUP fla
21de0 67 20 70 72 65 76 65 6e 74 73 20 74 68 65 20 61  g prevents the a
21df0 72 67 75 6d 65 6e 74 73 20 66 72 6f 6d 20 62 65  rguments from be
21e00 69 6e 67 0a 2a 2a 20 66 69 6c 6c 65 64 20 75 73  ing.** filled us
21e10 69 6e 67 20 4f 50 5f 53 43 6f 70 79 2e 20 20 4f  ing OP_SCopy.  O
21e20 50 5f 43 6f 70 79 20 6d 75 73 74 20 62 65 20 75  P_Copy must be u
21e30 73 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a  sed instead..**.
21e40 2a 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 45 43  ** The SQLITE_EC
21e50 45 4c 5f 46 41 43 54 4f 52 20 61 72 67 75 6d 65  EL_FACTOR argume
21e60 6e 74 20 61 6c 6c 6f 77 73 20 63 6f 6e 73 74 61  nt allows consta
21e70 6e 74 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20  nt arguments to 
21e80 62 65 0a 2a 2a 20 66 61 63 74 6f 72 65 64 20 6f  be.** factored o
21e90 75 74 20 69 6e 74 6f 20 69 6e 69 74 69 61 6c 69  ut into initiali
21ea0 7a 61 74 69 6f 6e 20 63 6f 64 65 2e 0a 2a 2a 0a  zation code..**.
21eb0 2a 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 45 43  ** The SQLITE_EC
21ec0 45 4c 5f 52 45 46 20 66 6c 61 67 20 6d 65 61 6e  EL_REF flag mean
21ed0 73 20 74 68 61 74 20 65 78 70 72 65 73 73 69 6f  s that expressio
21ee0 6e 73 20 69 6e 20 74 68 65 20 6c 69 73 74 20 77  ns in the list w
21ef0 69 74 68 0a 2a 2a 20 45 78 70 72 4c 69 73 74 2e  ith.** ExprList.
21f00 61 5b 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79  a[].u.x.iOrderBy
21f10 43 6f 6c 3e 30 20 68 61 76 65 20 61 6c 72 65 61  Col>0 have alrea
21f20 64 79 20 62 65 65 6e 20 65 76 61 6c 75 61 74 65  dy been evaluate
21f30 64 20 61 6e 64 20 73 74 6f 72 65 64 0a 2a 2a 20  d and stored.** 
21f40 69 6e 20 72 65 67 69 73 74 65 72 73 20 61 74 20  in registers at 
21f50 73 72 63 52 65 67 2c 20 61 6e 64 20 73 6f 20 74  srcReg, and so t
21f60 68 65 20 76 61 6c 75 65 20 63 61 6e 20 62 65 20  he value can be 
21f70 63 6f 70 69 65 64 20 66 72 6f 6d 20 74 68 65 72  copied from ther
21f80 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
21f90 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73  3ExprCodeExprLis
21fa0 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
21fb0 73 65 2c 20 20 20 20 20 2f 2a 20 50 61 72 73 69  se,     /* Parsi
21fc0 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
21fd0 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c  ExprList *pList,
21fe0 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73     /* The expres
21ff0 73 69 6f 6e 20 6c 69 73 74 20 74 6f 20 62 65 20  sion list to be 
22000 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 74  coded */.  int t
22010 61 72 67 65 74 2c 20 20 20 20 20 20 20 20 2f 2a  arget,        /*
22020 20 57 68 65 72 65 20 74 6f 20 77 72 69 74 65 20   Where to write 
22030 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74  results */.  int
22040 20 73 72 63 52 65 67 2c 20 20 20 20 20 20 20 20   srcReg,        
22050 2f 2a 20 53 6f 75 72 63 65 20 72 65 67 69 73 74  /* Source regist
22060 65 72 73 20 69 66 20 53 51 4c 49 54 45 5f 45 43  ers if SQLITE_EC
22070 45 4c 5f 52 45 46 20 2a 2f 0a 20 20 75 38 20 66  EL_REF */.  u8 f
22080 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20 2f  lags           /
22090 2a 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 2a 20  * SQLITE_ECEL_* 
220a0 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 73 74  flags */.){.  st
220b0 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
220c0 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74  em *pItem;.  int
220d0 20 69 2c 20 6a 2c 20 6e 3b 0a 20 20 75 38 20 63   i, j, n;.  u8 c
220e0 6f 70 79 4f 70 20 3d 20 28 66 6c 61 67 73 20 26  opyOp = (flags &
220f0 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50   SQLITE_ECEL_DUP
22100 29 20 3f 20 4f 50 5f 43 6f 70 79 20 3a 20 4f 50  ) ? OP_Copy : OP
22110 5f 53 43 6f 70 79 3b 0a 20 20 56 64 62 65 20 2a  _SCopy;.  Vdbe *
22120 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
22130 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69  e;.  assert( pLi
22140 73 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  st!=0 );.  asser
22150 74 28 20 74 61 72 67 65 74 3e 30 20 29 3b 0a 20  t( target>0 );. 
22160 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
22170 3e 70 56 64 62 65 21 3d 30 20 29 3b 20 20 2f 2a  >pVdbe!=0 );  /*
22180 20 4e 65 76 65 72 20 67 65 74 73 20 74 68 69 73   Never gets this
22190 20 66 61 72 20 6f 74 68 65 72 77 69 73 65 20 2a   far otherwise *
221a0 2f 0a 20 20 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e  /.  n = pList->n
221b0 45 78 70 72 3b 0a 20 20 69 66 28 20 21 43 6f 6e  Expr;.  if( !Con
221c0 73 74 46 61 63 74 6f 72 4f 6b 28 70 50 61 72 73  stFactorOk(pPars
221d0 65 29 20 29 20 66 6c 61 67 73 20 26 3d 20 7e 53  e) ) flags &= ~S
221e0 51 4c 49 54 45 5f 45 43 45 4c 5f 46 41 43 54 4f  QLITE_ECEL_FACTO
221f0 52 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d 70  R;.  for(pItem=p
22200 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c  List->a, i=0; i<
22210 6e 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  n; i++, pItem++)
22220 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70  {.    Expr *pExp
22230 72 20 3d 20 70 49 74 65 6d 2d 3e 70 45 78 70 72  r = pItem->pExpr
22240 3b 0a 20 20 20 20 69 66 28 20 28 66 6c 61 67 73  ;.    if( (flags
22250 20 26 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 52   & SQLITE_ECEL_R
22260 45 46 29 21 3d 30 20 26 26 20 28 6a 20 3d 20 70  EF)!=0 && (j = p
22270 4c 69 73 74 2d 3e 61 5b 69 5d 2e 75 2e 78 2e 69  List->a[i].u.x.i
22280 4f 72 64 65 72 42 79 43 6f 6c 29 3e 30 20 29 7b  OrderByCol)>0 ){
22290 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
222a0 62 65 41 64 64 4f 70 32 28 76 2c 20 63 6f 70 79  beAddOp2(v, copy
222b0 4f 70 2c 20 6a 2b 73 72 63 52 65 67 2d 31 2c 20  Op, j+srcReg-1, 
222c0 74 61 72 67 65 74 2b 69 29 3b 0a 20 20 20 20 7d  target+i);.    }
222d0 65 6c 73 65 20 69 66 28 20 28 66 6c 61 67 73 20  else if( (flags 
222e0 26 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 46 41  & SQLITE_ECEL_FA
222f0 43 54 4f 52 29 21 3d 30 20 26 26 20 73 71 6c 69  CTOR)!=0 && sqli
22300 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
22310 74 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20  t(pExpr) ){.    
22320 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
22330 65 41 74 49 6e 69 74 28 70 50 61 72 73 65 2c 20  eAtInit(pParse, 
22340 70 45 78 70 72 2c 20 74 61 72 67 65 74 2b 69 2c  pExpr, target+i,
22350 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   0);.    }else{.
22360 20 20 20 20 20 20 69 6e 74 20 69 6e 52 65 67 20        int inReg 
22370 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
22380 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20  eTarget(pParse, 
22390 70 45 78 70 72 2c 20 74 61 72 67 65 74 2b 69 29  pExpr, target+i)
223a0 3b 0a 20 20 20 20 20 20 69 66 28 20 69 6e 52 65  ;.      if( inRe
223b0 67 21 3d 74 61 72 67 65 74 2b 69 20 29 7b 0a 20  g!=target+i ){. 
223c0 20 20 20 20 20 20 20 56 64 62 65 4f 70 20 2a 70         VdbeOp *p
223d0 4f 70 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  Op;.        if( 
223e0 63 6f 70 79 4f 70 3d 3d 4f 50 5f 43 6f 70 79 0a  copyOp==OP_Copy.
223f0 20 20 20 20 20 20 20 20 20 26 26 20 28 70 4f 70           && (pOp
22400 3d 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f  =sqlite3VdbeGetO
22410 70 28 76 2c 20 2d 31 29 29 2d 3e 6f 70 63 6f 64  p(v, -1))->opcod
22420 65 3d 3d 4f 50 5f 43 6f 70 79 0a 20 20 20 20 20  e==OP_Copy.     
22430 20 20 20 20 26 26 20 70 4f 70 2d 3e 70 31 2b 70      && pOp->p1+p
22440 4f 70 2d 3e 70 33 2b 31 3d 3d 69 6e 52 65 67 0a  Op->p3+1==inReg.
22450 20 20 20 20 20 20 20 20 20 26 26 20 70 4f 70 2d           && pOp-
22460 3e 70 32 2b 70 4f 70 2d 3e 70 33 2b 31 3d 3d 74  >p2+pOp->p3+1==t
22470 61 72 67 65 74 2b 69 0a 20 20 20 20 20 20 20 20  arget+i.        
22480 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70  ){.          pOp
22490 2d 3e 70 33 2b 2b 3b 0a 20 20 20 20 20 20 20 20  ->p3++;.        
224a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
224b0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
224c0 70 32 28 76 2c 20 63 6f 70 79 4f 70 2c 20 69 6e  p2(v, copyOp, in
224d0 52 65 67 2c 20 74 61 72 67 65 74 2b 69 29 3b 0a  Reg, target+i);.
224e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
224f0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
22500 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn n;.}../*.**
22510 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
22520 6f 72 20 61 20 42 45 54 57 45 45 4e 20 6f 70 65  or a BETWEEN ope
22530 72 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  rator..**.**    
22540 78 20 42 45 54 57 45 45 4e 20 79 20 41 4e 44 20  x BETWEEN y AND 
22550 7a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 62 6f 76  z.**.** The abov
22560 65 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20  e is equivalent 
22570 74 6f 20 0a 2a 2a 0a 2a 2a 20 20 20 20 78 3e 3d  to .**.**    x>=
22580 79 20 41 4e 44 20 78 3c 3d 7a 0a 2a 2a 0a 2a 2a  y AND x<=z.**.**
22590 20 43 6f 64 65 20 69 74 20 61 73 20 73 75 63 68   Code it as such
225a0 2c 20 74 61 6b 69 6e 67 20 63 61 72 65 20 74 6f  , taking care to
225b0 20 64 6f 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 73   do the common s
225c0 75 62 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20  ubexpression.** 
225d0 65 6c 69 6d 69 6e 61 74 69 6f 6e 20 6f 66 20 78  elimination of x
225e0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
225f0 20 65 78 70 72 43 6f 64 65 42 65 74 77 65 65 6e   exprCodeBetween
22600 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
22610 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67  e,    /* Parsing
22620 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61   and code genera
22630 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  ting context */.
22640 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20    Expr *pExpr,  
22650 20 20 20 20 2f 2a 20 54 68 65 20 42 45 54 57 45      /* The BETWE
22660 45 4e 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f  EN expression */
22670 0a 20 20 69 6e 74 20 64 65 73 74 2c 20 20 20 20  .  int dest,    
22680 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72       /* Jump her
22690 65 20 69 66 20 74 68 65 20 6a 75 6d 70 20 69 73  e if the jump is
226a0 20 74 61 6b 65 6e 20 2a 2f 0a 20 20 76 6f 69 64   taken */.  void
226b0 20 28 2a 78 4a 75 6d 70 49 66 29 28 50 61 72 73   (*xJumpIf)(Pars
226c0 65 2a 2c 45 78 70 72 2a 2c 69 6e 74 2c 69 6e 74  e*,Expr*,int,int
226d0 29 2c 0a 20 20 69 6e 74 20 6a 75 6d 70 49 66 4e  ),.  int jumpIfN
226e0 75 6c 6c 20 20 20 20 2f 2a 20 54 61 6b 65 20 74  ull    /* Take t
226f0 68 65 20 6a 75 6d 70 20 69 66 20 74 68 65 20 42  he jump if the B
22700 45 54 57 45 45 4e 20 69 73 20 4e 55 4c 4c 20 2a  ETWEEN is NULL *
22710 2f 0a 29 7b 0a 20 20 45 78 70 72 20 65 78 70 72  /.){.  Expr expr
22720 41 6e 64 3b 20 20 20 20 20 2f 2a 20 54 68 65 20  And;     /* The 
22730 41 4e 44 20 6f 70 65 72 61 74 6f 72 20 69 6e 20  AND operator in 
22740 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 20 20   x>=y AND x<=z  
22750 2a 2f 0a 20 20 45 78 70 72 20 63 6f 6d 70 4c 65  */.  Expr compLe
22760 66 74 3b 20 20 20 20 2f 2a 20 54 68 65 20 20 78  ft;    /* The  x
22770 3e 3d 79 20 20 74 65 72 6d 20 2a 2f 0a 20 20 45  >=y  term */.  E
22780 78 70 72 20 63 6f 6d 70 52 69 67 68 74 3b 20 20  xpr compRight;  
22790 20 2f 2a 20 54 68 65 20 20 78 3c 3d 7a 20 20 74   /* The  x<=z  t
227a0 65 72 6d 20 2a 2f 0a 20 20 45 78 70 72 20 65 78  erm */.  Expr ex
227b0 70 72 58 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  prX;       /* Th
227c0 65 20 20 78 20 20 73 75 62 65 78 70 72 65 73 73  e  x  subexpress
227d0 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  ion */.  int reg
227e0 46 72 65 65 31 20 3d 20 30 3b 20 2f 2a 20 54 65  Free1 = 0; /* Te
227f0 6d 70 6f 72 61 72 79 20 75 73 65 20 72 65 67 69  mporary use regi
22800 73 74 65 72 20 2a 2f 0a 0a 20 20 6d 65 6d 73 65  ster */..  memse
22810 74 28 26 63 6f 6d 70 4c 65 66 74 2c 20 30 2c 20  t(&compLeft, 0, 
22820 73 69 7a 65 6f 66 28 45 78 70 72 29 29 3b 0a 20  sizeof(Expr));. 
22830 20 6d 65 6d 73 65 74 28 26 63 6f 6d 70 52 69 67   memset(&compRig
22840 68 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 45 78  ht, 0, sizeof(Ex
22850 70 72 29 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26  pr));.  memset(&
22860 65 78 70 72 41 6e 64 2c 20 30 2c 20 73 69 7a 65  exprAnd, 0, size
22870 6f 66 28 45 78 70 72 29 29 3b 0a 0a 20 20 61 73  of(Expr));..  as
22880 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
22890 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
228a0 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20  _xIsSelect) );. 
228b0 20 65 78 70 72 58 20 3d 20 2a 70 45 78 70 72 2d   exprX = *pExpr-
228c0 3e 70 4c 65 66 74 3b 0a 20 20 65 78 70 72 41 6e  >pLeft;.  exprAn
228d0 64 2e 6f 70 20 3d 20 54 4b 5f 41 4e 44 3b 0a 20  d.op = TK_AND;. 
228e0 20 65 78 70 72 41 6e 64 2e 70 4c 65 66 74 20 3d   exprAnd.pLeft =
228f0 20 26 63 6f 6d 70 4c 65 66 74 3b 0a 20 20 65 78   &compLeft;.  ex
22900 70 72 41 6e 64 2e 70 52 69 67 68 74 20 3d 20 26  prAnd.pRight = &
22910 63 6f 6d 70 52 69 67 68 74 3b 0a 20 20 63 6f 6d  compRight;.  com
22920 70 4c 65 66 74 2e 6f 70 20 3d 20 54 4b 5f 47 45  pLeft.op = TK_GE
22930 3b 0a 20 20 63 6f 6d 70 4c 65 66 74 2e 70 4c 65  ;.  compLeft.pLe
22940 66 74 20 3d 20 26 65 78 70 72 58 3b 0a 20 20 63  ft = &exprX;.  c
22950 6f 6d 70 4c 65 66 74 2e 70 52 69 67 68 74 20 3d  ompLeft.pRight =
22960 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d   pExpr->x.pList-
22970 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 63  >a[0].pExpr;.  c
22980 6f 6d 70 52 69 67 68 74 2e 6f 70 20 3d 20 54 4b  ompRight.op = TK
22990 5f 4c 45 3b 0a 20 20 63 6f 6d 70 52 69 67 68 74  _LE;.  compRight
229a0 2e 70 4c 65 66 74 20 3d 20 26 65 78 70 72 58 3b  .pLeft = &exprX;
229b0 0a 20 20 63 6f 6d 70 52 69 67 68 74 2e 70 52 69  .  compRight.pRi
229c0 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  ght = pExpr->x.p
229d0 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72  List->a[1].pExpr
229e0 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 45  ;.  if( sqlite3E
229f0 78 70 72 49 73 56 65 63 74 6f 72 28 26 65 78 70  xprIsVector(&exp
22a00 72 58 29 3d 3d 30 20 29 7b 0a 20 20 20 20 65 78  rX)==0 ){.    ex
22a10 70 72 54 6f 52 65 67 69 73 74 65 72 28 26 65 78  prToRegister(&ex
22a20 70 72 58 2c 20 73 71 6c 69 74 65 33 45 78 70 72  prX, sqlite3Expr
22a30 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
22a40 20 26 65 78 70 72 58 2c 20 26 72 65 67 46 72 65   &exprX, &regFre
22a50 65 31 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  e1));.  }.  if( 
22a60 78 4a 75 6d 70 49 66 20 29 7b 0a 20 20 20 20 78  xJumpIf ){.    x
22a70 4a 75 6d 70 49 66 28 70 50 61 72 73 65 2c 20 26  JumpIf(pParse, &
22a80 65 78 70 72 41 6e 64 2c 20 64 65 73 74 2c 20 6a  exprAnd, dest, j
22a90 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 7d 65  umpIfNull);.  }e
22aa0 6c 73 65 7b 0a 20 20 20 20 65 78 70 72 58 2e 66  lse{.    exprX.f
22ab0 6c 61 67 73 20 7c 3d 20 45 50 5f 46 72 6f 6d 4a  lags |= EP_FromJ
22ac0 6f 69 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  oin;.    sqlite3
22ad0 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70  ExprCodeTarget(p
22ae0 50 61 72 73 65 2c 20 26 65 78 70 72 41 6e 64 2c  Parse, &exprAnd,
22af0 20 64 65 73 74 29 3b 0a 20 20 7d 0a 20 20 73 71   dest);.  }.  sq
22b00 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
22b10 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46  Reg(pParse, regF
22b20 72 65 65 31 29 3b 0a 0a 20 20 2f 2a 20 45 6e 73  ree1);..  /* Ens
22b30 75 72 65 20 61 64 65 71 75 61 74 65 20 74 65 73  ure adequate tes
22b40 74 20 63 6f 76 65 72 61 67 65 20 2a 2f 0a 20 20  t coverage */.  
22b50 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
22b60 54 72 75 65 3d 3d 30 20 26 26 20 6a 75 6d 70 49  True==0 && jumpI
22b70 66 4e 75 6c 6c 3d 3d 30 20 26 26 20 72 65 67 46  fNull==0 && regF
22b80 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73  ree1==0 );.  tes
22b90 74 63 61 73 65 28 20 6a 75 6d 70 49 66 54 72 75  tcase( jumpIfTru
22ba0 65 3d 3d 30 20 26 26 20 6a 75 6d 70 49 66 4e 75  e==0 && jumpIfNu
22bb0 6c 6c 3d 3d 30 20 26 26 20 72 65 67 46 72 65 65  ll==0 && regFree
22bc0 31 21 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61  1!=0 );.  testca
22bd0 73 65 28 20 6a 75 6d 70 49 66 54 72 75 65 3d 3d  se( jumpIfTrue==
22be0 30 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21  0 && jumpIfNull!
22bf0 3d 30 20 26 26 20 72 65 67 46 72 65 65 31 3d 3d  =0 && regFree1==
22c00 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  0 );.  testcase(
22c10 20 6a 75 6d 70 49 66 54 72 75 65 3d 3d 30 20 26   jumpIfTrue==0 &
22c20 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 20  & jumpIfNull!=0 
22c30 26 26 20 72 65 67 46 72 65 65 31 21 3d 30 20 29  && regFree1!=0 )
22c40 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6a 75  ;.  testcase( ju
22c50 6d 70 49 66 54 72 75 65 21 3d 30 20 26 26 20 6a  mpIfTrue!=0 && j
22c60 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26 20  umpIfNull==0 && 
22c70 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
22c80 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
22c90 66 54 72 75 65 21 3d 30 20 26 26 20 6a 75 6d 70  fTrue!=0 && jump
22ca0 49 66 4e 75 6c 6c 3d 3d 30 20 26 26 20 72 65 67  IfNull==0 && reg
22cb0 46 72 65 65 31 21 3d 30 20 29 3b 0a 20 20 74 65  Free1!=0 );.  te
22cc0 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 54 72  stcase( jumpIfTr
22cd0 75 65 21 3d 30 20 26 26 20 6a 75 6d 70 49 66 4e  ue!=0 && jumpIfN
22ce0 75 6c 6c 21 3d 30 20 26 26 20 72 65 67 46 72 65  ull!=0 && regFre
22cf0 65 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74 63  e1==0 );.  testc
22d00 61 73 65 28 20 6a 75 6d 70 49 66 54 72 75 65 21  ase( jumpIfTrue!
22d10 3d 30 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c  =0 && jumpIfNull
22d20 21 3d 30 20 26 26 20 72 65 67 46 72 65 65 31 21  !=0 && regFree1!
22d30 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  =0 );.}../*.** G
22d40 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
22d50 20 61 20 62 6f 6f 6c 65 61 6e 20 65 78 70 72 65   a boolean expre
22d60 73 73 69 6f 6e 20 73 75 63 68 20 74 68 61 74 20  ssion such that 
22d70 61 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 0a 2a  a jump is made.*
22d80 2a 20 74 6f 20 74 68 65 20 6c 61 62 65 6c 20 22  * to the label "
22d90 64 65 73 74 22 20 69 66 20 74 68 65 20 65 78 70  dest" if the exp
22da0 72 65 73 73 69 6f 6e 20 69 73 20 74 72 75 65 20  ression is true 
22db0 62 75 74 20 65 78 65 63 75 74 69 6f 6e 0a 2a 2a  but execution.**
22dc0 20 63 6f 6e 74 69 6e 75 65 73 20 73 74 72 61 69   continues strai
22dd0 67 68 74 20 74 68 72 75 20 69 66 20 74 68 65 20  ght thru if the 
22de0 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66 61  expression is fa
22df0 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  lse..**.** If th
22e00 65 20 65 78 70 72 65 73 73 69 6f 6e 20 65 76 61  e expression eva
22e10 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c 20 28  luates to NULL (
22e20 6e 65 69 74 68 65 72 20 74 72 75 65 20 6e 6f 72  neither true nor
22e30 20 66 61 6c 73 65 29 2c 20 74 68 65 6e 0a 2a 2a   false), then.**
22e40 20 74 61 6b 65 20 74 68 65 20 6a 75 6d 70 20 69   take the jump i
22e50 66 20 74 68 65 20 6a 75 6d 70 49 66 4e 75 6c 6c  f the jumpIfNull
22e60 20 66 6c 61 67 20 69 73 20 53 51 4c 49 54 45 5f   flag is SQLITE_
22e70 4a 55 4d 50 49 46 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  JUMPIFNULL..**.*
22e80 2a 20 54 68 69 73 20 63 6f 64 65 20 64 65 70 65  * This code depe
22e90 6e 64 73 20 6f 6e 20 74 68 65 20 66 61 63 74 20  nds on the fact 
22ea0 74 68 61 74 20 63 65 72 74 61 69 6e 20 74 6f 6b  that certain tok
22eb0 65 6e 20 76 61 6c 75 65 73 20 28 65 78 3a 20 54  en values (ex: T
22ec0 4b 5f 45 51 29 0a 2a 2a 20 61 72 65 20 74 68 65  K_EQ).** are the
22ed0 20 73 61 6d 65 20 61 73 20 6f 70 63 6f 64 65 20   same as opcode 
22ee0 76 61 6c 75 65 73 20 28 65 78 3a 20 4f 50 5f 45  values (ex: OP_E
22ef0 71 29 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e  q) that implemen
22f00 74 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  t the correspond
22f10 69 6e 67 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e  ing.** operation
22f20 2e 20 20 53 70 65 63 69 61 6c 20 63 6f 6d 6d 65  .  Special comme
22f30 6e 74 73 20 69 6e 20 76 64 62 65 2e 63 20 61 6e  nts in vdbe.c an
22f40 64 20 74 68 65 20 6d 6b 6f 70 63 6f 64 65 68 2e  d the mkopcodeh.
22f50 61 77 6b 20 73 63 72 69 70 74 20 69 6e 0a 2a 2a  awk script in.**
22f60 20 74 68 65 20 6d 61 6b 65 20 70 72 6f 63 65 73   the make proces
22f70 73 20 63 61 75 73 65 20 74 68 65 73 65 20 76 61  s cause these va
22f80 6c 75 65 73 20 74 6f 20 61 6c 69 67 6e 2e 20 20  lues to align.  
22f90 41 73 73 65 72 74 28 29 73 20 69 6e 20 74 68 65  Assert()s in the
22fa0 20 63 6f 64 65 0a 2a 2a 20 62 65 6c 6f 77 20 76   code.** below v
22fb0 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20 6e  erify that the n
22fc0 75 6d 62 65 72 73 20 61 72 65 20 61 6c 69 67 6e  umbers are align
22fd0 65 64 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f  ed correctly..*/
22fe0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
22ff0 72 49 66 54 72 75 65 28 50 61 72 73 65 20 2a 70  rIfTrue(Parse *p
23000 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
23010 70 72 2c 20 69 6e 74 20 64 65 73 74 2c 20 69 6e  pr, int dest, in
23020 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20  t jumpIfNull){. 
23030 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
23040 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
23050 6f 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65  op = 0;.  int re
23060 67 46 72 65 65 31 20 3d 20 30 3b 0a 20 20 69 6e  gFree1 = 0;.  in
23070 74 20 72 65 67 46 72 65 65 32 20 3d 20 30 3b 0a  t regFree2 = 0;.
23080 20 20 69 6e 74 20 72 31 2c 20 72 32 3b 0a 0a 20    int r1, r2;.. 
23090 20 61 73 73 65 72 74 28 20 6a 75 6d 70 49 66 4e   assert( jumpIfN
230a0 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4a 55 4d 50  ull==SQLITE_JUMP
230b0 49 46 4e 55 4c 4c 20 7c 7c 20 6a 75 6d 70 49 66  IFNULL || jumpIf
230c0 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 69 66 28  Null==0 );.  if(
230d0 20 4e 45 56 45 52 28 76 3d 3d 30 29 20 29 20 20   NEVER(v==0) )  
230e0 20 20 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 45     return;  /* E
230f0 78 69 73 74 65 6e 63 65 20 6f 66 20 56 44 42 45  xistence of VDBE
23100 20 63 68 65 63 6b 65 64 20 62 79 20 63 61 6c 6c   checked by call
23110 65 72 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45  er */.  if( NEVE
23120 52 28 70 45 78 70 72 3d 3d 30 29 20 29 20 72 65  R(pExpr==0) ) re
23130 74 75 72 6e 3b 20 20 2f 2a 20 4e 6f 20 77 61 79  turn;  /* No way
23140 20 74 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e   this can happen
23150 20 2a 2f 0a 20 20 6f 70 20 3d 20 70 45 78 70 72   */.  op = pExpr
23160 2d 3e 6f 70 3b 0a 20 20 73 77 69 74 63 68 28 20  ->op;.  switch( 
23170 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
23180 4b 5f 41 4e 44 3a 20 7b 0a 20 20 20 20 20 20 69  K_AND: {.      i
23190 6e 74 20 64 32 20 3d 20 73 71 6c 69 74 65 33 56  nt d2 = sqlite3V
231a0 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
231b0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
231c0 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
231d0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
231e0 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
231f0 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
23200 20 64 32 2c 6a 75 6d 70 49 66 4e 75 6c 6c 5e 53   d2,jumpIfNull^S
23210 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
23220 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
23230 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50  ExprCachePush(pP
23240 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  arse);.      sql
23250 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70  ite3ExprIfTrue(p
23260 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
23270 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70  ight, dest, jump
23280 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73  IfNull);.      s
23290 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
232a0 65 4c 61 62 65 6c 28 76 2c 20 64 32 29 3b 0a 20  eLabel(v, d2);. 
232b0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
232c0 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 29  CachePop(pParse)
232d0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
232e0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
232f0 5f 4f 52 3a 20 7b 0a 20 20 20 20 20 20 74 65 73  _OR: {.      tes
23300 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c  tcase( jumpIfNul
23310 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71  l==0 );.      sq
23320 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28  lite3ExprIfTrue(
23330 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
23340 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70  Left, dest, jump
23350 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73  IfNull);.      s
23360 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
23370 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20  ush(pParse);.   
23380 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
23390 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78  True(pParse, pEx
233a0 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74  pr->pRight, dest
233b0 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
233c0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
233d0 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 29  CachePop(pParse)
233e0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
233f0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
23400 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 74 65  _NOT: {.      te
23410 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75  stcase( jumpIfNu
23420 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73  ll==0 );.      s
23430 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
23440 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
23450 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75  >pLeft, dest, ju
23460 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
23470 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
23480 20 20 63 61 73 65 20 54 4b 5f 49 53 3a 0a 20 20    case TK_IS:.  
23490 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a    case TK_ISNOT:
234a0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
234b0 20 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20 20   op==TK_IS );.  
234c0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
234d0 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20 20  ==TK_ISNOT );.  
234e0 20 20 20 20 6f 70 20 3d 20 28 6f 70 3d 3d 54 4b      op = (op==TK
234f0 5f 49 53 29 20 3f 20 54 4b 5f 45 51 20 3a 20 54  _IS) ? TK_EQ : T
23500 4b 5f 4e 45 3b 0a 20 20 20 20 20 20 6a 75 6d 70  K_NE;.      jump
23510 49 66 4e 75 6c 6c 20 3d 20 53 51 4c 49 54 45 5f  IfNull = SQLITE_
23520 4e 55 4c 4c 45 51 3b 0a 20 20 20 20 20 20 2f 2a  NULLEQ;.      /*
23530 20 46 61 6c 6c 20 74 68 72 75 20 2a 2f 0a 20 20   Fall thru */.  
23540 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20    case TK_LT:.  
23550 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20    case TK_LE:.  
23560 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20    case TK_GT:.  
23570 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20    case TK_GE:.  
23580 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20    case TK_NE:.  
23590 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a    case TK_EQ: {.
235a0 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
235b0 33 45 78 70 72 49 73 56 65 63 74 6f 72 28 70 45  3ExprIsVector(pE
235c0 78 70 72 2d 3e 70 4c 65 66 74 29 20 29 20 67 6f  xpr->pLeft) ) go
235d0 74 6f 20 64 65 66 61 75 6c 74 5f 65 78 70 72 3b  to default_expr;
235e0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
235f0 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
23600 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  ;.      r1 = sql
23610 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
23620 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
23630 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31  pLeft, &regFree1
23640 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71  );.      r2 = sq
23650 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
23660 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
23670 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46 72 65  >pRight, &regFre
23680 65 32 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43  e2);.      codeC
23690 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70  ompare(pParse, p
236a0 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78  Expr->pLeft, pEx
236b0 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a  pr->pRight, op,.
236c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
236d0 20 20 72 31 2c 20 72 32 2c 20 64 65 73 74 2c 20    r1, r2, dest, 
236e0 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
236f0 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4c 54 3d     assert(TK_LT=
23700 3d 4f 50 5f 4c 74 29 3b 20 74 65 73 74 63 61 73  =OP_Lt); testcas
23710 65 28 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 20 56 64  e(op==OP_Lt); Vd
23720 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f  beCoverageIf(v,o
23730 70 3d 3d 4f 50 5f 4c 74 29 3b 0a 20 20 20 20 20  p==OP_Lt);.     
23740 20 61 73 73 65 72 74 28 54 4b 5f 4c 45 3d 3d 4f   assert(TK_LE==O
23750 50 5f 4c 65 29 3b 20 74 65 73 74 63 61 73 65 28  P_Le); testcase(
23760 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 20 56 64 62 65  op==OP_Le); Vdbe
23770 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d  CoverageIf(v,op=
23780 3d 4f 50 5f 4c 65 29 3b 0a 20 20 20 20 20 20 61  =OP_Le);.      a
23790 73 73 65 72 74 28 54 4b 5f 47 54 3d 3d 4f 50 5f  ssert(TK_GT==OP_
237a0 47 74 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70  Gt); testcase(op
237b0 3d 3d 4f 50 5f 47 74 29 3b 20 56 64 62 65 43 6f  ==OP_Gt); VdbeCo
237c0 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f  verageIf(v,op==O
237d0 50 5f 47 74 29 3b 0a 20 20 20 20 20 20 61 73 73  P_Gt);.      ass
237e0 65 72 74 28 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65  ert(TK_GE==OP_Ge
237f0 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d  ); testcase(op==
23800 4f 50 5f 47 65 29 3b 20 56 64 62 65 43 6f 76 65  OP_Ge); VdbeCove
23810 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f  rageIf(v,op==OP_
23820 47 65 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Ge);.      asser
23830 74 28 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71 29 3b  t(TK_EQ==OP_Eq);
23840 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50   testcase(op==OP
23850 5f 45 71 29 3b 0a 20 20 20 20 20 20 56 64 62 65  _Eq);.      Vdbe
23860 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70  CoverageIf(v, op
23870 3d 3d 4f 50 5f 45 71 20 26 26 20 6a 75 6d 70 49  ==OP_Eq && jumpI
23880 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4e 55  fNull==SQLITE_NU
23890 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 56 64 62  LLEQ);.      Vdb
238a0 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f  eCoverageIf(v, o
238b0 70 3d 3d 4f 50 5f 45 71 20 26 26 20 6a 75 6d 70  p==OP_Eq && jump
238c0 49 66 4e 75 6c 6c 21 3d 53 51 4c 49 54 45 5f 4e  IfNull!=SQLITE_N
238d0 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 61 73  ULLEQ);.      as
238e0 73 65 72 74 28 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e  sert(TK_NE==OP_N
238f0 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d  e); testcase(op=
23900 3d 4f 50 5f 4e 65 29 3b 0a 20 20 20 20 20 20 56  =OP_Ne);.      V
23910 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
23920 20 6f 70 3d 3d 4f 50 5f 4e 65 20 26 26 20 6a 75   op==OP_Ne && ju
23930 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45  mpIfNull==SQLITE
23940 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20  _NULLEQ);.      
23950 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
23960 2c 20 6f 70 3d 3d 4f 50 5f 4e 65 20 26 26 20 6a  , op==OP_Ne && j
23970 75 6d 70 49 66 4e 75 6c 6c 21 3d 53 51 4c 49 54  umpIfNull!=SQLIT
23980 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20  E_NULLEQ);.     
23990 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
239a0 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee1==0 );.      
239b0 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
239c0 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62  e2==0 );.      b
239d0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
239e0 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a  case TK_ISNULL:.
239f0 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e      case TK_NOTN
23a00 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  ULL: {.      ass
23a10 65 72 74 28 20 54 4b 5f 49 53 4e 55 4c 4c 3d 3d  ert( TK_ISNULL==
23a20 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 20 20 20 74  OP_IsNull );   t
23a30 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
23a40 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20  ISNULL );.      
23a50 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54 4e 55  assert( TK_NOTNU
23a60 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29  LL==OP_NotNull )
23a70 3b 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d  ; testcase( op==
23a80 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 0a 20 20  TK_NOTNULL );.  
23a90 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
23aa0 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
23ab0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
23ac0 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20  t, &regFree1);. 
23ad0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
23ae0 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20 72 31  AddOp2(v, op, r1
23af0 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 56  , dest);.      V
23b00 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
23b10 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 29 3b   op==TK_ISNULL);
23b20 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
23b30 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f  ageIf(v, op==TK_
23b40 4e 4f 54 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20  NOTNULL);.      
23b50 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
23b60 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62  e1==0 );.      b
23b70 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
23b80 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a  case TK_BETWEEN:
23b90 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   {.      testcas
23ba0 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  e( jumpIfNull==0
23bb0 20 29 3b 0a 20 20 20 20 20 20 65 78 70 72 43 6f   );.      exprCo
23bc0 64 65 42 65 74 77 65 65 6e 28 70 50 61 72 73 65  deBetween(pParse
23bd0 2c 20 70 45 78 70 72 2c 20 64 65 73 74 2c 20 73  , pExpr, dest, s
23be0 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65  qlite3ExprIfTrue
23bf0 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
23c00 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
23c10 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
23c20 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
23c30 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b     case TK_IN: {
23c40 0a 20 20 20 20 20 20 69 6e 74 20 64 65 73 74 49  .      int destI
23c50 66 46 61 6c 73 65 20 3d 20 73 71 6c 69 74 65 33  fFalse = sqlite3
23c60 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
23c70 3b 0a 20 20 20 20 20 20 69 6e 74 20 64 65 73 74  ;.      int dest
23c80 49 66 4e 75 6c 6c 20 3d 20 6a 75 6d 70 49 66 4e  IfNull = jumpIfN
23c90 75 6c 6c 20 3f 20 64 65 73 74 20 3a 20 64 65 73  ull ? dest : des
23ca0 74 49 66 46 61 6c 73 65 3b 0a 20 20 20 20 20 20  tIfFalse;.      
23cb0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49  sqlite3ExprCodeI
23cc0 4e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  N(pParse, pExpr,
23cd0 20 64 65 73 74 49 66 46 61 6c 73 65 2c 20 64 65   destIfFalse, de
23ce0 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  stIfNull);.     
23cf0 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f   sqlite3VdbeGoto
23d00 28 76 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20  (v, dest);.     
23d10 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
23d20 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 65 73 74  lveLabel(v, dest
23d30 49 66 46 61 6c 73 65 29 3b 0a 20 20 20 20 20 20  IfFalse);.      
23d40 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
23d50 64 69 66 0a 20 20 20 20 64 65 66 61 75 6c 74 3a  dif.    default:
23d60 20 7b 0a 20 20 20 20 64 65 66 61 75 6c 74 5f 65   {.    default_e
23d70 78 70 72 3a 0a 20 20 20 20 20 20 69 66 28 20 65  xpr:.      if( e
23d80 78 70 72 41 6c 77 61 79 73 54 72 75 65 28 70 45  xprAlwaysTrue(pE
23d90 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  xpr) ){.        
23da0 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28  sqlite3VdbeGoto(
23db0 76 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20  v, dest);.      
23dc0 7d 65 6c 73 65 20 69 66 28 20 65 78 70 72 41 6c  }else if( exprAl
23dd0 77 61 79 73 46 61 6c 73 65 28 70 45 78 70 72 29  waysFalse(pExpr)
23de0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e   ){.        /* N
23df0 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20 20 20 7d 65  o-op */.      }e
23e00 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 31 20  lse{.        r1 
23e10 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
23e20 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
23e30 78 70 72 2c 20 26 72 65 67 46 72 65 65 31 29 3b  xpr, &regFree1);
23e40 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
23e50 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
23e60 5f 49 66 2c 20 72 31 2c 20 64 65 73 74 2c 20 6a  _If, r1, dest, j
23e70 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 29 3b 0a 20  umpIfNull!=0);. 
23e80 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
23e90 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
23ea0 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
23eb0 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  e1==0 );.       
23ec0 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
23ed0 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  fNull==0 );.    
23ee0 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
23ef0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
23f00 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
23f10 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72  eg(pParse, regFr
23f20 65 65 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 52  ee1);.  sqlite3R
23f30 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
23f40 61 72 73 65 2c 20 72 65 67 46 72 65 65 32 29 3b  arse, regFree2);
23f50 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65    .}../*.** Gene
23f60 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20  rate code for a 
23f70 62 6f 6f 6c 65 61 6e 20 65 78 70 72 65 73 73 69  boolean expressi
23f80 6f 6e 20 73 75 63 68 20 74 68 61 74 20 61 20 6a  on such that a j
23f90 75 6d 70 20 69 73 20 6d 61 64 65 0a 2a 2a 20 74  ump is made.** t
23fa0 6f 20 74 68 65 20 6c 61 62 65 6c 20 22 64 65 73  o the label "des
23fb0 74 22 20 69 66 20 74 68 65 20 65 78 70 72 65 73  t" if the expres
23fc0 73 69 6f 6e 20 69 73 20 66 61 6c 73 65 20 62 75  sion is false bu
23fd0 74 20 65 78 65 63 75 74 69 6f 6e 0a 2a 2a 20 63  t execution.** c
23fe0 6f 6e 74 69 6e 75 65 73 20 73 74 72 61 69 67 68  ontinues straigh
23ff0 74 20 74 68 72 75 20 69 66 20 74 68 65 20 65 78  t thru if the ex
24000 70 72 65 73 73 69 6f 6e 20 69 73 20 74 72 75 65  pression is true
24010 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65  ..**.** If the e
24020 78 70 72 65 73 73 69 6f 6e 20 65 76 61 6c 75 61  xpression evalua
24030 74 65 73 20 74 6f 20 4e 55 4c 4c 20 28 6e 65 69  tes to NULL (nei
24040 74 68 65 72 20 74 72 75 65 20 6e 6f 72 20 66 61  ther true nor fa
24050 6c 73 65 29 20 74 68 65 6e 0a 2a 2a 20 6a 75 6d  lse) then.** jum
24060 70 20 69 66 20 6a 75 6d 70 49 66 4e 75 6c 6c 20  p if jumpIfNull 
24070 69 73 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46  is SQLITE_JUMPIF
24080 4e 55 4c 4c 20 6f 72 20 66 61 6c 6c 20 74 68 72  NULL or fall thr
24090 6f 75 67 68 20 69 66 20 6a 75 6d 70 49 66 4e 75  ough if jumpIfNu
240a0 6c 6c 0a 2a 2a 20 69 73 20 30 2e 0a 2a 2f 0a 76  ll.** is 0..*/.v
240b0 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 49  oid sqlite3ExprI
240c0 66 46 61 6c 73 65 28 50 61 72 73 65 20 2a 70 50  fFalse(Parse *pP
240d0 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
240e0 72 2c 20 69 6e 74 20 64 65 73 74 2c 20 69 6e 74  r, int dest, int
240f0 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20   jumpIfNull){.  
24100 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
24110 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 6f  ->pVdbe;.  int o
24120 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 67  p = 0;.  int reg
24130 46 72 65 65 31 20 3d 20 30 3b 0a 20 20 69 6e 74  Free1 = 0;.  int
24140 20 72 65 67 46 72 65 65 32 20 3d 20 30 3b 0a 20   regFree2 = 0;. 
24150 20 69 6e 74 20 72 31 2c 20 72 32 3b 0a 0a 20 20   int r1, r2;..  
24160 61 73 73 65 72 74 28 20 6a 75 6d 70 49 66 4e 75  assert( jumpIfNu
24170 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4a 55 4d 50 49  ll==SQLITE_JUMPI
24180 46 4e 55 4c 4c 20 7c 7c 20 6a 75 6d 70 49 66 4e  FNULL || jumpIfN
24190 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  ull==0 );.  if( 
241a0 4e 45 56 45 52 28 76 3d 3d 30 29 20 29 20 72 65  NEVER(v==0) ) re
241b0 74 75 72 6e 3b 20 2f 2a 20 45 78 69 73 74 65 6e  turn; /* Existen
241c0 63 65 20 6f 66 20 56 44 42 45 20 63 68 65 63 6b  ce of VDBE check
241d0 65 64 20 62 79 20 63 61 6c 6c 65 72 20 2a 2f 0a  ed by caller */.
241e0 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29    if( pExpr==0 )
241f0 20 20 20 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f      return;..  /
24200 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20 70  * The value of p
24210 45 78 70 72 2d 3e 6f 70 20 61 6e 64 20 6f 70 20  Expr->op and op 
24220 61 72 65 20 72 65 6c 61 74 65 64 20 61 73 20 66  are related as f
24230 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a  ollows:.  **.  *
24240 2a 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f  *       pExpr->o
24250 70 20 20 20 20 20 20 20 20 20 20 20 20 6f 70 0a  p            op.
24260 20 20 2a 2a 20 20 20 20 20 20 20 2d 2d 2d 2d 2d    **       -----
24270 2d 2d 2d 2d 20 20 20 20 20 20 20 20 20 20 2d 2d  ----          --
24280 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 20 2a 2a 20 20 20  --------.  **   
24290 20 20 20 20 54 4b 5f 49 53 4e 55 4c 4c 20 20 20      TK_ISNULL   
242a0 20 20 20 20 20 20 20 4f 50 5f 4e 6f 74 4e 75 6c         OP_NotNul
242b0 6c 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f  l.  **       TK_
242c0 4e 4f 54 4e 55 4c 4c 20 20 20 20 20 20 20 20 20  NOTNULL         
242d0 4f 50 5f 49 73 4e 75 6c 6c 0a 20 20 2a 2a 20 20  OP_IsNull.  **  
242e0 20 20 20 20 20 54 4b 5f 4e 45 20 20 20 20 20 20       TK_NE      
242f0 20 20 20 20 20 20 20 20 4f 50 5f 45 71 0a 20 20          OP_Eq.  
24300 2a 2a 20 20 20 20 20 20 20 54 4b 5f 45 51 20 20  **       TK_EQ  
24310 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4e              OP_N
24320 65 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f  e.  **       TK_
24330 47 54 20 20 20 20 20 20 20 20 20 20 20 20 20 20  GT              
24340 4f 50 5f 4c 65 0a 20 20 2a 2a 20 20 20 20 20 20  OP_Le.  **      
24350 20 54 4b 5f 4c 45 20 20 20 20 20 20 20 20 20 20   TK_LE          
24360 20 20 20 20 4f 50 5f 47 74 0a 20 20 2a 2a 20 20      OP_Gt.  **  
24370 20 20 20 20 20 54 4b 5f 47 45 20 20 20 20 20 20       TK_GE      
24380 20 20 20 20 20 20 20 20 4f 50 5f 4c 74 0a 20 20          OP_Lt.  
24390 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4c 54 20 20  **       TK_LT  
243a0 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 47              OP_G
243b0 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46 6f 72 20  e.  **.  ** For 
243c0 6f 74 68 65 72 20 76 61 6c 75 65 73 20 6f 66 20  other values of 
243d0 70 45 78 70 72 2d 3e 6f 70 2c 20 6f 70 20 69 73  pExpr->op, op is
243e0 20 75 6e 64 65 66 69 6e 65 64 20 61 6e 64 20 75   undefined and u
243f0 6e 75 73 65 64 2e 0a 20 20 2a 2a 20 54 68 65 20  nused..  ** The 
24400 76 61 6c 75 65 20 6f 66 20 54 4b 5f 20 61 6e 64  value of TK_ and
24410 20 4f 50 5f 20 63 6f 6e 73 74 61 6e 74 73 20 61   OP_ constants a
24420 72 65 20 61 72 72 61 6e 67 65 64 20 73 75 63 68  re arranged such
24430 20 74 68 61 74 20 77 65 0a 20 20 2a 2a 20 63 61   that we.  ** ca
24440 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 20 6d 61  n compute the ma
24450 70 70 69 6e 67 20 61 62 6f 76 65 20 75 73 69 6e  pping above usin
24460 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  g the following 
24470 65 78 70 72 65 73 73 69 6f 6e 2e 0a 20 20 2a 2a  expression..  **
24480 20 41 73 73 65 72 74 28 29 73 20 76 65 72 69 66   Assert()s verif
24490 79 20 74 68 61 74 20 74 68 65 20 63 6f 6d 70 75  y that the compu
244a0 74 61 74 69 6f 6e 20 69 73 20 63 6f 72 72 65 63  tation is correc
244b0 74 2e 0a 20 20 2a 2f 0a 20 20 6f 70 20 3d 20 28  t..  */.  op = (
244c0 28 70 45 78 70 72 2d 3e 6f 70 2b 28 54 4b 5f 49  (pExpr->op+(TK_I
244d0 53 4e 55 4c 4c 26 31 29 29 5e 31 29 2d 28 54 4b  SNULL&1))^1)-(TK
244e0 5f 49 53 4e 55 4c 4c 26 31 29 3b 0a 0a 20 20 2f  _ISNULL&1);..  /
244f0 2a 20 56 65 72 69 66 79 20 63 6f 72 72 65 63 74  * Verify correct
24500 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 54 4b   alignment of TK
24510 5f 20 61 6e 64 20 4f 50 5f 20 63 6f 6e 73 74 61  _ and OP_ consta
24520 6e 74 73 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  nts.  */.  asser
24530 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  t( pExpr->op!=TK
24540 5f 49 53 4e 55 4c 4c 20 7c 7c 20 6f 70 3d 3d 4f  _ISNULL || op==O
24550 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 0a 20 20 61  P_NotNull );.  a
24560 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
24570 21 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 7c 7c 20  !=TK_NOTNULL || 
24580 6f 70 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b  op==OP_IsNull );
24590 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
245a0 2d 3e 6f 70 21 3d 54 4b 5f 4e 45 20 7c 7c 20 6f  ->op!=TK_NE || o
245b0 70 3d 3d 4f 50 5f 45 71 20 29 3b 0a 20 20 61 73  p==OP_Eq );.  as
245c0 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21  sert( pExpr->op!
245d0 3d 54 4b 5f 45 51 20 7c 7c 20 6f 70 3d 3d 4f 50  =TK_EQ || op==OP
245e0 5f 4e 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _Ne );.  assert(
245f0 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4c   pExpr->op!=TK_L
24600 54 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 65 20 29  T || op==OP_Ge )
24610 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
24620 72 2d 3e 6f 70 21 3d 54 4b 5f 4c 45 20 7c 7c 20  r->op!=TK_LE || 
24630 6f 70 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20 20 61  op==OP_Gt );.  a
24640 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
24650 21 3d 54 4b 5f 47 54 20 7c 7c 20 6f 70 3d 3d 4f  !=TK_GT || op==O
24660 50 5f 4c 65 20 29 3b 0a 20 20 61 73 73 65 72 74  P_Le );.  assert
24670 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
24680 47 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c 74 20  GE || op==OP_Lt 
24690 29 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45  );..  switch( pE
246a0 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63  xpr->op ){.    c
246b0 61 73 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a 20 20  ase TK_AND: {.  
246c0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75      testcase( ju
246d0 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
246e0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
246f0 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
24700 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65  pExpr->pLeft, de
24710 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
24720 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
24730 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72  prCachePush(pPar
24740 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  se);.      sqlit
24750 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
24760 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69  arse, pExpr->pRi
24770 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49  ght, dest, jumpI
24780 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71  fNull);.      sq
24790 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f  lite3ExprCachePo
247a0 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  p(pParse);.     
247b0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
247c0 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a    case TK_OR: {.
247d0 20 20 20 20 20 20 69 6e 74 20 64 32 20 3d 20 73        int d2 = s
247e0 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
247f0 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 74 65  bel(v);.      te
24800 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75  stcase( jumpIfNu
24810 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73  ll==0 );.      s
24820 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65  qlite3ExprIfTrue
24830 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
24840 70 4c 65 66 74 2c 20 64 32 2c 20 6a 75 6d 70 49  pLeft, d2, jumpI
24850 66 4e 75 6c 6c 5e 53 51 4c 49 54 45 5f 4a 55 4d  fNull^SQLITE_JUM
24860 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20  PIFNULL);.      
24870 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
24880 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20  Push(pParse);.  
24890 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
248a0 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
248b0 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65  Expr->pRight, de
248c0 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
248d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
248e0 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
248f0 2c 20 64 32 29 3b 0a 20 20 20 20 20 20 73 71 6c  , d2);.      sql
24900 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70  ite3ExprCachePop
24910 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
24920 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
24930 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a   case TK_NOT: {.
24940 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
24950 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
24960 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
24970 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c  prIfTrue(pParse,
24980 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64   pExpr->pLeft, d
24990 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
249a0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
249b0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
249c0 5f 49 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _IS:.    case TK
249d0 5f 49 53 4e 4f 54 3a 0a 20 20 20 20 20 20 74 65  _ISNOT:.      te
249e0 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
249f0 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20 20 20 20  p==TK_IS );.    
24a00 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
24a10 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20  r->op==TK_ISNOT 
24a20 29 3b 0a 20 20 20 20 20 20 6f 70 20 3d 20 28 70  );.      op = (p
24a30 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 29  Expr->op==TK_IS)
24a40 20 3f 20 54 4b 5f 4e 45 20 3a 20 54 4b 5f 45 51   ? TK_NE : TK_EQ
24a50 3b 0a 20 20 20 20 20 20 6a 75 6d 70 49 66 4e 75  ;.      jumpIfNu
24a60 6c 6c 20 3d 20 53 51 4c 49 54 45 5f 4e 55 4c 4c  ll = SQLITE_NULL
24a70 45 51 3b 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c  EQ;.      /* Fal
24a80 6c 20 74 68 72 75 20 2a 2f 0a 20 20 20 20 63 61  l thru */.    ca
24a90 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61  se TK_LT:.    ca
24aa0 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61  se TK_LE:.    ca
24ab0 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61  se TK_GT:.    ca
24ac0 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61  se TK_GE:.    ca
24ad0 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61  se TK_NE:.    ca
24ae0 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20  se TK_EQ: {.    
24af0 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
24b00 72 49 73 56 65 63 74 6f 72 28 70 45 78 70 72 2d  rIsVector(pExpr-
24b10 3e 70 4c 65 66 74 29 20 29 20 67 6f 74 6f 20 64  >pLeft) ) goto d
24b20 65 66 61 75 6c 74 5f 65 78 70 72 3b 0a 20 20 20  efault_expr;.   
24b30 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d     testcase( jum
24b40 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
24b50 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
24b60 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
24b70 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
24b80 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20  t, &regFree1);. 
24b90 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65       r2 = sqlite
24ba0 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
24bb0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69  arse, pExpr->pRi
24bc0 67 68 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b  ght, &regFree2);
24bd0 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61  .      codeCompa
24be0 72 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  re(pParse, pExpr
24bf0 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e  ->pLeft, pExpr->
24c00 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20  pRight, op,.    
24c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 31                r1
24c20 2c 20 72 32 2c 20 64 65 73 74 2c 20 6a 75 6d 70  , r2, dest, jump
24c30 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 61  IfNull);.      a
24c40 73 73 65 72 74 28 54 4b 5f 4c 54 3d 3d 4f 50 5f  ssert(TK_LT==OP_
24c50 4c 74 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70  Lt); testcase(op
24c60 3d 3d 4f 50 5f 4c 74 29 3b 20 56 64 62 65 43 6f  ==OP_Lt); VdbeCo
24c70 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f  verageIf(v,op==O
24c80 50 5f 4c 74 29 3b 0a 20 20 20 20 20 20 61 73 73  P_Lt);.      ass
24c90 65 72 74 28 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65  ert(TK_LE==OP_Le
24ca0 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d  ); testcase(op==
24cb0 4f 50 5f 4c 65 29 3b 20 56 64 62 65 43 6f 76 65  OP_Le); VdbeCove
24cc0 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f  rageIf(v,op==OP_
24cd0 4c 65 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Le);.      asser
24ce0 74 28 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74 29 3b  t(TK_GT==OP_Gt);
24cf0 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50   testcase(op==OP
24d00 5f 47 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61  _Gt); VdbeCovera
24d10 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 74  geIf(v,op==OP_Gt
24d20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
24d30 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65 29 3b 20 74  TK_GE==OP_Ge); t
24d40 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47  estcase(op==OP_G
24d50 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  e); VdbeCoverage
24d60 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 65 29 3b  If(v,op==OP_Ge);
24d70 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b  .      assert(TK
24d80 5f 45 51 3d 3d 4f 50 5f 45 71 29 3b 20 74 65 73  _EQ==OP_Eq); tes
24d90 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 45 71 29  tcase(op==OP_Eq)
24da0 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
24db0 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50  rageIf(v, op==OP
24dc0 5f 45 71 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c  _Eq && jumpIfNul
24dd0 6c 21 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51  l!=SQLITE_NULLEQ
24de0 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
24df0 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f  erageIf(v, op==O
24e00 50 5f 45 71 20 26 26 20 6a 75 6d 70 49 66 4e 75  P_Eq && jumpIfNu
24e10 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45  ll==SQLITE_NULLE
24e20 51 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  Q);.      assert
24e30 28 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 29 3b 20  (TK_NE==OP_Ne); 
24e40 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
24e50 4e 65 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  Ne);.      VdbeC
24e60 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d  overageIf(v, op=
24e70 3d 4f 50 5f 4e 65 20 26 26 20 6a 75 6d 70 49 66  =OP_Ne && jumpIf
24e80 4e 75 6c 6c 21 3d 53 51 4c 49 54 45 5f 4e 55 4c  Null!=SQLITE_NUL
24e90 4c 45 51 29 3b 0a 20 20 20 20 20 20 56 64 62 65  LEQ);.      Vdbe
24ea0 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70  CoverageIf(v, op
24eb0 3d 3d 4f 50 5f 4e 65 20 26 26 20 6a 75 6d 70 49  ==OP_Ne && jumpI
24ec0 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4e 55  fNull==SQLITE_NU
24ed0 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 74 65 73  LLEQ);.      tes
24ee0 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
24ef0 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  =0 );.      test
24f00 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d  case( regFree2==
24f10 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
24f20 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
24f30 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20   TK_ISNULL:.    
24f40 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a  case TK_NOTNULL:
24f50 20 7b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71   {.      r1 = sq
24f60 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
24f70 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
24f80 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65  >pLeft, &regFree
24f90 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
24fa0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 6f  3VdbeAddOp2(v, o
24fb0 70 2c 20 72 31 2c 20 64 65 73 74 29 3b 0a 20 20  p, r1, dest);.  
24fc0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
24fd0 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b 20 20  ==TK_ISNULL );  
24fe0 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
24ff0 76 2c 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c  v, op==TK_ISNULL
25000 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
25010 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c  e( op==TK_NOTNUL
25020 4c 20 29 3b 20 20 56 64 62 65 43 6f 76 65 72 61  L );  VdbeCovera
25030 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4e  geIf(v, op==TK_N
25040 4f 54 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 74  OTNULL);.      t
25050 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
25060 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72  1==0 );.      br
25070 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
25080 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20  ase TK_BETWEEN: 
25090 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
250a0 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  ( jumpIfNull==0 
250b0 29 3b 0a 20 20 20 20 20 20 65 78 70 72 43 6f 64  );.      exprCod
250c0 65 42 65 74 77 65 65 6e 28 70 50 61 72 73 65 2c  eBetween(pParse,
250d0 20 70 45 78 70 72 2c 20 64 65 73 74 2c 20 73 71   pExpr, dest, sq
250e0 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
250f0 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
25100 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
25110 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
25120 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
25130 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b     case TK_IN: {
25140 0a 20 20 20 20 20 20 69 66 28 20 6a 75 6d 70 49  .      if( jumpI
25150 66 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20  fNull ){.       
25160 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
25170 49 4e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  IN(pParse, pExpr
25180 2c 20 64 65 73 74 2c 20 64 65 73 74 29 3b 0a 20  , dest, dest);. 
25190 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
251a0 20 20 20 20 69 6e 74 20 64 65 73 74 49 66 4e 75      int destIfNu
251b0 6c 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ll = sqlite3Vdbe
251c0 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
251d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
251e0 72 43 6f 64 65 49 4e 28 70 50 61 72 73 65 2c 20  rCodeIN(pParse, 
251f0 70 45 78 70 72 2c 20 64 65 73 74 2c 20 64 65 73  pExpr, dest, des
25200 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  tIfNull);.      
25210 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
25220 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 65 73  olveLabel(v, des
25230 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  tIfNull);.      
25240 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
25250 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
25260 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 64  default: {.    d
25270 65 66 61 75 6c 74 5f 65 78 70 72 3a 20 0a 20 20  efault_expr: .  
25280 20 20 20 20 69 66 28 20 65 78 70 72 41 6c 77 61      if( exprAlwa
25290 79 73 46 61 6c 73 65 28 70 45 78 70 72 29 20 29  ysFalse(pExpr) )
252a0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
252b0 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 64 65 73  3VdbeGoto(v, des
252c0 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  t);.      }else 
252d0 69 66 28 20 65 78 70 72 41 6c 77 61 79 73 54 72  if( exprAlwaysTr
252e0 75 65 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20  ue(pExpr) ){.   
252f0 20 20 20 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f       /* no-op */
25300 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
25310 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
25320 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
25330 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 26 72  Parse, pExpr, &r
25340 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20  egFree1);.      
25350 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
25360 4f 70 33 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c  Op3(v, OP_IfNot,
25370 20 72 31 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49   r1, dest, jumpI
25380 66 4e 75 6c 6c 21 3d 30 29 3b 0a 20 20 20 20 20  fNull!=0);.     
25390 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
253a0 76 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  v);.        test
253b0 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d  case( regFree1==
253c0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  0 );.        tes
253d0 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c  tcase( jumpIfNul
253e0 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a  l==0 );.      }.
253f0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
25400 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
25410 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
25420 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 31 29  Parse, regFree1)
25430 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  ;.  sqlite3Relea
25440 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
25450 2c 20 72 65 67 46 72 65 65 32 29 3b 0a 7d 0a 0a  , regFree2);.}..
25460 2f 2a 0a 2a 2a 20 4c 69 6b 65 20 73 71 6c 69 74  /*.** Like sqlit
25470 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 29 20  e3ExprIfFalse() 
25480 65 78 63 65 70 74 20 74 68 61 74 20 61 20 63 6f  except that a co
25490 70 79 20 69 73 20 6d 61 64 65 20 6f 66 20 70 45  py is made of pE
254a0 78 70 72 20 62 65 66 6f 72 65 0a 2a 2a 20 63 6f  xpr before.** co
254b0 64 65 20 67 65 6e 65 72 61 74 69 6f 6e 2c 20 61  de generation, a
254c0 6e 64 20 74 68 61 74 20 63 6f 70 79 20 69 73 20  nd that copy is 
254d0 64 65 6c 65 74 65 64 20 61 66 74 65 72 20 63 6f  deleted after co
254e0 64 65 20 67 65 6e 65 72 61 74 69 6f 6e 2e 20 54  de generation. T
254f0 68 69 73 0a 2a 2a 20 65 6e 73 75 72 65 73 20 74  his.** ensures t
25500 68 61 74 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  hat the original
25510 20 70 45 78 70 72 20 69 73 20 75 6e 63 68 61 6e   pExpr is unchan
25520 67 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ged..*/.void sql
25530 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 44  ite3ExprIfFalseD
25540 75 70 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  up(Parse *pParse
25550 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69  , Expr *pExpr, i
25560 6e 74 20 64 65 73 74 2c 69 6e 74 20 6a 75 6d 70  nt dest,int jump
25570 49 66 4e 75 6c 6c 29 7b 0a 20 20 73 71 6c 69 74  IfNull){.  sqlit
25580 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
25590 3e 64 62 3b 0a 20 20 45 78 70 72 20 2a 70 43 6f  >db;.  Expr *pCo
255a0 70 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  py = sqlite3Expr
255b0 44 75 70 28 64 62 2c 20 70 45 78 70 72 2c 20 30  Dup(db, pExpr, 0
255c0 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  );.  if( db->mal
255d0 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 29 7b 0a  locFailed==0 ){.
255e0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
255f0 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
25600 43 6f 70 79 2c 20 64 65 73 74 2c 20 6a 75 6d 70  Copy, dest, jump
25610 49 66 4e 75 6c 6c 29 3b 0a 20 20 7d 0a 20 20 73  IfNull);.  }.  s
25620 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
25630 28 64 62 2c 20 70 43 6f 70 79 29 3b 0a 7d 0a 0a  (db, pCopy);.}..
25640 0a 2f 2a 0a 2a 2a 20 44 6f 20 61 20 64 65 65 70  ./*.** Do a deep
25650 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 66 20 74   comparison of t
25660 77 6f 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  wo expression tr
25670 65 65 73 2e 20 20 52 65 74 75 72 6e 20 30 20 69  ees.  Return 0 i
25680 66 20 74 68 65 20 74 77 6f 0a 2a 2a 20 65 78 70  f the two.** exp
25690 72 65 73 73 69 6f 6e 73 20 61 72 65 20 63 6f 6d  ressions are com
256a0 70 6c 65 74 65 6c 79 20 69 64 65 6e 74 69 63 61  pletely identica
256b0 6c 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66 20  l.  Return 1 if 
256c0 74 68 65 79 20 64 69 66 66 65 72 20 6f 6e 6c 79  they differ only
256d0 0a 2a 2a 20 62 79 20 61 20 43 4f 4c 4c 41 54 45  .** by a COLLATE
256e0 20 6f 70 65 72 61 74 6f 72 20 61 74 20 74 68 65   operator at the
256f0 20 74 6f 70 20 6c 65 76 65 6c 2e 20 20 52 65 74   top level.  Ret
25700 75 72 6e 20 32 20 69 66 20 74 68 65 72 65 20 61  urn 2 if there a
25710 72 65 20 64 69 66 66 65 72 65 6e 63 65 73 0a 2a  re differences.*
25720 2a 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68 65  * other than the
25730 20 74 6f 70 2d 6c 65 76 65 6c 20 43 4f 4c 4c 41   top-level COLLA
25740 54 45 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 0a  TE operator..**.
25750 2a 2a 20 49 66 20 61 6e 79 20 73 75 62 65 6c 65  ** If any subele
25760 6d 65 6e 74 20 6f 66 20 70 42 20 68 61 73 20 45  ment of pB has E
25770 78 70 72 2e 69 54 61 62 6c 65 3d 3d 28 2d 31 29  xpr.iTable==(-1)
25780 20 74 68 65 6e 20 69 74 20 69 73 20 61 6c 6c 6f   then it is allo
25790 77 65 64 0a 2a 2a 20 74 6f 20 63 6f 6d 70 61 72  wed.** to compar
257a0 65 20 65 71 75 61 6c 20 74 6f 20 61 6e 20 65 71  e equal to an eq
257b0 75 69 76 61 6c 65 6e 74 20 65 6c 65 6d 65 6e 74  uivalent element
257c0 20 69 6e 20 70 41 20 77 69 74 68 20 45 78 70 72   in pA with Expr
257d0 2e 69 54 61 62 6c 65 3d 3d 69 54 61 62 2e 0a 2a  .iTable==iTab..*
257e0 2a 0a 2a 2a 20 54 68 65 20 70 41 20 73 69 64 65  *.** The pA side
257f0 20 6d 69 67 68 74 20 62 65 20 75 73 69 6e 67 20   might be using 
25800 54 4b 5f 52 45 47 49 53 54 45 52 2e 20 20 49 66  TK_REGISTER.  If
25810 20 74 68 61 74 20 69 73 20 74 68 65 20 63 61 73   that is the cas
25820 65 20 61 6e 64 20 70 42 20 69 73 0a 2a 2a 20 6e  e and pB is.** n
25830 6f 74 20 75 73 69 6e 67 20 54 4b 5f 52 45 47 49  ot using TK_REGI
25840 53 54 45 52 20 62 75 74 20 69 73 20 6f 74 68 65  STER but is othe
25850 72 77 69 73 65 20 65 71 75 69 76 61 6c 65 6e 74  rwise equivalent
25860 2c 20 74 68 65 6e 20 73 74 69 6c 6c 20 72 65 74  , then still ret
25870 75 72 6e 20 30 2e 0a 2a 2a 0a 2a 2a 20 53 6f 6d  urn 0..**.** Som
25880 65 74 69 6d 65 73 20 74 68 69 73 20 72 6f 75 74  etimes this rout
25890 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e 20  ine will return 
258a0 32 20 65 76 65 6e 20 69 66 20 74 68 65 20 74 77  2 even if the tw
258b0 6f 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a  o expressions.**
258c0 20 72 65 61 6c 6c 79 20 61 72 65 20 65 71 75 69   really are equi
258d0 76 61 6c 65 6e 74 2e 20 20 49 66 20 77 65 20 63  valent.  If we c
258e0 61 6e 6e 6f 74 20 70 72 6f 76 65 20 74 68 61 74  annot prove that
258f0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73   the expressions
25900 20 61 72 65 0a 2a 2a 20 69 64 65 6e 74 69 63 61   are.** identica
25910 6c 2c 20 77 65 20 72 65 74 75 72 6e 20 32 20 6a  l, we return 2 j
25920 75 73 74 20 74 6f 20 62 65 20 73 61 66 65 2e 20  ust to be safe. 
25930 20 53 6f 20 69 66 20 74 68 69 73 20 72 6f 75 74   So if this rout
25940 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20 32  ine.** returns 2
25950 2c 20 74 68 65 6e 20 79 6f 75 20 64 6f 20 6e 6f  , then you do no
25960 74 20 72 65 61 6c 6c 79 20 6b 6e 6f 77 20 66 6f  t really know fo
25970 72 20 63 65 72 74 61 69 6e 20 69 66 20 74 68 65  r certain if the
25980 20 74 77 6f 0a 2a 2a 20 65 78 70 72 65 73 73 69   two.** expressi
25990 6f 6e 73 20 61 72 65 20 74 68 65 20 73 61 6d 65  ons are the same
259a0 2e 20 20 42 75 74 20 69 66 20 79 6f 75 20 67 65  .  But if you ge
259b0 74 20 61 20 30 20 6f 72 20 31 20 72 65 74 75 72  t a 0 or 1 retur
259c0 6e 2c 20 74 68 65 6e 20 79 6f 75 0a 2a 2a 20 63  n, then you.** c
259d0 61 6e 20 62 65 20 73 75 72 65 20 74 68 65 20 65  an be sure the e
259e0 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65 20 74  xpressions are t
259f0 68 65 20 73 61 6d 65 2e 20 20 49 6e 20 74 68 65  he same.  In the
25a00 20 70 6c 61 63 65 73 20 77 68 65 72 65 0a 2a 2a   places where.**
25a10 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
25a20 20 75 73 65 64 2c 20 69 74 20 64 6f 65 73 20 6e   used, it does n
25a30 6f 74 20 68 75 72 74 20 74 6f 20 67 65 74 20 61  ot hurt to get a
25a40 6e 20 65 78 74 72 61 20 32 20 2d 20 74 68 61 74  n extra 2 - that
25a50 0a 2a 2a 20 6a 75 73 74 20 6d 69 67 68 74 20 72  .** just might r
25a60 65 73 75 6c 74 20 69 6e 20 73 6f 6d 65 20 73 6c  esult in some sl
25a70 69 67 68 74 6c 79 20 73 6c 6f 77 65 72 20 63 6f  ightly slower co
25a80 64 65 2e 20 20 42 75 74 20 72 65 74 75 72 6e 69  de.  But returni
25a90 6e 67 0a 2a 2a 20 61 6e 20 69 6e 63 6f 72 72 65  ng.** an incorre
25aa0 63 74 20 30 20 6f 72 20 31 20 63 6f 75 6c 64 20  ct 0 or 1 could 
25ab0 6c 65 61 64 20 74 6f 20 61 20 6d 61 6c 66 75 6e  lead to a malfun
25ac0 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ction..*/.int sq
25ad0 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65  lite3ExprCompare
25ae0 28 45 78 70 72 20 2a 70 41 2c 20 45 78 70 72 20  (Expr *pA, Expr 
25af0 2a 70 42 2c 20 69 6e 74 20 69 54 61 62 29 7b 0a  *pB, int iTab){.
25b00 20 20 75 33 32 20 63 6f 6d 62 69 6e 65 64 46 6c    u32 combinedFl
25b10 61 67 73 3b 0a 20 20 69 66 28 20 70 41 3d 3d 30  ags;.  if( pA==0
25b20 20 7c 7c 20 70 42 3d 3d 30 20 29 7b 0a 20 20 20   || pB==0 ){.   
25b30 20 72 65 74 75 72 6e 20 70 42 3d 3d 70 41 20 3f   return pB==pA ?
25b40 20 30 20 3a 20 32 3b 0a 20 20 7d 0a 20 20 63 6f   0 : 2;.  }.  co
25b50 6d 62 69 6e 65 64 46 6c 61 67 73 20 3d 20 70 41  mbinedFlags = pA
25b60 2d 3e 66 6c 61 67 73 20 7c 20 70 42 2d 3e 66 6c  ->flags | pB->fl
25b70 61 67 73 3b 0a 20 20 69 66 28 20 63 6f 6d 62 69  ags;.  if( combi
25b80 6e 65 64 46 6c 61 67 73 20 26 20 45 50 5f 49 6e  nedFlags & EP_In
25b90 74 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 69 66  tValue ){.    if
25ba0 28 20 28 70 41 2d 3e 66 6c 61 67 73 26 70 42 2d  ( (pA->flags&pB-
25bb0 3e 66 6c 61 67 73 26 45 50 5f 49 6e 74 56 61 6c  >flags&EP_IntVal
25bc0 75 65 29 21 3d 30 20 26 26 20 70 41 2d 3e 75 2e  ue)!=0 && pA->u.
25bd0 69 56 61 6c 75 65 3d 3d 70 42 2d 3e 75 2e 69 56  iValue==pB->u.iV
25be0 61 6c 75 65 20 29 7b 0a 20 20 20 20 20 20 72 65  alue ){.      re
25bf0 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
25c00 20 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 7d 0a    return 2;.  }.
25c10 20 20 69 66 28 20 70 41 2d 3e 6f 70 21 3d 70 42    if( pA->op!=pB
25c20 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 69 66 28 20  ->op ){.    if( 
25c30 70 41 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41  pA->op==TK_COLLA
25c40 54 45 20 26 26 20 73 71 6c 69 74 65 33 45 78 70  TE && sqlite3Exp
25c50 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e 70 4c 65  rCompare(pA->pLe
25c60 66 74 2c 20 70 42 2c 20 69 54 61 62 29 3c 32 20  ft, pB, iTab)<2 
25c70 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
25c80 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  1;.    }.    if(
25c90 20 70 42 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c   pB->op==TK_COLL
25ca0 41 54 45 20 26 26 20 73 71 6c 69 74 65 33 45 78  ATE && sqlite3Ex
25cb0 70 72 43 6f 6d 70 61 72 65 28 70 41 2c 20 70 42  prCompare(pA, pB
25cc0 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 29 3c 32  ->pLeft, iTab)<2
25cd0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
25ce0 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65   1;.    }.    re
25cf0 74 75 72 6e 20 32 3b 0a 20 20 7d 0a 20 20 69 66  turn 2;.  }.  if
25d00 28 20 70 41 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c  ( pA->op!=TK_COL
25d10 55 4d 4e 20 26 26 20 70 41 2d 3e 6f 70 21 3d 54  UMN && pA->op!=T
25d20 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 26 26 20  K_AGG_COLUMN && 
25d30 70 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 29 7b 0a  pA->u.zToken ){.
25d40 20 20 20 20 69 66 28 20 70 41 2d 3e 6f 70 3d 3d      if( pA->op==
25d50 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 29 7b 0a 20  TK_FUNCTION ){. 
25d60 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
25d70 53 74 72 49 43 6d 70 28 70 41 2d 3e 75 2e 7a 54  StrICmp(pA->u.zT
25d80 6f 6b 65 6e 2c 70 42 2d 3e 75 2e 7a 54 6f 6b 65  oken,pB->u.zToke
25d90 6e 29 21 3d 30 20 29 20 72 65 74 75 72 6e 20 32  n)!=0 ) return 2
25da0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
25db0 73 74 72 63 6d 70 28 70 41 2d 3e 75 2e 7a 54 6f  strcmp(pA->u.zTo
25dc0 6b 65 6e 2c 70 42 2d 3e 75 2e 7a 54 6f 6b 65 6e  ken,pB->u.zToken
25dd0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  )!=0 ){.      re
25de0 74 75 72 6e 20 70 41 2d 3e 6f 70 3d 3d 54 4b 5f  turn pA->op==TK_
25df0 43 4f 4c 4c 41 54 45 20 3f 20 31 20 3a 20 32 3b  COLLATE ? 1 : 2;
25e00 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
25e10 20 28 70 41 2d 3e 66 6c 61 67 73 20 26 20 45 50   (pA->flags & EP
25e20 5f 44 69 73 74 69 6e 63 74 29 21 3d 28 70 42 2d  _Distinct)!=(pB-
25e30 3e 66 6c 61 67 73 20 26 20 45 50 5f 44 69 73 74  >flags & EP_Dist
25e40 69 6e 63 74 29 20 29 20 72 65 74 75 72 6e 20 32  inct) ) return 2
25e50 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 28  ;.  if( ALWAYS((
25e60 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20 26 20  combinedFlags & 
25e70 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 3d 3d 30  EP_TokenOnly)==0
25e80 29 20 29 7b 0a 20 20 20 20 69 66 28 20 63 6f 6d  ) ){.    if( com
25e90 62 69 6e 65 64 46 6c 61 67 73 20 26 20 45 50 5f  binedFlags & EP_
25ea0 78 49 73 53 65 6c 65 63 74 20 29 20 72 65 74 75  xIsSelect ) retu
25eb0 72 6e 20 32 3b 0a 20 20 20 20 69 66 28 20 73 71  rn 2;.    if( sq
25ec0 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65  lite3ExprCompare
25ed0 28 70 41 2d 3e 70 4c 65 66 74 2c 20 70 42 2d 3e  (pA->pLeft, pB->
25ee0 70 4c 65 66 74 2c 20 69 54 61 62 29 20 29 20 72  pLeft, iTab) ) r
25ef0 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 69 66 28  eturn 2;.    if(
25f00 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70   sqlite3ExprComp
25f10 61 72 65 28 70 41 2d 3e 70 52 69 67 68 74 2c 20  are(pA->pRight, 
25f20 70 42 2d 3e 70 52 69 67 68 74 2c 20 69 54 61 62  pB->pRight, iTab
25f30 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20  ) ) return 2;.  
25f40 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
25f50 72 4c 69 73 74 43 6f 6d 70 61 72 65 28 70 41 2d  rListCompare(pA-
25f60 3e 78 2e 70 4c 69 73 74 2c 20 70 42 2d 3e 78 2e  >x.pList, pB->x.
25f70 70 4c 69 73 74 2c 20 69 54 61 62 29 20 29 20 72  pList, iTab) ) r
25f80 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 69 66 28  eturn 2;.    if(
25f90 20 41 4c 57 41 59 53 28 28 63 6f 6d 62 69 6e 65   ALWAYS((combine
25fa0 64 46 6c 61 67 73 20 26 20 45 50 5f 52 65 64 75  dFlags & EP_Redu
25fb0 63 65 64 29 3d 3d 30 29 20 26 26 20 70 41 2d 3e  ced)==0) && pA->
25fc0 6f 70 21 3d 54 4b 5f 53 54 52 49 4e 47 20 29 7b  op!=TK_STRING ){
25fd0 0a 20 20 20 20 20 20 69 66 28 20 70 41 2d 3e 69  .      if( pA->i
25fe0 43 6f 6c 75 6d 6e 21 3d 70 42 2d 3e 69 43 6f 6c  Column!=pB->iCol
25ff0 75 6d 6e 20 29 20 72 65 74 75 72 6e 20 32 3b 0a  umn ) return 2;.
26000 20 20 20 20 20 20 69 66 28 20 70 41 2d 3e 69 54        if( pA->iT
26010 61 62 6c 65 21 3d 70 42 2d 3e 69 54 61 62 6c 65  able!=pB->iTable
26020 20 0a 20 20 20 20 20 20 20 26 26 20 28 70 41 2d   .       && (pA-
26030 3e 69 54 61 62 6c 65 21 3d 69 54 61 62 20 7c 7c  >iTable!=iTab ||
26040 20 4e 45 56 45 52 28 70 42 2d 3e 69 54 61 62 6c   NEVER(pB->iTabl
26050 65 3e 3d 30 29 29 20 29 20 72 65 74 75 72 6e 20  e>=0)) ) return 
26060 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  2;.    }.  }.  r
26070 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
26080 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f 20 45 78  * Compare two Ex
26090 70 72 4c 69 73 74 20 6f 62 6a 65 63 74 73 2e 20  prList objects. 
260a0 20 52 65 74 75 72 6e 20 30 20 69 66 20 74 68 65   Return 0 if the
260b0 79 20 61 72 65 20 69 64 65 6e 74 69 63 61 6c 20  y are identical 
260c0 61 6e 64 20 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f  and .** non-zero
260d0 20 69 66 20 74 68 65 79 20 64 69 66 66 65 72 20   if they differ 
260e0 69 6e 20 61 6e 79 20 77 61 79 2e 0a 2a 2a 0a 2a  in any way..**.*
260f0 2a 20 49 66 20 61 6e 79 20 73 75 62 65 6c 65 6d  * If any subelem
26100 65 6e 74 20 6f 66 20 70 42 20 68 61 73 20 45 78  ent of pB has Ex
26110 70 72 2e 69 54 61 62 6c 65 3d 3d 28 2d 31 29 20  pr.iTable==(-1) 
26120 74 68 65 6e 20 69 74 20 69 73 20 61 6c 6c 6f 77  then it is allow
26130 65 64 0a 2a 2a 20 74 6f 20 63 6f 6d 70 61 72 65  ed.** to compare
26140 20 65 71 75 61 6c 20 74 6f 20 61 6e 20 65 71 75   equal to an equ
26150 69 76 61 6c 65 6e 74 20 65 6c 65 6d 65 6e 74 20  ivalent element 
26160 69 6e 20 70 41 20 77 69 74 68 20 45 78 70 72 2e  in pA with Expr.
26170 69 54 61 62 6c 65 3d 3d 69 54 61 62 2e 0a 2a 2a  iTable==iTab..**
26180 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
26190 20 6d 69 67 68 74 20 72 65 74 75 72 6e 20 6e 6f   might return no
261a0 6e 2d 7a 65 72 6f 20 66 6f 72 20 65 71 75 69 76  n-zero for equiv
261b0 61 6c 65 6e 74 20 45 78 70 72 4c 69 73 74 73 2e  alent ExprLists.
261c0 20 20 54 68 65 0a 2a 2a 20 6f 6e 6c 79 20 63 6f    The.** only co
261d0 6e 73 65 71 75 65 6e 63 65 20 77 69 6c 6c 20 62  nsequence will b
261e0 65 20 64 69 73 61 62 6c 65 64 20 6f 70 74 69 6d  e disabled optim
261f0 69 7a 61 74 69 6f 6e 73 2e 20 20 42 75 74 20 74  izations.  But t
26200 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 6d  his routine.** m
26210 75 73 74 20 6e 65 76 65 72 20 72 65 74 75 72 6e  ust never return
26220 20 30 20 69 66 20 74 68 65 20 74 77 6f 20 45 78   0 if the two Ex
26230 70 72 4c 69 73 74 20 6f 62 6a 65 63 74 73 20 61  prList objects a
26240 72 65 20 64 69 66 66 65 72 65 6e 74 2c 20 6f 72  re different, or
26250 0a 2a 2a 20 61 20 6d 61 6c 66 75 6e 63 74 69 6f  .** a malfunctio
26260 6e 20 77 69 6c 6c 20 72 65 73 75 6c 74 2e 0a 2a  n will result..*
26270 2a 0a 2a 2a 20 54 77 6f 20 4e 55 4c 4c 20 70 6f  *.** Two NULL po
26280 69 6e 74 65 72 73 20 61 72 65 20 63 6f 6e 73 69  inters are consi
26290 64 65 72 65 64 20 74 6f 20 62 65 20 74 68 65 20  dered to be the 
262a0 73 61 6d 65 2e 20 20 42 75 74 20 61 20 4e 55 4c  same.  But a NUL
262b0 4c 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 61 6c 77  L pointer.** alw
262c0 61 79 73 20 64 69 66 66 65 72 73 20 66 72 6f 6d  ays differs from
262d0 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 70 6f 69 6e   a non-NULL poin
262e0 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ter..*/.int sqli
262f0 74 65 33 45 78 70 72 4c 69 73 74 43 6f 6d 70 61  te3ExprListCompa
26300 72 65 28 45 78 70 72 4c 69 73 74 20 2a 70 41 2c  re(ExprList *pA,
26310 20 45 78 70 72 4c 69 73 74 20 2a 70 42 2c 20 69   ExprList *pB, i
26320 6e 74 20 69 54 61 62 29 7b 0a 20 20 69 6e 74 20  nt iTab){.  int 
26330 69 3b 0a 20 20 69 66 28 20 70 41 3d 3d 30 20 26  i;.  if( pA==0 &
26340 26 20 70 42 3d 3d 30 20 29 20 72 65 74 75 72 6e  & pB==0 ) return
26350 20 30 3b 0a 20 20 69 66 28 20 70 41 3d 3d 30 20   0;.  if( pA==0 
26360 7c 7c 20 70 42 3d 3d 30 20 29 20 72 65 74 75 72  || pB==0 ) retur
26370 6e 20 31 3b 0a 20 20 69 66 28 20 70 41 2d 3e 6e  n 1;.  if( pA->n
26380 45 78 70 72 21 3d 70 42 2d 3e 6e 45 78 70 72 20  Expr!=pB->nExpr 
26390 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 66 6f  ) return 1;.  fo
263a0 72 28 69 3d 30 3b 20 69 3c 70 41 2d 3e 6e 45 78  r(i=0; i<pA->nEx
263b0 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78  pr; i++){.    Ex
263c0 70 72 20 2a 70 45 78 70 72 41 20 3d 20 70 41 2d  pr *pExprA = pA-
263d0 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
263e0 20 45 78 70 72 20 2a 70 45 78 70 72 42 20 3d 20   Expr *pExprB = 
263f0 70 42 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  pB->a[i].pExpr;.
26400 20 20 20 20 69 66 28 20 70 41 2d 3e 61 5b 69 5d      if( pA->a[i]
26410 2e 73 6f 72 74 4f 72 64 65 72 21 3d 70 42 2d 3e  .sortOrder!=pB->
26420 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 20 29  a[i].sortOrder )
26430 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 69   return 1;.    i
26440 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  f( sqlite3ExprCo
26450 6d 70 61 72 65 28 70 45 78 70 72 41 2c 20 70 45  mpare(pExprA, pE
26460 78 70 72 42 2c 20 69 54 61 62 29 20 29 20 72 65  xprB, iTab) ) re
26470 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65  turn 1;.  }.  re
26480 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
26490 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
264a0 77 65 20 63 61 6e 20 70 72 6f 76 65 20 74 68 65  we can prove the
264b0 20 70 45 32 20 77 69 6c 6c 20 61 6c 77 61 79 73   pE2 will always
264c0 20 62 65 20 74 72 75 65 20 69 66 20 70 45 31 20   be true if pE1 
264d0 69 73 0a 2a 2a 20 74 72 75 65 2e 20 20 52 65 74  is.** true.  Ret
264e0 75 72 6e 20 66 61 6c 73 65 20 69 66 20 77 65 20  urn false if we 
264f0 63 61 6e 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 20  cannot complete 
26500 74 68 65 20 70 72 6f 6f 66 20 6f 72 20 69 66 20  the proof or if 
26510 70 45 32 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20  pE2 might.** be 
26520 66 61 6c 73 65 2e 20 20 45 78 61 6d 70 6c 65 73  false.  Examples
26530 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 70 45 31 3a  :.**.**     pE1:
26540 20 78 3d 3d 35 20 20 20 20 20 20 20 70 45 32 3a   x==5       pE2:
26550 20 78 3d 3d 35 20 20 20 20 20 20 20 20 20 20 20   x==5           
26560 20 20 52 65 73 75 6c 74 3a 20 74 72 75 65 0a 2a    Result: true.*
26570 2a 20 20 20 20 20 70 45 31 3a 20 78 3e 30 20 20  *     pE1: x>0  
26580 20 20 20 20 20 20 70 45 32 3a 20 78 3d 3d 35 20        pE2: x==5 
26590 20 20 20 20 20 20 20 20 20 20 20 20 52 65 73 75              Resu
265a0 6c 74 3a 20 66 61 6c 73 65 0a 2a 2a 20 20 20 20  lt: false.**    
265b0 20 70 45 31 3a 20 78 3d 32 31 20 20 20 20 20 20   pE1: x=21      
265c0 20 70 45 32 3a 20 78 3d 32 31 20 4f 52 20 79 3d   pE2: x=21 OR y=
265d0 34 33 20 20 20 20 20 52 65 73 75 6c 74 3a 20 74  43     Result: t
265e0 72 75 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20  rue.**     pE1: 
265f0 78 21 3d 31 32 33 20 20 20 20 20 70 45 32 3a 20  x!=123     pE2: 
26600 78 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20  x IS NOT NULL   
26610 20 52 65 73 75 6c 74 3a 20 74 72 75 65 0a 2a 2a   Result: true.**
26620 20 20 20 20 20 70 45 31 3a 20 78 21 3d 3f 31 20       pE1: x!=?1 
26630 20 20 20 20 20 70 45 32 3a 20 78 20 49 53 20 4e       pE2: x IS N
26640 4f 54 20 4e 55 4c 4c 20 20 20 20 52 65 73 75 6c  OT NULL    Resul
26650 74 3a 20 74 72 75 65 0a 2a 2a 20 20 20 20 20 70  t: true.**     p
26660 45 31 3a 20 78 20 49 53 20 4e 55 4c 4c 20 20 70  E1: x IS NULL  p
26670 45 32 3a 20 78 20 49 53 20 4e 4f 54 20 4e 55 4c  E2: x IS NOT NUL
26680 4c 20 20 20 20 52 65 73 75 6c 74 3a 20 66 61 6c  L    Result: fal
26690 73 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78  se.**     pE1: x
266a0 20 49 53 20 3f 32 20 20 20 20 70 45 32 3a 20 78   IS ?2    pE2: x
266b0 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20   IS NOT NULL    
266c0 52 65 75 73 6c 74 3a 20 66 61 6c 73 65 0a 2a 2a  Reuslt: false.**
266d0 0a 2a 2a 20 57 68 65 6e 20 63 6f 6d 70 61 72 69  .** When compari
266e0 6e 67 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f 64  ng TK_COLUMN nod
266f0 65 73 20 62 65 74 77 65 65 6e 20 70 45 31 20 61  es between pE1 a
26700 6e 64 20 70 45 32 2c 20 69 66 20 70 45 32 20 68  nd pE2, if pE2 h
26710 61 73 0a 2a 2a 20 45 78 70 72 2e 69 54 61 62 6c  as.** Expr.iTabl
26720 65 3c 30 20 74 68 65 6e 20 61 73 73 75 6d 65 20  e<0 then assume 
26730 61 20 74 61 62 6c 65 20 6e 75 6d 62 65 72 20 67  a table number g
26740 69 76 65 6e 20 62 79 20 69 54 61 62 2e 0a 2a 2a  iven by iTab..**
26750 0a 2a 2a 20 57 68 65 6e 20 69 6e 20 64 6f 75 62  .** When in doub
26760 74 2c 20 72 65 74 75 72 6e 20 66 61 6c 73 65 2e  t, return false.
26770 20 20 52 65 74 75 72 6e 69 6e 67 20 74 72 75 65    Returning true
26780 20 6d 69 67 68 74 20 67 69 76 65 20 61 20 70 65   might give a pe
26790 72 66 6f 72 6d 61 6e 63 65 0a 2a 2a 20 69 6d 70  rformance.** imp
267a0 72 6f 76 65 6d 65 6e 74 2e 20 20 52 65 74 75 72  rovement.  Retur
267b0 6e 69 6e 67 20 66 61 6c 73 65 20 6d 69 67 68 74  ning false might
267c0 20 63 61 75 73 65 20 61 20 70 65 72 66 6f 72 6d   cause a perform
267d0 61 6e 63 65 20 72 65 64 75 63 74 69 6f 6e 2c 20  ance reduction, 
267e0 62 75 74 0a 2a 2a 20 69 74 20 77 69 6c 6c 20 61  but.** it will a
267f0 6c 77 61 79 73 20 67 69 76 65 20 74 68 65 20 63  lways give the c
26800 6f 72 72 65 63 74 20 61 6e 73 77 65 72 20 61 6e  orrect answer an
26810 64 20 69 73 20 68 65 6e 63 65 20 61 6c 77 61 79  d is hence alway
26820 73 20 73 61 66 65 2e 0a 2a 2f 0a 69 6e 74 20 73  s safe..*/.int s
26830 71 6c 69 74 65 33 45 78 70 72 49 6d 70 6c 69 65  qlite3ExprImplie
26840 73 45 78 70 72 28 45 78 70 72 20 2a 70 45 31 2c  sExpr(Expr *pE1,
26850 20 45 78 70 72 20 2a 70 45 32 2c 20 69 6e 74 20   Expr *pE2, int 
26860 69 54 61 62 29 7b 0a 20 20 69 66 28 20 73 71 6c  iTab){.  if( sql
26870 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28  ite3ExprCompare(
26880 70 45 31 2c 20 70 45 32 2c 20 69 54 61 62 29 3d  pE1, pE2, iTab)=
26890 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
268a0 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 45   1;.  }.  if( pE
268b0 32 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52 0a 20 20 20  2->op==TK_OR.   
268c0 26 26 20 28 73 71 6c 69 74 65 33 45 78 70 72 49  && (sqlite3ExprI
268d0 6d 70 6c 69 65 73 45 78 70 72 28 70 45 31 2c 20  mpliesExpr(pE1, 
268e0 70 45 32 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62  pE2->pLeft, iTab
268f0 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7c  ).             |
26900 7c 20 73 71 6c 69 74 65 33 45 78 70 72 49 6d 70  | sqlite3ExprImp
26910 6c 69 65 73 45 78 70 72 28 70 45 31 2c 20 70 45  liesExpr(pE1, pE
26920 32 2d 3e 70 52 69 67 68 74 2c 20 69 54 61 62 29  2->pRight, iTab)
26930 20 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75   ).  ){.    retu
26940 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 1;.  }.  if( 
26950 70 45 32 2d 3e 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e  pE2->op==TK_NOTN
26960 55 4c 4c 0a 20 20 20 26 26 20 73 71 6c 69 74 65  ULL.   && sqlite
26970 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 45 31  3ExprCompare(pE1
26980 2d 3e 70 4c 65 66 74 2c 20 70 45 32 2d 3e 70 4c  ->pLeft, pE2->pL
26990 65 66 74 2c 20 69 54 61 62 29 3d 3d 30 0a 20 20  eft, iTab)==0.  
269a0 20 26 26 20 28 70 45 31 2d 3e 6f 70 21 3d 54 4b   && (pE1->op!=TK
269b0 5f 49 53 4e 55 4c 4c 20 26 26 20 70 45 31 2d 3e  _ISNULL && pE1->
269c0 6f 70 21 3d 54 4b 5f 49 53 29 0a 20 20 29 7b 0a  op!=TK_IS).  ){.
269d0 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
269e0 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
269f0 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e  ./*.** An instan
26a00 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ce of the follow
26a10 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 69 73  ing structure is
26a20 20 75 73 65 64 20 62 79 20 74 68 65 20 74 72 65   used by the tre
26a30 65 20 77 61 6c 6b 65 72 0a 2a 2a 20 74 6f 20 64  e walker.** to d
26a40 65 74 65 72 6d 69 6e 65 20 69 66 20 61 6e 20 65  etermine if an e
26a50 78 70 72 65 73 73 69 6f 6e 20 63 61 6e 20 62 65  xpression can be
26a60 20 65 76 61 6c 75 61 74 65 64 20 62 79 20 72 65   evaluated by re
26a70 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 0a 2a  ference to the.*
26a80 2a 20 69 6e 64 65 78 20 6f 6e 6c 79 2c 20 77 69  * index only, wi
26a90 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20  thout having to 
26aa0 64 6f 20 61 20 73 65 61 72 63 68 20 66 6f 72 20  do a search for 
26ab0 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
26ac0 67 0a 2a 2a 20 74 61 62 6c 65 20 65 6e 74 72 79  g.** table entry
26ad0 2e 20 20 54 68 65 20 49 64 78 43 6f 76 65 72 2e  .  The IdxCover.
26ae0 70 49 64 78 20 66 69 65 6c 64 20 69 73 20 74 68  pIdx field is th
26af0 65 20 69 6e 64 65 78 2e 20 20 49 64 78 43 6f 76  e index.  IdxCov
26b00 65 72 2e 69 43 75 72 0a 2a 2a 20 69 73 20 74 68  er.iCur.** is th
26b10 65 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65  e cursor for the
26b20 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 72 75 63   table..*/.struc
26b30 74 20 49 64 78 43 6f 76 65 72 20 7b 0a 20 20 49  t IdxCover {.  I
26b40 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20  ndex *pIdx;     
26b50 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 74 6f 20  /* The index to 
26b60 62 65 20 74 65 73 74 65 64 20 66 6f 72 20 63 6f  be tested for co
26b70 76 65 72 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  verage */.  int 
26b80 69 43 75 72 3b 20 20 20 20 20 20 20 20 2f 2a 20  iCur;        /* 
26b90 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f  Cursor number fo
26ba0 72 20 74 68 65 20 74 61 62 6c 65 20 63 6f 72 72  r the table corr
26bb0 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65  esponding to the
26bc0 20 69 6e 64 65 78 20 2a 2f 0a 7d 3b 0a 0a 2f 2a   index */.};../*
26bd0 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65  .** Check to see
26be0 20 69 66 20 74 68 65 72 65 20 61 72 65 20 72 65   if there are re
26bf0 66 65 72 65 6e 63 65 73 20 74 6f 20 63 6f 6c 75  ferences to colu
26c00 6d 6e 73 20 69 6e 20 74 61 62 6c 65 20 0a 2a 2a  mns in table .**
26c10 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 49 64 78   pWalker->u.pIdx
26c20 43 6f 76 65 72 2d 3e 69 43 75 72 20 63 61 6e 20  Cover->iCur can 
26c30 62 65 20 73 61 74 69 73 66 69 65 64 20 75 73 69  be satisfied usi
26c40 6e 67 20 74 68 65 20 69 6e 64 65 78 0a 2a 2a 20  ng the index.** 
26c50 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 49 64 78 43  pWalker->u.pIdxC
26c60 6f 76 65 72 2d 3e 70 49 64 78 2e 0a 2a 2f 0a 73  over->pIdx..*/.s
26c70 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 49 64  tatic int exprId
26c80 78 43 6f 76 65 72 28 57 61 6c 6b 65 72 20 2a 70  xCover(Walker *p
26c90 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45  Walker, Expr *pE
26ca0 78 70 72 29 7b 0a 20 20 69 66 28 20 70 45 78 70  xpr){.  if( pExp
26cb0 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op==TK_COLUMN
26cc0 0a 20 20 20 26 26 20 70 45 78 70 72 2d 3e 69 54  .   && pExpr->iT
26cd0 61 62 6c 65 3d 3d 70 57 61 6c 6b 65 72 2d 3e 75  able==pWalker->u
26ce0 2e 70 49 64 78 43 6f 76 65 72 2d 3e 69 43 75 72  .pIdxCover->iCur
26cf0 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33 43 6f  .   && sqlite3Co
26d00 6c 75 6d 6e 4f 66 49 6e 64 65 78 28 70 57 61 6c  lumnOfIndex(pWal
26d10 6b 65 72 2d 3e 75 2e 70 49 64 78 43 6f 76 65 72  ker->u.pIdxCover
26d20 2d 3e 70 49 64 78 2c 20 70 45 78 70 72 2d 3e 69  ->pIdx, pExpr->i
26d30 43 6f 6c 75 6d 6e 29 3c 30 0a 20 20 29 7b 0a 20  Column)<0.  ){. 
26d40 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64     pWalker->eCod
26d50 65 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72  e = 1;.    retur
26d60 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d  n WRC_Abort;.  }
26d70 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f  .  return WRC_Co
26d80 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ntinue;.}../*.**
26d90 20 44 65 74 65 72 6d 69 6e 65 20 69 66 20 61 6e   Determine if an
26da0 20 69 6e 64 65 78 20 70 49 64 78 20 6f 6e 20 74   index pIdx on t
26db0 61 62 6c 65 20 77 69 74 68 20 63 75 72 73 6f 72  able with cursor
26dc0 20 69 43 75 72 20 63 6f 6e 74 61 69 6e 73 20 77   iCur contains w
26dd0 69 6c 6c 0a 2a 2a 20 74 68 65 20 65 78 70 72 65  ill.** the expre
26de0 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 20 52 65  ssion pExpr.  Re
26df0 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65  turn true if the
26e00 20 69 6e 64 65 78 20 64 6f 65 73 20 63 6f 76 65   index does cove
26e10 72 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73  r the.** express
26e20 69 6f 6e 20 61 6e 64 20 66 61 6c 73 65 20 69 66  ion and false if
26e30 20 74 68 65 20 70 45 78 70 72 20 65 78 70 72 65   the pExpr expre
26e40 73 73 69 6f 6e 20 72 65 66 65 72 65 6e 63 65 73  ssion references
26e50 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 0a 2a   table columns.*
26e60 2a 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20 66  * that are not f
26e70 6f 75 6e 64 20 69 6e 20 74 68 65 20 69 6e 64 65  ound in the inde
26e80 78 20 70 49 64 78 2e 0a 2a 2a 0a 2a 2a 20 41 6e  x pIdx..**.** An
26e90 20 69 6e 64 65 78 20 63 6f 76 65 72 69 6e 67 20   index covering 
26ea0 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 65  an expression me
26eb0 61 6e 73 20 74 68 61 74 20 74 68 65 20 65 78 70  ans that the exp
26ec0 72 65 73 73 69 6f 6e 20 63 61 6e 20 62 65 0a 2a  ression can be.*
26ed0 2a 20 65 76 61 6c 75 61 74 65 64 20 75 73 69 6e  * evaluated usin
26ee0 67 20 6f 6e 6c 79 20 74 68 65 20 69 6e 64 65 78  g only the index
26ef0 20 61 6e 64 20 77 69 74 68 6f 75 74 20 68 61 76   and without hav
26f00 69 6e 67 20 74 6f 20 6c 6f 6f 6b 75 70 20 74 68  ing to lookup th
26f10 65 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69  e.** correspondi
26f20 6e 67 20 74 61 62 6c 65 20 65 6e 74 72 79 2e 0a  ng table entry..
26f30 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
26f40 70 72 43 6f 76 65 72 65 64 42 79 49 6e 64 65 78  prCoveredByIndex
26f50 28 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c  (.  Expr *pExpr,
26f60 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69          /* The i
26f70 6e 64 65 78 20 74 6f 20 62 65 20 74 65 73 74 65  ndex to be teste
26f80 64 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 2c  d */.  int iCur,
26f90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
26fa0 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  e cursor number 
26fb0 66 6f 72 20 74 68 65 20 63 6f 72 72 65 73 70 6f  for the correspo
26fc0 6e 64 69 6e 67 20 74 61 62 6c 65 20 2a 2f 0a 20  nding table */. 
26fd0 20 49 6e 64 65 78 20 2a 70 49 64 78 20 20 20 20   Index *pIdx    
26fe0 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65       /* The inde
26ff0 78 20 74 68 61 74 20 6d 69 67 68 74 20 62 65 20  x that might be 
27000 75 73 65 64 20 66 6f 72 20 63 6f 76 65 72 61 67  used for coverag
27010 65 20 2a 2f 0a 29 7b 0a 20 20 57 61 6c 6b 65 72  e */.){.  Walker
27020 20 77 3b 0a 20 20 73 74 72 75 63 74 20 49 64 78   w;.  struct Idx
27030 43 6f 76 65 72 20 78 63 6f 76 3b 0a 20 20 6d 65  Cover xcov;.  me
27040 6d 73 65 74 28 26 77 2c 20 30 2c 20 73 69 7a 65  mset(&w, 0, size
27050 6f 66 28 77 29 29 3b 0a 20 20 78 63 6f 76 2e 69  of(w));.  xcov.i
27060 43 75 72 20 3d 20 69 43 75 72 3b 0a 20 20 78 63  Cur = iCur;.  xc
27070 6f 76 2e 70 49 64 78 20 3d 20 70 49 64 78 3b 0a  ov.pIdx = pIdx;.
27080 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63    w.xExprCallbac
27090 6b 20 3d 20 65 78 70 72 49 64 78 43 6f 76 65 72  k = exprIdxCover
270a0 3b 0a 20 20 77 2e 75 2e 70 49 64 78 43 6f 76 65  ;.  w.u.pIdxCove
270b0 72 20 3d 20 26 78 63 6f 76 3b 0a 20 20 73 71 6c  r = &xcov;.  sql
270c0 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77 2c  ite3WalkExpr(&w,
270d0 20 70 45 78 70 72 29 3b 0a 20 20 72 65 74 75 72   pExpr);.  retur
270e0 6e 20 21 77 2e 65 43 6f 64 65 3b 0a 7d 0a 0a 0a  n !w.eCode;.}...
270f0 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63  /*.** An instanc
27100 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
27110 6e 67 20 73 74 72 75 63 74 75 72 65 20 69 73 20  ng structure is 
27120 75 73 65 64 20 62 79 20 74 68 65 20 74 72 65 65  used by the tree
27130 20 77 61 6c 6b 65 72 0a 2a 2a 20 74 6f 20 63 6f   walker.** to co
27140 75 6e 74 20 72 65 66 65 72 65 6e 63 65 73 20 74  unt references t
27150 6f 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 20  o table columns 
27160 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74 73  in the arguments
27170 20 6f 66 20 61 6e 20 0a 2a 2a 20 61 67 67 72 65   of an .** aggre
27180 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 2c 20 69  gate function, i
27190 6e 20 6f 72 64 65 72 20 74 6f 20 69 6d 70 6c 65  n order to imple
271a0 6d 65 6e 74 20 74 68 65 0a 2a 2a 20 73 71 6c 69  ment the.** sqli
271b0 74 65 33 46 75 6e 63 74 69 6f 6e 54 68 69 73 53  te3FunctionThisS
271c0 72 63 28 29 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f  rc() routine..*/
271d0 0a 73 74 72 75 63 74 20 53 72 63 43 6f 75 6e 74  .struct SrcCount
271e0 20 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53   {.  SrcList *pS
271f0 72 63 3b 20 20 20 2f 2a 20 4f 6e 65 20 70 61 72  rc;   /* One par
27200 74 69 63 75 6c 61 72 20 46 52 4f 4d 20 63 6c 61  ticular FROM cla
27210 75 73 65 20 69 6e 20 61 20 6e 65 73 74 65 64 20  use in a nested 
27220 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6e  query */.  int n
27230 54 68 69 73 3b 20 20 20 20 20 20 20 2f 2a 20 4e  This;       /* N
27240 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e  umber of referen
27250 63 65 73 20 74 6f 20 63 6f 6c 75 6d 6e 73 20 69  ces to columns i
27260 6e 20 70 53 72 63 4c 69 73 74 20 2a 2f 0a 20 20  n pSrcList */.  
27270 69 6e 74 20 6e 4f 74 68 65 72 3b 20 20 20 20 20  int nOther;     
27280 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65   /* Number of re
27290 66 65 72 65 6e 63 65 73 20 74 6f 20 63 6f 6c 75  ferences to colu
272a0 6d 6e 73 20 69 6e 20 6f 74 68 65 72 20 46 52 4f  mns in other FRO
272b0 4d 20 63 6c 61 75 73 65 73 20 2a 2f 0a 7d 3b 0a  M clauses */.};.
272c0 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65  ./*.** Count the
272d0 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72   number of refer
272e0 65 6e 63 65 73 20 74 6f 20 63 6f 6c 75 6d 6e 73  ences to columns
272f0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
27300 65 78 70 72 53 72 63 43 6f 75 6e 74 28 57 61 6c  exprSrcCount(Wal
27310 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78  ker *pWalker, Ex
27320 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 2f 2a  pr *pExpr){.  /*
27330 20 54 68 65 20 4e 45 56 45 52 28 29 20 6f 6e 20   The NEVER() on 
27340 74 68 65 20 73 65 63 6f 6e 64 20 74 65 72 6d 20  the second term 
27350 69 73 20 62 65 63 61 75 73 65 20 73 71 6c 69 74  is because sqlit
27360 65 33 46 75 6e 63 74 69 6f 6e 55 73 65 73 54 68  e3FunctionUsesTh
27370 69 73 53 72 63 28 29 0a 20 20 2a 2a 20 69 73 20  isSrc().  ** is 
27380 61 6c 77 61 79 73 20 63 61 6c 6c 65 64 20 62 65  always called be
27390 66 6f 72 65 20 73 71 6c 69 74 65 33 45 78 70 72  fore sqlite3Expr
273a0 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  AnalyzeAggregate
273b0 73 28 29 20 61 6e 64 20 73 6f 20 74 68 65 0a 20  s() and so the. 
273c0 20 2a 2a 20 54 4b 5f 43 4f 4c 55 4d 4e 73 20 68   ** TK_COLUMNs h
273d0 61 76 65 20 6e 6f 74 20 79 65 74 20 62 65 65 6e  ave not yet been
273e0 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20   converted into 
273f0 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 2e 20 20  TK_AGG_COLUMN.  
27400 49 66 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 46  If.  ** sqlite3F
27410 75 6e 63 74 69 6f 6e 55 73 65 73 54 68 69 73 53  unctionUsesThisS
27420 72 63 28 29 20 69 73 20 75 73 65 64 20 64 69 66  rc() is used dif
27430 66 65 72 65 6e 74 6c 79 20 69 6e 20 74 68 65 20  ferently in the 
27440 66 75 74 75 72 65 2c 20 74 68 65 0a 20 20 2a 2a  future, the.  **
27450 20 4e 45 56 45 52 28 29 20 77 69 6c 6c 20 6e 65   NEVER() will ne
27460 65 64 20 74 6f 20 62 65 20 72 65 6d 6f 76 65 64  ed to be removed
27470 2e 20 2a 2f 0a 20 20 69 66 28 20 70 45 78 70 72  . */.  if( pExpr
27480 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
27490 7c 7c 20 4e 45 56 45 52 28 70 45 78 70 72 2d 3e  || NEVER(pExpr->
274a0 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  op==TK_AGG_COLUM
274b0 4e 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  N) ){.    int i;
274c0 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63 43  .    struct SrcC
274d0 6f 75 6e 74 20 2a 70 20 3d 20 70 57 61 6c 6b 65  ount *p = pWalke
274e0 72 2d 3e 75 2e 70 53 72 63 43 6f 75 6e 74 3b 0a  r->u.pSrcCount;.
274f0 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72      SrcList *pSr
27500 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20  c = p->pSrc;.   
27510 20 69 6e 74 20 6e 53 72 63 20 3d 20 70 53 72 63   int nSrc = pSrc
27520 20 3f 20 70 53 72 63 2d 3e 6e 53 72 63 20 3a 20   ? pSrc->nSrc : 
27530 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  0;.    for(i=0; 
27540 69 3c 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20  i<nSrc; i++){.  
27550 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69      if( pExpr->i
27560 54 61 62 6c 65 3d 3d 70 53 72 63 2d 3e 61 5b 69  Table==pSrc->a[i
27570 5d 2e 69 43 75 72 73 6f 72 20 29 20 62 72 65 61  ].iCursor ) brea
27580 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  k;.    }.    if(
27590 20 69 3c 6e 53 72 63 20 29 7b 0a 20 20 20 20 20   i<nSrc ){.     
275a0 20 70 2d 3e 6e 54 68 69 73 2b 2b 3b 0a 20 20 20   p->nThis++;.   
275b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d   }else{.      p-
275c0 3e 6e 4f 74 68 65 72 2b 2b 3b 0a 20 20 20 20 7d  >nOther++;.    }
275d0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 57 52  .  }.  return WR
275e0 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f  C_Continue;.}../
275f0 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 69  *.** Determine i
27600 66 20 61 6e 79 20 6f 66 20 74 68 65 20 61 72 67  f any of the arg
27610 75 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 70 45  uments to the pE
27620 78 70 72 20 46 75 6e 63 74 69 6f 6e 20 72 65 66  xpr Function ref
27630 65 72 65 6e 63 65 0a 2a 2a 20 70 53 72 63 4c 69  erence.** pSrcLi
27640 73 74 2e 20 20 52 65 74 75 72 6e 20 74 72 75 65  st.  Return true
27650 20 69 66 20 74 68 65 79 20 64 6f 2e 20 20 41 6c   if they do.  Al
27660 73 6f 20 72 65 74 75 72 6e 20 74 72 75 65 20 69  so return true i
27670 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 0a 2a  f the function.*
27680 2a 20 68 61 73 20 6e 6f 20 61 72 67 75 6d 65 6e  * has no argumen
27690 74 73 20 6f 72 20 68 61 73 20 6f 6e 6c 79 20 63  ts or has only c
276a0 6f 6e 73 74 61 6e 74 20 61 72 67 75 6d 65 6e 74  onstant argument
276b0 73 2e 20 20 52 65 74 75 72 6e 20 66 61 6c 73 65  s.  Return false
276c0 20 69 66 20 70 45 78 70 72 0a 2a 2a 20 72 65 66   if pExpr.** ref
276d0 65 72 65 6e 63 65 73 20 63 6f 6c 75 6d 6e 73 20  erences columns 
276e0 62 75 74 20 6e 6f 74 20 63 6f 6c 75 6d 6e 73 20  but not columns 
276f0 6f 66 20 74 61 62 6c 65 73 20 66 6f 75 6e 64 20  of tables found 
27700 69 6e 20 70 53 72 63 4c 69 73 74 2e 0a 2a 2f 0a  in pSrcList..*/.
27710 69 6e 74 20 73 71 6c 69 74 65 33 46 75 6e 63 74  int sqlite3Funct
27720 69 6f 6e 55 73 65 73 54 68 69 73 53 72 63 28 45  ionUsesThisSrc(E
27730 78 70 72 20 2a 70 45 78 70 72 2c 20 53 72 63 4c  xpr *pExpr, SrcL
27740 69 73 74 20 2a 70 53 72 63 4c 69 73 74 29 7b 0a  ist *pSrcList){.
27750 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 73 74    Walker w;.  st
27760 72 75 63 74 20 53 72 63 43 6f 75 6e 74 20 63 6e  ruct SrcCount cn
27770 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  t;.  assert( pEx
27780 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46  pr->op==TK_AGG_F
27790 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 6d 65 6d  UNCTION );.  mem
277a0 73 65 74 28 26 77 2c 20 30 2c 20 73 69 7a 65 6f  set(&w, 0, sizeo
277b0 66 28 77 29 29 3b 0a 20 20 77 2e 78 45 78 70 72  f(w));.  w.xExpr
277c0 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72 53  Callback = exprS
277d0 72 63 43 6f 75 6e 74 3b 0a 20 20 77 2e 75 2e 70  rcCount;.  w.u.p
277e0 53 72 63 43 6f 75 6e 74 20 3d 20 26 63 6e 74 3b  SrcCount = &cnt;
277f0 0a 20 20 63 6e 74 2e 70 53 72 63 20 3d 20 70 53  .  cnt.pSrc = pS
27800 72 63 4c 69 73 74 3b 0a 20 20 63 6e 74 2e 6e 54  rcList;.  cnt.nT
27810 68 69 73 20 3d 20 30 3b 0a 20 20 63 6e 74 2e 6e  his = 0;.  cnt.n
27820 4f 74 68 65 72 20 3d 20 30 3b 0a 20 20 73 71 6c  Other = 0;.  sql
27830 69 74 65 33 57 61 6c 6b 45 78 70 72 4c 69 73 74  ite3WalkExprList
27840 28 26 77 2c 20 70 45 78 70 72 2d 3e 78 2e 70 4c  (&w, pExpr->x.pL
27850 69 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 63  ist);.  return c
27860 6e 74 2e 6e 54 68 69 73 3e 30 20 7c 7c 20 63 6e  nt.nThis>0 || cn
27870 74 2e 6e 4f 74 68 65 72 3d 3d 30 3b 0a 7d 0a 0a  t.nOther==0;.}..
27880 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20  /*.** Add a new 
27890 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 70  element to the p
278a0 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20  AggInfo->aCol[] 
278b0 61 72 72 61 79 2e 20 20 52 65 74 75 72 6e 20 74  array.  Return t
278c0 68 65 20 69 6e 64 65 78 20 6f 66 0a 2a 2a 20 74  he index of.** t
278d0 68 65 20 6e 65 77 20 65 6c 65 6d 65 6e 74 2e 20  he new element. 
278e0 20 52 65 74 75 72 6e 20 61 20 6e 65 67 61 74 69   Return a negati
278f0 76 65 20 6e 75 6d 62 65 72 20 69 66 20 6d 61 6c  ve number if mal
27900 6c 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74  loc fails..*/.st
27910 61 74 69 63 20 69 6e 74 20 61 64 64 41 67 67 49  atic int addAggI
27920 6e 66 6f 43 6f 6c 75 6d 6e 28 73 71 6c 69 74 65  nfoColumn(sqlite
27930 33 20 2a 64 62 2c 20 41 67 67 49 6e 66 6f 20 2a  3 *db, AggInfo *
27940 70 49 6e 66 6f 29 7b 0a 20 20 69 6e 74 20 69 3b  pInfo){.  int i;
27950 0a 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 20 3d  .  pInfo->aCol =
27960 20 73 71 6c 69 74 65 33 41 72 72 61 79 41 6c 6c   sqlite3ArrayAll
27970 6f 63 61 74 65 28 0a 20 20 20 20 20 20 20 64 62  ocate(.       db
27980 2c 0a 20 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e  ,.       pInfo->
27990 61 43 6f 6c 2c 0a 20 20 20 20 20 20 20 73 69 7a  aCol,.       siz
279a0 65 6f 66 28 70 49 6e 66 6f 2d 3e 61 43 6f 6c 5b  eof(pInfo->aCol[
279b0 30 5d 29 2c 0a 20 20 20 20 20 20 20 26 70 49 6e  0]),.       &pIn
279c0 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 2c 0a 20 20 20  fo->nColumn,.   
279d0 20 20 20 20 26 69 0a 20 20 29 3b 0a 20 20 72 65      &i.  );.  re
279e0 74 75 72 6e 20 69 3b 0a 7d 20 20 20 20 0a 0a 2f  turn i;.}    ../
279f0 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 65  *.** Add a new e
27a00 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 70 41  lement to the pA
27a10 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 20  ggInfo->aFunc[] 
27a20 61 72 72 61 79 2e 20 20 52 65 74 75 72 6e 20 74  array.  Return t
27a30 68 65 20 69 6e 64 65 78 20 6f 66 0a 2a 2a 20 74  he index of.** t
27a40 68 65 20 6e 65 77 20 65 6c 65 6d 65 6e 74 2e 20  he new element. 
27a50 20 52 65 74 75 72 6e 20 61 20 6e 65 67 61 74 69   Return a negati
27a60 76 65 20 6e 75 6d 62 65 72 20 69 66 20 6d 61 6c  ve number if mal
27a70 6c 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74  loc fails..*/.st
27a80 61 74 69 63 20 69 6e 74 20 61 64 64 41 67 67 49  atic int addAggI
27a90 6e 66 6f 46 75 6e 63 28 73 71 6c 69 74 65 33 20  nfoFunc(sqlite3 
27aa0 2a 64 62 2c 20 41 67 67 49 6e 66 6f 20 2a 70 49  *db, AggInfo *pI
27ab0 6e 66 6f 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  nfo){.  int i;. 
27ac0 20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 20 3d 20   pInfo->aFunc = 
27ad0 73 71 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f  sqlite3ArrayAllo
27ae0 63 61 74 65 28 0a 20 20 20 20 20 20 20 64 62 2c  cate(.       db,
27af0 20 0a 20 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e   .       pInfo->
27b00 61 46 75 6e 63 2c 0a 20 20 20 20 20 20 20 73 69  aFunc,.       si
27b10 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 61 46 75 6e  zeof(pInfo->aFun
27b20 63 5b 30 5d 29 2c 0a 20 20 20 20 20 20 20 26 70  c[0]),.       &p
27b30 49 6e 66 6f 2d 3e 6e 46 75 6e 63 2c 0a 20 20 20  Info->nFunc,.   
27b40 20 20 20 20 26 69 0a 20 20 29 3b 0a 20 20 72 65      &i.  );.  re
27b50 74 75 72 6e 20 69 3b 0a 7d 20 20 20 20 0a 0a 2f  turn i;.}    ../
27b60 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65  *.** This is the
27b70 20 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 66   xExprCallback f
27b80 6f 72 20 61 20 74 72 65 65 20 77 61 6c 6b 65 72  or a tree walker
27b90 2e 20 20 49 74 20 69 73 20 75 73 65 64 20 74 6f  .  It is used to
27ba0 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 73 71  .** implement sq
27bb0 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65  lite3ExprAnalyze
27bc0 41 67 67 72 65 67 61 74 65 73 28 29 2e 20 20 53  Aggregates().  S
27bd0 65 65 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e  ee sqlite3ExprAn
27be0 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 0a  alyzeAggregates.
27bf0 2a 2a 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  ** for additiona
27c00 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a  l information..*
27c10 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6e 61  /.static int ana
27c20 6c 79 7a 65 41 67 67 72 65 67 61 74 65 28 57 61  lyzeAggregate(Wa
27c30 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45  lker *pWalker, E
27c40 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69  xpr *pExpr){.  i
27c50 6e 74 20 69 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74  nt i;.  NameCont
27c60 65 78 74 20 2a 70 4e 43 20 3d 20 70 57 61 6c 6b  ext *pNC = pWalk
27c70 65 72 2d 3e 75 2e 70 4e 43 3b 0a 20 20 50 61 72  er->u.pNC;.  Par
27c80 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 4e 43  se *pParse = pNC
27c90 2d 3e 70 50 61 72 73 65 3b 0a 20 20 53 72 63 4c  ->pParse;.  SrcL
27ca0 69 73 74 20 2a 70 53 72 63 4c 69 73 74 20 3d 20  ist *pSrcList = 
27cb0 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3b 0a 20  pNC->pSrcList;. 
27cc0 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e   AggInfo *pAggIn
27cd0 66 6f 20 3d 20 70 4e 43 2d 3e 70 41 67 67 49 6e  fo = pNC->pAggIn
27ce0 66 6f 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 70  fo;..  switch( p
27cf0 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  Expr->op ){.    
27d00 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55  case TK_AGG_COLU
27d10 4d 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  MN:.    case TK_
27d20 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20  COLUMN: {.      
27d30 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
27d40 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55  >op==TK_AGG_COLU
27d50 4d 4e 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  MN );.      test
27d60 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
27d70 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20  =TK_COLUMN );.  
27d80 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20      /* Check to 
27d90 73 65 65 20 69 66 20 74 68 65 20 63 6f 6c 75 6d  see if the colum
27da0 6e 20 69 73 20 69 6e 20 6f 6e 65 20 6f 66 20 74  n is in one of t
27db0 68 65 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65  he tables in the
27dc0 20 46 52 4f 4d 0a 20 20 20 20 20 20 2a 2a 20 63   FROM.      ** c
27dd0 6c 61 75 73 65 20 6f 66 20 74 68 65 20 61 67 67  lause of the agg
27de0 72 65 67 61 74 65 20 71 75 65 72 79 20 2a 2f 0a  regate query */.
27df0 20 20 20 20 20 20 69 66 28 20 41 4c 57 41 59 53        if( ALWAYS
27e00 28 70 53 72 63 4c 69 73 74 21 3d 30 29 20 29 7b  (pSrcList!=0) ){
27e10 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20  .        struct 
27e20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
27e30 74 65 6d 20 3d 20 70 53 72 63 4c 69 73 74 2d 3e  tem = pSrcList->
27e40 61 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  a;.        for(i
27e50 3d 30 3b 20 69 3c 70 53 72 63 4c 69 73 74 2d 3e  =0; i<pSrcList->
27e60 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d  nSrc; i++, pItem
27e70 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  ++){.          s
27e80 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f  truct AggInfo_co
27e90 6c 20 2a 70 43 6f 6c 3b 0a 20 20 20 20 20 20 20  l *pCol;.       
27ea0 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
27eb0 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
27ec0 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c  r, EP_TokenOnly|
27ed0 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a 20  EP_Reduced) );. 
27ee0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78           if( pEx
27ef0 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 49 74 65  pr->iTable==pIte
27f00 6d 2d 3e 69 43 75 72 73 6f 72 20 29 7b 0a 20 20  m->iCursor ){.  
27f10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
27f20 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f  we reach this po
27f30 69 6e 74 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  int, it means th
27f40 61 74 20 70 45 78 70 72 20 72 65 66 65 72 73 20  at pExpr refers 
27f50 74 6f 20 61 20 74 61 62 6c 65 0a 20 20 20 20 20  to a table.     
27f60 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 69         ** that i
27f70 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  s in the FROM cl
27f80 61 75 73 65 20 6f 66 20 74 68 65 20 61 67 67 72  ause of the aggr
27f90 65 67 61 74 65 20 71 75 65 72 79 2e 20 20 0a 20  egate query.  . 
27fa0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 0a 20 20             **.  
27fb0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 4d 61 6b            ** Mak
27fc0 65 20 61 6e 20 65 6e 74 72 79 20 66 6f 72 20 74  e an entry for t
27fd0 68 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 41 67  he column in pAg
27fe0 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 69 66  gInfo->aCol[] if
27ff0 20 74 68 65 72 65 0a 20 20 20 20 20 20 20 20 20   there.         
28000 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61 6e 20     ** is not an 
28010 65 6e 74 72 79 20 74 68 65 72 65 20 61 6c 72 65  entry there alre
28020 61 64 79 2e 0a 20 20 20 20 20 20 20 20 20 20 20  ady..           
28030 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
28040 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20 20 20 20  int k;.         
28050 20 20 20 70 43 6f 6c 20 3d 20 70 41 67 67 49 6e     pCol = pAggIn
28060 66 6f 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 20 20  fo->aCol;.      
28070 20 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b        for(k=0; k
28080 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75  <pAggInfo->nColu
28090 6d 6e 3b 20 6b 2b 2b 2c 20 70 43 6f 6c 2b 2b 29  mn; k++, pCol++)
280a0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
280b0 69 66 28 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65  if( pCol->iTable
280c0 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20  ==pExpr->iTable 
280d0 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  &&.             
280e0 20 20 20 20 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75       pCol->iColu
280f0 6d 6e 3d 3d 70 45 78 70 72 2d 3e 69 43 6f 6c 75  mn==pExpr->iColu
28100 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  mn ){.          
28110 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
28120 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
28130 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
28140 20 20 20 20 20 20 20 69 66 28 20 28 6b 3e 3d 70         if( (k>=p
28150 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e  AggInfo->nColumn
28160 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26  ).             &
28170 26 20 28 6b 20 3d 20 61 64 64 41 67 67 49 6e 66  & (k = addAggInf
28180 6f 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2d 3e  oColumn(pParse->
28190 64 62 2c 20 70 41 67 67 49 6e 66 6f 29 29 3e 3d  db, pAggInfo))>=
281a0 30 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 29  0 .            )
281b0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
281c0 70 43 6f 6c 20 3d 20 26 70 41 67 67 49 6e 66 6f  pCol = &pAggInfo
281d0 2d 3e 61 43 6f 6c 5b 6b 5d 3b 0a 20 20 20 20 20  ->aCol[k];.     
281e0 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70           pCol->p
281f0 54 61 62 20 3d 20 70 45 78 70 72 2d 3e 70 54 61  Tab = pExpr->pTa
28200 62 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  b;.             
28210 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 20 3d 20   pCol->iTable = 
28220 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20  pExpr->iTable;. 
28230 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
28240 6c 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 70 45 78  l->iColumn = pEx
28250 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20  pr->iColumn;.   
28260 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
28270 3e 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65  >iMem = ++pParse
28280 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20  ->nMem;.        
28290 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72        pCol->iSor
282a0 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a  terColumn = -1;.
282b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
282c0 6f 6c 2d 3e 70 45 78 70 72 20 3d 20 70 45 78 70  ol->pExpr = pExp
282d0 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r;.             
282e0 20 69 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e 70   if( pAggInfo->p
282f0 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20  GroupBy ){.     
28300 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6a             int j
28310 2c 20 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20  , n;.           
28320 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70       ExprList *p
28330 47 42 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 70  GB = pAggInfo->p
28340 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 20 20 20  GroupBy;.       
28350 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20           struct 
28360 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
28370 54 65 72 6d 20 3d 20 70 47 42 2d 3e 61 3b 0a 20  Term = pGB->a;. 
28380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e                 n
28390 20 3d 20 70 47 42 2d 3e 6e 45 78 70 72 3b 0a 20   = pGB->nExpr;. 
283a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66                 f
283b0 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 3b 20 6a 2b 2b  or(j=0; j<n; j++
283c0 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  , pTerm++){.    
283d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45 78                Ex
283e0 70 72 20 2a 70 45 20 3d 20 70 54 65 72 6d 2d 3e  pr *pE = pTerm->
283f0 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20  pExpr;.         
28400 20 20 20 20 20 20 20 20 20 69 66 28 20 70 45 2d           if( pE-
28410 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26  >op==TK_COLUMN &
28420 26 20 70 45 2d 3e 69 54 61 62 6c 65 3d 3d 70 45  & pE->iTable==pE
28430 78 70 72 2d 3e 69 54 61 62 6c 65 20 26 26 0a 20  xpr->iTable &&. 
28440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28450 20 20 20 20 20 70 45 2d 3e 69 43 6f 6c 75 6d 6e       pE->iColumn
28460 3d 3d 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ==pExpr->iColumn
28470 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
28480 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53          pCol->iS
28490 6f 72 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 6a 3b  orterColumn = j;
284a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
284b0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
284c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
284d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
284e0 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
284f0 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
28500 69 66 28 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65  if( pCol->iSorte
28510 72 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20  rColumn<0 ){.   
28520 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
28530 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e  l->iSorterColumn
28540 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 53 6f   = pAggInfo->nSo
28550 72 74 69 6e 67 43 6f 6c 75 6d 6e 2b 2b 3b 0a 20  rtingColumn++;. 
28560 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
28570 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
28580 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 72           /* Ther
28590 65 20 69 73 20 6e 6f 77 20 61 6e 20 65 6e 74 72  e is now an entr
285a0 79 20 66 6f 72 20 70 45 78 70 72 20 69 6e 20 70  y for pExpr in p
285b0 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20  AggInfo->aCol[] 
285c0 28 65 69 74 68 65 72 0a 20 20 20 20 20 20 20 20  (either.        
285d0 20 20 20 20 2a 2a 20 62 65 63 61 75 73 65 20 69      ** because i
285e0 74 20 77 61 73 20 74 68 65 72 65 20 62 65 66 6f  t was there befo
285f0 72 65 20 6f 72 20 62 65 63 61 75 73 65 20 77 65  re or because we
28600 20 6a 75 73 74 20 63 72 65 61 74 65 64 20 69 74   just created it
28610 29 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  )..            *
28620 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20 70 45  * Convert the pE
28630 78 70 72 20 74 6f 20 62 65 20 61 20 54 4b 5f 41  xpr to be a TK_A
28640 47 47 5f 43 4f 4c 55 4d 4e 20 72 65 66 65 72 72  GG_COLUMN referr
28650 69 6e 67 20 74 6f 20 74 68 61 74 0a 20 20 20 20  ing to that.    
28660 20 20 20 20 20 20 20 20 2a 2a 20 70 41 67 67 49          ** pAggI
28670 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 65 6e 74 72  nfo->aCol[] entr
28680 79 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  y..            *
28690 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 45 78  /.            Ex
286a0 70 72 53 65 74 56 56 41 50 72 6f 70 65 72 74 79  prSetVVAProperty
286b0 28 70 45 78 70 72 2c 20 45 50 5f 4e 6f 52 65 64  (pExpr, EP_NoRed
286c0 75 63 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  uce);.          
286d0 20 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66    pExpr->pAggInf
286e0 6f 20 3d 20 70 41 67 67 49 6e 66 6f 3b 0a 20 20  o = pAggInfo;.  
286f0 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
28700 3e 6f 70 20 3d 20 54 4b 5f 41 47 47 5f 43 4f 4c  >op = TK_AGG_COL
28710 55 4d 4e 3b 0a 20 20 20 20 20 20 20 20 20 20 20  UMN;.           
28720 20 70 45 78 70 72 2d 3e 69 41 67 67 20 3d 20 28   pExpr->iAgg = (
28730 69 31 36 29 6b 3b 0a 20 20 20 20 20 20 20 20 20  i16)k;.         
28740 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
28750 20 20 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20 70      } /* endif p
28760 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 49  Expr->iTable==pI
28770 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 2a 2f 0a  tem->iCursor */.
28780 20 20 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64          } /* end
28790 20 6c 6f 6f 70 20 6f 76 65 72 20 70 53 72 63 4c   loop over pSrcL
287a0 69 73 74 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20  ist */.      }. 
287b0 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f       return WRC_
287c0 50 72 75 6e 65 3b 0a 20 20 20 20 7d 0a 20 20 20  Prune;.    }.   
287d0 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e   case TK_AGG_FUN
287e0 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 69  CTION: {.      i
287f0 66 28 20 28 70 4e 43 2d 3e 6e 63 46 6c 61 67 73  f( (pNC->ncFlags
28800 20 26 20 4e 43 5f 49 6e 41 67 67 46 75 6e 63 29   & NC_InAggFunc)
28810 3d 3d 30 0a 20 20 20 20 20 20 20 26 26 20 70 57  ==0.       && pW
28820 61 6c 6b 65 72 2d 3e 77 61 6c 6b 65 72 44 65 70  alker->walkerDep
28830 74 68 3d 3d 70 45 78 70 72 2d 3e 6f 70 32 0a 20  th==pExpr->op2. 
28840 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
28850 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  /* Check to see 
28860 69 66 20 70 45 78 70 72 20 69 73 20 61 20 64 75  if pExpr is a du
28870 70 6c 69 63 61 74 65 20 6f 66 20 61 6e 6f 74 68  plicate of anoth
28880 65 72 20 61 67 67 72 65 67 61 74 65 20 0a 20 20  er aggregate .  
28890 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f        ** functio
288a0 6e 20 74 68 61 74 20 69 73 20 61 6c 72 65 61 64  n that is alread
288b0 79 20 69 6e 20 74 68 65 20 70 41 67 67 49 6e 66  y in the pAggInf
288c0 6f 20 73 74 72 75 63 74 75 72 65 0a 20 20 20 20  o structure.    
288d0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 73      */.        s
288e0 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75  truct AggInfo_fu
288f0 6e 63 20 2a 70 49 74 65 6d 20 3d 20 70 41 67 67  nc *pItem = pAgg
28900 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 0a 20 20 20  Info->aFunc;.   
28910 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
28920 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b  pAggInfo->nFunc;
28930 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i++, pItem++){.
28940 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71            if( sq
28950 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65  lite3ExprCompare
28960 28 70 49 74 65 6d 2d 3e 70 45 78 70 72 2c 20 70  (pItem->pExpr, p
28970 45 78 70 72 2c 20 2d 31 29 3d 3d 30 20 29 7b 0a  Expr, -1)==0 ){.
28980 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
28990 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  k;.          }. 
289a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
289b0 20 69 66 28 20 69 3e 3d 70 41 67 67 49 6e 66 6f   if( i>=pAggInfo
289c0 2d 3e 6e 46 75 6e 63 20 29 7b 0a 20 20 20 20 20  ->nFunc ){.     
289d0 20 20 20 20 20 2f 2a 20 70 45 78 70 72 20 69 73       /* pExpr is
289e0 20 6f 72 69 67 69 6e 61 6c 2e 20 20 4d 61 6b 65   original.  Make
289f0 20 61 20 6e 65 77 20 65 6e 74 72 79 20 69 6e 20   a new entry in 
28a00 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b  pAggInfo->aFunc[
28a10 5d 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ].          */. 
28a20 20 20 20 20 20 20 20 20 20 75 38 20 65 6e 63 20           u8 enc 
28a30 3d 20 45 4e 43 28 70 50 61 72 73 65 2d 3e 64 62  = ENC(pParse->db
28a40 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 20 3d  );.          i =
28a50 20 61 64 64 41 67 67 49 6e 66 6f 46 75 6e 63 28   addAggInfoFunc(
28a60 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 41 67 67  pParse->db, pAgg
28a70 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 20  Info);.         
28a80 20 69 66 28 20 69 3e 3d 30 20 29 7b 0a 20 20 20   if( i>=0 ){.   
28a90 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
28aa0 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
28ab0 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
28ac0 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20  elect) );.      
28ad0 20 20 20 20 20 20 70 49 74 65 6d 20 3d 20 26 70        pItem = &p
28ae0 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69  AggInfo->aFunc[i
28af0 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ];.            p
28b00 49 74 65 6d 2d 3e 70 45 78 70 72 20 3d 20 70 45  Item->pExpr = pE
28b10 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20  xpr;.           
28b20 20 70 49 74 65 6d 2d 3e 69 4d 65 6d 20 3d 20 2b   pItem->iMem = +
28b30 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
28b40 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
28b50 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
28b60 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e  rty(pExpr, EP_In
28b70 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20  tValue) );.     
28b80 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 46         pItem->pF
28b90 75 6e 63 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  unc = sqlite3Fin
28ba0 64 46 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65  dFunction(pParse
28bb0 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20  ->db,.          
28bc0 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
28bd0 75 2e 7a 54 6f 6b 65 6e 2c 20 0a 20 20 20 20 20  u.zToken, .     
28be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
28bf0 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20 3f 20 70  xpr->x.pList ? p
28c00 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e  Expr->x.pList->n
28c10 45 78 70 72 20 3a 20 30 2c 20 65 6e 63 2c 20 30  Expr : 0, enc, 0
28c20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
28c30 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 20  f( pExpr->flags 
28c40 26 20 45 50 5f 44 69 73 74 69 6e 63 74 20 29 7b  & EP_Distinct ){
28c50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
28c60 49 74 65 6d 2d 3e 69 44 69 73 74 69 6e 63 74 20  Item->iDistinct 
28c70 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
28c80 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65  ;.            }e
28c90 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
28ca0 20 20 20 70 49 74 65 6d 2d 3e 69 44 69 73 74 69     pItem->iDisti
28cb0 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  nct = -1;.      
28cc0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
28cd0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
28ce0 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 70 45        /* Make pE
28cf0 78 70 72 20 70 6f 69 6e 74 20 74 6f 20 74 68 65  xpr point to the
28d00 20 61 70 70 72 6f 70 72 69 61 74 65 20 70 41 67   appropriate pAg
28d10 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 20 65  gInfo->aFunc[] e
28d20 6e 74 72 79 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ntry.        */.
28d30 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
28d40 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
28d50 28 70 45 78 70 72 2c 20 45 50 5f 54 6f 6b 65 6e  (pExpr, EP_Token
28d60 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64 29  Only|EP_Reduced)
28d70 20 29 3b 0a 20 20 20 20 20 20 20 20 45 78 70 72   );.        Expr
28d80 53 65 74 56 56 41 50 72 6f 70 65 72 74 79 28 70  SetVVAProperty(p
28d90 45 78 70 72 2c 20 45 50 5f 4e 6f 52 65 64 75 63  Expr, EP_NoReduc
28da0 65 29 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70  e);.        pExp
28db0 72 2d 3e 69 41 67 67 20 3d 20 28 69 31 36 29 69  r->iAgg = (i16)i
28dc0 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d  ;.        pExpr-
28dd0 3e 70 41 67 67 49 6e 66 6f 20 3d 20 70 41 67 67  >pAggInfo = pAgg
28de0 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 72 65  Info;.        re
28df0 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a  turn WRC_Prune;.
28e00 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
28e10 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f       return WRC_
28e20 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  Continue;.      
28e30 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
28e40 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75  turn WRC_Continu
28e50 65 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20  e;.}.static int 
28e60 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  analyzeAggregate
28e70 73 49 6e 53 65 6c 65 63 74 28 57 61 6c 6b 65 72  sInSelect(Walker
28e80 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63   *pWalker, Selec
28e90 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 55  t *pSelect){.  U
28ea0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
28eb0 70 57 61 6c 6b 65 72 29 3b 0a 20 20 55 4e 55 53  pWalker);.  UNUS
28ec0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 53 65  ED_PARAMETER(pSe
28ed0 6c 65 63 74 29 3b 0a 20 20 72 65 74 75 72 6e 20  lect);.  return 
28ee0 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a  WRC_Continue;.}.
28ef0 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 74  ./*.** Analyze t
28f00 68 65 20 70 45 78 70 72 20 65 78 70 72 65 73 73  he pExpr express
28f10 69 6f 6e 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20  ion looking for 
28f20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
28f30 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f 72 20 76  ons and.** for v
28f40 61 72 69 61 62 6c 65 73 20 74 68 61 74 20 6e 65  ariables that ne
28f50 65 64 20 74 6f 20 62 65 20 61 64 64 65 64 20 74  ed to be added t
28f60 6f 20 41 67 67 49 6e 66 6f 20 6f 62 6a 65 63 74  o AggInfo object
28f70 20 74 68 61 74 20 70 4e 43 2d 3e 70 41 67 67 49   that pNC->pAggI
28f80 6e 66 6f 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f  nfo.** points to
28f90 2e 20 20 41 64 64 69 74 69 6f 6e 61 6c 20 65 6e  .  Additional en
28fa0 74 72 69 65 73 20 61 72 65 20 6d 61 64 65 20 6f  tries are made o
28fb0 6e 20 74 68 65 20 41 67 67 49 6e 66 6f 20 6f 62  n the AggInfo ob
28fc0 6a 65 63 74 20 61 73 0a 2a 2a 20 6e 65 63 65 73  ject as.** neces
28fd0 73 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  sary..**.** This
28fe0 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20   routine should 
28ff0 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 61  only be called a
29000 66 74 65 72 20 74 68 65 20 65 78 70 72 65 73 73  fter the express
29010 69 6f 6e 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20  ion has been.** 
29020 61 6e 61 6c 79 7a 65 64 20 62 79 20 73 71 6c 69  analyzed by sqli
29030 74 65 33 52 65 73 6f 6c 76 65 45 78 70 72 4e 61  te3ResolveExprNa
29040 6d 65 73 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73  mes()..*/.void s
29050 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
29060 65 41 67 67 72 65 67 61 74 65 73 28 4e 61 6d 65  eAggregates(Name
29070 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 45 78  Context *pNC, Ex
29080 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 57 61  pr *pExpr){.  Wa
29090 6c 6b 65 72 20 77 3b 0a 20 20 6d 65 6d 73 65 74  lker w;.  memset
290a0 28 26 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77  (&w, 0, sizeof(w
290b0 29 29 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c  ));.  w.xExprCal
290c0 6c 62 61 63 6b 20 3d 20 61 6e 61 6c 79 7a 65 41  lback = analyzeA
290d0 67 67 72 65 67 61 74 65 3b 0a 20 20 77 2e 78 53  ggregate;.  w.xS
290e0 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20  electCallback = 
290f0 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  analyzeAggregate
29100 73 49 6e 53 65 6c 65 63 74 3b 0a 20 20 77 2e 75  sInSelect;.  w.u
29110 2e 70 4e 43 20 3d 20 70 4e 43 3b 0a 20 20 61 73  .pNC = pNC;.  as
29120 73 65 72 74 28 20 70 4e 43 2d 3e 70 53 72 63 4c  sert( pNC->pSrcL
29130 69 73 74 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69  ist!=0 );.  sqli
29140 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77 2c 20  te3WalkExpr(&w, 
29150 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pExpr);.}../*.**
29160 20 43 61 6c 6c 20 73 71 6c 69 74 65 33 45 78 70   Call sqlite3Exp
29170 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74  rAnalyzeAggregat
29180 65 73 28 29 20 66 6f 72 20 65 76 65 72 79 20 65  es() for every e
29190 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 61 6e 0a  xpression in an.
291a0 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  ** expression li
291b0 73 74 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  st.  Return the 
291c0 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73  number of errors
291d0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
291e0 72 6f 72 20 69 73 20 66 6f 75 6e 64 2c 20 74 68  ror is found, th
291f0 65 20 61 6e 61 6c 79 73 69 73 20 69 73 20 63 75  e analysis is cu
29200 74 20 73 68 6f 72 74 2e 0a 2a 2f 0a 76 6f 69 64  t short..*/.void
29210 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
29220 79 7a 65 41 67 67 4c 69 73 74 28 4e 61 6d 65 43  yzeAggList(NameC
29230 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 45 78 70  ontext *pNC, Exp
29240 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20  rList *pList){. 
29250 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
29260 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
29270 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69  int i;.  if( pLi
29280 73 74 20 29 7b 0a 20 20 20 20 66 6f 72 28 70 49  st ){.    for(pI
29290 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d  tem=pList->a, i=
292a0 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70  0; i<pList->nExp
292b0 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  r; i++, pItem++)
292c0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
292d0 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67  xprAnalyzeAggreg
292e0 61 74 65 73 28 70 4e 43 2c 20 70 49 74 65 6d 2d  ates(pNC, pItem-
292f0 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20  >pExpr);.    }. 
29300 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f   }.}../*.** Allo
29310 63 61 74 65 20 61 20 73 69 6e 67 6c 65 20 6e 65  cate a single ne
29320 77 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 75  w register for u
29330 73 65 20 74 6f 20 68 6f 6c 64 20 73 6f 6d 65 20  se to hold some 
29340 69 6e 74 65 72 6d 65 64 69 61 74 65 20 72 65 73  intermediate res
29350 75 6c 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ult..*/.int sqli
29360 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 50 61  te3GetTempReg(Pa
29370 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
29380 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d  if( pParse->nTem
29390 70 52 65 67 3d 3d 30 20 29 7b 0a 20 20 20 20 72  pReg==0 ){.    r
293a0 65 74 75 72 6e 20 2b 2b 70 50 61 72 73 65 2d 3e  eturn ++pParse->
293b0 6e 4d 65 6d 3b 0a 20 20 7d 0a 20 20 72 65 74 75  nMem;.  }.  retu
293c0 72 6e 20 70 50 61 72 73 65 2d 3e 61 54 65 6d 70  rn pParse->aTemp
293d0 52 65 67 5b 2d 2d 70 50 61 72 73 65 2d 3e 6e 54  Reg[--pParse->nT
293e0 65 6d 70 52 65 67 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a  empReg];.}../*.*
293f0 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20 61 20 72  * Deallocate a r
29400 65 67 69 73 74 65 72 2c 20 6d 61 6b 69 6e 67 20  egister, making 
29410 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 72 65  available for re
29420 75 73 65 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68  use for some oth
29430 65 72 0a 2a 2a 20 70 75 72 70 6f 73 65 2e 0a 2a  er.** purpose..*
29440 2a 0a 2a 2a 20 49 66 20 61 20 72 65 67 69 73 74  *.** If a regist
29450 65 72 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  er is currently 
29460 62 65 69 6e 67 20 75 73 65 64 20 62 79 20 74 68  being used by th
29470 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2c 20  e column cache, 
29480 74 68 65 6e 0a 2a 2a 20 74 68 65 20 64 65 61 6c  then.** the deal
29490 6c 6f 63 61 74 69 6f 6e 20 69 73 20 64 65 66 65  location is defe
294a0 72 72 65 64 20 75 6e 74 69 6c 20 74 68 65 20 63  rred until the c
294b0 6f 6c 75 6d 6e 20 63 61 63 68 65 20 6c 69 6e 65  olumn cache line
294c0 20 74 68 61 74 20 75 73 65 73 0a 2a 2a 20 74 68   that uses.** th
294d0 65 20 72 65 67 69 73 74 65 72 20 62 65 63 6f 6d  e register becom
294e0 65 73 20 73 74 61 6c 65 2e 0a 2a 2f 0a 76 6f 69  es stale..*/.voi
294f0 64 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65  d sqlite3Release
29500 54 65 6d 70 52 65 67 28 50 61 72 73 65 20 2a 70  TempReg(Parse *p
29510 50 61 72 73 65 2c 20 69 6e 74 20 69 52 65 67 29  Parse, int iReg)
29520 7b 0a 20 20 69 66 28 20 69 52 65 67 20 26 26 20  {.  if( iReg && 
29530 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67  pParse->nTempReg
29540 3c 41 72 72 61 79 53 69 7a 65 28 70 50 61 72 73  <ArraySize(pPars
29550 65 2d 3e 61 54 65 6d 70 52 65 67 29 20 29 7b 0a  e->aTempReg) ){.
29560 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 73      int i;.    s
29570 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20  truct yColCache 
29580 2a 70 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c  *p;.    for(i=0,
29590 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43   p=pParse->aColC
295a0 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e  ache; i<SQLITE_N
295b0 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20  _COLCACHE; i++, 
295c0 70 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  p++){.      if( 
295d0 70 2d 3e 69 52 65 67 3d 3d 69 52 65 67 20 29 7b  p->iReg==iReg ){
295e0 0a 20 20 20 20 20 20 20 20 70 2d 3e 74 65 6d 70  .        p->temp
295f0 52 65 67 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  Reg = 1;.       
29600 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d   return;.      }
29610 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73  .    }.    pPars
29620 65 2d 3e 61 54 65 6d 70 52 65 67 5b 70 50 61 72  e->aTempReg[pPar
29630 73 65 2d 3e 6e 54 65 6d 70 52 65 67 2b 2b 5d 20  se->nTempReg++] 
29640 3d 20 69 52 65 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f  = iReg;.  }.}../
29650 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6f 72  *.** Allocate or
29660 20 64 65 61 6c 6c 6f 63 61 74 65 20 61 20 62 6c   deallocate a bl
29670 6f 63 6b 20 6f 66 20 6e 52 65 67 20 63 6f 6e 73  ock of nReg cons
29680 65 63 75 74 69 76 65 20 72 65 67 69 73 74 65 72  ecutive register
29690 73 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  s.*/.int sqlite3
296a0 47 65 74 54 65 6d 70 52 61 6e 67 65 28 50 61 72  GetTempRange(Par
296b0 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
296c0 6e 52 65 67 29 7b 0a 20 20 69 6e 74 20 69 2c 20  nReg){.  int i, 
296d0 6e 3b 0a 20 20 69 20 3d 20 70 50 61 72 73 65 2d  n;.  i = pParse-
296e0 3e 69 52 61 6e 67 65 52 65 67 3b 0a 20 20 6e 20  >iRangeReg;.  n 
296f0 3d 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65  = pParse->nRange
29700 52 65 67 3b 0a 20 20 69 66 28 20 6e 52 65 67 3c  Reg;.  if( nReg<
29710 3d 6e 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  =n ){.    assert
29720 28 20 21 75 73 65 64 41 73 43 6f 6c 75 6d 6e 43  ( !usedAsColumnC
29730 61 63 68 65 28 70 50 61 72 73 65 2c 20 69 2c 20  ache(pParse, i, 
29740 69 2b 6e 2d 31 29 20 29 3b 0a 20 20 20 20 70 50  i+n-1) );.    pP
29750 61 72 73 65 2d 3e 69 52 61 6e 67 65 52 65 67 20  arse->iRangeReg 
29760 2b 3d 20 6e 52 65 67 3b 0a 20 20 20 20 70 50 61  += nReg;.    pPa
29770 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20 2d  rse->nRangeReg -
29780 3d 20 6e 52 65 67 3b 0a 20 20 7d 65 6c 73 65 7b  = nReg;.  }else{
29790 0a 20 20 20 20 69 20 3d 20 70 50 61 72 73 65 2d  .    i = pParse-
297a0 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61  >nMem+1;.    pPa
297b0 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65  rse->nMem += nRe
297c0 67 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  g;.  }.  return 
297d0 69 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65  i;.}.void sqlite
297e0 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67  3ReleaseTempRang
297f0 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
29800 20 69 6e 74 20 69 52 65 67 2c 20 69 6e 74 20 6e   int iReg, int n
29810 52 65 67 29 7b 0a 20 20 73 71 6c 69 74 65 33 45  Reg){.  sqlite3E
29820 78 70 72 43 61 63 68 65 52 65 6d 6f 76 65 28 70  xprCacheRemove(p
29830 50 61 72 73 65 2c 20 69 52 65 67 2c 20 6e 52 65  Parse, iReg, nRe
29840 67 29 3b 0a 20 20 69 66 28 20 6e 52 65 67 3e 70  g);.  if( nReg>p
29850 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67  Parse->nRangeReg
29860 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e   ){.    pParse->
29870 6e 52 61 6e 67 65 52 65 67 20 3d 20 6e 52 65 67  nRangeReg = nReg
29880 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 69 52  ;.    pParse->iR
29890 61 6e 67 65 52 65 67 20 3d 20 69 52 65 67 3b 0a  angeReg = iReg;.
298a0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72    }.}../*.** Mar
298b0 6b 20 61 6c 6c 20 74 65 6d 70 6f 72 61 72 79 20  k all temporary 
298c0 72 65 67 69 73 74 65 72 73 20 61 73 20 62 65 69  registers as bei
298d0 6e 67 20 75 6e 61 76 61 69 6c 61 62 6c 65 20 66  ng unavailable f
298e0 6f 72 20 72 65 75 73 65 2e 0a 2a 2f 0a 76 6f 69  or reuse..*/.voi
298f0 64 20 73 71 6c 69 74 65 33 43 6c 65 61 72 54 65  d sqlite3ClearTe
29900 6d 70 52 65 67 43 61 63 68 65 28 50 61 72 73 65  mpRegCache(Parse
29910 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 70 50 61   *pParse){.  pPa
29920 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 20 3d 20  rse->nTempReg = 
29930 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 52 61  0;.  pParse->nRa
29940 6e 67 65 52 65 67 20 3d 20 30 3b 0a 7d 0a 0a 2f  ngeReg = 0;.}../
29950 2a 0a 2a 2a 20 56 61 6c 69 64 61 74 65 20 74 68  *.** Validate th
29960 61 74 20 6e 6f 20 74 65 6d 70 6f 72 61 72 79 20  at no temporary 
29970 72 65 67 69 73 74 65 72 20 66 61 6c 6c 73 20 77  register falls w
29980 69 74 68 69 6e 20 74 68 65 20 72 61 6e 67 65 20  ithin the range 
29990 6f 66 0a 2a 2a 20 69 46 69 72 73 74 2e 2e 69 4c  of.** iFirst..iL
299a0 61 73 74 2c 20 69 6e 63 6c 75 73 69 76 65 2e 20  ast, inclusive. 
299b0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
299c0 20 6f 6e 6c 79 20 63 61 6c 6c 20 66 72 6f 6d 20   only call from 
299d0 77 69 74 68 69 6e 20 61 73 73 65 72 74 28 29 0a  within assert().
299e0 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a  ** statements..*
299f0 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
29a00 44 45 42 55 47 0a 69 6e 74 20 73 71 6c 69 74 65  DEBUG.int sqlite
29a10 33 4e 6f 54 65 6d 70 73 49 6e 52 61 6e 67 65 28  3NoTempsInRange(
29a20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
29a30 6e 74 20 69 46 69 72 73 74 2c 20 69 6e 74 20 69  nt iFirst, int i
29a40 4c 61 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  Last){.  int i;.
29a50 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 52    if( pParse->nR
29a60 61 6e 67 65 52 65 67 3e 30 0a 20 20 20 26 26 20  angeReg>0.   && 
29a70 70 50 61 72 73 65 2d 3e 69 52 61 6e 67 65 52 65  pParse->iRangeRe
29a80 67 2b 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65  g+pParse->nRange
29a90 52 65 67 3c 69 4c 61 73 74 0a 20 20 20 26 26 20  Reg<iLast.   && 
29aa0 70 50 61 72 73 65 2d 3e 69 52 61 6e 67 65 52 65  pParse->iRangeRe
29ab0 67 3e 3d 69 46 69 72 73 74 0a 20 20 29 7b 0a 20  g>=iFirst.  ){. 
29ac0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
29ad0 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  }.  for(i=0; i<p
29ae0 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 3b  Parse->nTempReg;
29af0 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70   i++){.    if( p
29b00 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b  Parse->aTempReg[
29b10 69 5d 3e 3d 69 46 69 72 73 74 20 26 26 20 70 50  i]>=iFirst && pP
29b20 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b 69  arse->aTempReg[i
29b30 5d 3c 3d 69 4c 61 73 74 20 29 7b 0a 20 20 20 20  ]<=iLast ){.    
29b40 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
29b50 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31  }.  }.  return 1
29b60 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
29b70 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a        LITE_DEBUG */.